從語言設計的角度來看, 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題主和感興趣的知友可以看看下面三篇文章,肯定能有所收穫:
C. A. R. Hoare, Hints on programming language design. Stanford University, 1973.
N. E. Wirth, On the design of programming languages. Proc. IFIP Congress 74, 386-393,
1974.
- 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 &
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
稍微接觸過一些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系統一樣能被任意購買和安裝,將會怎樣?