編程語言是怎麼設計出來的?

是用更底層的語言來寫?彙編?那彙編是怎麼設計出來的?


分別回答好了:

編程語言是怎麼設計出來的?

編程語言設計是在紙上完成的。你需要決定兩個東西:

  1. 語義
  2. 文法

是用更底層的語言來寫?彙編?那彙編是怎麼設計出來的?

這是說編譯器的實現。現代編譯器都是用高級語言寫成的,它做的事情是把你的語言翻譯成機器代碼|位元組碼|其他任何東西。甚至很多語言的編譯器是用自己寫成的——只要你有一個其他語言寫的編譯器來讓這個自解釋循環啟動起來。


編程語言不過是一系列的預定義語法而已。至於說語言設計的原則,就是必須滿足圖靈完備的這個特徵的,只要有圖靈完備這個特性,這門語言從理論上來說就能夠表達任何一個可計算的問題,因此就能夠被我們用於描述問題的解的演算法。

但是計算機不能夠直接理解我們設計的語法,因此我們需要根據我們(編程語言的設計者)和你(語言使用者)之前約定的語法,將編程語言轉換成可直接理解的彙編指令。

所謂轉換,實際上就是降低抽象的層次。比如你現在使用*p = 0;這麼一個指令,但是他的抽象層次過高,計算機不理解,因此我們需要將它具體化為:mov eax, p mov [eax], 0這麼兩條具體的指令。這兩條指令的語義則處在CPU能夠理解的層級,而他們的語義實際上是由CPU內部的門電路提供實現的。

至於說彙編語言,同高級語言一樣是被設計出來的。CPU的製造者根據自家CPU能夠執行的操作,制定了一套語法用於表示這些操作。這樣你就能通過彙編語言指示機器按照你的意圖工作了(執行生產商預定義好的操作)。

=====================

至於編程語言用神馬來寫,我估計你的問題應該是編譯器是用什麼來寫?

這個問題的話答案是先有雞還是先有蛋的問題。我們有研究過編譯器歷史,不過我相信第一款有編譯器功能的軟體肯定是彙編實現的。不過現在的編譯器你編譯的話,由於編譯器已經存在了,所以一般都用c。


現代的編譯器都是用一些中高級語言寫的,比如C編譯器的大部分都是用C寫的。至於彙編,現代的話彙編編譯器當然也可以用C來寫。

但最初的時候,彙編編譯器恐怕是用一些最簡單的方式直接翻譯成機器語言01串的。那種編譯器估計沒有現代編譯器什麼語法檢查優化之類的東西。然後在那個基礎上開發了簡單的宏替換,C, 然後就可以用那些新語言重新寫彙編編譯器,如此往複。

大學做計算機組成的時候做過一次類似的作業,彙編到機器碼的翻譯很直接,寫了一個java的編譯器翻譯後手工輸入到試驗用機器里。


像C就是自己在實驗室搞出來,大家跟風,最後標準化。

像Java就是公司搞出來,大力推廣。


推薦閱讀:

Leetcode的weekly contest半小時AC 4題的那些人是怎麼做到的?
遊戲設計製作時是否會用到類似 ACM 中的演算法設計?
ACM中哪些演算法是應該敲的滾瓜爛熟的?
寫代碼的時候應該怎樣的思路將現實世界轉化為代碼, 魔方做一個例子?
用程序實現自動寫小說,難度有多大?有哪些需要克服的難點,大體思路是怎樣的?

TAG:軟體 | 編程語言 | 演算法 | 編程 |