從語言設計的角度來看, Pascal 是一門優秀的語言嗎?

大家注意下問題是從 "語言設計" 的角度來看, 比如語法是否優美/一致, 具有語義, 是否考慮了編譯性能等. 建議不要以兒時的回憶/如何把妹等作為回答的主體.


Pascal 的不幸在於出現太早了,早期的PC性能太差不能做IDE的自動完成,所以語法羅嗦就是大缺點,放到現在完全不是問題。

比如 begin, end,輸入的時候 b+tab,e+tab,IDE就自動完成了,可能比按住shift去輸入 { } 還要方便呢。

Pascal編譯特別快,早在486時代用 delphi 1.0的時候,我一度懷疑delphi是像VB那樣解釋執行的,仔細研究發現的確是編譯的,只是是編譯實在太快了,相比同時代同一個公司開發的Borland C++要快幾個數量級。

放到現在,完全可以當腳本語言用,也許我們就不需要Python了呢。

pascal內置字元串類型,這個是現代語言標準特性了,C的char*才是異類,C++的std::string是個怪胎。pascal串相比C串安全太多了,起碼不依賴 『』,可以避免很多指針訪問越界問題。

pascal內置了 boolean型 true false是內置常量,早期的C都沒有這些。

pascal使用 import 而不是include,用import引用package也是現代語言主流做法了,C/C++的include帶來的問題實在太多了,但是誰也沒辦法。

相比 C ,Pascal更像一個精心設計過的語言,有學院派氣質,而C則是實用主義至上,工程實踐上怎麼方便怎麼來的。


Pascal是有很多現代語言的優秀特徵的,譬如說,危險的用法寫起來巨麻煩。

C語言:

int* fuck;
double* shit;
fuck = ++shit;

Pascal語言:

var fuck : ^integer, shit : ^double;
....
shit := ^double(longint(shit) + sizeof(longint));
fuck := ^integer(shit);

你看,一看就不是什麼正經人會寫出來的代碼。


Pascal 是 Wirth 以 ALGOL 為基礎,為教學專門設計的——然後霸佔了計算機教學十餘年的市場。Wirth 採用了一些 ALGOL 有,而不太好實現的設計,比如居然支持子程序嵌套……

C 是結構化的彙編,主要是解決操作系統內核的可移植性問題——其效果也達到了設計目的。

兩者都是成功的語言。

Pascal 是敗在過於繁瑣和固定上,比如直到 Delphi 才支持變長數組(類型是 Array of *),String 的長度只有 255(把它弄長也是 Delphi 的功勞),這在古代還行,現在就不行了。


語法設計的整潔

更強的類型系統

沒有多餘的隱式轉換

更完備的類型系統,數組和函數是first-class value

在該需要細分的情況下絕不含混過去

package單元管理

內置字元串類型

......

哪一項不是完爆C這種逗比語言

C++學的越多就越能感受到和Pascal相比,C就是一坨翔.


該有的都有,強類型,大小寫不敏感,清晰易讀,當然是優美而且優秀的語言。


通俗的講,讓一個完全新手來看code。

Pascal 基本都看得懂 結構很清晰

C 因為結構本身會有些跳 有一些坑 要認真看反覆看才懂

Java等面向對象語言,還是看看自己對象吧......


是!

唯一不滿的是:

局部變數不能在任意代碼塊(begin...end)里定義,過程/函數略大,聲明和使用的距離就遠了;

另外,with語法缺少一個臨時名稱:

只能 with xxx.obj1,yyy.zzz.obj2 do,不能with xxx.obj1 as o1,yyy.zzz.obj2 as o2 do


題主和感興趣的知友可以看看下面三篇文章,肯定能有所收穫:

  1. C. A. R. Hoare, Hints on programming language design. Stanford University, 1973.

  2. N. E. Wirth, On the design of programming languages. Proc. IFIP Congress 74, 386-393,

    1974.

  3. B. W. Kernighan, Why Pascal is not my favorite programming language. ATT Bell Laboratories, 1981.

我2007年上裘宗燕老師《程序設計語言原理》課的時候,這三篇是必讀文獻。課程主頁的文獻彙編欄目上能找到這幾篇以及更多的文獻。


pascal沒死,它比c好的那部分已經融進c#里了。


Pascal絕對是比C更完備更高級的語,布爾值,字元串,模塊系統,嵌套過程。這些都是後來語言必備的特性。

至於說啰嗦,如果是在現在,就完全不是問題了,藉助現代的編輯器,打字完全不是問題。而從閱讀上,這就比C好讀很多,我非常不喜歡c和後來很多類c語言的特殊符號,比如與,或,非,用and or not會點英語的都懂,讀起來非常舒服。

人類花了多少年才從符號書寫轉成有意義的文字系統。到計算機語言這兒,又重複了一遍。


作為一個OIer還是談談自己的看法吧。

喜歡pascal,不僅僅因為是自己的入門語言(PC Logo什麼就算了),而且也因為它的語法,優美、嚴謹。

或許它不是一門偏向日常應用的語言,但它用來描述一種演算法實在是再合適不過了。

這是一段SBT的偽代碼,但是只要稍作修改,加上』begin-end;『,就可以是一段pascal代碼。


pascal是我用過的第一門計算機語言。

這種問題沒法回答,因為什麼是優秀呢?不同的人訴求不同啊,有人VB不動搖,有人一直都是C,有人用Java,有人用Python,,,,,,,,,,,,,也有人用pascal。有人用它,是因為大學裡教它,delphi也挺好用,但現在教它的大學越來越少,delphi越來越怪異非主流,這個語言未來很不樂觀。

我覺得它最大的優點是相比C,更容易入門,更不容易碰到令新手困惑的問題, @vczh大神舉例說指針,這個太難了在C裡面又避不開,而在pascal里分了值參和形參,不用指針這種高難度動作也能幹不少事情。舉個更簡單的例子

#include & //這是啥意思,為啥別的#include後邊是冒號?
for(int i=1; i&<11;i++)//究竟這個程序是跑到10還是11? { printf("%d ",i);//看不懂啊,%都幹啥的,drn是啥意思 }

換成pascal

var i:integer;
for i:=1 to 10 do {從一到十一看就懂}
begin
writeln(i);{寫一行嘛,一看就懂}
end

對於超級新手光是對付編譯器的語法錯誤就夠難了,pascal在這裡挺好的。但當稍有一點點經驗就會很討厭這種啰嗦的感覺,更不要說現代語言的各種語法糖。


稍微接觸過一些batch和basic,記得basic要預留行號的,然後中學學pascal四年,高中轉c

對我來說,很懷念pascal,它教了我如何思考如何編程,如何設計策劃,如何製作自己想要的東西

我當時用它寫了象棋五子棋圍棋等各種單機軟體,尤其圍棋的拓撲

後來因為要跨文件傳遞值,我用c寫了五子棋的人工智慧,把人工智慧另外放一個文件

當然我可能因為pascal先入為主有偏見,我那個時候,90年代,很多程序員都說學程序要先學pascal

我認為pascal的設計,有些比c好,尤其是字元串,一個string,它的本質就是字元數組

我要取其中第幾個值,直接是a[6]="a"就可以

比c的char *什麼亂七八糟的強多了。

尤其是字元串的輸入輸出,writeln(a);writeln(i);

C是怎麼用的printf("%c" ,s)我忘記了,反正不習慣

後來一直沒有接觸編程

最終,那些高級語言用的都是pascal那種方法,而不是C

多年之後,重新拾起編程,想給早年的程序加一些功能

拾起我重裝了N次電腦都保存下來的源碼

C語言,我居然用不來了

因為函數的參數有時候要加,有時候字元串要加*,我都忘記怎麼寫了

人家說一個C語言程序員的笑話,說要交換兩個數,什麼二逼程序員寫法:

swap(int a,int b){

tmp=a;

a=b;

b=tmp;

}

這我看來很正常的啊,但是好像C語言不行,要前面加*,

加*是取它的指向的值,加是取地址,但是很多東西我因為參數不會用

幾年之後,我居然忘記怎麼寫最基礎的C語言了

但是pascal就沒有啊,我面試的時候我說我可以直接手寫代碼,面試官說他會pascal,我就拿起pascal寫了啊,雖然有些會忘記,但是我拿起我的pascal代碼,我都知道想怎麼改就怎麼改,但是C不行。

08年我寫過一個java程序,現在打開代碼我都知道怎麼改,02年的C就不行,而且我記得我的思路,完全看懂代碼,就是不懂得syntax語法規則

當時我也煩pascal,什麼begin end,你看人家C語言的{}多省事,但是真的轉C的時候,我想起pascal的好來了

還有switch case,當時我覺得C可以在有些特定情況連貫不寫break可以省力,pascal的更注重邏輯,所以強制break,感覺各有所長,但是後來我發現了,我的C程序有時候發生意外,因為少寫個break,所以我不寫break的地方我還要另外寫一行注釋:此處是不要break,不是我漏寫了,否則我有時候檢查代碼以為我粗心,還會加上;而我大多數遇到的情況是每一種情況都單獨處理,所以每個case之前都要有個break,現在我在做的一個項目有大量的批處理腳本我都放一個文件里,所以十幾萬行批處理需要近千個break;(現在用的java,沒辦法它這裡學C),有時候出問題就是因為少個break,現在才覺得當初pascal設計的break強制打斷,才是更符合邏輯和switch/case設計需要的,至於C裡面你要幾種fall都用到同一個,那你索性寫個void函數調用好了,這種情況其實也少。C裡面不寫break純粹是出於硬體效率投機取巧,你這樣能省多少事?而java只知道邯鄲學步地學C。

那時候我經常寫錯,然後整段程序都不要了,然後過了一會想想又要了

那就需要注釋

然後就把代碼注釋掉,有時候要注釋掉一大段,但是當注釋掉的一大段里有另外一小段已經注釋掉了,那麼編譯器會找出已經注釋掉的那個注釋結尾}作為你注釋的結尾

pascal的好處是他有兩種注釋符號,一種是{}還有一種我忘記了,用兩種注釋符號就可以分開,避免這種麻煩

C的注釋只有/**/作為段落,

作為第一門語言初學者,我認為初學者不應該學c去記憶那些地址,指針這類東西,現在的高級語言很少要用到,然而你不用指針在c里是混不下去的。

初學第一門計算機語言需要學習的是if-else (and/or/not的複雜用法) while的用法

而且pascal的and or not也比C的 || !更直觀,寫給不懂程序的小白也能直接看懂

因為acm只服c,所以2022年起pascal就要被淘汰了,所以noip那邊一邊倒地支持c,說pacsal早十幾年就可以淘汰了

c與pascal比,有很多不同,有的是不同的語法規則,比如c的!=是pascal的&<&>,c的==是pascal的=,c的=是pascal的:=,這種雙方都能做到但是不相同的,大家都抱c的大腿選擇了c

還有一些,pascal和C的實現不同,比如字元串屬性,字元串輸入輸出,字元串下標a[6]你看誰還用那char *的那種,誰還用c的printf("%c",s)那種?現在都是和pascal當年的write一模一樣

他們選擇了和pascal一樣的,說明了在因為外部環境而抱緊c大腿的同時,在實用性上,選擇了pascal在這方面的設計,而不是c的設計

long live Nicolas Wirth!

long live Borland Turob Pascal!

最後,pascal等於是我的初戀,通過她我學會了很多東西,我為她至今沒有付出過什麼費用

如果說對她沒有感情是不可能的。她為我那苦逼讀書的青年時期帶來了很多快樂,僅次於和同學聯機玩星際爭霸,而且她比星際爭霸更要變化多端,可以實現任何我想要實現的樣子。她把我訓練成了現在的編程熟練人員。任何數學邏輯演算法我都可以信手沾來。

說實話,當年學pascal的80後,很多都是人中龍鳳,都是頂尖理工科大學的尖子生,真希望大家一起湊錢把pascal所屬的那公司給買下來。它和紅警、星際爭霸I(還有突襲),是我們那代80後美好的回憶。

我有一個初中同學,現在,他非常感謝我那個時候帶他到我家裡來教給他玩各種遊戲,他青年時期最美好的回憶是我給他的。(不要腐啊!)


我用著很爽,可惜只能追著沒落的餘韻自娛自樂


至少把function和procedure分開這一點我看比現在的大多數語言都強。


初中寫的時候煩死了.....


喜歡procedure和function分開這個feature


那個年代的我,算起來Pascal就像正二八經被安排談的一個對象(科班的入門高級語言課程),必須認真必須規矩必須小心,而最終一拍兩散也沒虧待(考了個90分),因為當時懷念著初戀的BASIC,偶爾跟她的小妹VB一起玩耍,一直憧憬著c++才是自己真正託付終身的那位

PS:回頭光看語言特徵,感覺意義不大。Pascal作為學院派教學的設計定位決定了語言特點,作為上大學才真正接觸編程、並以她為第一門高級語言的人,相比較在邏輯上會更嚴謹、代碼風格上會更規範,尤其體現在使用其它更靈活的編程語言時,比如JavaScript


格式規範,可閱讀性強,基本跟念英語課文差不多,學完下來再怎麼著也會背「procedure」「function」「string」等單詞。

用來入門可以養成很好的寫程序習慣,不模塊化的程序沒法看。還能練練打字速度。

缺點是啰嗦,而且我作為一個主觀能動性差的人無論用什麼語言寫出來也是pascal味兒。

泡妞什麼的沒體驗過,我是沒聽到過哪個男生說:哇你會用pascal看起來好厲害哦跟我交往吧~

現在寫點小軟體小程序啥的還是用delphi做,可視化設計多萌啊。


加點糖還可以再戰半個世紀


推薦閱讀:

c++有提供網路編程,多線程編程之類的庫嗎?
安卓編程筆記本求推薦?
大學階段學習單片機,以後可以有什麼用?可以做什麼類型的工作?單片機發展前景怎麼樣?
noip複賽應該如何準備?
如果OS X系統像windows系統一樣能被任意購買和安裝,將會怎樣?

TAG:編程語言 | 編程 | Pascal | Delphi |