用語辞典・OS・ブラウザ

JavaScript

JavaScriptとは

JavaScript(ジャバスクリプト)は、Webページへ動作や対話機能を加えるため広く使われるプログラミング言語です。DOMの変更、イベント処理、ネットワーク要求、アニメーション、データ変換、サーバーアプリケーション等に使われます。

言語の標準仕様はECMAScript(エクマスクリプト)としてEcma InternationalのECMA-262に定められます。JavaScriptはその言語を実装し、ブラウザーやサーバー等のホストが追加APIを提供します。

DOM、fetch、タイマー、イベントループはECMAScript言語そのものではありません。JavaScriptコードから使えるため一体に見えますが、ブラウザーホストが用意する機能です。

ソースを解析・コンパイルして呼び出しスタックで実行し、外側のWeb APIが完了した仕事を待ち行列とイベントループで戻す言語エンジン、メモリー、ホストAPI、処理・マイクロタスクを分ける
abstractソースブロック、構文木構造、インタープリターとoptimizedエンジン、呼び出しスタック、ヒープオブジェクト、DOM、ネットワーク、時計、保存領域、入力、メディア、ワーカー、処理待ち行列、マイクロタスク待ち行列、イベントループを分けたピクトグラム図解
図1ネットワークやタイマーが別の場所で完了しても、コールバックは主要呼び出しスタックが空き、イベントループが選ぶまで実行されません。

実行を八つの要素に分ける

Source文と式を記述

Unicodeテキストを字句解析し、文法に従ってプログラムとして解析します。

Parse構文構造を作る

適用範囲、束縛、構文エラーを確認し、内部表現へ変換します。

Executeバイトコード等を実行

インタープリターとJIT コンパイラーを組み合わせ、頻繁な処理を最適化します。

Callスタック呼出し順を管理

機能フレームを積み、戻り値や例外送出で上から取り除きます。

Heapオブジェクトを保持

参照関係を持つ値を置き、到達不能なオブジェクトを不要データ収集します。

Web APIsホスト機能を呼び出す

DOM、ネットワーク、タイマー、保存領域等へブラウザーが定めたインターフェースで依頼します。

Queues完了後の仕事を待たせる

処理とマイクロタスクは別のチェックポイント規則で実行候補になります。

Eventループ実行機会を調停

処理、マイクロタスク、レンダリング実行機会等をHTMLの処理モデルで進めます。

スクリプトとモジュールは読込規則が違う

従来型スクリプトは通常のグローバルスクリプトとして評価され、deferasyncで取得と実行時期を調整できます。JavaScript module(ジャバスクリプト・モジュール)は取り込み・書き出し、モジュール適用範囲、依存先グラフを持ち、既定で遅延実行相当です。

モジュールはURL単位で解決・キャッシュされ、CORS規則も適用されます。記述場所だけで実行順を推測せず、解析器処理を止める、依存先取得、最上位待機を確認します。

呼び出しスタックが長時間塞がると画面も止まる

主要スレッド上で長いループや重いデータ処理を続けると、入力イベント、タイマーコールバック、レイアウト・描画へ制御が戻りません。「非同期機能」と書いても、その中の同期計算は自動的に別スレッドへ移りません。

処理を小さな処理へ分ける、アルゴリズムを改善する、Web Workerへ移す、WebAssemblyを検討する等で主要スレッドを空けます。ただしDOMは通常ワーカーから直接操作できません。

Promiseは別スレッドではなく完了通知の仕組み

Promise(プロミス)は将来得られる値または失敗を表します。ネットワーク等のホスト処理が完了すると後続処理がマイクロタスク待ち行列へ入り、現在のJavaScriptジョブが終わったチェックポイントで処理されます。

マイクロタスクを際限なく追加すると次の処理やレンダリングが進めません。処理、マイクロタスク、アニメーションフレームの選択は用途に合わせます。

動的型付けは「型がない」という意味ではない

JavaScriptの値にはNumber、BigInt、String、Boolean、Symbol、Object等の型があります。変数へ格納する値の型を実行中に変えられるためdynamically typed(ダイナミカリー・タイプド)と呼ばれます。

==の型変換、浮動小数点、nullと未定義値、オブジェクト参照を理解し、境界データは明示的に検証します。TypeScriptの静的確認は開発時支援で、実行時に入る外部データを保証しません。

ブラウザー以外でも同じ言語を使える

サーバー実行時、デスクトップアプリケーション、組み込み機器、自動化ツールにもJavaScriptエンジンを組み込めます。ホストAPIは環境ごとに異なり、ブラウザーのdocumentがサーバーにあるとは限りません。

JavaScriptはECMAScriptに基づく言語です。エンジンがコードとメモリーを扱い、ブラウザーホストがDOM・ネットワーク・タイマーを提供し、イベントループが実行機会をつなぎます。

JavaScript言語の型、実行、module等を定める現行標準:ECMA-262「ECMAScript Language Specification」。browserのevent loop、task、microtask、rendering処理model:WHATWG HTML「Event loops」

関連用語