ALGOL 60

ALGOL 60，是在1960年建立的稱為“演算法語言”的一種程式語言。它是以後來稱為ALGOL 58的“國際代數語言”為基礎，其官方後繼者是ALGOL 68，它們一起並稱為ALGOL語言家族。Algol 60引進了許多新的概念如：程式碼塊、詞法作用域、遞迴、巴科斯-諾爾正規化，它在程式語言設計和發展演化中有著巨大的影響力。歷史.1960年，在巴黎舉行的討論會上，來自歐洲的諾爾、、、、、、，與來自美國的佩利、巴科斯、麥卡錫、、和J. Green，共同發表了《演算法語言ALGOL 60報告》。戴克斯特拉實現了ALGOL 60語言的第一個編譯器。在1962年羅馬會議上，ALGOL 60報告得到了修訂，並於1963年出版。ALGOL 60是程式設計語言發展史上的一個里程碑，影響到其後的Simula、CPL、ALGOL W、ISWIM、BCPL、B、Pascal、C、Scheme等。它標誌著程式設計語言成為一門獨立的科學學科，併為後來軟體自動化及軟體可靠性的發展奠定了基礎。標準.ALGOL 60以及COBOL，是最初的企圖示準化的程式語言。ALGOL60曾經提出兩項ISO標準：實現時間線.ALGOL 60在語言報告中沒有I/O設施；諸多實現以少有相互相容的方式定義了自己的設施。迄今ALGOL 60已經有了至少70個擴充、擴充套件、派生和子語言。詞法.簡單符號.除了字母和數字之外，ALGOL定義了運算子：和:在具體實現中，用codice_1表示codice_2。關鍵字.ALGOL 60有24個關鍵字：還包括標準函式名字作為限制識別符號：關鍵字寫法依賴於實現，常見的是一種叫做的方法，例如將codice_23包圍在兩個codice_17之間並大寫為codice_25。在具體實現中關鍵字還包括對特定符號的某種文字轉寫：語義.塊與作用域.在ALGOL 60中，“複合語句”被定義為：包圍在語句括號codice_26和codice_27之間的成序列的語句，形成一個複合語句。塊被定義為：成序列的宣告，跟隨著成序列的語句，並被包圍在codice_26和codice_27之間，形成一個塊；所有宣告以這種方式出現在一個塊中，並只在這個塊中有效。一個程式是特定的一個塊或複合語句，它不包含在另一個語句之中，並且不使用不包含在它之中的其他語句。在1976年的修改版語言報告中，程式只能包含在叫做“環境塊”的假定總是存在的一個虛構塊之中，除了可以使用在環境塊中宣告的過程識別符號和函式指定符之外，不使用不包含在它之中的其他語句。量的一個新的層級：這動態的蘊涵了：在透過codice_26進入一個塊的時候，所有為這個塊宣告的識別符號，假定了這個給定宣告的所蘊涵的；如果這些識別符號已經被外面的其他宣告所定義，這時它們被給予新的意義；在另一方面，並非為這個塊宣告的識別符號，保持它們舊有的含義。在透過codice_27或codice_37語句退出一個塊的時候，為這個塊宣告的識別符號失去它們的區域性意義。宣告可以標記上額外的宣告符codice_38，其效果為：在重新進入一個塊的時候，自有的這些量的值將不變更而仍是上次退出時的值，然而宣告的沒有標記上codice_38的變數的值是未定義的。表示式和語句.在描述演算法處理的程式中，主要構成者是算術表示式、布林表示式，和得到語句標籤的指定表示式。除了特定的分界符之外，表示式的構成者包括：邏輯值、數值、變數、函式指定式，和基本的算術、關係、邏輯運算子及順序運算子。用以形成語句的關鍵字，在ALGOL 60中被歸入順序運算子和分隔符之中。變數是對一個單一值的指名定義單一的數量值或邏輯值，它們是將給定的由過程宣告定義的規則集合，應用於固定的實際引數集合的結果。現在通常將變數定義為抽象的儲存位置，它含有了被稱為一個值的某種已知或未知的資訊量，並且配對了關聯的名字。在ALGOL 60中，某些語法單位，比如表示式及其構成者和陣列識別符號，被稱為擁有值。各種“型別”即codice_40、codice_41和codice_42，指稱值的基本的屬性。在左圓括號和匹配的右圓括號之間的表示式自行求值，而這個值被用於後續的計算之中；因此透過適當的圓括號放置，總是可以在表示式之內安排出想要的運算次序。賦值語句擔負將表示式的值，指派語句不執行任何運算。過程語句負擔實施呼叫一個過程主體的執行。控制流程語句包括：codice_37跳轉語句、codice_23條件語句、codice_45迴圈語句。codice_37語句不能從塊外跳轉到塊內的標籤，但可以跳轉進入複合語句。ALGOL 60在codice_23語句和codice_45語句中介入了子句概念，在更具一般性的算術表示式中，可以包含codice_23條件表示式。由於變數和函式指定式二者的語法定義都包含表示式，表示式及其構成者的定義必須是遞迴的。由於成序列的語句，可以被組織成複合語句和塊，語句的定義必需是遞迴的。ALGOL 60採用了左遞迴的巴科斯正規化。過程.在ALGOL 60中，過程宣告擔負定義過程識別符號所關聯的過程，其主要構成者是過程主體，它是一個語句或一段程式碼。過程主體總是表現得如同一個塊，不管它是否有著塊的形式；故而標記了在過程主體內語句或者主體自身的標籤的作用域，永遠不能延伸超出這個過程主體。過程主體關聯著一個頭部，它規定了出現在過程主體內的代表形式引數的特定識別符號。過程的引數傳遞有兩種求值策略：傳名呼叫和傳值呼叫。在過程宣告中，透過對形式引數名字前導codice_50來指定傳值呼叫，預設為傳名呼叫。在過程主體是用ALGOL語言寫的語句的情況下，過程語句執行它的效果，等價於在程式上進行下列操作的效果：對於定義函式指定式的值的過程宣告，在其過程主體中，必須出現具有過程識別符號在其左側部份中的一個或多個賦值語句，其中至少有一個必須被執行；並且這個過程識別符號所關聯的型別，必須透過以型別宣告符作為其過程宣告的最先符號的樣貌來宣告。最後那個這樣指派的值，被用來繼續此函式指定式在其中出現的表示式的求值。在這個過程主體中，這個過程識別符號的不在賦值語句左側部份中的任何出現，指示了這個過程的啟用。兩個傳名呼叫形式引數，其對應的實際引數之間可能存在依賴關係，比如第一個是整數變數codice_51，而第二個是下標變數codice_52，從而導致後者形式引數也依賴於前者形式引數，利用傳名呼叫和這種副作用可以實現；它典型的用於定義對應於formula_1的級數過程codice_53，它有兩個傳名呼叫的形式引數：索引變數codice_54和通項表示式codice_55。對於交換兩個引數的值的codice_56過程，其過程主體定義為：codice_57，這種依賴性副作用會導致可能出現異常行為，由於名字替代機制相當於宏展開中，實際引數只能是一個識別符號或字串。在過程的引數列表codice_62中，有可選的“codice_63”樣式的引數。眾所周知的傳名呼叫實現採用了。Donald Knuth設計了“男人抑或男孩測試”，來區分編譯器是否正確的實現了“遞迴和非區域性引用”，這個測試用到了傳名呼叫。例子.下面是語言報告中過程宣告的一個例子：procedure Absmax(a) Size:(n, m) Re​sult:(y) Subscripts:(i, k);value n, m; array a; integer n, m, i, k; real y;comment 矩陣a，其大小為n乘m，其絕對值最大的元素被傳送到y，並且這個元素的下標是i和k。 ;begininteger p, q;y := 0; i := k := 1;for p := 1 step 1 until n dofor q := 1 step 1 until m doif abs(a[p, q]) &gt; y thenbeginy := abs(a[p, q]);i := p; k := qendend Absmax在1976年修改版語言報告的環境塊中，定義了輸入輸出過程：codice_64、codice_65、codice_66、codice_67、codice_68、codice_69、codice_70、codice_71和codice_72，下面以其中的codice_70作為演示例子：procedure outinteger(channel, int);value channel, int;integer channel, int;comment 將表示int的值的那些字元，加上尾隨的終結符傳遞到channel。 ;beginprocedure digits(int);value int; integer int;begininteger j;comment 使用遞迴從右至左求值數字，但從左至右列印它們。 ;j := int ÷ 10;int := int - 10 × j;if j ≠ 0 thendi​gits(j);outchar(channel, ‘0123456789’, int + 1)end digits;if int &lt; 0 thenbeginoutchar(channel, ‘-’, 1);int := -intend;di​gits(int); outterminator(channel)end outinteger這裡呼叫到的codice_74，將在字串codice_75中對應整數codice_76的值的那個字元，傳遞到通道codice_77；codice_78，用於輸出在數值之後的終結符次序。