COBOL
メインページ > 工学 > 情報技術 > プログラミング > COBOL
COBOL(コボル)は、1959年に事務処理用に開発されたプログラミング言語です。 名前は「Common Business Oriented Language」(共通事務処理用言語)に由来します。 Fortran・Lispとともに最も古いプログラミング言語の1つですが、 それ故、多くのソフトウェア資産の蓄積があり、2022年の今日でも現役のプログラミング言語として使用されています。
COBOLの特徴
[編集]COBOLの特徴を簡単なコード例とともに示します。以下は、COBOLのいくつかの特徴を示す基本的なコードスニペットです。
- データ定義の明確さ
- この例では、
Employee-Record
というデータ構造を定義しています。各フィールドはPIC
(Picture)クラウスを使用してデータの型と桁数を指定しています。 IDENTIFICATION DIVISION. PROGRAM-ID. SampleProgram. DATA DIVISION. WORKING-STORAGE SECTION. 01 Employee-Record. 05 Employee-ID PIC 9(5). 05 Employee-Name PIC X(20). 05 Employee-Salary PIC 9(7)V99. PROCEDURE DIVISION.
- この例では、
- 構造化プログラミング
- COBOLは構造化プログラミングをサポートしており、
IF
文を通じて条件分岐を行います。 IF Employee-Salary > 50000 DISPLAY 'High Salary'. ELSE DISPLAY 'Low Salary'.
- COBOLは構造化プログラミングをサポートしており、
- データベースへのアクセス
- 上記の例では、COBOLがデータベースへのアクセスを可能にするためのSQL文を使用しています。
EXEC SQL DECLARE EmployeeCursor CURSOR FOR SELECT Employee-Name, Employee-Salary FROM EmployeeTable WHERE Department = 'IT'. EXEC SQL OPEN EmployeeCursor. PERFORM UNTIL SQLCODE NOT = 0 EXEC SQL FETCH NEXT FROM EmployeeCursor INTO :Employee-Name, :Employee-Salary END-EXEC. DISPLAY 'Employee: ' Employee-Name 'Salary: ' Employee-Salary. END-PERFORM. EXEC SQL CLOSE EmployeeCursor.
簡単なCOBOLプログラム
[編集]以下は簡単なCOBOLのプログラムです。
- hello.cbl
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. PROCEDURE DIVISION. DISPLAY "Hello World 12345!". STOP RUN.
- 実行結果
Hello World!
環境構築
[編集]GnuCobol
[編集]GnuCOBOL(旧OpenCOBOL、短期間GNU Cobolとして知られていました)は、COBOLのフリーな実装です。 GnuCOBOLは、ネイティブのCコンパイラを使用するCへのトランスコンパイラです。
GNU/Linuxの場合
[編集]ディストリビューションにより、パッケージマネージャとパッケージ体系に違いがありますが、例えば Fedora Linux では、
$ sudo dnf install gnucobol
$ cobc --version
cobc (GnuCOBOL) 3.1.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Keisuke Nishida, Roger While, Ron Norman, Simon Sobisch, Edward Hart
Built Jan 26 2021 00:00:00
Packaged Dec 23 2020 12:04:58 UTC
C version "11.0.0 20210123 (Red Hat 11.0.0-0)"
loading standard configuration file 'default.conf'
- で導入およびバージョンの確認できます。
FreeBSDの場合
[編集]FreeBSD Ports/Packages Collection の、ports/lang/gnucobol
にあるので、
% sudo make -C /usr/ports/lang/gnucobol all install clean
でビルドしインストールできます。 また
% sudo pkg install gnu-cobol-3.1.2_1
でビルド済みパッケージをインストールできますが、GnuCOBOL自身のバージョンアップやportsのパッチレベルの更新で gnu-cobol-3.1.2_1
の部分は変わるので、
% pkg search cobol gnu-cobol-3.1.2_1 Open-source COBOL compiler
の様に、最初に最新のパッケージ名を確認してください。
- バージョンを確認
% cobc -V cobc (GnuCOBOL) 3.1.2.0 Copyright (C) 2020 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html> This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Keisuke Nishida, Roger While, Ron Norman, Simon Sobisch, Edward Hart Built Nov 12 2022 15:48:13 Packaged Dec 23 2020 12:04:58 UTC C version "FreeBSD Clang 14.0.5 (https://github.com/llvm/llvm-project.git llvmorg-14.0.5-0-gc12386ae247c)" % _
コマンドラインでのコンパイルと実行
[編集]簡単なCOBOLプログラムのソースコードを hello.cbl という名前で保存し、コンパイルし実行してみよう。
% cobc -x hello.cbl % ls hello hello.cbl % ./hello Hello World 12345!
- 実行ファイル
hello
を得るためにCOBOLコンパイラ cobc に −x をつけてコンパイル- -x をつけないとシェアードライブラリが出来、これは実行できません。
- 確認してみると
- hello が出来ている
- 早速実行すると
- 正しく表示
COBOLの正書法
[編集]COBOLの正書法には、自由書式正書法と固定書式正書法の2種類があります。
それぞれの正書法には以下のような特徴があります。
- 固定形式正書法
- 一連番号領域、標識領域、プログラム記述領域など、行内の文字位置によって使い方が明確に定義されている書き方です。
- 自由書式正書法
- 一連番号領域や標識領域がなく、プログラムは行のどの位置にも書くことが出来ます。
処理系によっては、コマンドラインオプションなどで正書法の切り替えが可能な場合があるので、詳しくは使用している処理系のマニュアルを参照してください。
COBOLプログラムの構成
[編集]COBOLプログラムのトップレベルの構成
[編集]COBOLプログラムのトップレベルは
- 見出し部(IDENTIFICATION DIVISION)
- 環境部(ENVIRONMENT DIVISION)
- データ部(DATA DIVISION)
- 手続き部(PROCEDURE DIVISION)
の4つのパートから構成され、順序もこの順序である必要があります。
見出し部(IDENTIFICATION DIVISION)
[編集]IDENTIFICATION DIVISIONは、COBOLプログラムの最初のパートで、 プログラム名、作成者、作成日などのプログラム保守情報を含みます。 これらは、見出し部の段落として記述します。
IDENTIFICATION DIVISION. PROGRAM-ID. SampleProgram. AUTHOR. YourName.
環境部(ENVIRONMENT DIVISION)
[編集]ENVIRONMENT DIVISIONは、COBOLプログラムの2番目のパートで、 作成するプログラムをコンパイルして実行するコンピュータの名前、環境変数の受け渡しに関する情報、プログラムとの間で読み書きするファイルの名前と種類を定義します。
ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-PC.
データ部(DATA DIVISION)
[編集]DATA DIVISIONはCOBOLプログラムの3番目のパートで、これまでのDIVISIONはCOBOLプログラムを構築するためのメタデータで、 DATA DIVISIONからが実際にプログラムを構築していくところだと言えます。 DATA DIVISIONでは、入出力ファイルの配置、データ項目(変数)、外部プログラムとのインタフェース(引数)など、プログラムで扱うすべてのデータを定義します。
DATA DIVISION. WORKING-STORAGE SECTION. 01 Employee-Name PIC X(30). 01 Employee-Age PIC 9(3). FILE SECTION. 01 Employee-File. 05 Employee-ID PIC 9(5). 05 Employee-Salary PIC 9(7)V99.
手続き部(PROCEDURE DIVISION)
[編集]PROCEDURE DIVISIONは、COBOLプログラムの最後のパートで、プログラムが実行する処理を記述します。
PROCEDURE DIVISION. DISPLAY 'Enter employee name: '. ACCEPT Employee-Name. DISPLAY 'Enter employee age: '. ACCEPT Employee-Age. IF Employee-Age > 30 DISPLAY 'Senior Employee' ELSE DISPLAY 'Junior Employee'.
前3つのDIVISIONとは異なり、手続き部には定義された節や段落の様な既定の構造はありません。 節や段落は、プログラマが必要に応じて作成します。
COBOLにおいて、FortranのSubroutineやC言語の関数に相当する構文は、主に「サブルーチン」と「関数」です。以下に、それぞれの概要を説明します。
- サブルーチン(Subroutine):
- COBOLにおいて、サブルーチンはプログラム内の再利用可能なブロックを指します。サブルーチンは、PERFORM文を使用して呼び出されます。サブルーチン内で実行される処理は、呼び出し元に戻るまで制御が戻りません。
IDENTIFICATION DIVISION. PROGRAM-ID. MainProgram. DATA DIVISION. WORKING-STORAGE SECTION. 01 Counter PIC 9(3) VALUE 0. PROCEDURE DIVISION. PERFORM Display-Message THRU Display-Message. DISPLAY 'Back in the main program.'. Display-Message. ADD 1 TO Counter. DISPLAY 'Message number ' Counter.
- 上記の例では、
Display-Message
がサブルーチンとなり、これをPERFORM
文で呼び出しています。
- 関数(Function):
- COBOLにおいて、関数は一般的なプログラミング言語での関数と同様、特定の計算や処理を実行し、その結果を呼び出し元に返すものです。関数は
FUNCTION
キーワードを使用して呼び出されます。
IDENTIFICATION DIVISION. PROGRAM-ID. MainProgram. DATA DIVISION. WORKING-STORAGE SECTION. 01 Value-A PIC 9(3) VALUE 10. 01 Value-B PIC 9(3) VALUE 20. 01 Result PIC 9(3). PROCEDURE DIVISION. COMPUTE Result = Add-Values(Value-A, Value-B). DISPLAY 'The result is: ' Result. FUNCTION Add-Values. PARAMETERS Value-X, Value-Y. COMPUTE Add-Values = Value-X + Value-Y.
- 上記の例では、
Add-Values
が関数となり、これをCOMPUTE
文で呼び出しています。
- COBOLにおいて、関数は一般的なプログラミング言語での関数と同様、特定の計算や処理を実行し、その結果を呼び出し元に返すものです。関数は
COBOLのサブルーチンと関数は、プログラムの構造を明確にし、再利用性を高めるために使われます。
以下は、他の言語のプログラマがCOBOLに移行する際に留意すべき点です。
- 自然言語に近い文法
- COBOLは英語に近い自然言語の文法を持つため、通常のプログラミング言語とは異なる表現があります。英文のような記述やDIVISION、SECTION、PARAGRAPHの概念に慣れる必要があります。
- データ指向プログラミング
- COBOLは主にデータ指向プログラミングに焦点を当てています。他のプログラミング言語でよく見られるオブジェクト指向プログラミングの概念とは異なります。データ構造やレコードの定義が特に重要です。
- ビジネスアプリケーションの特性
- COBOLは主にビジネスアプリケーションの開発に使用されており、金融や保険などの分野で広く利用されています。ビジネスルールの理解や、大規模なデータ処理、バッチ処理の概念について理解が必要です。
- 移植性の懸念
- COBOLは主にメインフレームやミッドレンジコンピュータ上で実行されることが多いです。他の言語と異なる実行環境に適応するために、COBOLが実行されるプラットフォームに関する理解が必要です。
- 標準ライブラリの習得
- COBOLの標準ライブラリは、ビジネスアプリケーションに特有の機能を提供します。他のプログラミング言語の標準ライブラリとは異なるため、これを理解し、活用することが必要です。
- ツールや開発環境の違い
- COBOL用の開発ツールや統合開発環境は他の言語とは異なるものがあります。これらのツールや環境に慣れる必要があります。
COBOLの変遷
[編集]COBOL(Common Business-Oriented Language)は、ビジネスアプリケーション向けに開発されたプログラミング言語で、1959年にアメリカ国防総省の委員会が設立したCODASYL(Conference on Data Systems Languages)委員会によって設計されました。以下に、COBOLの変遷について簡単に説明します。
- 初期の開発(1959年 - 1960年代)
- COBOLは、ビジネスアプリケーションのニーズに対応するために開発されました。この時期、主にメインフレームコンピュータで使用され、COBOLプログラムはバッチ処理やファイル処理に利用されました。
- COBOL 60
- COBOLはANSI(American National Standards Institute)やISO(International Organization for Standardization)によって標準化され、これによって異なるベンダー間でのプログラムの互換性が向上しました。
- 1959年に初めてCOBOLが発表され、その初版として知られています。しかし、このバージョンはあまり広く使われませんでした。
- COBOL 61 (Revised COBOL 60)
- COBOL 60の修正版として、1961年に発表されました。これはCOBOLの最初の主要なリリースで、いくつかの文法の変更や追加が行われました。
- COBOL 65
- 1965年にはCOBOL 65が発表され、新しい機能や拡張が導入されました。
- COBOL 68
- 1968年にCOBOL 68が登場し、いくつかの機能が改訂され、新しい機能も導入されました。このバージョンは標準規格として広く受け入れられました。
- COBOL 74
- 1974年に発表され、COBOL 68をベースにしていくつかの変更や追加が行われました。これにより、ファイル操作などが改善されました。
- COBOL 85
- 1985年にはCOBOL 85が発表されました。これは大規模なリファクタリングが行われ、構造化プログラミングや新しいデータ型の導入などが含まれました。COBOL 85はANSIとISOによって標準化されました。
- COBOL 2002
- COBOL 2002は、2002年に登場しました。このバージョンでは、オブジェクト指向プログラミングのサポートやXMLの処理などが追加されました。
- COBOL 2014
- 2014年に発表されたCOBOL 2014では、新しい機能や改訂が導入され、モダンな開発環境に対応するための取り組みが行われました。
これらのバージョンは、COBOLの進化を示しています。それぞれの規格で新しい機能や改善が導入され、COBOLは長い間にわたって広く利用され続けています。
改廃された技術
[編集]COBOLの改廃された技術や利用が推奨されない技術は、言語の標準化、現代的なプログラミング手法の導入、保守性の向上などによって置き換えられてきました。以下に、代表的な技術を示します。
ALTER文
[編集]- サポート開始年: COBOL-60
- サポート終了年: COBOL 2002で非推奨
- 廃止または衰退の理由
- プログラムの流れを動的に変更する機能であり、保守性が著しく低下し、スパゲッティコードの原因となるため。
- 代替技術
- EVALUATE文や構造化プログラミング手法の使用が推奨されます。
ENTER文
[編集]- サポート開始年: COBOL-60
- サポート終了年: COBOL 85で廃止
- 廃止または衰退の理由
- 他言語との連携のために使用されていましたが、標準化された呼び出し規約の登場により不要となりました。
- 代替技術
- CALL文による標準的なサブプログラム呼び出しが推奨されます。
NOTE段落
[編集]- サポート開始年: 初期のCOBOL
- サポート終了年: COBOL 2002で非推奨
- 廃止または衰退の理由
- コメントとして使用されていましたが、より明確な方法が導入されました。
- 代替技術
- アスタリスク(*)で始まるコメント行や>>による固定形式のコメントが推奨されます。
EXAMINE文
[編集]- サポート開始年: COBOL-60
- サポート終了年: COBOL 85で廃止
- 廃止または衰退の理由
- 文字列操作機能として限定的で、より強力な代替手段が導入されました。
- 代替技術
- INSPECT文による文字列操作が推奨されます。
GO TO文(プロシージャ外への分岐)
[編集]- サポート開始年: COBOL-60
- サポート終了年: 現在も使用可能だが強く非推奨
- 廃止または衰退の理由
- プログラムの構造を複雑にし、デバッグや保守を困難にするため。
- 代替技術
- PERFORM文や構造化プログラミング手法の使用が推奨されます。
TRANSFORM文
[編集]- サポート開始年: 初期のCOBOL方言
- サポート終了年: 標準COBOLでは採用されず
- 廃止または衰退の理由
- ベンダー固有の機能であり、移植性に問題があったため。
- 代替技術
- INSPECT文やSTRING/UNSTRING文による文字列操作が推奨されます。
固定形式プログラム記述
[編集]- サポート開始年: COBOL-60
- サポート終了年: 現在も使用可能だが新規開発では非推奨
- 廃止または衰退の理由
- パンチカードの制約に基づく古い形式で、可読性と保守性に問題があります。
- 代替技術
- フリー形式のプログラム記述形式が推奨されます。
ON文
[編集]- サポート開始年: 初期のCOBOL
- サポート終了年: COBOL 2002で非推奨
- 廃止または衰退の理由
- 例外処理として不十分で、より体系的な方法が導入されました。
- 代替技術
- DECLARATIVES部や構造化された例外処理の使用が推奨されます。
DATA RECORDS句
[編集]- サポート開始年: COBOL-60
- サポート終了年: COBOL 2002で非推奨
- 廃止または衰退の理由
- ファイル記述において冗長で、より簡潔な方法が導入されました。
- 代替技術
- RECORD句やモダンなファイル記述方法の使用が推奨されます。