まず、単語の分割とは、文字列をプログラミング言語にとって意味のあるコード ブロックに分解することについて説明します。これらのコード ブロックはトークンと呼ばれます。たとえば、コードvar a = 2
は次の字句単位に分解されます。具体的には、var,a,=,2。
注: 単語の分割とは、実際には上記のコード全体をセグメントに分割することです。
解析とは、語彙単位のストリームを、レベルごとに入れ子になった要素で構成されるツリーに変換することです。これは、プログラムの文法構造を表します。このツリーは、抽象構文ツリーと呼ばれます。標準語が長すぎるため、ここでは考慮しません。より直感的な形式で直接表示します。詳細は以下のとおりです。
分析: 抽象構文ツリーには var の最上位ノードがあり、その後に変数 a を持つ子ノードと代入演算子 = を持つノードが続きます。代入シンボルの下に 2 の子ノードがもう 1 つあります。具体的には、コードvar a = 2
に対応します。
抽象構文ツリーを実行可能コードに変換するプロセスは、コード生成と呼ばれます。このプロセスは、言語とターゲット プラットフォームに密接に関連しています。簡単に言えば、 var a = 2
の抽象構文ツリーを機械語命令に変換する方法があります。 a という変数を作成し、 a に値を格納するために使用されます。
主にエンジンに依存して JavaScript コードを実行します。エンジンが var a = 2 を実行すると、変数 a が宣言されているかどうかを検索して判断します。検索プロセスはスコープによって支援されます。クエリ プロセス中に、エンジンは変数 a に対して LHS (左クエリ) を実行し、値に対して右クエリを実行します。簡単に言うと、変数が代入演算の左側に現れた場合は LHS クエリが実行され、変数が右側に現れた場合は RHS クエリが実行されます。より正確に言うと、LHS クエリは変数自体のコンテナを見つけようとし、RHS クエリはそのソース値を取得しようとします。
注: この関数には、LHS クエリと RHS クエリの両方が存在します。パラメーターを渡すプロセスで、コードは暗黙的な割り当てを実行するためです。
変数が宣言されていない場合、LHS クエリと RHS クエリの動作が異なります。
関数 foo(a){ コンソール.ログ(a+b); b=a;}foo(2)
注: b に対する最初の右クエリでは変数が見つかりません。これは、関連するスコープ内で見つからないため、宣言されていない変数であることを意味します。 RHS がネストされたスコープ内で必要な変数を見つけられない場合、エンジンは例外をスローします。
関数 foo(a){ var b=a; a+b を返します。 } var c=foo(2)
問題: すべての LHS クエリと RHS を検索する
答え: LHS(c=…,a=2,b=…) と RHS(foo(2…,=a,a…,…b))