如何給一個外行人解釋:世界上第一個程序是如何寫出來並讓它按規定運行?

恩,我就是那種外行人。

在我看來電腦的神奇之處在於他剛開始只是一堆金屬元素,為什麼在經過通電之後實現了程序這一指令並在以後的發展中發展出如office這樣強大技術的?

希望大神們從淺層面幫助我明白這個東西的。

不勝感激


一堆土怎麼蓋出高樓大廈的?其實是一個道理,兩個字,工程。

完成一項大的工作,有三個步驟:

  1. 找到一個可行的理論,這是科學的範疇,也是最困難的一步
  2. 將理論的可行性轉化為實踐的可行性,這是技術的範疇,同樣需要天才和靈感
  3. 用這個可行的方法重複一千遍,在這個過程中找到最有效率的執行方案,然後再重複更多次來做出更複雜的應用,這是工程

工程是看上去最神奇最宏偉的一步,但其實是最不複雜的一步,畢竟路都鋪好了,工程師們通常要做的只有:

  1. 創造出更合理的工具來提高工作效率
  2. 發明出更合理的分工來提高工作效率
  3. 總結出更容易學會的經驗來提高工作效率

它無非是對於這件事,要如何把更多的人力投上去、讓這些人力發揮最大效率、從而在最短時間內完成工作的問題,跟前兩步來說,根本沒有什麼困難的。就像研究力學原理最困難,發明大樓的設計方法其次,而設計出大樓並沒有那麼難,照著圖紙施工更是搬磚的活了。

對於計算機科學也是這樣的。提出存儲程序原理的馮諾依曼是天才,提出可計算理論的圖靈是天才,發明出晶體管的肖克利是天才,發明鎖存器、DRAM、匯流排、操作系統原理、編譯原理、C語言……這些天才的名字我甚至沒法一一叫出,我們這些工程師只是在前人種下的大樹下,用前人發明好的方法重複著自己的工作,同時嘗試著做出一點點微小的貢獻而已。

計算機能進行計算,首先歸功於非線性元件的發現,這個開端還不是半導體晶體管,而是繼電器、電子管等等。在這之前人們已經可以用電阻分壓進行一些計算了,但是很幼稚,得到的結果也不準確;而經過這些元件的研究,人們發現我們可以將信息表示為數字信號,用0-1的二進位來進行運算,這樣就可以通過電路得到精確的結果,這很快就表現出了對手搖計算機的領先。某些電路可以讓一個輸入信號變成它的相反的值,0變成1,1變成0;某些電路可以讓兩個輸入信號變成與或者或的關係,與也就是00、01、10都變成0,而11變成1,或則是00變成0,而01、10、11都變成1。布爾代數這個工具告訴我們,以上的邏輯加在一起就足夠表達所有可能的邏輯了,包括加減乘除在內,於是我們可以用二進位進行運算。

曾經對計算機來說,所謂「編程」,指的是把線路板上可變的線路重新插接起來,讓它們連接成可以工作的電路;甚至於debug,指的是有蟲子飛進線路里被電死了,造成了短路,需要人去把它們取出來,所以叫做de-bug,bug就是蟲子的意思。後來馮諾依曼提出了存儲程序的概念,我們不是用插線,而是用存儲在電子元件中的程序來控制線路之間的連接,這樣就大大提高了我們重新布線的效率;而這樣的機器能完成怎樣的任務,這個問題則由另一名天才圖靈解決了:簡單來說,能完成任何任務。這樣人類就有了第一台通用電子計算機ENIAC,一個龐然大物。雖然不知道細節,但它大概是從穿孔卡片之類的外設中讀入第一個程序的。穿孔卡片的歷史就遠比計算機要早了,甚至可以上溯到十八世紀;IBM最早也是靠它發家的。為了存儲數據,ENIAC甚至用了一個水銀槽,把電轉換成聲波,讓聲波沿著水銀槽傳播來實現延遲,從而暫存數據。不管怎麼說它的確是可以工作的。

程序是如何替代線路來運算的呢?其實並沒有什麼神秘的。我們看繼電器,它通電的時候,就導通一條線路,關閉的時候則斷開;如果我們將所有的可能的連接上都連上線,就可以用繼電器來控制這些線是通還是斷,也就相當於控制了電路。更好的一點是,我們運算的結果可以反過來修改存儲的狀態,於是這個運算可以按照我們設計的步驟連續不斷地運作下去,大大擴展了計算機可以進行的任務種類。

如果你想知道第一個程序如何運行的,大概到這裡就結束了;但是離office還遠。

電子管計算機不管是價格還是壽命都有大問題,後來人類發明了晶體管,然後是集成電路,它大大降低了計算機的尺寸和成本,於是小型機甚至個人PC變為可能。再後來,計算機越來越廉價,也就有越來越多的人用得起,為了讓所有人都能用得上,IBM、貝爾實驗室等機構就聯合起來想要開發一個叫做multics的操作系統。

操作系統是什麼呢?以前的計算機一次只運行一個程序,它接受指定好的輸入,完成指定的工作,列印到紙帶輸出,然後就停機。但現在的計算機計算能力很強,僅僅一條紙帶的輸入速度已經滿足不了它了,為了提高效率,它必須能同時輸入多道數據,運行多個任務,從而提高效率。對於以前的計算機來說,計算,然後決定讀取數據,然後等待數據讀進來,這時候計算機完全停轉等待著穿孔卡片(紙帶),這是對計算機的浪費;而有操作系統了之後,計算機會在等待數據輸入的時候,切換到其他計算任務上,直到讀取完成之後再切換回來進行原來的任務,這樣就讓輸入輸出(IO)與計算進行了重疊。

然而這個計劃悲慘地失敗了,大概是因為當時的人們還沒有充分認識到,軟體的開發是一項獨立於硬體的工程,直到認清這件事的時候已經晚了,貝爾實驗室和IBM都因為開發延遲而退出了這項計劃。但通過這個大項目,人們認清了幾件事:

  1. 軟體開發的複雜度超過了人們的想像,必須用正確的方法來進行;這個正確的方法叫做模塊化。將軟體的功能拆分成小的模塊,這樣人們才能有效地協同起來共同工作;否則僅僅投入人力是不夠的。
  2. 工具的重要性。要高效率的開發軟體,我們需要高級語言而不是彙編。

後來,multics的遺迹上,兩個愛玩遊戲的工程師為了玩遊戲,從遺棄的代碼中開發出了Unix,順便發明了C語言。

從這以後,軟體工程的路上一片坦途。沒過多久,也有了我們熟知的DOS和Windows。

這之後的故事就簡單了,就像我最早說的,我們工程師只是在鋪好的路上重複勞動,再一點點改進原來的方法,從DOS到Windows,從16位到32位,從文本模式到圖形模式,從實模式到保護模式,我們的工具每天都在進步,但我們做的事情其實與幾十年前沒有多大區別。就像是搭積木,我們每個人都學會了怎麼搭上自己的一塊,最終我們搭出了龐然大物,但這其實並沒有什麼可稀奇的。


世界上第一台機械計算機,出現於崇禎十五年,清崇德七年,1642年(1643年牛頓出生,1644年李自成攻陷北京,崇禎帝自縊,留血書「任賊分裂朕屍,勿傷百姓一人。」明廷進入南明時代),19歲的法國數學家~帕斯卡~製造了鐘錶齒輪式機械計算機,但僅能做加減法運算。

(永曆三十二年,清康熙十七年,1678年,吳三桂稱帝,蒲松齡落榜,同年吳三桂逝世,惠更斯向法國科學院提出光的波性理論——德國數學家萊布尼茲發明了可做乘除運算的計算機。

道光二十二年,1842年,中國古典時代結束的第三年,英中籤訂《南京條約》。英國Lovelace女伯爵,一位名為Ada Augusta的女性,編寫了世界上第一條程序(十進位),用於在分析機上計算伯努利數。她被認為是人類世界第一位程序員。

(分析機是英國數學家查爾斯·巴貝奇在1837年(道光十七年)提出的只存在於設計階段的機器,這台機器因為政治經濟公關等原因並沒有造出來。模型為:

用打孔紙帶輸入。)

……

一戰,默哀。

……

二戰,默悼。

民國三十年,1941年,世界上第一台用電子元件製作的計算機,由德國~朱賽~用繼電器製成。毀於戰火。

民國三十五年,1946年,舉世聞名的第一台通用計算機(不僅僅是專門用於哪類計算,謂之通用)ENIAC埃尼阿克誕生。

第一批真正意義上的通用計算機程序員,就是上面六位女孩子,她們的工作,是抽插電線和按開關(以及更換燒壞的零件)——劃!重!點!這就是現代意義上!真正意義上的編程!也就是口口相傳神乎其神的上古初代編程!——直接改電路!對電路下手!

(關於抽插電線,作為類比,見過老式電話站接線員的接線台嗎?

所謂編程,就是根據數學問題,編出電線的連接方式,然後製作用於輸入的一大堆打孔卡片,這可能需要幾個月。

但是埃尼阿克運算很快,轟!半個鎮子的電都供上了~立馬就能算出來~雖然輸出也是一大堆打孔卡片~又需要再花幾天時間翻譯這些二進位孔~但還是快多了~

知道了這些,答主應該明白:現在的所有計算機編程,都是在實現那六個女孩子的工作。所謂按規定運行~這個規定!就是電路~電路不變,程序不變!

更專業點的科普:

計算機的數字電路(也就是各種編碼器、解碼器、加法器、鎖存器、計數器……)是用邏輯門實現的,邏輯門懂吧?就是高中物理說的「與、或、非」,無論輸入輸出,有電流就叫做1,沒電流就叫做0。

埃尼阿克的邏輯門,是用粗大憨實的電子管做的(一個邏輯門是用好多管子做的),所以埃尼阿克極為龐大。而且每過幾分鐘就會燒壞幾根兒管兒。

而現代計算機用半導體管(晶體管,用一兩種半導體做的二極體三極體)代替了電子管,所以我們現在的個人電腦小多了,又叫微型計算機(微機)。

(所謂半導體,就是位於元素周期表金屬和非金屬交界附近的硅、鍺那類過渡元素,下圖黃色部分——給它小電壓它不通電,給它大電壓它就通——所以叫它們半 · 導體。又因為它的分子結構是有空間規則的,不是亂排的,所以又叫晶體~見人教版高中化學選修3~

換用如此小巧的原件以及他們的製作工藝後,集成電路和集成晶元就出現了。

(上圖叫做單片機晶元,和下圖的英特爾處理器,某種程度上說,是同類。這些處理器的核心,是寄存器,用於記錄程序運行中產生的中間數據,以及負責挑選有我們需要的功能的電路(也就是各種「器」)。

還記得那六個女孩的連電線和按開關嗎?

!所謂連電線,就相當於單片機編程里的選擇寄存器、選擇時鐘、選擇外部設備等等等。……甚至更原始些,現代意義上的有些寄存器,在那時還沒有集合到一起,完全需要人下到更下一層的硬體去……接電線。

!所謂按開關,就相當於單片機編程里,給某寄存器的某位置1還是置0。

集成晶元,就把那六個女孩連電線的各個設備,全都用化學材料填充的方法搞到晶元里了,所以叫集成晶元,也就是CPU中央處理器。利用半導體各種通和不通的特性,代替了六個女孩子拔插電線的工作,所以裡面就省了導線,所以才那麼小。

(所以我們說,那時候的計算機,以處理器為核心;而現在的計算機,以存儲器為核心;就是因為製作晶元變容易了,而我們需要處理的數據~和產生的數據卻更多了。)

而更多的功能,就可以交給晶元外的集成電路了。

——如此這般,也就不需要每次編程都改電路了~只要用到哪部分電路,就在程序寫一句代碼,電流(0和1)就去找那部分電路了~

也就是說,編程通過控制電流,來選擇需要的電路,從而實現那六個女孩子的工作~數據便在選好的電路里走一遍~然後吐出來——這就是「按規定運行」。

可能有的人無法理解那些女孩的工作與現代計算機的聯繫(所以我就再補充點兒)——那是因為ENIAC沒有存儲指揮自己指令的功能,所以每次遇到新的數學問題,都要重新接線;而現代計算機,是把指令預先存在了一個地方,所以我們只要敲代碼就可以調用這些指令。

後來馮諾依曼又主持構建了EDVAC(1951年——共和三年、抗美援朝第二年、西藏和平解放——EDVAC才正式運行,雖然草案在ENIAC運行前就有了),這個新的計算機就與現代意義上的計算機很接近了,也是真正意義上的馮諾依曼體系(ENIAC事實上並不符合嚴格的馮諾依曼體系,因為它沒有專門的存儲裝置,只有計算中必要的暫存器。)

(此計算機就沒有ENIAC那麼龐大誇張了,因為已經用到半導體元件了。)

由於EDVAC的指令都是預先存好在內存(那時候應該還沒有外存),所以人們把程序與數據全都用有二進位「碼」的磁帶輸入,輸出裝置則是一個示波器(或者磁帶記錄儀也有記錄輸出數據的功能?這方面資料不全,求人賜教。)——這就是「用二進位碼編程」的直觀由來。

PS

很多人對編程的理解或印象,都是直接從C、C++、Java、python等個人電腦端的高級語言來的。

但其實,只有了解彙編語言,或了解C51之類語言是怎麼給單片機編程的人,才真正明白CPU到底是怎麼回事,以及具體到實際電路是怎麼個原理。遠不是高級語言的思維。

所以,我就不再多講了。連本行里都有一半兒的人拎不清,更別說外行。

PPS

數學爆發,是發生在明末清初的法國。

兩三百年後的清末民國,是電磁學爆發。

三年內戰抗美援朝十年文革,是計算機爆發。

幾次技術革命,我們全在亂世。現在,我們終於在和平年代,趕上互聯網。

眼下知識尚未再次壟斷,理應藉助互聯網,發展起來——這句話不是說國家,而是說個人。

我佛慈悲。



說到第一個,第一個高級程序是低級程序寫出來的,第一個低級程序是彙編語言寫出來的,第一個彙編是用機器碼人工敲出來的。第一個機器碼的實現是人在紙上設計出來的。第一個人是吃小蘋果的還是泥巴捏的東西方有爭議,但那個「東西」一定是最棒的程序員,因為他用一種叫DNA的語言,寫一個原型出來,這個原型會自動開發下一個原型來試圖修復自己的bug,雖然偶爾會引入新bug,但這個程序居然自己變得越來越健壯了

----------------------

補充:其實原本只是寫了一個叫cell的demo,被自發的fork出了很多不同版本。其中一個重量級的叫人。這個版本的出現導致了許多其他版本的消亡。因為對象生成太多隨時還有溢出風險。

神級程序猿為了控制人程序,用一個小眾語言RNA寫了個優化大師(其實是virus),偶爾清清系統。

再補充一些面向對象實現細節:人程序里有M和W兩個類,W對象的YD方法偶爾會調用M對象的YJ方法,返回若干億的DNA代碼型數組。最終W對象的ZG函數從中隨機抽取1個,和自己產生的1個DNA代碼值運算一下作為種子,返回一個新對象。

有些M找不到對象,會用Hand方法調用YJ,然而幾億數組的返回值都被丟棄了...

另:忽然想起來之前好像看到個專欄和我想法差不多:

上帝是個程序員 - oilbeater 的自習室 - 知乎專欄


第一個程序到Office應用可是差了個十萬八千里了。不過要淺顯地給你解釋一個簡單點的程序也容易,例如【把大象關冰箱】。

我們都知道這隻需要三步:

1)開-&>冰箱

2)放-&>大象

3)關-&>冰箱

到了【電】腦里當然就只能通過【電】解決了!電啊!非常簡單,不就是個【有電】跟【沒電】啊!

先數數我們上面的程序涉及到的動作和對象:

一共是:【開】【關】【放】【大象】【冰箱】共5個。

因此,我們的第一個電腦的輸入設備就只有5根線也就是5個輸入端:

將上面的程序輸入進去就很容易了吧:

1)

2)

3)

我們的第一個程序在第一台簡易電腦上就完成了,至於輸入,我沒記錯的話較早時候程序是通過紙帶輸入的,那麼我們做這麼個紙帶就能輸入進去了:

【延伸一下】

讀過一點計算機基礎的應該就能意識到了,計算機本質就是這樣的,只不過在現代計算機里程序就是存儲在磁碟中的電信號。規定【有電為1】【沒電為0】,則我們的程序在現代計算機里就存成這樣了:

1)10001

2)00110

3)01001

【再延伸一下】

某位大師說過程序就是由【指令】和【數據】構成的,如果注意看我上面的圖第3和4條線相隔較遠,這其實就是指令和數據分離了。因此我們的程序又可以進化成這樣了:

1)100 01

2)001 10

3)010 01

【最後一下延伸】

上面的形式已經非常可怕了,分別給前面的操作命個名字不就是現代【彙編語言】的由來嗎?彙編都讓我們延伸出來了,C、C++、Java還遠嗎?

結合為什麼現在會有這麼多種編程語言? - 知乎用戶的回答中 @濤吳的回答可以進一步精進。


通斷生01,

01生彙編,

彙編生萬物


等同搭積木,利用元器件的開-關,電壓高-低等組成一些邏輯指令,這就成了程序。

舉個例子,如果你有100盞不同顏色的燈,不同的開關就可以開關不同顏色的燈,咱們覺得很麻煩,有人就想到把這些線路都放到一個盒子里,然後做個鍵盤,100個按鈕分別控制一個燈的開關,這就類似低級語言的代碼(例如彙編)。

彙編語言大概感覺如下:

但還是覺得麻煩,於是把一些特定顏色的燈泡組成的圖形組成一個信號,通過另一個鍵盤和盒子封裝控制,這樣可能只需要30個按鈕來控制,但卻足以制定出上千種不同圖形滿足不同需求,這就類似高級語言。

例如C語言的感覺:

這樣慢慢產生了一行代碼可能就搞定了一個窗口創建或是一個問題解法的時代(例如python語言),早期編程可能還需要考慮各種開燈細節和電路細節,但隨著發展,作為編程者的人們更多需要考慮的就是如何使得完成燈泡開關的速度更快,耗費的電費更少,完成的功能更多,打開的效果更炫酷。

在計算機的整體發展上,初期只不過是把這些燈泡開關換成了邏輯線路,甚至機械(差分機)上的數值計算問題,再到完善的電路控制,然後逐步縮小模塊到一個晶元甚至納米材料上,並滲入到各行各業。

以現在製作軟體的思路,按照容易理解的順序簡單解釋一下office等軟體的製作過程(沒按照軟體工程的順序):

1.整理邏輯框架(要如何向用戶展現,點擊一個按鈕要出現什麼)

2.美工設計(小到每個按鈕的圖形設計,停靠欄,菜單的設計)

3.拼接圖形與具體實現,每個小組負責一個模塊亦或是分模塊編寫(寫代碼)

4.測試運行

這個地方有個回答說得很好:

http://www.zhihu.com/question/20003204/answer/91506383

要是再細分的話,上面四個過程各屬一個子行業,說不完了。

當然早期的時候都是一起寫,只是類似於office這種大項目考慮的因素遠遠不是三五個人所能及的。


最開始不是紙帶么。。。


節選自 劉慈欣 著《三體》

17. 三體、牛頓、馮·諾依曼、秦始皇、三日連珠


「所以,偉大的皇帝,您的帝國還要發展!」馮·諾伊曼不失時機地說,「如果掌握了太陽運行的規律,你就能充分利用每一個恆紀元,同時避免亂紀元帶來的損失,這樣發展速度比西洋要快得多。請你相信我們,我們是學者,只要能用三定律和微積分準確預測太陽的運行,不在乎誰征服統治世界。」

「朕當然需要預測太陽的運行,但你們讓我集結三千萬大軍,至少要首先向朕演示一下這種計算如何進行吧。」

「陛下,請給我三個士兵,我將為您演示。」馮·諾伊曼興奮起來。

「三個?只要三個嗎?朕可以輕易給你三千個。」秦始皇用不信任的目光掃視看著馮·諾伊曼。

「偉大的陛下,您剛才提到東方人在科學思維上的缺陷,就是因為你們沒有意識到,複雜的宇宙萬物其實是由最簡單的單元構成的。我只要三個,陛下。」

秦始皇揮手召來了三名士兵,他們都很年輕,與秦國的其他士兵一樣,一舉一動像聽從命令的機器。

「我不知道你們的名字,」馮·諾伊曼拍拍前兩個士兵的肩,「你們兩個負責信號輸入,就叫『入1』、『入2』吧。」他又指指最後一名士兵,「你,負責信號輸出。就叫『出』吧,」他伸手撥動三名士兵,「這樣,站成一個三角形,出是頂端,入1和入2是底邊。」

「哼,你讓他們成楔形攻擊隊形不就行了?」秦始皇輕蔑地看著馮·諾伊曼。牛頓不知從什麼地方掏出六面小旗。三白三黑,馮·諾伊曼接過來分給三名士兵,每人一白一黑,說:「白色代表0,黑色代表1。好,現在聽我說,出,你轉身看著入1和入2,如果他們都舉黑旗,你就舉黑旗,其他的情況你都舉白旗,這種情況有三種:入l白,入2黑;入l黑,入2白;入1、入2都是白。」

「我覺得你應該換種顏色,白旗代表投降。」秦始皇說。

興奮中的馮·諾伊曼沒有理睬皇帝,對三名士兵大聲命令:「現在開始運行!入1入2,你們每人隨意舉旗,好,舉!好,再舉!舉!」

入1和入2同時舉了三次旗,第一次是黑黑,第二次是白黑,第三次是黑白。出都進行了正確反應,分別舉起了一次黑和兩次白。

「很好,運行正確,陛下,您的士兵很聰明!」

「這事兒傻瓜都會,你能告訴聯,他們在幹什麼嗎?」秦始皇一臉困惑地問。

「這三個人組成了一個計算系統的部件,是門部件的一種,叫『與門』。」馮·諾伊曼說完停了一會兒,好讓皇帝理解。

秦始皇面無表情地說:「朕是夠鬱悶的,好,繼續。」

馮·諾伊曼轉向排成三角陣的三名士兵:「我們構建下一個部件。你,出,只要看到入1和入2中有一個人舉黑旗,你就舉黑旗,這種情況有三種組合——黑黑、白黑、黑白,剩下的一種情況——白白,你就舉白旗。明白了嗎?好孩子,你真聰明,門部件的正確運行你是關鍵,好好乾,皇帝會獎賞你的!下面開始運行:舉!好,再舉!再舉!好極了,運行正常,陛下,這個門部件叫或門。」

然後,馮·諾伊曼又用三名士兵構建了與非門、或非門、異或門、同或門和三態門,最後只用兩名士兵構建了最簡單的非門,出總是舉與入顏色相反的旗。

馮·諾伊曼對皇帝鞠躬說:「現在,陛下,所有的門部件都已演示完畢,這很簡單不是嗎?任何三名士兵經過一小時的訓練就可以掌握。」

「他們不需要學更多的東西了嗎?」秦始皇問。

「不需要,我們組建一千萬個這樣的門部件,再將這些部件組合成一個系統,這個系統就能進行我們所需要的運算,解出那些預測太陽運行的微分方程。這個系統,我們把它叫做……嗯,叫做……」

「計算機。」汪淼說。

「啊——好!」馮·諾伊曼對汪淼豎起一根指頭,「計算機,這個名字好,整個系統實際上就是一部龐大的機器,是有史以來最複雜的機器!」

遊戲時間加快。三個月過去了。

秦始皇、牛頓、馮,諾伊曼和汪淼站在金字塔頂部的平台上,這個平台與汪淼和墨子相遇時的很相似,架設著大量的天文觀測儀器,其中有一部分是歐洲近代的設備。在他們下方,三千萬秦國軍隊宏偉的方陣鋪展在大地上,這是一個邊長六公里的正方形。在初升的太陽下,方陣凝固了似的紋絲不動,彷彿一張由三千萬個兵馬俑構成的巨毯,但飛翔的鳥群誤入這巨毯上空時,立刻感到了下方濃重的殺氣,鳥群頓時大亂,驚慌混亂地散開或繞行汪淼在心裡算了算,如果全人類站成這樣一個方陣,面積也不過是上海浦東大小,比起它表現的力量,這方陣更顯示了文明的脆弱。

「陛下,您的軍隊真是舉世無雙,這麼短的時間,就完成了如此複雜的訓練。」馮·諾伊曼對秦始皇讚歎道。

「雖然整體上複雜,但每個士兵要做的很簡單,比起以前為粉碎馬其頓方陣進行的訓練來,這算不了什麼。」秦始皇按著長劍劍柄說。

「上帝也保佑,連著兩個這樣長的恆紀元。」牛頓說。

「即使是亂紀元,朕的軍隊也照樣訓練,以後,他們也會在亂紀元完成你們的計算。」秦始皇驕傲地掃視著方陣說。

「那麼,請陛下發出您偉大的號令吧!」馮·諾伊曼用激動得發顫的聲音說。

秦始皇點點頭,一名衛士奔跑過來,握住皇帝的劍柄向後退了幾步,抽出了那柄皇帝本人無法抽出的青銅長劍。然後上前跪下將劍呈給皇帝,秦始皇對著長空揚起長劍,高聲喊道:

「成計算機隊列!」

金字塔四角的四尊青銅大鼎同時轟地燃燒起來,站滿了金字塔面向方陣一面坡牆的士兵用宏大的合唱將始皇帝的號令傳誦下去:

「成計算機隊列——」

下面的大地上,方陣均勻的色彩開始出現擾動,複雜精細的迴路結構浮現出來,並漸漸充滿了整個方陣,十分鐘後,大地上出現了一塊三十六平方公里的計算機主板。

馮·諾伊曼指著下方巨大的人列迴路開始介紹:「陛下,我們把這台計算機命名為『秦一號』。請看,那裡,中心部分,是CPU,是計算機的核心計算元件。由您最精銳的五個軍團構成,對照這張圖您可以看到裡面的加法器、寄存器、堆棧存貯器;外圍整齊的部分是內存,構建這部分時我們發現人手不夠,好在這部分每個單元的動作最簡單,就訓練每個士兵拿多種顏色的旗幟,組合起來後,一個人就能同時完成最初二十個人的操作,這就使內存容量達到了運行『秦1.0』操作系統的最低要求;你再看那條貫穿整個陣列的通道,還有那些在通道上待命的輕轉兵,那是BUS,系統匯流排,負責在整個系統間傳遞信息。」

「匯流排結構是個偉大的發明,新的插件,最大可由十個軍團構成,能夠快捷地掛接到匯流排上運行,這使得『秦一號』的硬體擴展和升級十分便利;再看最遠處那一邊,可能要用望遠鏡才能看清,那是外存,我們又用了哥白尼起的名字,叫它『硬碟』,那是由三百萬名文化程度較高的人構成,您上次坑儒時把他們留下是對了,他們每個人手中都有一個記錄本和筆,負責記錄運算結果,當然,他們最大的工作量還是作為虛擬內存,存貯中間運算結果,運算速度的瓶頸就在他們那裡。這兒,離我們最近的地方,是顯示陣列,能顯示計算機運行的主要狀態參數。」

馮·諾伊曼和牛頓搬來一個一人多高的大紙卷,在秦始皇面前展開來,當紙卷展到盡頭時,汪淼一陣頭皮發緊,但他想像中的匕首並沒有出現,面前只有一張寫滿符號的大紙,那些符號都是蠅頭大小,密密麻麻,看上去與下面的計算機陣列一樣令人頭暈目眩。

「陛下,這是就我們開發的『秦1.0』版操作系統,計算軟體將在它上面運行。陛下您看——」馮·諾伊曼指指下面的人列計算機,「這陣列是硬體,而這張紙上寫的是軟體,硬體和軟體,就如同琴和樂譜的關係。」說著他和牛頓又展開了一張同樣大小的紙,「陛下,這就是數值法解那一組微分方程的軟體,將天文觀測得到的三個太陽在某一時間斷面的運動矢量輸入,它的運行就能為我們預測以後任一時刻太陽的運行狀態。我們這次計算,將對以後兩年太陽的運行做出完整預測,每組預測值的時間間隔為一百二十小時。」

秦始皇點點頭:「那就開始吧。」

馮·諾伊曼雙手過頂,莊嚴地喊道:「奉聖上御旨,計算機啟動!系統自檢!」

在金字塔的中部,一排旗手用旗語發出指令,一時間,下面大地上三千萬人構成的巨型主板彷彿液化了,充滿了細密的粼粼波光,那是幾千萬面小旗在揮動。在靠近金字塔底部的顯示陣列中,一條由無數面綠色大旗構成的進度條在延伸著,標示著自檢的進度。十分鐘後,進度條走到了頭。

「自檢完成!引導程序運行!操作系統載入!!」

下面,貫穿人列計算機的系統匯流排上的輕轉兵快速運動起來,匯流排立刻變成了一條湍急的河流。這河流沿途又分成無數條細小的支流,滲入到各個模塊陣列之中。很快,黑白旗的漣漪演化成洶湧的浪潮,激蕩在整塊主板上。中央的CPU區激蕩最為劇烈,像一片燃燒的火藥。突然,彷彿火藥燃盡,CPU區的擾動漸漸平靜下來,最後竟完全靜止了,以它為圓心,這靜止向各個方向飛快擴散開來,像快速封凍的海面,最後整塊主板大部分靜止了,其間只有一些零星的死循環在以不變的節奏沒有生氣地閃動著,顯示陣列中出現了閃動的紅色。

「系統鎖死!」一名信號官高喊。故障原因很快查清,是CPU狀態寄存器中的一個門電路運行出錯。

「系統重新熱啟動!」馮·諾伊曼胸有成竹地命令道。

「慢!」牛頓揮手制止了信號官,轉身一臉陰毒地對秦始皇說,「陛下,為了系統的穩定運行,對故障率較高的部件應該採取一些維修措施。」

秦始皇拄著長劍說:「更換出錯部件,組成那個部件的所有兵卒,斬!以後故障照此辦理。」

馮·諾伊曼厭惡地看了牛頓一眼,看著一組利劍出鞘的騎兵衝進主板,「維修」了故障部件後,重新發布了熱啟動命令。這次啟動十分順利,二十分鐘後,三體世界的馮·諾伊曼結構人列計算機在「秦1.0」操作系統下進入運行狀態。

「啟動太陽軌道計算軟體『ThreeBody 1.0』!」牛頓聲嘶力竭地發令,「啟動計算主控!載入差分模塊!載入有限元模塊!載入譜方法模塊……調入初始條件參數!計算啟動!!」

主板上波光粼粼,顯示陣列上的各色標誌此起彼伏地閃動,人列計算機開始了漫長的計算。

「真是很有意思。」秦始皇手指壯觀的計算機說,「每個人如此簡單的行為,竟產生了如此複雜的大東西!歐洲人罵朕獨裁暴政,扼殺了社會的創造力,其實在嚴格紀律約束下的大量的人,合為一個整體後也能產生偉大的智慧。」

「偉大的始皇帝,這是機器的機械運行,不是智慧。這些普通卑賤的人都是一個個0,只有在最前面加上您這樣一個1,他們的整體才有意義。」牛頓帶著奉承的微笑說。

「噁心的哲學。」馮·諾伊曼瞥了牛頓一眼說,「如果到時候,按你的理論和數學模型計算出的結果與預測不符,你我可就連零都不是了。」

「對,那時你們可真的什麼都不是了!」秦始皇說著,拂袖而去。

時光飛逝,人列計算機運行了一年零四個月,除去程序的調試時間,實際計算時間約一年兩個月,這期間,只因亂紀元過分惡劣的氣候中斷過兩次,但計算機存貯了中斷現場數據,都成功地從斷點恢復了運行。當秦始皇和歐洲學者們再次登上金字塔頂部時,第一階段的計算已經完成,這批結果數據,精確地描述了以後兩年太陽運行的軌道狀況。

這是一個寒冷的黎明,徹夜照耀著巨大主板的無數火炬已經熄滅,計算機完成後,「秦1.0」進入待機狀態,主板表面洶湧的浪濤變成了平靜的微波。


  • 將程序「固化」成電路的連接方式,和將程序用打孔紙帶塞進去,區別很小。
  • 打孔紙帶和硬碟、鍵盤、滑鼠的區別也很小。


(以下全部為憑記憶手打,如有筆誤或史實型錯誤,歡迎提出)

1.17世紀以來,數學發展得越來越快,實際應用得也越來越多。

(例如航海,需要準確的對數表,但當時對數是由人工計算的,所以就會帶來錯誤,而在航海中的錯誤,是很嚴重的。人們迫切需要準確的、最好是快速的計算方式。注:computer最早的意思就是計算員。)

2.19世紀出了一個天才,巴貝奇,一個博學多才的人。早期是劍橋被授予盧卡斯數學教授席位,在他的一百多年之前處於這個位置的人是牛頓。

他熱愛機械,因此他想發明一台機器來進行數學計算。之後差分機就誕生了,一台純機械的計算機器,動力來自蒸汽機而不是電機,通過轉輪完成數的輸入和輸出。

進而他設想發明一台機器,名為分析機,希望這台機器能完成數學計算和邏輯分析。他的一名異性好友Ada對此也很有興趣,開始分析這台設想中的機器並為其編程,但不幸的是分析機並未製造完成,Ada也因病早逝。(注:Ada很不簡單,她是世界上第一位程序員,是一位伯爵夫人,是一位美女,是一位天才數學家,也是詩人拜倫的女兒。為紀念Ada,美國軍方有一種編程語言名為Ada。)

3.隨著電氣革命,電燈得到了廣泛的使用,也因此在眾多工程師和科學家的摸索中,電子管誕生了。

4.即使能源由蒸汽變為了電力,但人們對於計算機器的需求從未減退。

上世紀三十年代末,圖靈被任命去參與破譯恩格尼碼,在8號小組,圖靈讓數學家和邏輯學家代替語言學家去完成破譯工作,同時也建造了一台電子破解密碼的機器。期間圖靈漸漸完善了「圖靈機」的構想。

在同一時代,1938年,香農發表了一篇論文,開始用繼電器去進行0和1的布爾運算。

(有趣的是,在當時圖靈和香農也有過幾次會面,期間有討論也有爭論。他們當時並不知道對方都在幹嘛,圖靈在破譯德軍的密碼,香農在進行羅斯福和丘吉爾之間電話線路的保密工作,這些都是機密中的機密;他們也不知道,他們二人的貢獻會對後來的世界有著怎樣天翻地覆的影響。)

5.1948年,貝爾實驗室搞了兩個大新聞:肖克利發明晶體管;香農的《資訊理論》問世。我們離想像中的、可用的計算機又進了一步。

6.上世紀五十年代後,馮諾依曼體系計算機不斷完善,計算機工作起來井然有序:有的部分儲存數據,有的部分儲存程序,有的部分進行運算,等等等等...

7.之後就是 @靈劍 說的了,機器碼操作起來困難,就有了彙編;彙編寫起來沒有效率,不易debug,就有了高級語言。當然這都犧牲了運行速度,但是從工程角度來看,這是很值得的。畢竟摩爾定律在那呢,近五十年來硬體提升的很快很快。


上帝說:要有光。於是,便有了光。

給外行人就解釋到這個程度就挺好的,充分體現了程序設計思維,提供介面,隱藏細節,實現可替換,amazing!


在漫長的演化過程中,計算機中的一些無機文件碎片在碎片整理的條件下生成了簡單的有機文件匯聚在了硬碟里。

經過漫長的時間,這些有機文件逐漸演化出了原始細胞程序。

然後漫長的進化中,逐漸變成了office程序


電腦在第一個程序之後也沒有「智能」的。電腦就是一條指令接一條指令去執行程序的,很傻的。執行一個程序不需要「理解」程序在做什麼。


可以認為第一個程序是用電路搭建出來的

嗯……所以你要學習數字電子電路么?


可以參考小說《三體》中對「人列計算機」的描寫。

佔個坑,晚上回來填。


電腦運行程序也就更人用算盤算賬差不多。電腦運算有CPU,內存,硬碟。人用算盤有人(相當於CPU),算盤(相當於內存),賬本(相當於硬碟)。只不過電腦是用電驅動的。


首先,世間萬物本質上是數學運算(不能運算的就用個table直接存下來)。然後,計算機硬體有運算組件。最後,我們將一切轉換成數學運算。


可以讀讀編碼的奧秘這本書。

想像一下剛開始一根電線 一塊電池 一個燈泡 一個開關 連接起來,一開一關燈泡亮暗就代表了最簡單的0和1, 無數個門電路組合在一起就能進行更複雜的表示。隨著科技進步 這些東西越來越小,集成度越來越高,當然本質還是開和關。


樓上有說的了 就是編碼 和發電報用的那個編碼是一樣的人~

編碼不是一個新名詞 程序也不是一個新名詞~

因為計算機利用電來自動存儲和運算信息~ 很多人只是因為不了解一些電學知識所以才會感覺到很神奇的~

你想想算盤是不是可以算算數,作用是不是和計算機一樣~


推薦閱讀:

卡內基梅隆大學(CMU)的Eric Xing(邢波)教授為什麼能讀完一般學校的分子生物學PhD後到伯克利去CS PhD?
VBA怎麼入門吖? 昨天看到一個入門文章 很不錯 但是想問問有木有更好的辦法
GCC/G++、ICC、Clang、MSVC、BCC等C/C++編譯器有什麼特長和不足?
疑犯追蹤第五季第一集的疑犯追蹤中,為什麼是使用ps3來搭建大型計算機?

TAG:軟體 | 計算機 | 計算機技術 | 計算機科學 | 計算機語言 |