この記事では、JavaScript などの非常に動的な言語に加えて、プロトタイプの継承に起因する最適化の問題について言及しています。
Ruby や JavaScript などの言語では、プログラムの構造が実行時に変化する可能性があります。クラスは新しいメソッドを取得でき、関数は eval() で存在することができます。これにより、構造が設定されることが保証されないため、ランタイムがコードを最適化することが難しくなります。
プロトタイプの継承は、従来のクラスベースの言語よりも最適化が困難です。これは、クラスベースの VM に関する長年の研究と実装の経験があるためだと思います。
興味深いことに、V8 (Chrome の JavaScript エンジン) は最適化戦略の一部として隠しクラスを使用します。もちろん、JS にはクラスがないため、V8 ではオブジェクトのレイアウトがより複雑になります。
V8 のオブジェクト レイアウトでは、ヘッダーに最低 3 語が必要です。対照的に、Dart VM はヘッダーに 1 語しか必要としません。Dart オブジェクトのサイズと構造は、コンパイル時に認識されます。これは、VM 設計者にとって非常に便利です。
別の例: Dart には、実際のリスト (別名配列) があります。固定長のリストを使用できます。これは、JavaScript の実際には配列ではなく、常に可変長であるよりも最適化が容易です。
このプレゼンテーションで Dart (および JavaScript) を効率的なコードにコンパイルする方法について詳しくは、http ://www.dartlang.org/slides/2013/04/compiling-dart-to-effective-machine-code.pdf をご覧ください。
もう 1 つのパフォーマンスの側面は、起動時間です。Web アプリが複雑になるにつれて、コードの行数が増えます。JavaScript の設計では、コードの解析と読み込みによってコードも実行されるため、起動の最適化が難しくなっています。Dart の言語は、解析が迅速に行えるように慎重に設計されています。Dart は、ファイルをロードして解析するときにコードを実行しません。
これは、Dart VM が解析済みファイルのバイナリ表現 (スナップショットと呼ばれる) をキャッシュして、起動をさらに高速化できることも意味します。