計算機科學基礎_3

早期的編程方式

  • 程序如何進入計算機
  • 打孔紙卡 Punched card
  • 插線板 Plugboard
  • 馮諾依曼架構 Von Neumann Architecture
  • 面板編程 Panel programming
  • 商業成功的計算機:Altair 8800

早期計算機如何編程?
打孔紙卡 -> 插線板 -> 面板拔開關。

計算機的原理:

  • 怎麼從內存讀寫數據,執行操作。比如把兩個數字加在一起。
  • 簡單描述了指令的執行,也就是計算機程序。

程序如何“進入”計算機:
程序需要加載進內存,是計算機科學。(打孔紙卡,插線板,面板拔開關)

打孔紙卡 Punched card

需求:
給機器編程,早在計算機出現之前就有了,著名的就是紡織業。
如果只想一塊紅色大桌布,可以直接放紅線進織布機,但是如果想要圖案怎麼辦?比如條紋或方格。
需要沒隔一會,調整一次織布機,因爲非常消耗勞動力,所以圖案紡織品很貴。

可編程紡織機:
每一行的圖案由可穿孔紙卡決定,特定位置有沒有穿孔,決定了線是高是低。
橫線是從上/從下穿過,爲了讓每行圖案不同,紙片連成長條,形成連續指令。

clipboard.png

很多人認爲雅卡爾織布機是最早的編程。

事實證明,穿孔紙卡便宜,可靠,也易懂。
後面世代中,穿孔紙卡用於1890年美國人口普查。
例如:一張卡存一個人的信息,比如種族,婚姻狀況,子女數量,出生國家等等。針對每個問題,人口普查工作者會在對應位置打孔,當卡片插入彙總機,孔會讓對應總和值+1,可以插入整個國家入口的卡片,在結束後得到各個總值。
但是,早期的彙總機不算計算機。因爲它們只做一件事:彙總數據。操作是固定的,不能編程。穿孔 紙卡存的是數據,不是程序。之後,這些機器被加強,可以做減,乘,除。甚至可以做一些小決定,決定何時執行某指令。

插線板 Plugboard

爲了正確執行不同計算,程序員需要某種控制面板,面板有很多小插孔,程序員可以插電線,讓機器的不同部分,互相傳數據和信號。因此也叫“插線板”。
但是,這意味着,運行不同程序要重新接線。所以到了1920年代,控制面板變成了可拔插。讓編程更方便,可以給機器插入不同程序。比如,一個插線板算銷售稅,另一個算工資單。但給插線板編程很複雜。
用插線板編程,不只在機電計算機流行,世上第一臺通用電子計算機,ENIAC,完成於1946年。用了一大堆插線板。

程序在紙上設計好之後,給ENIAC連線,最多可能花三個星期。因爲早期計算機非常昂貴,停機幾個星期只爲了換程序,完全無法接受,急需要更快,更靈活的新方式來編程。

clipboard.png

幸運的是,到1940年代晚期1950年代初。內存變得可行,價格下降,容量上升。與其把程序存在插線板,存在內存變得可行,這樣易於修改,方便CPU快速讀取。這類機器叫“存儲程序計算機”。

馮諾依曼架構

如果內存足夠,不僅可以存要運行的數據,還可以存程序需要的數據。包括程序運行時產生的新數據。
程序和數據都存在一個地方,叫“馮諾依曼結構”。將指令和數據混合存放到內存,穿孔紙片和插線板,都是分開。

馮諾依曼曾過:我在思考比炸彈重要得多的東西計算機。

馮諾依曼計算機的標誌是,一個處理器(有算術邏輯單元)+ 數據寄存器 + 指令寄存器 + 指令地址寄存器 + 內存(負責存數據和指令)。

第一臺馮諾依曼架構的“存儲程序計算機”,由曼徹斯特大學於1948年建造完成,綽號“寶寶”。

clipboard.png

雖然有內存很棒,但程序和數據,依然需要某種方式輸入計算機,所以用穿孔紙卡。

到1980年代,幾乎所有的計算機都有穿孔紙卡讀取器,可以吸入一張卡片,把卡片內容寫進內存,如果放了一疊卡片,讀取器會一個個寫進內存。一旦程序和數據寫入完畢,電腦會開始執行。即便簡單程序也有幾百條指令,要用一疊紙卡來存。

用紙卡的最大型程序是美國空軍的SAGE防空系統,於1955年完成,據稱頂峯時期,僱傭了世上20%程序員。

主控制程序用了62500張穿孔紙片,等同於大約5MB的數據。穿孔紙卡不僅可以往計算機放數據,還可以取出數據,程序運行到最後,結果可以輸到紙卡上,方式是打孔。然後人可以分析結果,或者再次放進計算機,做進一步計算。

穿孔紙卡的親戚是紙帶,基本是一回事,只不過更連續,不是一張張卡。

現在存儲的方式,硬盤,只讀光盤,DVD,U盤等等。

面板編程 Panel programming

與其插一堆線到插線板,可以用一大堆開關和按鈕,做到一樣的效果。面板上有指示燈,代表各種函數的狀態和內存中的值。

clipboard.png

50和60年代的計算機,一般都有這樣巨大的控制檯。很少有人只用開關來輸入一整個程序,但技術上是可行的,早期針對計算機愛好者的家用計算機,大量使用了開關。因爲大多數家庭用戶負擔不起昂貴的外圍設備,比如穿孔紙卡讀取器。

第一款取得商業成功的家用計算機是Altair 8800
有兩種版本可以買:

  1. 預先裝好的整機
  2. 需要組裝的組件

clipboard.png

爲了給8800編程,要撥動面板上的開關。輸入二進制操作碼,然後按“存儲鍵”把值存入內存。
然後會到下一次內存位置,可以再次撥開關,寫下一個指令,重複這樣操作。(初代plc 原型)

把整個程序都寫入內存之後,可以推動開關,回到內存地址0,然後按運行按鈕,燈會閃爍。

不管是插線板,開關或穿孔紙卡。早期編程都是專家活,不管是全職還是技術控,都要非常瞭解底層硬件。比如 操作碼,寄存器等,才能寫程序。所以編程很難,很煩。
哪怕工程師和科學家都無法完全發揮計算機的能力,需要一種更簡單方式,告訴計算機要做什麼。一種更簡單的編程方式。

編程語言的發展史

編程:二進制 -> 助記符(彙編器) -> A-0(編譯器) -> FORTRAIN

  • 二進制寫程序,先紙上寫僞代碼,手工轉二進制。
  • 用“助記符”寫代碼(LOAD 14)爲了把助記符轉二進制,彙編器誕生(Assembler)
  • 哈佛1號計算機首批程序員,海軍官員。(葛麗絲●霍普Grace Hopper)
  • Grace 設計了編程語言A-0
  • Grace 1952年做了第一個編譯器(Compiler),實現A-0
  • 變量(Variables)
  • FORTRAIN
  • COBOL
  • 新語言
    1960年代:ALGOL, LISP, BASIC
    1970年代:Pascal C, Smalltalk
    1980年代:C++, Object-C, Perl
    1990年代:Python, Ruby, Java

組成計算機的物理組件:
比如電路寄存器RAM, ALU, CPU

clipboard.png

在硬件層面編程非常麻煩,所以程序員想要一種更通用的方法編程。
一種“更軟的”媒介: 軟件。

第一條指令在內存地址0: 0010 1110。前4位操作碼,簡稱OPCODE
對於這個假設CPU,0010代表LOAD A指令:把值從內存複製到寄存器A。
後4位是內存地址,1110是十進制的14。
所以這8位表達的意思是:讀內存地址14,放到寄存器A。

只是用了兩種不同語言,可以想成是英語和摩爾斯碼的區別。
hello” -> “.... . .-.. .-.. ---”是一個意思:“hello

只是編碼方式不同,英語和摩爾斯碼的複雜度也不同,英語有26個字母以及各種發音。摩爾斯碼只有“點”和“線”但它們可以傳達相同的信息,計算機語言也類似。

計算機能處理二進制,二進制是處理器的“母語”。事實上,它們只能理解二進制。這叫“機器語言”或“機器碼”。

二進制寫程序

在計算機早期階段,必須用機器碼寫程序。
具體來講,會先在紙上寫一個“高層次版”的僞代碼(PSEUDO-CODE)。
例如:從內存取下一個銷售額,然後加到天,周,年的總和,然後算稅。

寫好僞代碼後,用“操作碼錶”把僞代碼轉成二進制機器碼,翻譯完成後,程序可以喂入計算機並運行。

助記符

在1940~1950年代,程序員開發出一種新語言,更可讀,更高層次。
每個操作碼分配一個簡單名字,叫“助記符”(MNEMONICS)。
“助記符”後面緊跟數據,形成完整指令。與其用1和0寫代碼,程序員可以寫“LOAD A 14”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章