*COBOL [#a897ea47]

**目次 [#aa253306]

#contents();

**前置き [#h8fa7fb6]
ひょんなことからCOBOLで作られたシステムを移植する仕事をすることに。そこでCOBOLを勉強するため、インストールからはじめるのであった。

**インストール [#va4c584d]
私はWindows環境にどっぷり浸かってしまっているので、Windowsで動作する環境を構築してみます。ちなみに現在あてがわれているマシンはWindows7(64bit)です。
どうやらMinGW上でTinyCOBOLを動かすのが手軽に導入できそうなので、これでいきます。

-ダウンロード
~まずはMinGWをダウンロードしてきます。下記サイトからDownloadsをたどってlatest versionのexeをダウンロードすればよいと思います。(この文章を記載時点では
mingw-get-inst-20110802.exeでした)
:MinGW|http://www.mingw.org/

-ダウンロード2
~次にTinyCOBOLの本体をダウンロードします。同じく下記サイトからDownloadsをたどります。とりあえず Setup MinGW binary をダウンロードしておけばよいと思います。ほかは必要に応じてで。
: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

-実行してみる
~デスクトップ上のTinyCOBOLショートカットをクリック。コマンドプロンプトが開いたら、init [enter] するとパスが設定されます。
 C:\MinGW\local> 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!!」と表示されましたか?

**もっと手軽に [#l5e4bea8]
~Java上で動く、フリーのインタープリタを公開されている方がいらっしゃるようです。実行ファイルは作れませんが、こちらの方が手軽ですね。
:COBOL インタープリター|http://akisakha.w7u.org/

**どんな言語かな [#fe0290af]
COBOL初心者の私が学習しながらの感想やメモなどを書いてみようと思います。
***印象、感想 [#uec44d1a]
-制約が多い。C言語の自由さが招いた混乱を、JavaやC#で矯正しているように、ある程度の制約は必要だと思うけど、方向性が違うような気がする。
-変数は書式ありき。常にアウトプットを主眼に置いている。変数定義の時点で出力イメージで定義する。必要な桁数を指定したりと、一般人からすれば理解しやすいと思われ。効率的には不利な感は否めない。
-N-BASICとか知っていると、似ているな、と思うところあり。
-記述が冗長、というか、基本的に文章よりの記述なので、要求されるタイプ量が多い。
-条件式では英語のように"greater than" とか記載可能。8086のintel系のジャンプ命令ニモニックを思い出した。
-''集団項目''とか''指標データ項目''とか、見慣れない用語が多くてとっつきづらい。
***メモ [#ob8600b8]
-条件式で略記というのが使えるが、バグの元だろこれ。使わないに越したことはない。
-ソースファイルの書き出しは共通なのでテンプレファイルを用意しておくといい。専用開発環境とかには当然あるんだろうな。。
-繰り返しは、''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回。"&color(red){AB};C&color(red){AB};C"となり、"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のように+演算子で記述してもエラーは出ないが、結果がイミフメ。
--C言語のように結果を入れる変数を用意しておく必要あり。結合する文字列は複数指定することができる。例は、str1とstr2とstr3を結合してstr4へ格納する。
 STRING str1 str2 str3 INTO str4
--''DELIMITED BY''で結合時の区切り文字を指定できる。str1="ab,cd"で、区切り文字を","とした場合、"ab"が結合の対象として扱われる。
 STRING str1  DELIMITED BY "," str2 str3 INTO str4
-文字列の分解までサポートされている。''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に近いのかな。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS