一門編程語言是如何被創造出來的?

假如想創造一門語言應該怎麼做?(在不考慮金錢,時間,以及是否值得這樣做。只單從技術角度來講。)


首先你要確定你的語言是創造出來幹什麼的。譬如說你專門處理字元串,你就得給在語言裡面處理正則表達式設計語法,等等類似的東西,總之就是先把該有的語法糖準備好。

其次就是設計你的類型系統,譬如說動態類型,靜態類型,強類型,弱類型,帶不帶模板。模板裡面又分為C#那樣的,C++那樣的,還有Haskell那樣的。還有你是函數式的、面向對象的、面向actor啊aspect、或者是全都有。還有你的類型是只讀的(如Haskel),或者是可寫的(如F#)。後面還有遞歸類型,帶模板的類型通常都會面臨這個問題。

類型裡面最複雜的一個,就是你要不要實現一個類型函數,大約做出來就跟C++的偏特化一樣,目前只有C++有。

然後就是設計你的控制流,譬如說C一樣的,要不要加上exception,要不要加上continuation(包括但不限於C#的yield return、C#的async-await、F#的computation expression、Haskell的monad、https://github.com/vczh/tinymoe 的自帶CPS變換),要不要加上模式匹配,你的模式匹配要多精細,要不要支持遞歸。還有你的語言要不要有尾遞歸等。

最後就是設計你的代碼的風格,譬如說縮進啊、換行啊、用縮進還使用大括弧啊,總之就是看起來像C++、C#、Haskell、F#、Scala、Swift、OC還是python、ruby等。

把這些東西搞定了之後,你就可以先寫語法分析器和語義分析器,然後寫優化,然後選一個IL或者你自己設計一個IL,編譯的時候是JIT、AOT還是沒有T等。


需求是首要驅動.

彙編的出現是為了減少打孔的痛苦.

高級語言的出現是為了減少彙編的痛苦.

java是為了方便跨平台.

也有的是為了某個方面更方便,功能更強大,或者更開放. 甚至只是為了對抗.比如 J#


編程高級語言類似於人類自然語言,你想創造一門語言,那就得創造出這門語言的基本語言元素,比如單詞,關鍵字。然後是基於這些基礎元素上的詞法,語法,語義等。計算機只能識別二進位機器語言,所以創造編程語言的關鍵是要編寫出能轉換成機器語言的工具,也就是編譯器。理論上只要你能寫出編譯器,你就能製造出任意編程語言。編譯原理是計算機科學最高深的理論之一。


先看點編譯原理,再看其他開源的編程語言是怎麼實現的,歡迎fork本人拙作 http://github.com/sunpaq/monkc 這個算不上編程語言但是很好理解


炒作炒出來的,尤其是最近新出一些語言一個比一個炒得火,結果進去看了還是TM換個皮而已


感到另一門用起來不爽或者不夠用的時候。


一門語言的出現必定是為了滿足當時的需要

有個疑問就是:

為什麼C++設計的時候不把C語言擅長的也包含進去,這樣就完全沒必要用C了,用一門C++就可以做現在C和C++能做的。

為什麼C#的設計不整合C和C++,這樣就可以用C#做所有C和C++,C#能做的。

@vczh


知識儲備:

  • 學習完編譯原理;

  • 具備編程能力;

  • 了解目前流行語言特性。

思考內容:

  • 確定語言用途和功能場景;

  • 選擇語言基礎特性和功能;

  • 確定你要用什麼去編譯實現你所需要創造實現的語言;

步驟什麼的,就按編譯原理裡面的來詞法、語法分析什麼的。


推薦閱讀:

有什麼性能好的迷你主機?
虛擬機中運行虛擬機中運行虛擬機……如此循環能運行多少個?
hash演算法的數學原理是什麼,如何保證儘可能少的碰撞?
理論上,能否直接用彙編語言寫出今天所有的計算機程序?
國外計算機最好的大學有哪些?

TAG:互聯網 | 編程語言 | 編程 | 計算機 | 冷知識 |