web-dev-qa-db-ja.com

JavaScriptが従来のアプリケーション開発(コンパイルされたソフトウェア)に使用されないのはなぜですか?

JavaScriptを使用したWeb開発の長年の間に、私はそれが信じられないほど強力な言語であり、あなたはそれで驚くべきことを行うことができるという結論に達しました。

次のような豊富な機能セットを提供します。

  • 動的型付け
  • ファーストクラスの機能
  • 入れ子関数
  • 閉鎖
  • メソッドとしての機能
  • オブジェクトコンストラクターとしての機能
  • プロトタイプベース
  • オブジェクトベース(ほとんどすべてがオブジェクトです)
  • 正規表現
  • 配列およびオブジェクトリテラル

ほとんどすべてがこの種の言語で実現できるように思えますが、OOプログラミングをエミュレートすることもできます。これは、優れた自由と多くの異なるコーディングスタイルを提供するためです。

よりソフトウェア指向のカスタム機能(I/O、ファイルシステム、入力デバイスなど)を使用して、アプリケーションを開発するのは素晴らしいことだと思います。

ただし、私の知る限り、Web開発または既存のソフトウェアではスクリプト言語としてのみ使用されています。

最近になって、おそらくV8エンジンのおかげで、他の種類のタスクでより多く使用されています(たとえば、node.jsを参照)。

なぜ今まで、それはウェブ開発だけに委任されているのですか?ソフトウェア開発からそれを遠ざけているのは何ですか?

14
Jose Faeti

最近 node.js はサーバー側の開発を前進させました。そのため、開発用にJavaScriptを作成できるようになりました。

それは本当だ。歴史的には、開発言語としては使用されていません。ただし、クライアント環境(ユーザーエージェント)でのスクリプト作成も一種の開発です。だよね?

私が多くのウェブログで聞いて読んだ主な理由は、人々がその力と独自性について最近まで知らなかったということです。これが起こったのは、おそらく他の言語が十分にうまく機能していて、誰かが何かを並行させることを考えたことがないためかもしれません。

14
Saeed Neamati

ここ から:

私はすべての議論を実際のユースケースに基づいていることに注意してください。実際の、完全で、興味深く、有用なアプリケーションでの使用例でバックアップできない反論は無効です。私は他の誰もが持っている小さな「言語デモ」を見てきました。プロトタイプと動的タイピングがC#の場合よりも数行短いコードの例を数行短くする方法を詳しく説明しているブログ投稿を見ましたが、それらは単に関連性がありませんマイクロデモやおもちゃではなく、realコードの記述で発生する問題に。だからここにJSの私の不満があります:

a)魔法の「これ」。これがそれである場合を除いて、これはこれです。 JavaScriptは、あらゆる場所で匿名関数を使用するように強制しますが、それらは常に「this」変数の適切なコンテキストを失うことになり、「var _this = this」のような間抜けなコードがすべての場所で発生し、それを使用することになりますコールバックまたは他の関数の内部。名前を変更した 'this'を使用しないで作成した関数の数が実際に使用する数よりも少ないことを誓います。

b)1 + "1"-1 =10。また、 "1" + 0 = "10"。はい、これは実際にアプリケーションにバグを引き起こしました。別のアプリケーションのバグが原因で、数値であると予想されるデータがJSONファイルから文字列として読み込まれ、結果は良くありませんでした。すべての読み込みコードを更新して、至る所に大量の型変換を追加する必要がありました。何かを数値にする必要があるとき、文字列やオブジェクト、nullなどではなく、絶対に数値にしたいのです。 Luaは、ほとんどの点でJavaScriptに非常に似ていますが、加算と文字列の連結に同じ演算子を使用するだけの遅延が生じないようにすることで、この問題を修正しました。

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が一時停止する可能性があります。新しいベクトルを作成することが論理的であるすべての場所で新しいベクトルを作成しないでください。演算子をオーバーロードすることはできないため、基本的な操作を実行するための非常に大きくて醜い式があります。個々のコンポーネントへのアクセスは低速です。オブジェクトはネイティブにパックされていないので、V8とSpiderMonkeyの両方のオプティマイザーのがらくたを混乱させるFloat32Arrayインスタンスとして実装しない限り、頂点バッファーへのプッシュは非常に遅くなります。参照渡しされていることについて言及しましたか?

f)組み込みのインクルードや機能は必要ありません。真剣に、まだ。サードパーティのライブラリは存在しますが、それらのほとんどすべてに何らかのバグがあり、少なくともその少なくともChromeでのキャッシュの混乱の問題が原因です)。

g)動的型付け。はい、私はその議論を始めたいと思っています。小さなWebアプリまたはWebページの書き込みを停止し、1回のマウスクリックまたは要求/応答サイクルよりも長く存続するデータがある実際に大きなアプリの作成を開始する2番目に、それを認識し始めます。間違った種類のオブジェクトを配列を後で処理し、実際のミスがあった場所とは完全に異なるコードのコードの欠落したメソッドまたはメンバーから後でクラッシュを取得します。楽しい時間。はい、Javaは静的型付けを悪に見えるようにします。いいえ、Java/C#/ C++は静的型付けを行う唯一の方法ではありません。型推論、暗黙的なインターフェースバインディングなどにより、すべてのすべてのバグのない動的型付けの「扱いが簡単で、キーストロークが少ない」利点2番目に人気のあるWeb言語であるActionScript 3は、JS/ECMAScriptと同じであるにもかかわらず、実際には静的に型付けされています。余談ですが、C/C++アプリよりも、Pythonアプリ上のFedoraデスクトップ上のアプリの方がクラッシュします(実際、デスクトップ上のC/C++アプリはどれもクラッシュしませんが、私はそれについて考えます)欠落しているメンバーの例外==アプリの開発と保守がはるかに簡単ですよね?

h)スピード。はい、JSを1人の大学ジュニアが数個書ける低級Cコンパイラのほぼ半分の速度にするために言語ランタイムに投入された多数の超悪尻開発者による途方もなく莫大な努力がありましたヶ月。そしてLuaJITは基本的な言語制限の点ではJSと同じボートにいますが、とにかくすべてのJavaScript実装よりもうまく機能しています。 V8でのすべてのJS最適化を実際に理解していない人doは、JSがスピード的に素晴らしいことを行えると主張していますが、実際には、これらすべての最適化は基本的に「変数の型を理解するためにコードを分析し、わずかに遅延された静的型付き言語のコンパイラが行うようにコンパイルする」ことだけです。ああ、そしてトレースがありますが、トレースは静的に型付けされた言語でも機能します(生成されたマシンコードに型ガードが必要ないため、より効果的です)。実際、これらのwhizbang最適化の1つがJSによって、またはJSのために発明されたわけではありません。ほとんどは、研究用JVM(Javaは悪です!)または古典的なOOP言語(プロトタイプは素晴らしいです!).

i)IntelliSenseは不可能です。テキストエディターのfoo.jsの187行目にあるその変数にどのメソッドが存在するかを確認したいですか?残念な。初期化された場所がわかるまでコードをトレースし、次にコードをトレースして、プロトタイプのコードを調べます。そして、あなたの後ろでプロトタイプを動的に変更するコードがないことを願っています。実際、ブラウザで実行してブレークポイントを設定するだけです。JavaScriptの専門家がJavaScriptの使いやすさとシンプルさを美化するために使用するtoy_web_app.htmlサイトよりも大きなコードベースでは、他の方法で値に関する有用な情報を見つけることは基本的に不可能だからです。一部のコードエディターはreallyを上手く実行するのに一生懸命に取り組んでおり、ほんの少し単純なケースでは、たまに一度成功します。

j)利点はありません。 JavaScriptは、他の動的に型付けされた言語と比較しても特別ではありません。 Lua、Python、Rubyなどでは実行できないような興味深いことはまったく行えません。JS実装は、LuaJITやPyPy、その他の動的な他のさまざまな高度なJIT実装よりも高速ではありません。言語。 JSには、他の一般的に利用可能な言語と比較して、それにプラス面はありません。ああ、それはプラグインなしでWebブラウザーでネイティブに実行されることを除いて。それが世界でそれがとても人気がある唯一の理由です。実際、それがイベントが存在する唯一の理由です。 10年前の誰かが「まあ、NetScapeが思いついたこの間抜けな小さなハックジョブをみんなに使わせる代わりに、既存のうまく設計され確立された言語をブラウザーにドロップし、他の人たちにも同じことをさせましょう。 」と、今日のWebは大きく異なる(より良い)ように見えます。 Chrome drop Python into Chrome= is supported language。 C/C++をChromeをサポートされる言語として(http://code.google.com/p/nativeclient/)に)。

15
17 of 26

どうして?

JavaScriptが最も誤解されている言語

私たちは暗黒時代にいましたが、JavaScriptは強力で用途の広い言語であることを、一般の開発コミュニティが受け入れるようにしています。それは単に主流ではありません。

最近の唯一の進歩は、node.jsが話題になり、人々がJavaScriptが他の用途を持っていることを受け入れ始めていることです。

私はWindows 8向けのJS&HTML5開発に目を光らせており、.NETコミュニティからの反応は「どうしてですか?」.

ほとんどの非Web開発者がJavaScriptをブラウザのメニューをスクロールするために使用するおもちゃの言語であると見なしているのは事実です。

確かに、JavaScriptは「最新の開発手法」と一致していません。私にとって、JavaScriptはまだハッキング言語であり、vimで取り除きます。インターネットは私のドキュメントです。 IDE、開発ツール、オートコンプリート、「インテリセンス」、クリックアンドドラッグGUIはありません。

Javaおよび.NET開発者の世界では、GUIとIDEに慣れており、vimでプログラミングすることはできません。

12
Raynos

リストには、ソフトウェア開発の大部分を占めるシステムへのファイルの書き込みに関する情報は含まれていません。

JSを使用してアプリケーションを構築することは、Webのデファクトスクリプティング言語であるため、人々はそのことを考えないでしょう。

それがJava/.NET/C/C++で簡単な操作であるのに、なぜファイルを書き出すためにJSのエーカーを書き込むのですか?

そうは言っても、他の人が述べたように、node.jsとそのライブラリーはサーバー側の操作を簡単にし、node.jsが一般的になるにつれて、CVのスキルになることを学ぶことができます。それとのアプリケーション。

10
StuperUser

一般的に使用されているほとんどの言語はJavaScriptよりも強力で設計が優れていますです。あなたが言及するすべての機能は、PythonまたはRuby)のような他の動的言語によってサポートされています。これらは全体的に優れた設計になっています。また、言及する機能のいくつかは必ずしも望ましいものではありませんとにかく、多くの人は、選択肢があれば、動的型付けよりも型推論の方が望ましい静的型付けを検討します。

JavaScriptを無効にするためにこれを言っているのではありません。私はWebを開発するときにJSを使用することをとても楽しんでいます。しかし、客観的に見ると、JSには他の言語と比較して多くの欠点があります。

  • 多数の修正不可能な欠陥。 JSを最初に開発したときに多くの間違いがありました。ここで列挙する必要はありません。それらは十分に文書化されています。すべての言語の初期設計に誤りがあり、後で修正されます。 JSとの違いは、言語が開発されてすぐにリリースされ、ブラウザの後方互換性の要件のためにこれらの誤りを修正できないことです。
  • 改善と新機能を導入するための非常に遅いプロセス。すべてのブラウザーベンダーは同意する必要があるため、さまざまな政治的理由でさえ、言語の開発を遅らせたいと考えている場合があります。実際にはJSよりも新しい言語であるC#を見てください。 C#が導入されたとき、それは例えばありませんでした。クロージャーまたはJSのような高次関数ですが、複数回の反復の後、それはすべてそれだけでなく、LinqやJavaScript開発者がうらやむことのできる非同期構文などの機能を備えています。
  • 貧弱な標準ライブラリ。 Pythonのような現代の言語、RubyまたはJavaまたは.netに基づくものには、必要なほぼすべてのもののための広範な標準ライブラリがあります。JSでは、サードパーティのライブラリなしでファイルを読み取ります。Regexについて言及しますが、現代のすべての言語には、それだけでなく、1,000以上の機能があります。
  • 他の言語は、JavaScriptのいくつかの利点に追いついています。 10年前のJava=のような不格好な静的言語と比較すると、クロージャーやファーストクラス関数などの機能は強力でしたが、動的言語や関数型言語には長い間これらの機能があり、Javaでもかなり保守的でした言語、これをJava 8.で追加しました。

JavaScriptを他の最新の言語と区別する唯一の機能は、(クラスベースではなく)プロトタイプベースの継承であり、このモデルの利点は、とにかく誰もがクラスベースの継承をエミュレートするために使用するだけなので、疑わしいです。

別の現代言語を選択するオプションがある場合、JavaScriptを選択する理由はありません。唯一の理由は、それがあなたが知っている唯一の言語だった場合です。

5
JacquesB