割と簡単に ’標準 Modula-2 / Oberon-2' を試してみたい

# はじめに
Delphi を使っていて、Modula-2 や Oberon-2 と何が違うのか、ふと知りたくなることがあります。Wirth 先生が元々 Pascal で書いた書籍を Modula-2 や Oberon で書き直して改版したものを読んでいると実際にコードを実行して試したい事がよくあります...ないですか？ありますよね？あるでしょ、普通？

## Modula
Pascal の後継言語 (1976 年)。

ソースコードのモジュール化が可能。**モジュール** は UCSD Pascal の unit とは異なり、ソース分割や分割コンパイルだけを目的としたものではない。モジュール化を行う事でオブジェクト指向言語のカプセル化に類似した機能を実現できる。

並行処理のための **プロセス** が実装されている。

レポートが提出された後、すぐに開発は中止され、Modula-2 へと移行した。

**See also:**

 - [Modula (Wikipedia: En)](https://en.wikipedia.org/wiki/Modula)
 - [モジュール (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)
 - [MODULA a language for modular multiprogramming (research-collection.ethz.ch)](https://www.research-collection.ethz.ch/handle/20.500.11850/68669)

## Modula-2
Pascal の後継言語 (1979 年)。Modula をより実用的にしたもの。

プロセスの代わりに **コルーチン** が実装されている。コルーチンとは、端的に言えば中断と再開が可能なサブルーチン (または関数) である。

プログラミング言語 **Mesa** に強い影響を受けている。

Wirth の書籍『Programming in Modula-2』は版によって **PIM** と呼ばれる方言になっている。

| 方言 | 年 | 書籍 |
|:---:|:---:|:---|
| **PIM** | 1982  | [Programming in Modula-2](https://link.springer.com/book/10.1007/978-3-642-96717-7) |
| **PIM2** | 1983 | [Programming in Modula-2 \[第 2 版\]](https://link.springer.com/book/10.1007/978-3-642-96757-3) |
| **PIM3** | 1985 | [Programming in Modula-2 \[第 3 版\]](https://link.springer.com/book/10.1007/978-3-642-96878-5) |
| **PIM4** | 1988 | [Programming in Modula-2 \[第 4 版\]](https://link.springer.com/book/10.1007/978-3-642-83565-0) |

ISO 規格は **ISO/IEC 10514-1:1996** (Standard Modula-2) で、2 つのオプション規格が存在する。

 - **ISO/IEC 10514-2:1998**: Generics Modula-2 (ジェネリクス拡張)
 - **ISO/IEC 10514-3:1998**: Object Oriented Modula-2 (オブジェクト指向拡張)

ジェネリクス拡張やオブジェクト指向拡張はオプションなので、実装してもしなくてもいい。

Delphi には Modula-2 の機能に類似した機能があるが、Pascal 方言を Modula-2 が採用したから似ているのか、Modula-2 の機能を Delphi が採用したから似ているのか、或いはその両方なのか断定できない。

例えば Modula-2 には **LOOP**～**END** という無限ループと、そこから抜ける **EXIT** 手続きがあるが、前身の Modula (1976) や、ほぼ同時期の **Pascal 8000** (1976) にもその機能がある。 Modula-2 にはオープン配列パラメータがあり、Delphi にもオープン配列パラメータがある。

すべての Pascal 方言を知っている訳ではないので「これは Modula-2 由来」と言い切れないのがモヤっとする。さらに言えば、ユニット単位に分割できる Pascal 方言や、コルーチンが使える Pascal 方言もあった。

**See also:**

 - [Modula-2 (Wikipedia)](https://ja.wikipedia.org/wiki/Modula-2)
 - [\[PDF\] Modula-2 (research-collection.ethz.ch)](https://www.research-collection.ethz.ch/bitstream/handle/20.500.11850/68683/eth-3135-01.pdf)
 - [\[PDF\] Modula-2 and object-oriented programming (research-collection.ethz.ch)](https://www.research-collection.ethz.ch/handle/20.500.11850/68705)
 - [Mesa (Wikipedia)](https://ja.wikipedia.org/wiki/Mesa)
 - [PASCAL入門 : PASCAL8000に沿って (kyushu-u.ac.jp)](https://catalog.lib.kyushu-u.ac.jp/opac_download_md/1472538/p133.pdf)
 - [コルーチン (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3)

## Oberon
Modula-2 の後継言語 (1988 年, 1990 年改訂)。Oberon (OS) を記述するために Modula-2 を使おうとしたが問題が発生したために再設計したのが言語としての Oberon である。Oberon を 2007 年に再定義した Oberon-07 / Revised Oberon (2007 年, 2016 年改訂) もある。言語仕様がかなり小さい。

**See also:**

 - [Oberon (Wikipedia)](https://ja.wikipedia.org/wiki/Oberon)
 - [\[PDF\] The Programming Language Oberon (inf.ethz.ch)](https://inf.ethz.ch/personal/wirth/Oberon/Oberon.Report.pdf)
 - [\[PDF\] The Programming Language Oberon(-07) (inf.ethz.ch)](http://people.inf.ethz.ch/wirth/Oberon/Oberon07.Report.pdf)
 - [\[PDF\] Programming in Oberon (2004) (inf.ethz.ch)](https://inf.ethz.ch/personal/wirth/ProgInOberon2004.pdf)

## Oberon-2
Oberon の後継言語 (1991 年) でありスーパーセットだが、Oberon-07 があるため Oberon の方言の一つとも言える。オブジェクト指向拡張を取り入れているが、それでも言語仕様が小さい。

前身は Oberon にオブジェクト指向拡張を施した Object Oberon (1989)。

**See also:**

 - [Oberon-2 (Wikipedia)](https://ja.wikipedia.org/wiki/Oberon-2)
 - [\[PDF\] The Programming Language Oberon-2 (ssw.uni-linz.ac.at)](http://www.ssw.uni-linz.ac.at/Research/Papers/Oberon2.pdf)
 - [Object Oberon (Wikipedia)](https://en.wikipedia.org/wiki/Object_Oberon)
 - [\[PDF\] Object Oberon (research-collection.ethz.cz)](https://www.research-collection.ethz.ch/handle/20.500.11850/68697)


# 純粋な '標準 Modula-2 / Oberon-2' を求めて
Windows 環境で最も簡単に実行できる標準 Modula-2 / Oberon-2 は **XDS-x86** だと思われます。ライセンスは Apache 2.0 です。

 - [XDS Modula-2/Oberon-2 Development System for Windows (GitHub)](https://github.com/excelsior-oss/xds)

Modula-2、Oberon-2 いずれもコンパイルできます。Modula-2 は **ISO/IEC 10514-1** のみの実装です。ジェネリクス拡張もオブジェクト指向拡張も使えません。Oberon は Oberon-2 なのでオブジェクト指向プログラミングが可能です。

Modula-2 や Oberon(-2) は [ideone.com](https://ideone.com/) にもないので、手軽に試す事ができないんですよね...。

**See also:**

 - [Native XDS-x86 User's Manual (fing.edu.uy)](https://www.fing.edu.uy/inco/cursos/prog2/info/docXDS/xc00.html#root)

## XDS-x86 のインストール
Github の `bin` フォルダにあるコンパイル済バイナリを取得します。

 - [xds-x86-2.51.win32.zip](https://github.com/excelsior-oss/xds/raw/master/bin/xds-x86-2.51.win32.zip)

適当な場所に解凍し、`XDS-x86\bin` フォルダにパスを通すだけで使えます。

```
set path=C:\XDS-x86\bin;%PATH%
```

### Modula-2 の Hello,world.
ソースコードはこんな感じです [^2]。

```pascal:HelloModula2.mod
MODULE HelloModula2;
IMPORT InOut;
BEGIN
  InOut.WriteString("Hello,world.");
  InOut.WriteLn;
END HelloModula2.
```

コンパイラのコマンドは `xc` です [^1]。拡張子 `.mod` は Modula-2 用のソースファイルとみなされます。拡張子を無視するには `+M2` オプションを付け、Modula-2 コンパイラを呼び出すことを明示します。

`=m(ake)` オプションを付けると、リンクまで行って実行可能ファイル (.exe) を生成します。つまり、次のコマンドでコンパイルし、実行ファイルを生成します。

```
C:\WORK>xc =m HelloModula2.mod
O2/M2 development system v2.51 TS  (c) 1991-2010 Excelsior, LLC. (build 09.06.2019)
#project is up to date

XDS Link Version 2.11.19 Copyright (c) Excelsior 1995-2008.
No errors, no warnings
```

### Oberon-2 の Hello,world.
ソースコードはこんな感じです [^3]。

```pascal:HelloOberon2.ob2
MODULE HelloOberon2;                     
IMPORT Out;
BEGIN
  Out.String("Hello,World.");
  Out.Ln;
END HelloOberon2.
```

コンパイラのコマンドは `xc` です [^1]。拡張子 `.ob2` は Oberon-2 用のソースファイルとみなされます。拡張子を無視するには `+O2` オプションを付け、Oberon-2 コンパイラを呼び出すことを明示します。

また、Oberon-2 の場合には `+MAIN` オプションを付け、これがメインモジュールである事を明示する必要があります。

`=m(ake)` オプションを付けると、リンクまで行って実行可能ファイル (.exe) を生成します。つまり、次のコマンドでコンパイルし、実行ファイルを生成します。

```
C:\WORK>xc =m HelloOberon2.ob2 +MAIN
O2/M2 development system v2.51 TS  (c) 1991-2010 Excelsior, LLC. (build 09.06.2019)
#project is up to date
New "tmp.lnk" is generated using template "C:/XDS-x86/bin/xc.tem"

XDS Link Version 2.11.19 Copyright (c) Excelsior 1995-2008.
No errors, no warnings
```

# おわりに
とりあえず、目的は達成されました！めでたしめでたし...。
Oberon は去年 30 周年、Modula-2 は今年 40 周年、Pascal は来年 50 周年です。

**See also:**

 - [割と簡単に ’標準 Pascal' を試してみたい (Qiita)](https://qiita.com/ht_deko/items/41e95154e8da2f901698)
 - [後継言語や ISO 規格との比較 - 付録 (標準 Pascal 範囲内での Delphi 入門) (Qiita)](https://qiita.com/ht_deko/items/15b27e00fac9d723d9f0#%E5%BE%8C%E7%B6%99%E8%A8%80%E8%AA%9E%E3%82%84-iso-%E8%A6%8F%E6%A0%BC%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83)
 - [用語集 (標準 Pascal 範囲内での Delphi 入門) (Qiita)](https://qiita.com/ht_deko/items/56e4910d7e00d9bcc5b2)
 - [Wirth 先生の邦訳本を読んでみる](https://qiita.com/ht_deko/items/3086b7cff08928eca7a9)
 - [Modula-2 syntax highlighting and snippets for Visual Studio Code (visualstudio.com)](https://marketplace.visualstudio.com/items?itemName=redstar.m2-vscode)

## Modula-2 についての個人的な感想
個人的には Modula-2 は Wirth 先生が Pascal についてあーだこーだ言われたので頭にきて作った言語だと思っています。Pascal の問題点を Pascal の改訂によって解決するのではなく、最初から問題が存在しない、仕様がコンパクトな言語を作る事に注力した感じです。

商用 Pascal を作っていた会社やそのユーザーは、多少言語仕様が大きくなっても Pascal の問題点は Pascal の拡張によって解決する道を選んだ、って感じです。過去の資産があるのとないのとでは大違いですからね。

## Oberon についての個人的な感想
Oberon は ISO 規格がない事からも、あまり商用コンパイラの需要がなかった感じです。

『X68000 の筐体を担当していた技術者が「ネジが多すぎる！」と言われて頭にきて Compact の筐体はネジ一本でバラせるようにした (バラしやすいとは言っていない)』

という逸話くらいに極端な言語です。ミニマリストというか断捨離というか、確かに変な魅力はあります。**『The Programming Language Oberon』** って、たったの 17P しかないんですよ？

Oberon-2 は Wirth 先生が作ったというより、**Hanspeter Mössenböck** (ハンスペーター・メッセンベック) 氏が作ったという印象が強いです。Object Pascal や Modula-2 のオブジェクト指向拡張もそうですが、Wirth 先生はオブジェクト指向を言語本体に組み込むべきではないと思ってるフシがあります。

あと、OS の方の Oberon は使い方がよくわかりませんでした。でも、確かに Apple の **Macintosh Programmer's Workshop** の操作性にちょっと似てるかも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/ff210515-e5ca-8cb3-f96c-8aa0d672c81f.png)
**See also:**

 - [The Oberon System (V4) (uni-linz.ac.at)](http://www.ssw.uni-linz.ac.at/Oberon.html)
 - [<3> Macintosh 用 Pascal のオブジェクト指向拡張 (Pascal へのオブジェクト指向拡張の歴史と Delphi) (Qiita)](https://qiita.com/ht_deko/items/cd245180363e1911afa7)

[^1]: X68000 の C コンパイラではありません。
[^2]: Qiita では Modula-2 のシンタックスハイライトができないので Pascal のものを使っています。
[^3]: Qiita では Oberon-2 のシンタックスハイライトができないので Pascal のものを使っています。