ADW Modula-2 インストール
ADW Modula-2 のインストールと設定
事前に、「共通設定」ページを参照してください。
ADW Modula-2 は Modula-2 コンパイラの一つです。コンパイラというより統合開発環境と言って良いと思います。
ADW Modula-2 のWebサイトはこちらです ⇒
http://www.modula2.org/adwm2/
ADW Modula-2 は、商用の Stony Brook Modula-2 としてあったものがフリーウェアとしてリリースされたものです。
ISO規格のPart1,2,3すべてに準拠し、ジェネリックとオブジェクト指向に対応しています。その他にADW独自機能の拡張もあります。
IDE は Lazarus や Visual Studio などと比較すると貧弱ですが、GUIのIDEで、プロジェクト管理、ソース編集、ビルド、デバッグができます。
ちなみに、ISO規格以前の Modula-2 の文法やライブラリを PIM と言いますが、これはヴィルト氏の著書「
PROGRAMMING IN MODULA-2」の名前から来ています。PIMにも4つのエディション(PIM, PIM2nd, PIM3rd, PIM4th)があり、少しずつ改定されています。日本では、1986年に日本コンピュータ協会から「Modula-2 プログラミング[改訂第3版]」がPIM3rdの邦訳として出版されています。
日本で Modula-2 の書籍がいろいろ出版されたのはほとんどが1980年代で、内容は PIMエディションのどれかです。または、商用製品の Logitech Modula-2 の解説書籍などです。Logitech Modula-2 は日本でもDOS版が発売されたので、持っていた人もいらっしゃるかと思います。1990年代になると、日本は C/C++言語ブームとなり、 Modula-2 や Pascal の書籍は出なくなりました。ISO Modula-2 や ISO Pascal の日本語の書籍はたぶんないと思います。商用の Delphi の書籍はしばらく出ましたが、現在は少なくなりました。その後、Java、.NET Framework、Web開発と、そちらの需要が高く、Modula-2 や Pascal を取り上げる書籍はありません。
ISO Modula-2 は Part 1 の段階で例外処理に対応しているので、例外の捕捉ができます。
モジュールプログラミング、ジェネリックモジュール、クラス定義、例外捕捉、ソースコードの大文字小文字区別、定義モジュール、実現モジュールの分離、制御文は必ず'END'で閉じるなど、文法は、ISO 拡張 Pascal より強力だと思います。個人的には、Pascal言語より Modula-2言語の方が好き(おもしろい)です。実用面ではやはり Free Pascal (Lazarus) ですが。
ここでは、Windows 32bit/64bit をターゲットとする開発環境をインストールします。(ADW Modula-2 は今のところ Windows版のみ提供されています)
上記のWebサイトのURLを開きます。
以下のWebサイトが開いたら、[download page] のリンクをクリックしてダウンロードページを開きます。
「ADWm2Free.exe」をクリックしてインストーラをダウンロードします。インストールした後は削除してよいので、ダウンロードの場所はどこでもかまいません。このファイルが Windows 32bit と 64bit の両方に対応しています。
旧バージョンのADW Modula-2 をアンインストール |
以前のバージョンがインストールされている場合、事前にアンインストールします。
再インストールをしたい場合も同様です。
Windows 10の場合、[設定]-[アプリ]-[アプリと機能]で「ADW Software Modula-2 version x.x」を選択し[アンインストール]をクリックします。
「ADWM2SetupFree.exe」を実行するとインストールが始まります。
「English」を選択し、[OK]ボタンをクリックします。日本語の選択肢はありません。
[Next>]ボタンをクリックします。
Free Pascal のインストールディレクトリを指定します。
既定の「C:\Program Files (x86)\ADW Software Modula-2」(C:\Program Files (x86)配下)では管理者権限が求められる場合があるので、それ以外のフォルダを指定します。場所は任意ですが、ここでは「
C:\ADW_Modula-2」を指定します。
移行の説明では、このフォルダへのインストールを前提に進めます。
Windowsのスタートメニューの項目名を指定します。特に問題なければ表示のままとし、[Next>]ボタンをクリックします。
デスクトップにアイコンを作成するかどうか聞いてきます。
[Create a desktop icon (ASCII)」と[Create a desktop icon (UNICODE)」をチェックして、[Next>]ボタンをクリックします。
インストールの準備ができたので、設定内容を確認して[Install]ボタンをクリックします。
インストールが開始します。完了するまで待ちます。途中、ポップアップウインドウが表示されますが、終了画面まで待ちます。
セットアップが完了すると、終了画面が表示されます。[Finish]ボタンを押して閉じます。
デスクトップに以下のアイコンが追加されます。
これで、ADW Modula-2 のインストールは完了です。ダウンロード&展開した ADWM2SetupFree.exe は削除してもかまいません。
ADW Modula-2 のランタイムライブラリのビルド (初回に1回だけ実行します) |
本バージョンでは、ランタイムライブラリのビルドが完了していないようなので、ライブラリのビルドを行います。これは初回の1回だけで、それ以降は不要です。ASCII版/Unicode版とも行います。
ADW Modula-2のアイコンをクリックすると、ライブラリ(プロジェクトファイル)の選択が出てきます。
・rtl-win-amd64.sbp
・rtl-win-ia32.sbp
・rtldll-win-amd64.sbp
・rtldll-win-ia32.sbp
「rtl-win-amd64.sbp」と「rtl-win-ia32.sbp」の場合の手順です。(切り替えはIDEを再起動します)
ライブラリを選択して[OK]ボタンを押します。
[Modules that have changed]のダイアログメッセージが出たらランタイムのビルドが必要です。出なければ必要ないので次ランタイムに進んでください。
[OK]ボタンを押してダイアログメッセージを閉じます。
メニューの[Build]-[Make object libraly]を実行します。
[OK]ボタンを押して[Buils Status]を閉じます。
選択したランタイムのビルドは完了です。IDEを終了します。
「rtldll-win-amd64.sbp」と「rtldll-win-ia32.sbp」の場合の手順です。(切り替えはIDEを再起動します)
ライブラリを選択して[OK]ボタンを押します。
[Modules that have changed]のダイアログメッセージが出たらランタイムのビルドが必要です。出なければ必要ないので次ランタイムに進んでください。
[OK]ボタンを押してダイアログメッセージを閉じます。
メニューの[Build]-[Link all programs]を実行します。
[OK]ボタンを押して[Buils Status]を閉じます。
選択したランタイムのビルドは完了です。IDEを終了します。
これでランタイムのビルドは完了です。
ADW Modula-2 は IDE で操作する場合、特にPATH(環境変数)の設定は不要です。デスクトップのアイコンやメニューから[ADW Software Modula-2]を起動すると IDE が起動します。IDE のプログラムは m2e.exe です。
コマンドプロンプトから、m2e.exe や他のツールを使用する場合は、PATHの設定が必要です。
コマンド(環境)には、ASCII版とUnicode版があります。
以下のコマンドスクリプトをメモ帳(Notepad.exe)やエディタで作成し、C:\CMD ディレクトリに 「adwm2a.cmd」(ASCII版)と「adwm2u.cmd」(UNICODE版)というファイルで保存します。以下の「
C:\ADW_Modula-2」の部分はインストールしたフォルダを設定してください。
@ASCII版 - aswm2a.cmd
@ECHO OFF
REM
REM ADW Modula-2 環境変数設定(ASCII版)。
REM
CALL resetpath.cmd
PATH C:\ADW_Modula-2;%PATH%
※ resetpath.cmd は「共通設定」ページで作成したコマンドスクリプトファイルです。
AUnicode版 - aswm2u.cmd
@ECHO OFF
REM
REM ADW Modula-2 環境変数設定(Unicode版)。
REM
CALL resetpath.cmd
PATH C:\ADW_Modula-2;%PATH%
※ resetpath.cmd は「共通設定」ページで作成したコマンドスクリプトファイルです。
コマンドプロンプトを起動し、adwm2a または adwm2u を実行した後に、m2e を実行すると ADW Mosula-2 の IDE が起動します。デスクトップアイコンやメニューからの起動と同じです。
以降は、adwm2a(ASCII版)で説明します。
Microsoft Windows [Version 10.0.19045.3393]
(c) Microsoft Corporation. All rights reserved.
C:\PG>adwm2a
C:\PG>m2e
C:\PG>
IDE(m2e) が起動します。
メニューの [File]-[Exit environment] または、右上の[×]のクリックで IDE は終了します。
ADW Modula-2 の Hello, world.
ADW Modula-2 は コンパイルも IDE(m2e)で行います。コマンドラインで使用する単体のコンパイラもあるようですが、単体で使用する説明がないので。IDEから呼び出されるので前提のようです。専用のスクリプトで m2e を自動起動してビルドすることもできるので、人が介入しないバッチ処理も可能です。
ADW Modula-2 のHollo, world. (その1) |
「はじめに」ページで示したModula-2版 Hello, world. のメッセージを「世界よ、こんにちは。」に変えてコンパイル(ビルド)したいと思います。日本語を含んだプログラムソースのコンパイルができるかどうかは結構重要な問題です。
ADW Modula-2では、文字コードはShift-JIS(コードページ932)を使用してください。日本語Windowsの標準の文字コードはコードページ932です。
C:\PG\ADWModula-2 に Hello というサブディレクトリを作成しておきます。
また、基本的には1つのプログラムは1つのサブディレクトリを用意して、その中で IDE(m2e) がプロジェクトとして管理します。ソースファイルは複数のときもあります。
ADW Modula-2 についての説明は別途行いますので、ここでは正しくコンパイル(ビルド)できる環境ができたことを確認してください。
IDE(m2e) を起動し、[File]-[New Project...]を選択します。
ディレクトリ C:\PG\ADWModula-2\Hello に「Hello」というプロジェクトを作成します。
[保存(S)]をクリックします。
保存時に、プロジェクトのターゲットシステムを選択します。
[Processor]で、「IA32」か「AMD64」を選択します。「IA32」は32bitで、「AMD64」は64bitになります。
どちらでも良いのですが、ここでは「IA32」で進めます。
プロジェクトが作成されました。ファイル名は、Hello.sbp として保存されました。
クライアント領域に表示されている「SBP」はプロジェクトのことで、「rtl-win-ia32」は、Windowsの32bitのランタイムシステムということです。
まだソースファイルはありません。
プロジェクトを作成すると、[Option]メニューが表示されます。IDE(m2e)は、デフォルトのフォントでは日本語が表示されないので、ここで設定します。
フォントの設定は1回行うと以降継続されるので、次回からは不要です。
まず、プロジェクトの表示フォントを設定します。
[Option]-[Diaply options...]を選択します。
Project Display Option ダイアログで、[Font]ボタンをクリックします。フォントは、「Normal」の設定だけで一覧のすべてが変わります。
フォントダイアログで、[フォント名(F)]には「MS ゴシック」など日本語表示が可能なフォントを設定し、[文字セット(R)]を「日本語」に設定します。
[OK]ボタンをクリックして確定します。Project Display Option ダイアログも[OK]ボタンをクリックして閉じます。
次に、エディタの表示フォントを設定します。
[Option]-[Editor options...]を選択します。
Editor Option ダイアログで、[Colors & Font]タブを選択し、[Font]ボタンをクリックします。フォントは、「Normal」の設定だけで一覧のすべてが変わります。
フォントダイアログで、[フォント名(F)]には「MS ゴシック」など日本語表示が可能なフォントを設定し、[文字セット(R)]を「日本語」に設定します。
[OK]ボタンをクリックして確定します。Editor Option ダイアログも[OK]ボタンをクリックして閉じます。
プロジェクトにプログラムのソースファイルを追加します。
[File]-[New module...]を選択します。
New Module ダイアログで、[Module Name]に「Hello」と入力します。これはファイル名ではなくModula-2のモジュール名です。
メインプログラムのモジュールを作成するので、[Module Types]は[Program]を選択し、[OK]ボタンをクリックします。
モジュールが作成されました。ファイル名は、Hello.modで、プロジェクトのディレクトリに mod サブディレクトリが自動的に作成されて、そこに保存されます。
クライアント領域に表示されている「PGM」はプログラムのことで、「Hello」はモジュール名です。
ステータスバーに選択したモジュールのファイル名の相対パスが表示されます。
モジュールを選択し、メニューの[Module]-[Edit]を選択するか、クライアントに表示されているモジュールをダブルクリックまたはエンターキーを押すとソースファイルの編集ができます。
画面下部に[1 Hello.mod]のタブが追加され、エディタモードになります。[0 Project]タブを選択すると、上記のプロジェクト表示になります。つまり、タブ切り替えで表示も切り替わります。以下のソースコードをエディタに入力します。カーソル位置でのかな漢字には対応していないので、変換過程は別の場所に表示されますが、確定すると入力されます。慣れたテキストエディタで作成してコピー&ペースとしても良いでしょう。エディタを使用する場合、文字コードは Shift-JIS(コードページ932)で作成してください。
以下のプログラムを入力してください。入力したら、[File]-[Save]を選択して保存します。ツールバーのフロッピーボタンのクリックでも保存できます。
(* Modula-2のHello, world. (日本語版) *)
MODULE Hello;
FROM STextIO IMPORT WriteString, WriteLn;
BEGIN
WriteString("世界よ、こににちは。");
WriteLn
END Hello.
これで、プロジェクトとソースファイルの用意ができましたが、このままビルドしても「世界よ、こんにちは。」は表示されません。
デフォルトのリンカオプションが、GUIモードになっているためです。このプロジェクトのリンカオプションをコンソールアプリケーションモードに設定します。
[Options]-[Linker options]を選択します。
Linker Options ダイアログで[Win32]タブを選択し、[Console Application]をチェックします。
[OK]ボタンをクリックし、Linker Options ダイアログを閉じます。
これで、ビルドの準備ができました。
[Build]-[Link selected or default]を選択するか、ツールバーの[Link the selected program]ボタンをクリックするとビルドして、Hello.exe ができます。
ビルドの状況と結果が表示されます。エラーがないことを確認して[OK]ボタンをクリックしてIDE(m2e)に戻ります。
IDE(m2e)からの実行ではコマンドプロンプトを開いて表示すると瞬時に閉じてしまうので、コマンドプロンプトで実行してみます。
Hello.exe があることを確認して、Hello.exe を実行します。
C:\PG>CD ADWModula-2\Hello
C:\PG\ADWModula-2\Hello>DIR Hello.exe
ドライブ C のボリューム ラベルは System です
ボリューム シリアル番号は 0491-C09E です
C:\PG\ADWModula-2\Hello のディレクトリ
2023/09/10 13:24 20,992 Hello.exe
1 個のファイル 20,992 バイト
0 個のディレクトリ 1,210,956,894,208 バイトの空き領域
C:\PG\ADWModula-2\Hello>Hello
世界よ、こんにちは。
C:\PG\ADWModula-2\Hello>
ADW Modula-2 のHollo, world. (その2) |
モジュールプログラミング版の Hello, world. を作って実行してみます。
IDE表示とエディタ表示のフォント設定は先に済んでいるので不要です。
IDE(m2e)が前のプロジェクトを開いていたら、[File]-[Close Project]を選択してプロジェクトを閉じます。IDE(m2e)を起動していなければ起動します。
[File]-[New Project...]を選択します。
ディレクトリ C:\PG\ADWModula-2\Hello2 に「Hello2」というプロジェクトを作成します。[新しいフォルダー]でHello2を作成してください。
[保存(S)]をクリックします。
保存時に、プロジェクトのターゲットシステムを選択します。
[Processor]で、「IA32」か「AMD64」を選択します。「IA32」は32bitで、「AMD64」は64bitになります。
どちらでも良いのですが、ここでは「IA32」で進めます。
プロジェクトが作成されました。ファイル名は、Hello.sbp として保存されました。
クライアント領域に表示されている「SBP」はプロジェクトのことで、「rtl-win-ia32」は、Windowsの32bitのランタイムシステムということです。
まだソースファイルはありません。
プロジェクトにメインモジュールのソースファイルを追加します。
メニューで[File]-[New module...]を選択するか、ツールバーの[Create a new module in this project]ボタンをクリックします。。
New Module ダイアログで、[Module Name]に「Hello2」と入力します。これはファイル名ではなくModula-2のモジュール名です。
メインプログラムのモジュールを作成するので、[Module Types]は[Program]を選択し、[OK]ボタンをクリックします。
プロジェクトに外部モジュールのソースファイルを追加します。
メニューで[File]-[New module...]を選択するか、ツールバーの[Create a new module in this project]ボタンをクリックします。。
New Module ダイアログで、[Module Name]に「Greetings」と入力します。これはファイル名ではなくModula-2のモジュール名です。
メインプログラムで使用する外部モジュールを作成するので、[Module Types]は[Module]を選択し、[OK]ボタンをクリックします。
これで必要なファイルは揃いました。外部モジュールは、定義モジュールと実現モジュールの2ファイル構成となります。
・
IMP Greetings… モジュールGreetingsの実現モジュール (ファイル名:def\Greetings.def)
・
DEF Greetings… モジュールGreetingsの定義モジュール (ファイル名:mod\Greetings.mod)
・
PGM Hello2 … メインモジュールHello (ファイル名:mod\Hello2.mod)
このプロジェクトのリンカオプションをコンソールアプリケーションモードに設定します。
[Options]-[Linker options]を選択します。
Linker Options ダイアログで[Win32]タブを選択し、[Console Application]をチェックします。
[OK]ボタンをクリックし、Linker Options ダイアログを閉じます。
各モジュールファイルにプログラムを記入します。IDE(m2e)のエディタでも、他のテキストエディタでもかまいません。他のテキストエディタで返照する場合は、IDE(m2e)では開かないでください。IDE(m2e)で開くとファイルに排他がかかり他のエディタでは編集できません。またビルド前にファイルの保存を忘れないでください。
■ PGM Hello2 (mod\Hello2.mod) ■
(*****************************************************************************)
(* プログラム:Hello2 *)
(*****************************************************************************)
MODULE Hello2;
FROM StdChans IMPORT OutChan; (* StdChansモジュールからOutChanをインポート *)
FROM Greetings IMPORT SayHello; (* GreetingsモジュールからSayHelloをインポート *)
CONST
MSG = "世界よ、こんにちは。";
BEGIN
SayHello(OutChan(), MSG); (* GreetingsモジュールのSayHelloの呼び出し *)
END Hello2.
■ DEF Greetings (def\Greetings.def) ■
(*****************************************************************************)
(* 定義モジュール:Greetings *)
(*****************************************************************************)
DEFINITION MODULE Greetings;
IMPORT IOChan; (* IOChanモジュール全体をインポート *)
PROCEDURE SayHello(cid: IOChan.ChanId; msg: ARRAY OF CHAR);
END Greetings.
■ IMP Greetings (mod\Greetings.mod) ■
(*****************************************************************************)
(* 実現モジュール:Greetings *)
(*****************************************************************************)
IMPLEMENTATION MODULE Greetings;
FROM IOChan IMPORT ChanId; (* IOChanモジュールからChanIdをインポート *)
FROM TextIO IMPORT WriteString, WriteLn; (* TextIOモジュールからWriteStringとWriteLn *)
(* をインポート *)
PROCEDURE SayHello(cid: ChanId; msg: ARRAY OF CHAR);
BEGIN
WriteString(cid, msg);
WriteLn(cid);
END SayHello;
END Greetings.
これで、ビルドの準備ができました。
[Build]-[Link selected or default]を選択するか、ツールバーの[Link the selected program]ボタンをクリックするとビルドして、Hello2.exe ができます。
ビルドの状況と結果が表示されます。エラーがないことを確認して[OK]ボタンをクリックしてIDE(m2e)に戻ります。
IDE(m2e)からの実行ではコマンドプロンプトを開いて表示すると瞬時に閉じてしまうので、コマンドプロンプトで実行してみます。
Hello2.exe があることを確認して、Hello2.exe を実行します。
C:\PG>CD ADWModula-2\Hello2
C:\PG\ADWModula-2\Hello2>DIR Hello2.exe
ドライブ C のボリューム ラベルは System です
ボリューム シリアル番号は 0491-C09E です
C:\PG\ADWModula-2\Hello2 のディレクトリ
2023/09/10 13:34 20,992 Hello2.exe
1 個のファイル 20,992 バイト
0 個のディレクトリ 1,210,951,213,056 バイトの空き領域
C:\PG\ADWModula-2\Hello2>Hello2
世界よ、こんにちは。
C:\PG\ADWModula-2\Hello>
プロジェクト Hello2 を例に、IDE(m2e)をGUIで使用せず、コマンドラインでビルドする方法を説明ます。
プロジェクトファイル Hello2.sbp と同じ場所にクリプトファイル Hello2.sbs を作成します。スクリプトファイルの拡張子は .sbs です。注意してください。
■ Hello2.sbs ■
Hello2;
BEGIN
OpenProject("Hello2.sbp");
LinkAllPrograms;
CloseProject;
ExitProgram;
END Hello2.
スクリプトを作成すると、m2e.exe を以下の書式で起動すると、IDEを起動して、スクリプトを実行します。
書式: M2E -Script:<スクリプトファイル名>
スクリプトの中で、ExitProgram を呼び出しているので、スクリプトが正常に終了すると、IDEも閉じます。
この書式の場合、コンパイルエラーなどスクリプト実行中にエラーが発生するとIDEがエラーを表示し、そこで中断します。この場合、IDEは起動したままになります。
もし、エラーがあってもスクリプトを遂行し、終了後IDEも終了させたい場合は、以下の書式で起動します。実行時のIDEも最小化表示にします。
書式: M2E -Minimized -Unattended -Script:<スクリプトファイル名>
Hello2 の場合、以下のように実行します。
C:\PG>CD ADWModula-2\Hello2
C:\PG\ADWModula-2\Hello2>M2E -Minimized -Unattended -Script:Hello2.sbs
C:\PG\ADWModula-2\Hello>
エラーやワーニングがあった場合は、「ソースファイル名.err」 に出力されます。
また、M2Eの終了コードで以下の状態が返されます。
0:Success
1:The build was interrupted/stopped by you.
2:Compiler error
3:Linker error
4:Librarian error
5:Debug packer error
6:A file was not found
7:An imported module was not compiled.
8:A stray symbol or object file exists in sym/obj directory.
9:All other errors
これらを利用して、以下のようなコマンドスクリプトファイルを作成すると便利になると思います。これを参考にアレンジしてみてください。
■ Build.cmd ■
@ECHO OFF
SETLOCAL
CD /D %~dp0
SET SCRIPT=Hello2.sbs
M2E -Minimized -Unattended -Script:%SCRIPT%
SET M2STATUS=%ERRORLEVEL%
IF %M2STATUS% == 0 (
SET MSG=Success
) ELSE"
IF %M2STATUS% == 1 (
SET MSG=The build was interrupted/stopped by you.
) ELSE"
IF %M2STATUS% == 2 (
SET MSG=Compiler error
) ELSE"
IF %M2STATUS% == 3 (
SET MSG=Linker error
) ELSE"
IF %M2STATUS% == 4 (
SET MSG=Librarian error
) ELSE"
IF %M2STATUS% == 5 (
SET MSG=Debug packer error
) ELSE"
IF %M2STATUS% == 6 (
SET MSG=A file was not found
) ELSE"
IF %M2STATUS% == 7 (
SET MSG=An imported module was not compiled.
) ELSE"
IF %M2STATUS% == 8 (
SET MSG=A stray symbol or object file exists in sym/obj directory.
) ELSE"
SET MSG=All other errors
)))))))))
ECHO STATUS:%MSG%
FOR %%I IN (*.err) DO (
ECHO:
ECHO 【%%I】
TYPE %%I
)
ENDLOCAL
このコマンドスクリプトを実行すると、プロジェクト Hello2 をビルドします。
C:\PG>CD ADWModula-2\Hello2
C:\PG\ADWModula-2\Hello2>Build
STATUS:Success
C:\PG\ADWModula-2\Hello>
エラーがあれば、「ソースファイル名.err」 に書き込まれています。
ここまでできれば、ADW Modula-2 のビルド環境は完了です。
うまくいかなかった場合は、「共通設定」ページと本ページを再度見直してください。