热门问题
时间线
聊天
视角
Plankalkül
来自维基百科,自由的百科全书
Remove ads
Plankalkül(德語發音:[ˈplaːnkalkyːl])是康拉德·楚澤在1942至1945年間,出於工程目的而設計的一種程式語言。它是第一種為計算機設計的高級程式語言。
「Kalkül」在德語中意為形式系統。如希爾伯特演繹系統原本名為「Hilbert-Kalkül」那樣,「Plankalkül」指用於規劃(planning)的形式系統[3]。
描述
Zuse在1960年代的照片
Zuse在1945年基於繼電器製造的Z4計算機
Plankalkül可比較於APL和關係代數。它包括賦值語句、子例程、條件語句、迭代、浮點算術、陣列、層級記錄結構、斷言、例外處理和其他高級特徵比如目標導向執行。Plankalkül提供了叫做「廣義圖」(verallgemeinerter Graph)的資料結構,它可以被用來表示幾何結構[4]。
Plankalkül的很多特徵重現於後來的程式語言之中;一個例外是其特質性的使用占據多行的表示法。
Plankalkül的一些特徵[5]:
在Plankalkül中唯一的原始數據類型是單一的「是否值」(德語:Ja-Nein-Werte)即布爾值。它被指稱為標識符 。所有進一步的數據類型都是合成的,並且從原始類型通過「陣列」和「記錄」的方式建造而成[6]。
所以8位序列(這在現代計算中被當作字節)被指稱為,而大小為 乘的布爾陣列,被描述為。還存在更短的表示法,可以將替代為,它叫做「n位是否值序列」(德語:n-stellige Folge von Ja-Nein-Werten)[6]。
類型有兩個可能的值和。所以4位序列可以寫為例如,但是在這樣的一個序列表示一個數的情況下,編程者可以使用十進制表示法的[6]。
Zuse還定義了為(或寫為)即有序對(德語:Angabenpaar);為即列表(德語:Liste),在元素數量不定時寫為;為即有序對列表(德語:Paarliste),在元素數量不定時寫為。兩個組件(component,德語:Glieder)和的結構(德語:Struktur)被寫為[6]。
Plankalkül中類型(德語:Art)構成自3個元素:結構(德語:Struktur),語用意義(德語:Typ),和可能的限制(德語:Beschränkung)[6]。用戶定義的類型被標示為字母連帶編號,比如,即第一個用戶定義的類型。
Remove ads
Zuse使用了來自象棋理論的很多例子[6]:
棋盤的坐標(它的大小為所以位就足夠了)。 | ||
棋盤的方格(例如指稱代數記譜法中的e2)。 | ||
棋子(例如指稱白王)。 | ||
棋盤上的棋子(例如指稱白王在e2中)。 | ||
棋盤(棋子位置,描述64的方格都包含哪個棋子)。 | ||
遊戲狀態(指稱棋盤,指稱行棋玩家,指稱王車易位的可能性(位給白棋位給黒棋),指稱關於哪個單元格有可能吃過路兵)。 |
Remove ads
標識符(德語:Bezeichnungen)是字母字符連帶編號[6]。針對變量有如下標識符種類[7]:
- 輸入值(德語:Eingabewerte, Variablen),標記以字母。
- 中間值,臨時值(德語:Zwischenwerte),標記以字母。
- 常值(德語:Constanten),標記以字母。
- 輸出值(德語:Resultatwerte),標記以字母。
特定的某種變量由寫在種類之下的編號來標示[6],例如:,,等等。
程序和子例程都被表達為過程(德語:Rechenpläne),它被標記以字母,跟隨著一個程序編號(德語:Nummer),或者以點號分隔的程序組編號與程序編號。例如:、[6]。
子例程的輸出值保存在變量中,其他子例程能在標識符之下獲得到它,而讀取這個變量的值還意味著調用有關的子例程[6]。
Remove ads
Plankalkül允許使用組件(component)索引(德語:Komponenten-Index)訪問變量的單獨元素。例如,當一個程序接收輸入於具有類型(遊戲狀態)的變量之中,那麼給出棋盤狀態,給出在編號方格中的棋子,而給出這個棋子的位編號[6]。
在現代程式語言中,這可以用描述為表示法類似於V0[0]
、V0[0][i]
、V0[0][i][j]
(儘管訪問單一的位在現代程式語言中典型的使用位掩碼)。
Remove ads
由於變量的索引是垂直書寫的,邏輯上一行的Plankalkül指令要求占據4或3物理行來書寫。
一行包含變量種類,第二行標記以(德語:Variablen-Index)包含變量編號,第三行標記以(德語:Komponenten-Index)包含組件索引,而第四行標記以(德語:Struktur-Index)是類型描述。類型不是必需的,但是Zuse注釋到這能幫助閱讀和理解程序[6]。
在行中類型前綴可以去掉,例如[6]:
,可以簡寫為。
進一步的類型前綴也可以去掉,例如:
,可以簡寫為。同義於。
變量的索引的例子:
變量,它是個有序對的類型的值的列表。 | |
行在其為空時可以越過。因此這個表達式含義同於前者。 | |
變量的第個有序對的第(索引)組件的第(索引)位,它擁有布爾類型。 |
索引可以不只是常值。變量可以被用作其他變量的索引,而這被標記為折線,它展示變量的值將在哪個組件索引中使用:
![]() |
變量的第個元素。等價於在很多現代語言中的表達式V3[Z5] [6]。
|
Remove ads
Zuse在他的演算中介入了賦值算子,這個概念未知於他之前的數學中。他將其標記為,並稱其為產生符號(德語:Ergibt-Zeichen)。使用賦值的概念是在數學和計算機科學之間的關鍵差異[8]。
例如下列表達式:
向整數中間值增加數量。 | |
將值和合成為 所指稱的合成值。 |
有人宣稱Konrad Zuse最初使用圖元作為賦值的符號,並在Heinz Rutishauser的影響下開始使用[6]。Knuth和Pardo相信Zuse總是寫為,而
是»Über den allgemeinen Plankalkül als Mittel zur Formulierung schematisch-kombinativer Aufgaben«的出版商在1948年介入的[8]。在Zürich的ALGOL 58會議中,歐洲與會者提議使用Zuse介入的賦值符號,而美國代表團堅持採用
:=
[6]。
存儲賦值結果的變量(左值)被寫在賦值算子的右側[8]。對一個變量的第一次賦值被認為是對它的初始化聲明[6]。
賦值算子的左側被用作表達式(德語:Ausdrücke),它定義哪個值將被賦值到這個變量。表達式可以使用算術算子、布爾算子和比較算子(,,等等)[6]。
Remove ads
布爾值被表示為整數,「否」()為,而「是」()為。條件控制流程採用守衛語句的形式,這裡的加點箭頭叫做「條件符號」(德語:Bedingt-Zeichen),它指示在為「是」的條件下執行塊。迭代算子具有如下形式:
這裡的表示「重複規劃」(德語:Wiederholungsplan),它重複直到所有守衛成為「否」[9]。
算子和意圖用在迭代運算之中,對變量進行遞增索引的遍歷,而對其進行遞減索引的遍歷,找出其符合特定條件的下一個(含第一個)元素。典型用法是將在局部變量中的符合條件元素賦值到中間變量之中,然後在用豎槓分隔出的後續語句之中,在前面語句成功找到符合條件的元素之時對此中間變量做進一步處理。
Remove ads
Zuse稱呼一個單一的程序為「計算規劃」(德語:Rechenplan)。他設想其所稱謂的「規劃組裝設備」(德語:Planfertigungsgerät),能自動的將一個程序的數學公式轉換成機器可讀的打孔電影膠片,這是在今天稱為翻譯器或編譯器的某種東西[5]。
下面的例子程序計算整數的階乘:
這裡的Zuse定義的用戶類型表示全部整數。第一行包含「邊界概要」(德語:Randauszug),它定義程序接受一個變元(實際參數),即叫做的一個整數,並返回叫做的一個整數。這個程序將賦值到,將賦值到。接著迭代算子執行重複運算,將從遞減至的值,依次賦值到局部變量,這裡將大於的值累乘至。當重複結束之時,值就包含了變元的階乘。
Zuse還定義了用戶類型表示自然數,表示非負整數,表示非負分數,表示全部分數,表示複數。迭代算子、和接受一個非負整數,只重複次而不賦值局部變量,重複時將從遞增至的值賦值給局部變量;迭代算子、和接受兩個非負整數並賦值到局部變量,在時從遞增至,在時從遞減至,在時從遞增至而在時從遞減至。使用,可以省略的初始值設置,和的守衛條件判斷。
Remove ads
引用
延伸閱讀
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads