SyntaxEdit
COBOLには英語に似た構文があり、プログラム内のほぼすべてを記述するために使用されます。たとえば、条件は x IS GREATER THAN y
として、またはより簡潔に x GREATER y または
x > y
。繰り返される条件と変数を削除することで、より複雑な条件を「短縮」できます。たとえば、 a > b AND a > c OR a = d
は a > b AND c OR = d
に短縮できます。この英語のような構文をサポートするために、COBOLには300を超えるキーワードがあります。一部のキーワードは、同じ単語の単純な代替または複数のスペルであり、より英語に似たステートメントと句を提供します。たとえば、 IN
キーワードと OF
キーワードは、 IS
と ARE
、および VALUE
および値
。
各COBOLプログラムは、単語、リテラル、画像の文字列の4つの基本的な字句項目で構成されています(§PICTUREを参照)。句)とセパレータ。単語には、予約語とユーザー定義の識別子が含まれます。長さは最大31文字で、文字、数字、ハイフン、アンダースコアを含めることができます。リテラルには、数字(例: 12
)と文字列(例: "Hello!"
)が含まれます。区切り文字には、スペース文字とコンマ、セミコロンの後にスペースが続きます。
COBOLプログラムは、識別部門、環境部門、データ部門、およびプロシージャ部門の4つの部門に分割されます。識別部門は、ソース要素の名前とタイプを指定し、クラスとインターフェイスが指定される場所です。環境部門は、ファイルや文字セットなど、それを実行しているシステムに依存するプログラム機能を指定します。データ分割は、変数とパラメーターを宣言するために使用されます。プロシージャの分割には、プログラムのステートメントが含まれます。各分割は、段落で構成されるセクションに分割されます。
MetalanguageEdit
COBOLの構文は、通常、次のように記述されます。中括弧、括弧、バー、下線を使用した独自のメタ言語。メタ言語は、元のCOBOL仕様用に開発されました。当時、Backus–Naur形式は存在していましたが、委員会はそれを聞いていませんでした。
要素 | 外観 | 機能 |
---|---|---|
すべて大文字 | 例 | 予約済みの単語 |
下線 | 例 | 予約済みの単語は必須 |
中括弧 | {} | 1つのオプションのみを選択できます |
ブラケット | ゼロまたは1つのオプションを選択できます | |
楕円 | … | 前の要素を繰り返すことができます |
バー | {| |} | 1つ以上のオプションを選択できます。任意のオプションは1回だけ選択できます。 |
ゼロ以上のオプションを選択できます。任意のオプションは一度選択します。 |
例として、consi ADD
ステートメントの次の説明:
この説明では、次のバリアントが許可されます:
ADD 1 TO xADD 1, a, b TO x ROUNDED, y, z ROUNDEDADD a, b TO c ON SIZE ERROR DISPLAY "Error"END-ADDADD a TO b NOT SIZE ERROR DISPLAY "No error" ON SIZE ERROR DISPLAY "Error"
コードformatEdit
COBOLは、固定(デフォルト)または無料の2つの形式で記述できます。固定形式では、コードを特定の領域に収まるように配置する必要があります(パンチカードの使用によるホールドオーバー)。COBOL 2002までは、次のとおりでした。
名前 | 列(s) | 使用法 |
---|---|---|
シーケンス番号領域 | 1–6 | 元々はカードに使用されていました/行番号(手動編集/処理後に目的のプログラムコードシーケンスを保証するために機械的なパンチカードの並べ替えを容易にする)、この領域はコンパイラによって無視されます |
インジケータ領域 | 7 | ここでは次の文字を使用できます。
|
エリアA | 8–11 | これには、DIVISION 、SECTION およびプロシージャヘッダー。 01および77レベル番号とファイル/レポート記述子 |
エリアB | 12–72 | エリアで許可されていないその他のコードA |
プログラム名領域 | 73– | これまでパンチカードの列80までは、プログラムの識別に使用されていました。またはカードが属するシーケンス |
COBOL 2002では、エリアAとBはマージされてプログラムテキスト領域が形成され、実装者定義の列で終了します。
COBOL 2002では、自由形式のコードも導入されました。新しいプログラミング言語のように、自由形式のコードはファイルの任意の列に配置できます。コメントは*>
を使用して指定されます。これはどこにでも配置でき、固定形式のソースコードでも使用できます。継続行は存在せず、>>PAGE
ディレクティブが/
インジケーターに置き換わります。
識別divisionEdit
識別部門は、次のコードエンティティを識別し、クラスまたはインターフェイスの定義を含みます。
オブジェクト指向プログラミング編集
クラスとインターフェイスは2002年からCOBOLになっています。クラスクラスメソッドと変数を含むファクトリオブジェクトと、インスタンスメソッドと変数を含むインスタンスオブジェクトがあります。継承とインターフェースはポリモーフィズムを提供します。ジェネリックプログラミングのサポートは、任意のクラスまたはインターフェイスを使用するようにインスタンス化できるパラメータ化されたクラスを通じて提供されます。オブジェクトは、特定のタイプに制限される可能性のある参照として保存されます。メソッドを呼び出す方法は2つあります。 INVOKE
ステートメントは、 CALL
と同様に機能します。 、または関数の使用に類似したインラインメソッド呼び出しを介して。
*> These are equivalent.INVOKE my-class "foo" RETURNING varMOVE my-class::"foo" TO var *> Inline method invocation
COBOLはメソッドを非表示にする方法を提供しません。ただし、クラスデータは、 PROPERTY
句を指定せずに宣言することで非表示にできます。これにより、ユーザーはクラスデータにアクセスできなくなります。メソッドのオーバーロードは、COBOL2014で追加されました。
環境部門編集
環境部門には、構成セクションと入出力セクションが含まれています。構成セクションは、通貨記号、ロケール、文字セットなどの可変機能を指定するために使用されます。入出力セクションには、ファイル関連の情報が含まれています。
FilesEdit
COBOLは、順次、索引付き、および相対の3つのファイル形式または編成をサポートします。シーケンシャルファイルでは、レコードは連続しており、リンクリストと同様にシーケンシャルにトラバースする必要があります。インデックス付きファイルには、レコードにランダムにアクセスし、それらで並べ替えることができる1つ以上のインデックスがあります。各レコードには一意のキーが必要ですが、他の代替のレコードキーは一意である必要はありません。インデックス付きファイルの実装はベンダーによって異なりますが、C‑ISAMやVSAMなどの一般的な実装はIBMのISAMに基づいています。インデックス付きファイルなどの相対ファイルには一意のレコードキーがありますが、代替キーはありません。A相対レコードのキーは、その順序位置です。たとえば、10番目のレコードのキーは10です。これは、キーが5のレコードを作成するには、(空の)先行レコードの作成が必要になる場合があることを意味します。相対ファイルでは、シーケンシャルアクセスとランダムアクセスの両方が可能です。
一般的な非標準の拡張子は、テキストファイルの処理に使用される行シーケンシャル編成です。ファイル内のレコードは改行で終了し、長さが異なる場合があります。
データ分割編集
データ分割は、異なる項目を宣言する6つのセクションに分割されます。ファイルレコード;静的変数用の作業用ストレージセクション。自動変数用のローカルストレージセクション。パラメータと戻り値のリンケージセクション。テキストベースのユーザーインターフェイス用のレポートセクションと画面セクション。
集約されたdataEdit
COBOLのデータ項目は、データ項目が別のデータ項目の一部であるかどうかを示すレベル番号を使用して階層的に宣言されます。レベル番号が高いアイテムは、レベル番号が低いアイテムに従属します。レベル番号が1の最上位のデータ項目は、レコードと呼ばれます。下位の集計データを持つアイテムはグループアイテムと呼ばれます。そうでないものは基本アイテムと呼ばれます。標準データ項目の説明に使用されるレベル番号は1〜49です。
上記の例では、基本項目 num
とグループ項目日付
はレコード some-record
に従属し、基本アイテムは年
、月
、 -day
はグループアイテム the-date
の一部です。
下位アイテムは IN
(または OF
)キーワード。たとえば、上記のサンプルコードと次の例を考えてみましょう。
01 sale-date. 05 the-year PIC 9(4). 05 the-month PIC 99. 05 the-day PIC 99.
名前年
、月
、日
は、複数のデータ項目がそれらの名前で定義されているため、それ自体があいまいです。特定のデータ項目、たとえば sale-date
グループに含まれる項目の1つを指定するには、プログラマーは年のIN販売日
(または同等の年の販売日
)。 (この構文は、ほとんどの現代言語でサポートされている「ドット表記」に似ています。)
その他のデータレベル編集
レベル番号66は、の再グループ化を宣言するために使用されます。それらのアイテムがどのように構成されているかに関係なく、以前に定義されたアイテム。このデータレベルは、関連する RENAMES
句でも参照されますが、ほとんど使用されず、1988年頃、通常は古いプログラムで見つかりました。階層的および論理的構造データを無視する機能は、その使用が推奨されておらず、多くのインストールで使用が禁止されていることを意味します。
77レベル番号は、アイテムがスタンドアロンであることを示し、そのような状況では、レベル番号01。たとえば、次のコードは、2つの77レベルのデータ項目 property-name
と sales-region
は、他のデータ項目から独立している(従属していない)非グループデータ項目です:
77 property-name PIC X(80). 77 sales-region PIC 9(5).
88レベル番号は、その親データ項目に VALUE
句。たとえば、次のコードは、 wage-type
データ項目の現在の文字データ値に応じてtrueまたはfalseになる2つの88レベルの条件名項目を定義します。 。データ項目に "H"
の値が含まれている場合、条件名 wage-is-hourly
はtrueですが、 "S"
または "Y" の値が含まれている場合コード>、条件名
wage-is-yearly
はtrueです。データ項目に他の値が含まれている場合、条件名は両方ともfalseです。
01 wage-type PIC X. 88 wage-is-hourly VALUE "H". 88 wage-is-yearly VALUE "S", "Y".
データ型編集
標準COBOLは、次のデータ型を提供します。
データ型 | サンプル宣言 | メモ |
---|---|---|
アルファベット順 | PIC A (30) |
文字またはスペースのみを含めることができます |
アルファベット順 | PIC X(30) |
任意の文字を含めることができます |
ブール値 | PIC1使用ビット |
0と1の形式でバイナリ番号として格納されたデータ |
インデックス | 使用インデックス |
テーブル要素の参照に使用 |
National | PIC N(30) |
英数字に似ていますが、拡張文字を使用しますセット、例: UTF-8 |
数値 | PIC 9(5)V9(5) |
数字のみを含めることができます |
オブジェクト | 使用オブジェクト参照コード>
|
オブジェクトまたはNULL |
ポインタ | 使用法ポインター |
タイプの安全性はCOBOLでは可変です。数値データは、さまざまな表現とサイズの間でサイレントに変換され、英数字データは、数値データやグループデータなど、文字列として格納できる任意のデータ項目に配置できます。対照的に、オブジェクト参照とポインタは同じタイプのアイテムからのみ割り当てることができ、それらの値は特定のタイプに制限される場合があります。
PICTURE句編集
A PICTURE
(または PIC
)句は文字列であり、各句はデータ項目の一部を表し、何が含まれている可能性があります。一部の画像文字は、アイテムのタイプと、メモリ内でアイテムが占める文字または数字の数を指定します。たとえば、 9
は10進数を示し、 S
はアイテムが署名しました。その他の画像文字(挿入文字および編集文字と呼ばれる)は、アイテムのフォーマット方法を指定します。たとえば、一連の +
文字は、文字の位置と、最終的な文字データ内で先頭の記号文字をどのように配置するかを定義します。右端の数字以外の文字にはアイテムの記号が含まれ、この位置の左側にある +
に対応する他の文字位置にはスペースが含まれます。繰り返し文字の後に括弧で数字を指定することで、文字をより簡潔に指定できます。たとえば、 9(7)
は 9999999 。数字( 9
)と記号(のみを含む画像仕様S
)文字は純粋に数値のデータ項目を定義し、画像仕様にはアルファベット( A
)または英数字( X
)文字は英数字データ項目を定義します。他のフォーマット文字の存在は、編集された数値または編集された英数字データ項目を定義します。
USAGE句編集
USAGE
句はフォーマットを宣言しますデータはに保存されます。データ型に応じて、 PICTURE
句の代わりに補完または使用できます。ポインタやオブジェクト参照を宣言するために使用できますが、ほとんどの場合、数値型を指定することを目的としています。これらの数値形式は次のとおりです。
- バイナリ。最小サイズは、
PICTURE
句またはUSAGE
などの句。 -
USAGE COMPUTATIONAL
、データは実装が提供する形式で保存されます。多くの場合、デフォルトの形式であるUSAGE BINARY
-
USAGE DISPLAY
と同等です。 、データが文字列として格納される場合 - 浮動小数点、実装に依存する形式、またはIEEE754に準拠。
-
USAGE NATIONAL
、データは拡張文字セットを使用して文字列として格納されます -
USAGE PACKED-DECIMAL
、ここでデータ可能な限り最小の10進形式(通常は2進化10進表現でパック)で格納されます。
レポートライター編集
レポートライターは、レポートを作成するための宣言機能です。プログラマーは、レポートレイアウトとそれを作成するために必要なデータを指定するだけで済み、改ページ、データの書式設定、見出しと脚注などを処理するコードを作成する必要がなくなります。
レポートはレポートに関連付けられていますファイル。レポートライターステートメントを介してのみ書き込むことができるファイルです。
FD report-out REPORT sales-report.
各レポートはレポートセクションで定義されます。データ部門の。レポートは、レポートの見出し、脚注、および詳細を定義するレポートグループに分割されます。レポートは、階層的なコントロールブレークを回避します。コントロールブレークは、キー変数が値を変更すると発生します。たとえば、顧客の注文の詳細を示すレポートを作成する場合、プログラムが別の顧客の注文に到達すると、コントロールブレークが発生する可能性があります。これは、営業担当者の売上を示し、無効なレコードを警告するレポートのレポートの説明の例です。
上記のレポートの説明次のレイアウトについて説明します。
4つのステートメントがレポートライターを制御します。 INITIATE
は、レポートライターを印刷できるように準備します。 GENERATE
、レポートグループを出力します。 SUPPRESS
は、レポートグループの印刷を抑制します。 TERMINATE
は、レポートの処理を終了します。上記の販売レポートの例の場合、手順部門は次のようになります。
OPEN INPUT sales, OUTPUT report-out INITIATE sales-report PERFORM UNTIL 1 <> 1 READ sales AT END EXIT PERFORM END-READ VALIDATE sales-record IF valid-record GENERATE sales-on-day ELSE GENERATE invalid-sales END-IF END-PERFORM TERMINATE sales-report CLOSE sales, report-out .
レポートライター機能の使用は異なる傾向がありましたかなり;広く使用している組織もあれば、まったく使用していない組織もあります。さらに、Report Writerの実装は品質に幅があり、ローエンドの実装は実行時に過剰な量のメモリを使用することがありました。
プロシージャdivisionEdit
ProceduresEdit
プロシージャ部門のセクションと段落(まとめてプロシージャと呼びます)は、ラベルおよび単純なサブルーチンとして使用できます。他の部門とは異なり、段落をセクションに含める必要はありません。プログラムの実行は、プログラムが終了するまで実行されます。プロシージャをサブルーチンとして使用するには、 PERFORM
動詞が使用されます。
PERFORM
ステートメントは、実行がコードに戻るという意味で、現代語のプロシージャ呼び出しにいくぶん似ています。呼び出されたコードの最後にある PERFORM
ステートメントの後に;ただし、パラメータを渡したり、結果値を返したりするためのメカニズムは提供されていません。 PERFORMサブルーチン
のような単純なステートメントを使用してサブルーチンが呼び出された場合、制御は呼び出されたプロシージャの最後に戻ります。ただし、 PERFORM
は、いくつかの隣接するプロシージャのシーケンスにまたがる範囲を呼び出すために使用される可能性があるという点で珍しいものです。これは、 PERFORM sub-1 THRU sub-n
コンストラクトを使用して実行されます:
PROCEDURE so-and-so. PERFORM ALPHA PERFORM ALPHA THRU GAMMA STOP RUN.ALPHA. DISPLAY "A".BETA. DISPLAY "B".GAMMA. DISPLAY "C".
このプログラムの出力は「AABC」になります。
PERFORM
も、の従来のプロシージャ呼び出しとは異なります。少なくとも伝統的に、コールスタックの概念はありません。結果として、ネストされた呼び出しが可能です( PERFORM
“された一連のコードは、 PERFORM ステートメント自体)。ただし、同じコードの一部が両方の呼び出しで実行される場合は特に注意が必要です。問題は、内側の呼び出しのコードが外側の呼び出しの出口点に到達したときに発生します。より正式には、制御が以前に呼び出されたがまだ完了していない
PERFORM
呼び出しの出口点である、COBOL 2002標準では、動作が未定義であると公式に規定されています。
その理由は、「リターンアドレス」ではなく、COBOLが継続アドレスと呼ばれるもので動作するためです。制御フローが手順の最後に達すると、継続アドレスが検索され、制御がそのアドレスに転送されます。プログラムが実行されると、すべての手順の継続アドレスがプロの開始アドレスに初期化されます PERFORM
ステートメントが発生しない場合に、制御がプログラムを上から下に流れるように、プログラムテキストの次に来る手順。ただし、 PERFORM
ステートメントが実行されると、呼び出されたプロシージャ(または PERFORM THRU が使用された)。これにより、制御は最後に呼び出しサイトに戻ります。元の値が保存され、後で復元されますが、保存位置は1つだけです。 2つのネストされた呼び出しが重複するコードで動作する場合、それらはいくつかの方法で相互の継続アドレスの管理に干渉する可能性があります。
次の例(Veerman & Verhoeven 2006)は、問題を示しています。
このプログラムの出力は「12 3 4 3」になると予想される場合があります。「2」を表示した後、2番目の PERFORM
により、「3」と「4」が表示され、最初の呼び出しは「3」で続行されます。従来のCOBOL実装では、これは当てはまりません。むしろ、最初の PERFORM
ステートメントは、 LABEL3
の最後に継続アドレスを設定して、 LABEL1
内のサイトを呼び出します。2番目の PERFORM
ステートメントは、
LABEL4 ですが、 LABEL3
の最後に到達すると、外部 PERFORM にジャンプして戻ります。 code>ステートメントを実行すると、プログラムは「1 23」だけを出力しなくなります。一方、オープンソースのTinyCOBOLコンパイラなどの一部のCOBOL実装では、2つの
PERFORM
ステートメントは互いに干渉せず、出力は実際には「1」です。 2 3 4 3 "。したがって、このような場合の動作は(おそらく)驚くべきものであるだけでなく、移植性もありません。
この制限の特別な結果は、 PERFORM
を使用して再帰コードを記述することはできません。これを説明する別の簡単な例(Veerman & Verhoeven 2006から少し簡略化):
MOVE 1 TO A PERFORM LABEL STOP RUN.LABEL. DISPLAY A IF A < 3 ADD 1 TO A PERFORM LABEL END-IF DISPLAY "END".
出力は「12 3 END END END」であると予想される場合があります。実際、これは一部のCOBOLコンパイラーが生成するものです。ただし、IBM COBOLなどの一部のコンパイラーは、「1 2 3 END END END END END ...」などを出力するコードを生成し、「END」を無限ループで繰り返し出力します。バックアップ継続アドレスを格納するスペースが限られているため、再帰呼び出しの過程でバックアップが上書きされ、復元できるのは DISPLAY "END" 。
StatementsEdit
COBOL 2014には47のステートメント(動詞とも呼ばれます)があり、制御フロー、I / O、データ操作、および次の大まかなカテゴリに分類できます。レポートライター。レポートライターステートメントについては、レポートライターセクションで説明しています。
コントロールflowEdit
COBOLの条件ステートメントは IF
および EVALUATE
。 EVALUATE
は、複数を評価する機能が追加されたスイッチのようなステートメントです。値と条件。これは、決定テーブルを実装するために使用できます。たとえば、CNC旋盤を制御するために次のように使用できます。
EVALUATE TRUE ALSO desired-speed ALSO current-speed WHEN lid-closed ALSO min-speed THRU max-speed ALSO LESS THAN desired-speed PERFORM speed-up-machine WHEN lid-closed ALSO min-speed THRU max-speed ALSO GREATER THAN desired-speed PERFORM slow-down-machine WHEN lid-open ALSO ANY ALSO NOT ZERO PERFORM emergency-stop WHEN OTHER CONTINUEEND-EVALUATE
PERFORM
ステートメントは、条件が真になるまで実行されるループを定義するために使用されます(trueの間ではなく、他の言語でより一般的です)。プロシージャまたはプロシージャの範囲を呼び出すためにも使用されます(詳細については、プロシージャのセクションを参照してください)。 CALL
および INVOKE
は、それぞれサブプログラムとメソッドを呼び出します。サブプログラム/メソッドの名前は、strに含まれています。リテラルまたはデータ項目のいずれかです。パラメータは、参照、コンテンツ(コピーが参照で渡される場合)、または値(ただし、プロトタイプが利用可能な場合のみ)で渡すことができます。 CANCEL
はサブプログラムをアンロードします。メモリから。 GO TO
を指定すると、プログラムは指定されたプロシージャにジャンプします。
GOBACK
ステートメントはreturnステートメントであり、 STOP
ステートメントはプログラムを停止します。 EXIT
ステートメントには、6つの異なる形式があります。returnステートメント、breakステートメント、continueステートメント、終了マーカーとして使用するか、プロシージャを終了するために使用できます。
例外は RAISE
ステートメントによって発生し、 DECLARATIVES
部分。宣言は、処理するエラーを指定する USE
ステートメントで始まるセクションです。例外は名前またはオブジェクトです。 RESUME
は、宣言で使用され、例外を発生させたステートメントの後のステートメント、または宣言型
。他の言語とは異なり、キャッチされない例外はプログラムを終了せず、プログラムは影響を受けずに続行できます。
I / OEdit
ファイルI / Oは、自己記述型の OPEN
、 CLOSE
、 READ
、および WRITE
ステートメントとさらに3つのステートメント: REWRITE
。レコードを更新します。 START
。特定のキーを持つレコードを見つけることにより、アクセスする後続のレコードを選択します。 UNLOCK
は、最後にアクセスしたレコードのロックを解除します。
ユーザーの操作は、 ACCEPT
および DISPLAY
。
データ操作編集
次の動詞はデータを操作します:
-
INITIALIZE
。データ項目をデフォルト値に設定します。 -
MOVE
、データ項目に値を割り当てます; MOVE CORRESPONDINGは、対応する同じ名前のフィールドを割り当てます。 -
SET
は、15の形式で、インデックスの変更、オブジェクト参照の割り当て、テーブルの変更が可能です。他の機能の中でも、容量。 -
ADD
、SUBTRACT
、MULTIPLY
、DIVIDE
、およびCOMPUTE
。算術(COMPUTE
を使用して式の結果を変数に割り当てます)。 -
動的メモリを処理するALLOCATE
およびFREE
。 -
VALIDATE
は、データ部門のアイテムの説明で指定されているようにデータを検証して配布します。 -
STRING
およびUNSTRING
、それぞれ文字列を連結および分割します。 -
INSPECT
、集計します。または、文字列内の指定された部分文字列のインスタンスを置き換えます。 -
SEARCH
は、テーブルで最初のエントリを検索します条件を満たす。
ファイルとテーブルは SORT
と MERGE
動詞は、ファイルをマージしてソートします。 RELEASE
動詞は並べ替えるレコードを提供し、 RETURN
は並べ替えられたレコードを順番に取得します。
スコープ終了編集
IF
や READ 、それ自体にステートメントが含まれる場合があります。このようなステートメントは、2つの方法で終了できます。ピリオド(暗黙的な終了)によって、含まれているすべての終了していないステートメントを終了します。または、スコープターミネーターによって、最も近い一致するオープンステートメントを終了します。
ネストされたステートメントは、期間はバグの一般的な原因です。たとえば、次のコードを調べます。
IF x DISPLAY y. DISPLAY z.
ここでは、y
x
がtrueの場合、/ div>およびz
。ただし、IF
ステートメントが終了しているため、z
はx
の値に関係なく表示されます。 DISPLAY y
の後の誤った期間による。
別のバグは、2つのIF
ステートメントはELSE
に関連付けることができます。
IF x IF y DISPLAY aELSE DISPLAY b.
上記のフラグメントでは、ELSE
はivid = “3210f17cac”ではなく、 IF y
ステートメントに関連付けられています。 > IF x ステートメント、バグの原因。明示的なスコープターミネータを導入する前は、それを防ぐには、 ELSE NEXT SENTENCE
を内側のIF
の後に配置する必要がありました。 。
自己変更コード編集
元の(1959)COBOL仕様は、悪名高い ALTER X TO PROCEED TO Y codeをサポートしていました。 >ステートメント。多くのコンパイラーが自己変更コードを生成しました。
X
とY
はプロシージャラベルであり、単一の移動
このような ALTER
ステートメントの後に実行されるプロシージャX
のステートメントは、を意味します。代わりにY
に移動してください。多くのコンパイラはまだそれをサポートしていますが、COBOL 1985標準では廃止され、2002年に削除されたと見なされました。
ALTER
ステートメントはあまり評価されていませんでした。これは、「コンテキストの局所性」を損ない、プログラムの全体的なロジックを理解するのを困難にしたためです。教科書の著者であるダニエルD.マクラケンが1976年に書いたように、「これまでプログラムを見たことがない人は、できるだけ早くプログラムに精通する必要があります。 、プログラムが失敗したために時々重大な時間的プレッシャーにさらされている…プログラム全体の未知の場所に未知の数のALTERステートメントが存在することを示す、それ自体が段落内のGO TOステートメントの光景は、勇敢なプログラマーの心臓部です。」
Hello、worldEdit
COBOLの「Hello、world」プログラム:
IDENTIFICATION DIVISION. PROGRAM-ID. hello-world. PROCEDURE DIVISION. DISPLAY "Hello, world!" .
Cプログラミング言語の「Hello、World!」プログラムの例が1978年に最初に公開されたとき、同様のmai nframe COBOLプログラムのサンプルは、おそらくパンチカードリーダーと80列のパンチカードを使用して、JCLを介して送信されます。以下のリストは、空のDATA DIVISIONを使用して、GNU / LinuxおよびMVS3.8Jを実行しているSystem / 370Herculesエミュレーターを使用してテストされました。 2015年7月に作成されたJCLは、JayMoseleyがホストするHerculesチュートリアルとサンプルから派生しています。その時代のCOBOLプログラミングであるHELLO、WORLDに合わせて、すべて大文字で表示されます。
JCLを送信すると、MVSコンソールに次のように表示されます。
19.52.48 JOB 3 $HASP100 COBUCLG ON READER1 COBOL BASE TEST 19.52.48 JOB 3 IEF677I WARNING MESSAGE(S) FOR JOB COBUCLG ISSUED 19.52.48 JOB 3 $HASP373 COBUCLG STARTED - INIT 1 - CLASS A - SYS BSP1 19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING 19.52.48 JOB 3 IEC130I SYSLIB DD STATEMENT MISSING 19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING 19.52.48 JOB 3 IEFACTRT - Stepname Procstep Program Retcode 19.52.48 JOB 3 COBUCLG BASETEST COB IKFCBL00 RC= 0000 19.52.48 JOB 3 COBUCLG BASETEST LKED IEWL RC= 0000 19.52.48 JOB 3 +HELLO, WORLD 19.52.48 JOB 3 COBUCLG BASETEST GO PGM=*.DD RC= 0000 19.52.48 JOB 3 $HASP395 COBUCLG ENDED
上記のコンソールリストの10行目 は効果のために強調表示されますが、強調表示は実際のコンソール出力の一部ではありません。
14行の出力からの1行の出力について、4ページの技術詳細とジョブ実行情報で生成された関連コンパイラリスト COBOL。