重要:
あなたは、取り除かれ、静的に型付けされたコンパイル可能なバージョンの 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 フレームワークのようなものになります。その背後にある哲学は次のとおりです。
JavaはX プラットフォームですが、それはネイティブ コードにコンパイルされておらず、仮想マシン上で実行されるためです。
最後に、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 オブジェクトのパフォーマンスをチェックするために同じブラウザーが互いに競い合った場合、ブートは反対側にある可能性があります。
調査結果についてブログ投稿を書いた後、どちらのブラウザも特定のタスクを高速化すると主張する新しいバージョン/更新をリリースしていないかどうかを確認する必要があることを忘れないでください.