古いCのK&R記述スタイルの違いについて

古いCのK&Rスタイルソースコードと現代の表記の違い


C言語には幾つかの方言がある。C言語自体は1970年代から存在していたので利用例は多くあり、
DEC等に代表されるミニコンやホスト機、SunやHP,SGIの初期のワークステーション、
CP/Mなど8bit機械など古いシステムでも動作した。当時のC言語の処理系はソースコードの記法が
現代とは若干異なっている。
この原型となる処理系の表記については発明者で教科書の著者でもあるカーニハンとリッチさんが
書いたC言語の参考書にちなんでK&R表記と呼ばれる。
1980年代初期のコンピュータで動作したC言語のソースはK&R表記で書かれていることが殆どなので
8bitマシンに限定されたことではないので注意が必要である。

その後に1980年代終わり頃に標準化作業が行われ、現代利用されているC言語の表記が採用される
ようになった。この処理系はANSI表記と呼ばれる。以降このANSI標準化による作業がC言語の
標準として採用されている。

MSXではMSX-Cと呼ぶコンパイラが存在したが、この処理系はK&RスタイルであるのでSDCCなどとは
若干違いがある。以下にその違いを列挙する(必ずしも正確ではないが)


関数名の引数定義の違い。


オリジナルのC言語の表記法は現代の関数定義とは引数の扱いが若干異なる。関数名に引数を
定義する場合は以下のように関数名とブロック構文の間に変数を記述する。
これはPascalの記述とよく似ている。

int test()
char	a;
{
	/* K&Rスタイルソース CPMやミニコンなど */
}

現代的なANSI標準化以降のC言語では以下のように関数名の部分に引数が記述される。

int test(char a)
{
	/* ANSIスタイルソース , DOS/Windows/UNIXなど */
}


変数型の取り扱い


K&Rの頃とANSI標準化以降では変数型の扱いや種類に違いがある。
K&Rではunsigned intの表記は単にunsinedだけで通るかもしれない。ANSI標準化以降の構文では
unsigned intと表記する事になる。またK&R表記ではintがデフォルトで符号なしか符号付か
はっきりと区別されていないかもしれない。
これは処理系依存のためそれぞれのコンパイラの仕様を確認すること。


処理系のソース処理手続きの違い


現代的なC言語のコンパイラは一つのコマンドで全てを処理する。ところが初期のC言語では
複数のコマンドがコンパイル時に実行されており機能が分割されていた。
このような点が処理系がコンパクトで他の環境に移植された要因でもある。

K&Rの頃には、1,プリプロセッサ処理 2,構文チェック 3,コードジェネレータ 4,アセンブラ
5,リンカ などがそれぞれ分割された個別の実行アプリケーションとして実装されていて
Cソースコードの処理はそれらをすべて呼び出して最終的な処理を完了する。
そしてK&Rの頃にはmakeコマンドのようなものは存在しない。

ANSI標準化以降はコマンドは最小でも一つのコマンドで終了する。例えばWindowsであれは
cl hoge.c である。
現代では最大でも 1,コンパイラ 2,アセンブラ 3,リンカ などの三つの処理で完了する。
場合によっては一つのコンパイラドライバが全ての処理を管理することもある。
現代ではmakeコマンドはDOSやWindows環境でも利用可能である。


ヘッダやライブラリの違い


K&Rの頃の標準ライブラリというものは必要な関数機能の実装はそれぞれの処理系に依存している。
その為、特定のコンピュータやソフト環境に依存しないような今日知られているようなC標準ライブラリと
呼ばれる関数群は存在しない。
K&Rの頃のC言語では、ヘッダに定義された定数や標準ライブラリの一部の関数がCPM用とUNIX用と比べて、
存在したり存在しなかったりといった違いが生じた。
これはDOSやミニコンといった機械環境やハードウエアの違いだけでなくC言語処理系などの
ソフトウエアの違いによっても生じていた。

今日知られているANSI標準化以降のC標準ライブラリではコンピュータの違いや処理系の違いによる
ヘッダやライブラリの差は若干違いはあるものの以前ほどの差はない(DOSには幾つかの違いがあるが)。
基本的にはWindowsでもDOSでも同じライブラリを利用可能である。
ただし今利用されている標準ライブラリの関数群の殆どはK&R当時から存在する関数が殆どであり、
利用する際に問題となることはないといえるだろう。


ソースコード表記の自由度の違い


Small-Cなどの実装系にもよるがK&R時代ではかなり自由度が許容されていた。一行以内で書かれる
マルチラインや一行で多数の変数を定義するなど、可読性に問題が生じる書き方も許容されていた。
またブロック構文についてもかなり自由度があったようである。

ANSI標準化以降は現代的な形式となり、可読性に問題があるような書き方は制限されるか
コーディング規則で任意で制限される。


構文チェックやエラー処理の違い


K&Rの頃のC言語は構文エラーやエラー処理などのチェック機構はあまり実装されていない。
このためソースコード上の記述ミスなど問題が生じたときの確認の手段が少ない。
(別途ソースコードチェックコマンドなどが存在した)

ANSI標準化以降はコンパイル時のエラー処理を人間が比較的理解しやすいように出力する。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2017年04月12日 03:39
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。