1. 程式人生 > >世界上第一個程式是如何寫出來並讓它按規定執行?

世界上第一個程式是如何寫出來並讓它按規定執行?

 

  所以說,指令的實質作用就是把人工佈線的操作給抽象出來,用0、1的電子訊號來控制電晶體的狀態,進而控制電路的通斷,從而選擇出處理器中我們需要的功能單元,來完成指令的任務。因此,我覺得儲存程式的最大好處就是,把人手工佈線的過程也給自動化了,通過電訊號控制的方式自動實現了佈線,於是實現了計算機完全自動化的完成不同的任務,只需預先儲存好相應的指令序列就行了。因為只要有人蔘與的步驟都快不了多少,總有個度,所以這種創新極大的提升了計算的效率。

    還有,這些指令中,最重要的創新就是邏輯判斷指令(不是邏輯運算),即所謂的控制類指令,能對資訊進行比較和判斷,並能根據判斷的結果自動選擇要執行的下一條指令。我覺得以前的計算工具都有進行運算的能力,而從沒有想過要擁有邏輯判斷能力。而根據圖靈的圖靈機理論,擁有邏輯判斷功能的計算機才能模擬圖靈機的全部功能,也才可以實現任意計算。我覺得對於使用沒有邏輯判斷能力的計算工具,都是由我們人類來執行這個邏輯判斷的工作的,即我們自己根據執行的狀態來選擇接下來的處理方法。所以說,即使實現了儲存程式,但是如果指令集缺少邏輯判斷指令,也會大大限制了計算機能自動完成的計算過程。因此,只有具備了邏輯判斷指令的計算機才是真正的通用計算機,才能在沒有人類參與的情況下自動完成任意計算。也正因為沒有人類參與,才得以讓計算機的計算速度快得突破天際!

    好了,從此之後,我們有了能根據程式來自動執行任意計算的工具。於是,程式設計師們就在軟體領域大做文章,創造出豐富多彩的軟體世界,他們有的專注於建造軟體世界的基礎設施,有的則喜歡建造直接面向用戶的應用程式。總之,通過他們的通力合作,軟體世界得以蓬勃發展,不斷的賦予計算機新的能力,於是計算機替我們完成了越來越多的任務,從而改變了我們每個人的生活!

 

靈劍

靈劍

微博一般不上 http://weibo.com/hubo1016

409 人贊同了該回答

一堆土怎麼蓋出高樓大廈的?其實是一個道理,兩個字,工程。
完成一項大的工作,有三個步驟:

  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位,從文字模式到圖形模式,從真實模式到保護模式,我們的工具每天都在進步,但我們做的事情其實與幾十年前沒有多大區別。就像是搭積木,我們每個人都學會了怎麼搭上自己的一塊,最終我們搭出了龐然大物,但這其實並沒有什麼可稀奇的。

釋出於 2016-11-01

409​28 條評論 

​分享

 ​收藏​取消感謝 

 收起

Garvey

Garvey

借題發揮

578 人贊同了該回答

世界上第一臺機械計算機,出現於崇禎十五年,清崇德七年,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
數學爆發,是發生在明末清初的法國。
兩三百年後的清末民國,是電磁學爆發。
三年內戰抗美援朝十年文革,是計算機爆發。
幾次技術革命,我們全在亂世。現在,我們終於在和平年代,趕上網際網路。
眼下知識尚未再次壟斷,理應藉助網際網路,發展起來——這句話不是說國家,而是說個人。









我佛慈悲。

編輯於 2016-11-11

578​85 條評論 

​分享

 ​收藏​感謝 

 收起