動的型付け言語はすべての批判に値しますか?[閉まっている]


35

企業でのプログラミング言語の選択に関するインターネット上の記事をいくつか読みました。最近、Ruby、Python、PHP、Erlangなど、多くの動的型付け言語が普及しています。しかし、多くの企業は、C、C ++、C#、Javaなどの静的型付き言語を引き続き使用しています。

そして、はい、静的型付き言語の利点の1つは、プログラミングエラーが実行時ではなくコンパイル時に早く検出されることです。しかし、動的型付け言語には利点もあります。(ウィキペディアの詳細

企業がErlang、Ruby、Pythonなどの言語を使用し始めない主な理由は、それらが動的に型付けされているという事実のようです。それが、StackOverflowの人々がErlangに反対する決定をする主な理由でもあるようです。Erlangに「反対」と決めた理由をご覧ください。

しかし、企業における動的型付けに強い批判があるように思えるが、それは、なぜ私は本当にそれを取得しないことに強いです。

本当に、なぜ企業では動的型付けに対してそれほど多くの批判があるのですか?それは本当にプロジェクトのコストにそれほど影響しますか、それとも何ですか?しかし、多分私は間違っています。


3
型推論と可能なカモタイピングを使用した静的タイピングは、物事を行うための可能な限り最良の方法だと思います。また、非常に複雑です
-Casebash

2
C#のアヒルのタイピング(言語は使用していません)を確認しましたが、アヒルのタイピングの定義を完全に満たしているように見えますが、必要な冗長性は目的に反しているようです。ただし、それが時折役に立たないというわけではありません。
チンメイカンチ

3
それは私だけですか、動的に型付けされた言語よりも静的に型付けされた言語に対する批判がありますか?また、私の経験では、大規模な「企業」の言語/技術の選択は、実際の技術的なメリットではなく、現在の傾向/安全な選択によって決定されるようです。
MAK

2
@ChinmayKanchi:冗長性?あなたは何かを宣言しdynamic、それを使い始めます。通常のメソッド呼び出しや演算子のオーバーロードほど冗長ではありません。
ジョーイ

4
GrailsコードでGroovyのデバッグエラーを現在の会社で無駄にした時間を数えることはできません。Javaを使用した場合、コンパイラはすぐにそれを検出するでしょう。
WKS

回答:


46

はい、そうだと思います。

新しいプロジェクトの言語を選択する際に考慮する必要があるいくつかの理由があります。

  • 実行時の速度。C / C ++ / Fortranと比較すると、PerlとPythonは非常に遅いためおかしいです。
  • 初期化速度。上記の高速言語と比較して、JVMがロードとロードを続けると、Javaは転倒して泣きます... while(1)....
  • プロトタイプ能力。C ++またはJavaに必要な宣言/定義の作業を徹底的に実行すると、LOCが増加します。これは、バグカウントと確実に相関する唯一の既知のメトリックです。また、多くの時間がかかります。また、タイプと接続についてもう少し考える必要があります。
  • 内部適合性。自己修正コードのデバッグを開始するまで、内部を動的にいじることは素晴らしいことです。(Python、Lisp、Perl)
  • 正当性の検証。コンパイラーは、C ++でのコードの準正確性の1回限りの迅速なパスを提供できます。これは非常に便利です。
  • 静的分析の詳細。CとJavaの静的解析は非常に優れています。Perlは理論レベルで完全に静的に分析できるわけではありません(おそらくPythonも)。Lispもそうではないと確信しています。
  • 一般的に、奇妙なプラットフォームはCのみを取ります。
  • サポートチェーン。あなたがいることを契約することができた場合になるのです、あなたのバグが見て、上の仕事を取得し、巨大なの

あなたが作業している組織は、「今後」の原則を持っていることを推測することができた場合(このための会計用語があります)、そしてません。ただ、ランダムにソフトウェアのない仕事に決定し、その後、あなたはのためのより良いケースを持っていますソフトウェアを使用して。Python / Perl / $ dynamic_language のメジャービジネス販売(メンテナンスの責任を負わせることを意味する)がないため、リスクが大幅に削減されます。

私の経験では、オープンソースのメンテナーは多くの場合、バグ修正とアップデートのリリースについて完全に責任を負うことに問題があります。「無料です、あなたはそれに取り組みます!」は、ほとんどのビジネスで受け入れられる答えではありません(特に、中核的な能力ではありません)。

もちろん、私はwebapp / startupの世界について話しているのではありません。webapp/ startupの世界は、高リスク/高報酬のルールで遊ぶ傾向があり、技術の泡立つエッジにとどまることに非常にオープンです。


16
「無料です、あなたはそれに取り組みます!」<-一般的にF / OSSで最も大きな問題、+ 1はしたが、投票はしていません:(
ビリーONeal

4
いい要約。よく構築された型に意味の意味を伝えます(型を見て、それが何をするのか、どのように使用できるのかを理解できます)そして、正確さを強制するために使用できます(制約されたinpusのみを受け入れる型を構築できます) )、タイプミスから愚かなエラーは表示されません(自動変数宣言は嫌いです)
-smithco

4
主要なオープンソースプロジェクトの商用サポートを受けることができます。大企業は大部分(適切なものを確認)に動的に型付けされたPLを使用し、FacebookはPHP(UI)とErlang(チャット)を使用し、TwitterはRuby(UI)を使用し、GoogleはPython(私は知らない)とLispとPythonを使用します多くの洗練された研究プロジェクトで使用されています。注:私は(ほとんど)動的に型付けされた言語を使用したことのないC#開発者です。しかし、これらの点はかなりの範囲で有効ではありません。
カベシャーバジアン

4
あなたの答えは好きですが、Javaは動的に型付けされていません
...-Mehrdad

2
@PaulNathan:考えすぎです。質問は動的に型付けされた言語について尋ねていましたが、この回答ではJavaが動的に型付けされているかのように言及しています。
Mehrdad

24

エンタープライズの意思決定者に技術的信用を与えすぎています。「IBMの買収で解雇された人はいませんでした」という古い格言があります。別のルートに進み、物事が不安定になった場合(常にそうなります)、誰も非難されることを望みません。標準に固執し、他の誰かを責める。

最終的に明日の企業になり、それらの言語を使用する若い企業がたくさんあります。

また、VBAで記述された大量のコードを忘れないでください!


1
「...明日の企業は[そして]これらの言語を使用する」ために+1。
rdmueller

6
「将来的には明日の企業になり、それらの言語を使用する若い企業がたくさんあります。」:動的言語はかなり新しく、より多くの企業に採用される時間が必要であると思われるようです。一方、動的言語はすでに長い間存在しています。
ジョルジオ

17

企業がC、C ++、C#、およびJavaを使用する理由は、静的に型付けされている(少なくとも直接ではない)ためではありません。企業の意思決定者は、型システムの客観的な比較に基づいてこの種の選択を行っているわけではありません。

企業は次のことを気にします:

  • 長期的なメンテナンスコスト:10年後もうまく機能し続けると合理的に期待できますか?言語の進化が保守的であり、下位互換性がある場合(Javaの場合)、実際には良いことです。静的タイピングは、本番システムに入る前にコンパイル時に主要なタイプのバグをキャッチするため、ここで役立ちます。
  • タレントの可用性 -輝かしい新しいシステムを維持する開発者を見つけることができますか?元の開発者が去った場合、他の誰もがコードを理解しますか?これは、「新しい」言語の導入に大きなハードルを置きます(特に、展開、システムの構築、運用サポートなどの新しい要件を作成する場合)。これは、広く使用されている言語(C、C ++、C#、およびJava)に大きな利点をもたらします。
  • 統合コスト:既に導入されている、または獲得する可能性のある他のテクノロジーとの接続/統合は簡単ですか?レガシーJ2EEシステムのスタックがすでにある場合は、それらと統合する必要があります。新しいJava EEソリューションは、Pythonよりもはるかに実用的です。
  • 予測可能性/低リスク:プラットフォーム/言語は実証済みであり、動作することを確認できますか?これは通常、より簡単な生産性よりも重要。マネージャーが上司に説得して、新しいシステムを構築するための人的資源に大きな予算を与えることは、後で戻ってうまくいかなかったと言うよりもはるかに簡単です。
  • 企業支援/サポート -主要な国際組織は言語とプラットフォームのサポートに取り組んでいますか?彼らは私をサポートするために契約に署名します。
  • ベンダーの中立性/プラットフォームの独立性 -単一のサプライヤーに縛られますか?または、将来の幅広いサプライヤオプション/移行パスを利用できますか?建築の行き詰まりに巻き込まれたくないので、競合他社が昼食を食べている間は進歩できません。エンタープライズアーキテクトとして適切に仕事をしている場合は、少なくとも5〜10年先を考える必要があります。

個人的には、エンタープライズで動的言語を使用したい場合、既存のエンタープライズエコシステムに便乗するものを使用するのがはるかに良いと思います。最も注目すべきは、新しい動的JVM言語です。たとえば、JRuby、Groovy、Clojureなどです。IT管​​理に関する限り、これらは「安全な」動的言語の選択肢です。なぜなら、これらはJavaエンタープライズエコシステムの残りの部分で機能し、うまく動作するからです。


1
誰もあなたの答えをまだ支持していないとは信じられません。
セバスチャンN.

11

企業がErlang、Ruby、Pythonなどの言語を使用し始めない主な理由は、それらが動的に型付けされているという事実のようです。

これは彼らの主な言い訳に過ぎないと思います。本当の理由は、企業がそれらすべてをそれほど真剣に受け止めておらず、おそらく少しアマチュアすぎると感じるからです。Javaと.NETは「ビッグビジネス名」であり、優れた商業マーケティング、商業顧客サポートを備えているため、非常に真剣に広く受け入れられています。

残念なことに、大企業名ほど人気のある静的に型付けされた言語が実際に存在しないことは残念です。オープンソース/フリーソフトウェアのプログラミング環境がほとんど常に動的に入力されるのはなぜですか?これは、静的に型付けされた言語は実際にはそれほど簡単ではないこと、および動的な型付けは「怠け者のハック」であることを示している可能性があります。その場合は、動的に型付けされた言語に反対する企業が実際にポイントを持っている可能性があります。


8
本当に?最後に、GoogleはPythonの作成者を雇い、彼の時間の50%を言語に費やすことを許可するなど、Pythonの背後にかなりの重量とかなりの開発努力を投じました。また、特にunladen-swallowがPython 3ソースツリーにマージされたため、GoogleはPythonに大量のコードを提供しています。それは私にとってPythonを「大きなビジネス名」にします。
チンメイカンチ

13
@Chinmay Kanchi:サンプルサイズが1の統計から結論を導き出す方法に興味があります
。– Timwi

6
Touché。ただし、あなたの結論のいくつかにも欠陥があります。動的言語の適切な実装は、静的に型付けされた言語の実装よりもはるかに困難です。動的型付けは、言うまでもなく「怠け者のハック」ではありませ。これにより、開発者は怠け者になりますが、コンパイラー/インタープリターを作成する人はできません。実際、動的に型付けされた言語の最適化は非常に難しいので、他の言語(Python、PHP)の最適化/ JITtingプロジェクトはありますが、最近この処理を広範囲に受けた1つの言語(JavaScript)しか考えられません。
チンメイカンチ

2
また、動的に型付けされた言語がオープンソース環境で最も一般的に使用されていると考えている場合、これは明確ではありません。選択したメトリックに応じて、これは真実かもしれませんが、そうではないことがよくあります。コードの行を測定すると、Cはロングショットで勝ちます。多言語を含むオープンソースプロジェクトで使用されている言語を測定する場合、最も一般的な言語はJavaScript、C、C ++、PHPの順です。主要言語のみを測定する場合、最も一般的な言語はPerl、Java、C#、およびJavaScriptです。bit.ly/C6xTB
Chinmay Kanchi

7
もちろん、動的に型付けされた言語のオプティマイザを書くのは難しいですが、インタプリタではありません。すべての型チェックを廃止でき、残りは同じです。アマチュア言語メーカーは、オプティマイザーを書くことを考えていません。—最後の部分については、ほとんどのオープンソースソフトウェアが動的に型付けされたプログラミング言語で書かれていることを意味するつもりはありませんでしたが、むしろほとんどのオープンソースプログラミング言語(私が話しているので「環境」と言いましたコンパイラ/インタープリター、IDEなど)は動的に型指定されます。
ティムウィ

9
  • 動的に型付けされた言語は、静的に型付けされた言語よりも遅い傾向があります。
  • エラーはキャッチするのが難しく、デバッグするのが難しい場合があります
  • コンパイラー/インタープリターは、あなたができることとできないことについて、あまり気にしない傾向があります。つまり、コンパイル段階で構文エラーをキャッチするだけです。
  • あなたは動的型付け言語の設計に非常に注意しないなら、あなたはJavascriptを、で終わるコード臭いの言語

編集:私の現在の主なプログラミング言語は、動的に型指定されるPythonであることに言及する必要があります。個人的には、変数を事前に宣言する必要がないという自由が大好きですが、(たとえば)関数が遅延ではなく早期にエラーをキャッチするためにどのようなパラメーターを使用するかを指定したがいい場合あります。


1
コンパイラが頑固ではないことは事実ですが、通訳は通常そうです。ほとんどの場合、インタープリターは問題のある状況を検出し、エラーを通知します。
ウィンストンイーバート

17
動的型付けは大好きですが、変数を事前宣言する必要がないのはです!変数名のつづりを間違えたため、何度も新しい変数を誤って導入してしまいます。
フランクシェラー

1
@Frank:I unprintably Perlは変数の宣言を強制する設定を持っていること。私の意見では、これはPerlの利点の1つです。
ポールネイサン

8

動的に型付けされた言語は(一部のプログラマー/上司によって)認識され、同様に機能しないコードを生成します。動的に型指定されたプログラムがコンパイルされるという事実は、その正確性についてはほとんど語りません。静的に型付けされた言語がコンパイルされるという事実は、あなたにもっと多くを伝えます。(一方で、コンパイルにはまだ長い道のりがあり、正しいことをするので、これは見た目よりも意味がないかもしれません)

動的に型指定された言語は、スクリプト言語であると認識されています。bashまたはバッチファイルでアプリケーションを記述することはありません。動的に型付けされたすべての言語は、そのカテゴリにループする傾向があります(不公平)。

動的に型付けされた言語は、静的に型付けされた言語よりも低速です。(ただし、JITでの作業がそれをどのように変更するかがわかります)


2
一部のプログラマーによって「認識されています」。私がプログラマーと動的型付けについて議論するとき、彼らは通常、彼らがその種の言語を実際に使ったことがないことを認めることになります。
フランクシェラー

1
@フランクは、動的型付けの劣等性を主張する人々は一般的にそれを使用していないと言っていますか?
ウィンストンイーバート

2
@フランク:私はその種の言語を使用しましたが、ほとんどの場合、結果は維持できません。(公平に言うと、PHPであり、PHPには動的型付け以外の問題もあります)
Billy ONeal

@ビリー:これは一般的だと思います。私はVBでの経験のために何年も動的型付けをしていませんでした-結局、この恐ろしい統合失調症の動的型付けの実装は典型的ではないことに気づいたとき、私の意見は劇的に変わりました。
Shog9

@ウィンストン:私が主張した人々はそうではないと言っています。私にとっては、「動的型付けはおそらく機能しない」というケースでした...しかし、動的言語で最初に開発された動的言語(IDE、リファクタリング、頭の外)で多くの技術を喜んで使用します。また、このような質問:stackoverflow.com/questions/2317579は、普遍的ではないかもしれませんが、それはうまくいかないが、私は試したことのないプログラマーと主張する私のケースが孤立していないことを示しています。(私、両方のアプローチには価値があると思います。)
フランク・シェラー

8

注:これは主に主観的であり、私の経験と印象に基づいています。

動的に型付けされた言語は、静的に型付けされた言語とは大きく異なります。これらの違いは、おそらく他のほとんどのアプリケーションよりも重量級のエンタープライズソフトウェアでより重要になります。

静的に型付けされた言語は非常に規範的である傾向があります。メソッドは、そのシグネチャに完全に一致する入力のみを受け取ります。アクセスレベルは非常に重要である傾向があり、インターフェイスは明示的に定義され、それらの定義を実施するために冗長ではあるが明確な制限が設けられています。

一方、動的に型付けされた言語は非常に実用的です。型変換は暗黙的に行われることが多く、十分に類似した動作をする限り、間違ったタイプの入力を提供した場合でも、関数は機能します。Pythonのような言語では、アクセスレベルでさえ技術的な制限ではなく契約に基づいています(つまりprivate、使用しないように言われ、面白い名前があるためです)。

多くのプログラマーは、(おそらく)迅速なプロトタイピングを可能にするため、動的言語を好みます。多くの場合、コードは短くなります(型宣言がないためだけです)。迅速で汚れたソリューションが必要なため、または何かをテストするために適切なプロトコルに違反したい場合、それは簡単に可能です。

さて、「エンタープライズ」企業が静的に型付けされた言語を好むことが多いのは、厳密に、それらの制限についてより制限的で明確であることです。実際には、静的に型付けされたコードでさえ、コンパイラーのバカによって破られる可能性がありますが、多くの問題は、プロセスのずっと早い段階(つまり、実行前)でより目立ちます。つまり、コードベースが大きく、モノリシックで複雑な場合でも、コードを実行したり、QA部門に送信したりすることなく、多くのエラーを簡単に見つけることができます。

その環境以外の多くのプログラマーにとって、メリットがマイナス面を上回らない理由は、これらがコードの徹底的な検査によって、またはそれを実行しようとすることによって簡単にキャッチされることが多いエラーだからです。特に、テスト駆動型の方法論に従う場合、これらのエラーは簡単に発見でき、修正しやすくなります。また、リリースサイクルがはるかに短いこのような企業の多くでは、生産性が硬直性よりも重要であり、多くの(基本的な)テストが開発者自身によって行われています。

企業が動的に型付けされた言語をあまり使用しないもう1つの理由は、レガシーコードです。オタクに思えるかもしれませんが、大企業は、たとえ賞味期限を過ぎていても、機能するソリューションに固執することがよくあります。これが、非常に多くの大手企業がInternet Explorer 6を実施しており、OSのアップグレードが非常に遅い理由です。これはまた、「古い」言語(たとえば、古いバージョンのJava)で新しいコードを書くことが多い理由でもあります。新しい行で完全に書き換える承認を得るよりも、数行のコードを生きていないソフトウェアに追加する方がはるかに簡単です言語。

tl; dr:静的言語は官僚主義のように感じられるため、企業経営者はそれらを好む。


3
ガタガタなタイピングルールを持つ言語は、ちょっとした作業に誤りがあることに対して多くの機会を生み出します。たとえば、JavaScriptでは、文字列を期待するコードに数値を渡すと、多くの場合、その数値の文字列表現を渡したかのように動作しますが、常にではありません。たとえば、456を123に追加しようとしても123456は生成されませんが、代わりに579が生成されます。誰が数値から文字列への変換を担当するかが明確でない限り、冗長に実行されるか、まったく実行されない可能性があります。
supercat 14

1
@ supercat、PHPとJavaScriptはその問題に対処する2つの方法の良い例だと思います(演算子に関して):PHPでは演算子は曖昧で+はありません-連結が必要な場合は数字を追加します.; JSでは、両方の操作が同じ演算子を共有します-値の振る舞いがわからない場合は、明示的に変換する必要があります。もちろん、これは緩やかな型指定と厳密な型指定にも関係します(Pythonはさらに厳密です)が、基本的には、値の型が正しいことを確認するか、操作で期待される型を強制する必要があります。
アランプラム14年

1
私はPHPにあまり詳しくありませんが、PHPが「正しい」アプローチと呼ぶものを使用しているようです。Javascriptは多くの点で見劣りしますが、「+」の動作は最悪の1つだと思います。実際、私は、特定のルールを使用して、他のクラスまたはインターフェイスタイプのものを実装または派生するものと見なす必要があることをインターフェイスが宣言できる強力な型システムよりも、緩慢な動的型付けが多くの利点があるとは確信していませんクレームの優先順位について。私は現在、構造的に型指定されたフレームワークとの意識だ大きな限界は...ある
supercat

1
... 2人で同様のインターフェイスを独自に開発する場合、サードパーティがそれらを互換的に使用できるコードを記述する方法はありません。サードパーティが新しいインターフェイスを定義し、既存のインターフェイスのいずれかまたは両方の実装が新しいインターフェイスを自動実装することを宣言できる場合(必要に応じて新しいインターフェイスで提供されるラッパーを使用)、セマンティックなものの99%を処理すると思います動的な型付けに適しています。
supercat 14年

3

いいえ、動的に型付けされた言語がすべての批判に値するとは思いません。(または、必要に応じて、静的に型付けされた言語と同じくらいの批判に値します。)

私の経験では(そしてこの声明を一般化しようとする試みはしていません)、動的言語を批判するプログラマーはそれらを使用していません。会話は通常、「静的型付けではコンパイラが非常に多くのエラーをキャッチします!」そして、「まあ、それは私の経験では問題ではない」と言います。(通常、他のプログラマーはJava、Delphi、または同様のバックグラウンドの出身です。HaskellまたはMLプログラマーは知りません。)

本当に私を不満ことを唯一のものは、技術fooができないことをするときに誰かの主張である可能性が行われる(または実行するのは非常に難しいかもしれません)動的型付け言語で...その技術はで、でと動的型付けのために発明されたとき、言語。IDE?Smalltalk。自動リファクタリング?Smalltalk。呼び出し元/実装者?Smalltalk。


個人的なスタンスで答えを乱雑にしたくありませんでした。これは、正しい仕事に適したツールです。使用する言語の種類は、別の種類の言語よりも、一部のタスクに適しています。
フランクシェラー

6
他のプログラマーがHaskellから来たとき、彼/彼女はすでにそれがJava言語と動的言語の両方に優れた言語であることを知っています;)
Andres F.

0

企業は新しい言語やツールを十分な速さで採用していないだけであり、それには十分な理由があります。しかし、C#のような主流のツールの1つがこれらの機能のいくつかを実装すると、それらは主流の企業に浸透します....


これがなぜ投票されたのかはわかりませんが、洞察に満ちた声明です。企業は遅く、保守的です。また、人々は、Rubyのような突然の変化よりも徐々に変化する(静的に型付けされた言語で動的な型付けを使用できるC#の動的キーワードのような)ことを好みます。
バダディカルティック16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.