Microsoft .NET Framework 用 COBOL

Basim Kadhim
米国 Fujitsu Software 社

概要: COBOL との相互運用性の強化を可能にしている米国 Fujitsu Software 社の Microsoft .NET Framework に対するサポートについて説明しています。

目次

はじめに
Web 上の COBOL
ビジョンの達成
将来の COBOL

はじめに

今話題の MIcrosoft .NET Framework について耳にしたことがあると思います。さまざまな言語ベンダから新しい企画に対するサポートを求める声が届きました。「なぜ Microsoft は多くの言語を新しい環境に対応させることに関心があるのか? なぜ COBOL のような古い言語にこだわるのか ?」という質問がありました。大部分のビジネスでは、既存のアプリケーションの用途を拡大したいとき、膨大なコード ベースを記述し直すほどの金銭的な余裕はないということを認識している、というのがその答えになります。

新しい Microsoft .NET Framework をサポートすることにより、米国 Fujitsu Software 社は Microsoft の理念である、プログラマはアプリケーションに最も適したプログラミング言語を使用することを希望し、かつ使用する必要があるということを支持しています。実稼動しているビジネス アプリケーションうち推定 70% が COBOL で記述されています。これらのアプリケーションを機能拡張するには COBOL を捨て去るのではなく、それを使用して新しいことをするより良い方法を見つけ出すことが必要です。

このサポートを使用して、米国 Fujitsu Software 社は COBOL を使用している組織の生産性を向上しました。COBOL のプログラマは、.NET クラス ライブラリや ASP+ を含む多種多様な新しいテクノロジにアクセスできるだけでなく、C++ および Visual Basic などのほかの言語のコードの開発者たちと違和感なく作業できます。COBOL のプログラマとほかの言語のプログラマの間に境界がある開発体制の代わりに、新しい環境を使用するとプログラマは共通のインターフェイスおよびプログラミング ツールを使用してこの障壁に橋をかけることができます。

この記事では、COBOL に関するこのテクノロジのいくつかの重要なアプリケーションについて、および米国 Fujitsu Software 社などのプログラミング言語ベンダにとって新しいビジョンを達成するために必要なことについて説明します。

Web 上の COBOL

Web 上で取引されるビジネス量の増加に伴い、この巨大な新しいビジネスの機会をどのように最適な方法でうまく利用するかを組織のいたるところで議論していることでしょう。特に COBOL を多く使用しているビジネスにとっては、Web が今日のようなビジネス現象になるよりもずっと以前にアプリケーションが作成されているため、より深刻な問題になります。これらのビジネスでは、アプリケーションを Web 用に作り変えるだけでなく、ほかのプログラミング言語を使用するために従業員を再教育することは、困難な作業であるということがわかります。富士通などの COBOL ベンダは、COBOL のアプリケーションを Web 用に移行するためのさまざまなソリューションを提供してきました。富士通の.NET Framework に対するサポートは、この観点に立って構築され、その段階をさらに押し進め、COBOL プログラマが Web に対して直接プログラムを組むこと、および既存のレガシ コードを簡単に使用すること可能にしました。

ASP+ (language="COBOL")

ASP+ は、動的 Web コンテンツを配布するために設計された Microsoft の ASP (Active Server Page) の後継者です。ASP は、パフォーマンスおよびプログラマビリティの領域で多くの弱点に直面していました。ASP+ は、これらの領域に対して実質的な改善を行いました。ASP のようなインタプリタではなく、ASP+ はページをネイティブ コードにコンパイルします。この変更の結果、最初にページを表示するときにページをコンパイルする一時的なコストがかかりますが、パフォーマンスは大幅に向上します。インタプリタではなくコンパイルするという設計上の選択によって、コンパイルされる言語が ASP+ ページにコードを提供できるようになるという重要な副産物をもたらしました。

富士通 COBOL は、COBOL のプログラマが ASP+ ページに COBOL コードを埋め込めるという重要な利点を利用しています。以下は、フォント サイズを大きくしながら "Hello COBOL world!" を表示する COBOL を使用して記述された ASP+ ページのサンプルです。

<%@ page language="COBOL" %>
<script
      runat="server">
       OBJECT.
       DATA
      DIVISION.
       WORKING-STORAGE
      SECTION.
       77 FONT-SIZE PIC
      S9(9) COMP-5.
       END
      OBJECT.
</script>
<% PERFORM VARYING FONT-SIZE FROM 1 BY 1
      UNTIL FONT-SIZE > 7 %>
<font size="<%=FONT-SIZE%>">
      Hello COBOL world! </font> <br>
<% END-PERFORM. %>

文字列 "<%@" は、ページのプログラミング言語を COBOL に設定するディレクティブを挿入しています。<script> ブロックは FONT-SIZE 変数を宣言する COBOL のコードを挿入しています。文字列 "<%" は "Hello COBOL world!" を表示する HTML をループするインライン COBOL コードを挿入しています。

標準の HTML 要素をコントロールとして公開し、さらにプログラマが新しいコントロールを作成できるようにすることで、ASP+ はコンテンツを対話的にプログラミングすることを容易にします。.NET Framework では、この種のコントロールを Web Forms と呼びます。以下のサンプルでは、ドロップダウン ボックスで選択されたフルーツの名前に基づきフルーツの画像を表示するアプリケーションで使用されるいくつかの Web Form コントロールの使用法を示しています。

<html>
<head>
    <script
      runat="server"
      language="COBOL">
       ENVIRONMENT
      DIVISION.
       CONFIGURATION
      SECTION.
      
      REPOSITORY.
          
      PROPERTY SELECT-VALUE AS
      "Value"
          
      PROPERTY IMAGE-SRC AS
      "Src"
          
      PROPERTY SPAN-VALUE AS
      "InnerHtml"
          
      CLASS STRING-BUILDER AS
      "System.Text.StringBuilder"
          
      CLASS SYS-STRING AS
      "System.String"
          
      CLASS SYS-OBJECT AS
      "System.Object"
          
      CLASS EVENTARGS AS
      "System.EventArgs".
      
      OBJECT.
       METHOD-ID.
      FRUITLIST-CLICK.
       DATA
      DIVISION.
       WORKING-STORAGE
      SECTION.
       77 IMAGE-FILE-BUILDER
      OBJECT REFERENCE STRING-BUILDER.
      
      77 IMAGE-FILE-STR OBJECT REFERENCE
      SYS-STRING.
       LINKAGE
      SECTION.
       77 EVENT-SOURCE OBJECT
      REFERENCE SYS-OBJECT.
       77 EVENT
      OBJECT REFERENCE EVENTARGS.
      
      PROCEDURE DIVISION USING BY VALUE EVENT-SOURCE
      EVENT.
            MOVE
      SELECT-VALUE OF FRUITLIST TO SPAN-VALUE OF
      FRUITNAME.
            INVOKE
      STRING-BUILDER "NEW" USING BY VALUE
      "images/"
                RETURNING
      IMAGE-FILE-BUILDER.
            INVOKE
      IMAGE-FILE-BUILDER
      "Append"
                USING
      BY VALUE SELECT-VALUE OF
      FRUITLIST
                RETURNING
      IMAGE-FILE-BUILDER.
            INVOKE
      IMAGE-FILE-BUILDER "Append" USING BY VALUE
      ".jpg"
                RETURNING
      IMAGE-FILE-BUILDER.
            INVOKE
      IMAGE-FILE-BUILDER
      "ToString"
                RETURNING
      IMAGE-FILE-STR.
            MOVE
      IMAGE-FILE-STR TO IMAGE-SRC OF
      FRUITIMAGE.
       END METHOD
      FRUITLIST-CLICK.
       END
      OBJECT.
    </script>
</head>
<body>

<form
      runat="server">
    <font
      face="Verdana">
    <b>Please Select A
      Fruit : </b>

    <select
      id="FRUITLIST" runat="server"
      size="1">
        <option
      value="Orange">Orange</option>
        <option
      value="Apple">Apple</option>
        <option
      value="Mango">Mango</option>
        <option
      value="Pear">Pear</option>
        <option
      value="Banana">Banana</option>
    </select>

    <input
      type="submit" value="submit" runat="server"
      OnServerClick="FRUITLIST-CLICK">    

    <p>
    <table>
      <tr>
        <td>
          <img
      id="FRUITIMAGE" src="images\blank.gif" runat="server"
      />
        </td>
        <td>
          <font
      face="Verdana"
      size=6>
            <span
      id="FRUITNAME"
      runat="server"/>
          </font>
        </td>
      </tr>
    </table>
    </font>
</form>
</body>
</html>

<form> タグ ブロックは、このページで使用されている Web Forms コントロールのセットを囲んでいます。runat="server" 属性は、ASP+ にコントロールの動作がサーバーで実行されているコードを使用して実装されていることを示しています。この例には "id" 属性を使用して名前を指定している 4 つの Web Forms があります。

  • 選択する 5 つのフルーツのリストを表示する "FRUITLIST" という名前の選択コントロール。

  • 名前のない入力ボタン。"OnServerClick" 属性は、クリックに関連するイベントがボタンにプログラムされていることを示しています。属性の値はイベント ハンドラであるメソッドの名前を指定します。この場合は "FRUITLIST-CLICK" です。

  • 選択されたフルーツの画像を表示する "FRUITIMAGE" という名前のイメージ コントロール。

  • 選択されたフルーツの名前とイメージを表示する "FRUITNAME" という名前のスパン コントロール。

ASP+ ページの上部にある <script> ブロックは、入力ボタン コントロールの "FRUITLIST-CLICK" イベント ハンドラを COBOL で実装します。このメソッドは "FRUITLIST" コントロールから選択された名前を抽出し、フルーツのイメージ ファイルのパスを作成するために .NET 基本フレームワークの StringBuilder クラスを使用します。さらに、"FRUITIMAGE" コントロール、および "FRUITNAME" コントロールに適切な値を設定します。

このテクノロジは Web ページのプログラマビリティを向上させ、静的な HTML テクノロジの限界を超える手助けをします。このテクノロジを使用すると、電子店舗、在庫管理システム、出荷管理などの多くのアプリケーションを含む高度な Web システムを構築できることが想像できます。そして何よりも重要なことは、従業員が COBOL を使用するように教育されている場合、これらのアプリケーションを COBOL を使用してプログラミングできることです。

Web Servicies : Web のプログラミング

ASP+ を使用すると、プログラマはサーバー側の Web ページに 動的なコンテンツをパッケージ化できますが、Web Servicies を使用するとさらに高度な作業が可能になります。Web Servicies は、クライアントが適切であると判断した方法でパッケージ化するために、Web にプログラミング インターフェイスを公開する機会を提供します。このため、エンドユーザーが独自のアプリケーションに適するようにカスタマイズできるように、提供している製品を完全にコンポーネント化するビジネスが可能になります。

次の例は COBOL で記述された非常に簡単な Web Servicies です。

<%@ webservice language="COBOL"
      %>
       CLASS-ID.
      FOO.
      
      FACTORY.
       PROCEDURE
      DIVISION.
       METHOD-ID.
      ADDME.
       DATA
      DIVISION.
       LINKAGE
      SECTION.
       01 OPND-1 PIC S9(9)
      COMP-5.
       01 OPND-2 PIC S9(9)
      COMP-5.
       01 RET PIC S9(9)
      COMP-5.
       PROCEDURE DIVISION USING
      BY VALUE OPND-1 OPND-2 RETURNING
      RET.
          
      COMPUTE RET = OPND-1 + OPND-2.
       END
      METHOD ADDME.
       END
      FACTORY.
       END CLASS FOO.

上記の例は 2 つの数を加算する "ADDME" というメソッドを持つ COBOL のクラス定義です。先頭にある "webservice" ディレクティブは、.NET Framework にメソッドを Web Servicies として公開することを通知します。さらに、メソッドを記述しているプログラミング言語を識別します。将来のバージョンでは、ユーザーは Web Servicies として公開するメソッドごとに属性を指定するコンパイラ ディレクティブを指定する必要が生じる可能性があります。

これは簡単なように思えますが、Web Servicies が機能するためには、多くのテクノロジが一体となって動作する必要があります。たとえば、SOAP は Microsoft が標準として採用してもらいたいと考えているプロトコルです。SOAP は XML を使用してデータをマーシャリングするために使用します。SOAP では、クライアントとサーバーが最終的に HTTP で送信できるフォーマットで引数と結果を通信する必要があります。Microsoft は、SDL (Service Description Language) も定義しています。SDL は、クライアントに公開されるサービスを記述し、クライアントがそれらのサービスを検索できるメカニズムを提供します。

Web Servicies は、アプリケーションの展開に新しい機会を開きます。Web プレゼンテーション スタイルとコンテンツをあらかじめ決定するラッパーを使用してビジネス ロジック アプリケーションをパッケージ化する代わりに、顧客が使用するためにカスタマイズするために、企業は Web Servicies としてビジネス ロジックを公開できます。

フレームワークと言語の相互運用性

Microsoft .NET Framework SDK は、I/O、データ型操作、およびグラフィック アプリケーション開発などの多種多様な操作を実装するフレームワークを提供します。富士通 COBOL は、.NET Framework を対象としているので、これらのライブラリを実装する言語は重要ではありません。COBOL プログラムは、これらの機能を COBOL で記述されているかのように使用できます。この言語の相互運用性の基盤は Common Language Runtime です。

前述の ASP+ のフルーツ リストの例では、既にいくつかの .NET Framework の使用法を示しています。COBOL の "FRUITLIST-CLICK" メソッドは、.NET Framework のクラスから継承されているクラスに埋め込まれます。そのため、継承されたプロパティに直接アクセスできます。"StringBuilder" クラスは .NET 基本フレームワークからのクラスの別の例です。次のサンプルは、開発者が Win32 ベースの GUI アプリケーションの構築が可能な Win Forms の使用法を示しています。

       CLASS-ID. HELLO
      INHERITS FORM.
       ENVIRONMENT
      DIVISION.
       CONFIGURATION
      SECTION.
      
      REPOSITORY.
          
      PROPERTY WIN-TEXT AS
      "Text"
          
      CLASS APPLICATION AS
      "System.WinForms.Application"
          
      CLASS FORM AS
      "System.WinForms.Form".
      
      FACTORY.
       PROCEDURE
      DIVISION.
       METHOD-ID.
      MAIN.
       DATA
      DIVISION.
       WORKING-STORAGE
      SECTION.
       77 APP-OBJ USAGE OBJECT
      REFERENCE FORM.
       PROCEDURE
      DIVISION.
          
      INVOKE HELLO "NEW" RETURNING
      APP-OBJ.
          
      MOVE "Hello COBOL World!" TO WIN-TEXT OF
      APP-OBJ.
          
      INVOKE APPLICATION "Run" USING BY VALUE
      APP-OBJ.
       END METHOD
      MAIN.
       END
      FACTORY.
       END CLASS HELLO.

このとても簡単なアプリケーションは、タイトルに "Hello COBOL world!" を持つフレーム ウィンドウを表示します。このアプリケーションは、Win Forms の "Form" クラス からの継承と Win Forms クラス ライブラリのメソッドとプロパティの使用法を示しています。

COBOL コードの Microsoft .NET Framework への移行

Microsoft .NET Framework は、Managed Code としても知られている Common Language Runtime を対象にしたコードと既存のネイティブ コードおよび COM アプリケーション間の互換性を提供します。つまり、開発者は既存のコードを呼び出す新しい Managed Code を記述できます。既存の COM アプリケーションの場合は、Managed Code に対して COM インターフェイスを可視にするタイプ ライブラリ インポート ツール (TLBIMP) を使用するのと同じくらい簡単です。その他のネイティブ コードでは、ユーザーは呼び出したいコードに対して COBOL のプロトタイプ宣言を提供する必要があるだけです。ネイティブ コードから Managed Code に呼び出すには、開発者は Managed Code を COM オブジェクトとしてエクスポートするために、タイプ ライブラリ エクスポータ (TLBEXP) およびアセンブリ登録ツール (REGASM) を使用できます。

最終的には、ユーザーが Common Language Runtime を使用して完全に実行するために、新しいコンパイラで既存のコードをコンパイルするオプションを持つこともできるようになります。米国 Fujitsu Software 社はこのシナリオを可能にすることを表明していますが、初期リリースのコンパイラは、COBOL の機能をすべてをサポートしない可能性もあります。

ビジョンの達成

現在 Microsoft の新しい環境を対象としている唯一の COBOL ベンダとして、米国 Fujitsu Software 社はシームレスな相互運用性と、優れたプログラミング ツールのビジョンを表明しています。この表明の真価は、新しいプラットフォームのサポート、Microsoft の 中間言語 (IL) 対象とした完全に新しいコード ジェネレータ、および COBOL 用の ASP+ のサポート コードをサポートする言語拡張機能を持つ強化された COBOL コンパイラの開発です。

この記事で表示したサンプルは、コンパイラのプレビュー リリースにあるインプリメンテーションに基づいています。ここで示されている COBOL 言語拡張機能の正確な構文は、リリースされるバージョンでは変更される可能性があります。

言語拡張機能

Common Language Runtime は、オブジェクト指向のプログラミング モデルにしっかりと基づいています。この環境で動いているすべてのプログラムがオブジェクト指向である必要はありませんが、オブジェクト指向の言語構造はこの環境の一部の機能を使用するために必要です。富士通 COBOL のインプリメンテーションは可能なかぎり、現在の大部分の COBOL の規格案に準拠する予定です。

Common Language Runtime の一部の機能は、COBOL 規格案の現在の状態ではサポートされません。たとえば、デリゲード、カスタム属性、および表示属性のような構成要素は COBOL には存在していません。これらの構成要素に関しては、富士通は Common Language Runtime を対象とした言語拡張機能が、標準に準拠しているプログラムに影響を与えないようにしています。

コード生成

Common Language Runtime はネイティブ コードに代わり MSIL 上で操作することにより、相互運用性、安全性、および堅牢性の目標を達成しています。このため、この環境に対応するコンパイラは、ネイティブ コードではなく MSIL を生成する新しいコード ジェネレータを開発する必要があります。 Common Language Runtime は、最終的にプラットフォームごとにコードをすばやくネイティブ コードに変換するために、 JIT (Just-In-Time) コンパイルを使用します。

相互運用性が強化されてことで、異なるプログラミング言語で記述されたコードを使用したアプリケーションのデバッグも、シームレスに行うことができるようになりました。特に、現在ほとんどの COBOL の開発環境 (ただし 富士通 COBOL は除く) では、異なる言語にまたがったデバッグは面倒であるので、これは生産性の面で重要な利点になります。

ASP+ サポート

新しいコンパイラに加えて、新しい ASP+ のインフラストラクチャに対しても言語固有のサポートが必要になります。 ASP+ はページをコンパイルするので、そのページで記述されている言語で HTML および ASP+ のコンテンツを表すコードを作成できる必要があります。たとえば、前述の ASP+ のサンプル "Hello COBOL world!" では、以下のフラグメントを含むコードが生成されます。

            PERFORM
      VARYING FONT-SIZE FROM 1 BY 1 UNTIL FONT-SIZE > 7
      
              INVOKE
      ASP_output "Write" USING BY VALUE " <font
      size="""
              INVOKE
      ASP_output "Write" USING BY VALUE
      FONT-SIZE
              INVOKE
      ASP_output "Write" USING BY
      VALUE
                """>
      Welcome to ASP+ (now in COBOL!) </font> <br>
      "
            END-PERFORM.

将来の COBOL

Microsoft .NET Framework との統合は、COBOL が新しいテクノロジにより容易に順応できるをいう長期にわたる利点をもたらしました。すべてのプログラミング言語によって .NET Framework 用に開発された新しいフレームワークに、COBOL のプログラマはすぐにアクセスできるようになります。米国 Fujitsu Software 社は、常に最新のテクノロジを使用して、COBOL のプログラマがアプリケーションを開発するために必要なツールを確保することを表明してきました。.NET Framework に対するサポートはこの表明を確約に近づけます。