本物のC

C の前に:OSとプログラム


OSとは

機械語を書いていけば原理的にはコンピュータを動かせますが、HDD 等の記憶領域にフォルダやファイルを作って管理したり、画面に色々と表示したり、様々な機能を全てプログラムとして書く必要があります。

コンピュータを使う人全員がそんな事をしなくて済む様に、

といった機能を集結したプログラムこそ OS(Operating System)の特にカーネル(kernel)と呼ばれる部分です。

カーネルのこうした機能はシステムコール(system call)として提供されていて、我々はこれを利用する事でより簡単にプログラムを書く事ができます。

カーネル
ファイルシステム
ネットワーク
タスク管理
メモリ管理
:
システムコール
インターフェース
⇐⇒
ユーザーアプリケーション
GUI
OS 附属のソフト
:
:
OS の核となるカーネル

カーネルに

を組み合わせ、一切プログラムを書かなくてもコンピュータを扱える様にしたものこそ一般的な意味での「OS」だと言えます。

代表的なOS

現在の世界で最も一般的な OS は、Windows 系と UNIX 系に二分されていると言えます。

Windows は Microsoft 社の開発する一連の製品群ですが、UNIX 系には様々な組織の開発する OS が含まれます。「UNIX」は元々 AT&T 社で開発された OS の名称ですが、その設計を受け継いだ様々な企業が開発する OS や、無償で公開されている似た様な OS も含めて UNIX 系 OS と呼びます。例えば GNU/Linux や Mac OS X が UNIX 系に分類されます。

プログラミング言語

OS の機能を利用するとしても、機械語を直接読み書きするのは非常に手間が掛かります。そこでもっと人間に解りやすい表記にしたり、様々な機能を追加したものが(高級)プログラミング言語(programming language)です。

プログラミング言語で書かれたソースコード(soucecode)は、機械語そのものではないので直接は実行できません。実行の方法は言語により異なっており、主にコンパイラ(compiler)を使うものとインタープリタ(interpleter)を使うものに分かれます。

コンパイラはソースコードを機械語に変換する(コンパイルする)プログラムで、これにより実行可能なプログラムが作られます。

インタープリタはソースコードを読み込んで直に実行するプログラムで、事前にコンパイルを行う必要はありませんが、実行する度に一々ソースコードを解釈するので多少時間が掛かります。

C や C++ はコンパイラ方式の典型で、Python や PHP 等はインタープリタ方式に分類されます。Java や C# といった、ソースコードを中間言語へコンパイルしてそれを実行時に解釈する言語もあります。実行の為に必要なコンパイラやインタープリタといったプログラムは処理系(implementation)と呼ばれます。

どのプログラミング言語にも「こう書けばこう動く」という事を定めた言語仕様(language specification)があり、これさえ満たしていればどんな処理系を使ってもソースコードは同じ様に実行されます。(全ての処理系が完璧に言語仕様を満たしているとは限りませんが。)

C

C 言語は数あるプログラミング言語の中でも大昔に作られたものの一つで、また初めからちゃんとした言語仕様があった訳ではありません。

C は 1972 年、UNIX の開発の為に作られました。その解説書「プログラミング言語 C」がブライアン・カーニハンとデニス・リッチーにより書かれ、著者名から K&R と呼ばれたり、「C のバイブル」と呼ばれたりして有名になりました。

暫くの間はこの K&R に従って色々なコンパイラが開発されましたが、K&R は飽くまでも解説書であって仕様書ではない為に曖昧な記述もあり、結果としてコンパイラ次第で動作が異なる点も色々あった様です。

そんな中で 1989 年、アメリカの標準化組織 ANSI は C 言語の標準規格(standard)として ANSI X3.159-1989(通称 ANSI C または C89)を発行しました。翌年には国際標準化機構 ISO がこれを標準規格 ISO/IEC 9899:1990 として採用しました。

以降 ISO が度々規格を改訂し、ISO/IEC 9899:1999(通称 C99)や ISO/IEC 9899:2011(通称 C11)を発行しています。

C の解説では度々規格に沿わない記述を見掛ける事がありますが、それは C の標準規格が浸透する以前の知識を基にして書かれているからなのかもしれません。