[CA] 計算機的抽象化與科技

計算機的抽象化與科技 1.1 簡介 有賴於科技高速的成長,計算機工業出現了嶄新的型態,計算機導致了文明的第三次革命-資訊革命,與農業革命和工業革命並駕齊驅。如科幻電影般的生活應用,也如雨後出筍般的出現。 汽車 手機 人類基因組計劃(Human genome project) 全球網路(World Wide Web) 搜尋引擎 計算機的應用分類與其特性 個人電腦(Personal Computer, PCs) 伺服器(Servers) 通過網路連接其它的工作站或電腦,通常面向單一且複雜大型的科學或工程應用,也可能是多而小的工作。 成本和功能的差異性也最廣,可以是沒有螢幕沒有鍵盤的桌電,也可以是如超級計算機(supercomputers)這樣的極端。 嵌入式計算機(Embedded Computers) 最大的計算機類別,也涵蓋最廣泛的應用和性能。 通常具有獨特的應用要求,這些要求將最低效能發揮的淋漓盡致,使成本與功耗成為很重要的指標。 後PC時代 個人行動裝置(Poersonal Mobile Device, PMD) 如智慧型手機與平板的出現,取代的 PC 的地位。 雲端計算(Cloud Computing) 取代了傳統伺服器,這些雲端計算建構在「倉庫規模計算機」(Warehouse Scale Computer, WSC)。 企業如Google、Amazon,提供了 WSC 的租借服務,這類通過雲端佈署的「軟體即服務」(Software as a Service, SaaS),正在改變軟體業。 學習目標 過去在硬體的限制下,程式設計師需要嚴格的考慮程式的效能:減少記憶體空間以使程式更快。 在計算機設計與記憶體科技的進步下,取而代之程式設計師要考量的事情變成:處理器的並行性和記憶體的分層,或諸如在 PMD 或雲端上運行的程式的能源效率問題。 以下是我們將要學習的目標: 用高級語言編寫的程式如何翻譯成硬體語言,以及硬體如何執行生成的程式?藉此可以理解硬體與軟體的關係,也與程式的性能有關聯。 軟體和硬體間的介面是什麼,軟體如何指示硬體執行所需的工作?這些概念對於理解如何編寫多種軟體至關重要。 什麼決定了一個程式的性能,程式設計師如何提高性能?這關係了源始碼編譯成電腦的語言時,硬體執行程式的效率。 硬體設計人員可以使用哪些技術來提高性能(Performance)? 硬體設計人員可以使用哪些技術來提升能源效率(Energy Efficiency)?程式設計師又如何協助改善? 什麼理由導致了循序處理(Sequential processing)轉變成了平行處理(Parallel processing)? 自第一台商用計算機問世以來,計算機架構師提出了哪些想法來奠定現代計算的基礎? 1.2 計結中八個重要的思想 摩爾定律(Moore’s Law)之於設計 摩爾定律源於 Intel 創辦人之一的 Gordon Moore 對 IC 容量增長的預測。 由於計算機設計需耗時數年,而晶片的成長使得計算機架構師在設計時,必須將眼光放到設計完成時的技術狀態,而非當下。 用抽象化(Abstraction)來簡化設計 程式設計師與計算機架構師都必須要不斷發明新的技術以面對日益更新的科技, 抽象化是一種分層設計的概念。對程式設計師而言,低階的細節被忽略,只需要遵從簡單的模型或規範去進行設計。而硬體工程師則是要去實現出這個定義好的模型的硬體、細節部分。 快速處理常見情況 將常使用的指令進行優化(common case fast),比起其它不常使用的指令,更能提升效能。 何者為最常使用的指令,必須透過嚴密的實驗與測量才以得知。 平行處理(parallelism) Pipeline 預測 某些情況下,將硬體的效能預測的高一點,好過於等到效能滿足才開始設計。 記憶體的結構化(hierarchy) 透過將記憶體分層,將最快、最小、最昂貴的部分置於層狀結構的頂層;而最慢、最大、最便宜的記憶體置於層狀結構的底層。 用多餘創造可靠性(dependability) 計算機不只要速度快,還要具有可靠性。任何物理設備都可能發生故障,此時可以透過引入冗餘的元件來使系統變的更可靠,這些冗餘的元件可以在發生故障時接管工作並協助檢測故障。 1.3 抽象化 ...

<span title='2022-03-24 01:12:11 +0800 +0800'>March 24, 2022</span>&nbsp;·&nbsp;4 min&nbsp;·&nbsp;Rain Hu
Oh! You closed up the window, so you cannot see raining

[CS50] Lec 1 - C

C 當我們要去評價程式碼的品質時,我們會考慮以下元素: 正確性(correctness): 程式碼是否有正確的解決我們的問題 設計(design): 程式碼的好壞決定於它的效率與可讀性 風格(style): 程式碼在視覺上是否有良好的format 我們的第一個 C 語言程式: #include <stdio.h> int main(void) { printf("hello, world\n"); } 整合開發環境、編譯器、介面 IDEs, compilers, interfaces 在執行程式前,我們必須將程式碼轉變成電腦可讀的 binary codes,也就是 0 與 1。 IDE(integrated development environments) 可以協助我們開發、編譯程式碼。如Visual Studio Code 我們撰寫的程式碼為開源碼(source code),我們必須將他轉變成機器碼(machine code),才能被電腦執行。 編譯器(compiler)是將一種語言轉變成另一種語言的程式,例如將開源碼編譯成機器碼。 在 IDE 中,我們可以在一個叫作 terminal 的視窗中輸入指令。 terminal 提供了 command-line interface(CLI) 當我們輸入 make hello,會產生一個叫作 hello 的檔案,我們可以透過輸入 ./hello 執行它。 . 代表當下的目錄,上面的指令代表我們要執行當下目錄中叫作 hello 的檔案。 hello 即是內含機器碼的檔案。 欲刪除檔案可以用 rm 指令。 輸入 ls 列出當下目錄所包含的檔案。 若源碼檔經過修過,則必須重新編譯,才能對執行檔進行修改。 函式、引數、傳回值、變數 Functions, Arguments, Return Values, Variables printf("Hello, world"); 此處,介紹一個叫作 printf 的函數 f 代表 formatted 的字串。字串是多個字元(characters)組成的字詞,在 C 中,我們需要用雙引號("")來包住它。 括號 () 使我們可以輸入引數,也就是 printf 函數的 input。 最後,我們需要分號 ;,來宣告述句的結束。 其中,函式的一種產物叫作 side effect,也就是我們可以觀察到的變化,如螢幕印出字樣,或是發出聲響。 相比與 **side effects,我們也可以將函式的回傳值用於程式中,回傳值通被儲存於變數中。 string answer = get_string("What's your name? "); 此處,示範 CS50 IDE 中的一個函數。 這裡的 get_string為函式,而What's your name? 為引數。 然後,我們可以將回傳值存入到變數中,以上例,我們可利用賦值運算子(=)將右值(r_value)傳給左值(l_value)的answer。 最後,我們宣告變數的變數型別(type)。 如果我們嘗試將上述的變數改為其他變數型別,編譯器會顯示錯誤。 printf("Hello, world\n"); 我們此處為了換行,而使用了 escape sequence \n。

<span title='2022-03-10 02:39:12 +0800 +0800'>March 10, 2022</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;Rain Hu