寫程序需要編譯器,編譯器是程序,輸入輸出也需要驅動,驅動也是程序,那麼第一個在電子計算機運行的程序是怎麼產生的?

總感覺有些像雞生蛋、蛋生雞問題。有的說剛開始是寫機器代碼,但具體些程序是怎麼發展起來的?


早期的很多程序是穿孔紙帶搞定的。雖然可能有更早的程序通過撥按鈕之類的方式搞定,但大部分它們應該沒成為真正的「始祖雞」。穿孔紙帶輸入 相比電鈕輸入 更容易預先檢查錯誤。

用針戳光碟 用磁鐵吸磁片 現實中是搞不定的。


這是程序的自舉問題。不光compiler有這個問題,operating system也有這個問題——Linux kernel是在Linux上編譯的,那最初的Linux kernel怎麼來的?

自舉的程序首先要它舉。最早的彙編器是機器語言寫的,最早的C編譯器是彙編語言寫的。這之後,就可以不斷的自實現或者交叉實現。C語言可以寫新的C編譯器,C語言也可以寫彙編器。C語言可以實現Python。Python也能寫C編譯器。

最早的Linux kernel在Minix上編譯。然後就可以在Linux上編譯。

還有一個有意思的問題,C編譯器如果有bug怎麼辦?

  1. 如果這個bug會影響編譯器本身的編寫,就先要用彙編修改。
  2. 然後用有bug的編譯器編譯修改的源代碼。因為bug用彙編修改,所以不受bug影響。
  3. 然後把bug fix用C重寫。
  4. 用第2步得到的無bug的編譯器編譯。


寫程序需要編譯器是不正確的,編譯器/解釋器並不是軟體的必要條件,只有當需要用字元串來表達軟體含義的時候才需要編譯器或解釋器,最原始的軟體實際上僅僅是一種開關電路,和電子課上的實驗沒有多大區別!

I/O等硬體也是類似的情形,最初只是簡單的時序信號,逐漸變的複雜以後才抽象演變成我們稱之為驅動的東西。

實際上彙編語言向機器語言轉換的過程使用一種叫做彙編器的東西,它和編譯器並不是一回事。題主的所指大概是說任何這類工具是如何產生的,但是問題的結論不會變,不存在雞生蛋還是蛋生雞的問題!

計算機領域很多看似矛盾的東西都可以用抽象和隔離的方式來解決!


編譯器通過反覆迭代開發實現的,比如最初用彙編實現一個C的最簡單的編譯器,之後就可以用C去實現某種語言如Java的編譯器,寫出源碼後用最初的C編譯器進行編譯,得到Java的編譯器。


並不是所有的程序都需要編譯的,這與自舉其實沒關係。

機器語言就不需要編譯。。。


動點腦筋的話,用原始的工具就可以製造出稍微高級一點的工具,然後無窮迭代這個過程

這就是人類文明的基石


順序就是機器代碼---彙編器--編譯器。

至於硬體方面會有硬體指令解碼器。

PS:Lisp語言 可以自編譯


最早的彙編程序是用手工完成機器語言的編譯,當有了初始的彙編程序之後,也就是組成程序的最基本單元,姑且叫做primitive吧,以後的程序就可以通過這些原始的primitive來完成彙編了,再往後發展就是可以在不同系統之間實現交叉彙編。如果硬要說最初始蛋,應該就是早期計算機科學家針對某一處理器完成的手工編譯程序段。

公認的第一個真正可以工作的編譯器是A-0,它是為UNIVAC開發的編譯器,於1952年由雷明頓蘭德公司的工程師開發完成的。具體了解請閱讀:〔編碼:隱藏在軟硬體背後的語言〕這本書,淺顯易懂,對這個問題有一定的初步認識,後續的可閱讀編譯原理。


微代碼-機器指令-彙編-高級語言


這是可以通過簡單Google就能得出答案的問題。

How was the first computer program created? [closed]

http://stackoverflow.com/questions/4772768/how-was-the-first-computer-program-created


這個問題就好像直尺:標準的直尺要通過模子刻出來,但是模子也必須是直的,所以最初的直尺是怎麼造出來的就很值得思考了。

我感覺可能必須要通過硬體實現最初的程序。


聽說迭代或交叉


推薦閱讀:

Scheme語言的優勢?
Mathematica 能否成為取代 Python 乃至其他編程語言的程序設計語言?
新入職的軟體開發公司,看不懂代碼怎麼辦?
Python 中循環 import 造成的問題如何解決?
你見過的最出色的程序員是怎樣的?為什麼出色?

TAG:編程語言 | 編程 | 計算機 |