カテゴリー別アーカイブ: Modula-2

ADW Modula-2 – June 28, 2017 リリース

ADW Modula-2 の2017/6/28版 がリリースされました。

ADW Modula-2 ページのダウンロードページを開くと、「ADWM2Setup.exe」のダウンロードができます。

インストールや開発手順などは変わりません。

ADW Modula-2 Build 1.7 – February 24, 2017 リリース

ADW Modula-2 の2017/2/24版 がリリースされました。ビルド番号は変わらず1.7のようです。

ADW Modula-2 ページのダウンロードページを開くと、「ADWM2Setup.exe」のダウンロードができます。

インストールや開発手順などは変わりません。

ADW Modula-2 Build 1.7 – September 30, 2016 リリース

ADW Modula-2 の最新版 Build 1.7 がリリースされました。

ADW Modula-2 ページのダウンロードページを開くと、「ADWM2SetupFree.exe」のダウンロードができます。
ダウンロードがZipファイルではなく直接exeファイルとなりましたが、
インストールや開発手順などはBuild 1.6と変わりません。

Modula-2 R10 (その3)

ベンジャミン・コヴァルシュさんからModula-2 R10に関するフィードバックをいただきました。
「Modula-2 R10 (その2)」への1件のフィードバック

オープンソースでコンパイラの開発が始まったそうです。
以下がソースコードのURLです。
https://bitbucket.org/trijezdci/m2r10/src/tip/bootstrap/m2bst

ADW Modula-2 Build 1.6.291 – Jan 20, 2015 リリース

ADW Modula-2 の最新版 Build 1.6.291 がリリースされました。

ADW Modula-2 ページの表示にはまだ記載がありませんが、ダウンロードページを開くと、「ADWm2Free.16.zip」のダウンロードができます。
リリース情報がないので、前回のBuild 1.6.281から何が変わったのかわかりませんが、インストールや開発手順などはBuild 1.6.281と変わりません。

ADW Modula-2 Build 1.6.281 – August 12, 2014 リリース

ADW Modula-2 の最新版 Build 1.6.281 がリリースされました。

Build 1.6.280 がリリースされたばかりですが、次のビルドです。
何が変わったのかわかりませんが、インストールや開発手順などはBuild 1.6.280と変わりません。

ADW Modula-2 Build 1.6.280 – August 6, 2014 リリース

ADW Modula-2 の最新版 Build 1.6.280 がリリースされました。
Version 7.24 が公開停止してから久しぶりの公開です。
Pascal日和ホームページ の「ADW Modula-2 コンパイラの設定」ページも Build 1.6.280 用に修正しました。ダウンロードするファイルが違うだけで、インストール手順自体はほとんど同じです。
ASCII版とUnicode版の2のモードがインストールされるようになりました。コマンドやライブラリがそれぞれ別のフォルダに用意されます。
Unicode版では、CHARがUCHAR(16bit)として扱われるようです。日本語などで有効かと思ったのですが、まだどういう使い方をすれば良いか分からないので、うまくいきませんでした。
ASCII版は、Version 7.24 までと同様に使えます。

XDS Modula-2の例外検出について。

XDS Modula-2 のランタイムシステムは、以下のすべてを検出します。
【整数のゼロ除算】
【整数のオーバーフロー】
【配列の範囲オーバー】
【不正アドレス(nilポインター)のアクセス】
【スタックオーバーフロー】

XDS 2.51、XDS 2.6 beta 2 ともにクリアです。

ちなみに、ADW Modula-2 では、配列の範囲オーバーは検出しませんでした。他のチェックオプションはありましたが、なぜか範囲チェックのオプション設定自体が見当たりません。

ExTest.p の Modula-2 版のソースを以下に示します。ソースはExTest.modとます。
コンパイラのチェックも厳しく、単純に例外が予測できるコードを書くとコンパイル時にエラーとなるので、若干変えています。また、Pascal版もModula-2版も、メニューは繰返し表示するようにしていますが、実際には例外の捕捉はしていないので、例外検出でプログラムが終了します。ここではプログラムが終了してしまうことが問題では無く、終了しないことを問題としています。Free PascalとXDS Modula-2/ADW Modula-2では例外の捕捉を追加し、処理を継続させることができます。
コンパイルは、XDS Modula-2 をインストールし、次のようにします。

xc =make ExTest.mod
(* 例外テストプログラム *)
MODULE ExTest;

FROM STextIO  IMPORT WriteString, WriteLn, SkipLine;
FROM SWholeIO IMPORT WriteInt, ReadInt;
FROM RealMath IMPORT round;
FROM SYSTEM   IMPORT CAST;

VAR
    N : INTEGER;

PROCEDURE Menu;
BEGIN
  WriteLn;
  WriteString('*** テストケース ***');
  WriteLn;
  WriteString('1) 整数のゼロ除算');
  WriteLn;
  WriteString('2) 整数のオーバーフロー(加算)');
  WriteLn;
  WriteString('3) 整数のオーバーフロー(乗算)');
  WriteLn;
  WriteString('4) 整数のオーバーフロー(実数⇒整数)');
  WriteLn;
  WriteString('5) 配列範囲オーバー');
  WriteLn;
  WriteString('6) nilポインターアクセス');
  WriteLn;
  WriteString('7) スタックチェック');
  WriteLn;
  WriteString('9) 終了');
  WriteLn;
  WriteString('テストNo. (1..7, 9)?');
  ReadInt(N);
  SkipLine;
END Menu;

PROCEDURE IntZero(): INTEGER;
BEGIN
    RETURN 0;
END IntZero;

PROCEDURE MaxInt(): INTEGER;
BEGIN
    RETURN MAX(INTEGER);
END MaxInt;

PROCEDURE Test1;
VAR
    A, B, C: INTEGER;
BEGIN
    A := 1;
    B := IntZero();
    C := A DIV B;                       (* ここで整数のゼロ除算 *)
    WriteInt(A, 0);
    WriteString(' div ');
    WriteInt(B, 0);
    WriteString(' = ');
    WriteInt(C, 0);
    WriteLn;
END Test1;

PROCEDURE Test2;
VAR
    A: INTEGER;
BEGIN
    WriteString('A := MAX(INTEGER)');
    WriteLn;
    A := MaxInt();
    WriteString('A := A + 100');
    WriteLn;
    A := A + 100;                       (* ここで整数オーバフロー *)
    WriteString('A = ');
    WriteInt(A, 0);
    WriteLn;
END Test2;

PROCEDURE Test3;
VAR
    A: INTEGER;
BEGIN
    WriteString('A := MAX(INTEGER)');
    WriteLn;
    A := MaxInt();
    WriteString('A := A * 100');
    WriteLn;
    A := A * 100;                       (* ここで整数オーバフロー *)
    WriteString('A = ');
    WriteInt(A, 0);
    WriteLn;
END Test3;

PROCEDURE Test4;
VAR
    A: INTEGER;
BEGIN
    WriteString('A := MAX(INTEGER)');
    WriteLn;
    A := MaxInt();
    WriteString('A := A * 100');
    WriteLn;
    A := round(CAST(REAL, A) * 100.0);  (* ここで整数オーバフロー *)
    WriteString('A = ');
    WriteInt(A, 0);
    WriteLn;
END Test4;

PROCEDURE Test5;
VAR
    V: ARRAY [1..10] OF INTEGER;
    I: INTEGER;
BEGIN
    FOR I := 1 TO 11 DO
        WriteString('V[');
        WriteInt(I, 2);
        WriteString('] = ');
        WriteInt(I, 2);
        WriteLn;
        V[I] := I;                      (* I=11で範囲オーバー *)
    END;
END Test5;

PROCEDURE Test6;
VAR
    A: INTEGER;
    P: POINTER TO INTEGER;
BEGIN
    WriteString('P := NIL');
    WriteLn;
    P := NIL;
    WriteString('P^ := 10');            (* ここでNILアクセス *)
    WriteLn;
    P^ := 10;
    WriteString('A := P^');
    WriteLn;
    A := P^;
    WriteInt(A, 0);
    WriteLn;
END Test6;

PROCEDURE Test7;
    PROCEDURE Test7a(D: INTEGER);
    VAR
        V: ARRAY [1..1000] OF INTEGER;
    BEGIN
        WriteInt(D, 8);
        INC(D);
        Test7a(D);
    END Test7a;
BEGIN
    Test7a(1);
END Test7;

BEGIN
    REPEAT
        Menu;
        CASE N OF
              1: Test1;
            | 2: Test2;
            | 3: Test3;
            | 4: Test4;
            | 5: Test5;
            | 6: Test6;
            | 7: Test7;
        ELSE
            ; (* 何もしない *)
        END;
    UNTIL N = 9;
END ExTest.

XDS Modula-2 2.51 インストール時の注意事項

ADW Mudula-2 がしばらく待たされそうなので、XDS Modula-2 をインストールする場合、以下の点に注意して下さい。Windows版の話です。
Version 2.51 のインストールの途中で以下の画面が現れます。「Personal」がログインユーザのみで「Common」が全ユーザというお決まりの選択です。ここで「Common」を選択すると、システムのPATHの設定が「C:\XDS\BIN」で上書きされ、「C:\XDS\BIN」だけになってしまいます。ユーザのPATH設定は変りませんが、これまでのシステムのPATHが丸ごと消えることになるので、ここでは「Personal」を選んで下さい。その場合は、ユーザの環境変数の末尾に「C:\XDS\BIN」が追加され、既存の設定は消えません。
「Common」にしたい場合は、事前にシステムの環境変数の設定値をテキストファイルなどに保存しておいて事後にそれから設定を復元して下さい。

万が一、システムの環境変数を書き換えられて事前の保存もしていなかった場合は、[システムのプロパティ]-[システムの保護]の[システムの復元]で、直近の復元ポイントに戻すとPATHもその時点に復元されます。ただし、復元ポイント以降のインストールや設定は無効になります。

また、XDS Modula-2 2.6 Beta の場合は上記の画面は出ません。インストールすると「C:\XDS\bin;」がシステムの環境変数の先頭に挿入されます。既存の設定が消されることはありません。

でも、環境変数の状態は何かインストールする場合の前後で保存しておくのが賢明です。