JavaScript シェルの紹介

JavaScript シェル (js) は SpiderMonkey ソース配布に含まれているコマンドラインプログラムです。 これは、Python の対話型プロンプト、Lisp の read-eval-print ループ、または Ruby の irb に相当する JavaScript です。この記事では、シェルを使用して JavaScript コードを試したり JavaScript プログラムを実行したりする方法について説明します。

SpiderMonkey JavaScript シェルを入手するには、SpiderMonkey ビルドドキュメントを参照するか、Nightly Builds からプラットフォーム用にコンパイルされたバイナリをダウンロードしてください。

他の JavaScript シェルのリストについては、JavaScript シェルを参照してください。

メモ: SpiderMonkey 44 (Firefox 44 / Thunderbird 44 / SeaMonkey 2.41) 以降、標準の Web 互換の JavaScript バージョンがデフォルトで使用されます (JS 1.7 以降ではなくなりました)。組み込みの version() シェルは、従来の機能をテストするためにまだ存在しています。

JavaScript シェルを実行する

シェルには2つの動作モードがあります。インタラクティブシェルとして使用することができます。ここでは、プロンプトで JavaScript コードを入力してすぐに満足のいく結果を得ることができます。これは、新機能の実験やテストに便利です。実行する JavaScript プログラムファイルをコマンドラインで渡すこともできます。その場合、プログラムは自動的に実行されます。

ビルドの資料に従って、make install を使用してビルド済みシェルをインストールした後は、次のコマンドを使用して対話モードでシェルを実行できます。

js

[ If you get " symbol lookup error: ./js: undefined symbol: PR_SetCurrentThreadName" e.g. from a Bash console when using a pre-compiled binary, try <path to your Firefox's run-mozilla.sh>/run-mozilla.sh ./js -- that worked for me]

ファイル foo.js 内の JavaScript コードを実行したい場合は、次のコマンドを使用できます:

js foo.js

foo.js を実行してからインタラクティブシェルにドロップするには、次のようにします:

js -f foo.js -i

リファレンス

メモ: JavaScript シェルは JavaScript エンジンのテスト環境として使用されるため、使用可能なオプションと組み込み関数は時間の経過とともに変わる可能性があります。

コマンドラインオプション

シェルを制御するために指定できるコマンドラインオプションは多数あります。これらは以下に要約されています。文書化されていないものがあるかどうかを確認するには、必ず自分の jsshell で -h を使用してください。

-c, --compileonly
プログラムをコンパイルして実行しないようシェルに指示します。これは、プログラムを実行せずにプログラム内の構文エラーを素早くチェックするのに便利な方法です。
-e script
指定したスクリプトを実行します。これは、実行するコードを含むリテラル文字列です。
-f filename
filename で指定された JavaScript プログラムを実行します。
-i
インタラクティブモードを有効にします。(ファイル名が指定されていない場合はデフォルト)
--no-ion
最適化 JIT コンパイラを無効にします。
--no-baseline
ベースライン JIT コンパイラを無効にします。
-P
ファイルの最初の行が "/usr/bin/env js -P" の場合、ファイルの内容は JavaScript エンジンによって解釈されます。
これにより、JavaScript ファイルを UNIX および OS X マシン上で実行可能にすることができます。
-s
厳密な警告モードを有効にします。
-w, --warnings
警告メッセージを有効にします。
-W, --nowarnings
警告メッセージを無効にします。

環境オプション

js シェルの動作を変更するために設定できる環境変数がいくつかあります。

JS_STDOUT=file
標準出力を file にリダイレクトします。
JS_STDERR=file
標準エラー出力を file にリダイレクトします。

組み込み関数

JavaScript シェルをより便利にするために、JavaScript プログラムからでもインタラクティブモードでも使える、多くの組み込み関数が提供されています。

: このリストは不完全であり、Shell のグローバルオブジェクトと重複しています。詳しくは js/src/shell/js.cpp を参照してください (shell_functionsについて)。

build()

JavaScript シェルが構築された日時を返します。

メモ: パラメータなしの clear() は本当にすべてをクリアします。これにはこれらすべての組み込み関数が含まれます。

clone(function, [scope])

指定された function オブジェクトを複製します。scope が指定されていない場合、新しいオブジェクトの親は元のオブジェクトのものと同じです。それ以外の場合、新しいオブジェクトは scope で指定されたオブジェクトの範囲内に配置されます。

countHeap([start[, kind]])

SpiderMonkey 1.8 の新機能 ヒープ内のライブ GC のもの、または start から到達可能なもので、指定された値が null ではないものの数を数えます。kind はすべてのものを数える 'all' (デフォルト)、またはその種類のものだけを数えるための 'object', 'double', 'string', 'function', 'qname', 'namespace', 'xml' のいずれかです。

dumpHeap([fileName[, start[, toFind[, maxDepth[, toIgnore]]]]])

SpiderMonkey 1.8 の新機能 既存のすべてのオブジェクト (または特定の興味深い部分グラフ) のグラフをファイルにダンプします。詳しくは、この関数の C/C++ バージョン、JS_DumpHeap を参照してください。

evalcx(string[, object])

JavaScript コードを文字列で評価します。object が指定されている場合、コードはそのオブジェクト内で実行され、サンドボックスとして扱われます。

string が空で object が指定されていない場合、evalcx() は、意欲的な標準クラスを持つ新しいオブジェクトを返します。

string が "lazy" で object が指定されていない場合、evalcx() は lazy 標準クラスを持つ新しいオブジェクトを返します。

メモ: evalcx() は、シェル内で evalInSandbox のような環境をテストするために、JavaScript エンジンの内部で深く作業している人にのみ役立ちます。

gc()

ガベージコレクタを実行してメモリを解放します。

gcparam(name[, value])

SpiderMonkey 1.8 の新機能 ガベージコレクタのパラメータを読み込むか設定します。

名前は https://searchfox.org/mozilla-central/source/js/src/builtin/TestingFunctions.cpp#464FOR_EACH_GC_PARAM で定義されているパラメータキーのいずれか ('maxBytes''maxMallocBytes'、'gcNumber' など) でなければなりません。

value が指定されていない場合、gcparam() は name という名前の GC パラメータに関連付けられている現在の値を返します。

value が指定されている場合、それは正の uint32 に変換可能でなければなりません。gcparam() は GC パラメータの namevalue に設定します。

詳しくは C/C++ 関数の JS_GetGCParameter および JS_SetGCParameter を参照してください。

gczeal(level)

SpiderMonkey 1.8 の新機能 DEBUG のみ。デバッグ機能である GC の活動量のレベルを設定します。これは、通常の定期的なガベージコレクションの場合は 0、非常に頻繁な GC の場合は 1、非常に頻繁な GC の場合は 2 になります。
0 以外は JavaScript の実行を非常に遅くしますが、GC 関連のバグを明らかにしたり再現したりするのに役立ちます。詳しくは、この関数の C/C++ バージョンである JS_SetGCZeal を参照してください。

getpda(object)

指定した object のプロパティ記述子を返します。

getslx(object)

指定されたオブジェクトを構成するコードの行数であるスクリプト行エクステントを返します。

help([command ...])

指定されたコマンド、または指定されていない場合は使用可能なすべての機能に関する簡単なヘルプ情報を表示します。

intern(string)

指定された string をアトムテーブルに内部化します。すべての文字列はアトムと呼ばれる一意の識別子を持ちます。このシステムにより、文字列間の比較が簡単になります。

メモ: この関数は、JavaScript エンジンをテストするときにのみ使用されることを意図しています。

line2pc([function, ] line)

指定されたコード行に対応するプログラムカウンタ値を返します。function が指定されている場合、line は指定された関数へのオフセットです。

load(filename1 [filename])

指定された名前で JavaScript ファイルをロードします。

メモ: JavaScript 以外のファイルをロードするには、read() を使用してください。

options([option ...])

オプションを設定または取得できます。コマンドラインでオプションを指定した場合、options を呼び出した結果は、どのオプションを要求したかを示します。新しいオプションを渡して設定することもできます。

利用可能なオプションは以下のとおりです:

オプション名 説明
strict ストリクトモードが有効になります。
werror 警告はエラーとして扱われます。
atline atline が有効になっているとき、//@line num の形式のコメントは次の行の番号を num に設定します。

pc2line(function, [pc])

指定された function の最初の行に対応する JavaScript コードの行番号を返します。関数にプログラムカウンタオフセットを指定した場合は、そのオフセットを含むコード行の行番号が返されます。

print([expression ...])

expression(s) を評価し、その結果を stdout にスペース (" ") で区切って表示し、改行 ("\n") で終了します。

putstr(expression)

expression を評価し、その結果を stdout に表示します。

quit([status])

シェルを終了します。省略した場合、status はデフォルトで 0 になります。

read(filename[, type])

ファイルの内容を読み込んで返します。typeが "binary" の場合は Uint8Array が返され、それ以外の場合は UTF-8 でデコードされた文字列が返されます。

readline()

stdin から単一行の入力を読み込み、呼び出し元に返します。これを使って JavaScript でインタラクティブシェルプログラムを作成することができます。

Reflect.parse()

Parser API を参照してください。

メモ: この関数は、JavaScript エンジンをテストするときにのみ使用することを意図しています。

seal(object[, deep])

指定した object、または deeptrue の場合はオブジェクトグラフをシールします。オブジェクトまたはオブジェクトグラフを封印することで、それらのオブジェクトの変更を無効にします。

sleep(dt)

SpiderMonkey 1.8 の新機能 JS_THREADSAFE でのみビルドされます。dt 秒間スリープします。秒の端数がサポートされています。成功した場合にtrue、スリープが中断された場合にfalseを返します。

stackQuota([number])

スクリプトスタッククォータを取得または設定します。

throwError()

JS_ReportError() 関数からエラーをスローします。

メモ: この関数は、JavaScript エンジンをテストするときにのみ使用することを意図しています。

trap([function, [pc,]] expression)

JavaScript コードの特定の位置にトラップを設定します。関数 functionpc で指定されたオフセットのバイトコードが実行されようとしているとき、式は評価されます。

line2pc() と組み合わせて使用すると、これは強力なデバッグメカニズムです。たとえば、関数 doSomething() の 6 行目が実行されたときにメッセージを表示したい場合は、次のように入力します。

trap(doSomething, line2pc(doSomething, 6), "print('line 6!\n')");
メモ: トラップが設定されると、untrap() を使用してトラップを削除するまで、プログラム内の対応するバイトコードが trap バイトコードに置き換えられます。

untrap(function [, pc])

オフセット pc で指定した function からトラップを削除します。pc が指定されていない場合、トラップは関数のエントリポイントから削除されます。

指定された場所にトラップがない場合、この機能は無効です。

version([number])

version() 関数を使用すると、JavaScript のバージョン番号を取得または設定できます。これは、特定のバージョンの JavaScript でのみ使用可能な構文にアクセスするのに役立ちます (たとえば、JavaScript 1.7 の使用を参照)。

デバッグ関数

これらの組み込み関数は DEBUG ビルドでのみ利用可能です。

dis([function])

プログラム全体、または指定された function の JavaScript バイトコードを逆アセンブルします。

たとえば、以下の 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])

プログラム全体または指定された function の JavaScript バイトコードを逆アセンブルして、ソース行を表示します。この関数は、シェルの起動時に -f フラグを使用するか、load() 関数を使用してファイルからロードされたプログラムに対してのみ機能します。

プログラムに関数 doStuff() が含まれている場合は、次のようになります。

function doStuff(input) {
	print("Enter a number: ");
	var n1 = readline();
	print("Enter another one: ");
	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

dumpheap(([fileName[, start[, toFind[, maxDepth[, toIgnore]]]]])

GC 情報をダンプします。これは JS_DumpHeap の軽量なラッパーです。

gczeal(zeal)

GC の危険性の発見に役立つように、頻繁な GC を有効にします。zeal は整数です。意味は JS_SetGCZeal のパラメータと同じです。

notes([function])

指定した機能のソースノートを表示します。ソースノートには、バイトコードをソースコードにマップする情報が含まれています。これは、dissrc() 関数を使用する場合など、コードを逆コンパイルするときに使用されます。