陳鍾誠

Version 1.0

問題 – 系統程式

  1. 組合語言是如何轉換成機器碼的?
    • A 指令怎麼轉?
    • C 指令怎麼轉?
    • 假指令是甚麼? 怎麼轉成機器碼?
    • 真實機器 (例如 x86, RISC-V, ARM 的組合語言和機器碼和 nand2tetris 有何不同?)
  2. 要怎樣才能寫一個組譯器?
    • 為何要分成兩階段?
  3. 甚麼是 BNF/EBNF ?
  4. 如何描述高階語言的語法?
  5. 高階語言是如何轉換成組合語言的?
    • 為何要經過中間碼?
  6. 如何將高階語言轉換成一系列平舖直述的指令 ? (或轉換成組合語言)
    • 如何拆掉迴圈
    • 如何將有迴圈的 C 語言轉成沒有迴圈的?
    • 如何將函數呼叫轉成組合語言?
    • 如何支援遞迴?
  7. 高階語言轉成甚麼樣的組合語言效能才會好?
    • 甚麼是編譯器的 optimization ?
    • 有哪些 optimization 的技巧? 這些技巧的效用如何?
    • 大部分的程式都能有效的 optimization 嗎? 有沒有那些程式寫法無法 (或很難) 被編譯器優化?
  8. 作業系統是甚麼?到底作業系統應該支援甚麼樣的功能?
    • 我們寫程式有用到作業系統嗎? 舉個例子 …
    • 沒有作業系統我們能寫程式嗎? 該怎麼寫,舉個例子 …
  9. 虛擬機是甚麼?
    • 虛擬機應該支援甚麼指令集?
    • 虛擬機應該支援甚麼功能?
    • 甚麼是堆疊機?記憶體機?暫存器機?
    • 不同的虛擬機架構有甚麼優缺點?
  10. 虛擬機的作法會影響速度嗎?
    • 甚麼樣的虛擬機會很慢? 甚麼樣的虛擬機才會執行得快?
    • pcode 是甚麼?
    • 為何 Java 要定義中間碼的 byte code,那是一個甚麼樣的虛擬機? 他和 Android 的虛擬機有何不同?
    • VMware, VirtualBox 是甚麼樣的虛擬機?
    • Docker 又是甚麼樣的虛擬機?為何 docker 可以用原生機 99.2% 的速度執行?
    • K8s 又是甚麼樣的虛擬機?