モジュール式プログラミング
モジュラープログラミングは、 プログラムの機能を独立した交換可能なモジュールに分離することを重視するソフトウェア設計手法です。各モジュールには、必要な機能の1つの側面のみを実行するために必要なすべてが含まれます。
モジュールインターフェイスは、モジュールによって提供され、必要とされる要素を表します。インターフェイスで定義された要素は、他のモジュールで検出できます。実装には、インターフェイスで宣言された要素に対応する作業コードが含まれています。モジュラープログラミングは、構造化プログラミングとオブジェクト指向プログラミングに密接に関連しています。これらはすべて、1960年代頃に発生した、より小さな部分への分解による大規模なソフトウェアプログラムおよびシステムの構築を促進するという同じ目標を持っています。これらの用語の歴史的な使用法には一貫性がありませんでしたが、「モジュールプログラミング」とは、プログラム全体のコードを断片に高レベルに分解することを指します:構造化制御フローの低レベルコード使用とオブジェクト指向オブジェクトのデータ使用のプログラミング、一種のデータ構造。
オブジェクト指向プログラミングでは、モジュールを構築するためのアーキテクチャパターンとしてインターフェイスを使用することをインターフェイスベースのプログラミングと呼びます。
用語
moduleの代わりに、 アセンブリ (C#、F#、Visual Basic .NETなどの.NET言語)やパッケージ (Dart、Go、Javaなど)という用語が使用されることがあります 。他の実装では、これらは別個の概念です。 Pythonではパッケージはモジュールのコレクションですが、Java 9では新しいモジュールの概念(アクセス制御が強化されたパッケージのコレクション)の導入が計画されています。
さらに、「パッケージ」という用語には、ソフトウェアで他の用途があります(たとえば、.NET NuGetパッケージ)。コンポーネントも同様の概念ですが、通常はより高いレベルを指します。コンポーネントはシステム全体の一部であり、モジュールは個々のプログラムの一部です。 「モジュール」という用語の規模は、言語によって大きく異なります。 Pythonでは非常に小規模で、各ファイルはモジュールですが、Java 9では大規模になるように計画されています。モジュールはパッケージのコレクションであり、パッケージはファイルのコレクションです。
モジュールの他の用語には、Pascal方言で使用されるunitが含まれます。
言語サポート
モジュールの概念を正式にサポートする言語には、Ada、Algol、BlitzMax、C#、Clojure、COBOL、D、Dart、eC、Erlang、Elixir、F、F#、Fortran、Go、Haskell、IBM / 360 Assembler、IBM i Control Language( CL)、IBM RPG、Java、MATLAB、ML、Modula、Modula-2、Modula-3、Morpho、NEWP、Oberon、Oberon-2、Objective-C、OCaml、Pascalのいくつかの派生物(Component Pascal、Object Pascal、Turbo) Pascal、UCSD Pascal)、Perl、PL / I、PureBasic、Python、Ruby、Rust、JavaScript、Visual Basic .NETおよびWebDNA。
モジュールをサポートしていない言語の顕著な例は、C、C ++、およびPascal(元の形式)です。 2014年現在、C ++用のモジュールが提案されています。 iOS 7(2013)でObjective-Cにモジュールが追加されました。 PascalはModulaとOberonに取って代わられました。ModulaとOberonには最初からモジュールが含まれていました。 JavaScriptには、ECMAScript 2015以降にネイティブモジュールがあります。
プログラミング言語には、Cなどの名前付きモジュールをサポートするための明示的な構文機能がない場合でも、モジュラープログラミングを実行できます。これは、既存の言語機能を、たとえばコーディング規約、プログラミングイディオム、物理コード構造。 IBM System iは、統合言語環境(ILE)でプログラミングする際にもモジュールを使用します。
主な側面
モジュールプログラミングでは、モジュールが論理的に個別の機能を実行し、明確に定義されたインターフェイスを介して相互作用するという懸念が分離されます。多くの場合、モジュールは有向非巡回グラフ(DAG)を形成します。この場合、モジュール間の循環依存関係は、これらが単一のモジュールであることを示すものと見なされます。モジュールがDAGを形成する場合、他のモジュールに依存せずに最下位モジュールが独立し、上位モジュールが下位モジュールに依存する階層として配置できます。特定のプログラムまたはライブラリは、それ自体の階層の最上位モジュールですが、上位レベルのプログラム、ライブラリ、またはシステムの下位レベルのモジュールとして見ることができます。
モノリシックアプリケーション(最小コンポーネント全体)を作成する代わりに、モジュラーシステムを作成する場合、いくつかの小さなモジュールは別々に記述されるため、一緒に構成されると実行可能なアプリケーションプログラムを構築します。通常、これらは個別のコンパイルを介して個別にコンパイルされ、リンカーによってリンクされます。ジャストインタイムコンパイラーは、実行時にこの構築の一部を「オンザフライ」で実行できます。
これらのモジュールのすべて(または多く)を他のプロジェクトで(変更せずに)再利用できるため、これにより、モジュール設計システムが正しく構築されていれば、従来のモノリシック設計よりはるかに再利用可能になります。これにより、プロジェクトをいくつかの小さなプロジェクトに「分解」することも容易になります。理論的には、モジュール化されたソフトウェアプロジェクトは、チームメンバーがシステム全体を作成したり、システム全体を知る必要がないため、大規模なチームがより簡単に組み立てることができます。彼らは割り当てられた小さなタスクに集中することができます(これは、神話の男の月の主要な前提に反していると主張されており、後でそれを作成せずに開発者を後期ソフトウェアプロジェクトに実際に追加することを可能にします)。
歴史
サブシステム(特にI / O用)およびソフトウェアライブラリの形式のモジュール式プログラミングは、コードの再利用に使用された初期のソフトウェアシステムにまで遡ります。 1960年代後半と1970年代に、構造化プログラミング(1960年代)の概念の大規模なアナログとして、モジュール性を目標としたモジュールプログラミング自体が開発されました。 「モジュラープログラミング」という用語は、少なくとも1968年7月にラリーコンスタンティンによって情報システム研究所で開催されたモジュラープログラミングに関する全国シンポジウムにまで遡ります。その他の重要な概念は、情報の隠蔽(1972)と懸念の分離(SoC、1974)です。
モジュールは、ALGOL 68(1968)の元の仕様には含まれていませんでしたが、初期の実装であるALGOL 68-R(1970)およびALGOL 68C(1970)に拡張機能として含まれ、後に正式化されました。モジュラープログラミングの最初から設計された最初の言語の1つは、Niklaus Wirthによる短命のModula(1975年)でした。もう1つの初期のモジュール言語は、ゼロックスPARCのMesa(1970年代)でした。WirthはMesaとその後継のModula-2(1978)で元のModulaを使用し、特に後継のModula-3( 1980年代)。モジュールMのオブジェクトaを参照するMaなどのModulaのドット修飾名の使用は、レコードのフィールドにアクセスする表記法と一致し(オブジェクトの属性またはメソッドについても同様)、現在ではC#、Dartで広く普及しています、Go、Java、Pythonなどがあります。モジュラープログラミングは1980年代から普及しました。元のPascal言語(1970)にはモジュールは含まれていませんでしたが、特にUCSD Pascal(1978)およびTurbo Pascal(1983)にはモジュールが含まれていました。 -影響を受けたAda(1980)。 Extended Pascal ISO 10206:1990規格は、モジュラーサポートでModula2に近づきました。 Standard ML(1984)には、モジュール間をマッピングするファンクター(パラメーター化されたモジュール)を含む、最も完全なモジュールシステムの1つがあります。
1980年代と1990年代には、特にC ++とJavaの人気により、モジュール型プログラミングはオブジェクト指向プログラミングに隠れ、しばしば混同されていました。たとえば、Cファミリの言語は、C ++(元はC with Classes、1980)およびObjective-C(1983)のオブジェクトとクラスをサポートし、30年以上後のモジュールのみをサポートしていました。 Java(1995)は、パッケージ形式のモジュールをサポートしていますが、コード編成の主要な単位はクラスです。ただし、Python(1991)はモジュールとオブジェクトの両方を最初から顕著に使用し、モジュールをコード編成の主要な単位として使用し、「パッケージ」を大規模な単位として使用しました。 Perl 5(1994)にはモジュールとオブジェクトの両方のサポートが含まれており、CPAN(1993)から膨大な数のモジュールが利用可能です。
モジュラープログラミングは現在広く普及しており、1990年代以降に開発されたほぼすべての主要言語で使用されています。モジュールの相対的な重要性は言語によって異なり、クラスベースのオブジェクト指向言語では、組織化とカプセル化の単位としてのクラスとの重複と混乱が依然として存在しますが、これらは明確な概念として確立されています。