同樣曾被用於系統級編程語言,Pascal 和 BASIC 為什麼失敗了?
微軟起家於 BASIC,很多早期系統級軟體都是用 BASIC 編寫的。
蘋果最開始也是使用 BASIC 作為系統級編程語言,後來遷移到 Pascal 並長期作為主要編程語言來使用。為什麼後來這些語言在系統級編程上都逐漸被 C/C++ 所取代了?他們是存在什麼明顯劣勢么?
一種編程語言要在當時成為系統級編程語言,一定要支持可以讀、寫、執行任意地址,這個是必要條件,因為代碼和數據都會存在某個常數地址開頭的地方;為了方便編程,還需要支持各種位數的整數、浮點數,以及位域(當時系統內存極小,因此才會使用位編碼,事實上現代 CPU 的 flag 寄存器仍然採用位標記功能的表達方式)。此外,這種語言還得支持地址和整數的轉換,最好是可讀寫執行的地址與整數的裝換,最好有類型系統,例如函數指針類型、數組類型等,要不傳遞參數非常麻煩。
在當時,同時滿足這些條件的只有C。而一個滿足所有這些條件的語言,基本也就和C差不讀了。這也決定了為什麼系統編程一定是C。
------------------- 更新並強調一下和 pascal 的對比 --------------------
很多人好像覺得 pascal 的功能也比較強大,然而你查閱語言發展史就會知道,C語言對函數指針的支持是在1978年以前[1](KR第一版是在78年出版,那時已經有函數指針了,因此對函數指針的支持應該更早),而 pascal 對函數指針的支持要到 80 年代末期[2],晚了大約10年左右。沒有函數指針的系統級代碼是無法想像的事情,以 linux 為例,動態鏈接、內核模塊、虛擬文件系統,系統調用的響應、中斷響應等等都只能用特別麻煩的 switch/case 來寫。這些都是無法想像的事情。這也是為什麼當時(1970s~1980s) pascal 根本不可能成為系統編程語言的主要原因之一。
有興趣的話可以參考[1],看看 KR 中的 R 在設計C的時候都有哪些考慮,而 pascal 距離這些還差得遠。等到80年代末期 pascal 把這些設計都「借鑒」過來之後,unix/c 已經存在很久了。事實上 pascal 的語法也並不簡潔,procedure/begin/end 這些莫名其妙的關鍵字,誰願意敲那麼多?尤其是 10+ 層嵌套的情況下。連 java 都不選這些關鍵字。
[1]Dennis M. Ritchie, The Development of the C Language, 1993.https://www.bell-labs.com/usr/dmr/www/chist.pdf[2]Pascal (programming language)竊以為這些語言並沒什麼明顯缺陷,但是C在系統編程方面實在是太強了。再沒有一個語言的語法構造(在上世紀CPU特性還比較容易理解時)可以在腦子裡逐字逐句對應到質量不錯的彙編,而源代碼看起來又接近高級語言。四十多年後我們能更加深刻體會到C的牛逼之處。輸給它並不說明什麼。特別是Pascal,與C幾乎同時出現,創新點相同(指針),早期特性上是C的子集,處在直接的競爭中。
看到這個問題第一反應是又去搜了下系統級語言的定義,因為印象中所謂系統級和應用級只是一個是否「接近」下層的區別,並不是那麼明顯區分度其實對一個語言來說,只要我們將其編譯為某個平台可以支持的目標代碼,就可以運行,這個平台可以是解析源碼執行的解釋器,也可以是簡單的位元組碼解釋器,也可以是一個集成了環境的複雜vm,或os,或更下面的硬體,所以從這個角度說,我們只需要將其編譯為「系統級」軟體跑的平台所支持的形式,並且語言本身能夠完善描述「系統級」軟體的各種行為,就可以了,所以看適不適合,我覺得就兩方面:
1 語法設計上是否適合
2 流行度第一點,沒記錯的話basic和pascal最早被設計出來不是用於寫一些底層東東,所以儘管我們可以做一個編譯器,如有必要再添加一些特性,使得basic能夠用來寫一個系統級軟體甚至是操作系統(比如隨意訪問內存這種功能雖然語法沒有,但是可以通過將內存映射為一個大字元串並提供串內操作什麼的,儘管笨拙),但是木有耗費這種成本的必要,也不見得方便第二點,C相對其他語言的流行度尤其是在「系統級」是絕對優勢的,就別說跟這倆古董級的語言來比較了。至於為何會這樣,我覺得跟C的設計上的自由度有關,比如說,basic把列印輸出做成了print語句,而C則採用函數的方式,使得語法和庫解耦程度非常高,而去掉庫以後,語言本身的核心非常少(十來個關鍵字),這樣使得它的編譯器比較簡單,庫則是可拆卸的,這樣一來雖然C最早是unix下的,但是要移植到各種系統和平台沒有什麼難度,而一個新的平台要引入basic恐怕要在編譯器和runtime上做更多事情了C不保證你寫的代碼跨平台,但是給了「系統級」開發者相對低的跨平台的成本C不保證你寫的代碼一定比其他語言快,但是給予了你將其優化到極致的可能,只要你肯干沒有統計資料,純粹觀點。
無論是學校選擇還是個人自學,在選擇語言上最終還是看工作市場上的老闆們(那些CIO們)做的決定。CIO做決定的時候,大抵是找個人力成本便宜的語言,買開發用的軟硬體對老闆們來說只是零頭,人力成本才是大頭(工資、醫療保險等等)。以前有公司的代碼政策是只能用彙編(所有僱員都懂)和Basic(大部分僱員都懂),Turbo Pascal要進入辦公室需要被偷運(市面上還沒有足夠的Pascal的書),現在大概是C++、Java和C#(大公司推廣不遺餘力所以很多人懂,所以薪水也便宜)。
Pascal的流行隨Borland而起,也隨Borland而衰。Borland輸在了在資料庫產品上,以致無法像其他公司那樣繼續燒錢推廣吸引程序員。至於Basic,則是微軟因為受到Java威脅,開發重心轉移到.Net,期望從MFC、VB那裡吸引人氣,集中力量和Java競爭。10年後看來,這個戰略轉移並不成功,沒有多少舊代碼被移植到.Net,大多數人用.Net的時候是改用新出的C#語言。Java則是因為Sun輸在了伺服器市場上不得不被停止燒錢被合併掉,新主人甲骨文對燒錢並沒有什麼興趣。
另外,不同時代的程序員,面向的任務不同。比如互聯網的普及使得很多網路前端語言流行,而手機市場的碎片化使得能夠跨各大手機平台的C++重新流行等等。個人感覺,不對勿噴。
BASIC和PASCAL當初最早都是作為教學語言而設計的,與C同一個時期的年代裡,貌似也沒有用這兩種語言開發出大型軟體(Turbo Pascal、Delphi、http://VB.NET 另說,它們出現已經很後期了),而C是開發出過UNIX操作系統的。如果是你,感情上會覺得哪個語言更適合工程上使用呢?應該90%以上的人會選擇C吧。
以下引自Wikipedia:
BASIC (an acronym for Beginner"s All-purpose Symbolic Instruction Code) is a family of general-purpose, high-level programming languages whose design philosophy emphasizes ease of use. In 1964, John G. Kemeny and Thomas E. Kurtz designed the original BASIC language at Dartmouth College in New Hampshire. They wanted to enable students in fields other than science and mathematics to use computers.
Pascal is an imperative and procedural programming language, which Niklaus Wirth designed in 1968–69 and published in 1970, as a small, efficient language intended to encourage good programming practices using structured programming and data structuring.
補充一些時間數據,依舊來自Wikipedia:
Turbo Pascal:Initial release1983; 33 years agoBorland Delphi:Delphi (later known as Delphi 1) was released in 1995 for the 16-bit Windows 3.1http://VB.NET:First appeared
2001; 15 years ago
個人看法
BASIC起不來大概原因之一在於BASIC流行時(上世紀80-90年代)計算機性能太弱,而主要需求是本地化的應用。對於辣么弱的計算機性能,用C有時都嫌慢,更何況還要帶個解釋器跑的BASIC……到2003年往後,性能跟上來了,但是競爭對手也越來越多了。
BASIC原本到語法是很醜的,表現能力也不佳,兩次大的飛躍都是MS推動的,第一次是QBASIC,總算把該死的行號給弄沒了;第二次是http://VB.net,然而此時MS也沒想把這玩意作為主要推廣對象,而定位於給非職業開發者製作小應用工具的位置……不過至今由VB發展而來的VBS還在MS的大小玩意中各種路臉。
Pascal的失敗……其表現力不輸早些年的VC,倒是只有一個原因,就是當年的IDE實在不給力,補全啥的一點都不智能,Delphi 7-8時代作為方便程度堪比VB而性能堪比VC的存在很是火了一陣,但是無奈語法要求太嚴格,IDE功能不夠強大的話寫起來怎麼都比C/C++麻煩,加之在MS客場作戰,於是2000年過後就被VC給碾壓了……BASIC非常不適合系統級編程,不說早期的就說QuickBasic,一方面內存管理很弱,沒有堆空間,沒有指針,另一方面代碼還大量依賴GOTO和GOSUB,寫寫簡單的應用還行。而且慢。PASCAL沒有大的缺點,但是明顯不如C,寫得太多,讀得太慢,看begin end簡直神煩,所以兩個都可以選的時候自然會選C,會C的程序員多了就會促進這個循環
很多回答偏題了,ide什麼的根本不是什麼系統級編程所必要的。Pascal 足夠成功了。Basic也足夠成功了。系統級編程?它們並不是針對這個目的設計的。所以delphi有內嵌asm作為某些細節上的補充。此外delphi的編譯器只針對特定的載入器和處理器,平台移植是硬傷,這方面fpc是不錯,但是這並不是商業產品,其中的區別可以自行體會。(我相信pascal是可以做出操作系統的,但是如果要做好這件事,需要做的估計不僅是操作系統)
在語法上
pascal的類型系統包含集合,字元串。數組更嚴格,而不是像c那樣用指針偏移替代。basic。。。我真的不懂一種弱化類型,而且沒指針的語言怎麼寫低層所以,這兩種語言比c語言更高級,也更複雜,從來就沒有向低層的方向發展,所以有ide,vcl,等等一系列面嚮應用的東西。目前被c# java,等新一代高級語言取代(我認為平台移植,垃圾收集是關鍵)。反過來看c,很早就有了標準,各種平台都有實現,標準庫能實現基礎功能,語法上除了必要的就剩不下什麼了。大量的企業資源,這不是天然的首選么(畢竟彙編的跨平台能力實在是悲劇,而更高級的語言又存在太多的不確定)。因為begin end太難看,{}好看。
有些地方靠回憶了,錯了請指出
================================大多數回答都是分析了幾種語言本身的特性優劣來說明問題,但其實這都不重要,關鍵還是看這語言能幹啥,語言設計的再好沒有平台支持就沒有用武之地,反之同理(沒有iOS的話OC會有多少人用),標準特性等等也只要隨著社區發展而自然推動進化發展的(看著ES6解決了多少JS當初的缺陷設計,順帶吐槽CPP的語法)。C語言誕生是為了移植和開發Unix而設計的,目的是為了能更容易的編寫彙編代碼(對應的很多劃時代的符號設計其實就是圖個寫的快)。Pascal這時還是個針對特定大小計算機的定製語言,而Basic則是為了教學而設計的,兩者可能更為關心一些邏輯的表達能力上。
最關鍵的是Unix的橫空出世打破了那個時代為了計算機定製操作系統的模式,配合C語言提出了代碼跨平台的想法。你想那個時代的碼農,在不同機子上寫代碼還要分開學語言,寫完之後換個機子還要重寫一遍,來個可移植的概念有多刺激。
C語言也更快的進入標準化定製,一方面C更注重實際編寫需要,另一方面,標準化對跨平台也是個剛需。眾所周知後來Unix火了,作為和Unix平台配合最完美的C語言,那時還有啥語言能比得上。後來大家想通了,就開始做上層語言了……實際上只有C的近親(這裡指Java、C#、c++)才能成功,哪怕只是語法上面的近親。其它的無論Lisp、Pascal都只在教育等特定領域取得份額。而Basic則主要靠微軟的大力推動,包括最初的QBasic、VB,還有Office領域的VBA,才能那麼多的應用。
C的性能往下接近彙編,往上除了字元串處理能力相對弱(這主要是應用軟體的需求)外其他毫不遜色,天生就適合開發系統內核。
basic的設計過於簡單,定位就是入門者使用,用來開發系統軟體就不夠用了。pascal語言的定位是學生,設計也比較高級,而系統語言的特點是必須更接近底層,看看同樣功能的兩種代碼編譯後的結果就可以看出來了。
主要是Pascal沒有寫出來unix,unix的的興起是c語言成長起來的主要原因
我也來說幾句。看這些語言的歷史,背景。了解到前者pascal是為了教學目的而開發的語言,為學習良好的編程原則而提供一個紮實的基礎,而Basic則是模仿英語,以便讓不熟悉計算機的學生更能夠徐匯這種語言。這些目標很重要,但並不總是與實際的使用需要相符。而c,是為編程人員開發的語言,後來的c系衍化,衍生語言當然是站在此基礎之上的。目標本來就不同,不能說前兩者是失敗的。他們已經盡了自己的歷史使命。
接觸p是初中的時候參加計算機比賽學習的,當時給我的感覺就是難用,至少是這樣。可以說就是因為技不如人,易用性最終完蛋。。。。誰讓你不行呢…目前他們多用於教學吧,訓練編程思維還是不錯的,畢竟有特性
Basic是用來系統編程的? 明明是用來教學的~~~~
Delphi 這個IDE....真的好難用阿 裝上cnpack會好一點
當用上VS以後..再回頭看Delphi的IDE唉~由「使用這種語言來開發的成本是多少?」這個問題來決定一門語言的成敗。
我們公司用http://VB.NET也活的好好的,這不也十幾年了么。除了人難找一點以外,開發起來哪點比Java和C#差了啊。
不過你說的是Basic、VB6.0的話這個年代連IDE都找不到了,當然就沒人用了。z推薦閱讀:
※web前端設計有沒有類似vb,vc這類的可視化編程工具,用戶添加圖形,軟體工具自動生成代碼?
※25 萬條數據的 excel 文件,把每個數字都除以 10 ,怎麼做?
※用vb寫cs作弊器,是編程技術的應用,為什麼卻被cs玩家所不齒?
TAG:操作系統 | 編程語言 | VisualBasic | Pascal | CC |