Introduction to the JavaScript shell

この記事は Mozilla の CVS サーバから JavaScript シェルの入手とビルドを紹介します。そしてテストと実験のためにプレリリース版を入手しビルドする事に特にフォーカスを当てています。

さらにこの記事は JavaScript コードを実験し JavaScript プログラムを実行するためのシェルの使いかたに関する基本的な情報を提供します。

JavaScript シェルを入手しビルドする

Note: 現在別の Mozilla プロジェクトをビルドしていても、Mozilla ソースツリーでは通常見つからないシェル特有のファイルがあるので、明示的に JavaScript シェルのソースをダウンロードする必要があるでしょう。

CVS サーバへのログイン

他の Mozilla プロジェクト を CVS からとってくるのと同様に、最初に CVS サーバにログインする必要があります。そうするには、コードをチェックアウトしたい基本のディレクトリに cd し、以下のコマンドをコマンドラインに入力します。

cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot login

入力を促されたら、パスワード anonymous を入力してください。

Trunk 版の JavaScript をビルドする

一度サーバにログインしたなら CVS からコードをとってきましょう。最初に CVS ツリーのルートに cd する必要があり、次に以下のコマンドを入力してください。

cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/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 から editlineconfig をチェックアウトします。

cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co -l -r <var>BRANCH_NAME</var> mozilla/js/src mozilla/js/src/fdlibm
cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co -l mozilla/js/src/config mozilla/js/src/editline

<var>BRANCH_NAME</var> はチェックアウトしたいブランチの名前に変更してください。You can use a JavaScript のブランチ名 (例えば JS_1_7_ALPHA_BRANCH) か Mozilla のブランチ名 (例えば MOZILLA_1_8_BRANCH) を使うことができます。

その後は前の章と同様にコンパイルし実行できます。

JavaScript シェルを使う

シェルは 2 種類の操作モードを提供します。それを対話的なシェルとして使うことができます。それは JavaScript コードをプロンプトで書き、その瞬間に満足を得られます。これは新機能を実験するかテストするのに便利です。プログラムを自動的に実行したい場合にはコマンドラインで実行する JavaScript プログラムファイルを渡すこともができます。

注意: 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)
  • -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])

指定された <var>object</var> のプロパティをクリアします。パラメータ無しで clear() を呼び出すと全てがクリアされるので白紙の状態で始めることができます。

注意: パラメータ無しの clear() は本当に全てをクリアします。これはこれら全ての組み込み関数を含んでいます。

clone(function, [scope])

指定された <var>function</var> オブジェクトをクローンします。もし <var>scope</var> が指定されていないと、新しいオブジェクトの親は元のオブジェクトの親と同じになります。それ以外なら新しいオブジェクトは <var>scope</var> で指定されたオブジェクトのスコープの中に置かれます。

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() はだらけた標準的なクラスをもった新しいオブジェクトを返します。

Note: evalcx() は JavaScript エンジンの奥深くで作業する人にのみ便利です。テスト目的にはシェルの evalInSandbox の様な環境を使ってください

gc()

メモリをクリーンアップするためにガベージコレクタを実行します。

getpda(object)

指定した object のプロパティ記述子 (property descriptors)を返します

getslx(object)

スクリプトの行の範囲を返します。行の範囲とは指定されたオブジェクトを構成するコードの行数のことです。

help([command ...])

指定されたコマンドか、何も指定されなければ利用可能な全ての関数についての簡単なヘルプを表示します。

intern(string)

指定された <var>string</var> を atom テーブルに内部化します。全ての文字列は atom と呼ばれる一意の識別子を持っています。この仕組は文字列の比較を用意にします。

Note: この関数は JavaScript エンジンのテストにのみ使うことを目的にしています。

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 か、deeptrue ならオブジェクトグラフ (object graph) を封印します。オブジェクトかオブジェクトグラフを封印することで、それらのオブジェクトの変更ができなくなります。

stats([string ...])

統計をダンプします。正しいオプションは arenaatomglobal です。

オプション 概要
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() 関数からエラーを投げます。

注意: この関数は JavaScript エンジンのテスト時にのみ使われます。

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 を使うを参照してください)。

Document Tags and Contributors

Contributors to this page: Dynamis, kano, Taken, Mgjbot
最終更新者: kano,