6

v8ツリーを参照すると、ディレクトリの下srcいくつかの js ファイルがあり、Math、Array などの基本的な JS オブジェクトを提供していました。これらのファイルを参照すると、名前にパーセント記号 (%) を含む識別子が表示されました%Foo。最初は単純に JS の識別子で許可されている別の文字だと思っていましたが、シェルで試してみると、構文規則に違反していると怒鳴られました。しかし、それが構文エラーである場合、d8 はどのように機能するのでしょうか? 実際のソース コードの例を次に示します。

src/apinatives.js 44 行目から 47 行目、github/v8/v8 からの git clone

function Instantiate(data, name) {
  if (!%IsTemplate(data)) return data;
      var tag = %GetTemplateField(data, kApiTagOffset);
      switch (tag) {

src/apinatives.js 41 行目から 43 行目、github/v8/v8 からの git clone

function SetConstructor() {
  if (%_IsConstructCall()) {
    %SetInitialize(this);

この識別子で構文エラーが発生しないのはなぜですか。math.js と string.js およびその他すべてを含むすべての js ファイル?:wq

4

1 に答える 1

19

技術的に有効なJavaScriptではありません。これらはV8ランタイム関数の呼び出しです。そのページから:

JavaScriptライブラリの多くは、JavaScriptから呼び出し可能な最小限のC ++ランタイム関数のセットを使用して、JavaScriptコード自体に実装されています。これらの一部は、%で始まる名前を使用し、フラグ「--allow-natives-syntax」を使用して呼び出されます。その他は、コードジェネレーターによって生成されたコードによってのみ呼び出され、%構文を使用してもJSには表示されません。

調べると、パーサーがランタイムとの対話に使用しているJavaScript言語へのこの拡張を受け入れるかどうかを決定するにparser.cc関連するコードが表示されます。allow_natives_syntaxこれらのファイルは、そのオプションを有効にして解析する必要があります。

V8では、JavaScript標準と矛盾するため、また、実行可能ではないはずのランタイムに対して実行できる可能性があるため、デフォルトではこれらの呼び出しを実行できないと推測されます。

于 2013-02-13T21:42:38.967 に答える