世界上第一個編譯器是怎麼來的?

描述可能有些 bug啊。但是看完你應該就懂了我想問什麼了。問題是剛剛刷微博不小心想到的,所以也同步了微博。

一門程序設計語言的編譯器怎麼才能是它自己?first,用其他編譯器寫一遍代碼,得到編譯器。second,用本語言寫一遍代碼,用前一個編譯器編譯一遍。last,銷毀原來的代碼和編譯器。現在,你懂了。。那麼問題來了,


告訴你一個秘密吧,有一種編譯方法叫跌代法,我們將c語言切分為100份,然後讓第一份寫出的編譯器編譯第二份,依次類推,得到c100,也就是最後的c,而編譯c1的編譯器是由彙編寫的,這樣就大大降低了彙編編譯器的工作量。


一直到上個世紀末為止,都有主流編譯器是彙編寫的的事情,就別說第一個編譯器了。


差不多就是插電線硬編碼出一個編譯器


Compiler

How was the first compiler written?

How was the first compiler compiled?

Grace Hopper completes the A-0 Compiler

[轉] 編譯器與Debug的傳奇:女牛人Grace Murray Hopper小傳

簡單來說:人工查表將彙編代碼翻譯成二進位指令,然後輸入電腦


世界上第一個有「編譯器」作用的東西是 Zuse 給 Z4 製造的外設 Planfertigungsger?t,它可以把「易讀的」輸入轉換成 Z4 使用的穿孔膠片帶。此裝置 1945 年便安裝到了 Z4 上。

世界上第一個高級語言編譯器是 1957 年的 Fortran,是直接用機器碼敲進穿孔紙片里的。


在計算機科學中,的確遇到很多這樣的案例。比如我們現在使用的gcc和c語言程序的關係,記得大一那會兒一直搞不明白,感覺很奇怪。既然c語言程序要用gcc編譯才能運行,而gcc本身又是c語言程序,那gcc是怎麼被編譯出來的,gcc嗎?解答一是gcc由其他語言編譯器編譯出來。那其他語言的編譯器又是什麼編譯器編譯出來的呢?也就是說,總得有一個上帝一樣的編譯器,它一開始就不用編譯。這個上帝一樣的編譯器到底是什麼啊。學過彙編的人應該知道,彙編語言是最接近硬體的語言,如果你的程序是彙編語言寫的,那麼需要一個彙編器,但是最開始哪兒有彙編器。其實,彙編語言又叫助記符,每一個指令都對應著一個二進位編碼。呵呵,上帝編譯器其實就是人啊……計算機早期,其實都是自己在紙條上寫完程序後,然後對照編碼表,一步一步翻譯成機器語言的。人腦是計算速度最慢的編譯器,但卻是計算機的上帝編譯器。另一個案例是機器學習,有很多這樣的問題,輸入一批數據,訓練,再用輸出結果,調整參數再將輸出作為輸入。這樣一來,就是先有輸出還是輸入的問題,但是問題是一開始輸入和輸出都沒有。此時的辦法就是人為設定一個輸入,比如一批隨機輸入數據。最後,還有一個比較常見的就是對數據的描述信息,我們稱之為元數據meta data。元數據就是一個鏈,一直指向目標數據,而同時目標數據中也可以含有發現元數據的能力,這樣一個雙向鏈中,也需要一個最初的元數據,而這個元數據可能就是人為設定死的。


蟹妖。最早的計算機沒有語言,直接插跳線。


世界第一台編譯器是用紙片打孔機打進去的,但是,我覺得這不重要,重要的是這個紙片的二進位形式你是怎麼知道的。這要對硬體非常非常的熟悉,我們可以認為這個時候就是人在編譯,世界第一台編譯器就是人,真的就是人。後來通過人這個編譯器就做了很多事情。就可以造出一個語言了,但是這種語言和二進位的形式非常緊密,幾乎看的懂這種語言,就可直接翻譯成作用於硬體的二進位了,這就是彙編。至少沒以前那麼麻煩了吧。在彙編基礎上面就可以編一個c語言的編譯器,那c語言又容易多了。但是這些語言翻譯成的二進位都是可以直接作用於硬體的,不像java,python等等,java等等這些語言編譯器編譯成的二進位不能夠直接作用於硬體的。所以,操作系統是不可以用java,python等等這些語言編寫的。


這個問題其實不複雜。

早期的程序員是要靠手寫機器碼來編程的,手動跳轉,控制內存等等。

比如這張表:

http://www.jegerlehner.ch/intel/IntelCodeTable.pdf

查表按照指令寫代碼。

第一個編譯器就是這種機器碼寫出來的,然後再在這個編譯器的基礎上構造更加複雜的工具,一代代的迭代,最終就構成了你所使用的各類compilers。


真要說最早的編譯器應該先是彙編器吧,一般來說彙編器硬體廠商會提供的樣子。再之後就有了高級語言編譯器。指令集不一樣的話可以交叉編譯。


彙編語言需要編譯器么?


一開始只有機器碼,後來覺得太難記了,所以說在有了鍵盤和顯示器後發明了彙編,然後發現彙編不夠,開始在彙編的基礎上添加公式和變數功能,然後就慢慢發展成了結構化語言.......於是C就被發明出來了,至於是怎麼演化的可以自行百度


以前寫程序都要手動翻譯為機器碼的,第一個編譯器也是程序,當然也要手動翻譯成機器碼啊 。。


推薦閱讀:

如何成為一個有代碼潔癖的程序員?
判斷一個程序員的能力真的只能用代碼嗎?
程序員如何高效讀代碼?
GitHub上有哪些值得關注和學習的Qt項目?
ubuntu下有沒有原生支持中文顯示和語法高亮的代碼編輯軟體?

TAG:編程語言 | 代碼 | 計算機科學 | 編譯器 |