軟件是用編程軟件寫成的,那么編程軟件是怎么來的呢?
這個吧,我真的沒辦法一個個給你解釋到底,不然你要是打破沙鍋問到底,可能一頓火鍋的功夫我也沒辦法給你說完。舉個例子哈,IntelliJIDEA和Eclipse都是Java的IDE,用這兩個IDE可以寫非常多的軟件,比如AndroidStudio先后分別基于這兩個軟件,Android上所有的軟件都是用這玩意兒開發的,但是這兩個IDE本身也都是Java語言開發的,這兩個IDE呢最初肯定是在Vim/Emacs+Java開發的,咱就先說到這里,不然要喋喋不休了。
我給大家提一個思路,大家按照這個思路可以自己去找自己感興趣的問題。我給大家說一說Google實現Go1.5自舉、去除所有的C語言程序的過程,大家慢慢就明白了,基本上計算機技術都是這樣迭代出來的,比如怎么先有了C語言、現有了Unix,又如何在這些基礎上,誕生了Emacs、C++等眾多新的軟件和技術。
事實上現在所有新的編程語言,基本上都會考慮在C語言的基礎之上構建,Go語言也不例外,何況Go語言的重要設計者之一肯湯普森老爺子,還是C語言、Unix之父。Go語言發展的第一階段,就是開發一個從C語言到Go語言的翻譯器,將C語言編譯器翻譯成Go語言的,不過了Go語言核心設計團隊的三位大神非常機智,他們最大程度避免了在Go語言編譯器設計中,大量使用未來很難移植到Go語言的一些特性,比如宏、比如指針,這些都是C、C++留下的一些糟糕的設計,不符合現在的編程語言設計潮流。轉換編譯器源碼樹產生一個Go語言編譯器,不過這時候還是典型C語言風格。
接下來,Google對編譯器進行了優化,將編譯器CPU、內存等硬件資源占用的問題解決了,并且引入了并行概念。為了改進編譯器在消除邊界檢查等問題下的能力,同時在不依賴架構的node*s、prog*s之間引入一個中間表示。這些事情完成之后,Google就做了最后一步,用Go1.5、也就是當時Go語言最新版本,用go/parser和go/types替換了編譯器前端,至此Go語言實現了自舉,并且獲得了一個穩定高效的編譯器實現。
Go語言本身編程難度要比C更簡單,這是因為Go語言跟很多高級語言一樣,摒棄了指針、規避了內存泄漏、解決了緩沖區溢出,深度遞歸時棧的溢出,摒棄了宏這些定義。Go語言工具鏈對模塊化、單元測試、以及性能分析支持更好,在修改內部API或重構時,應用自動化程序重構前景更加值得期待。
你看這就是Go語言從C語言寫編譯器,到最終實現Go語言完全自舉的過程,當然大家都知道圖靈完備的編程語言都可以實現自舉,理論上符合圖靈完備的編程語言都是這么發展的,C++就是這么發展的,滿足這個條件的編程語言,你才能作為其他編程語言的基礎。
那么我們回到最初的問題上,編寫軟件的編程軟件又是在什么環境下開發的呢?計算機技術發展至今,在機器語言的基礎上,弄出了匯編語言,接著兩位祖師爺弄了C語言和Unix系統,接著在這個基礎上,又有人弄了Emacs、Vim、GCC,你看基本上現代計算機技術的所有根基技術就有了。
接著就是用C語言寫各種操作系統,為了各種需求寫各種編程語言,又根據各種需求開發各種集成開發環境,然后又根據各種應用需求用集成開發環境寫其他應用軟件,這就是一個完整的計算機技術發展進化流程。
編程軟件也是,先有了機器語言,打孔時代創造和發明了匯編語言,匯編語言的基礎上又有了B語言,然后B語言的基礎上發明了C語言,C語言重寫Unix,于是現代計算機的雛形也就有了。早期是一生一、機器語言生匯編,然后機器和匯編語言生C語言,到C語言時代就是一生萬物、C語言生萬物,現在就是多生萬物。這就是計算機技術發展的過程。