4

「なぜ Javascript はネイティブ コードよりも遅いのですか?」に対する伝統的な答え。それは「解釈されているから」です。この主張の問題点は、解釈が言語そのものの性質ではないということです。実際のところ、最近ではほとんどの Javascript コードが JIT 化されていますが、それでもネイティブの速度にはほど遠いものです。

式から解釈要素を取り除き、Javascript AOT をコンパイルするとどうなるでしょうか? その場合、ネイティブ コードのパフォーマンスに匹敵するでしょうか? はいの場合、これが Web* で広く行われていないのはなぜですか? 「いいえ」の場合、現在パフォーマンスのボトルネックはどこにありますか?

新しいボトルネックが DOM である場合、それも排除するとどうなるでしょうか? DOM を使用せずにコンパイルされた Javascript は、ネイティブ コードと同じくらい効率的でしょうか? はいの場合、これが Web で広く行われていないのはなぜですか**? 「いいえ」の場合、現在パフォーマンスのボトルネックはどこにありますか?

DOM 部分と解釈部分を取り除いた後、Javascript と C/C++ の唯一の大きな違いは、前者には動的な型があるという事実です。それも削除して、DOM を使用せず、静的に型付けされ、事前にコンパイルされた Javascipt になったとします。それはネイティブコードと比べてどうですか?それが効率的であるなら、なぜこれが広く使われていないのでしょうか? そうでない場合、ボトルネックはどこにありますか? この状態では、JavaScript は C とほぼ同じです。

*JIT の方が読み込みが速いと言う人もいるかもしれませんが、これは、AOT パフォーマンスの利点が最初の AOT コンパイルの遅延に見合うだけの価値がある 3D ビデオ ゲームなどのリソース集約型の Web アプリケーションに AOT が使用されない理由を説明するものではありません。(とにかく、「ゲームの読み込み」の大幅な遅延が存在します)

**DOM を使用しない JavaScript は、WebGL/Canvas を使用してユーザーとやり取りします。これには現在、最初の HTML5 Canvas を定義する最小限の DOM が必要ですが、パフォーマンス上の利点に見合う価値がある場合は、技術を修正することで理論的にはこれを排除できます。回答する際に DOM レスの WebGL/Canvas が可能であると仮定します。

編集: クライアント側のコンパイルについて話しています。

4

4 に答える 4

4

実際、あなたの質問に答えるには、はい。または一種。もちろん、適切なコンパイラがあれば、事前に何でもコンパイルできます。

Javascript の AOT コンパイルが少し奇妙な概念であることは事実です。AOT コンパイルと 'write once run どこでも実行' は矛盾しています。なぜなら、それをコンパイルすることで、'この特定の CPU で実行したい' と言っているからです。

ただし、これにはいくつかの試みがあります。asm.js を見てください。C プログラムを作成し、いくつかの手順を経て、それを Javascript モジュールに変換します。このモジュールは Firefox によって読み込まれ、特定の方法 (ams="true" など) でタグ付けされているため、ブラウザーは事前にコンパイルを試みます。結果はほぼネイティブの速度です。ただし、コードが実行できることには非常に多くの制限があり (上記で引用したもののほとんどすべて)、アルゴリズムを除いて多くの使用例が見られません。

そうは言っても、人々が実際にやろうとしていることにあなたが触れているので、他の寄稿者の回答は過度に厳しいものだったと思います。

于 2013-11-13T21:28:48.120 に答える
0

重要:
あなたは、取り除かれ、静的に型付けされたコンパイル可能なバージョンの JS を提唱しているようです。最初に示すことは、JS が何であるかについての手がかりがないことです。それは、プロトタイプベースのオブジェクト指向、命令型および関数型プログラミングパラダイムをサポートするマルチパラダイムプログラミング言語です。重要なのは機能的パラダイムです。独自の中置演算子を定義した後に一種の強い型付けが可能な Haskell を除けば、関数型言語は知る限り静的に型付けすることはできません。クロージャーを返す C ライクな関数定義を想像してみてください。

function a = (function (Object g)
{
    char[] closureChar = g.location.href;
    Object foo = {};
    Function foo.bar = char* function()
    {//This is a right mess
        return &closureChar;
    };
}(this));

関数もファースト クラス オブジェクトです。オブジェクトを返す大量のラムダ関数を使用し、それ自体を返す可能性のある関数、他の関数、オブジェクト、またはプリミティブを参照します...一体どうやってそれらすべてを書くつもりですか? Js 関数は、スコープを作成し、コードを構造化し、プログラムの流れを制御する方法であり、変数に割り当てるものでもあります。

事前に JS をコンパイルする際の問題は非常に単純です。さまざまなプラットフォームで実行する必要があるコードコンパイルする必要があります。Windows、OSX、Linux、UNIX を実行するデスクトップ/ラップトップだけでなく、さまざまなモバイル ブラウザ...
すべてのプラットフォームで実行される JS を作成してコンパイルできたとしても、JS の速度は、シングル スレッドであり、JS エンジンで実行される (Java が VM で実行されるように) に制限されます。

クライアント側のコードのコンパイルは既に行われています。確かに時間がかかりますが、それほど時間はかかりません。これは非常にリソースを集中的に使用するため、最新のブラウザーのほとんどは、多くの前処理が既に行われているような方法でコードをキャッシュします。常にコンパイル可能なものは、コンパイル済みの状態でもキャッシュされます。V8 は、オープン ソースの高速な JS エンジンです。必要に応じて、JS コードのどの側面がコンパイルされ、どの側面がコンパイルされていないかをどのように判断するかについて、ソースを確認できます。
とはいえ、V8 の仕組みはこれだけです... JS エンジンは、コードの実行速度にもっと関係があります。非常に高速なものもあれば、そうでないものもあります。ある分野でより速いものもあれば、別の分野ですべての競争を凌駕するものもあります。詳細はこちらで読むことができます

DOM 部分を削除しても、言語から何も削除されません。DOM APIは、JS 自体の一部ではありません。JS は非常に表現力豊かですが、C と同じように、コアの小さな言語です。どちらも独自のデバイスに残された IO 機能を持っておらず、DOM を解析することもできません。そのために、JS のブラウザー実装は DOMParser オブジェクトにアクセスできます。
あなたは最小限の DOM を提案します...ねえ、あらゆる感​​覚を持つすべての人は、刷新された DOM API にすべて賛成です。それは、Web の最良の点とはほど遠いものです。ただし、DOM と JS は別個のエンティティであることを認識しておく必要があります。DOM (および DOM API) は W3 によって管理されますが、ECMA は JS を担当します。お互いに何の関係もありません。DOMを JS から「剥ぎ取る」ことができないのはそのためです。最初から DOMの一部ではありませんでした。

JS を C++ と比較すると、Windows と Linux マシンの両方でコンパイルできる C++ コードを記述できますが、それは思ったほど簡単ではありません。しかし、C++ についてご自身で言及されているので、それについてもご存知かと思います。
そういえば、C++ と JS の違いが静的型付けと動的型付けだけである場合は、JS についてもう少し時間をかけて学習する必要があります。

その構文は C に似ていますが、言語自体は Lisp と多くの類似点を共有しています (つまり、関数型プログラミング)。クラス自体はわかりませんが、プロトタイプを使用しています...正直に言うと、動的型付けはそれほど大したことではありません。

つまり、
すべてのマシンで実行するように JS をコンパイルすると、MS の .NET フレームワークのようなものになります。その背後にある哲学は次のとおりです
JavaX プラットフォームですが、それはネイティブ コードにコンパイルされておらず、仮想マシン上で実行されるためです。
最後に、ECMAScript 標準 (JS がその最も一般的な実装です) はそれほど優れたものではありません。これは、この分野のすべての大きな競合他社 (Mozilla、Google、Microsoft、および無関係のスイス企業) の共同作業の結果です。それは 1 つの大きな妥協です。これら 3 つのビッグ ネームが JS 用のコンパイラを一緒に作成することに同意したと想像してみてください。MicrosoftはJScriptコンパイラを発表する最良の方法として、Google には独自のアイデアがあり、Mozilla には、コミュニティが何を望んでいるかに応じて、おそらく 3 つの異なるコンパイラが用意されているでしょう。

編集:
クライアント側の JS について話していることを明確にして、編集を行いました。それを指定する必要性を感じたので、JS がどこで終わり、ブラウザがどこで引き継ぐのか完全にはわからないように感じます。
JS は非常に移植性の高い言語として設計されました。IO 機能がなく、複数の開発パラダイムをサポートし、(最初は) 完全に解釈された言語でした。確かに、Web を念頭に置いて開発されましたが、この言語を使用してデータベース (MongoDB) をクエリしたり、代替のバッチ スクリプト言語 (JScript)、またはサーバー側スクリプト言語 (バックボーン、 node.js、...)。ECMAScript (JS の基本標準) を使用して独自のプログラミング言語を作成する人もいます (はい、Flash ActionScript について話しています)。

ユースケースに応じて、JS には、言語にネイティブではないオブジェクト/API へのアクセスが与えられます (それぞれdocument、DOM アクセス、Web サーバー機能、および IO の 、 )。言語自体ではなく、これらがボトルネックになることがよくあります。[Object http].createServer[Object file].readFileSync

ほのめかしたように、JS は当初、インタープリター言語でした。最近のやり方と同様に、正直に言うと、コンパイル言語とインタープリター言語の間の境界線は、過去 10 年間で薄れてきています。
C/C++ は以前は厳密にコンパイルされた言語でしたが、場合によっては (.NET) C++ コードをマシン コードにコンパイルする必要がなくなりました...
同時に、Python などのスクリプト言語は非常に多くの目的で使用されています。スクリプト言語という用語は、どういうわけか「下位言語」を意味するため、一般的にプログラミング言語として認識されています。
数年前、PHP5 のリリースに伴い、ZendEngine2 もリリースされました。それ以来、PHP はバイトコードにコンパイルされ、仮想マシン上で実行されます。APC を使用してバイトコードをキャッシュできます。bcompiler を使用すると、PHP を C++ にコンパイルしてからネイティブ コードにコンパイルするために使用される Facebook の HPHPc (非推奨) と同様に、PHP コードからスタンドアロンの実行可能ファイルを生成できます。現在、facebook はカスタム仮想マシンである HHVM を使用しています。詳細はこちらをご覧ください

JavaScript インタープリター (現在はエンジンと呼ばれています) にも同じ進化が見られます。あなたがまだそう思っているように、それらはあなたの日常的な解析と実行の古いスレッドではありません。メモリ管理、JITCompilation (テール スタックの最適化も)、最適化など、多くの魔法が行われています。
すべて素晴らしいことですが、実際のボトルネックがどこにあるかを判断するのはかなり困難です。各エンジンが最適化する方法は、IE6 が IE10 と異なる以上に異なるため、ボトルネックを明確に特定することはほぼ不可能です。あるブラウザで DOM 集中型タスクに 10 秒かかる場合、別のブラウザでは 1 ~ 2 秒しかかからないことがあります。ただし、RegExp オブジェクトのパフォーマンスをチェックするために同じブラウザーが互いに競い合った場合、ブートは反対側にある可能性があります。
調査結果についてブログ投稿を書いた後、どちらのブラウザも特定のタスクを高速化すると主張する新しいバージョン/更新をリリースしていないかどうかを確認する必要があることを忘れないでください.

于 2013-05-04T17:27:56.777 に答える
-1

すべてがパフォーマンスに関するものではなく、パフォーマンスは依然として能力に次ぐものです。まず、Web サイトを作成できるようにするための言語 (re: javascript) を用意してから、言語を改善します。JS から DOM 操作を取り除き、ネイティブ コードにコンパイルする場合、Web には何を使用しますか? javascript が存在し、Web で C/C++ を使用していない理由の 1 つは、これには DOM 操作を行う機能があり、マシン固有の形式にコンパイルする必要がないため、普遍的に実行できるからです。

その上、DOM操作が取り除かれ、静的に型付けされ、事前にコンパイルされたjavascriptの名前があります:それはJavaです:)

あなたの質問は、パフォーマンスがはるかに優れているのに、なぜ Web サイトに Java を使用しないのかということです。考えてみてください。いつの日かそこに着くでしょうが、まだです。

于 2013-05-04T16:45:32.503 に答える