1985 年以降の Micro Focus での COBOL 言語の進化

ANS85 規格

COBOL プログラミング言語には、1960 年代初頭のグレース ホッパー提督の時代にまでさかのぼる、非常に長い歴史がありますが、ANS85 COBOL 規格の公開で成熟しました。その時点までに、COBOL ユーザーは膨大な数に上り、すでに世界中で莫大な数のビジネスが展開されていました。ただし、ANS85 COBOL は COBOL の最初の「モダン」バージョンであり、すべての文の終了にピリオド/終止符を使用する不評な手法に頼ることなく、END IF などの範囲区切り文字を使用してコードを適切に構造化できるようになりました。また、インラインの PERFORM 文を使用して適切なループ構造を提供する COBOL の最初のバージョンでもあり、GO TO 文を広範に使用する必要がなくなりました。当時、軽微な非互換性が原因で論争が起こり、標準化団体を訴えるという脅迫もありました。この反応の強さから、COBOL がいかに重要視されていたかがわかります。

オブジェクト指向プログラミングおよび ISO2002 標準規格

ANS85 規格が公開された頃、プログラミング業界では、オブジェクト指向プログラミングやグラフィカル インターフェイスなどの概念が注目されるようになっていました。この関心を大いに刺激したのが Xerox Parc における研究成果で、Xerox Parc は最初のウィンドウ ソフトウェアとともに Smalltalk 言語を開発しました。Smalltalk は、プリミティブ整数などを含むすべてがオブジェクトである「純粋な」オブジェクト指向言語でした。一方、C++ および Objective C は、オブジェクト指向の概念を既存の C 言語に移植することを目的としたハイブリッド言語でした。

COBOL 業界もすぐに続き、1987 年までに ISO の COBOL 標準委員会は、オブジェクト指向の概念を COBOL 言語に組み込むことを調査するためのワーキング グループを設立しました。同時に、Micro Focus はオブジェクト指向のプロトタイプに取り組んでいました。標準グループの成果に基づく部分もあれば、そのグループに情報提供する部分もありました。提案されたオブジェクト指向構文は、Smalltalk の視点を持つ人々からの情報提供、および C++/Objective C の環境からの情報提供を受けて、何度も反復されました。その結果、クラスまたはファクトリ オブジェクト (クラスのインスタンスではなくクラス自体を表す概念的なオブジェクト) の概念を含む Smalltalk の多くの側面を保持するものになりました。クラス オブジェクトのメソッドは、他の実装の静的メソッドにほぼ対応しています。

新しい規格は最終的に 2002 年に公開されましたが、1985 年版の規格ほどの成功はありませんでした。現在まで、規格を完全に実装しているベンダーはなく、実際、新しいバージョンではその大半がオプションになっています。Micro Focus は、規格のオブジェクト指向の側面の完全な実装を実現し、ユーザーから評価を得ています。この実装は、Dialog System GUI 設計ツールのその後の実装の基礎として機能しています。

.NET COBOL 構文拡張

2002 年版の規格の公開直前に、Micro Focus は新しい .NET プラットフォームについて検討を始めました。.NET プラットフォームは、Microsoft が他の多くのソフトウェア ベンダーと連携して開発したプラットフォームで、ECMA によって標準として公開されています。「関連情報」を参照してください。

IL、中間コードおよび生成コード

.NET の中心は、一般に中間言語 (IL) と呼ばれる抽象マシンであり、中核となる考え方は、さまざまな言語のコンパイラがすべて、「各自の」言語で記述されたコードを同じ IL に変換できるというものです。Micro Focus は、1970 年代後半に独自の COBOL 抽象マシンを開発しており、抽象マシンの概念に非常に精通していました。当初は、Micro Focus コンパイラ (当時は CIS (Compact Intermediate Standard) COBOL と呼ばれていた) が COBOL を一連の抽象マシン命令に変換した後、その命令がランタイム システムによって実行時に解釈されていました。その後、Micro Focus は、当時の主要な CPU 用のコード ジェネレーターを作成しました。これにより、この抽象マシンが実際のマシン コードに直接変換されるようになったため、解釈されたコードよりも実行速度がはるかに高速になりました。

Just-In-Time コンパイル

.NET IL およびそれに先行する Java 仮想マシンは、「Just-In-Time」コンパイル (「JIT」) 用に設計されているという点で少し異なっていました。JIT の背景にある考え方は、解釈したり特定の命令セットにコンパイルしたりするのではなく、実行時に抽象マシン コードをロードし、CPU で使用されている実際の命令セットにその場で変換するというものです。つまり、同じコードをまったく異なるチップセット (32 ビットと 64 ビットなど) で実行でき、コードを実行環境に合わせて最適化できます。

Micro Focus は、.NET Framework をターゲットとするコンパイラの開発に着手した際、従来の「手続き型」COBOL に重点を置きました。つまり、COBOL からクラスを作成し、作業場所節の内容をそのクラスのインスタンス データにして、手続き部をインスタンス メソッドにしました。手続き部に存在する可能性のある ENTRY 文に対して、追加のメソッドが作成されました。

.NET COBOL 構文

オブジェクト指向 COBOL についてどのように取り組むか考えた際に、ISO 2002 COBOL のすべての側面を実装できるわけではないことは明らかでした。.NET IL は、特定のコンピューター言語に縛られないという点で非常に汎用的ですが、一方で、オブジェクト指向の環境がどのようなものかについての独自の非常に特殊な考えを組み込んでいます。したがって、多重継承は .NET には実装されていないため、オブジェクト指向 COBOL の .NET バージョンには実装されません。クラス オブジェクトは、静的メソッドやフィールドなどのより単純な概念に置き換えられます。一方、ISO 2002 構文は、COBOL プログラマーが .NET プラットフォームに完全かつ簡単に統合できるものではありませんでした。

追加の構文の完全なリストは非常に長いですが、値型、デリゲート、列挙、反復子メソッド、演算子のオーバーロード、実行時にサイズが決定される 1 次元配列および多次元配列などが含まれます。

また、ISO2002 構文は、必要以上に語が多く、複雑であることがわかりました。Micro Focus が言語に導入したいくつかの単純化の概念を示すために、.NET 文字列オブジェクトを操作する 2 つの短い例を次に示します。1 つ目では ISO2002 構文を使用し、2 つ目では Micro Focus 構文拡張を使用します。

ISO2002 構文:

       repository.
           class sys-string as "System.String"
           property len as "Length".
       01 s1 object reference sys-string.
           set s1 to "Hello world"
           display len of s1

ISO2002 構文では、外部クラスまたはプロパティ (クラス System.String やそのプロパティ Length など) への参照を、最初にいわゆる REPOSITORY 節の COBOL 名に関連付けてから、この COBOL 名を介して参照する必要があります。

Micro Focus 構文:

       01 s1 type System.String.
           set s1 to "Hello world"
           display s1::Length

Micro Focus (MF) 構文では、クラス (およびインターフェイスやデリゲートなどの他の型) は、type キーワードを使用して直接参照できます。プロパティ (およびメソッド、フィールド、イベントなどのクラスの他のメンバー) は、:: 演算子を使用して直接参照できます。

文「display len of s1」は非常に不明瞭で、読み取りプログラムは repository にある「len」の定義を見つけに行く必要がありますが、文「display s1::Length」は明示的かつ直感的です。

JVM COBOL

COBOL for .NET の最初のバージョンは、2003 年に Micro Focus Net Express 製品の一部としてリリースされました。その後まもなく、Java 環境の Java 仮想マシンでも .NET の場合と同じことを実現できるかどうかを検討し始めました。最終的に、2010 年に Visual COBOL 製品の一部として COBOL for JVM の最初のリリースが公開されました。JVM 製品の目的は、JVM 製品と .NET 製品の間で移植性を可能な限り高めることであり、これには、Java の標準部分ではない機能をいくつか実装する必要がありました。たとえば、反復子メソッド、デリゲート、演算子のオーバーロード、拡張メソッドが挙げられます。この移植性向上の一環として、文字列やコレクションなどの一般的な型の標準名も導入しました。したがって、次のように宣言できます。

  • 01 s1 string. - 単純な文字列オブジェクトの宣言
  • 01 dict1 list[string]. - 要素がすべて文字列であるリストの宣言

ここで、string および list はあらかじめ定義された型で、.NET では System.String および System.Collections.Generic.IList、JVM では java.lang.String および java.util.List に対応します。

Visual Studio IDE および Eclipse IDE をサポートするために使用される Micro Focus の内部ソフトウェアの多くは、この移植可能なオブジェクト指向構文で記述されるようになったため、Visual Studio 環境で使用するために .NET に、または Eclipse で使用するために JVM にコンパイルできます。