Pascal語言

Pascal是一個指令式程式設計和麵向過程程式語言，由尼克勞斯·維爾特在1968年9月設計，在1970年發行，作為一個小型的和高效的語言，意圖鼓勵使用結構化程式設計和資料結構進行良好的程式設計實踐。稱作Object Pascal的一個衍生是為面向物件程式設計設計的。歷史.Pascal基於ALGOL程式語言，為紀念法國數學家和哲學家布萊茲·帕斯卡而命名。維爾特後來開發了類似Pascal的Modula-2和Oberon。在開發Pascal之前，維爾特開發了語言Euler，然後開發了Algol-W。最初，Pascal在很大程度上但不是完全地為了教授學生結構化程式設計。很多代學生已使用Pascal作為本科課程的入門語言。Pascal的變種也逐漸地用於從研究專案到PC遊戲和嵌入式系統的所有領域。更新的Pascal編譯器存在於廣泛使用它的領域。GCC，Gnu C編譯器，最初是用Pascal的一種方言Pastel編寫的編寫的。Object Pascal仍然廣泛用於開發像Skype這樣的Windows應用。簡要描述.維爾特的意圖是，基於結構化程式設計，建立一個高效資料型別，也使建立諸如lists、trees和graphs這樣的動態和遞迴資料結構更容易。這些重要的特性包括記錄、列舉、子範圍、使用關聯指標去動態分配變數和集合。為了使這些有可能和有意義，Pascal在所有物件上有一個強型別，意味著如果不使用顯式轉換，一種資料型別不能轉換或解釋成另外一種。類似的機制是今天許多程式語言的標準。影響Pascal開發的其它語言是COBOL、Simula 67和維爾特自己的Algol-W。Pascal，像今天的許多程式語言一樣。實現.第一個Pascal編譯器是在Zurich為CDC 6000系列大型計算機家族設計的。維爾特報道，在1969年第一次使用Fortran實現的嘗試沒有成功，由於Fortran不足以表達複雜的資料結構。第二次嘗試以Pascal語言本身來制定，並在1970年代中期實施。由於許多Pascal編譯器已類似地自託管，即編譯器本身是以Pascal編寫的，因此在新特性加入語言或編譯器移植到一個新環境時編譯器通常能重編譯其本身。用C編寫的GNU Pascal編譯器是一個顯著的例外。1972年，Welsh和Quinn在貝爾法斯特女王大學，第一次將CDC Pascal編譯器成功地移植到另外一個主機。目標主機是ICL1900系列。這個編譯器反過來說是ICS Multum微計算機Pascal編譯器的父母。以一個使用Pascal作為系統程式語言的視角，Glasgow University計算機科學系的Findlay，Cupples，Cavouras和Davis開發了Multum介面。完成於1973年夏季的Multum Pascal被認為是第一個16位實現。一個全新的編譯器由QUB的Welsh et al.在1977年完成。它提供了一個由Glasgow University的Findlay和Watt實現的源語言診斷特性。該實現在1980年由南安普敦大學和Glasgow University的一個小組移植到ICL 2900系列。標準Pascal模式實現也基於該編譯器，曼徹斯特大學的Welsh和Hay在1984年已將其改編，以嚴格檢查與BSI 6192/ISO 7185標準的一致性，以及為可移植抽象機生成程式碼。在北美洲為PDP-11編寫的第一個Pascal編譯器在Donald B. Gillies的伊利諾伊大學厄巴納-香檳分校構造，並生成了本地機器程式碼。Pascal在整個1970年代和1980年代大受歡迎。為了迅速地傳播該語言，一個編譯器“移植工具包”在Zurich產生，包括一個為“虛擬”堆疊機程式碼的主要意圖是在至少一個系統上編譯成真實的機器程式碼，著名的UCSD實現使用它建立瞭解釋性UCSD p-System。P-系統編譯器被稱作P1-P4，P1是來自於Zurich的第一個版本，P4是最後一個。P4編譯器/直譯器仍然可以在相容最初Pascal的系統上執行和編譯。然而，它本身只是Pascal語言的一個子集。接受全部Pascal語言和包含ISO 7185相容性的一個P4版本建立了，稱作P5編譯器，它在源形式上可用。一個為IBM System/370大型計算機產生本地二機制程式碼的P4編譯器版本由澳大利亞原子能委員會發布；縮寫該委員會的名稱後，它被稱作“AAEC Pascal編譯器”。從1975年6月起，一個包含編譯器原始碼和二機制程式碼，以及PDP-10主機執行時庫檔案的P4版本可以從這裡下載。在1980年代早期，也是為IBM System 370開發的Watcom Pascal開發了。IP Pascal是一個使用Micropolis DOS的Pascal程式語言的實現，但是被迅速地移植到運行於Z80上的CP/M。在1994年它被移植動80386型別機器上，今天作為Windows/XP和Linux實現存在。在2008年，該系統達到一個新層次，該結果語言稱作“Pascaline”的這樣一個實現。在1980年代早期，UCSD Pascal移植到Apple II和Apple III計算機，以提供一個隨著機器而來的BASIC直譯器的結構化替代品。Apple Computer在1982年為Lisa Workshop建立了自己的Lisa Pascal，在1985年將該編譯器移植到Apple Macintosh和MPW。在1985年，經諮詢維爾特，Larry Tesler定義了Object Pascal，這些擴充套件合併進Lisa Pascal和Mac Pascal編譯器。在1980年代，Anders Hejlsberg為Nascom-2編寫了Blue Label Pascal編譯器。為IBM PC編寫的該編譯器的重實現在Borland收購之前以Compas Pascal和PolyPascal的名稱銷售。重新命名為Turbo Pascal後，它變得廣受歡迎，一方面由於一個積極的定價策略，一方面由於是第一個全屏整合開發環境之一，以及快速的週轉時間。另外，它用匯編語言編寫，並整體高度最佳化，使它比許多競爭對手更小和更快。1986年Anders將Turbo Pascal移植到Macintosh，並將Apple的Object Pascal擴充套件合併進Turbo Pascal。這些擴充套件然後加回到Turbo Pascal v5.5的PC版本中。與此同時Microsoft也實現了Object Pascal編譯器。 Turbo Pascal 5.5給在1980年代後期開始主要關注於IBM PC的Pascal社群帶來巨大影響力。許多研究BASIC結構化替代品的PC愛好者使用該產品。它也開始被專業開發人員接受。幾乎同時，為了讓Pascal程式設計師直接使用Microsoft Windows的基於C的API，許多概念從C語言引入。這些擴充套件包括空終止字串，指標算術運算，函式指標，address-of運算子和非安全型別轉換。然而，Borland後來決定需要更多精細的面向物件特性，並在Delphi裡使用Apple提議的Object Pascal草圖標準作為基礎重新開始。Delphi程式語言的第一版相應地命名為Object Pascal。與老的OOP擴充套件相比較，主要的增加是基於參考物件模型，虛擬構建器和析構器，以及屬性。幾個其它編譯器也實現了該方言。Turbo Pascal，和其它有單元或模組概念的衍生物是模組化語言。然而，它不提供一個巢狀模組概念或合格的匯入和匯出指定符號。Super Pascal是一個增加了非數字標籤，作為型別名稱的返回語句和表示式的變異。Zurich、Karlsruhe和Wuppertal大學已開發了一個EXtension for Scientific Computing，為有控制精度的數字計算程式設計提供了一個自由的解決方案。語言結構.最初形式的Pascal是一個純粹的過程化語言，包括有諸如if，then，else，while，for等等保留字的類Algol控制結構的傳統陣列。然而，Pascal也有許多最初Algol60不包括的資料結構工具和其它抽象概念，像型別定義、記錄、指標、列舉和集合。這些結構部分從Simula67、Algol68、尼克勞斯·維爾特自己的Algol-W和C. A. R. Hoare的建議繼承或獲得靈感。Hello world.Pascal程式開始於外部檔案描述符作為引數的program關鍵字；然後跟著begin和end關鍵字封裝的主要塊。分號分割語句，句點終結整個程式。Pascal原始碼不區分大小寫。這裡是一個非常簡單的“Hello world”程式示例的原始碼：Program HelloWorld(output);beginwriteln('Hello, world!'){程式塊的最後一條語句後不需要";" -end.資料型別.Pascal和幾種其它流行程式語言的型別以定義變數能儲存的值的範圍的方式定義一個變數，也定義了一個允許在該類變數上執行的運算子集。預定義型別是：每種型別中轉換成十進位制的輸出，和codice_10命令不使用銀行家捨入。程式設計師可以使用Pascal型別宣告工具以預定義型別，自由地定義其它常用資料型別（例如，byte，string等等。)。例如：typebyte = 0..255;signedbyte = -128..127;string = packed array [1..255] of char;標量型別.Pascal的標量型別是real、integer、character、boolean和引進Pascal的新型別列舉：varr: Real;i: Integer;c: Char;b: Boolean;e: (apple, pear, banana, orange, lemon);子範圍型別.可以構造任意有序型別的子範圍：varx: 1..10;y: 'a'..'z';z: pear..orange;集合型別.不同於同時期的其它程式語言，Pascal支援集合型別：varset1: set of 1..10;set2: set of 'a'..'z';set3: set of pear..orange;集合是現代數學的基礎概念，可能在很多演算法中使用。這樣一個特性是非常有用的，可能比不支援集合的語言的同等結構更快。例如，對於許多Pascal編譯器：if i in [5..10] then比以下程式碼執行更快：if (i&gt;4) and (i b then writeln('Condition met')else writeln('Condition not met');for i := 1 to 10 do writeln('Iteration: ', i:1);repeata := a + 1until a = 10;case i of0: write('zero');1: write('one');2: write('two')end;過程和函式.Pascal將程式結構化成過程和函式。program mine(output);var i : integer;procedure print(var j: integer);function next(k: integer): integer;beginnext := k + 1end;beginwriteln('The total is: ', j);j := next(j)end;begini := 1;while i &lt;= 10 do print(i)end.過程和函式可以巢狀任意深度，“program”構造是邏輯上最外層的塊。每個過程或函式可以有自己的正確順序的goto標籤、常量、型別、變數和其它過程和函式宣告。此順序要求最初的本意是允許高效的單通編譯。然而，在一些方言裡宣告節嚴格的順序要求是不必要的。分號作為語句分割符.Pascal從ALGOL語言裡吸納了許多語言語法特性，包括使用分號作為語句分割符。這與其它諸如PL/I、C等的語言是不同的。它們使用分號作為語句終止符。正如上述例子演示的，記錄型別宣告、塊或case語句的end關鍵字之前，repeat語句的until關鍵字之前，if語句的else關鍵字之前，不需要分號。在Pascal的早期版本裡，不允許存在額外的分號。然而，1973年的修訂報告，後來成為ISO 7185:1983裡的額外的類ALGOL空語句現在允許這些情況的絕大多數可選地使用分號。例外是仍然不允許分號立即出現在if語句的else關鍵字之前。在一些情況下，真正需要空語句：while GetChar() = ' ' do ;然而，濫用可能會產生問題。雖然下面語句是語法正確的，但是結果不大可能是想要的：if alarm then;begin;SendMayday;EjectPilot;end;資源.編譯器和直譯器.幾個Pascal編譯器和直譯器可供一般公眾使用：一個非常廣泛的清單可以在Pascaland ，Mac中心的一個有文章檔案的豐富集合的Pascal資訊和宣傳站點，加上許多編譯器和教程的連結。標準.1983年，該語言標準化為國際標準IEC/ISO 7185，以及一些當地國家的具體標準，包括美國ANSI/IEEE770X3.97-1983和ISO 7185:1983。這2個標準的區別僅在於ISO標準包含一個conformant陣列的“級別1”擴充套件，而ANSI不允許對原始，糾正了原始文件中找到的各種錯誤和模糊。1990年，一個擴充套件的Pascal標準作為ISO/IEC 10206建立。1993年，ANSI組織用ISO 7185:1990標準代替了ANSI標準，有效地終結了作為一個不同標準的狀態。ISO 7185被說成是對《使用者手冊和報告的一個Pascal版本，該庫最初用FORTRAN編寫，發現如果沒有允許變長陣列引數的擴充套件就無法實現該庫。出於同樣的考慮，ISO 7185包含了指定過程和函式引數的引數型別的工具。注意維爾特自己將1974年的語言當作“標準”，以將其與CDC 6000編譯器的機器特定特徵相區別。該語言記錄在“Pascal使用者手冊和報告”的第二部分報告”。在Pascal起源的大型機上，這些標準普遍遵循。在IBM-PC上，這些標準不被遵循。在IBM-PC上，Borland標準Turbo Pascal和Delphi有最大量的使用者。因此，瞭解一個特別的實現符合原始Pascal語言還是Borland方言非常重要。該語言的IBM-PC版本開始區別於UCSD Pascal，以對該語言的幾個擴充套件以及幾個遺漏和變化為特性的解釋型實現。許多UCSD語言特性今天仍然存在，包含於Borland的方言。Divisions.Pascal的維爾特的Zurich版本在ETH之外以2個基本形式釋出，CDC 6000編譯器源和一個稱作Pascal-P系統的移植工具。Pascal-P編譯器遺漏了完全語言的幾個特性。例如，作為引數使用的過程和函式，無區別變體記錄，包裝，處理，過程間的goto方法和完全編譯器的其它特性被忽略。Kenneth Bowles教授的UCSD Pascal是基於Pascal-P2套件的，因此有幾個共同的Pascal-P語言限制。UCSD Pascal後來作為Apple Pascal被接納了，並持續有幾個版本。雖然UCSD Pascal實際上擴充套件了Pascal-P2套件的Pascal子集，透過添加回標準Pascal結構，它仍然不是一個完整的Pascal標準安裝。Borland的Turbo Pascal由Anders Hejlsberg用匯編語言獨立於UCSD或Zurich編譯器編寫。然而，它與UCSD編譯器一樣接納了許多相同子集和擴充套件。這可能是因為UCSD系統是適於在當時可用的資源限制的微處理器上開發應用的最常見Pascal系統。評論.Pascal在計算社群產生了廣泛的響應，包括批評和讚美。批評.儘管非常流行早在1981年就在他的論文Why Pascal Is Not My Favorite Programming Language對Pascal提出了嚴厲的抨擊。