COBOL †
目次 †
前置き †
ひょんなことからCOBOLで作られたシステムを移植する仕事をすることに。そこでCOBOLを勉強するため、インストールからはじめるのであった。
インストール †
私はWindows環境にどっぷり浸かってしまっているので、Windowsで動作する環境を構築してみます。ちなみに現在あてがわれているマシンはWindows7(64bit)です。
どうやらMinGW上でTinyCOBOLを動かすのが手軽に導入できそうなので、これでいきます。
- MinGW
- http://www.mingw.org/
- TinyCOBOL
- http://tiny-cobol.sourceforge.net/index.php
- インストール
ダウンロードしてきたファイルを実行します。MinGW→TinyCOBOLの順です。それから、MinGWでgcc関係のツールをインストールするようにしてください。コンパイル時にas.exeが必要なので。
C:/MinGW/というフォルダが作られ、local配下にはTinyCOBOL関係のファイルが置かれます。
TinyCOBOLをインストール時にはデスクトップ上にショートカットが作られます。これは、C:/MinGW/localでコマンドプロンプトを開くものです。
- 環境整備
このままだとパスが通っていない状態なのでいろいろと不便ですので、パスを設定するためのバッチを作成します。私は、C:/MinGW/localに、init.batという名前で以下の内容のファイルを作成しました。
@ECHO OFF
SET MinGW_cur=C:\MinGW
SET MinGW_cob=C:\MinGW\local
SET TCOB_OPTIONS_PATH=%MinGW_cob%\share\htcobol
SET TCOB_RTCONFIG_PATH=%MinGW_cob%\share\htcobol
SET TCOB_LD_LIBRARY_PATH=%MinGW_cob%\lib
SET LD_LIBRARY_PATH=%MinGW_cur%\lib
PATH = %MinGW_cur%;%MinGW_cur%\bin;%MinGW_cob%;%MinGW_cob%\bin;%PATH%
htcobol -V
- コンパイルしてみる
サンプルプログラムを作成してコンパイルしてみましょう。定番です。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
DISPLAY 'hellow world!!'.
STOP RUN.
sample.cobで保存して、以下のように入力。うまくインストールできていればコンパイルされるはずです。
C:\MinGW\local> htcobol sample.cob [enter]
sample.exeという実行ファイルが作成されているので、実行してみましょう。
C:\MinGW\local> sample.exe [enter]
「hellow world!!」と表示されましたか?
もっと手軽に †
Java上で動く、フリーのインタープリタを公開されている方がいらっしゃるようです。実行ファイルは作れませんが、こちらの方が手軽ですね。
- COBOL インタープリター
- http://akisakha.w7u.org/
どんな言語かな †
COBOL初心者の私が学習しながらの感想やメモなどを書いてみようと思います。
印象、感想 †
- 制約が多い。C言語の自由さが招いた混乱を、JavaやC#で矯正しているように、ある程度の制約は必要だと思うけど、方向性が違うような気がする。
- 変数は書式ありき。常にアウトプットを主眼に置いている。変数定義の時点で出力イメージで定義する。必要な桁数を指定したりと、一般人からすれば理解しやすいと思われ。効率的には不利な感は否めない。
- N-BASICとか知っていると、似ているな、と思うところあり。
- 記述が冗長、というか、基本的に文章よりの記述なので、要求されるタイプ量が多い。
- 条件式では英語のように"greater than" とか記載可能。8086のintel系のジャンプ命令ニモニックを思い出した。
- 集団項目とか指標データ項目とか、見慣れない用語が多くてとっつきづらい。
メモ †
- 条件式で略記というのが使えるが、バグの元だろこれ。使わないに越したことはない。
- ソースファイルの書き出しは共通なのでテンプレファイルを用意しておくといい。専用開発環境とかには当然あるんだろうな。。
- 繰り返しは、PERFORM文を使う。繰り返しの中身をサブルーチンで行う方式、スコープで囲む方式の2つが選べる。書式が複雑なので文法書が手放せない。
- どうもサブルーチン呼出の目的で PERFORM を使うテクニックがあるようだ。
- 繰り返ししたい処理をサンドイッチにする使い方をうちPERFORMと、サブルーチンとして呼び出す使い方をそとPERFORMと呼ぶらしい。なんだかなぁ。
- 配列は、OCCURSで要素数を指定する。添字は1から。
- SEARCH文という配列からの検索は標準で装備されている。先頭から順に検索する方法と、キーが昇順に並んでいる前提で二分木探索する方法が選べる。使いにくそう。
- 意外なことにMID$とかSUBSTRと同等の機能が、部分参照という名前で言語に標準的に組み込まれている。これは便利。
変数名 ( 最左端文字位置 : [長さ] )
- 文字列長、文字列内検索、置換などはすべてINSPECT文で行うスタンスのようだ。はっきり言って覚えきれない。いくらでも複雑に書ける書式なので、保守性が悪そう。
- TALLYINGは文字数を数える。カウンタを初期化する機能はない。
INSPECT 対象文字列 TALLYING カウンタ FOR CHARACTERS
- BEFORE,AFTERで処理範囲を指定する。どこまで、どこから、を指定する。下記の例は、文字"X"が出現する手前まで処理をするの意。(ちなみにAFTERの場合は、指定文字以降という意味になる)
INSPECT 対象文字列 TALLYING カウンタ FOR CHARACTERS BEFORE "X"
- CHARACTERSの代わりにALLを指定すると、文字列検索になる。下記の例は、文字列"XYZ"が何回登場するか数えている。
INSPECT 対象文字列 TALLYING カウンタ FOR ALL "XYZ"
カンマ区切りでOR検索も可能。ただし同じ個所は判定されないので注意。("ABCABC"から"AB"と"CA"を検索すると、"AB"が2回。"ABCABC"となり、"CA"はすでに検索済みでカウント対象外となる)
INSPECT 対象文字列 TALLYING カウンタ FOR ALL "XYZ", ALL "ABC"
- ALLの代わりLEADINGを指定すると、文字列の連続数の計数を行う。
INSPECT target TALLYING cnt FOR LEADING "ABC".
最左端から"ABC"がいくつ連続しているかを計数する。いきなり違う文字ならゼロ。
- TALLYINGの代わりにREPLACINGを指定すると置換となる。"XY"→"xy"だとこんな感じ。
INSPECT target REPLACING ALL "XY" BY "xy".
ただ、置換前の文字列と同じサイズしか置き換わらない。"X"→"xy"であれば"y"は処理されないし、"XYZ"→"xy"であれば、"xy "と処理される。
- 文字列の連結はSTRING文を使う。BASICのように+演算子で記述してもエラーは出ないが、結果がイミフメ。
- 文字列の分解までサポートされている。UNSTRING文を使う。区切り文字は、"DELIMITED BY"で指定する。複数指定可能。
MOVE "ABC,DEFG,H,IJKLM,NOPQR,S,T,UVWX,YZ" TO str1.
UNSTRING str1
DELIMITED BY ","
INTO
str2 str3 str4 str5
TALLYING IN cnt
END-UNSTRING.
DISPLAY cnt
DISPLAY str2
DISPLAY str3
DISPLAY str4
DISPLAY str5
STOP RUN.
実行結果
04
ABC
DEFG
H
IJKLM
分解先を記述する際、どの区切り文字で分解されたか(DELIMITER IN xx)、何文字切り取られたのか(COUNT IN xx)などを知ることができる。C言語のsscanfに近いのかな。