2010年10月2日 星期六

Forth VM

看了一篇文章,討論 Forth VM 的設計:Updating the Forth Virtual Machine。在傳統的 Forth VM 中有兩個堆疊一個記憶體。這樣的設計不容易執行 C 編譯出來的程式。也不適合用做 DSP 的 VM。為此,文章中提出了對 Forth VM 的修正,多提供了以下四個 registers 用來存取記憶體:A、B、X、Y。
  • A、B:有自動加減記憶體指標的功能,適用於 DSP,也可以用做 scratch register。
  • X、Y:能對記憶體定址,可以做為 local variable 或 user variable 的指標。
閱讀過此一文章後,比對我所知的 Forth VM 設計,還必須有 TOS、IP、W。這可就用去了七個 registers。仍小於 80x86 系列的 registers 數目 8 。

特別記錄下這文章,因為我考慮以 Forth 做為我某種應用的 VM。

2010年8月13日 星期五

jonesforth

又回到 Forth,繞了一圈,在某些應用領域這個古怪的語言仍遠勝其他的 scripting languages。

在找尋一個適合我未來使用的 Forth 時我發現了 jonesforth ,依照它的文件編譯成功,執行時 Linux 卻發出了 Killed 的異警。瞭解後原來某些版本的 Linux 不允許使用 text segment at zero。

以以下方式編譯後就不會有異警。

gcc -m32 -nostdlib -static -Wl,--build-id=none -o jonesforth jonesforth.S

2010年7月23日 星期五

Ringojs

有一段時間未寫部落格。但不表示這段時間什麼事都沒發生。

這段時間發生了很多事。

首先,在個人工作方面,已經確定要將 javascript 用於自己的產品中。最主要的工具是 YUI 3 和 RingoJS。

此外,在 javascript 世界也有很多值得注意的變化。由於我較重視 Server side,CommonJS 的風起雲湧以至最後的雲淡風清讓我感到一點憂心。早先,有志於 Server Side Javascript 的人們成立了 CommonJS 社群,建立 module 的架構,以及可以讓程式相容的 libraries。但在 NodeJS 出現後,NodeJS 瞬間抓出大家的眼光。以致於 CommonJS 的努力讓人們漸漸淡忘。

在這段時間,原本我極感興趣的 Helma-NG 改名為 RingoJS,採用了 CommonJS 的規範。現在它可以說是最符合 CommonJS 規範的 Server Side Javascript 平台了。比 Helma-NG 還讓我喜歡,也成了我工作上的選擇。雖然有點兒默默無聞,但它的撰寫者十多年來在 Server Side Javascript 上的堅持讓人信賴。最近,更因一篇「RingoJS vs. NodeJS」,它開始被更多的人注意。

身為 RingoJS 的愛用者,我自然也要加入這場戰局。因此,我將這篇「RingoJS vs. NodeJS」中 RingoJS 的優點翻譯於後,和我的讀者分享,在這翻譯中加上了我自己的修正。

  1. RingoJS 是最符合 CommonJS 規範的平台。此點勝過 NarwahlJS 及 NodeJS。
  2. RingoJS 的執行速度快。RingoJS在執行前會經過 JVM 的編譯,同時,RingoJS 的模組是動態載入的,這使得它的 start up time很短。
  3. RingoJS 成熟、穩定、不會當。這是我自己的使用經驗。我還沒遇過 RingoJS 當掉的情況。
  4. 直接使用成千上萬的 Java libraries。Ringo架構在 Rhino javascript 引擎之上,它和 Java 之間的關係真是血溶於水般,它可以直接使用 Java libraries 及物件,就好像它們是以 javascript 寫成的。不像 NodeJS 等,呼叫 C 時必須撰寫各種 wrappers。
  5. 程式可以在 Linux/Windows 下執行。跨平台呢。(當然也可以在目前正熱的 Android 上執行囉。)
  6. 支援同步(synchronous)及非同步(asynchronous)的程式撰寫風格。NodeJS紅的原因是它強調非同步撰寫風格。但是在絕大多數的場合,以同步風格撰寫最簡單。使用 Ringo,簡單的問題可以簡單解決,複雜的問題一樣能解決。
  7. 因為「AppengineJS」提供了大量可以在 Google App Engine 上使用的 libraries,RingoJS 很適合用來開發 Google App Engine 上的雲端運算程式。
  8. RingoJS 的 Leader 技術一流,又十分親切,願意傾聽使用者的建議。

2010年3月2日 星期二

Scala vs Javascript

在撰寫 javascript 程式時,我較不習慣的是它缺少靜態型別的檢查。一直希望有一種語言能結合動態型別和靜態型別語言的優點。因此最近看到 Scala 時我充滿興趣。

我花了一些時間瞭解 Scala 並撰寫了一些程式。這語言很容易上手。不過我遇到以下的瓶頸:
  1. Netbeans IDE 的 Scala plugin 還不成熟。
  2. Scala 並不是為 embedding 設計的。
  3. Scala 使用 Java classes 沒問題。但是 Java 使用 Scala 的 classes 會有些問題。
因此,我還是回到 rhino,以 javascript 為我的 scripting language。

2010年2月28日 星期日

Netbeans Top Ten APIs

這兒記錄了 Netbeans Top Ten APIs 的影片中的重點:

  1. Run time container由五個 APIs 構成:Bootstrap、Startup、Module System、File System、Utility。最小的 Netbeans platform application 只依賴這五個 APIs。
  2. Starup API 提供了 Main。
  3. Module System API : Module 可以有個 ModuleInstaller class 來管理 Module 的生命周期。
  4. Utility API:Utility API 中最重要的是 Lookup API。扮演 ServiceLoader 的角色。也使用 JDK 6.0 的 ServiceLoader 實現。Service Provider packages 在 src/META-INF/services Folder 中列出提供的 Services。
  5. Window System API:TopComponent 取代了 Swing 的 JFrame 的功能。Editor、View及Mode的概念。可使用 layer.xml 及相關的檔案來建造新的 Mode。在 project.properties 中可以以 run.args.extrac=--nosplash 來抑制 splash 畫面。可以在 Properties中的 Window System API 來限制使用者的對 Window 的操作。
  6. File System API:介紹了 layer.xml,以及 File System API 中的 Repository、FileUtil、FileObject。FileObject 包裝了 java.io.File,提供更強大的功能。FileObject 和 java.io.File 的轉換可由 File.Util 內的函式實現。Netbeans 提供許多 File Systems,例如 layer.xml 對應的 System File System,磁碟上的 File System,以及可以 FileUtil 建立的 memory file system。