ECMA-262 Edition 4 Reference Implementation試用

 Mon, 11 Jun 2007 16:20:53 +0800

ECMA-262 Edition 4(Javascript 2.0)規格似乎正在緊鑼密鼓地開發中。今天偶爾翻到一個新聞,就是ECMAScript組織剛發佈了一個用standard ml開發的Reference Implementation,可以讓我們試用es4的功能。馬上就去下載了:

ECMAScript Group的網站:http://www.ecmascript-lang.org(沒有打直接下載的連結,因為還有一些操作跟說明:))

接下來就來試試看。

仔細看了一下說明,ES4目前的RI版本似乎得在Cygwin下面執行,所以就先安裝Cygwin。(下載:http://www.cygwin.com/,網頁中有最新版本安裝程式(setup.exe)的連結)

安裝cygwin不難,但是因為要從網路上抓安裝的package,所以最好選擇本地的mirror site,我看到有ftp.ntu.edu.tw,就用這個選項了。其他大致上只要用預設值就可以。但是ES4需要sml/nj來執行,所以必須另外手動安裝sml/nj。預防萬一,所以在安裝cygwin的時候,選擇packages->Devel底下把可能會用到的都選了,應該至少要有make,但是我還選了autoconf、automake、binutils、bison、byacc、flex、gcc、gccmingw、libtool等等,另外為了可以在文字模式下編輯,還安裝了Editors->vim。

安裝sml/nj是比較麻煩的事情,如果常在linux手動安裝東西當然就不算難啦....。首先當然要下載sml/nj,EMCAScript的網站有一個連結:http://www.smlnj.org/dist/working/110.64/index.html,大致上按照他的說明就可以順利安裝。接下來就按照sml/nj網站上的說明來弄了,我的步驟如下:

  1. 打開cygwin,出現console
  2. 我想把東西安裝到/usr/share/smlnj目錄下,所以先 "cd /usr/share" 然後 "mkdir smlnj" 接著 "cd smlnj"
  3. 一些必要的檔案,包括config.tgz、runtime.tgz我放在c:/Downloads目錄下
  4. 在cygwin的/usr/share/smlnj目錄中,用 "tar zxf /cygdrive/c/Downloads/boot.x86-unix.tgz" "tar zxf /cygdrive/c/Downloads/config.tgz" "tar zxf /cygdrive/c/Downloads/runtime.tgz base" 等把必要的package解到目錄中
  5. "export SMLNJ_CYGWIN_RUNTIME=1" 設定好環境變數,讓安裝程式知道用的是cygwin
  6. 如果要改安裝的項目,用 "vi config/targets" ,但是我沒有改.....所以需要另外下載trace-debug-profile.tgz、smlnj-lib.tgz、MLRISC.tgz、ml-yacc.tgz、ml-lpt.tgz、ml-lex、cml.tgz等幾個檔案,同樣用 "tar zxf filename" 的方法解開到/usr/share/smlnj目錄中
  7. 接著用 "config/install.sh" 來安裝
  8. 安裝完畢後,要建立連結,方便使用: "cd /usr/bin" "ln -s /usr/share/smlnj/bin/sml"
  9. 然後解開下載的ECMA-262 Edition 4 RI,例如要解開到/home/fillano目錄中,則 "tar zxf /cygdrive/c/Downloads/es4-pre-release.M0.cygwin-x86.tar.gz /home/fillano"
  10. 進到es4的目錄: "cd /home/fillano/es4" ,然後執行: "./es4" 就可以了

安裝完畢!!接著來試用一下。這裡是用直譯的方式,我又不太熟悉操作......所以先把一些敘述放到同一行來測試一下:

測試的code:
interface Greetings {
function hello();
function goodmorning();
}
class Greeter implements Greetings {
public function hello() {
print("hello, world")
};
public function goodmorning() {
print("goodmorning, world")
};
}
var greeter : Greetings = new Greeter()
greeter.hello()
greeter.goodmorning()
稍微修改一下,讓他在直譯器裡面可以執行:
interface Greetings {    function hello();    function goodmorning();}
class Greeter implements Greetings {    public function hello() {  print("hello, world")  };    public function goodmorning() {  print("goodmorning, world")   };}
var greeter : Greetings = new Greeter()
greeter.hello()
greeter.goodmorning()

然後拿到es4裡面執行:
ES4 測試程式執行畫面

(這個ES4 RI直譯器有一些內建命令可以用,我還不太清楚他的作用,不過用 ":help" 可以看一下哪一些命令可以使用)