PR

 コンピュータは高速演算装置だ。プログラムはCPUに対する演算命令の連続である。文章も動画も音楽も,コンピュータの中では高速な数値演算として処理されている。その演算は,ソースコードのレベルでは「演算子」を使って記述される。これに制御構造など様々な命令が加わって,関数など複雑な処理が組み上げられる。ってわけで,今回はコンピュータの基本機能である演算を記述する「演算子」について調査した。

「演算」は行為,「計算」は結果

 コンピュータの基本機能は数値の演算だ。それをプログラムで記述するために演算子や関数が使われる。まずその辺りを整理しておこう。

 演算子の「演算」は「計算」と似たことばだが,ニュアンスはちょいと違う。以下は「広辞苑」(岩波書店発行)からの一部抜粋。

演算:数式の示す通りに所要の数値を計算すること。運算。
計算:演算をして結果を求め出すこと。

 演算の説明には「計算」,計算の説明には「演算」という語が入っている再帰的な構造なので,まじめに解釈しようとすると堂々めぐりの無限ループに突入してしまう(笑)。要するに,演算は「算する行為」に注目し,計算は「算した結果」に注目するニュアンスを含んでいるってことだ。

 英訳するとわかりやすい。「新英和中辞典」(研究社発行)では,以下のように説明されている(動詞の場合)。

演算 ― operate
計算 ― calculate,compute

 演算を表すoperateには,「仕事をする」「手術をする」「作戦をこなす」などの意味もある。一方,計算を表すcalculateには,「見積もる」や「推測する」という意味もあり,日本語で「計算高い」という場合の計算と同じニュアンスも含まれる。

 コンピュータによる演算の対象は数値だが,様々な状態を数値に置き換えて処理することで,コンピュータは論理的な思考ツールとなり,文字や画像,音声まで扱える装置となった。かつてコンピュータは「計算機」と呼ばれていたが(実は今でもそう呼んでいる分野が存在する),家庭や職場に置かれたパソコンを単なる計算機と見ている人は少ないだろう。

演算子も関数と同様のブラックボックス

 そうは言っても,コンピュータの中では頭脳であるCPUがやはりせっせと演算を行っている。演算の結果である数値を,人間の都合で文字や絵にしているだけなのだ。

 そして,プログラム中で様々な演算を指示するために使われるのが「演算子」である。演算子は主に記号文字で表記されるが,れっきとした命令だ。加減算はもちろん乗除算も,機械語レベルでは前回説明したようにビットシフトなどによる演算処理に置き換えられる。

 プログラミング言語には,実に様々な演算子が用意されている。どのような言語にもまず間違いなく備わっているのが,加減乗除の四則演算子「+-×÷」である。文字コードの都合で,乗算の×には*,除算の÷には/が充てられている。

 剰余(除算のあまり)を求める演算子も一般的だが,このあたりから言語によって演算子として使われる記号が異なってくる。例えば,Visual Basic(VB)の剰余演算子はModという文字列だが,Cは%を使う。

 べき乗(xのy乗)や平方根(√)など,より複雑な処理を行う計算では,記号を使った演算子ではなく関数を利用することが多い。VBでは,べき乗は^演算子を使い「x^2」のように記述するが,平方根にはSqrt関数を利用する。Cではべき乗にpow関数,平方根にsqrt関数を使う。

 また,事務処理用言語の古参として有名なCOBOLでは,四則演算子記号のほか,ADD(加算),SUBTRACT(減算),MULTIPLY(乗算),DIVIDE(除算)といった命令を使って,文章として演算を記述することができる。

 「関数」は英語のfunctionの訳語だ。ご存じのように,関数の利用者(プログラマ)には,その関数の機能を利用するために必要な入力(引数)と出力(戻り値)の仕様だけが明らかになっており,内部での具体的な処理方法を気にかける必要はない。いわばブラックボックスである(図1)。もともとfunctionの訳語には「函数(かんすう)」という語が当てられていた。「函」とは「箱」のことだから,文字通りブラックボックスをイメージする名称だった*1

図1●ブラックボックスとしての関数
図1●ブラックボックスとしての関数

 実際に,Cの標準ライブラリ関数やバージョン6以前のVBの関数,.NET Frameworkの各種メソッドなどは,その内部がプログラマからは見えない。どのような引数が必要で,それらがどのように処理されてどのような値が返されるか――という仕様しかわからない。

 ただし,プログラマがブラックボックスの中身を作る側に回ることもある。例えば,Cでは関数を作ることで処理を組み上げるし,VBのプロシジャはSubもFunctionも広義の関数ととらえることができる。

 関数がブラックボックスであるのと同じように,演算子もまた入力とその仕様だけが知らされたブラックボックスだ。

 x * 10

という式がどのように処理されてxを10倍するのかを知る必要はない。前回解説したように,この式は加算やビットシフトなどCPUが持つ基本的な演算機能を駆使して処理されることになるかもしれないが,プログラマはそのメカニズムを知らなくても10倍した値を結果として得ることができる。