Modula-2 は、1977 年から 1985/88 年にかけてチューリッヒ工科大学のNiklaus Wirthによって開発された構造化された手続き型プログラミング言語です。Lilithパーソナルワークステーションのオペレーティングシステムとアプリケーションソフトウェアの言語として作成されました。[ 1 ]その後、 Lilithのコンテキスト外でのプログラミングにも使用されました。
ヴィルトは、Modula-2を、彼が以前に開発したプログラミング言語であるPascalとModulaの後継とみなしていた。[ 2 ] [ 3 ]主な概念は以下のとおりである。
この言語設計は、ワースが1976年のサバティカル休暇中に見た、同じくゼロックスPARCのMesa言語とXerox Altoの影響を受けている。[ 4 ]コンピュータ雑誌Byteは、 1984年8月号でこの言語とその周辺環境を特集した。[ 5 ]
ワースはModula-2の後継としてOberonシリーズの言語を作成したが、他の人々(特にDigital Equipment CorporationとAcorn Computers、後のOlivetti)はModula-2をModula-2+、そして後にModula-3へと発展させた。
Modula-2は、システムプログラミングとアプリケーションプログラミングの両方に適した汎用手続き型言語です。構文は、Wirthが以前に開発したPascalをベースに、いくつかの要素と構文上の曖昧さを排除したものです。また、コンパイルとデータ抽象化を分離するために設計されたモジュール概念と、マルチプログラミングを直接サポートする言語機能が追加されました。
この言語では、ワンパスコンパイラの使用が可能です。グートクネヒトとヴィルトによるそのようなコンパイラは、以前のマルチパスコンパイラよりも約4倍高速でした。[ 6 ]
以下は、「Hello world」プログラムのソースコードの例です。
MODULE Hello ; (* GNU Modula-2 の場合は、FROM StrIO IMPORT WriteString となります*) FROM STextIO IMPORT WriteString ; BEGIN WriteString ( "Hello World!" ) END Hello .Modula-2モジュールは、関連するサブルーチンとデータ構造のセットをカプセル化し、プログラムの他の部分からの可視性を制限するために使用できます。[ 7 ] Modula-2 プログラムはモジュールで構成され、各モジュールは 2 つの部分で構成されています。定義モジュール(インターフェース部分) には、エクスポートされる(他のモジュールから見える)サブシステムの部分のみが含まれます。実装モジュールには、モジュール内部の動作コードが含まれます。
この言語は厳格なスコープ制御を採用しています。標準識別子を除き、明示的にインポートされない限り、外部のオブジェクトはモジュール内部から参照できません。また、明示的にエクスポートされない限り、モジュール内部のオブジェクトは外部から参照できません。
モジュールM1が、明示的なエクスポートリストでその識別子を列挙することにより、オブジェクトa、b、c、およびPをエクスポートすると仮定します。
定義モジュールM1 ;輸出適格a 、b 、c 、P ; ...すると、モジュール M1 のオブジェクト a、b、c、および P は、モジュール M1 の外部では、それぞれ M1.a、M1.b、M1.c、および M1.P として認識されます。これらは、修飾子付きで外部にエクスポートされます (モジュール M1 がグローバルであると仮定)。エクスポート元のモジュール名 (M1) が修飾子として使用され、その後にオブジェクト名が続きます。
モジュールM2に以下のIMPORT宣言が含まれていると仮定します。
モジュールM2 ;インポートM1 ; ...つまり、モジュール M1 によってその内包するプログラムの外部にエクスポートされたオブジェクトは、モジュール M2 の内部で使用できるようになります。それらは、M1.a、M1.b、M1.c、M1.Pのように修飾された形式で参照されます。例:
... M1.a : = 0 ; M1.c : = M1.P ( M1.a + M1.b ) ; ...修飾エクスポートを使用すると、名前の衝突を回避できます。たとえば、別のモジュールM3がPという名前のオブジェクトをエクスポートする場合、M1.PとM3.Pは異なるため、2つのオブジェクトを区別できます。エクスポート元のモジュールM1とM3内で両方のオブジェクトがPという名前であっても問題ありません。
別の方法も存在する。モジュールM4が次のように定式化されていると仮定しよう。
MODULE M4 ; FROM M1 IMPORT a , b , c , P ;これは、モジュール M1 によって外部にエクスポートされたオブジェクトを、モジュール M4 内で再び使用できることを意味しますが、今度は、a、b、c、P のように、エクスポートされた識別子への無修飾の参照のみによって使用されます。例:
... a := 0 ; c := P ( a + b ); ...このインポート方法は、名前の衝突がない場合に有効です。これにより、変数やその他のオブジェクトを、エクスポート元のモジュール内と同様に、修飾子なしでエクスポート元のモジュール外でも使用できるようになります。
エクスポートおよびインポート規則は、オブジェクトへの不正アクセスを防ぐだけでなく、プログラム内のすべての識別子の定義に対する相互参照を作成することも可能にします。この特性は、多数のモジュールを含む大規模プログラムの保守に役立ちます。
この言語は、単一プロセッサの並行処理(モニタ、コルーチン、明示的な制御の移譲)とハードウェアアクセス(絶対アドレス、ビット操作、割り込み)に対応しています。また、名目型システムを採用しています。
Modula-2 には 2 つの主要な方言があります。1 つ目はPIMで、 Niklaus Wirth 著のProgramming in Modula-2 という書籍にちなんで名付けられました。 [ 4 ] PIM には、第 2 版、第 3 版 (修正版)、第 4 版の 3 つの主要な版がありました。それぞれが言語のわずかなバリエーションを記述しています。2 つ目の主要な方言はISOで、国際標準化機構による標準化活動にちなんで名付けられました。以下に、それらの間の違いをいくつか示します。
EXPORT定義モジュールには、明示的な句が必要です。SIZEモジュールからインポートする必要がありますSYSTEMEXPORT定義モジュール内のすべての要素がそのモジュールへのインターフェースを定義しているため、当該条項は冗長であると判断し、定義モジュールから当該条項を削除したEXPORT。SIZEは遍在的である(インポートしなくてもどのスコープでも可視である)。MOD。ARRAY OF CHAR文字列が配列にぴったり収まる場合でも、すべての文字列はASCIIヌル文字で終端される必要がある。Modula-2には、特定のアプリケーション領域向けに言語拡張機能を備えた上位互換版がいくつか存在する。
Modula-2に非常によく似ているものの、それぞれ独自の言語である派生言語がいくつか存在する。それらのほとんどは、異なる目的を持ち、それぞれに長所と短所を持つ、異なる言語である。
他の多くの現行プログラミング言語も、Modula-2の機能を採用している。
PIM [2,3,4] は 40 個の予約語を定義しています。
そしてELSIFループ繰り返し 配列終了修正値リターン 開始終了モジュールセット 輸出によってではなく、 のケース 定数または型 定義 IF ポインタ UNTIL DIV 実装手順 VAR 輸入資格がある間は 他に記録されているもの
PIM [3,4] は 29 個の組み込み識別子を定義しています。
ABS EXCL LONGINT REAL ビットセット FALSE LONGREAL サイズ ブール値 浮動小数点数 最大値 TRUE キャップ ハルト ミニ トランク カーディナルハイニルバル CHAR INC ODD キリスト教(命令を含む) 10進整数処理
Modula-2は、多くの組み込みシステムのプログラミングに使用されます。
Cambridge Microprocessor Systems社製のCambridge Modula-2は、組み込み開発向けに言語拡張機能を備えたPIM4のサブセットをベースとしています。このコンパイラはMS-DOS上で動作し、MINOSオペレーティングシステムを実行するMotorola 68000シリーズ(M68k)ベースの組み込みマイクロコントローラ向けのコードを生成します。
Mandeno Granville Electronics社のMod51は、ISO Modula-2をベースとしており、プログラマブルロジックコントローラ(PLC)の業界標準であるIEC 1131に準拠した組み込み開発用の言語拡張機能を備えています。Mod51コンパイラは、80C51ベースのマイクロコントローラ用のスタンドアロンコードを生成します。
当時GMヒューズエレクトロニクスの子会社であったデルコエレクトロニクスは、1985年から組み込み制御システム向けにModula-2のバージョンを開発し始めました。デルコはこれをModula-GMと名付けました。これは、デルコのエンジン制御ユニット(ECU)の組み込みシステムでマシンコード(言語)を置き換えるために使用された最初の高水準プログラミング言語でした。これは、デルコが1988年にGM向けに1日あたり28,000個以上のECUを生産していたため重要でした。当時、デルコは世界最大のECU生産者でした。[ 19 ]組み込みコントローラでのModula-GMの最初の実験的使用は、モトローラ68xxxマイクロプロセッサをベースにした1985年のアンチロックブレーキシステムコントローラと、チャンプカーワールドシリーズチャンピオンシップオートレーシングチーム(CART)とインディレーシングリーグ(IRL)チームが使用した1993年の第4世代ECUでした。[ 20 ] Modula-GM の最初の実用化は、GM パワートレインのVortecエンジンを管理するために使用された 1990 年モデルの車両制御モジュール(VCM) から始まる GM トラックでの使用でした。Modula-GM は、1997~2005 年モデルのBuick Park Avenueで使用された GM の 90° Buick V6 エンジンファミリー 3800 シリーズ II のすべての ECU でも使用されました。Modula-GM コンパイラと関連するソフトウェア管理ツールは、Delco がIntermetricsから入手しました。
Modula-2は、1986年に他の代替言語に比べて多くの利点があったため、Delcoの高級言語のベースとして選ばれました。1995年にDelco ElectronicsがGMから(他の部品部門とともに)分離してDelphi Automotive Systemsが設立された後、グローバルソーシングでは非独占的な高級ソフトウェア言語を使用する必要がありました。現在Delphiで開発されているECU組み込みソフトウェアは、 C言語用の市販コンパイラを使用してコンパイルされています。
ロシアの無線航法衛星サービスフレームワークであるGLONASSの衛星は、米国の全地球測位システム(GPS)と同様に、Modula-2でプログラムされている。[ 21 ]
Turbo Modula-2 は、 Borlandが開発したが未発表のMS-DOS用 コンパイラおよび統合開発環境であった。Borland の共同創設者 Niels Jensen を含む Jensen and Partners が未発表のコードベースを購入し、TopSpeed Modula-2 に改良した。最終的に Clarion (現在の SoftVelocity) に売却され、当時Clarion製品ラインの一部として Modula-2 コンパイラが提供された。 [ 45 ]
Turbo Modula-2 のZilog Z80 CP/Mバージョンは、Borland のライセンスを受けて Echelon によって短期間販売されました。Hitachi HD64180用のコンパニオン リリースは、Micromint によって SB-180 シングルボード コンピュータの開発ツールとして販売されました。[ 46 ]
IBM は、 OS/2とAIXの両方で動作し、IBM のE2エディタで一流のサポートを受けていたModula-2 コンパイラを社内用に持っていました。 [ 47 ] IBM Modula-2 は、 OS/400垂直ライセンス内部コード(実質的に OS/400 のカーネル)の一部に使用されました。 [ 48 ]このコードは、OS/400 がIBM RS64プロセッサ ファミリーに移植されたときにほとんどがC++に置き換えられましたが、一部はオペレーティングシステムの最新リリースに残っています。[ 49 ] [ 50 ] Motorola 68000バックエンドも存在し、組み込みシステム製品で使用されていた可能性があります。[ 47 ]
Modula-2は、一部のオペレーティングシステム(OS)のプログラミングに使用されます。Modula-2のモジュール構造とサポートは、関連する2つのOSで直接使用されています。
Lilithワークステーション用のOSであるMedos-2は、ETHチューリッヒでSvend Erik KnudsenがWirthの助言を受けて開発しました。これは、Modula-2モジュールから構築されたシングルユーザーのオブジェクト指向オペレーティングシステムです。[ 51 ] [ 52 ] [ 53 ]
Kronosワークステーション用のOSであるExcelsiorは、ソビエト連邦科学アカデミーシベリア支部ノボシビルスク計算センター、モジュール式非同期開発可能システム(MARS)プロジェクト、Kronos研究グループ(KRG)によって開発されました。これはModula-2モジュールに基づいたシングルユーザーシステムです。[ 54 ]
フロッピー ディスクの写真