使用者:Arnie97/HP Saturn Intro
此用戶頁面尚未完工。原作者將會繼續進行編寫,而您也可以對該條目進行編輯。
本條目介紹的是 HP Apple 39gs 等 Saturn 系列計算器的基礎知識。
Saturn
Saturn 是 HP 於上世紀 80 年代為其計算器開發的一種 4 位微處理器,該處理器有 Bert、Sacajawea、Lewis、Clarke、Yorke、New-Yorke 等子系列。[1]
Apple(Saturn+)系列
在 Saturn 處理器停產後,為了保持與 Saturn 平台原有程序的兼容性,HP 推出了一系列在 ARM 處理器上運行 Saturn 模擬器的計算器,與上面的那些子系列相對,軟件模擬的 Saturn 處理器被稱為 Apple 系列。這些模擬處理器相比之前真實的 Saturn 處理器擁有更多的功能,因此也被稱作 Saturn+。 Apple 系列推出後,39、49 系列的圖形計算器均發布了多款對應的新型號:
| 系列 | 原型號(Yorke 系列處理器) | 新型號(Apple 系列模擬處理器) |
|---|---|---|
| 39 | 39g 40g | 39g+ 39gs 40gs |
| 49 | 49g | 48gII 49g+ 50g |
這些新型號的系統軟件與相對應的原有型號非常相近,只不過系統是運行在模擬器內,而不是運行在真實的 Saturn 處理器上。因此,很多相關的術語保留了下來。
值得注意的是,名為「HP ??gII」的計算器(「?」代指數字)往往與同編號的其他產品大相徑庭,切勿混淆。例如,HP 48gII 不屬於 HP 48 系列,而屬於 HP 49 系列;而 HP 39gII 則不屬於 Saturn 系列產品,而與後期推出的 HP Prime 有幾分相近。
系統架構概述
Saturn 匯編語言
無論是原有 Saturn 系列還是 Apple 系列,由於使用了或真或假的 Saturn 處理器,顯然都可以直接使用 Saturn 匯編語言編寫程序。
Saturn 匯編常與編譯型語言 System RPL 共同使用,相關內容詳見下文,在此不再贅述。
RPN
RPN(Reverse Polish Notation,逆波蘭表示法)將運算符置於操作數的後面,因此又稱後綴表示法。與之相對的是絕大多數語言採用的代數表示法(Algebraic Notation,運算符位於操作數之間,又稱中綴表示法)和 Lisp 等語言採用的波蘭表示法(運算符位於操作數之前,又稱前綴表示法)。
| 表達式記法 | 運算符位置 | 示例 | 採用該記法的語言 |
|---|---|---|---|
| 波蘭表示法 | 前綴 | * - 3 4 5 | Scheme,Common Lisp 等 |
| 代數表示法 | 中綴 | (3 - 4) * 5 | C++,Python,TI-Lua,HP Basic 等 |
| 逆波蘭表示法 | 後綴 | 3 4 - 5 * | Forth,System RPL 等 |
逆波蘭表達式的解釋器一般是基於棧(Stack)這一數據結構的。要理解 RPN,最好先理解棧的概念。 RPN 解釋求值的過程一般是:遇到操作數時入棧;遇到運算符時,取對應數量的操作數出棧,求值,將結果入棧;最終棧頂就是表達式的值。
例如,常規中綴記法的 12 * (3 + 4) - 6 + 8 / 2 用 RPN 寫作 12 3 4 + * 6 - 8 2 / +,其運算過程如下:
- 首先,12、3、4 依次入棧。
- 輸入加號時,由於它是二元運算符,會彈出棧頂的兩個數進行運算,並將結果 7 壓入棧中。
- 乘法同樣是二元運算,彈出棧頂的 12 和 7 兩個數,並將結果 84 返回棧頂。
- 隨後,數字 6 入棧。
- 之後是減法,取出棧頂的 84 和 6,並返回結果 78。
- 隨後,8 和 2 入棧。
- 之後是除法,取出棧頂的 8 和 2,並將結果 4 壓入棧中。
- 最後取出 4 和 78 做加法,得到最終結果 82。
RPN 的運算符之間不存在優先級的高低,不需要使用括號來表明運算的優先級,因此能減少輸入部分複雜表達式時按鍵的次數。
例如,常規中綴記法中 3 - 4 * 5 與 (3 - 4) * 5 的意義不相同,需要用括號加以區分;但後綴記法中前者寫做 3 4 5 * - ,後者則寫做 3 4 - 5 * 。
System RPL
System RPL(其中 RPL 指 Reverse Polish Lisp)是 HP 計算器上廣泛使用的一種編譯型語言。顧名思義,該語言中的語句採用逆波蘭表示法。
HP 38、39(40)、48、49(50)等系列的圖形計算器均支持該語言[2],且大部分系統軟件和很多第三方軟件由該語言寫就。HP 38、39(40)、49(50)等新系列計算器的很多第三方應用來源於對 HP 48 等早期系列中 System RPL 應用的移植和重新編譯。
作為一種貼近底層的編譯型系統編程語言,System RPL 常與 Saturn 匯編共同使用,這與 PC 平台上的 C 語言和 x86 匯編語言有着相通之處。這兩種語言可以用 PC 上的 HP Tools 開發。此外,HP 49、50 等系列的計算器內置了 MASD,可以直接在計算器上進行編譯、匯編、調試操作。注意 HP Tools 和 MASD 均是編譯器本身,並不包含頭文件(Entry Points,或簡稱 Entries),如果不希望手動聲明系統提供的函數,需要自行下載頭文件,其中的原理與 C 語言是相通的。HP 28、38、39(40)、48、49(50)系列的頭文件互不相同,下載時需根據所針對的機型正確選擇。
Library
Aplet
User RPL
User RPL 是 HP RPN 計算器上的一種解釋型語言。顧名思義,該語言同樣採用逆波蘭表示法。
HP 28、48、49(50)等系列的計算器支持該語言代碼的運行。如果在設置中選擇 RPN 輸入模式,那麼用戶在計算界面中輸入的有效指令實際上均可以視為合法的 User RPL 代碼。
與 System RPL 的關係
User RPL 的語法和 System RPL 相近,但代碼可以直接在計算器上運行而不需要編譯。運行時發生的大部分錯誤會被正確捕獲,且部分較為危險的底層命令無法直接使用。這些特性使得 User RPL 的編寫和調試更方便和安全,但也使它的運行速度較 System RPL 緩慢,在需要對系統底層進行操控及性能因素至關重要的場合(如某些遊戲)應當選擇 System RPL。
User RPL 能通過多種方式調用 System RPL 特有的函數,相關內容併入下文 HP Basic 的相關章節,在此不再贅述。
在 HP 49(50)系列計算器內置的文件管理器(Filer)中,User RPL 代碼的文件類型為 PROG,System RPL 源碼的類型為普通字符串 STRNG,而 System RPL 編譯出的二進制對象類型為 CODE。
HP Basic
HP Basic 是 HP 38、39(40)系列計算器的解釋型語言,其定位與 HP 48、49(50)系列中的 User RPL 相似——用戶在 HOME 界面中輸入的有效指令均為合法的 HP Basic 代碼。由於該語言的代碼通過解釋器執行,且解釋器本身又運行在 Saturn 處理器或模擬器上,因此速度是本文提及的所有語言中最慢的。
調用 System RPL
HPGCC
ARM Toolbox
Aplet 框架
內存布局與固件
數據類型與聯機傳輸
數據對象的內部表示(變量)
數據在內存中以不同的方式(數據結構)儲存着。這些數據結構當中有順序的(例如線性表的數組形式),也有非順序的(例如線性表的鍊表形式)。
數據對象的外部表示(文件)
為了將數據,尤其是非順序的數據:
- 保存於外存(硬盤、光盤、閃存等)的某個文件中以備後用
- 通過網絡等方式共享給另一台計算機
- 通過串口等方式傳送至圖形計算器等設備
我們需要將數據編碼為字符串(字節流)方能儲存或傳輸,這一編碼過程稱為序列化(Serialization)。
變量的類型系統:靜態類型與動態類型
變量是代指數據的名稱、符號。
- 在 C++、Java 等語言中,每個變量均對應一個特定的數據類型,使用前必須聲明每個變量的數據類型,這樣的類型系統稱為靜態類型。
- 在 Haskell 等語言中,雖然很多情況下不需手動聲明變量的數據類型,而是通過計算機的自動推導來確定數據類型,但每個變量均有特定的類型——類似 C++ 11 中使用
auto的情形——因此同樣屬於靜態類型。 - 在 Python、JavaScript 等語言中,類型依附於變量中儲存的數據本身,數據有類型而變量無類型,這樣的類型系統稱為動態類型。
文件的類型系統:擴展名與特徵簽名
類比變量,文件名(和路徑)是代指文件的符號。對於文件來說,同樣有數種不同的方式來記錄它的類型,其中就包括:
- 文件名稱的某個特定部分指示一個文件的類型——通常是最後一個小數點後的部分,也就是擴展名(Extension)。
- 文件內容的某個特定部分,即特徵簽名(File Signature)指示一個文件的類型——通常是最前面的部分,也就是頭部(Header)。
擴展名最早在 CP/M 操作系統中被採用,而後又隨一脈相承的 DOS 和 Windows 得到了推廣;特徵簽名則在 Unix 中被廣泛應用,而後又被 Linux 等操作系統所繼承下來。由於兩類操作系統均得到了廣泛的應用,現實中兩種方式常常共存:
| 文件類型 | 擴展名 | 特徵簽名[3] |
|---|---|---|
| MZ 可執行文件
PE 可執行文件 |
com exe
exe dll sys ocx cpl scr 等 |
MZ(設計者 Mark Zbikowski)
(為向下兼容 DOS,PE 文件頭部與之相同) |
| ELF 可執行文件 | 無 | \x7F E L F
|
| PDF 文檔 | %PDF
| |
| ZIP 壓縮文件 | zip docx pptx xlsx 等 | PK(設計者 Phil Katz)
|
| RAR 壓縮文件 | rar | Rar!
|
| CAB 壓縮文件 | cab | MSCF(Microsoft Cabinet File)
|
| PNG 圖片 | png | \x89 P N G
|
| GIF 圖片 | gif | GIF89a 或 GIF87a
|
| JPEG 圖片 | jpg jpeg | 以 \xFF \xD8開始,\xFF \xD9 結束
|
| Midi 音軌 | midi | MThd(MIDI Track header)
|
| Java 字節碼 | class | \xCA \xFE \xBA \xBE,即十六進制 CAFEBABE
|
從上面的例子中可以看出,既有一個擴展名對應多種特徵簽名的情況(如 GIF 文件),也有多種擴展名對應單一特徵簽名的情況(如 PE 文件)。當擴展名和特徵簽名共存時,有時會結合兩種因素來決定文件如何解析,更多時候則只選擇其中的主要因素來判斷文件的類型。例如,將 JPEG 圖片的擴展名更改為 png 仍能用多數圖片查看器正常打開,說明這些軟件僅通過文件內容中的特徵簽名來判斷文件的格式,擴展名無關緊要。同樣,HP Saturn 系列計算器也僅判定文件的特徵簽名,而擴展名的作用只是輔助人類的辨識。
HP Saturn 系列的對象類型(內部表示)
表面上看,HP 39(40)、48、49(50)的文件格式互不相同,PC 上的官方聯機工具(Connectivity Kit)也形式各異。但是,多項證據已經表明,不同系列的 Saturn 機種使用相同的方式來儲存 RAM 中的對象。
我們可以通過下面的實驗來驗證這一結論:用含有 HP 48gII 固件的 ROM 替換 HP 39gs 原有的閃存,期間保持電源供給,以免 RAM 中的數據丟失。那麼,當進入 49 系列的系統後,我們將看到之前在 39 系列系統中儲存的所有文件(和文件夾)。鑑於 39 系列系統中並未提供完整的文件管理器,如果想探查 39 系列計算器的目錄結構,除了選擇 39 系統中不完整的文件管理器或自己編寫文件管理器外,亦可利用這一特性,藉助 49 系列內置的文件管理器來達到目的。
綜上所述,不同系列間文件格式的差異,本質上是相同對象類型的不同序列化形式,傳入計算器後的生成的對象是相同的,可謂「換湯不換藥」。
HP Saturn 系列的文件類型(外部表示)
| 文件類型 | 常見擴展名 | 特徵簽名 |
|---|---|---|
| HP 39(40)系列 | 000 apt lib 等 | HP39Asc?(文本,ASCII)
|
| HP 48 系列 | 不固定 | HPHP48-?
|
| HP 49(50)系列 | hp lib 等 | HPHP49-?
|
上表中,? 代指表示文件類型的一個大寫拉丁字母;同一字母在不同系列中有着不同的意義,詳見下文各章節。另外,由於擴展名並無實質性作用,用戶可根據自己的喜好和實際情況選擇不同的擴展名——例如,為了方便用記事本打開,可以用 txt 作為擴展名;[4]為了方便用戶區分不同機種的文件,跨平台應用的開發者有時直接用 48、49 等作為擴展名。[5]