Pythonで実装されたCOBOLインタープリタのご紹介 

:::note info
2025/1/15 最新化しました。
:::

## はじめに

プログラミングをしていると、「この機能はどう動作するのだろう？」と気になることがよくあります。そんな時、まずはWebで検索して機能を確認し、さらに簡単なプログラムを書いて動作を確認することが一般的です。

Ruby、Java、Pythonならば、コードを書いて即実行できるので、試してみることに抵抗がありません。C++も、Visual Studioなどを使用すれば比較的簡単に試すことができますね。

しかし、COBOLはどうでしょうか？

手軽に動かせるCOBOL環境はなかなか見つかりません。もちろん、OpenCOBOLなどをセットアップすれば動作させることは可能ですが、そのセットアップには時間と労力がかかり、誰でも簡単に扱えるとは言い難いです。

そこで、「ないなら作ってしまおう」と考え、開発したのがインタープリタ型COBOL「Smart Interpreter Training COBOL」(以下 SIT COBOL)です。


![Black Beauty Makeup YouTube Thumbnail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329906/24ef9e32-76e7-b8c1-ebff-0366734204b4.png)


今回は、このCOBOLインタープリタをご紹介したいと思います。

## COBOLについて

### 誕生の背景

COBOL（Common Business-Oriented Language）は、1959年に商業用コンピュータ言語として誕生しました。当時、コンピュータの利用が広がり始めた中で、企業が効率的に業務処理を行うための標準化されたプログラミング言語が求められていました。こうした背景のもと、商業データ処理を目的として開発されたのがCOBOLとなります。

COBOLの特徴の一つは、その文法が自然言語に近く、比較的読みやすいという点です。たとえば、「ADD A TO B」というように、英語に似た構文が多くのプログラマに親しまれてきました。この言語は特に、銀行や政府機関、保険会社といった大規模な業務システムで広く採用され、そのシンプルで堅牢な設計により、今なお多くのレガシーシステムがCOBOLで動作しています。

これらのシステムは、数十年にわたり運用され続け、莫大なデータとプロセスを管理しています。そのため、COBOLに精通したエンジニアの需要は依然として高く、多くの企業や政府機関がCOBOLを維持し続けています。COBOLを学ぶことは、こうした現代のビジネスの根幹を支えるシステムの維持に寄与するだけでなく、長い歴史を持つ技術に対する理解を深めることにもつながります。

### 学習面の課題

しかし、COBOLにはいくつかの課題も存在します。現代のプログラミング言語と比較すると、その学習には若干敷居が高くなっているというのが実情です。Python, Ruby, Javaのように無償で入手できる OSS COBOL、opensource COBOLもありますが、実行環境を構築するのも容易ではなく、特に初心者にとってはハードルが高いと言えます。また、このような理由から、COBOLを学ぶ機会は限られがちであり、その習得は商用ベースのCOBOLを利用できる企業の要員や一部の専門家に限られる傾向があります。

ただ、現在、Udemyにて[「C/Javaプログラマー向け COBOL入門 ～開発環境構築編～」](https://www.udemy.com/course/cobol-develop/)を無料公開していますが、受講者数は400名近くとなり、実際には学習を希望されているかたが少なくありません。

今回ご紹介する SIT COBOLは、こうしたニーズにも応えられるものです。

## 機能について

この記事はQiita読者の皆さん向けなので技術っぽいことを書きますが、その前に簡単にSIT COBOLの機能の紹介をしておこうと思います。詳しくは[「Smart Interpreter Training COBOL」](https://sit-cobol.sit11.com/)のホームページを見てください。

SIT COBOLは、COBOLプログラミングの学習用に作られたソフトウェアとなります。プログラミングに必要なプログラムの作成環境、実行環境が備わっており、次のような特徴を持っています。

- **セットアップ不要**:
ダウンロードしてzipファイルを解凍したら即利用ができます。面倒なセットアップはありません。

- **即実行可能**:
インタープリタ方式なので、プログラムを書いたらすぐに実行可能。学んだことをすぐに試せます。
- **作成途中でも実行可能**:
SIT COBOLは文法エラーがある場合でもメッセージを出して極力実行。例えば変数が未定義だった場合でも、変数の定義を補って実行を続けます。

- **便利なステップ実行**:
プログラムの動作を１命令ずつ実行できます。１命令ごとの結果を確認しながら学べるので、細かな動作理解に最適です。

- **実行された命令をトレース**:
「トレースモード」で実行すると、COBOLプログラムのどの行、命令を通過したのか、プログラムの行イメージが表示されます。

- **データの値の参照/更新も自由自在**:
実行中にデータの値を参照・更新できるため、動作の確認とデバッグが容易です。

:::note info
データ値の更新については2025年1月末現在では未サポートです。
:::

- **本格的アプリケーションも記述可**
ファイル入出力機能(順・索引)、埋込みSQL機能(データベースはsqlite3)なども、追加オプションなしに使用することができるので、データベースやファイルを使用したアプリケーションの開発経験ができます。


- **Visual Studio Codeライクな専用エディタ**:
SIT COBOL専用のエディタがそのまま実行環境になるため、シームレスな開発体験を提供します。

## 実際の動作イメージ
次に動作イメージの説明も簡単にしておきたいと思いましたが、GUI系の操作の様子などは文字で説明するのが難しく、Youtubeに動作イメージの動画を上げていますので、まずは、こちらで確認いただければよいかと思います。

[「【動画】ちょっと凄いかも!? COBOL学習用ソフトウェアStamrt Interpreter Training COBOL」](https://youtu.be/l-lfRYp6kqQ "ちょっと凄いかも!? COBOL学習用ソフトウェアStamrt Interpreter Training COBOL(SIT COBOL)")

## ここから技術的な話

以上は利用者向けの説明です。ここからは技術者向けの話となります。

### 開発言語
SIT COBOLは、すべてPythonで作成しています。COBOL専用エディタや実行ログなどを出力するGUI部分はPyside6を使用しています。

Pyside6を使用しているので、GUI部分についてはかなり凝った設計もできますが、現在はCOBOL機能を優先しており、必要最低限の実装になっています。今後余裕ができた段階で操作性の向上を考えていきます。

## 構成

SIT COBOLは、大きく 「GUI部分」「 中間コード作成部」と「実行部」に分かれます。

- **GUI部**
GUI部は、COBOLプログラム作成を支援する、いわゆるエディタ部分と、実行結果を表示する実行ログや、実行中のデータの値を表示する機能をつかさどっています。また[実行]ボタンが押されたときに、**中間コード生成部**を呼び出し、さらに**実行部**を呼び出します。また[ステップ実行]ボタンを押したときは、ステップ実行オプション指定で**実行部**を呼び出します。
- **中間コード生成部**
中間コード生成部は、GUI部からサブスレッドとして起動されます。引数として渡されるのは、SIT COBOL専用エディタの中のCOBOLプログラムです。
中間コード生成部は、まず、プログラムを「トークン」と呼ばれる語彙に分解(字句解析)し、次に、そのトークンを入力としてCOBOL構文に分解(構文解析)を行い、中間コードというものを作成します。この中間コードは、いろいろな表現のしかたがありますが、SIT COBOLにおいては、JSON形式で表現しており、定義されているデータの属性や大きさ、メモリ上の割り付け位置などの情報を持たせています。また、手続き部については、COBOLの１命令単位で、命令の種別や各データが、どこで定義されているかの情報などを持っています。また、もとソースイメージなども、この中間コードの中に持たせています。
中間コード生成部は最終的に、この中間コードをGUI部に返します。

- **実行部**
実行部は、中間コードを参照し実行していく、いわゆるインタープリタの中核部となります。
実行部は、GUI部からサブスレッドとして起動されます。引数として渡されるのは、中間コードと、ステップ実行モードの有無です。
一番最初に実行部が呼ばれたときは、中間コード中のデータ定義を参照してメモリ確保と初期値設定をします。それから指定された行の文を解釈実行します。その行を実行したあとは、ステップ実行モードであればGUI部に制御を戻します。このとき、次に実行すべき行番号の情報もGUI部に返します。
ここで「GUI部に制御を戻す」といいましたが、実際には、Signal ans Slotメカニズムを利用しています。具体的には、サブスレッドである実行部から親スレッドであるGUI部に、「次に実行する行番号」をシグナルとして送っています。GUI部はシグナルを受け取り、それを処理するスロットにて、次に実行する行がエディタの中央になるように位置付けているというわけです。
なお、実行の結果はすべて中間コードに関連づけてサブスレッド側に残してあるので、次にGUI部から実行部が呼ばれ中間コードの実行が再開したときは、そのときのメモリ状態から継続実行できてしまうというわけです。

## いろいろな仕組みの実装について

### ACCEPT文のしくみ
ACCEPT文(CONSOLE指定)は、コンソール（操作卓）から入力されたデータを受け取る機能です。Windowsならコマンドプロンプトから入力したデータを受け取るイメージです(pythonならinput(), Cならscanf()に相当します)。

SIT COBOLでは、ACCEPT文(CONSOLE指定)が実行されると下記のようにINPUTダイアログが表示され、何かデータを入力すると処理が続行するようになっています。これはどのように実現しているのでしょうか？

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329906/17469b6b-3800-c9a3-0055-9cc89ef3f0a5.png">

実は、ACCEPT文(CONSOLE指定)の実行はGUI側で行っています。次に実行する文がACCEPTである場合、実行部は、GUI部に「ACCEPTの入力である」ことを示す信号を送ります。GUI部は、信号を受け取ったらインプットダイアログを表示し、データの入力を促します。データ入力が終わったら、その入力データ値を引数として、再び、実行部を呼び出し、実行部は残りの処理（入力されたデータをACCEPTで指定されたデータ名に設定）をします。

### DISPLAY文のしくみ
DISPLAY文は、テキストイメージを出力する機能であり、Pythonならprint()、Cならprintf相当の機能です。

SIT COBOLでは、DISPLAY文の実行結果は、実行ログに緑色で出力されます。
また、エラーメッセージは、赤やピンクで表示されます。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329906/4cc92575-22c4-eaaa-c61e-726446a0879c.png">

実は、これらのしくみも、Singal and Slotメカニズムを利用しています。
実行部は、実行ログに出力すべきデータを制御部に信号として送るのですが、データの先頭に、ある記号を入れておき、GUI部はその記号によって、出力する色を変えて実行ログに出力しているというわけです。

### 中間精度

COBOLは、18桁まで定義可能な10進数が普通に使われており、10進数同志の演算では高い中間精度が求められます。
このため、SIT COBOLでは、Decimalクラスを用いて演算(加減乗除、べき乗）を行っており、精度については常に30桁となるようにしています。

### 組込関数

COBOLの組込関数は、ほとんど、pythonの関数を使って1対1で実装をしています。
MAXやMINは特に問題ないのですが、mathクラスの関数(三角関数など）は、Decimalクラスが利用できず、そのため、精度が15-17桁程度となります。

:::note info
組込関数については、~~2024年9月末頃サポート予定です。~~ 2024年9月16日に Ver11 1.1.0 にてサポート済です。
:::

### 索引ファイル機能

索引ファイル機能は、sqliteデータベースを利用して実現しています。OPEN文で、ASSGIN TO句に指定されたファイル名をデータベース名としてコネクトしますが、OUTPUTモードのときは、さらにkeyとdataという列を持つrecordsというテーブルを作成します。

そして、RECORD KEY句で指定された主キーの値をkey列に、レコード全体イメージをdata列に格納して索引ファイルとして見せています。

### 埋め込みSQL機能 (2025年1月12日 Ver 11 1.5.0でサポート)

埋め込みSQL機能は、COBOLのプログラムのからSQLにより、Oracleデータベースや各種データベースをアクセスする機能です。

通常のCOBOLコンパイラでは、埋め込みSQL機能はCOBOLベンダー、あるいはOracle( Pro*COBOL)が提供しているプリコンパイラとして提供されています。

SIT COBOLでは、埋め込みSQLはプリコンパイラが不要でそのまま利用できます。

実装としては、pythonのsqliteアクセス機能で実現しており、EXEC-SQLとEND-EXECで囲まれたSQL文を(ホスト変数の値を埋め込んだあと)、そのままsqliteアクセス機能に投げることによって実現しています。

現在アクセスできるデータベースは、sqliteのみとなっていますが、将来的にはその他のデータベースにもアクセスできるようになる予定です。

### 日本語の取り扱い

- 日本語名標
SIT COBOLは、名標を日本語で書くことができます。かつ特に文字数は制限していません。

- 日本語属性
SIT COBOLは、日本語属性(PIC N)をサポートして~~いません~~  います(2025年1月12日 Ver11 1.5.0で対応済)。

日本語属性をサポートしていますが、しかし、英数字属性(PIC X)で代替することも可能です。

というのも、英数字属性のPIC X(1)は、COBOLの正式文法上は1バイトの文字の定義となりますが、実はSIT COBOLでは、1文字という概念で実装を行っています。

少し説明をします。今、データA,B,C,Dが次のように定義されているとします。

```cobol: sample.cob
 WORKING-STORAGE SECTION.
 01 A.
    02 B PIC X(2) VALUE "AB".
    02 C REDEFINES B PIC X(2).
    02 D PIC X(2) VALUE "CD".
```
ここで、Aの内容をDISPLAYすると、"ABCD"が表示されます。
```cobol:
     DISPLAY A.
*  => ABCD と表示される
```
ここで、項目Bに"日本"と入れてみましょう。
```cobol:
     MOVE "日本" TO B.
```
そしてまたAをDISPLAYしてみましょう。すると次のように"日本CD"が表示されます。
```cobol: 
     DISPLAY A.
*  => 日本CD と表示される
```
B, C, Dの内容もDISPLAYしていましょう。
```cobol:
     DISPLAY B.
*  => 日本 と表示される
     DISPLAY C.
*  => 日本 と表示される
     DISPLAY D.
*  => CD と表示される
```
実際に、SIT COBOLで実行した結果もお見せします。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329906/fc9b006f-8dec-a31f-a3ea-90eb718d28c0.png">

PIC X(2)が、2文字を意味しており、日本語も問題なく受け取れているのがわかるかと思います。

COBOLをよくご存じの方は、非常に違和感があって気持ち悪いかと思いますが、文字は、英数字でも日本語でも、1文字として扱うのが普通であり、このようにすると日本語の取り扱いが非常によくなります。

ただし、従来のCOBOLとは非互換な機能ですので、あくまでもSIT COBOLではCOBOL学習ソフトウェアという位置づけでもあり、このように日本語を扱えるようにしているということを覚えておいてください。

### 性能について

構成の章で説明したように、SIT COBOLは、大きく中間コードを生成するフェーズと、実行するフェーズに分かれます。

[実行]ボタンを押してからプログラムを中間コードを生成し始めるので、実際に実行が始まるまで若干の時間がかかります（時間がかかる場合にはプログレスバーが表示されます）。今後性能改善はする予定ですが、インタープリタという方式上、どうしても時間がかかってしまいます。

また実行フェーズでは１行ごとに解釈実行するので、数千回、数万回繰り返し実行するようなプログラムは相当時間を要するでしょう。

## まとめ

SIT COBOLは、COBOL学習者やプログラミング初心者向けに設計された、使いやすく直感的なインタープリタ型COBOL環境です。セットアップの手間を省き、学習をスムーズに進めることができます。

SIT COBOLはライセンスなしでも利用することができますので、ぜひ使ってみてください。命令の実行が50ステップまで(Ver11 1.5.0以降は100ステップまで）の制限となっていますが、文法や機能確認を行うのであれば十分だと思います。（データ部や手続き部は無制限に記述することができます）

また、35,000円(税込38,500円) ~~7500円(税込8250円)~~ でライセンスを購入すると、COBOLのフル機能を利用することができます。~~ファイル入出力機能 、SQL機能などは、まだ実装されていませんが、年内にはリリース予定です。~~

### 参考

- Smart Interpreter Training COBOLの入手・最新情報はこちらから
[Smart Interpreter Training COBOLのホームページ](https://sit-cobol.sit11.com/)
- Smart Interpreter Training COBOLの機能説明動画はこちらです
[【動画】ちょっと凄いかも!? COBOL学習用ソフトウェアStamrt Interpreter Training COBOL](https://youtu.be/l-lfRYp6kqQ)
- opensource COBOLベースの開発環境を構築するコースもあります。無料公開しています。
[【Udemy】C/Javaプログラマー向け COBOL入門 ～開発環境構築編～](https://www.udemy.com/course/cobol-develop/)
- Smart Interpreter Training COBOLベースで、COBOLの基本的な概念や文法などが学習できる講座です。
 [【Udemy】C/Javaプログラマー向け COBOL入門 ～基本編～](https://www.udemy.com/course/cobol-basic/)