3-1ミドルウェアの役割
土曜の午前11時、こむぎ堂の棚に焼きたてのクロワッサンが並びます。それを目当てに、常連のお客さんが毎週、開店前から店の前で待っています。「焼き上がったら、スマートフォンに知らせてもらえると助かるんだけどな」。レジでそう頼まれたミナトは、予約サイトに通知の機能を足すと約束しました。その夜、十数行のプログラムを書き上げて動かそうとしても、画面には何も起きません。相棒の返事は短いものでした。「書いたままの文は、コンピュータには通じないよ。翻訳して、使う部品とつなげないと」。予約サイトの中では、ミナトの書いたもの以外にも多くのソフトウェアが動いていて、それらとどう組み合わさるのかも、まだ分かっていません。
こむぎ堂の予約サイトは、去年、業者に作ってもらったものです。借りているサーバの上でOSが動き、その上で予約サイトのプログラムが動いています。けれども、予約サイトのプログラムがOSに直接「ディスクのこの場所に書いて」と頼んでいるわけではありません。あいだに、もう一つの層があります。
予約したお客さんの名前、受け取りの日時、品名は、表の形にして保存してあります。この保存を受け持つのがDBMS(データベース管理システム)です。DBMSは、データベースの作成、データの格納・検索・更新をまとめて引き受け、二人が同時に同じ予約を書き換えても中身が食い違わないように整合性を保ちます。予約サイトのプログラムは「土曜11時に受け取る予約を出して」と頼むだけで、データがディスクのどこにどう書かれているかを知らずに済みます。
OSはどんなアプリにも通じる基本の仕事しかしません。かといって、データの保存や検索のように多くのアプリが同じように必要とする仕事を、アプリごとに一から作るのは無駄です。DBMSは、この二つのあいだを埋める位置にあります。
ここから基本情報!OSとアプリのあいだの層
OSとアプリケーションソフトウェアの中間に位置し、多くのアプリに共通する機能を提供するソフトウェアをミドルウェアといいます。DBMSはその代表です。アプリはミドルウェアの機能を呼び出すことで、自分の仕事に集中できます。
クリスマスケーキの予約の締め切り日には、店頭の端末と、お客さんのスマートフォンからの申し込みが一度に押し寄せます。注文を一件受けるたびに、在庫を減らし、予約を登録し、代金を記録する、という一続きの処理(トランザクション)が実行されます。多数の端末やアプリから届くトランザクションを一元的に受け付け、同時に動かす数や順番を制御し、途中で失敗したものは全体を取り消して矛盾を残さないようにするミドルウェアがTPモニター(Transaction Processing Monitor)です。銀行や交通機関の予約のように、大量の処理を止めずにさばくオンラインシステムで使われます。
オンラインシステムでは、端末とホストコンピュータの間で通信をつなぎ、メッセージを送ったり受け取ったりする仕事も要ります。この通信の制御とメッセージの送受信を管理するソフトウェアを通信管理システムといいます。
こむぎ堂には、予約サイトのほかに会計ソフトと通販の在庫表もあります。予約が入るたびに、その内容を会計ソフトに手で打ち直すのは手間がかかり、打ち間違いも起きます。別々に作られたアプリどうしの間で、データの形式をそろえながらデータやメッセージを受け渡し、連携させるソフトウェアをアプリケーションプログラム間連携ソフトウェア(応用プログラム間連携ソフトウェア)といいます。企業の業務システムどうしをつなぐEAI(Enterprise Application Integration)の製品がこれに当たります。
シラバスは、ミドルウェアの例として、設計・プログラミング・テストなど開発の各工程の作業を助ける道具の総称であるソフトウェア開発支援ツールと、システムの稼働の監視、決まった時刻の処理の実行、障害が起きたときの通知など、運用の仕事を支える運用管理ツールも挙げています。予約サイトが夜中に止まったら店長のスマートフォンにメールを送る、という見張り役は、運用管理ツールの仕事です。開発支援の道具の中身は、3-6で一つずつ見ます。
基本情報の範囲ここまで
アプリがOSやDBMSに仕事を頼むときは、決められた窓口を通します。どんな名前の命令に、どんな値を渡せば、何が返ってくるかを取り決めた呼び出し口をAPI(Application Programming Interface)といいます。ミナトの通知も、スマートフォンへの通知を配信する外部のサービスが公開しているAPIを呼び出して送る形にします。通知の仕組みそのものを、こむぎ堂が作る必要はありません。
3-2シェル
通知のプログラムを置くために、ミナトは借りているサーバに接続しました。開いたのは、黒い背景に文字だけが並ぶ画面です。ls と打つとファイルの一覧が、cat reserve.log と打つと予約の記録が表示されます。アイコンもボタンもない画面で、打ち込んだ文字を何かが読み取って動いています。
OSの中心部分は、キーボードから打ち込まれた文字を直接受け取るわけではありません。あいだに立って、打ち込まれた命令(コマンド)を読み取り、その意味を解釈して、プログラムを起動したりOSの機能を呼び出したりするプログラムがいます。これをシェルと呼びます。シェルは英語で「殻」のことで、OSの中心部分を外側から包み、利用者との受け答えを受け持つことからこの名前があります。Windowsのコマンドプロンプトや PowerShell、Linuxでよく使われる bash は、どれもシェルです。
ここから基本情報!コマンドを解釈する係
利用者が入力したコマンドを解釈し、OSの機能を呼び出して実行する対話的なソフトウェアをコマンドインタプリタといいます。シェルの役割をそのまま言い表した呼び方で、基本情報のシラバスはシェルの用語例としてこの語を挙げています。
シェルは、打ち込まれた文字をそのままプログラムに渡すとは限らず、実行の前に書き換えることがあります。その一つが、波かっこの中にカンマで区切って並べた文字列を、それぞれ別の引数に展開するブレース展開です。bash で cp reserve.csv{,.bak} と打つと、シェルはこれを cp reserve.csv reserve.csv.bak に展開してからコピーのプログラムを起動します。予約の表の控えを取るのに、同じファイル名を2回打たずに済みます。
基本情報の範囲ここまで
予約サイトの手入れでは、毎朝、同じコマンドを決まった順に打つことになりました。予約の表の控えを取る、古い記録を消す、通知の送り先の一覧を作り直す。毎回打っていると、順番を間違えたり1つ飛ばしたりします。そこで、実行させたいコマンドを並べて1つのファイルに書いておき、そのファイルを指定するだけでまとめて実行させます。このファイルをバッチファイルといいます。Windowsでは拡張子 .bat のファイルがこれに当たり、Linuxなどではシェルスクリプトと呼ばれる同じ働きのファイルを使います。
3-3ライブラリ
通知を送る部分を一から書こうとして、ミナトは2時間で手が止まりました。送り先の端末を確かめる、通信が切れたら送り直す、文字化けを防ぐ。考えることが次々に出てきます。相棒が書き込みました。「通知を送る処理は、世界中の人が何度も書いてきたものだよ。誰かがまとめた部品を借りよう」。
よく使う処理を、ほかのプログラムから呼び出せる形にまとめて保管しておいたものをライブラリといいます。日付の計算、通知の送信、画像の縮小のように、どのアプリでも同じように要る処理は、ライブラリから借りれば自分で書かずに済みます。多くの人が使ってきたライブラリは、一人で急いで書いたプログラムより誤りが見つかって直されている場合が多く、その点でも助かります。
ここから基本情報!ライブラリの種類と、部品をつなぐ時期
基本情報のシラバスでいうライブラリは、プログラムやマクロを格納しておく保管場所全体を指します。プログラムは、人が書いた文のままの段階、機械語に翻訳した段階、実行できる形に結合した段階を経て動き出します(翻訳と結合の中身は3-8と3-9で見ます)。ライブラリは、どの段階のものを収めるかで分かれます。
| ライブラリ | 収めるもの | 使われる場面 |
|---|---|---|
| ソースライブラリ | 人が書いたままのプログラム(原始プログラム) | 書き直す、読み返す |
| オブジェクトライブラリ | コンパイル済みの機械語の部品(目的モジュール) | 結合するときに取り出して組み込む |
| ロードライブラリ | 結合を終えて、そのまま実行できる形のプログラム(ロードモジュール) | 実行するときに読み込む |
汎用に使えるように作っておき、ライブラリに登録して、ほかのプログラムから呼び出せるようにした一つ一つの部品をライブラリモジュールといいます。オブジェクト指向の言語では、データとその操作をひとまとめにした「クラス」が部品の単位になります。再利用できるクラスを集めたものがクラスライブラリで、Javaに標準で付いている日付や文字列を扱うクラスの集まりは、その身近な例です。
借りた部品を自分のプログラムにつなぐ時期は、二通りあります。一つは、プログラムを結合する段階で、ライブラリから必要な部品の写しを取り出して実行ファイルの中に組み込んでしまう静的リンキングです。でき上がった実行ファイルはそれだけで動きますが、ファイルは大きくなり、部品に直しが入ったら実行ファイルを作り直さなければなりません。
もう一つは、部品を実行ファイルに入れずに別のファイルとして置いておき、プログラムを実行するときに読み込んでつなぐ方法です。Windowsでこの方式に使うライブラリファイルをDLL(Dynamic Link Library)といい、拡張子は .dll です。DLLは複数のプログラムで共有でき、部品のファイルを差し替えるだけで、それを使うすべてのプログラムに直しが行き渡ります。代わりに、実行するコンピュータにそのDLLが無かったり版が違ったりすると、プログラムが起動できなかったり、正しく動かなかったりします。
基本情報の範囲ここまで
3-4コンポーネントウェア
通知の話を聞いた店長が、もう一つ注文を出しました。「予約の画面で、受け取りの日をカレンダーから選べるようにできないかな」。ミナトが探すと、日付を選ぶ画面の部品が出来合いで公開されていました。中のプログラムは一行も読まずに、決められた設定を書いて予約画面に置くと、その日のうちにカレンダーが表示されました。
ライブラリから借りるのは、日付の計算のような処理の単位でした。カレンダーの部品は、それより大きく、表示も操作も含めた機能のひとかたまりです。中身を知らなくても、決められたつなぎ方さえ守れば組み込め、もっとよい部品が出てきたら取り替えられます。ソフトウェアを、家電の部品のように組み合わせて作る考え方です。
ここから基本情報!部品を組み合わせて作る技術
再利用を目的として、独立した機能の単位にまとめたソフトウェアの部品をコンポーネントといいます。コンポーネントは、外から使うための決まった接点(インタフェース)だけを見せ、中の作りを隠しています。オブジェクト指向の技術をもとに、コンポーネントを組み合わせてソフトウェアを作る開発手法をコンポーネントウェアと呼びます。
部品を組み合わせるには、部品の作り方や呼び出し方の取り決めが要ります。そのための代表的な技術が次の四つです。
| 技術 | 中身 | 特徴 |
|---|---|---|
| JavaBeans | Javaで再利用できる部品を作るための規約 | 引数のないコンストラクタを持つ、値の読み書きを get〜・set〜 という名前のメソッドで行う、などの決まりに従って作る |
| CORBA | 標準化団体OMGが定めた、分散オブジェクトの標準 | 別の言語で書かれ、別のコンピュータで動くオブジェクトどうしを、ネットワーク越しに呼び出し合える |
| OSGi | Javaのプログラムを、バンドルと呼ぶモジュールの単位で管理する仕様 | アプリを止めずに、バンドルを追加・更新・削除できる |
| ActiveX | マイクロソフトが開発したコンポーネントの技術 | Internet Explorer の中で、Windowsの機械語の部品を動かせた。安全上の問題が多く、Internet Explorer のサポートが2022年に終わり、いまのWebではほとんど使われない |
部品よりさらに大きな単位で借りるものもあります。予約サイトのように「画面から入力を受け取り、データベースを読み書きし、結果の画面を返す」アプリには、決まった骨組みがあります。この標準的な骨組みを、クラスやライブラリの集まりとして用意したものを開発フレームワークといいます。開発者は、骨組みの決められた場所に自分の処理を書き足していきます。
基本情報の範囲ここまで
3-5JavaとWebの実行環境
業者が残した説明書を読むと、予約サイトのサーバ側はJavaという言語で書かれていました。試しに同じプログラムをミナトのWindowsのノートパソコンで動かすと、Linuxで動いているサーバと同じように動きます。OSもCPUも違うのに、なぜ作り直さずに動くのか、ミナトには不思議でした。
ふつう、プログラムは特定のCPUとOS向けの機械語に翻訳されるので、別の種類のコンピュータではそのままでは動きません。Javaは、プログラムをまずバイトコードと呼ばれる中間の形に翻訳します。そして、それぞれのコンピュータに入れたJava仮想マシン(JVM:Java Virtual Machine)が、バイトコードをそのコンピュータ向けに解釈して実行します。OSやCPUの違いはJava仮想マシンが引き受けるので、同じバイトコードがWindowsでもLinuxでも動くわけです。
Javaのプログラムは、動く場所によって呼び方が変わります。Java仮想マシンの上で、ほかのソフトウェアの中に入らず単独で動くものがJavaアプリケーションです。これに対し、Webページに組み込まれて、ブラウザの中で動く小さなプログラムをアプレットといいます。
ここから基本情報!ブラウザの中とサーバの中で動くプログラム
アプレットの代表が、Javaで書かれたJavaアプレットです。Webページを開くとプログラムがダウンロードされ、利用者の側(クライアント)のブラウザにプラグインとして組み込んだJava仮想マシンで動きました。動きのある画面を作れたので一時は広く使われましたが、安全上の問題が続き、主なブラウザがこうした拡張機能(プラグイン)の仕組みを打ち切ったため、いまはほぼ動かせません。
予約サイトのJavaは、サーバの側で動いています。お客さんが「受け取り日:12月24日」を選んで送信すると、サーバ上のプログラムがその依頼(リクエスト)を受け、データベースから空き枠を調べ、結果のWebページをその場で組み立てて返します。このように、Webサーバ側で動き、リクエストに応じて内容を動的に作るJavaのプログラムをJavaサーブレットといいます。サーブレットを動かすには、リクエストを受けてサーブレットに渡す実行環境のソフトウェアが要ります。その代表が、Apache Software Foundation が開発するオープンソースのApache Tomcatで、サーブレットやJSP(Javaで動的なページを書く仕組み)を実行します。
ブラウザの中で動くプログラムを書く言語は、Javaだけではありませんでした。マイクロソフトが Visual Basic をもとに作ったスクリプト言語VBScriptは、Internet Explorer のWebページや、Windowsの作業の自動化に使われました。マイクロソフトは2023年10月にVBScriptを非推奨とし、将来のWindowsから取り除く方針を示しています。
プラグインに頼らずに済むようにしたのがHTML5です。図を描く canvas 要素や、動画・音声を再生する video・audio 要素などが加わり、ブラウザだけで動きのある画面を作れるようになりました。HTML5は2014年にW3Cの勧告になり、いまはWHATWGが更新を続ける HTML Living Standard がHTMLの仕様になっています。
Webのサービスどうしを組み合わせる作り方もあります。焼き上がりの通知を送る前に、天気予報のサービスに店の地域の天気を問い合わせ、雨なら「お取り置きもできます」と書き添える。このように、複数のWebサービスの入力と出力をつないで、新しいサービスを作る方法をロジックマッシュアップといいます。
基本情報の範囲ここまで
3-6開発ツールの種類
ミナトは、メモ帳でプログラムを書いていました。保存して、別の画面で翻訳のコマンドを打ち、エラーが出たら行番号を数えてメモ帳に戻る。1文字直すたびに、3つの画面を行き来します。横で見ていた店長が言いました。「パンだって、こねる台と型とオーブンがそろってないと焼けないよ」。
ソフトウェアを作る仕事は、設計し、プログラムを書き、翻訳し、試し、直す、と工程が多く、それを何度も繰り返します。どの工程にも、手作業を減らしたり、見落としを防いだりするツールがあります。ツールがそろうと、同じ作業にかかる時間も、人の手で起こす間違いも減ります。
ここから基本情報!工程ごとの開発ツール
設計の工程では、画面の流れやデータの関係を図に描き、仕様書にまとめます。こうした設計の資料を作るのに使うツールを、広く設計ツールといいます。図を描くだけでなく、記法の誤りや、図と図の食い違いを自動で確かめるなど、設計の作業そのものを助ける機能を持つものは設計支援ツールと呼ばれます。ただし、シラバスは二つの語を並べて挙げているだけで、違いを定めてはいません。二つを厳密に分けた定義があるとは考えないほうが安全です。
プログラムを書いた後の、翻訳する、部品を結合する、配布できる形にまとめる、という一連の工程を自動で実行するツールが構築ツール(ビルドツール)です。手順を一度書いておけば、毎回同じ順番で漏れなく実行されます。コンパイラ、リンカ、デバッガのように、開発に使う複数のツールを、前のツールの出力が次のツールの入力になるようにつないだ一式をツールチェーンといいます。
ミナトが行き来していた3つの画面を1つにまとめたものが、IDE(Integrated Development Environment:統合開発環境)です。エディタ、コンパイラ、デバッガなどを一つの画面から使えるので、エラーの行を押せばその場所が開き、直してすぐに試せます。代表的なIDEの一つがEclipseで、IBMが中心になって開発を始めたオープンソースのIDEです。プラグインを足すことで、Java以外の言語にも対応できます。
直しているうちに、前のほうが動いていた、ということも起きます。ファイルの変更の履歴を記録し、過去の版に戻したり、複数人が別々に加えた変更を一つにまとめたりできるツールがバージョン管理ツールで、Git がよく使われています。プログラムを試す工程では、テストの実行、結果が期待どおりかの確認、テストに使うデータの作成などを助けるテストツールを使います。通知の機能を直すたびに、同じ確かめを自動で流し直せます。
基本情報の範囲ここまで
店長は店長で、別のことを考えていました。予約の数を品目ごとに数える画面くらいは、ミナトに頼まずに自分で作れないだろうか。プログラムを書いたことがない人でも、アプリを作れるツールはあるのか、と相棒に尋ねます。
ここから基本情報!コードを書かずに作る道具
画面に部品を並べ、項目や条件を設定するだけでアプリを作れるツールがあります。プログラミング言語のコードを書かずに、画面の操作だけで開発できるものをノーコードツール、画面の操作を中心にしながら、足りない所だけ少しのコードを書き足して開発するものをローコードツールといいます。ノーコードは手軽な反面、用意された機能の範囲でしか作れません。ローコードは、コードを書ける分だけ自由が利きます。
こうしたツールを使って、情報システムの部門や業者ではなく、実際に業務をしている利用者自身がアプリを作ることをEUD(End-User Development:エンドユーザー開発)といいます。似た語のEUC(End-User Computing)は、利用者自身が情報システムを使い、作り、運用して業務に役立てること全般を指します。店長が自分で集計の画面を作れば、EUDです。ただし、利用者が作ったアプリは作った本人しか中身を知らないまま使われ続けやすく、誰が直し、誰が見守るかを決めておく必要があります。
基本情報の範囲ここまで
3-7テストとデバッグの道具
土曜の朝、本番の前に試しに動かしてみました。11時、クロワッサンが焼き上がると、ミナトのスマートフォンが震えます。続けて、もう一度。同じ「焼き上がりました」の通知が、2回届いていました。お客さんに2回ずつ届いたら、うるさがられてしまいます。
本番で失敗する前に、できるだけ試しておきたいところです。けれども、お客さんのスマートフォンを借りるわけにも、試すたびに本当にパンを焼くわけにもいきません。実際の機械やシステムを使わずに、その振る舞いを模擬的に再現して、動作を確かめたり結果を予測したりするソフトウェアをシミュレーターといいます。パソコンの上でスマートフォンの画面の大きさや通知の見え方を再現し、焼き上がりの時刻を早送りすれば、何度でも試せます。
ここから基本情報!再現する道具と、中をのぞく道具
シミュレーターと似た語にエミュレーターがあります。エミュレーターは、あるハードウェアやソフトウェアの動作を別の環境の上でソフトウェア的に再現し、対象向けに作られたプログラムをそのまま動かせるようにする仕組みです。パソコンの上でスマートフォンを再現し、本物のアプリをそのまま動かすのはエミュレーターです。
焼き上がりの合図は、店のオーブンの中にある小さなコンピュータ(マイコン)から出ています。こうした組み込み機器のプログラムを直すときは、対象のマイコンにつないで、実機の上でプログラムを止めたり、中の値を読み出したりしながら調べる装置を使います。これをICE(In-Circuit Emulator:インサーキットエミュレーター)といいます。
通知が2回届く原因を探すために、ミナトはプログラムを実際に動かしながら、処理の流れと変数の値を観察することにしました。このように、プログラムを実行しながら不具合の原因を突き止める方法を動的デバッグといいます。プログラムを動かさずに、書かれたコードを読んで調べる方法と対になります。
動的デバッグに使うツールはいくつかあります。命令が実行された順番や、そのときのデータの変化をたどって記録・表示するのがトレーサーです。トレーサーの記録を読むと、通知を送る処理が、プログラムの別々の2か所から1回ずつ呼ばれていました。実行を途中で止めて、その時点の変数の値やオブジェクトの状態を表示するのがインスペクターです。止めて中を見ると、「送信済み」の印が、1回目の送信の後も「まだ」のままでした。
プログラムの指定した場所を通るたびに、そのときのメモリやレジスタの内容をそのまま書き出して残しておく方法もあります。ある時点の状態をそのまま記録したものをスナップショットといい、障害の解析やバックアップでも使われる語です。
直した後に同じ失敗を繰り返さないためのツールもあります。プログラムの中に「この時点で、送信した回数は1回以下のはず」のように、変数などが満たすべき条件(アサーション)を書いておき、実行時にその条件が破られたら知らせるのがアサーションチェッカです。
基本情報の範囲ここまで
二重の通知は、オーブンからの焼き上がりの合図と、「11時になったら送る」という時刻の合図の両方が、通知を送る処理を呼んでいたことが原因でした。焼き時間が少しでもずれると、二つの合図が別々に届きます。ミナトは時刻の合図を消し、焼き上がりの合図だけで送るように書き直しました。
3-8言語処理ツール
書き直したプログラムを、ミナトはそのまま動かそうとしました。相棒が止めます。「この言語は、先に翻訳しないと動かないよ」。ミナトが書いたのは、英単語と記号の並びです。CPUが読めるのは、0と1の並びでできた機械語だけです。
人が読み書きしやすいプログラミング言語と、CPUが実行できる機械語のあいだには、大きな隔たりがあります。その隔たりを埋めるのが、プログラムを翻訳するソフトウェアで、まとめて言語プロセッサと呼ばれます。翻訳のしかたには、全部を先に訳しておく方法と、1文ずつ訳しながら実行する方法があり、どちらを使うかは言語や場面によって決まります。
ここから基本情報!翻訳する道具の種類
プログラミング言語を使って人が書いた、翻訳される前のプログラムを原始プログラム(ソースプログラム)といいます。原始プログラムを一括して機械語のプログラムに翻訳するのがコンパイラです。翻訳に時間はかかりますが、一度訳しておけば、実行のたびに訳し直さないので速く動きます。
これに対し、原始プログラムを1文ずつ解釈しながら、その都度実行していくのがインタプリタです。直したらすぐに動かせる代わりに、実行のたびに解釈するので、同じ処理ならコンパイラで訳したものより遅くなりがちです。両者の間をとったのが実行時コンパイラ(JITコンパイラ)で、プログラムの実行中に、必要になった部分を機械語へ変換しながら実行します。3-5で見たJava仮想マシンの多くは、バイトコードを解釈するだけでなく、何度も実行される部分を実行時コンパイラで機械語にして速くしています。
機械語の命令を、人が読める短い記号に1対1に近い形で置き換えた言語をアセンブリ言語といいます。アセンブリ言語で書かれたプログラムを機械語に翻訳するソフトウェアがアセンブラです。
オーブンのマイコンのプログラムは、マイコンの上では書けません。画面もキーボードもなく、翻訳を動かす力もないからです。そこで、開発に使うパソコンの上で、別の種類のCPUやOS向けの機械語を作り出すコンパイラを使います。これをクロスコンパイラといい、組み込み機器の開発で欠かせません。GNUプロジェクトが開発するオープンソースのコンパイラ群GCC(GNU Compiler Collection)は、C言語やC++など複数の言語に対応し、多くの種類のCPU向けの機械語を作れるので、クロスコンパイラとしても広く使われています。
翻訳の前の段階を自動にするツールもあります。画面の項目の一覧や処理の条件などを与えると、それをもとに原始プログラムを自動で作り出すのがジェネレーターです。予約の入力画面のように、決まった形の繰り返しが多いプログラムで使われます。
基本情報の範囲ここまで
ここから基本情報!コンパイラの中の手順
コンパイラは、原始プログラムを一度に機械語へ置き換えるわけではなく、いくつもの段階を順に通します。通知のプログラムの中の、代金を計算する1行で追ってみます。
kingaku = tanka * kosu + soryo;(金額 = 単価 × 個数 + 送料)
本番の翻訳の前に、プリプロセッサが前処理をします。C言語なら、別のファイルに書いた宣言を取り込む指示(#include)や、決めておいた名前を中身に置き換えるマクロの展開がここで行われます。
続いて、文字の並びを、変数の名前・予約語・記号などの意味を持つ最小の単位(トークン)に分割します。これが字句解析です。上の1行は、kingaku、=、tanka、*、kosu、+、soryo、; の8つのトークンになります。その後、トークンの並びが文法に合っているかを調べる構文解析、型などの意味が正しいかを調べる意味解析を経て、中間コードと呼ばれる、機械語に近い中間の形に直します。
中間コードの形式の一つが四つ組形式で、1つの演算を「演算子、オペランド1、オペランド2、結果」の4つの項目の組で表します。掛け算は足し算より先に計算するので、上の1行は次の2つの組になります。クロワッサン(280円)を3個、送料500円で計算すると、値の流れも追えます。
| 順 | 演算子 | オペランド1 | オペランド2 | 結果 | 結果の値 |
|---|---|---|---|---|---|
| 1 | * | tanka | kosu | T1 | 280 × 3 = 840 |
| 2 | + | T1 | soryo | kingaku | 840 + 500 = 1,340 |
T1 は、途中の結果を一時的に置いておく場所です。結果の欄を持たず、何番目の組かで途中の結果を指す三つ組という形式もあります。最後に、中間コードから目的の機械語のプログラムを作り出すのがコード生成です。多くのコンパイラは、その前に、無駄な計算を省いて速く動くように中間コードを書き換える最適化も行います。
基本情報の範囲ここまで
3-9リンクとロード
翻訳は、エラーなしで通りました。ところが実行しようとすると、「通知の送信の部品が見つかりません」と表示されます。ミナトが書いた部分は機械語になったものの、借りてきたライブラリの部品とは、まだ別々のファイルのままでした。
ここから基本情報!部品を結合して実行できる形にする
コンパイラが原始プログラムを翻訳して作り出す機械語のプログラムを目的プログラムといい、ファイルとしての1つ1つを目的モジュール(オブジェクトモジュール)と呼びます。目的モジュールは機械語でできていますが、それだけでは動きません。ミナトの目的モジュールには「ここで通知の送信の部品を呼ぶ」と書いてあるだけで、その部品がどこにあるかはまだ決まっていないからです。
複数の目的モジュールと、ライブラリから取り出した部品を結合し、互いの呼び出し先を埋めて、1つの実行できる形にまとめるソフトウェアがリンカです。リンカが作り出した、主記憶に読み込めばそのまま実行できる形のプログラムをロードモジュールといいます。
基本情報の範囲ここまで
実行できる形になったプログラムも、ふだんは補助記憶装置(ディスク)にファイルとして置かれています。CPUが実行できるのは主記憶にあるプログラムだけなので、実行の前に読み込まなければなりません。実行できる形のプログラムを補助記憶装置から主記憶に読み込み、実行を始められる状態にするプログラムをローダといいます。読み込む場所はそのときの主記憶の空き具合で変わるので、ローダは読み込んだ場所に合わせて、プログラムの中の番地を調整することもあります。
次の土曜、11時。クロワッサンが棚に並ぶと同時に、常連のお客さんのスマートフォンに通知が1回だけ届きました。店に入ってきたお客さんは画面を見せて笑い、焼きたてを2つ買っていきます。ミナトの十数行は、翻訳され、借りた部品と結合され、主記憶に読み込まれ、DBMSから予約を受け取り、外部のサービスのAPIを通じて届いていました。書いたのは十数行でも、動かしていたのはその下に重なった何層ものソフトウェアです。片付けをしながら、店長が言いました。「次は、予約が入ったら会計ソフトにも自動で載るようにできる?」。ミナトは、別々に作られたアプリどうしをどうつなぐかを、相棒に聞いてみることにしました。