1.1 プログラミングの要素
強力なプログラミング言語は、コンピュータにタスクの実行を指示する道具というだけではありません。言語は、私たちがプロセスについて考えをまとめる枠組みとしても役に立ちます。そのため、言語を記述する際には、簡単な考えを組み合わせてより複雑な考えを作るためにその言語が提供する手段に対して特別な注意を払う必要があります。強力な言語は、これを達成するために、3つのメカニズムを持っています。
- 基本式は、言語に関わる最も単純な実体を表します。
- 組み合わせ方法は、複合要素をより単純なものから構築する方法です。
- 抽象化方法は、複合要素に名前をつけ、単体として扱うための方法です。
プログラミングでは、二つの要素を扱います。それは、手続きとデータです(のちに、それらがそんなにはっきり分かれるものでないということがわかってきます)。大雑把に言うと、データは“物”で、私たちが操作したいものです。手続きは、データを操作するための規則を記述したものです。そのため、強力なプログラミング言語はすべて、基本的なデータや基本的な手続きを記述でき、また手続きとデータを組み合わせ、抽象化する方法を備えていなければなりません。
この章では、手続きを構築する規則に焦点を当てるため、単純な数値データのみを扱うことにします。4後の章では、複合データを扱う手続きを構築するのにも、これらの同じ規則が使えるということを見ていきます。
4. 数値を“単純なデータ”と見なすのは白々しいごまかしです。実際のところは、数値の扱いは、どのプログラミング言語でも、非常に落とし穴が多く混乱を招く一面となっています。いくつかの典型的な問題は次のようなものです。コンピュータシステムによっては、2のような整数(integer)と2.71のような実数(real number)を別物として扱います。実数2.00は整数2とは違うのでしょうか。整数に使われる算術演算は、実数に使われるものと同じものでしょうか。6を2で割ると、答えは3でしょうか、それとも3.0でしょうか。どれだけ大きな数値まで表現できるのでしょうか。小数点以下は何桁まで表すのでしょうか。整数の範囲は実数と同じでしょうか。これらの問題の先には、もちろん、丸め誤差や切り捨て誤差に関する問題の山が横たわっています。それは、数値解析の科学そのものです。この本での焦点は大規模プログラム設計であり、数値計算のテクニックではないので、これらの問題は無視することにします。この章での数値演算の例では、非整数の演算では有限の小数点以下の精度を保つ算術演算を使い、そのような場合に使われる通常の丸めの挙動が反映されています。 ↩