静的および動的に型付けされた言語を、さまざまなタイプのジョブのさまざまなツールと見なすことはできますか?


9

はい、同様の質問がされていますが、常に「どちらが良いか」を見つけることを目的としています。

私は主にJavaScriptの開発者として思いついたので、静的型付け言語での記述に関する広範な経験がないので、私は尋ねています。

これにもかかわらず、低レベルのコードでの要求の厳しい操作を処理するためのCの学習には間違いなく価値があります(これは、コンパイラーレベルで静的と動的の関係があると思います)。特定のプロジェクトコンテキスト(特定の種類の動的なデータ集約型操作など)があるかどうかです。パフォーマンス以外にも、JavaやC#を使用するよりもPythonを使用するほうが理にかなっています。


5
答えは「はい」です。各タイプの言語-実際には各言語-には長所と短所があるため、一部のタスクには他のタスクよりも適しています。
ChrisF

Cを例として使用するのは興味深いことです。Cは、最も弱く型付けされた言語であり、静的に型付けされたものであると考えることができるからです。Cは型システムのため高速ではありません。型チェックはコンパイル時に行われます。Cは高速です。セキュリティ対策がほとんどまたはまったくないため、足で自分を撃たないようにするためのチェックが行われます。ネイティブバイナリにコンパイルされるためです。
サラ2016

回答:


10

はい、間違いなく。
動的型付けには、すべてを1つの型として処理したい場合に明確な利点があります。シリアライゼーション/デシリアライゼーションは古典的な例の1つです。これが、多くのWebプログラミングが動的に型付けされたスクリプト言語で行われている理由です。これらは、あらゆる種類のデータを文字列に変換したり、文字列から変換したりする多くの作業に適しています。

一方、アプリケーションプログラミングの場合、静的言語の方がはるかにうまく機能します。なぜなら、すべてを1つの型として扱うことしばしば必要条件ではないからです。多くの場合、データがそれ自体として表され、他のタイプに頻繁に変換されないようにして、効率的なデータ構造が必要になります。これにより、動的型付けの機能が利点ではなく欠点になります。そのため、アプリケーションはほとんど静的型付け言語でのみ記述されます。


3
@エリック:そんなことを言うかどうかわからない。開発中に物事は変化します。要件は変更される可能性があります。または、要件を正しく実装していないことがわかり、コードを更新する必要があります。一つのことを変更し、ニーズを変更することを他のすべてを見つけることが提供してどこを示すために、結果のコンパイルエラーを使用することができること、巨大なあなたはその技術が利用できない言語で失うことを開発の利便性と速度にブーストを。これが、動的言語で開発された複雑なアプリが表示されない理由の1つです。
メイソンウィーラー

9
@メイソンウィーラー:非常に良い答えです。+ 1静的型チェックは、コンパイラに型の正しさをチェックさせることで、バグを早期に発見するのにも役立ちます。たとえば、昨日200行のRubyプログラムをデバッグしたところ、プログラムを実行することでしか検出できないタイプに関連する2つのバグがありました。10万行のプロジェクトで何が起こるか考えたくありません。したがって、動的型付けにより柔軟性が向上します。これは、コンパイル時に特定のバグを見つけられないという犠牲を払って、説明したコンテキストで優れています。したがって、静的に型付けされることは、効率だけでなく正確性にも関係しています。
ジョルジョ

1
@MasonWheeler 2年間、そして私が後で交渉したよりもはるかに多くのC#とJavaは、いくつかのことに同意しなくなります。複雑なWebアプリは完全に動的言語で実行されます。コンパイルとランタイムは、すぐに表示される変更を行うことができる場合には意味がありません。また、手続き型言語では、データが常に手を変えてはならないOOPによって駆動されることが想定されている言語よりも、型に関するすべての煩わしさがはるかに理にかなっているという意見をまとめました。
Erik Reppen 2013

1
@Erik:* wince *まず、Javaで静的型付けをコンセプトとして判断することは、Pintoによって自動車をコンセプトとして判断することに似ています。そして、第二に、変更が「すぐに見える」可能性があるものは、定義上、非常に複雑なプログラムではありません。なぜなら、最新のハードウェアを使用しても、複雑なプログラムは、コンパイラーであろうとインタープリターであろうと、コードの準備にかなりの時間がかかるためです(またはJITコンパイラ)を準備します。最も印象的なWebアプリケーションでさえ、非常に複雑なデータベースに裏打ちされた非常に単純なプログラムである傾向がありますが、これはまったく別の問題です。
メイソンウィーラー2013

1
複雑な抽象化を行う機能は、静的な型システムと動的な型システムを持つことと直交し、速度にも直交します。信じられないほど強力な(時には難解ですが)抽象化を可能にする静的型システムがあります。変更がすぐに反映されるかどうかは、型システムとは無関係です。静的型付き言語のインタープリターを確実に構築できます。
Rufflewind 2014

4

私の見方では、静的に型付けされた言語で自然に作業できる場合は、静的型付けが適しています。一般に、型システムの目的は、のような未定義のセマンティクスで操作を実行できないようにすることです(string) "hello" + (bool) true。特別なレベルの安全性を確保してこれらの操作を実行できないようにすることは、広範囲な単体テストがなくても、コードのバグを防ぐための良い方法です。つまり、タイプセーフは、コードのセマンティックな正確性に別のレベルの信頼を提供します。

しかし、型システムを正しく理解するのは非常に困難です。この記事の執筆時点では、自然界に完全な型システムがあるとは思いません。(「完全な型システム」とは、厳密な型システムを意味します。詳細なコードアノテーションを必要とせず、誤検出型エラーを生成せず、型エラーがプログラマにとって理解しやすいものです。)さらに、存在する本当に良い型システムを理解するのは難しいです。私がHaskellを学んでいたとき、正しいコードのように(私には)見えたものを書き込もうとしたときに得られたあいまいなタイプのエラーの数はわかりません。通常、コードは実際には正しくありませんでした(これは型システムに有利な点です)が、それはかなりかかりましたコンパイラーからのエラーメッセージを理解するための作業の結果、根本的な問題を修正することができました。オブジェクト指向言語では、「この引数は共変ではなく入力型と反変であるべきだ!」と考えるかもしれませんし、(おそらく)型キャストに戻って型システムの境界から脱出するかもしれません。型システムは、あなたが思っているよりもずっとトリッキーになります。

価値があることについては、良い型システムを思い付くのが難しいことが、Gilad BrachaがNewspeakにプラグイン可能な型システムのサポートを含める動機となったことの一部であるというのが私の理解です。


WRT単体テスト、私は完全に同意します。「優れた単体テストがあれば、型の正しさを確認できる」と言う人がよくいます。それは、動的型付けが常に良いことだと強く信じているPaul Grahamがコンパイラーの作業を手動で行わせる言語は欠陥のある言語であると言う方法を思い出します。Sortaはあなたを立ち止まらせ、考えさせます...
Mason Wheeler

動的型付け言語の「危険性」に関する懸念の多くは、これをどのように記述するかを考慮に入れていないと思います。PythonとJSの多くは、コンソールスタイルで記述できます。スクリューコンパイルとランタイムの比較です。今すぐ試して、何が起こるかを確認できます。しかし、あなたは1つの非常に良い点に進んでいると思います。IE6やIE 7が予期しないことを行うのに対し、優れたと思われるすべてのブラウザーベンダーが恐ろしいコードに混乱を招く場合よりも、クライアント側のWeb開発で私を狂わせるものは何もありません。より典型的な方法で吸います。
エリック・レッペン、2011

@ mason-wheelerの不一致タイプは些細なエラーであり、動的言語がタイプをチェックしないのではなく、実行時のみです。私の経験では、ほとんどの静的言語はユニットテストのカバレッジレベルが同じで、コンパイラーが事前にタイプをチェックすることでテストを失うことはなく、動的言語はタイプをチェックするために特定のテストを追加する必要はありません。 、ランタイムシステムが型をチェックします。ユニットテストがメソッドをカバーしている場合は、それをキャッチします。
jbtule

4

これらは異なるツールですが、パフォーマンスではありません。それはすべて複雑さについてです。

動的言語は通常、最大限の柔軟性を目指しており、検証の欠如と一種の保証をもたらします。そうすると、小規模なプログラムでは非常に強力ですが、大規模なプログラム(複雑さ)を維持することはほとんど不可能になります。

静的言語は通常、最大の検証を目的としています。彼らの最初の目標は通常、できるだけ早くエラー(またはバグ)をキャッチすることです。検証には多くの保証がなされています。次に、学習と開始が難しくなりますが、プログラムが大きくなるにつれて、はるかに少ないコスト(コーディングの労力)で、より良いプログラム検証が提供されます。

その結果、動的言語は通常、動的Webページ、WebブラウザーDSL(ブラウザーアプリケーションではない!)、シェルスクリプトなどの小さな(つまり、非常に小さな)プログラムに適しています。静的言語はシステムプログラミングやその他のものに適しています。

上記の説明は、非常に純粋に動的または静的な言語に関するものです。ほとんどの現実の言語はそれらの間にあり、さまざまな特性を示しています。

詳細については、こちらをご覧ください:https : //softwareengineering.stackexchange.com/a/105417/17428


1
「通常、動的言語は小さなプログラム(つまり、非常に小さなプログラム)に適合します」:私の経験では、中規模アプリケーションにも動的言語を使用できます(もちろん、大規模アプリケーションに動的言語をうまく使用している人もいます)。コードベースが大きくなるほど、静的言語によって提供される静的チェックから得られる利益が増えることに同意します。
ジョルジオ2014年

2
@ジョルジオまあ、それは多分私が静的検証に夢中になっているためかもしれません。それは私にはとても甘いです、そして私は文字通りそれらがなければ小規模でも生きることができません:p
Eonil

私は静的言語の利点を理解しています(そして私はあなたの答えに賛成しています)。最近、私はPythonとCommon Lispを使用していますが、実際には、クリーンなデザインを使用すると、特にPythonで十分なテストを作成すると、良い結果が得られることを認めます。これらの言語は、プロトタイプを作成するのに非常に効果的で、プロトタイプを簡単にプロダクションコードに変換できます。しかし、はい、より複雑なプロジェクトでは、できる限り多くの助けを借りたいので、静的言語を使用します。
Giorgio 2014年

1

現在、静的型言語(C#およびF#)でプログラミングしていますが、動的言語(Smalltalk、Ruby)でのプログラミングも楽しんでいます。あるタイプと他のタイプに関連する長所と短所はたくさんありますが、タイプを強制するときよりも言語についての詳細があります。たとえば、動的言語は通常、より簡潔で簡潔な構文を持っていますが、型推論システムを備えたF#とOCamlは、動的言語と同じくらいきれいな構文を持っています。静的型付けでは、実際の自動リファクタリングとオートコンプリートがありますが、Smalltalkはデータベース内のソースコード全体であり、各メソッドが個別にコンパイルされているため、真に自動リファクタリングが最初に導入された言語であり、優れた機能を発揮しました。最終的に、今日の最新の動的言語と静的言語はタイプセーフです。これは、タイプシステムの最も重要な側面です。


静的型付けは、言語を多少柔軟にするものの方程式のほんの一部に過ぎないと私は時々疑っています。私が気づき始めていることは、多くの開発者が、オーバーロードオペレーターのようなばかげて危険なことをする自由な統治よりも、快適なレールのセットを案内することを好むということです。VSは時々子犬を蹴りたくなりますが、私は間違いなくF#に興味がありました。これは、より包括的な型に暗黙的にキャストできる単なるC#のものではないと思います。
エリックレッペン、2011

@erik、ああそうです、暗黙のタイピングとvarだけではありません。F#の型推論
jbtule

-1

2015年です。会話に興味深いスニペットが追加されます。

  1. エンタープライズバックエンドの世界の重要な部分は、Java(厳密な静的)の代わりにPython(動的)の使用を検討または開始しています
  2. エンタープライズフロントエンドの世界では、TypeScipt (Javascriptの型付き拡張)に基づいたAngularJS v2のようなものが見られます。

したがって、バックエンドの人は厳密な型付けの不要なストレートジャケットにうんざりしていますが、フロントエンドの人は動的な型付けの混乱にうんざりしています。

かなり皮肉なことに、彼らは真ん中で会うのか、それとも締め切りのソニックブームを過ぎてお互いを通り過ぎるか...?;)


証拠を提供しない限り、最悪の場合、バックエンドの世界はGoに移行していると主張しますが、神は動的なスクリプトのようなものを禁止します。静的プログラミング言語には常に多くの儀式があるという神話は、長い間、より強力な推論システムと強固なREPL実装によって明らかにされてきました
Den

大規模で使用されている動的に型付けされたバックエンドはたくさんあります。特にジャンゴはジャーナリズムで非常に人気があり、NYT、ガーディアン、ワシントンポストのバックエンドを運営しています。WalmartはNodeで実行されています。唯一の神話は、静的型なしではスケールを記述できないという考えです。そして、私が遭遇したいくつかのJavaレガシーコードベースの災害について考えてしばらく時間を費やした後、そうすることに慣れている人は、静的または動的のどちらで作業していても、そのほうが良いと思います。
Erik Reppen、2015

確かに、私はむしろ私の立場を明確にする代わりに、貧しい人々のJava one.Justの、私の大規模なエンタープライズプロジェクトに熟練したPythonのチームを持っていると思います:私はの評価として上記の解答を掲載
コーネル・マッソン

実際、私は大規模なエンタープライズプロジェクトに、Javaの貧弱なプロジェクトよりも熟練したPythonチームを用意したいと考えています。明確にするために:私は、クライアントベース、業界ネットワーク、および一般的な調査で見ている傾向を観察するために、上記の回答を投稿しました。伝統的に厳密なバックエンドはそれほど厳密ではなく、伝統的に緩いフロントエンドを採用しています。どちらが「正しい」か(もしあれば)という意見すらありません。なぜ私が反対票を投じたのかはわかりません。おそらく皮肉が失われています...
Cornel Masson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.