この記事は Mozilla の CVS サーバから JavaScript シェルの入手とビルドを紹介します。そしてテストと実験のためにプレリリース版を入手しビルドする事に特にフォーカスを当てています。
さらにこの記事は JavaScript コードを実験し JavaScript プログラムを実行するためのシェルの使いかたに関する基本的な情報を提供します。
JavaScript シェルを入手しビルドする
CVS サーバへのログイン
他の Mozilla プロジェクト を CVS からとってくるのと同様に、最初に CVS サーバにログインする必要があります。そうするには、コードをチェックアウトしたい基本のディレクトリに cd
し、以下のコマンドをコマンドラインに入力します。
cvs -d :pserver:[email protected]:/cvsroot login
入力を促されたら、パスワード anonymous
を入力してください。
Trunk 版の JavaScript をビルドする
一度サーバにログインしたなら CVS からコードをとってきましょう。最初に CVS ツリーのルートに cd
する必要があり、次に以下のコマンドを入力してください。
cvs -d :pserver:[email protected]:/cvsroot co -l mozilla/js/src mozilla/js/src/config mozilla/js/src/editline mozilla/js/src/fdlibm
これは JavaScript シェルをビルドするために必要な全てのファイルをチェックアウトします。
これで以下の 2 つのコマンドを実行すると JavaScript をビルドできるようになりました。
cd mozilla/js/src make -f Makefile.ref
コンパイルが完了したら、あるディレクトリ(名前はビルドしたシステムに依存します)の中に js
という実行ファイルがあるはずです。js
。例えば Mac OS X では実行ファイルは Darwin_DBG.OBJ/js
にあります。
この時点で、シェルを実行し試す準備ができました。
ブランチ版の JavaScript をビルドする
JavaScript の特定のブランチ版のを実験したいなら、ブランチから js/src
を、trunk から editline
と config
をチェックアウトします。
cvs -d :pserver:[email protected]:/cvsroot co -l -r BRANCH_NAME mozilla/js/src mozilla/js/src/fdlibm cvs -d :pserver:[email protected]:/cvsroot co -l mozilla/js/src/config mozilla/js/src/editline
BRANCH_NAME はチェックアウトしたいブランチの名前に変更してください。You can use a JavaScript のブランチ名 (例えば JS_1_7_ALPHA_BRANCH
) か Mozilla のブランチ名 (例えば MOZILLA_1_8_BRANCH
) を使うことができます。
その後は前の章と同様にコンパイルし実行できます。
JavaScript シェルを使う
シェルは 2 種類の操作モードを提供します。それを対話的なシェルとして使うことができます。それは JavaScript コードをプロンプトで書き、その瞬間に満足を得られます。これは新機能を実験するかテストするのに便利です。プログラムを自動的に実行したい場合にはコマンドラインで実行する JavaScript プログラムファイルを渡すこともができます。
コマンドラインオプション
シェルを管理するために設定できる多くのコマンドラインがあります。以下にそれは要約されています。
-b branchlimit
- Sets the branch limit.
-c stackchunksize
- スタックチャンクの大きさを設定する。Sets the stack chunk size.
-C
- シェルにプログラムをコンパイルするが実行しないように指示する。これはプログラムを実際に実行しないでシンタックスエラーを確認する便利な方法である。Tells the shell to compile the program but not run it. This is a convenient way to quickly check for syntax errors in your program without actually running it.
-e script
- 指定された script を実行する。script は実行するコードを含む文字列である。Runs the specified ''script'', which is a literal string containing the code to execute.
-f filename
- filename で指定されたファイルの JavaScript プログラムを実行する。Runs the JavaScript program specified by ''filename''.
-i
- 対話的モードを有効にする。Enables interactive mode.
-P
- 私もなんなのかまだわからない。''I'm not sure yet what this does.''
-s
- 厳密に警告を出すモードを有効にする。Enables strict warning mode.
-S stacksize
- スタックサイズの最大値を設定する。Sets the maximum stack size.
-v version
- version で指定された JavaScript のバージョンを設定する。(例えば、JavaScript 1.7 では
170
)
- version で指定された JavaScript のバージョンを設定する。(例えば、JavaScript 1.7 では
-w
- 警告メッセージを有効にする。Enables warning messages.
-W
- 警告メッセージを無効にする。Disables warning messages.
-x
- E4X XML モードを有効にする。Enables E4X XML mode.
シェルを実行する
もし対話的モードでシェルを実行したいなら、単にコマンドを使うだけでできます。If you want to run the shell in interactive mode, you can simply use the command:
js
もし foo.js
ファイルの中の JavaScript コードを実行したいなら、このコマンドを使うことができます。
js -f foo.js
foo.js を実行した後に対話的シェルに入るにはこうします。
js -f foo.js -f -
シェルを対話的モードで使う
対話的モードでは、個別の文と同様にオブジェクトや関数を作るために手で JavaScript コードを入力できます。これはアイディアを試す、JavaScript エンジンで作業している開発者にとってより重要な、言語の新しい機能をテストするには簡単な方法です。
組み込み関数
JavaScript シェルをより便利にするために、JavaScript プログラムか対話的モードで使うことができる多くの組み込み関数が提供されています。
build()
JavaScript シェルがビルドされた日付と時間を返します。
clear([object])
指定された object のプロパティをクリアします。パラメータ無しで clear()
を呼び出すと全てがクリアされるので白紙の状態で始めることができます。
clear()
は本当に全てをクリアします。これはこれら全ての組み込み関数を含んでいます。clone(function, [scope])
指定された function オブジェクトをクローンします。もし scope が指定されていないと、新しいオブジェクトの親は元のオブジェクトの親と同じになります。それ以外なら新しいオブジェクトは scope で指定されたオブジェクトのスコープの中に置かれます。
dis([function])
JavaScript バイトコードをプログラム全体、あるいは特定の function を逆アセンブルします。
例えば、以下の JavaScript 関数を入力したとします:
function test() { var i = 3; print(i+2); }
次に dis(test);
を実行すると、この出力を受け取るでしょう:
main: 00000: uint16 3 00003: setvar 0 00006: pop 00007: name "print" 00010: pushobj 00011: getvar 0 00014: uint16 2 00017: add 00018: call 1 00021: pop 00022: stop Source notes: 0: 0 [ 0] newline 1: 3 [ 3] decl offset 0 2: 7 [ 4] newline 3: 18 [ 11] xdelta 4: 18 [ 0] pcbase offset 11
dissrc([function])
元の行を表示しながら、プログラム全体か特定の関数の JavaScript バイトコードを逆アセンブルします。この関数はファイルから読み込まれたプログラムに対してのみ動きます。つまりシェルの起動時の -f
フラグか、load()
関数を使うかのどちらか。
あなたのプログラムがこのような doStuff()
という関数を含んでいると:
function doStuff(input) { print("数字を入力してください: "); var n1 = readline(); print("もう 1 つ数字を入力してください: "); var n2 = readline(); print("You entered " + n1 + " and " + n2 + "\n"); }
dissrc(doStuff)
関数を呼び出すとこのような出力が得られるでしょう:
;------------------------- 10: print("Enter a number: "); 00000: 10 name "print" 00003: 10 pushobj 00004: 10 string "Enter a number: " 00007: 10 call 1 00010: 10 pop ;------------------------- 11: var n1 = readline(); 00011: 11 name "readline" 00014: 11 pushobj 00015: 11 call 0 00018: 11 setvar 0 00021: 11 pop ;------------------------- 12: print("Enter another one: "); 00022: 12 name "print" 00025: 12 pushobj 00026: 12 string "Enter another one: " 00029: 12 call 1 00032: 12 pop ;------------------------- 13: var n2 = readline(); 00033: 13 name "readline" 00036: 13 pushobj 00037: 13 call 0 00040: 13 setvar 1 00043: 13 pop ;------------------------- 14: ;------------------------- 15: print("You entered " + n1 + " and " + n2 + "\n"); 00044: 15 name "print" 00047: 15 pushobj 00048: 15 string "You entered " 00051: 15 getvar 0 00054: 15 add 00055: 15 string " and " 00058: 15 add 00059: 15 getvar 1 00062: 15 add 00063: 15 string "\\n" 00066: 15 add 00067: 15 call 1 00070: 15 pop 00071: 15 stop
evalcx(string[, object])
string の JavaScript コードを実行します。もし object が指定されているとサンドボックスとして扱い、コードはそのオブジェクトの中で実行されます。
もし string が空で、ojbect が指定されていないと、evalcx()
は熱心な標準的なクラスをもった新しいオブジェクトを返します。
もし string が "lazy" で object が指定されていないと、evalcx()
はだらけた標準的なクラスをもった新しいオブジェクトを返します。
evalcx()
は JavaScript エンジンの奥深くで作業する人にのみ便利です。テスト目的にはシェルの evalInSandbox
の様な環境を使ってくださいgc()
メモリをクリーンアップするためにガベージコレクタを実行します。
getpda(object)
指定した object のプロパティ記述子 (property descriptors)を返します
getslx(object)
スクリプトの行の範囲を返します。行の範囲とは指定されたオブジェクトを構成するコードの行数のことです。
help([command ...])
指定されたコマンドか、何も指定されなければ利用可能な全ての関数についての簡単なヘルプを表示します。
intern(string)
指定された string を atom テーブルに内部化します。全ての文字列は atom と呼ばれる一意の識別子を持っています。この仕組は文字列の比較を用意にします。
line2pc([function, ] line)
コードの指定された line に対応するプログラムカウンタの値を返します。もし が指定されたら function が指定されると line は指定された関数の中のオフセットです。
load(filename1 [filename])
指定された名前のファイルを読み込みます。
notes([function])
指定された関数のソースの注意書きを表示します。ソースの注意書きはコードを逆コンパイルする時 (dissrc()
関数が使われる時など) に使われる bytecode からソースコードへのマップの情報を含んでいます。
options([option ...])
オプションの設定あるいは取得。コマンドラインで特定のオプションを指定したなら options
の呼出結果はリクエストしたオプションを示します。新しく設定するオプションを引数にすることもできます。
js -x
コマンドでシェルを開始したらなら options()
関数は xml
を返すでしょう。もしオプション無しでシェルを開始して XML モードを有効にすると決めたなら、以下のコマンドの発行で出来ます。
options('xml');
利用可能なオプションは:
オプション名 | 概要 |
strict |
厳格モードが有効。 |
werror |
警告がエラーとして扱われる。 |
atline |
atline が有効だと //@line num 形式のコメントは、それ以下の行数を num に設定します。 |
xml |
XML モードが有効 |
pc2line(function, [pc])
指定した function の最初の行に対応する JavaScript コードの行数を返します。もしあなたが、その関数の中のプログラムカウンタオフセットを指定すると、オフセットを含んだコードの行数が返されます。
print([expression ...])
expression が評価され、結果が stdout
に表示されます。
quit()
シェルを終了。
readline()
stdin
から一行の入力を読み、呼出基に返します。これは JavaScript で対話的なシェルを作るのに使うことができます。
seal(object[, deep])
指定された object か、deep が true
ならオブジェクトグラフ (object graph) を封印します。オブジェクトかオブジェクトグラフを封印することで、それらのオブジェクトの変更ができなくなります。
stats([string ...])
統計をダンプします。正しいオプションは arena と atom、global です。
オプション | 概要 |
arena |
アリーナテーブルを出力します。 |
atom |
atom テーブルを出力します。 |
global |
グローバル名テーブルを出力します。 |
アリーナ は JavaScript エンジンが性能を最適化するためにサブブロックを割り当てた メモリ上の巨大なブロックです。それぞれの個々のブロックのために大量の malloc()
を呼び出すのは効率が悪いため、エンジンはアリーナを作り、その中からメモリを割り当てる内部メモリ管理システムを使います。アリーナテーブルはシェルによって割り当てられた全アリーナのリストです。stats("arena")
を使ってアリーナテーブルを調査しテストケースのアリーナの使いかたを見ることができます。
atom は文字列に対する一意の識別子です。文字列同士の比較を最適化するため、それぞれの文字列には atom が与えられています。これらのは atom はハッシュテーブルに保存されています。ハッシュテーブルは stats("atom")
コマンドを使って表示することができます。
stats("global")
はグローバル名テーブルを表示します。メモリ上のそれぞれのオブジェクトの名前と情報を表示します。
stringsAreUtf8()
もし文字列が UTF-8 でエンコードされていれば true
を返し、それ以外なら false
を返します。
testUtf8(mode)
UTF-8 テストを行います。mode パラメータは 1 から 4 までの整数です。
これはUTF-8 文字列処理を確認を簡単に実行するデバッグコマンドです。JavaScript エンジン自体で作業しない限り一般的には使いません。
throwError()
JS_ReportError()
関数からエラーを投げます。
tracing([toggle])
追跡モードを有効あるいは無効にします。追跡を有効にするには true
を無効にするには false
を渡します。もしパラメータを指定しないと tracing()
は現在の設定を返します。
jsinterp.c
ファイルで JS_THREADED_INTERP
が無効になっている場合のみ働きます。trap([function, [pc,]] expression)
JavaScript コードの指定した場所にトラップを設定します。pc で指定された 関数 function' のオフセットのバイトコードが実行されようとする時、expression が評価されます。
line2pc()
と協力して使うと、これは強力なデバッグ機構です。例えばある関数、doSomething()
の 6 行目が実行されるときにメッセージを表示したいなら、以下を入力できます。
trap(doSomething, line2pc(test, 6), "print('line 6!\n')");
untrap
を使ってトラップを取り除くまで、 trap
バイトコードに置き換えられます。untrap(function [, pc])
pc オフセットの指定した function からトラップを取り除きます。もし pc が指定されていないと、トラップは関数のエントリポイントから取り除かれます。
この関数は指定した場所にトラップがないと効果がありません。
version([number])
version()
関数は JavaScript のバージョン番号を取得する、または設定します。これは JavaScript の特定のバージョンで利用可能な構文にアクセスする時便利です (例えば、JavaScript 1.7 を使うを参照してください)。