Mobile Application Development (CCIT4059)
使用方法:依時間表逐節閱讀。每節有「核心概念 → 重點整理 → 易考點 → 自我檢測」。建議準備白紙邊看邊抄畫。
閱讀文章 →Mobile Application Development (CCIT4059)
涵蓋 Unit 1–10 全部內容。每題含 答案、詳細解答過程、對應單元、易錯提示。 > 建議:先自己作答,再對照解析。
閱讀文章 →Test 1 練習卷 A(Theroy1.pdf)
54 題目:給定主動低電位(active-low)R-S 閂鎖的波形(輸入為 S' 與 R'),求在標示時間點 a–d 時輸出 Q 的值。
閱讀文章 →第 1 題(2 變數):任一感測器觸發警報——A B
第二步:圈群——圈不起來!兩個 1 在對角線上: m_1 (01) 與 m_2 (10) 差了兩個位元, 在卡諾圖上不相鄰(相鄰的定義是恰差一位)。 只能各自圈成 1 格的群,一個變數都消不掉。
閱讀文章 →化簡(Simplification)
這 16 小題就是布林代數的「九九乘法表」——常數運算是 AND/OR 的定義本身, 含 A 的運算則對應四條基本定律。
閱讀文章 →布林代數(Boolean Algebra)
電腦內部的一切——數字、文字、圖片、程式——最終都被編碼成這兩種狀態的序列。 若要研究這些訊號如何被操作與轉換,我們需要一套數學工具: 布林代數(Boolean algebra)。
閱讀文章 →開工前:新骨架的兩個變更
三條指令生成的組語都圍繞同一個資料結構—— 呼叫框架(call frame)。題目明說: 「你應假設框架在堆疊上的存放順序與講義完全一致, 測試腳本才會通過。」先把這張地圖釘在牆上:
閱讀文章 →擴充 Hack VM(Extending Hack VM)
本週我們要擴充 Hack VM,加入: 我們也會討論執行期記憶體配置(即 malloc)。 下週就進入高階語言——Jack。
閱讀文章 →全局視角:編譯管線
Part 1(第 3–4 節)補完中間的解析器; Part 2(第 5 節)實作最後的碼產生。 兩趟之間的解析樹以 XML 檔存放——人類可讀(除錯友善)、 格式標準、可以邊讀邊處理而不必整棵樹載入記憶體。
閱讀文章 →Jack 語言(The Jack Language)
討論 Jack 時最常出現的兩句話: Jack 的每一個設計決策都圍繞一個目標: 讓學生能在一週內寫出它的編譯器。 語言的不便之處(稍後一一列出)全是刻意用 「程式設計師多打幾個字」換取「編譯器少寫幾百行」。
閱讀文章 →為什麼需要浮點數?
解法借自科學記號:6.02×10^23 用「有效數字」 (6.02)搭配「指數」(23)——小數點的位置變成一個 可調的欄位,讓小數點「浮動」(floating), 同一格式就能同時涵蓋巨大與微小的數。 代價是:有效位數固定,數字越大,相鄰可表示值的間距越大 (精度是「相對的」而非「絕對的」)。
閱讀文章 →半加器(Half Adder)與 4 位元增量器
逐欄觀察: 直覺:一位元加法 A + B 的結果最大是 1+1=2=10_2—— S 是結果的個位、C_out 是進位。
閱讀文章 →表示數字(Representing Numbers)
十進位(decimal)是日常使用的標準數字系統——恰好用了跟手指一樣多的數字! 十進位稱為基底 10(base 10),因為它使用 10 個不同的數字(0–9), 可用下標 10 標記,例如 123_10。
閱讀文章 →閂鎖到正反器(Latches to Flip-Flops)
原理:NAND 只要任一輸入為 0 就輸出 1。 S = 0 強迫 Q = 1,經交叉回饋使 Q = 0, 即使 S 放回 1,回饋會把狀態鎖住。
閱讀文章 →序向邏輯與 R-S 閂鎖(Sequential Logic and the R-S Latch)
到目前為止你看過的所有電路,輸出只取決於當下輸入的組合—— 不管發生過什麼事,1 1 永遠是 1。 這稱為組合邏輯(combinational / combinatorial logic)。 它依然非常有用——第二週做的 ALU,正是之後打造 CPU 時要用的那一顆。
閱讀文章 →電晶體(Transistors)
CMOS 的設計配方:每個閘 = 上拉網路 (p 型,接 V_dd,負責輸出 1)+下拉網路 (n 型,接 V_ss,負責輸出 0), 兩個網路互補——任何輸入組合下恰好一邊導通, 輸出永遠被明確驅動,且沒有從 V_dd 直通 V_ss 的漏電路徑。
閱讀文章 →用正反器與暫存器蓋東西(Building with Flip-Flops and Registers)
事情已經複雜到不能再用一顆顆 NAND 來思考了! 我們必須把東西抽象成元件(components)/子電路(subcircuits)—— 多工器、加法器、暫存器、邏輯閘;只有在 NAND 恰好是對的工具時才用 NAND。 而這些元件本身又會成為更大元件的一部分……直到蓋出整台電腦。
閱讀文章 →入門(Getting Started)
為什麼是 24 而不是 7?因為課堂的 add.asm 算的是 2 × RAM[0] + 6 × RAM[1] = 6 + 18 = 24……開個玩笑——真正的原因依課堂版本而定, 重點是:先讀程式再預測結果,執行只是驗證你的預測。 若載入的是 nand2tetris 官方的 Add.asm (計算 2+3 存入 R0)行為又不同—— 務必用課程 unit page 提供的版本。
閱讀文章 →輸入處理的缺失環節(checker3.asm)
對症下藥:位準觸發 vs. 邊緣觸發。 這正是課程第一部分(第三、四週)講過的對比: 輪詢按鍵時,我們常常不想在「鍵正被按著」 (位準)時觸發,而想在「自上次檢查以來鍵 被按下了」(邊緣)時觸發—— 一圈輪詢迴圈就類比一個時脈週期。 解法是第四週升緣偵測器的軟體版: 用變數 prev 記住「上一圈 c 是否按著」, 只有 現在按著 剛才按著 (升緣!)才翻轉:
閱讀文章 →擷取—執行週期與 Hack 架構(The Fetch-Execute Cycle)
課程前半部專注在硬體:你已在實驗課做出 Hack CPU 的各個元件 (暫存器、PC、ALU 等)。要理解 Hack 架構,我們必須開始思考軟體。 組合語言、機器碼與架構三者緊密綁在一起, 所以我們先學 Hack 組合語言,再往下鑽。之後的路線圖:
閱讀文章 →規格整理:我們要蓋什麼?
為什麼 RAM 用 15 位元位址(64KB)? 真正的 Hack 只有 32KB RAM(14 位元位址, 0x0000–0x3FFF),螢幕與鍵盤是 獨立的記憶體映射裝置(0x4000–0x6000)。 本課程是架構課不是硬體設計課,不直接模擬螢幕鍵盤—— 把 RAM 直接加大到 15 位元位址空間, 讓 0x4000–0x6000 這段位址落在 普通 RAM 裡:程式照常讀寫「螢幕」與「鍵盤」, 只是沒有真的畫面;想模擬按鍵就暫停
閱讀文章 →Hack 指令集架構(The Hack ISA)
類比:當你依照規格實作了一個 C 函式 (例如「mult(x,y) 應回傳 x × y」), 使用者不需要記得你怎麼寫的就能呼叫它; 你也可以改寫實作,只要仍回傳 x × y 就不會引入 bug。 同樣地,微架構「實作」ISA:寫組語時不需要知道 ISA 怎麼被實作, 而且你的程式碼在任何符合該 ISA 的硬體上都能正確運作。 例如 AMD 與 Intel 的現代 CPU 微架構天差地別, 卻普遍都實作 x86-64 這一個 ISA。
閱讀文章 →全局視角:兩趟式組譯器
為什麼標籤和變數要分開兩張表?因為它們的位址空間不同: 標籤住在 ROM(指令位址),變數住在 RAM (從 16 號開始配置)——同名時語意完全不同,混在一張表會出錯。
閱讀文章 →編譯器的全貌與詞法分析(Lexing)
我們已經懂了 Hack 組語與 Hack ISA,也會用組譯器把組語變成機器碼。 但組譯器本身是怎麼運作的? 本週的目標:用 C 打造一個自己的 Hack 組譯器! 在抽象階梯上,我們正在處理「組合語言 ISA」這一步的翻譯軟體 ——而它的原理與「高階語言 組語」的編譯器一脈相承。
閱讀文章 →