私はすべての議論を実世界のユースケースに基づいていることに注意してください。実際の、完全で、興味深い、有用なアプリケーションでの使用例でバックアップできない反論は無効です。誰もが持っている小さな「言語デモ」を見てきました。プロトタイプと動的型付けがC#の場合よりも数行短くなる些細な小さな例をどのように詳細に説明するブログ投稿を見てきましたが、それらは単に関連していませんあなた
がマイクロデモやおもちゃではなく、実際のコードを書くことに遭遇する問題に。JSに対する私の不満は次のとおりです。
a)魔法の「これ」。これがそうである場合を除いて、これはこれです。JavaScriptは、すべての場所で匿名関数を使用するようにプッシュしますが、「this」変数の適切なコンテキストが常に失われるため、「var _this = this」のような間抜けなコードがすべての場所にあり、それを使用することになります。コールバックまたは他の関数内。名前を変更した「this」を使用しない、作成する関数の数は実際にある数よりも少ないと誓う日もあります。
b)1 + "1"-1 =10。また、 "1" + 0 = "10"。はい、これは実際にアプリケーションのバグを引き起こしました。別のアプリケーションのバグが原因で、数値になると予想されるデータが文字列としてJSONファイルからロードされ、結果は良くありませんでした。すべてのロードコードを更新して、あらゆる場所で大量の型変換を追加する必要がありました。何かを数字にする必要があるとき、文字列やオブジェクト、nullなどではなく、数字にすることを絶対に欲しがっています。ほとんどの点でJavaScriptに非常によく似ているLuaは、加算と文字列の連結に同じ演算子を使用するのに十分な遅延がないため、この問題を修正しました。
c)デフォルト変数によるグローバル。そのため、変数宣言について考える必要がないため、動的型付けは「簡単」であるとの引数をとったとしても、JavaScriptは、「var」をすべての場所の新しい識別子の前に置くことにより、その引数をウィンドウから捨てます。そして、忘れると静かにねじ込まれます。
d)クラスの代わりにプロトタイプ。独自のクラスシステムをプラグインしない大規模な実世界のJavaScriptアプリケーションは、大規模なアプリケーションアーキテクチャのプロトタイプの固有の無用性を回避するためにごくわずかしか存在しません。これらの同じアプリはプロトタイプを最小限に使用して基本JavaScript型を拡張しますが、これはJSの設計があまりにも不十分であり、付属する2つの興味深い組み込み型でさえ、期待する機能の半分が不足しているためです。
e)値渡し型を作成できない。これは、実際には、C ++ / D以外のほぼすべての言語で頻繁に発生する問題です。JavaScriptを使用してWebGLアプリを作成する場合は、JavaScriptのすべての線形代数ライブラリをご覧ください。3Dアプリでは、スカラーを使用するよりもベクトルを使用する頻度が高くなります。「a = 1; b = a; b ++」がaとbの両方を2に等しくするように、アプリ内のすべての整数が参照渡しされた場合を想像してください。小さな3つのコンポーネントベクトルはすべて完全なオブジェクトです。それらは参照によって渡されます(実際、これまでのWebGLゲームのバグのほぼ半分のソース)。それらは大量に存在し、ヒープに割り当てられ、ガベージコレクションされます。これにより、GCに大きな圧力がかかり、単純なWebGLゲームでもGCが一時停止する可能性があります。開発者が途方もなく複雑なフープを飛び越えて、新しいベクターを作成することが論理的に必要なすべての場所で新しいベクターを作成しないようにする場合を除きます。演算子をオーバーロードすることはできないため、基本的な操作を行うための非常に大きくて見苦しい式があります。個々のコンポーネントへのアクセスが遅い。オブジェクトはネイティブにパックされていないため、Float32Arrayインスタンスとして実装しない限り、頂点バッファーへのプッシュが非常に遅くなります。参照渡しであることを述べましたか?個々のコンポーネントへのアクセスが遅い。オブジェクトはネイティブにパックされていないため、Float32Arrayインスタンスとして実装しない限り、頂点バッファーへのプッシュが非常に遅くなります。参照渡しであることを述べましたか?個々のコンポーネントへのアクセスが遅い。オブジェクトはネイティブにパックされていないため、Float32Arrayインスタンスとして実装しない限り、頂点バッファーへのプッシュが非常に遅くなります。参照渡しであることを述べましたか?
f)組み込みの機能は含まれていません。まじで、まだ。サードパーティのライブラリは存在しますが、ほとんどすべてに何らかのバグがあります。少なくとも、少なくともChromeでの混乱を招くキャッシュの問題であり、実際の開発を行うのは大変です。
g)動的型付け。はい、その議論を始めたいと思います。小さなWebアプリやWebページの作成をやめ、1回のマウスクリックまたは要求/応答サイクルよりも長く続くデータを実際に保持している大きなアプリの作成を開始すると、すぐに気付き始めます。後で処理し、実際のミスがあった場所とはまったく異なるコードの欠落しているメソッドまたはメンバーから後でクラッシュする配列 楽しい時間。はい、Javaは静的型付けを邪悪に思わせます。いいえ、Java / C#/ C ++は静的型付けを行う唯一の方法ではありません。型推論、暗黙的なインターフェイスバインディングなどは、すべてのバグなしで動的型付けの「扱いやすく、多くのキーストロークではない」利点をすべて提供します。2番目に人気のあるWeb言語であるActionScript 3は、実際には静的に型付けされていますが、それ以外はJS / ECMAScriptと同一です。余談ですが、FedoraデスクトップのPythonアプリからのクラッシュは、C / C ++アプリからのクラッシュよりも多くなります(実際、私のデスクトップのC / C ++アプリはクラッシュしません。不足しているメンバーの例外==アプリの開発と保守がずっと簡単になりましたよね?
h)スピード。はい、JSを単一の大学ジュニアが書くことができる低グレードCコンパイラのほぼ半分の速度にするために、言語ランタイムに投入された多数の超悪意のある開発者によって途方もなく莫大な努力が行われましたヶ月。また、LuaJITは、基本的な言語の制限という点ではJSと同じ役割を果たしていますが、いずれにせよ、すべてのJavaScript実装よりも優れた成果を上げています。V8またはそのような中、すべてのJSの最適化が実際に何を理解していない人々ありませんJSは驚くほど高速に処理できると主張したいのですが、現実には、これらの最適化はすべて、基本的に「コードを分析して変数の型を把握し、少し遅延した静的型付けのようにコンパイルするのが非常に困難です」言語のコンパイラがそれを行うでしょう。」ああ、トレースはありますが、トレースは静的に型付けされた言語でも機能します(生成されたマシンコードにタイプガードが必要ないため、よりうまく機能します)。実際、これらのwhizbang最適化の1つは、JSによってまたはJSのために発明されたものではありません。ほとんどは研究用JVM(Javaは悪!)または古典的なOOP言語(プロトタイプは素晴らしい!)から取得されました。
i)IntelliSenseが不可能です。テキストエディタでfoo.jsの187行目にある変数にどのメソッドが存在するかを確認したいですか?残念な。初期化された場所がわかるまでコードをトレースしてから、コードをトレースして、そのプロトタイプがコード上にあるものを見つけます。そして、背後にあるプロトタイプを動的に変更するコードがないことを願っています。実際、ブラウザで実行してブレークポイントを設定するだけです。JavaScriptの専門家がJavaScriptの使いやすさとシンプルさを賞賛するために使用するtoy_web_app.htmlサイトよりも大きなコードベースでは、他の方法で値に関する有用な情報を見つけることは基本的に不可能です。いくつかのコードエディタは試す本当に良く行うのは難しい、とほとんどちょっと、本当に単純なケースのために成功し、時々 、一度みかん。
j)利点はありません。JavaScriptは、他の動的に型付けされた言語と比較しても特別ではありません。Lua、Python、Rubyなどではできない興味深いことはまったくできません。JS実装はどれも、LuaJIT、PyPy、または他の動的な他のさまざまな高度なJIT-ing実装よりも高速ではありません。言語。JSには、他の一般的に利用可能な言語と比べてプラス面はありません。ああ、プラグインなしでWebブラウザでネイティブに実行することを除いて。世界でこれほど人気がある唯一の理由です。実際、それがイベントが存在する唯一の理由です。10年前に誰かが「今、NetScapeが思いついたこの間抜けな小さなハックジョブを誰もが使用する代わりに、既存の適切に設計され確立された言語をブラウザにドロップして、他の人に同じことをさせましょう」 、」ウェブは今日、はるかに異なった(より良い)外観になります。Chromeがサポートされている言語としてPythonをChromeにドロップした場合の未来を想像してください。または、実際にこれを想像してください:Googleは、C / C ++をサポートされている言語としてChromeにドロップします(http://code.google.com/p/nativeclient/)。