Skip to content

Commit

Permalink
Update whitepaper.
Browse files Browse the repository at this point in the history
  • Loading branch information
ShikiSuen committed Feb 4, 2025
1 parent 35dd911 commit dc60b15
Showing 1 changed file with 19 additions and 9 deletions.
28 changes: 19 additions & 9 deletions TechnicalWhitePaper.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
sort: 2
---
# 技術白皮書 (v3.8.1)
# 技術白皮書 (v3.9.0)

> 註:本文提到的 SessionCtl 是 IMKInputController 的派生型別、在小麥注音當中被稱為「InputMethodController」。此前,該型別在威注音當中曾一度被命名為「ctlInputMethod」。自威注音 2.7.5 版開始,ctlInputMethod (ctlIME) 被更名為 SessionCtl,意為「會話控制器」。
Expand All @@ -13,6 +13,8 @@ sort: 2

然後就是到了 2022 年八月初,威注音實現了 IMK 矩陣選字窗的支援。之後,威注音緊接著開始將輸入法本體的所有「直接從上游繼承來的 Swift 模組」全部淘汰,且用 SwiftUI 完成了威注音自家的全新的田所選字窗:這套選字窗同時實現了(類似 IMK 選字窗的)橫排矩陣佈局與(類似微軟新注音的)縱排矩陣佈局。

然後是 2025 年 1 月,威注音輸入法的 Megrez 組字引擎放棄使用 Lukhnos Liu 的基於 DAG-Relax 組字算法的組字方法,轉而使用經過效能最佳化的 Dijkstra 算法。這套新的組字方法實作在效能上比小麥注音更優。

這篇技術白皮書主要是為了讓部分使用者明白小麥注音與威注音至少有哪些技術上與產品功能上的不同。

P.S.: IMK 選字窗一度受威注音支援,但因為其利用方式太複雜不利於威注音輸入法長遠發展的原因、而在威注音 3.5.4 版內遭到了移除。
Expand All @@ -21,25 +23,25 @@ P.S.: IMK 選字窗一度受威注音支援,但因為其利用方式太複雜

### 系統支援與資訊安全

差異項 | 小麥注音 (2.5) | 威注音 (3.8.1) | 補記
差異項 | 小麥注音 (2.5) | 威注音 (3.9.0) | 補記
-- | -- | -- | --
支援作業系統範圍 | macOS 10.13 起算 | 主流發行版 macOS 13 起算<br />Aqua 紀念版 macOS 10.9 起算 | macOS 10.9 是 Swift 5 能支援的最早的系統版本。
強化型組字區安全防護 | 無 | 有(強烈推薦使用) | 會有 App 或網站提前獲取內文組字區的內容給遠端伺服器、來遠端預判使用者的下一步操作。威注音的這個模式會以浮動組字窗取代內文組字區,使得接收文字輸入的客體軟體再也無法擅自利用組字區的內容來觸發使用者不想觸發的事件。您也可以藉由「客體管理器」僅對部分客體 App 啟用這種限制。
支援作業系統範圍 | macOS 10.13 起算 | 主流發行版 macOS 13 起算<br />Aqua 紀念版 macOS 10.9 起算 | macOS 10.9 是 Swift 5.9 能支援的最早的系統版本。Swift 6 開始將不再支援 macOS 10.9 等任何需要 libArcLite 的系統版本
強化型組字區安全防護 | 無 | 有(強烈推薦使用) | 會有 App 或網站提前獲取內文組字區的內容給遠端伺服器、來遠端預判使用者的下一步操作。威注音的這個模式會以浮動組字窗取代內文組字區,使得接收文字輸入的客體軟體再也無法擅自利用組字區的內容來觸發使用者不想觸發的事件。您也可以藉由「客體管理器」僅對部分客體 App 啟用這種限制。<br /><br />這個功能所啟用的浮動組字窗也可以變相解決在某些對 InputMethodKit 內文組字區支援不佳的軟體內的文字輸入體驗問題(比如 ChatGPT 的 macOS 桌面端)。
Sandboxing 沙箱 | 無 | 有 |  沙箱是最好的謠言粉碎機。
允許設定在就地加詞之後自動執行指定腳本 | 允許,且腳本位址存於 UserDefaults Plist 當中 | 不允許 | 一兩道 Defaults write 指令就可以讓小麥注音在每次加詞時自動執行有害腳本。更甚者,小麥注音沒有 Sandbox 設計、無法控制這種情況下的被害目錄範圍。
讀取網路資料 | 僅在新版軟體檢查時才會聯網,且該功能自動啟用、會在安裝完畢後首次執行時主動聯網 | 僅在新版軟體檢查時才會聯網,需使用者手動啟用新版軟體檢查之功能 |  
將本地資料上傳 | 無 | 無 | 威注音另有與此有關的 Sandbox 行為約束。

### 基礎大模組與處理單元

差異項 | 小麥注音 (2.6) | 威注音 (3.8.1) | 補記
差異項 | 小麥注音 (2.6) | 威注音 (3.9.0) | 補記
-- | -- | -- | --
CIN 模組 | 不具備 | 支援 CIN2 標準 | 小麥注音團隊另有 OpenVanilla 輸入法專門使用 CIN 表格工作。 |
內碼輸入 | 具備 | 具備 | 兩者各自對此的實現方式不同;<br />威注音在簡體模式下有支援 GB 內碼輸入。
輸入調度模組 | KeyHandler (Objective-C++) | InputHandler (Swift) | 職能很相似 
按鍵訊號承載單位 | KeyHandlerInput | NSEvent及其私有功能拓展<br />以及其對等克隆體 KBEvent Struct | 威注音利用 NSEvent / KBEvent 的 characters ignoring modifiers 參數塞入狀態上下文情境描述用中繼資料
組字引擎 | Gramambular 2 (C++)<br />by Lukhnos Liu | Megrez (Swift)<br />採用與 Gramambular 2 相同的頂點爬軌算法 | Megrez 新增了很多功能擴展,包括對就地加詞功能要用到的標記游標的管理,等
注音並擊引擎 | OVMandarin (C++)<br />by Lukhnos Liu | Tekkon (Swift)<br />支援更多注音排列與拼音種類 | 均無允許使用者自行設計注音排列之能力 
按鍵訊號承載單位 | KeyHandlerInput | NSEvent及其私有功能拓展<br />以及其對等克隆體 KBEvent Struct | 威注音利用 NSEvent / KBEvent 的 characters ignoring modifiers 參數塞入狀態上下文情境描述用中繼資料
組字引擎 | Gramambular 2 (C++)<br />by Lukhnos Liu<br />採 DAG-Relax 組字算法。 | Megrez (Swift)<br />by Shiki Suen<br />採 Dijkstra 算法。 | Megrez 新增了很多功能擴展,包括對就地加詞功能要用到的標記游標的管理,等。Megrez 對 Dijkstra 算法的實作方式有針對老電腦的 CPU 做過特殊的效能最佳化、擁有更快的組字效率。
注音並擊引擎 | OVMandarin (C++)<br />by Lukhnos Liu | Tekkon (Swift)<br />支援更多注音排列與拼音種類 | 均無允許使用者自行設計注音排列之能力 
詞庫管理模組 | Objective-C++ & C++<br />ParselessLM<br />採 TXT 格式的原廠辭典 | Swift<br />採 SQLite 格式的原廠辭典<br />使用者辭典採 txt 格式 |
態械引擎 | 多型別狀態策略設計模式<br />無專有內部資料型別 | 單結構狀態策略設計模式<br />有專有內部資料型別 | 雙方的開發習慣不同、導致各自的取捨不同。

Expand All @@ -48,7 +50,7 @@ CIN 模組 | 不具備 | 支援 CIN2 標準 | 小麥注音團隊另有 OpenVanil
差異項 | 小麥注音 (2.6) | 威注音 (3.8.1) | 補記
-- | -- | -- | --
IMK 選字窗支援 | 無 | 無 | 雙方均在不同的年代曾經分別支援過 IMK 選字窗,但因技術維護方面的各自苦衷而先後放棄支援。
輸入法內建選字窗 | Voltaire MK2 (Swift Cocoa) | Tadokoro 田所選字窗(第三代) | 田所選字窗支援展頁等特性
輸入法內建選字窗 | Voltaire MK2 (Swift Cocoa) | Tadokoro 田所選字窗(第三代) | 田所選字窗支援展頁等特性,且完美重現了微軟新注音輸入法(2003 至今)與 macOS 內建注音輸入法(macOS 10.13)對候選字的陳列行為。
內建選字窗是否有支援矩陣佈局 | 否 | 橫排矩陣(類似 IMK)<br />縱排矩陣(類似新注音) | 田所選字窗出於介面繪製效能的考量,移除了原本要加入的選字窗內容捲動支援。
內建選字窗是否有專有內部資料型別 | 否 | 是 | 威注音的設計更易於維護
頁碼支援 | 否 | 否(Voltaire MK3 有支援過) | 田所選字窗另支援對當前選中的候選字的總索引編號顯示
Expand Down Expand Up @@ -132,6 +134,14 @@ Emacs Key | 在輸入調度模組內部處理 | 在水源入口處理:發現 E

## 個別詳細介紹

### 組字算法

小麥注音從 2.0 版開始由 Lukhnos Liu 更換了具備全新[DAG-Relax 組字算法](https://mcbopomofo.substack.com/p/dag)的 Gramambular 2 組字引擎。

截至 2024 年底,威注音輸入法也都有在用相同的組字方法。然而,2025 年 1 月底的海燈節更新的 3.9.0 版威注音輸入法的第三代 Megrez 組字引擎改用了全新的基於 Dijkstra 算法的組字方法,同時針對 Sandy Bridge 時代的老電腦做過效能最佳化。這樣一來,在組字組句的速度上,威注音更快。

Dijkstra 算法的實作難免需要一個專門用來排序的機器。Swift Foundation 原生的排序算法並非最高效的方案。所以,第三代 Megrez 組字引擎針對輸入法的使用情景重新訂製了這個排序過程、藉此縮短了 Dijkstra 的運算耗時。

### 田所選字窗

迄威注音 2.7.5 版為止,這個備選的選字窗都是自上游繼承過來的 Voltaire MK2 (Swift) 選字窗修改來的。威注音在此之上做了介面美工,加上頁碼顯示,變成 MK3 版:
Expand Down

0 comments on commit dc60b15

Please sign in to comment.