web-dev-qa-db-ja.com

動的言語と静的言語のアーキテクチャの違い

静的言語(C#やJavaなど)と動的言語(RubyまたはPython)など)で構築されるアプリケーションを設計するときに、アーキテクチャ上の大きな違いはありますか?

あるタイプに適したデザインで、他のタイプには適していないデザインの可能性はどれですか?当然のことながら、他のタイプでは実現できない便利な機能はありますか?

また、ダイナミック固有のデザインパターンはありますか?

22
Raphael

いくつかのことをまっすぐにしましょう:

  1. インタラクティブスクリプトと静的言語は相互に排他的ではありません。 F#とHaskellの両方にREPLインターフェイスがあります。
  2. 動的言語と高性能は相互に排他的ではありませんが、一部の最適化は相互に排他的です。 JavaScriptは、最近のほとんどのブラウザーでかなり高速に実行されます。
  3. 動的言語であっても、型について文書化し、記憶し、考える必要があります。
  4. 型推論の人気が高まっているため、多くの静的言語では型を表記する必要がなくなりました。強い型推論を持つ静的言語では、コンパイラーは、ほとんどの場合、コードから型が何であるかを把握し、型定義に違反する何かをしたかどうかを通知します。構文に関する限り、これは両方の長所を提供します。
  5. OOPと動的言語は相互に排他的ではありません。 PHPはクラスと継承さえもサポートするようになりました。

これらすべての驚くべき類似点はさておき、開発プロセスに影響を与える実際的な違いがいくつかあります。

  1. 動的言語は、データを で渡す興味深い方法を可能にします。
  2. 静的言語を使用すると、さまざまな種類のバグを不可能にすることで、実行する必要があるテストの量を減らすことができます。
  3. 同じように、静的言語は F#の測定単位 のような興味深い検証と自動変換機能を許可します。
  4. 極端に言えば、静的言語は コードコントラクト および正式な検証を可能にします。これにより、可能性のあるものを文書化して防止できます。ゼロ除算、無限ループ、null参照、無効なリストのサイズまたはインデックス、範囲エラー、および定義する可能性のあるその他の論理的に無効な状態。
  5. さらに極端なことに、CPUの最適化はこれらの静的な制約に基づいて行うことができるため、パフォーマンスがさらに向上します。

静的型付けなしで決して作成できなかったプログラムの1つのタイプもあります: Singularity 、ハードウェアプロセス境界のないOS 。少量のC、いくつかのC#、およびコードコントラクトをサポートするSpec#と呼ばれ​​るC#の方言で書かれています。

ガベージコレクションされた言語で書かれているにもかかわらず、このOSでのマルチタスクおよびプロセス間通信のパフォーマンスは、実際には他のどこよりも優れています。すべてのプロセスは1つのメモリスペースで実行されます。これは、前述の正式な検証の最適化によります。プログラムがシステムの残りの部分を危険にさらすことができないようにするには、通信オブジェクトが静的に検証可能である必要があるため、静的型付けなしではこれを行うことはできません。

ただし、ほとんどの場合、アーキテクチャはほとんど同じに見えるはずです。静的言語は、型が明確に定義されているため、多くの場合、プログラムの推論を容易にしますが、適切に記述された動的言語プログラムには、少なくとも開発者の心の中で明確に定義されている型もあります。

14
Rei Miyasaka

アーキテクチャには大きな違いがあります。パフォーマンス。

ハードウェアの予算、予想されるワークロード、およびサービスレベル契約によっては、動的言語では要件を満たすことができない場合があります。

ほとんどの場合、動的言語によって提供される開発の速度と柔軟性は、遅い応答時間と高いCPUとメモリ消費を相殺します。ただし、予算やパフォーマンスの制約がある大規模なシステムでは、動的言語のオーバーヘッドが高くなる可能性があります。

2
James Anderson

私はこれらの線に沿って考えたことはありません。 Googleが登場したとき、 Peter Norvigのブログ がトップヒットの1つでした。一部の設計パターンは、C++などの従来のオブジェクト指向言語よりも動的言語で実装する方が簡単であると述べています。動的言語では実装が簡単であると彼は指摘しているので、設計/アーキテクチャにも違いがあるはずだと思います。さらに勉強しながら、さらに答えを追加していきます。

1
vpit3833

静的言語(C#やJavaなど)と動的言語(RubyまたはPython)など)で構築されるアプリケーションを設計する場合、アーキテクチャに大きな違いはありますか?

番号。

動的言語用の豪華なフレームワークを書く方が少し簡単です。しかし、それはアプリケーションではありません。

あるタイプに適したデザインで、他のタイプには適していないデザインの可能性はどれですか?

ありません。

良いものはどちらの種類の言語でも書くことができます。

当然のことながら、他のタイプでは実現できない、他のタイプでは実現できない便利な機能はありますか?

番号。

違いは、動的言語は「書き込み、実行、修正」であるということです。すぐに実験して修正できます。

静的言語は「書き込み、コンパイル、ビルド、実行、修正」です。簡単に実験することはできません。

それ以外は、機能はほぼ同じです。

ダイナミック固有のデザインパターンはありますか?

多分。 Python eval()およびexecfile()関数-ある意味で-処理が難しい(しかし不可能ではない)動的言語機能を指す静的言語では、同じプロセス空間でコードをコンパイルして実行するには、はるかに多くのコード行が必要になります。

動的言語固有ではありません。簡単です。

1
S.Lott