設計、更新一門通用編程語言的一般流程是怎樣的?
01-06
世界上有上千種編程語言,老資格的有傳說中十天就完成的Javascript,天國的ES4,驚艷的ES6,帥氣的C#還有那個啥的Java;新生代包括Rust、Go、Nim等等。
各個語言還在不斷的更新,比如說連親爹譚老師估計都認不出的的C++14、填坑的Java、Stable前大拆大建的Rust。這些編程語言的設計與維護一般上有哪些通用的流程?比如說詞法、語法、類型系統、流程式控制制、編程範式、標準庫、FFI、ABI這些方面的設計工作是如何被串聯起來組成一個編程語言的設計流程的?互相之間是什麼關係?
加「語言特性」一般是兩類:一種是真的學術界發現了某個特性很好打算實現出來,這個基本上現在都是在 Haskell(偏向語義),或者 Scheme(偏向文法)上面折騰,比如 Haskell 的 Impredicative Type,它的實現就參考的是 Simon Peyton Jones 的論文。工業語言的話,就是山寨居多了。
大部分都是 抄襲+微創新。
一本非常值得參考的資料《C++語言的設計與演化》。
你會看到一門嚴(pin)謹(cou)的編程語言是有多糾結。當然,只要有實踐先行者,後面的人也還是抄得很積極的。這個問題是我在二周目vzch 如何設計一門語言(一)——什麼是坑(a) 之後提出的。看起來還是有很多東西沒看懂,畢竟我也是只學了半年C剛開始學C++的人(手動斜眼以下是我淺薄的一些理解:
編程語言是為了解決編程需求的,不同的編程語言適應不同的需求
編程語言不只是工具,對於程序員來說更是產品編程語言的門檻太低了,算起來就一個Turing completeness,只要滿足圖靈完全,剩下的東西都可以視作語法糖。但是顯然並沒有多少人會拿Brainvczh去寫一個商業應用什麼的。BF的目的就是為了實現一個極小化的圖靈完全語言,並不是拿來做大型軟體開發的。編程語言的實現和更新是為了更好的實現他的需求。比如說rust,花了幾年的時間來找到路線,從GC到確定析構,還有生命周期的完善,基本上是為了實現(也是好不容易確定的)他的目標:
- zero-cost abstractions
- guaranteed memory safety
- threads without data races
- ……
藉助強大的lifetime和borrow checker,Rust可以在沒有更多運行時開銷的情況下保證內存安全,避免了用C/C++(&<-指C with class)容易出現的各種Dangling pointer、Wild pointer。
反過來想想,如果現在給定這些需求,我們要如何實現呢?為了最小的運行時開銷,我們要幹掉GC……為了內存安全,我們要檢查變數的引用是否合法……為了……你多半還是會得到Rust。
因為Rust確實很好的實現了他的需求。而如果要一個適合小學生作畫用的語言,顯然以上都不適合,都不如LOGO語言。C語言適合對內存與機器的精確的控制,很多時候可以看作是高級的彙編,解決多是計算機底層及性能相關的需求。為了保持足夠的精簡性和不添加額外的開銷、提高開放程度,現在的更新都是小修小補。
而C++則先是加入了很多通用的輪子,這兩年的標準更新更是加入了很多適合工程開發的特性。不過我有一個個人觀點,C++裡面的功能越來越多在語言層面上確實是越來越好,但在工程層面,由於開發者素質不一致,過多的功能可能會帶來一些混亂,所以很多公司選擇使用「閹割版」的C++,也是有原因的。但說到底,這是內部工程方面的原因,是公司/團隊的編程水平決定的。Rust的出現,則是因為C/C++真的太過開放了(至少是C++11以前),容易造成內存/指針相關的Bug。還有go語言,不管怎麼樣在語言層面的並發解決了很多在服務端場景的需求。搞定了最基礎的需求,其他的部分就是我比較好奇的了,因為這些細節的設計和風格,感覺很大一部分取決於設計者/團隊的喜好和理論知識水平。比如說C#的linq,當初也確實是被驚艷到了(想像一下我寫了一頁的代碼學會linq後發現只要五六行),然後就是C++的模版和C#的泛型、Rust的trait(所以說我基本沒怎麼用沒有完整泛型的語言)。這些的設計需要比較高的理論知識,影響到一個語言的編程範式和類型系統。而語言的不斷更新很多時候也是為了趕上當今開發的潮流,以便讓開發者用的更順手,比如說C#7現在要加入模式匹配和元組,Java8加入的lambda都是取材於逐漸被人重視的函數式編程。個人感覺詞法方面和編程風格還是看語言設計者的喜好比較多,比如說Rust的各種莫名其妙的縮寫略多而OC你又需要雙屏來看一個比較複雜的變數名……(逃推薦閱讀:
※我是讀軟體工程的一名女生,有人說大學裡面成績不重要,有人說證書不重要,那到底什麼最重要?面試官主要看什麼?
※可以介紹下嵌入式軟體工程師和後台工程師這兩個職業未來的發展么 ?
※現在做遊戲學習opengl還有必要嗎?
※軟體外包,需求分析由誰來做?