Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Forth in Node

Zoom.Quiet
September 03, 2013

Forth in Node

[符式協會:4759] Node.js hosts umbilical FORTH

Zoom.Quiet

September 03, 2013
Tweet

More Decks by Zoom.Quiet

Other Decks in Programming

Transcript

  1. 臍帶式開發環境 • 整個開發環境分成 Host 端和 Target 端 • 開發工具在 Host

    端。 • 透過通訊功能以及簡單的幾個指令,開發、測 試並執行 Target 端上的軟體。 • 經典:A 3-INSTRUCTION FORTH http://utoh. org/3ins4th.html • 只需要三個指令:XC@, XC!, XCALL • Host 和 Target 端都是 FORTH 系統
  2. 舊愛:FORTH,1984 • 裝置端,很適合用於控制設備 • 2-Stack Virtual machine • Operating system

    • Scripting language • Cooperative multitasking • Asynchrounous programming • 於被用於 Open firmware (Mac), Actionscript • 一個人就可以理解、掌握
  3. 新歡:Javascript, Node.js, 2013 • 雲端 • Asynchronous programming • 目前受

    Google, Microsoft, Oracle 支持 • 內建於 Google Drive, Window 8, Java 8 • 從網頁端下凡至伺服端的仙女:Node.js • 延續下凡的趨勢:愛死拼腦(Espruino), Javascript for Things
  4. 步驟一:產生 jxForth 映象 • 撰寫 core.f,這是一個 FORTH 程式。 • 以

    PEG.js 對 core.f 進行語法解析後,產生 core.S 以及 words.json 檔。 • 以 gcc 編譯及連結 main.c 及 core.S,得到 jxForth 映象。
  5. PEG.js • Parsing expression gramma • 2004 by Bryan Ford

    • Parsed in linear time • 不需要 tokenization step • Cannot be ambiguous • 最大的優勢:語言支援(C,C++,Java, Javascript, Python,Ruby,Lua,...) • 很適合用來開發領域語言(DSL)
  6. 建立臍帶式開發環境 1. 使用 objdump -t 及 words.json 建立 Target的 字典。

    2. 以 <指令位址> x 方式要求 Target 執行指令。 3. Target 回傳的字串中,以 <host></host> 標記 的部份是下給 host 執行的指令。 4. 指令 sync。 5. 指令 dp!。
  7. Host 和 Target 同步 • 事件:words.ready • 事件:sync • 當發生事件

    words.ready 後,代表字典備妥, node.js 可以開使進入 repl。 (read-eval-print- loop) • 每執行一行(使用者按 Enter),將此行解譯送 給 target ,要求 target 於完成後執行 sync,等 待 sync 事件。 • 當發生 sync 事件時,再執行一次 repl。
  8. Line Editor • REPL 迴圈需要一個 line editor。 • Node.js 的

    readline 不好用。 • Line Editor 是什麼? • var editor = new EventEmitter(); • Editor 將標準輸入設為 Raw mode,並且監聽 input 的 data 事件,以便讀取每個按鍵。 • Editor 會發出 ^C, ^D, backspace, enter 事 件。 • Editor 監聽自己的 ^C,^D,backspace,enter 事 件,並執行預設的行為。
  9. VT100 • 使用以下三個 VT100 的 control sequence。 • var vt100_backward

    = '\x1B[D'; • var vt100_erase_end_of_line = '\x1B[K'; • var bell = '\x07';