- 技術 💻
メインフレームとは?オープン系・クラウドとの違いをCOBOLで実演
結論
メインフレームとは、銀行の勘定系・保険・官公庁などの基幹業務で、大量の取引とバッチ処理を止めずに正確にこなすために作られた大型コンピュータです。汎用機・ホストコンピュータとも呼ばれます。オープン系(UNIX・Linux・Windows のサーバー)やクラウドとは、作り方・お金のかけ方・得意な処理が違います。
この記事でわかること
- メインフレームの意味・歴史・今の使われ方と、オープン系・クラウドとの違いの比較表
- COBOL と JCL の実物(GnuCOBOL で10進計算・100万件のバッチ・ジョブの流れを動かした結果)
- 移行(モダナイゼーション)でつまずきやすい10進数・文字コード(EBCDIC)・並び順と、残すか移すかの判断表
この記事で実際に動かしたもの:Ubuntu の .deb を作業場所に展開した GnuCOBOL 3.1.2(COBOL のコンパイルと実行、10進計算、パック10進数、ソートと集計のバッチ、ファイル状態コードとエラー文)、JCL のステップを置き換えた自作のシェルスクリプト、Python の float・Decimal との比較、iconv と Python による EBCDIC(IBM037・IBM930・IBM939)の変換、.deb から展開したメインフレームのエミュレーター Hercules 3.13(OS なしでの起動)です。
メインフレームは、ニュースでは「撤退」「移行」と一緒に出てくることが多い言葉です。けれども、ATM の取引や給与・口座の締め処理のように、毎日決まった時間に大量のデータを1円もずらさずに処理する仕組みとして、今も多くの企業で動いています。最初に全体像を示します。
flowchart TB
U[端末・ATM・Web] --> O[オンライン処理<br>1件ずつ即時]
O --> DB[(基幹データ)]
J[JCL のジョブ] --> B[バッチ処理<br>夜間に一括]
B --> DB
B --> R[帳票・振込データ]
DB --- M[メインフレーム<br>OS・COBOL・DB]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| メインフレームとは | 基幹業務を止めずに大量に処理する大型コンピュータ。汎用機・ホストとも呼ぶ | メインフレームとは(ふだんの意味とITの意味) |
| メインフレームは今も使われているか | 使われている。IBM は2025年6月に新機種 z17 の提供を始めた | メインフレームの歴史と今の使われ方 |
| オープン系との違い | 1社が機械から OS まで一体で作るか、共通の規格の部品を組み合わせるか | メインフレームとオープン系・クラウドの違い |
| クラウドとの違い | 自社で持って長く使い込むか、借りて使った分だけ払うか | メインフレームとオープン系・クラウドの違い |
| COBOL とは・なぜ使われるか | 事務処理向けの言語。金額を10進数のまま正確に計算できる | COBOLの実物/10進計算の実測 |
| JCL とは | バッチのジョブを「どのプログラムを、どのデータで動かすか」書く言語 | JCLとは(ジョブとバッチを手元で再現) |
| パソコンで試せるか | COBOL は GnuCOBOL で試せる。メインフレームの OS は配布条件の確認が要る | COBOLの実物/エミュレーターHercules |
| 移行で何に気をつけるか | 10進数・文字コード(EBCDIC)・並び順・バッチの順番 | EBCDIC/移行の考え方 |
確認環境:Ubuntu 24.04.5 LTS(2 CPU・メモリ 8GB の共用マシン)の上で、Ubuntu の公式リポジトリから apt-get download で取得した gnucobol3・libcob4t64・libcob4-dev・libgmp-dev(3.1.2-5.1ubuntu1 ほか)を作業用フォルダーに展開し、システムには入れずに環境変数で cobc 3.1.2.0(C コンパイラは gcc 13.3.0)を動かしました。COBOL のプログラムはすべてこの記事のために書いたもので、HELLO・10進計算・パック10進数・SORT と集計の2ステップのバッチ・誤った書き方のコンパイルエラーと実行時エラーを確かめています。比較には Python 3.13.18 と Node.js 22.23.4、文字コードの変換には iconv(glibc 2.39)を使いました。エミュレーターは hercules 3.13-7 の .deb を展開し、OS を読み込まずに起動とコマンドの応答だけを確かめています。z/OS などメインフレームの OS は動かしていません。JCL の書き方と意味、System/360 と z17 の年は IBM の公式サイト、クラウドへの移行の方式は AWS の公式サイトで確かめました。図は mermaid-cli 11.16.0 で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「メインフレームとは?オープン系・クラウドとの違いをCOBOLで実演」
メインフレームとは(ふだんの意味とITの意味)
この節では、「メインフレーム」という言葉の成り立ちと、似た呼び名(汎用機・ホスト・大型機)との関係が分かります。
メインフレーム(mainframe)は、企業や官公庁の基幹業務を受け持つ大型のコンピュータです。 英語の main frame は「主となる枠・骨組み」という意味で、AWS の解説によると、この呼び名は1950年代の大型コンピュータの筐体(フレーム)に由来します。今のメインフレームは部屋いっぱいの機械ではなく、AWS の説明では冷蔵庫ほどの大きさのキャビネットです。
| 場面 | 言葉が指すもの | 例 |
|---|---|---|
| ふだんの英語 | 主となる枠・骨組み(main + frame) | 建物や機械の主な枠 |
| IT の一般的な意味 | 基幹業務を処理する大型コンピュータ | 銀行の勘定系、保険の契約管理、自治体の住民情報 |
| 汎用機・汎用コンピュータ | 日本でのほぼ同じ意味の呼び名 | 「汎用機の COBOL 案件」 |
| ホスト・ホストコンピュータ | 端末から使われる中心のコンピュータ、という見方の呼び名 | 「ホスト連携」「ホスト端末」 |
| オープン系と対で使う場合 | 1社が機械から OS まで一体で作る方式 | 「汎用機からオープン系へ移行」 |
注意したいのは、「ホスト」という言葉がネットワークの世界では「IP アドレスを持つ機器」全般を指すことです。会話の中で「ホスト」と出たら、メインフレームの話か、ネットワークの話かを確かめると取り違えが防げます。また、スーパーコンピュータは科学技術計算の速さを競う機械で、メインフレームは大量の事務処理を止めずに正確にこなす機械です。どちらも大型ですが、得意なことが違います。
メインフレームが受け持つ処理は、大きく2つに分かれます。
オンライン処理(1件ずつ即時)
ATM の引き出し、窓口の入金、カード決済の承認
1件の処理は短いが、同時にたくさん届く
応答の速さと、途中で止まらないことが大事
バッチ処理(まとめて一括)
夜間の利息計算、月末の請求、給与の振込データ作成
何百万件を決まった順番・決まった時間に処理する
ジョブの順番と、失敗したときのやり直しが大事
メインフレームの歴史と今の使われ方
この節では、メインフレームがどのように広まり、今どんな業務で使われているのかが分かります。
メインフレームの考え方を形づくったのは、1964年4月7日に IBM が発表した System/360 です。 IBM の公式の解説によると、それまでは新しいコンピュータを買うたびにプログラムを作り直す必要がありましたが、System/360 はソフトウェアを機械から切り離し、同じ系列のどの機械でも同じプログラムが動くようにしました。小さな構成から始めて、プログラムを書き直さずに大きな機械へ移れるという「互換性」は、今のメインフレームにも引き継がれている大きな特徴です。
- 11950年代:大型の筐体のコンピュータが登場メインフレームという呼び名の由来(AWS の解説)
- 21964年:IBM System/360 を発表系列の中でプログラムがそのまま動く互換性
- 31970〜80年代:銀行・保険・製造・官公庁の基幹業務へCOBOL のプログラムと夜間バッチが積み上がる
- 41990年代〜:クライアントサーバー・オープン系が広まる新しいシステムは UNIX・Windows・Linux で作ることが増える
- 52010年代〜:クラウドと移行(モダナイゼーション)残す・移す・つなぐの選択が各社の課題に
- 62025年:IBM z17 の提供開始2025年4月8日発表、6月18日に一般提供(IBM のニュースリリース)
IBM のニュースリリースによると、z17 は AI の推論を行う回路を載せた Telum II というプロセッサを使い、1日に4,500億回の推論ができるとしています。取引の不正検知のように「取引のその場で AI に判断させる」用途を想定したものです。AWS の解説でも、メインフレームの使いどころとして、ATM 取引の承認などの金融取引、大規模な統計分析、ERP との統合が挙げられています。
国内では、富士通・日立製作所・NEC などもメインフレームを提供してきました。メーカーによっては自社製品の販売や保守の終了時期を公表しているため、今使っている機種の予定は、各メーカーの公式の発表で確かめるのが確実です。
メインフレームの特徴(信頼性・処理量・互換性)
この節では、メインフレームが基幹業務に選ばれてきた理由を、4つの特徴に分けて理解できます。
メインフレームの強みは、速さそのものよりも「止まらない」「大量の入出力をさばく」「昔のプログラムがそのまま動く」「1台の中で全部を管理できる」ことにあります。
1止まらない(可用性)
部品を二重にし、動かしたまま交換できるように作られている。AWS の解説では、I/O カードが故障したときに別のカードが代わりを務める構成が紹介されている。
2大量の入出力
計算そのものより、ディスクとの読み書きを専用の仕組みに任せる。AWS の解説では、データ転送を受け持つ SAP という専用のプロセッサが挙げられている。
3互換性
何十年も前に書かれたプログラムを、新しい機械でもそのまま動かせることを重んじる。System/360 からの考え方。
4集中管理と仮想化
1台の中を区切って複数の OS を動かし、データとセキュリティを一か所で管理する。
一方で、専門の知識を持つ技術者が少なくなっていること、ハードウェアとソフトウェアの費用、新しい技術とつなぐときの手間は、どの解説でも課題として挙げられています。止まらないことの価値は、稼働率と停止時間で考えると分かりやすくなります。計算のしかたは関連記事「可用性設計と稼働率の計算|直列・並列の計算式と停止時間の早見表」で扱っています。
メインフレームとオープン系・クラウドの違い
この節では、メインフレームとオープン系、メインフレームとクラウドの違いを、比べる観点ごとに表で確かめられます。
メインフレームは「1社が機械・OS・ミドルウェアまで一体で作り、長く使い込む」方式、オープン系は「共通の規格の部品を組み合わせる」方式、クラウドは「その部品を借りて、使った分だけ払う」方式です。 どれが優れているかではなく、何を大事にするかで向き不向きが分かれます。
オープン系との違い
| 観点 | メインフレーム | オープン系 |
|---|---|---|
| 作り方 | 機械・OS・ミドルウェアを1社が一体で提供 | 共通の規格の機械・OS・ソフトを組み合わせる |
| OS の例 | z/OS など各社独自の OS | Linux・Windows Server・UNIX |
| 主な言語 | COBOL・PL/I・アセンブラ・JCL | Java・C#・Python・JavaScript など |
| 文字コード | EBCDIC 系(日本語は IBM930・IBM939 など) | ASCII 系(UTF-8・Shift_JIS) |
| 得意な処理 | 大量の取引とバッチを止めずに処理 | 画面・Web・多様な連携を速く作る |
| 技術者の集めやすさ | 経験者が限られる | 多い |
| 他社製品への乗り換え | 同じメーカーの系列の中で続けることが多い | 部品ごとに選び直しやすい |
クラウドとの違い
| 観点 | メインフレーム | クラウド(IaaS・PaaS) |
|---|---|---|
| 持ち方 | 自社やデータセンターに機械を置く | 事業者の設備を借りる |
| お金のかけ方 | 導入時にまとまった費用、その後は保守費 | 使った分だけの従量課金が中心 |
| 増やし方 | 機械の能力を上げる(縦に伸ばす) | 台数を増やす(横に伸ばす) |
| 止まらない作り | 1台の中で部品を二重にする | 複数の台・複数の拠点に分けて冗長にする |
| 使い始めの速さ | 機械の手配から始まる | 画面や API からすぐに作れる |
クラウドの事業者は、メインフレームのアプリケーションをクラウドに移すためのサービスも提供しています。AWS は AWS Mainframe Modernization(移したアプリケーションを動かす実行環境)と、AI を使って移行を進める AWS Transform for mainframe を案内しています。移行の方式は後の節で整理します。
よくある思い込み
費用は「移した後の運用費」だけでなく「移すための費用と期間」も合わせて比べる
メインフレームの中で動くもの(OS・COBOL・JCL・DB)
この節では、メインフレームの上で動いているソフトウェアの層と、それぞれの言葉の意味が分かります。
メインフレームの上では、OS の上にオンライン処理を受け持つミドルウェア、データベース、バッチを動かす仕組みが乗り、業務のプログラムの多くは COBOL で書かれています。 IBM のメインフレームを例にすると、主な構成要素は次のとおりです。
OS
IBM の z/OS が代表例。Linux を動かす構成もある。
オープン系の Linux・Windows に当たる
オンライン処理
CICS・IMS などのトランザクションモニター。端末からの1件ずつの処理を受け持つ。
Web の AP サーバーに当たる
データ
Db2 などのデータベースと、固定長レコードのファイル(データセット)。
RDB とファイルに当たる
バッチ
JCL で書いたジョブを JES が受け付けて順に動かす。
シェルスクリプトと cron に当たる
このうち、手元のパソコンで本物と同じ書き方を試せるのは COBOL です。z/OS・CICS・Db2 は IBM の有償のライセンス製品で、この記事では動かしていません。次の節から、COBOL を GnuCOBOL で動かした実物を示します。
COBOLの実物(GnuCOBOLをLinuxで動かす)
この節では、メインフレームで使われる COBOL のプログラムが、どんな見た目で、どうコンパイルされて動くのかが分かります。
GnuCOBOL は、COBOL のプログラムを C 言語に変換し、gcc でコンパイルして実行ファイルを作る自由ソフトウェアのコンパイラです。 公式サイトの最新の安定版は 3.2(2023年7月28日公開)ですが、ここでは Ubuntu 24.04 の公式リポジトリにある 3.1.2 を使いました。ほかの作業に影響しないよう、apt install ではなく .deb を作業用のフォルダーに展開しています。
.deb を取得して展開する
apt-get download gnucobol3 libcob4t64 libcob4-dev libgmp-dev を実行し、dpkg-deb -x で作業用フォルダーに展開。合計 1.7MB ほど。
環境変数で場所を教える
PATH・LD_LIBRARY_PATH と、cobc 用の COB_CONFIG_DIR・COB_CFLAGS・COB_LIBS を展開先に向ける。一時ファイルも TMPDIR で作業場所へ。
HELLO をコンパイルして動かす
cobc -x HELLO.cbl で実行ファイルができ、./HELLO で文字が出る。
R=/dev/shm/t218/root
export PATH=$R/usr/bin:/usr/bin:/bin
export LD_LIBRARY_PATH=$R/usr/lib/x86_64-linux-gnu
export COB_CONFIG_DIR=$R/etc/gnucobol
export COB_COPY_DIR=$R/usr/share/gnucobol/copy
export COB_CFLAGS="-I$R/usr/include -I$R/usr/include/x86_64-linux-gnu -pipe"
export COB_LIBS="-L$R/usr/lib/x86_64-linux-gnu -lcob -lm"
export TMPDIR=/dev/shm/t218/tmp
COBOL のプログラムは、見出し(DIVISION)で4つの部に分かれ、英語の文のようにピリオドで区切って書きます。いちばん小さなプログラムは次のとおりです。行の先頭の7桁は空けて、8桁目から書く「固定形式」です。
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
DISPLAY "HELLO, MAINFRAME WORLD".
STOP RUN.
$ cobc -x HELLO.cbl && ./HELLO
HELLO, MAINFRAME WORLD
$ echo $?
0
cobc -x -v を付けると、COBOL から C への変換と gcc の呼び出しが順に表示されます。cobc -C で C のソースだけを出すと、5行の HELLO.cbl から 188行の HELLO.c と2つのヘッダー(合わせて242行)が生成されました。
preprocessing: HELLO.cbl -> /dev/shm/t218/tmp/cob6724_0.cob
parsing: /dev/shm/t218/tmp/cob6724_0.cob (HELLO.cbl)
translating: /dev/shm/t218/tmp/cob6724_0.cob -> /dev/shm/t218/tmp/cob6724_0.c (HELLO.cbl)
executing: gcc -c ... -o "/dev/shm/t218/tmp/cob6724_0.o" "/dev/shm/t218/tmp/cob6724_0.c"
executing: gcc -Wl,--export-dynamic -o "HELLO" "/dev/shm/t218/tmp/cob6724_0.o" ... -lcob -lm
COBOL の4つの部の役割を表にしました。
| 部(DIVISION) | 書くこと | オープン系の言語で言うと |
|---|---|---|
| IDENTIFICATION | プログラムの名前(PROGRAM-ID) | クラス名・ファイル名 |
| ENVIRONMENT | 使うファイルと、外の名前との結び付け(SELECT … ASSIGN) | 設定ファイル・ファイルパス |
| DATA | レコードの形と変数(PIC で桁数と型) | 構造体・型の宣言 |
| PROCEDURE | 処理の手順 | メソッド・関数の本体 |
COBOLが金額計算に使われる理由(10進計算の実測)
この節では、COBOL が銀行や保険の計算に使われてきた理由を、float との比較とパック10進数の中身で確かめられます。
COBOL は、数を10進数の桁のまま持って計算します。そのため 0.1+0.2 はぴったり 0.3 になり、金額の計算で端数がずれません。 Python や JavaScript の float(2進数の浮動小数点数)では、同じ計算が 0.3 になりません。
01 WS-A PIC 9V9 VALUE 0.1.
01 WS-B PIC 9V9 VALUE 0.2.
01 WS-SUM PIC 9V9.
01 WS-PRICE PIC 9(7)V99 COMP-3 VALUE 1234567.89.
01 WS-DISP PIC 9(7)V99 VALUE 1234567.89.
01 WS-SMALL PIC 9(3).
01 WS-OUT PIC Z,ZZZ,ZZ9.99.
PROCEDURE DIVISION.
ADD WS-A WS-B GIVING WS-SUM.
DISPLAY "0.1 + 0.2 = " WS-SUM.
...
COMPUTE WS-SMALL = 999 + 1
ON SIZE ERROR DISPLAY "SIZE ERROR: 999 + 1 DOES NOT FIT"
END-COMPUTE.
0.1 + 0.2 = 0.3
EQUAL TO 0.3: YES
COMP-3 BYTES = 5
DISPLAY BYTES = 9
EDITED = 1,234,567.89
SIZE ERROR: 999 + 1 DOES NOT FIT
$ python3 -c "print(0.1+0.2, 0.1+0.2==0.3)"
0.30000000000000004 False
$ node -e "console.log(0.1+0.2)"
0.30000000000000004
PIC 9(7)V99 は「整数7桁・小数2桁」という桁数の宣言で、V が小数点の位置です。桁があふれる計算は ON SIZE ERROR で捕まえられます。3桁の変数に 999+1 を入れようとすると、黙って 000 になるのではなく、エラーの処理に入りました。
パック10進数(COMP-3)の中身
メインフレームのデータでよく見る「パック10進数」は、1バイトに10進数の2桁を詰め、最後の半バイトに符号を入れる形式です。1234567.89 をファイルに書き出し、バイトを見ました。
$ od -An -tx1 PACK.DAT
12 34 56 78 9c 31 32 33 34 35 36 37 38 39 12 3d
| 項目 | 宣言 | バイト列 | 読み方 |
|---|---|---|---|
| パック10進数 | PIC S9(7)V99 COMP-3 |
12 34 56 78 9c |
数字 123456789 と符号 C(正)。5バイト |
| ゾーン10進数 | PIC 9(7)V99 |
31 32 … 39 |
1桁1バイトの文字。9バイト |
| 負のパック10進数 | PIC S9(3) COMP-3 に −123 |
12 3d |
符号 D(負)。2バイト |
ゾーン10進数が 0x31〜0x39 になっているのは、手元が ASCII の環境だからです。メインフレーム(EBCDIC)では同じ数字が 0xF1〜0xF9 になります。移行のときにファイルをそのまま文字コード変換すると、パック10進数のバイトまで「文字」として変換されて壊れるのは、この違いが原因です。
浮動小数点数で誤差が出るしくみは関連記事「浮動小数点数とは|仕組み・誤差・0.1+0.2の理由を4言語で実演」で、オープン系で同じ正確さを出す型の選び方は関連記事「金額計算の端数処理設計:消費税の丸め仕様とDECIMAL型の選び方」で扱っています。
JCLとは(ジョブとバッチを手元で再現)
この節では、JCL が何を書く言語なのかと、JCL のジョブの流れを Linux で置き換えて動かした結果が分かります。
JCL(Job Control Language)は、バッチのジョブに「どのプログラムを、どの順番で、どのデータを使って動かすか」を書く言語です。 IBM の z/OS の解説では、基本の文は3つです。JOB 文がジョブに名前を付け、EXEC 文が動かすプログラム(1つの EXEC が1つのジョブステップ)を指定し、DD 文がプログラムの中のファイル名(ddname)と実際のデータセットを結び付けます。
次の JCL は、取引ファイルを支店コードで並べ替え(STEP010)、その結果を支店ごとに集計する(STEP020)ジョブの書き方の例です。IBM の JCL リファレンスの書式に沿ってこの記事のために書いたもので、z/OS の上では動かしていません。
//DAILYJOB JOB (ACCT),'DAILY REPORT',CLASS=A,MSGCLASS=X
//STEP010 EXEC PGM=SORTSTP
//SORTIN DD DSN=PROD.TRAN.DAILY,DISP=SHR
//SORTOUT DD DSN=&&SORTED,DISP=(NEW,PASS),
// SPACE=(CYL,(10,5)),DCB=(RECFM=FB,LRECL=40)
//SORTWK1 DD UNIT=SYSDA,SPACE=(CYL,(10,5))
//STEP020 EXEC PGM=RPTSTP,COND=(4,LT,STEP010)
//TRANIN DD DSN=&&SORTED,DISP=(OLD,DELETE)
//RPTOUT DD SYSOUT=*
COND=(4,LT,STEP010) は「4 が STEP010 の戻りコードより小さい(戻りコードが5以上)なら、このステップを飛ばす」という意味です。IBM のリファレンスでは、COND の条件が満たされるとそのステップは実行されず飛ばされる(bypass)と説明されています。条件が「実行する条件」ではなく「飛ばす条件」である点は、初めて読む人がつまずきやすいところです。
同じジョブを Linux で動かす
GnuCOBOL は、プログラムの中の ASSIGN TO "SORTIN" という名前を、環境変数 DD_SORTIN に書いたファイルパスに結び付けます。これを使うと、JCL の DD 文の考え方をそのままシェルスクリプトで再現できます。
#!/bin/bash
# STEP010 SORT -> STEP020 REPORT(STEP010 の RC が 4 を超えたら STEP020 を飛ばす)
IN=${1:-TRAN10.DAT}
echo "STEP010 SORTSTP start"
DD_SORTIN=$IN DD_SORTOUT=SORTED.DAT ./SORTSTP; RC1=$?
echo "STEP010 RC=$RC1"
if [ $RC1 -gt 4 ]; then echo "STEP020 FLUSHED (STEP010 RC=$RC1)"; exit $RC1; fi
echo "STEP020 RPTSTP start"
DD_TRANIN=SORTED.DAT DD_RPTOUT=REPORT.TXT ./RPTSTP; RC2=$?
echo "STEP020 RC=$RC2"
exit $RC2
入力は、メインフレームのデータセットと同じ「1件40バイトの固定長レコード、改行なし」のファイルです。支店コード4桁・口座番号8桁・金額11桁(小数2桁)・入出金区分1桁・予備16桁という形で、Python で10件作りました。集計側(RPTSTP)の中心は、支店が変わったら小計を書き出す「コントロールブレイク」という、バッチの定番の書き方です。
FD TRAN-FILE.
01 TRAN-REC.
05 TR-BRANCH PIC X(4).
05 TR-ACCT PIC 9(8).
05 TR-AMOUNT PIC 9(9)V99.
05 TR-TYPE PIC X.
05 FILLER PIC X(16).
...
PROC-REC.
ADD 1 TO WS-COUNT.
IF TR-BRANCH NOT = WS-PREV AND WS-PREV NOT = SPACES
PERFORM PUT-BREAK
END-IF.
MOVE TR-BRANCH TO WS-PREV.
IF TR-TYPE = "D"
ADD TR-AMOUNT TO WS-BR-TOTAL WS-GRAND
ELSE
SUBTRACT TR-AMOUNT FROM WS-BR-TOTAL WS-GRAND
END-IF.
STEP010 SORTSTP start
STEP010 RC=0
STEP020 RPTSTP start
RECORDS READ=000000010
STEP020 RC=0
JOB RC=0
$ cat REPORT.TXT
FKO4 496,675.24
NGY3 995,292.24
OSK2 -462,424.48
SPR5 1,220,522.85
TKY1 898,217.29
ALL 3,148,283.14
同じファイルを Python の Decimal で集計した結果と、支店ごとの小計・総計がすべて一致しました。一方、Python の float で総計を足すと 3148283.140000001 となり、10件でも末尾に誤差が出ました。
100万件のバッチを実測
同じ形式の取引を100万件(40MB)作り、ソートと集計の時間を3回ずつ測りました。2 CPU のマシンをほかの作業と共用しているため、値は目安です。
| 処理 | 1回目 | 2回目 | 3回目 |
|---|---|---|---|
| STEP010 COBOL の SORT(100万件) | 2.08秒 | 1.52秒 | 1.68秒 |
| STEP020 COBOL の集計(100万件) | 0.95秒 | 1.03秒 | 0.78秒 |
| Python の Decimal で同じ集計 | 1.81秒 | 2.01秒 | 2.23秒 |
総計は COBOL も Python の Decimal も -851,102,318.61 で一致し、float だけが -851102318.6099919 とずれました。ここで測ったのはパソコン上の GnuCOBOL で、メインフレームの性能を表すものではありません。分かるのは「固定長レコードを順に読み、10進数で足し、キーが変わったら書き出す」というバッチの基本形が、COBOL では短いコードでそのまま書けるという点です。バッチの設計書に何を書くかは関連記事「バッチ設計書の書き方と項目一覧|リランと異常終了時の設計サンプル」で扱っています。
EBCDICとは(メインフレームの文字コードと並び順)
この節では、メインフレームの文字コード EBCDIC がオープン系の ASCII とどう違い、移行のときに何が起きるのかを実物で確かめられます。
メインフレームでは、ASCII ではなく EBCDIC(エビシディック)系の文字コードが使われます。同じ「A」でもバイトが違い、並べ替えの順番も変わります。 Python の cp037(英語圏の EBCDIC)で同じ文字列を変換しました。
ASCII 48 45 4c 4c 4f 20 31 32 33 ← "HELLO 123"
EBCDIC c8 c5 d3 d3 d6 40 f1 f2 f3
空白は ASCII の 0x20 に対して EBCDIC では 0x40、数字は 0x31 に対して 0xF1 です。並べ替えにも違いが出ます。同じ3つの文字列をバイトの順に並べると、結果が逆になりました。
ASCII の順 : ['1a', 'A1', 'a1'] (数字 → 大文字 → 小文字)
EBCDIC の順 : ['a1', 'A1', '1a'] (小文字 → 大文字 → 数字)
メインフレームの SORT で作った帳票と、オープン系に移したプログラムの帳票とで、行の順番が変わることがあるのはこのためです。並び順を業務の決まりとして使っている場合は、移行の検証項目に入れておく必要があります。
日本語の EBCDIC(IBM930・IBM939)
日本語は、iconv の IBM930(カタカナ優先)と IBM939(英小文字優先)で変換しました。漢字の前後にシフトコード(0x0E と 0x0F)が入るのが特徴です。
| 文字列 | UTF-8 | IBM930 | IBM939 |
|---|---|---|---|
| カナ漢字 | ef bd b6 ef be 85 e6 bc a2 e5 ad 97 |
86 96 0e 4f 58 48 f2 0f |
66 8c 0e 4f 58 48 f2 0f |
| abc | 61 62 63 |
62 63 64 |
81 82 83 |
| ① | e2 91 a0 |
変換できない(下のエラー) | ― |
$ printf '①' | iconv -f UTF-8 -t IBM930
iconv: illegal input sequence at position 0
同じ「abc」でも IBM930 と IBM939 でバイトが違います。どちらの文字コードで作られたデータなのかを取り違えると、英小文字や半角カナが別の文字に化けます。また、丸数字のように変換先に無い文字は、iconv では変換そのものが止まりました。移行の前に、使われている文字の一覧と、変換できない文字の扱い(外字の対応表)を決めておくのが一般的です。オープン系どうしの文字コード変換と違い、メインフレームのデータでは、パック10進数を含むレコードを「項目ごとに」変換する点が大きく違います。
メインフレームのエミュレーター(Hercules)を動かしてみた
この節では、メインフレームの機械をパソコンの上で再現するエミュレーターで何ができて、何ができないのかが分かります。
Hercules は、IBM の System/370・ESA/390・z/Architecture の機械をソフトウェアで再現するエミュレーターです。 Ubuntu の公式リポジトリにある hercules 3.13-7 を .deb から展開して起動しました。パッケージの copyright ファイルでは、Q Public License 1.0 で配布されていることが書かれています。
Hercules Version 3.13
(c)Copyright 1999-2015 by Roger Bowler, Jan Jaeger, and others
Build information:
Debian
Modes: S/370 ESA/390 z/Arch
Max CPU Engines: 8
...
HHCCP003I CPU0000 architecture mode z/Arch
HHCPN008I Script file processing started using file "/dev/shm/t218/herc/hercules.rc"
devlist
0:0009 3215 *syscons cmdpref(/)
ipl 0a80
HHCCP027E Device 0A80 not in configuration
...
HHCIN099I Hercules terminated
設定ファイルでは CPU 1つ・主記憶 64MB・コンソール1台だけを定義しました。devlist で装置の一覧を出すとコンソールだけが表示され、ipl 0a80(0A80 番の装置から OS を読み込む)は「その装置は構成に無い」というエラーになりました。エミュレーターが再現するのは機械だけで、動かすには OS の入ったディスクのイメージが別に要ります。
z/OS は IBM の有償のライセンス製品で、エミュレーターの上で使ってよいかどうかもライセンスの条件しだいです。インターネット上には、過去の OS を収めた配布物もありますが、この記事では配布条件を確かめられなかったため使っていません。メインフレームの OS を学ぶ場合は、メーカーが提供する学習用の環境や、契約にもとづく開発用の環境を使うのが確実です。
メインフレームの移行(モダナイゼーション)の考え方
この節では、メインフレームのシステムを移すときの方式の違いと、どの順番で考えるとよいかが分かります。
移行の方式は、「プログラムをどこまで書き換えるか」で分かれます。 AWS の解説では、COBOL を Java のマイクロサービスなどに書き換えるリファクタリングと、コードの変更を抑えてクラウドの実行環境に載せるリプラットフォームが紹介されています。一般には、次の5つで整理されることが多い考え方です(呼び名は会社や資料で少しずつ違います)。
| 方式 | 何をするか | 向いている場面 | 主な手間 |
|---|---|---|---|
| そのまま使う(リテイン) | メインフレームを使い続け、API などでつなぐ | 止められない処理、改修が少ない業務 | 技術者の確保・保守費 |
| リホスト | COBOL をほぼそのまま、オープン系の COBOL 実行環境へ | 早く機械から離れたい | 文字コード・JCL の置き換え |
| リプラットフォーム | 少し手を入れてクラウドの実行環境へ | 運用をクラウドにまとめたい | ミドルウェアの差の吸収 |
| リファクタリング(変換) | COBOL を Java などへ変換・書き換え | 今後も機能を大きく足していく | 同じ結果になるかの検証 |
| 作り直し(リビルド) | 業務を見直して新しく作る | 業務そのものを変えたい | 期間と費用、業務の知識の掘り起こし |
どの方式でも、いちばん時間がかかるのは「移した後も同じ結果が出るか」の確かめです。この記事で見た3つの違い、つまり10進数の計算、EBCDIC の文字と並び順、ジョブの順番と戻りコードは、どれも見落とすと結果が変わります。AWS も、移行の前後で結果を比べるテストを自動化するツールを移行の要素として挙げています。
移行の進め方
今回の集計でも、Decimal との突き合わせで一致を確かめてから float のずれを見つけた
生成 AI を使って COBOL の読み解きやテストの準備を進める方法は、関連記事「生成AIでレガシー移行|工程別プロンプトと検証チェック表」で扱っています。この記事は、その前提になる「メインフレームとは何か」に絞っています。
よくあるエラー・つまずき(COBOLとJCL)
この節では、COBOL を初めて書いたときや、メインフレームのデータを扱うときに出やすいエラーと、その原因が分かります。
手元で実際に出したエラーの原文です。
$ cobc -x BADCOL.cbl ← 1桁目から書いた
BADCOL.cbl:1: error: invalid indicator 'F' at column 7
BADCOL.cbl:2: error: invalid indicator 'M' at column 7
...
BADCOL.cbl:6: error: PROGRAM-ID header missing
$ cobc -x BADVAR.cbl ← 変数名の打ち間違い
BADVAR.cbl:7: error: 'WS-NN' is not defined
$ DD_TRANIN=NOFILE.DAT DD_RPTOUT=x.txt ./RPTSTP ← 入力ファイルが無い
OPEN ERROR TRANIN FILE STATUS=35
$ echo $?
12
$ cobc -x -debug -o BADDATA_D BADDATA.cbl && ./BADDATA_D ← 数字の項目に文字
libcob: BADDATA.cbl:9: error: 'WS-N' (Type: NUMERIC DISPLAY) not numeric: 'A1B'
Last statement of BADDATA was at line 9 of BADDATA.cbl
| 症状・エラー | 原因 | 直し方 |
|---|---|---|
invalid indicator 'F' at column 7 |
固定形式なのに1桁目から書いた。7桁目は注記などの印の桁 | 8桁目から書く。自由形式なら cobc -free |
'WS-NN' is not defined |
DATA DIVISION に無い名前を使った | 宣言と綴りを合わせる |
FILE STATUS=35 |
OPEN INPUT したファイルが無い | DD 文(ここでは DD_ の環境変数)のパスを確かめる |
not numeric: 'A1B'(-debug 時) |
数字の項目に文字が入っていた | 入力のチェックを足す。IF WS-X IS NUMERIC |
エラーは出ないが RESULT=1729 と変な値 |
同じ誤りを -debug なしで実行した | 開発中は -debug でチェックを有効にする |
| 次のステップが動かない | COND の条件が真になり、ステップが飛ばされた | COND は「飛ばす条件」と読む |
| 漢字や小文字が化ける | IBM930 と IBM939 の取り違え、パック10進数ごと変換 | コードページを確かめ、項目ごとに変換する |
とくに注意したいのは、数字の項目に文字が入っていた例です。-debug を付けずにコンパイルすると、エラーにならず RESULT=1729 という意味の無い値が出力されました。コンパイルの設定ひとつで「止まる」か「黙って進む」かが変わるため、移した先の環境で黙って処理が進むと、誤りに気づけません。移行の検証では、不正なデータを入れたときの動きも元の環境と比べておくと安心です。
- 1固定形式か自由形式かを決めるメインフレームの資産は固定形式。8桁目から72桁目までが本文
- 2FILE STATUS を必ず受け取る00 以外なら RETURN-CODE を立てて、次のステップに伝える
- 3開発中は -debug でコンパイルする数字の項目の不正なデータを実行時に止められる
- 4文字コードを項目ごとに確かめる文字の項目と、パック10進数の項目を分けて扱う
メインフレームを残すか移すかの判断表
この節では、メインフレームのシステムを残すか、オープン系・クラウドへ移すかを考えるときの目安が分かります。
判断の軸は「止められるか」「どれだけ変え続けるか」「人を確保できるか」「移す費用と期間に見合うか」の4つです。 次の表は、手元で確かめた違いと公式の情報をもとにした目安です。
| 状況 | 目安 | 理由 |
|---|---|---|
| 大量の取引を止めずに処理し、仕様の変更が少ない | 残して、API で外とつなぐ | 安定して動いているものを変える危険のほうが大きい |
| 機能を毎月のように足したい | オープン系・クラウドへ段階的に移す | 技術者が多く、開発の道具がそろっている |
| 機種の保守の終了時期が決まっている | 時期から逆算して方式を選ぶ | 変換や作り直しは検証に年単位かかることがある |
| COBOL を読める人が社内に少ない | まず資産の棚卸しと、入出力の保存 | どの方式でも、今の動きを知ることが出発点 |
| 金額の計算が多い | 移す先でも10進数の型を使う | float では10件でも誤差が出た |
| 帳票の行の順番が業務の決まりになっている | 並び順を検証項目に入れる | EBCDIC と ASCII で順番が逆になった |
| COBOL を学びたい・試したい | GnuCOBOL で書いて動かす | .deb の展開だけで、数分で動いた |
よくある質問
Q. メインフレームと汎用機は同じですか? A. ほぼ同じ意味で使われます。日本では「汎用機」「汎用コンピュータ」という呼び名が広く使われ、「ホスト」「ホストコンピュータ」と呼ぶ会社もあります。
Q. メインフレームとサーバーの違いは何ですか? A. メインフレームもサーバーの一種と言えますが、ふつう「サーバー」と言うときは、共通の規格の部品で作られ Linux や Windows Server が動く、オープン系の機械を指します。メインフレームは1社が機械から OS まで一体で作り、1台で大量の処理を止めずにこなすことを重んじます。
Q. メインフレームは今も使われていますか? A. 使われています。IBM は2025年6月18日に新機種 z17 の一般提供を始めました。銀行の勘定系や保険、官公庁などの基幹業務で動き続けています。
Q. メインフレームとスーパーコンピュータの違いは何ですか? A. スーパーコンピュータは気象や物理のシミュレーションなどの計算の速さを重んじる機械で、メインフレームは大量の事務処理を正確に止めずにこなすことを重んじる機械です。
Q. COBOL はパソコンで動かせますか? A. 動かせます。この記事では Ubuntu の GnuCOBOL を .deb から展開して、コンパイルとバッチの実行まで確かめました。Windows や Mac で使う場合の入手方法は、GnuCOBOL の公式サイトから確かめるのが確実です。
Q. JCL とシェルスクリプトは同じですか? A. 役割は近いですが同じではありません。JCL は、ステップごとに動かすプログラムと、プログラムの中のファイル名(ddname)に結び付けるデータセットを書くことが中心です。この記事では、GnuCOBOL の DD_ の環境変数を使って、JCL の流れをシェルスクリプトで再現しました。
Q. z/OS をパソコンで動かせますか? A. Hercules のようなエミュレーターで機械は再現できますが、z/OS は IBM の有償のライセンス製品で、使ってよいかはライセンスの条件しだいです。この記事では OS なしの起動だけを確かめました。
Q. オープン系とは何ですか? A. 公開された共通の規格にもとづく機械・OS・ソフトウェアを組み合わせて作るシステムのことです。UNIX・Linux・Windows Server の上で、Java や C# などで作るシステムが代表例です。
Q. メインフレームをクラウドに移すとどうなりますか? A. 機械を持つ必要がなくなり、使った分だけ払う形に近づきます。一方で、10進数の計算、EBCDIC の文字と並び順、ジョブの順番を移した先で同じ結果にする作業と、その検証に時間がかかります。
Q. パック10進数とは何ですか?
A. 1バイトに10進数の2桁を詰め、最後の半バイトに符号を入れる数の持ち方です。手元では 1234567.89 が 12 34 56 78 9c の5バイトになりました。文字として変換すると壊れるので、移行のときは項目ごとに扱います。
まとめ
- メインフレームは、基幹業務の大量の取引とバッチを止めずに正確に処理する大型コンピュータ。汎用機・ホストとも呼ばれ、2025年にも IBM の新機種 z17 が出ている。
- オープン系は共通の規格の部品の組み合わせ、クラウドはそれを借りて使った分だけ払う方式。メインフレームは1社が一体で作り、互換性と可用性を重んじる。
- COBOL は数を10進数のまま計算する。GnuCOBOL では 0.1+0.2 がぴったり 0.3 になり、100万件の集計でも Decimal と総計が一致した。float はずれた。
- JCL は「どのプログラムを、どのデータで、どの順番で」動かすかを書く言語。COND は飛ばす条件。GnuCOBOL の DD_ の環境変数で、ジョブの流れを Linux で再現できた。
- 移行では、10進数・EBCDIC の文字と並び順・ジョブの順番が結果を変える。本番の入出力を先に保存し、移した後に突き合わせるのが出発点。
次に読むとよい記事です。金額を正確に扱う型の選び方は関連記事「金額計算の端数処理設計:消費税の丸め仕様とDECIMAL型の選び方」で、バッチを設計書に落とす方法は関連記事「バッチ設計書の書き方と項目一覧|リランと異常終了時の設計サンプル」で扱っています。
参考・出典
確認日はいずれも 2026年10月29日です。
- IBM「IBM System/360」:https://www.ibm.com/history/system-360
- IBM Newsroom「IBM z17: The First Mainframe Fully Engineered for the AI Age」(2025年4月8日):https://newsroom.ibm.com/z17
- IBM Documentation「z/OS concepts: What is JCL?」:https://www.ibm.com/docs/zosbasics/com.ibm.zos.zconcepts/zconc_whatisjcl.htm
- IBM Documentation「z/OS MVS JCL Reference: COND parameter」:https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieab600/xexcond.htm
- AWS「メインフレームとは何ですか?」:https://aws.amazon.com/jp/what-is/mainframe/
- GnuCOBOL 公式サイト:https://gnucobol.sourceforge.io/
- Ubuntu Packages「gnucobol3」(noble):https://packages.ubuntu.com/noble/gnucobol3
- Ubuntu Packages「hercules」(noble):https://packages.ubuntu.com/noble/hercules
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「メインフレームとは?オープン系・クラウドとの違いをCOBOLで実演」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。