nuva 語言的淵源 之 惰性計算
本文簡要介紹了 nuva 語言的淵源,主要包括 nuva 語言的一些特色功能及其設計決策,說明 nuva 語言緣何成為現在的樣子,以及這些設計的考慮因素(其中也包括參考的其他程式語言,適合廣大的程式語言愛好者閱讀)。
nuva 語言的介紹請參考 nuva 語言官方主頁。
(續上文)
惰性計算也稱懶惰計算,目的是省略一些計算步驟或者推遲計算的時間,從而提高機器的計算效能。
與惰性計算相對應的是積極計算,或者叫先行計算。之所以叫先行計算是因為這種計算是表示式的語法樹按照後序遍歷的方式進行計算,語法樹中的子節點先於其父節點計算而得名。
大多數程式語言都是採用積極計算的方式來進行表示式計算。
從上面惰性計算定義的描述中可以看出,惰性計算也包括兩種:短路計算和延遲計算。
短路計算通常用在邏輯表示式中,如果從邏輯表示式的第乙個部分(或先計算的某個部分)就能推測整個邏輯表示式的值,從而免去計算整個表示式的部分時間,因此可以明顯得到效能的提公升。
nuva 語言的邏輯表示式就是採用短路計算的。
如下的 nuva **:
<.
function
t1()
result
=true
??'t1'
endfunction
function
t2()
result
=true
??'t2'
endfunction
function
f1()
result
=false
??'f1'
endfunction
??t1
()and
t2()
andf1
()??
'-------------------------------'
??t1
()and(t2
()or
f1())??
'-------------------------------'
??f1
()or
t1()
andt2
()??
'-------------------------------'
??f1
()and
t1()
andt2
()??
'-------------------------------'
??f1
()or
f1()
andt1
()and
t2()
??'-------------------------------'
??not
f1()
orf1
()and
t1()
andt2
()??
'-------------------------------'
.>
可以得到如下的計算結果:
t1t2
f1false
-------------------------------
t1t2
true
-------------------------------
f1t1
t2true
-------------------------------
f1false
-------------------------------
f1f1
false
-------------------------------
f1true
-------------------------------
短路計算除了可以提高計算效能以外,還有一些明顯的好處,看如下的**:
<.
varnode if(
node
<>
niland
node
.parent
<>
nil)
??'node <> nil and node.parent <> nil'
endifif(
node
=nil
ornode
.parent
=nil)??
'node = nil or node.parent = nil'
endif
.>
如果在不支援邏輯表示式短路計算的程式語言中執行上面的**,就會有可能出現異常,因為上面的變數 node 有可能為空。這樣必須採用下面的**才能避免異常:
<.
varnode if(
node
<>
nil)if(
node
.parent
<>
nil)
??'node <> nil and node.parent <> nil'
endif
endifif(
node
=nil)??
'node = nil or node.parent = nil'
elseif
(node
.parent
=nil)??
'node = nil or node.parent = nil'
endif
.>
因此,短路計算除了能夠提高計算效能,還能明顯的改善程式的書寫,更加簡潔並且易讀。
早期的 basic 和 pascal 都不支援短路計算,c 語言則從一開始就支援,ada 語言對於兩種計算都予以支援,可以讓程式設計師選擇採用哪種計算方式。
basic 從 vb9 開始也加入了短路計算符,pascal 也很早就從編譯選項裡支援短路計算。
現代的程式語言幾乎都支援短路計算。
另一種惰性計算叫做延遲計算。延遲計算並不是為了提高計算的效能,而是這種計算能夠創造出一種新型的和無限靈活的計算模型。
延遲計算主要用在函式式語言中,是 lambda 演算的某種起點。
在 lambda 演算的函式復合中,延遲計算起了關鍵的作用,試想如果函式作為引數被帶入另乙個函式時,如果立即參加計算,則函式復合就立即失去了意義,整個 lambda 演算也就失去了意義。
在 python 中,集合或者序列的運算中,經常用到基於 lambda 演算的延遲計算。
nuva 語言也有延遲計算的使用,主要用於迴圈和集合操作中,示例如下:
<.
varset =[
'a',
"b",
'c']
foreach(i
=set |i
='b')??
iend
foreach
varset1 =[
i =
set |i
='b'
]foreach(i
=set1)??
iend
foreach
.>
上面的**得到如下的結果:bb
nuva 語言中的延遲計算是 lambda 的一種特例,其中要計算的延遲表示式只能有乙個非函式自變數。
在下一版本中,nuva 語言將支援完整的 labmda 演算,加入函式式語言的一些特徵。
(未完待續)
C語言3之位操作
1 注意 位與符號是乙個 兩個 是邏輯與。2 真值表 1 0 0 1 1 1 0 0 0 0 1 0 3 從真值表可以看出 位與操作的特點是,只有1和1位於結果為1,其餘全是0.4 位與和邏輯與的區別 位與時兩個運算元是按照二進位制位彼次對應位相與的,邏輯與是兩個運算元作為整體來相與的。舉例 0xa...
python3語言 Python3學習之語言基礎3
三 判斷 迴圈語句,函式,命名空間,作用域 1 python3 條件控制 python中if語句的一般形式如下所示 python 中用 elif 代替了 else if,所以if語句的關鍵字為 if elif else。注意 1 每個條件後面要使用冒號 表示接下來是滿足條件後要執行的語句塊。2 使用...
python3語言 Python3學習之語言基礎1
一 python3入門,資料型別,字串 python 中的變數不需要宣告。每個變數在使用前都必須賦值,變數賦值以後該變數才會被建立。usr bin python3 counter 10 整型變數 miles 3.14 浮點型變數 name bob 字串 print counter print mil...