どうも、N高生のゆういちです。
今回は興味本位でCOBOLを書いてみました。
あまりなじみのないCOBOLを触れようと思った理由はどんな技術だろうといった理由ですね。
色々調べていくうちに分かったことがありましたので、
初心者向けに説明していきます。
概要
COBOLのプログラムを作るにあたって、UbuntuやGnuCOBOL(旧openCOBOL)の環境構築した後、プログラムを作ります。
自分はWindows10で、GnuCOBOLどころかUbuntuもありません。なので、一から準備していく形です。
前提
- Windows10を使用
- Ubuntu上で行います。
- viエディタを使用。
1.Windows10にUbuntu20.04 LTSを導入
WindowsでGnuCOBOLを使用するにはWSLが必要になるので、WSLとUbuntuのインストールを行います。
1-1.WSLを有効化する
Windowsの機能の有効化または無効化
を検索します。
Windowsの機能画面が出たら、Linux用 Windows サブシステム
にチェックします。
環境によって言葉が変わってるかもしれないので、上記のチェック項目がない場合はWindows Subsystem for Linux
という項目を探して、チェックしてください。
1-2.Ubuntu 20.04 LTSをインストール
MicroSoft Storeより、「Ubuntu 20.04 LTS」を検索→入手→起動
インストール後、最初の起動だけユーザー名とパスワードの入力が求められます。
パスワードは確認のパスワードの入力も含まれるので、これもパスワードを入力します。
Enter new UNIX username: <ユーザー名>
New password: <パスワード>
これでセットアップはひとまず完了です。
【おまけ】ターミナルを新調してみた
起動したUbuntuのターミナルでもいいのですが、せっかくなのでMac感がでてるターミナルに変えてみます。
MicroSoft Storeで「Windows Terminal Preview」を検索→入手→起動。
起動するとmacっぽいターミナルが表示されます。
タイトルバーの下向きの矢印(ドロップダウンメニュー)をクリックするとメニューが表示されます。
ここにはそのPCで利用可能なターミナルが反映されていて、任意のターミナルを起動できます。(PowerShellやコマンドプロンプトなど)
あとはUbuntu 20.04を選択すれば完了です。
これでターミナルの新調が完了です。
2.GnuCOBOLをインストール
ターミナル上で以下のコマンドを実行しましょう。
- Windows10の場合
WindowsでGnuCOBOLを使うにはWSLを使います。先ほどUbuntuをインストール等と準備しましたので、あとは以下のコマンドを実行します。
sudo apt update
sudo apt install open-cobol
- macOSの場合
macOSではホームブリューを使います。こちらからインストールできます。
brew install gnu-cobol
完了まで10分以上かかると思いますので、その間は本を読んだりして、時間を有効的に使いましょう。
3.COBOLのプログラムをつくる
やっと本題です。実際にCOBOLを使ってプログラムを書いていきましょう。
手順は以下です。
3-1.Hello, World!を書く
1.現在のディレクトリの位置を確認。
pwdコマンドを実行。
$ pwd
/mnt/c/Users/user
2.任意のディレクトリを作成
ここでは、dev
ディレクトリ、hello.cbl
というソースファイルを作成します。
前提通り、viコマンドを実行してviエディタでプログラムを書いていきます。
$ mkdir dev
$ cd dev
$ vi hello.cbl // COBOLのソースファイルを作成
3.ソースコードを書く。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
DISPLAY "Hello, World!".
STOP RUN.
4.コンパイル
-x
オプションは、実行ファイルを作成するためのオプションです。
$ cobc -x ./hello.cbl
5.実行ファイルが作成。
先ほどの-x
オプションによって、実行ファイルとしてhelloという名前のファイルが作成されました。
$ ls
hello hello.cbl
6.プログラムを実行。
結果が出力されたらクリアです!
$ ./hello
Hello, World!
3-2.1から10まで加算して表示する
IDENTIFICATION DIVISION.
PROGRAM-ID.loop.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 I PIC 9(2).
01 CNT PIC 9(2).
PROCEDURE DIVISION.
MAIN.
MOVE 0 TO I
MOVE 0 TO CNT
PERFORM UNTIL I >= 10
ADD 1 TO I
ADD I TO CNT
DISPLAY "I=" I ", CNT=" CNT
END-PERFORM.
DISPLAY "CNT=" CNT
STOP RUN.
END PROGRAM loop.
DATA DIVISION.
とWORKING-STORAGE SECTION.
以下で変数を宣言。
PERFORM
からEND-PERFORM
の範囲が繰り返し処理を行い、
PERFORM UNTIL 条件
というように書きます。
あとは実行すると以下のようになります。
I=01, CNT=01
I=02, CNT=03
I=03, CNT=06
I=04, CNT=10
I=05, CNT=15
I=06, CNT=21
I=07, CNT=28
I=08, CNT=36
I=09, CNT=45
I=10, CNT=55
CNT=55
3-3.FizzBuzz問題を書いてみる
IDENTIFICATION DIVISION.
PROGRAM-ID. FizzBuzz.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 N PIC 9(3) VALUE 1.
01 FIZZ PIC 9(1).
01 BUZZ PIC 9(1).
PROCEDURE DIVISION.
PERFORM 100 TIMES
COMPUTE FIZZ = FUNCTION MOD(N 3)
COMPUTE BUZZ = FUNCTION MOD(N 5)
IF FIZZ = 0 AND BUZZ = 0 THEN
DISPLAY "FizzBuzz"
ELSE IF FIZZ = 0 THEN
DISPLAY "Fizz"
ELSE IF BUZZ = 0 THEN
DISPLAY "Buzz"
ELSE
DISPLAY N
END-IF
END-IF
END-IF
ADD 1 TO N
END-PERFORM.
STOP RUN.
PERFORM 100 TIMES
で、100回繰り返しが行われます。
COMPUTE FIZZ = FUNCTION MOD(N 3)
は、Nを3で割った余りを変数FIZZに代入。
↓実行
001
002
Fizz
004
Buzz
Fizz
007
008
Fizz
Buzz
011
Fizz
013
014
FizzBuzz
...
実際にやってみて
以上でCOBOLの環境構築からプログラムを書くところまで行いました。
COBOLは仕様上、構文が冗長なのが特徴的で、クセの強い言語だなぁというのが感想ですね。
FizzBuzz問題のコードはif elseの部分とかは他のプログラミング言語とさほど変わらないかな。
VScodeで書きたい人向けとして、「COBOL」という拡張機能を使えばシンタックスハイライトや入力補完が使えますので是非使ってみてください。(てかCOBOL書きたい人いるのか???)