JavaScriptが従来のアプリケーション開発(コンパイル済みソフトウェア)に使用されないのはなぜですか?[閉まっている]


14

JavaScriptを使用したWeb開発の長年の間に、信じられないほど強力な言語であるという結論に達しました。

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

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

私は、この種の言語でほとんどすべてを達成できるように思えます。また、OOプログラミングをエミュレートすることもできます。

ソフトウェア指向のカスタム機能(I / O、FileSystem、入力デバイスなど)を使用すると、アプリケーションを開発するのに最適だと思います。

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

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

なぜこれまではWeb開発のみに委ねられていたのですか?ソフトウェア開発から遠ざけているのは何ですか?


8
?Web開発ソフトウェア開発(特別な場合)でない場合、それは正確に...その後、何である
ペーテルTörök

@PéterTörök:あなたはポイントを得ると思います。つまり、機能を強化するために、これまでソフトウェアによってスクリプト言語としてのみ使用されていました。OSのソフトウェアアプリケーションを実際にプログラムするために使用されたことはありません。
ホセファエティ

4
動的型付けは大きな欠点であると考えています。また、null値を取り除きたいと思います。
ジョナス

2
「ソフトウェア開発」ではなく「古典的なアプリケーション開発」を意味しますか?それに応じて、見出しをより良く変更します。
Doc Brown

2
レコードウィンドウ8の@JoseFaetiを使用すると、HTML5&JSでいくつかの開発を行うことができます
Raynos

回答:


14

最近、node.jsはサーバー側の開発を前進させました。そのため、開発用にJavaScriptを記述することが可能になりました。

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

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


そうでなければならない、と私は実際に何かが動いているように見える:)
ホセファエティ

15

ここから:

私はすべての議論を実世界のユースケースに基づいていることに注意してください。実際の、完全で、興味深い、有用なアプリケーションでの使用例でバックアップできない反論は無効です。誰もが持っている小さな「言語デモ」を見てきました。プロトタイプと動的型付けが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/)。


これは本当に興味深い投稿です。彼の議論の土台となるユースケースを見てみたいと思います。私は彼の主張に異論はありませんが、私はほぼ10年間、企業規模のJSアプリケーションを開発しており、彼が言及したことのいくつかを経験していません(特に、「これをマジック」に関する最初のポイント)。私自身の経験を続けると、この記事のようなjavascriptに対する議論は、伝統的なoopの背景が重い人々によってなされる傾向があります...その場合、彼の混乱を理解するでしょう。
JavaScript氏

2016年に、言語の進化によって答えが完全に時代遅れになったことを見るのは非常に興味深いです。
ステファンBijzitter

@氏。JavaScriptこんにちは。JavaScriptとその機能やメカニズムを調べるだけでなく、実際の問題の例を解決することに集中した一連のチュートリアルを知っていますか?キーワード検索で運がありません。たとえば、このような詳細なチュートリアルリンクとその数百万の例や機能を使用する代わりに、GUIアプリケーションを作成して保険システム、医師、学校、またはその運用部分を管理する方法に関する小さなチュートリアルのリポジトリを見つけます。スーパーマーケット?ありがとう
ジョシュア

12

どうして?

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

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

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

私はWindows 8向けのJSとHTML5の開発に注目しており、.NETコミュニティからの反応は「親愛なる神様なのか?」でした。

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

確かに、JavaScriptは「最新の開発慣行」と整合していません。私にとってJavaScriptは依然としてハッキング言語であり、vimを使って解き放ちます。インターネットは私のドキュメントです。IDE、開発ツール、オートコンプリートまたは「インテリセンス」はなく、クリックアンドドラッグGUIはありません。

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


1
「IDEがなく、開発ツールがなく、オートコンプリートまたは「インテリセンス」がなく、GUIがクリックアンドドラッグがないことを除いて、私はあなたに同意します。実際には、多くのさまざまなIDEを使用してすべてを取得できます。たとえば、Visual Studioを使用しますが、これは素晴らしいことです。
ホセファエティ

1
@JoseFaeti申し訳ありませんが、Visual Studioはjavascript IDEではありません。私はvimよりもVS2010のほうが速いです。つまり、VS2010はリークの多いJS IDEです。
レイノス

2
@Raynos、「私はVS2010よりもvimの方が速い。これは、VS2010が漏れやすいJS IDEであることを意味する。」-または、これは単にVSとvimを知らないことを単に意味します。
ペテルトレック

2
絶対にそうではありませんが、ResharperとLINQ、または薄いjQueryレイヤーを持つASP.Net MVCアプリが大好きなので、SilverlightでRIAフロントエンドを構築するつもりはありません。仕事に適しています。
sa93

1
JavaScript IDEがあることを述べる人々の合唱に私の声を追加するだけです。そうでないと主張するのは率直に言って馬鹿げている。IDEは気に入らないかもしれませんし、完璧ではないかもしれませんが、それでもIDEです。または、JSで作業するときにVSのインテリセンスとコード補完を想像していましたか?
イアンニューソン

10

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

Webの事実上のスクリプト言語であるため、人々はJSを使用してアプリケーションを構築することを考えず、常に適切なツールをジョブに使用します。

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

そうは言っても、他の人が言ったように、node.jsとそのライブラリはサーバー側の操作を簡単にし、node.jsが普及しているので、それを維持/拡張/構築できるため、CVのスキルになりますそれを使用したアプリケーション。


1
+1は、stdioライブラリの重要性を完全に忘れていました。
レイノス

1
ファイルシステムには、ローカルストレージAPIがありますが、深刻な耐久性を期待することはできません。ただし、ファイルシステムへの書き込みは直接である必要はありません。javascriptは、何らかの形式のストレージに書き込むサーバー(LOLCodeまたはCまたはJS自体で書き込まれた)に対して安静な呼び出しを行うことができます。
sa93

1
サーバー側。NodeJSファイルAPIは、Cなどのように簡単です。また、適切なラッパーを使用したAjax呼び出しは2〜3行にすることができます。MyLib.Ajax.post( '/ persistence / Something'、{data:blahObj})
sa93

@ sa93は、ブラウザのホスト環境とJavaScriptを混同しないでください。localStorageは、ブラウザーのホストAPIです。ES5仕様では定義されていません。
レイノス

1
@reinierpost Writing files to the file system has been replaced with HTTP POST.投稿を処理するAPIを作成している場合は該当しません。
StuperUser

5

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

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.