JSVisualizer は、JavaScript のプログラムが1ステップずつどう動くかを、さまざまな図で確かめながら学ぶための Web アプリです。

1. 画面の構成

実行モードの画面。上部にステップ実行のボタンとスライダー、左にハイライトされたコード、右に可視化ビューのタブとコンソール
実行モードの画面
場所内容
上部「編集」「実行」ボタン、サンプル選択(編集モードのとき)、ステップ実行のボタンとスライダー(実行モードのとき)。右端に使い方(?)・表示言語(EN / 日)・設定(⚙)のボタン
左側(ソース)コード。編集モードでは書き換えられ、実行モードでは今どこを実行しているかがハイライトされます
右側可視化ビュー。上のタブで表示を切り替えます。タブの下に、そのビューの説明が1行表示されます
右側の下(コンソール)console.log() で出力した内容が表示されます。どのビューを見ているときも表示されています

左右の境目をドラッグすると、コードとビューの幅を変えられます。コンソールの上端をドラッグすると、コンソールの高さを変えられます。

2. コードを用意する

開いた直後は、サンプルのコード(フィボナッチ数列)が入っています。

サンプルから選ぶ

編集モードのとき、画面上部のサンプル選択(プルダウン)から、21種類のサンプルコードを選べます。

編集モードの画面。上部に編集・実行ボタンとサンプル選択、左にバブルソートのコード
編集モード(サンプル「Bubble Sort」を選んだところ)
分類サンプル
探索線形探索、二分探索
ソート(基本)バブルソート、選択ソート
ソート(高度)クイックソート、マージソート
ソート(オブジェクト)数値キーでソート、文字列キーでソート
数学・アルゴリズムユークリッドの互除法(ループ/再帰)、階乗、フィボナッチ数列(再帰/動的計画法)
データ構造二分木、連結リスト
スコープ・オブジェクトクロージャ、クラスと継承
Study Tasks評価実験用の課題(バグ探し・呼び出し回数・途中状態のトレースなど)

自分でコードを書く

編集モードでは、左側のコードを自由に書き換えられます。ほかの場所で書いたコードを貼り付けても構いません。書き終えたら「▶ 実行」を押します。

共有されたリンクから開いたとき

授業や教材で配られた、特定のコードを開くリンクから JSVisualizer を開くと、そのコードが読み込まれた状態で始まります。このときサンプル選択には、組み込みのサンプルの代わりに、リンク先のコードだけが並びます(コードが1つだけのときは選択できません)。

3. 編集モードと実行モード

ボタン説明
✏ 編集編集モードにします。コードを自由に書き換えられます。サンプル選択でコードを切り替えられるのもこのモードです
▶ 実行コードを実行して実行モードにします。プログラムは最後まで一気に実行され、その過程がすべて記録されます。そのうえで、ステップ実行のボタンで好きな時点に進んだり戻ったりして、その時点の様子を見ることができます

コードを書き換えたら、もう一度「実行」を押すと、書き換えたコードで実行し直します。

エラーが出たとき

コードに誤りがあると、コードの下にエラーメッセージが表示されます。

表示意味
Syntax Error(構文エラー)カッコの閉じ忘れやつづりの誤りなど、書き方の誤りで実行できない。メッセージの 21:9 のような数字は、誤りのある行と列です
Runtime Error(実行エラー)書き方は正しいが、実行している途中で問題が起きた(定義していない変数を使った、など)。エラーが起きる直前までは、ステップ実行で様子をたどれます
コードの21行目に誤りがあり、コードの下に Syntax Error のバッジとメッセージが表示されている
構文エラーの表示

実行が 10,000 ステップを超えると、ループが終わらないなどの可能性があるため、そこで実行を止めて実行エラーにします。止まった時点までは、ステップ実行で様子をたどれます。

4. ステップ実行

実行モードでは、画面上部のボタンでプログラムの実行を1ステップずつ進めたり戻したりできます。どれくらい細かく進むかが違う4種類のボタンがあり、それぞれに「戻る」と「進む」があります。

ステップ実行のボタン列。先頭・末尾、関数、人、文、式の各ボタンとスライダー、ステップ数の表示
ステップ実行のボタン(左から 先頭へ・末尾へ・関数・人・文・式、スライダー、ステップ数)

4種類の細かさ

ボタン細かさ1回押すと
◀ 式 / ▶ 式いちばん細かい式を1つ評価するごとに進みます。a[j] > a[j + 1] なら、a[j] の値、a[j + 1] の値、比較の結果、というように部分ごとに止まります。式がどういう順番で計算されるかを確かめたいときに使います
◁ 人 / ▷ 人ふつう(まずはこれがおすすめ)変数への代入、if の条件判定、ループの条件判定や更新、関数の呼び出しなど、人が紙でトレースするときに書き留めるような「意味のある変化」ごとに進みます
◀◀ 文 / ▶▶ 文粗い文(1行の命令)ごとに進みます。文の中の細かい計算は飛ばします
⏪ 関数 / ⏩ 関数いちばん粗い関数に入る・関数から戻るところまで一気に進みます。再帰関数の呼び出しの流れを大まかに追いたいときに使います

迷ったら「▷ 人」で進めてみてください。もっと細かく見たいところだけ「▶ 式」、ループや関数を早送りしたいときは「▶▶ 文」や「⏩ 関数」を使うと効率よく追えます。

そのほかの操作

操作説明
⏮先頭(実行開始の時点)に戻ります
⏭末尾(実行が終わった時点)に進みます
スライダーつまみをドラッグすると、好きな時点に一気に移動できます
ステップ数(例: 180 / 874)全体のうち今何番目のステップにいるか(いちばん細かい「式」の単位で数えた数)です

キーボードでの操作

次のキーでも操作できます(大文字は Shift を押しながら)。

操作戻る進む
式← または b→ または n
人Hh
文Vv
関数Ff
先頭へ/末尾へHomeEnd

1〜9 のキーで、左から1〜9番目の可視化ビューのタブに切り替えることもできます。

5. コードのハイライト

実行モードでは、左側のコードに、今どこを実行しているかが3種類の印で表示されます。

印意味
青い帯(行の左に青い線)今実行している行
オレンジの背景今評価している式の範囲
紫の破線の下線関数の中を実行しているとき、その関数を呼び出した式(呼び出し元)
5行目が青い帯でハイライトされ、14行目の関数呼び出しに紫の破線が付いたバブルソートのコード
5行目を実行中。関数 bubbleSort は14行目から呼び出された(紫の破線)
再帰関数fibのコード。条件式がオレンジ、呼び出し元の fib(n - 1) に紫の破線
条件式を評価中(オレンジ)。この fib は fib(n - 1) から呼び出された(紫の破線)

6. 可視化ビュー

画面右側では、プログラムの動きをさまざまな形で見ることができます。上部のタブで12種類のビューを切り替えられます。目的によって分かりやすいビューは違うので、いろいろ試して自分に合った見方を探してみてください。

ビューの分類

12種類のビューは、何を見るかと時間をどう見せるかの2つの観点で整理できます。

何を見るかは、次の3種類に分かれます。

時間をどう見せるかは、次の2種類です。

何を見るかその時点を見る経過をまとめて見る
状態変数の値変数実行トレース
呼び出し中の関数コールスタック変数寿命
メモリの中身メモリ—
振る舞い式の計算式評価代入展開
文の実行制御フローヒートマップ
関数の呼び出し呼び出しツリー—
配列・オブジェクト配列配列実行トレース
オブジェクトオブジェクト—

同じものを「その時点」と「経過」の両方で見比べると理解が深まります。たとえばループの中で変数の値がどう変わるかは、「変数」でその時点の値を確かめつつ、「実行トレース」で1回目・2回目…の値を並べて見ると分かりやすくなります。

状態を見るビュー

タブ見せ方内容
変数その時点コードの各行(縦)× 変数(横)の表です。各行を最後に実行したときの変数の値が表示され、前のステップから変わった値はオレンジの太字になります。列の表示/非表示の切り替えや、ドラッグでの並べ替えもできます
実行トレース経過代入や条件判定などが起きたステップを、実行した順に上から一覧で表示します。各ステップの変数の値と、条件式が true / false のどちらだったかが分かります。配列を使うコードでは、各ステップの配列と、i や j が指している位置の小さな図も並ぶので、ループの回ごとの変化を比べられます
コールスタックその時点今の時点のすべての変数の値を、全体(Global)と、呼び出し中の関数ごとに分けて表示します。関数の中では、呼び出しごとに別の変数があることが分かります
変数寿命経過横を時間、縦を関数の呼び出しの深さとして、それぞれの関数の呼び出しがいつ始まっていつ終わったかを帯で表示します。帯には関数名と引数、その呼び出しの変数の値が書かれています。関数の引数やローカル変数がいつからいつまで存在するかが分かります。縦の破線が今の時点です
メモリその時点変数(スタック)と、配列・オブジェクトの実体(ヒープ)を分けて図示し、変数がどの配列・オブジェクトを指しているかを矢印で示します
変数ビュー。行番号とコードの冒頭が縦に、変数が横に並んだ表
変数
実行トレースビュー。ステップごとに行番号、コード、配列の図、変数の値、条件式の結果が並ぶ表
実行トレース
コールスタックビュー。Globalと、fibの呼び出しごとのフレームに変数nの値が表示されている
コールスタック
変数寿命ビュー。横が時間、縦が呼び出しの深さで、fibの各呼び出しが帯として積み重なっている
変数寿命
メモリビュー。左にスタックの変数、右にヒープの配列、変数から配列への矢印
メモリ

振る舞いを見るビュー

タブ見せ方内容
式評価その時点今計算している1行の式が、部分ごとに値に置き換わりながら最終的な値になるまでの過程を表示します。オレンジは直前に置き換わった部分、青の太字は次に計算される部分です。|| や && で計算が省略された部分は、元の式のまま残ります
代入展開経過再帰関数の呼び出しを、fib(5) → fib(4) + fib(3) → … のように、関数呼び出しをその結果の式に置き換えながら展開していく過程を、上から順に表示します
制御フローその時点実行した行をつないだフローチャートを表示し、今実行している行を強調します。ループで戻る流れはオレンジの破線で示され、実行されなかった分岐はグレーになります
ヒートマップ経過各行が何回実行されたかを、色の濃さと「今までの回数 / 全体の回数」で表示します。右側の点の並びは各行がいつ実行されたかを表し、ループで何度も実行される行がひと目で分かります
呼び出しツリーその時点関数の呼び出しを木の形で表示します。各ノードに引数と戻り値が書かれ、灰色の破線は未呼び出し、青の太線は実行中、緑は完了した呼び出しです。左下の cost は、そのノードから下にある呼び出しの数(自分自身を含む)です。再帰関数が何回呼び出されるかを確かめるのに便利です
式評価ビュー。式の部分が値に置き換わっていく様子が行ごとに表示されている
式評価
代入展開ビュー。fib(5)がfib(4)+fib(3)、…と展開されていく
代入展開
制御フロービュー。実行された行がノードとして縦に並び、矢印でつながっている
制御フロー
ヒートマップビュー。各行の実行回数と色の濃さ、実行タイミングの点が表示されている
ヒートマップ
呼び出しツリービュー。fib(5)を根として、fib(4)とfib(3)…と枝分かれした木
呼び出しツリー

配列・オブジェクトを見るビュー

タブ見せ方内容
配列その時点配列の要素をマス目で表示します。値の大きさによってマスの色が変わります。i や j のように添字として使われている変数は、どの要素を指しているかがマスの下に表示されます。表示する配列は上のボタンで選べます。配列の経過をまとめて見るには「実行トレース」を使います
オブジェクトその時点配列・オブジェクトどうしの参照関係をグラフで表示します。連結リストや木構造の確認に向いています
配列ビュー。配列の要素がマス目で表示され、添字の変数が指す要素が示されている
配列
オブジェクトビュー。連結リストの3つのノードがnextの矢印でつながり、配列resultも表示されている
オブジェクト(サンプル「Linked List」)

タブの並び順は上の分類とは異なります(左から コールスタック・変数・実行トレース・代入展開・式評価・配列・ヒートマップ・呼び出しツリー・変数寿命・制御フロー・メモリ・オブジェクト)。この分類の考え方は、論文「プログラムの動作を複数のビューで可視化するプログラム実行環境の提案」(田中・上田、IS-26-049)の表1に基づきます。

7. その他の機能

ボタン説明
右上の ?この使い方のページを開きます(表示言語に合わせて日本語版/英語版)
右上の EN / 日ボタンやタブの表示を英語/日本語に切り替えます
右上の ⚙ライトテーマ(明るい画面)とダークテーマ(暗い画面)を切り替えられます。設定パネルの下にある「Session Log」は評価実験用の機能で、ふだんは使いません(記録はブラウザの中だけで行われ、JSON/CSV ファイルとして保存できます)

テーマ・言語・左右の幅・コンソールの高さ・最後に見ていたタブはブラウザに保存され、次に開いたときもそのままになります。

8. 困ったときは

こんなときどうする
ステップ実行のボタンが表示されない編集モードになっています。「▶ 実行」を押してください
サンプル選択が表示されない実行モードになっています。「✏ 編集」を押してください
サンプル選択を押しても選べないコードを1つだけ開くリンクから開いています。組み込みのサンプルを使うには、https://tntetsu.github.io/JSVisualizer/ を開き直してください
「最大ステップ数 10,000 を超えたため停止しました」と表示されるループが終わらない、再帰が止まらない、などの可能性があります。止まった時点までステップ実行で様子をたどり、終了条件を確認してください。処理の量が多いだけの場合は、扱うデータを小さくしてください
キーボードでステップ実行できないコードの編集欄などの入力欄にカーソルがあると、キー入力はそちらに入ります。実行モードで画面のほかの場所を一度クリックしてから操作してください
タブがグレーで選べないそのコードでは使えないビューです(関数を使っていないコードの「代入展開」「呼び出しツリー」など)
画面が正しく表示されないパソコンの最新のブラウザを使ってください。ページを再読み込みすると直ることがあります(スマートフォンでの利用は想定していません)