C言語の研究
はしがき
1 C言語の歴史
C言語は1972年にアメリカのAT&Tベル研究所において、Dennis M .Ritchieによって設計された。
彼の目的はミニオペレーティングシステム・UNIXを開発することであったが、それにふさわしい言語として、Brian W.Kernighanとともに仕様をまとめたものである。
当初はオペレーティングシステム開発用であったが、UNIXをはじめ各種OS上で動くアプリケーション開発にも用いられるようになった。WindowsもC言語で開発されていることを以前文献で知ったことが思い出される。
初期の頃は、使用するコンパイラによって仕様が異なるといった、一貫性のない言語であったことから、1989年にANSI(American National Standard Institute:米国国内規格協会)が標準規格を定め、さらに1990年にはISO(International Standard Organization:国際標準化機構)により規格が制定された。この内容はANSIと同一であった。
2 C言語の特徴
@ OS設計が目的であったため、アセンブラのような低水準レベルの処理が可能
A コンパクトな言語仕様
B 関数により構造化、モジュール化が容易
C データ型が豊富、文字や数値、および配列、構造体、共用体、さらにはポインタがある
D 移植性にすぐれている
E 一番汎用性のある言語
3 「C言語の研究」の記載方針と実行環境
(1) 記載方針と内容
これからC言語を学ぼうとする人のために記載していく予定なので、上級者やC++を既に習得している人にとっては、参考程度や思い出し笑い用にしていただきたい。
また、情報処理技術者試験(2種)を受けようとする人にも役に立つように記載していきたい。この意味で、
基本編〜ANSI C言語文法等の完全マスターを期す
演習編〜情報処理技術者試験に向けたアルゴリズムの研究
C++編〜Visual C++などでプログラミングする際に必要になるC++の機能
の3パートに分けて、ゆっくりと研究して行きたい。
内容的には初心者向けであるが、第2種情報処理技術者試験をC言語で受験しようとする人のためにも演習を中心とした内容で対応させる目的から、かなり高度な内容も出てくるが、次項で述べるように、実際に例題プログラムを実行させながら、自分のものにしてほしい。
(2) 完全な実装プログラムの掲載
すべてのプログラミング言語と同様、C言語においても、やはりサンプルプログラムや自分で作成したプログラムをコンパイルして実行の上、プログラムとその実行結果を確認することが、完全マスターする上で必須条件であると思われる。
よく、参考書などで特定の関数のプログラムだけを掲載している箇所を見かけるが、これでは実際にどのように実行されるのかを見ることが出来ない。つまり初心者としては、メイン関数やデータとの関連付けがよく分からないまま、分かったつもりで通過してしまうおそれがある。
この弊害を避けるために、この「C言語の研究」には全て完全な実装プログラム、つまり、メイン関数から入って、必要なデータについてはソース上に既に作成、ないしキーボードから入力できるなど、プログラムとデータの関連性を実行しつつ理解しつつ習得できるように完全な形の数多くの実装プログラムを掲載した。この中には、長いものや複雑なものがあり、これらをディスプレイを見るだけで理解することは初心者にはかなり難しいと思われる。
やはり、コンパイラに、この「C言語の研究」中のページから、必要に応じてサンプルプログラムをテキスト形式でコピーして、コンパイルの上、実行させ、疑問点をひとつひとつ解明して行くことが一番大事である。
幸いにも、インターネットのホームページは、必要範囲をドラッグして右クリックするとテキスト形式に簡単にコピーできるので、是非これからのページにあるサンプルプログラムをコピーの上、お手元のコンパイラで実行させてプログラム内容と結果を比較・確認していただきたい。
それが理解と上達の早道でもある。
つまり、解説を見たり読んだりしながら思い悩むよりも、コンピュータがこれらを実行して理解させてくれる。
そのコンピュータという偉大な友達が今ここに存在しているということである。
(3) サンプルプログラムの実行環境について
この「C言語の研究」には完全な実装プログラムを掲載しているので、ぜひコンパイルして実行しながら研究してほしいと言った。
では、そのためにはどのような実行環境が良いかということになるが、仮に私にC言語のコンパイラを選ばせていただけるのならば、
OSがWindowsならMicrosoft Visual C++ないしBorland C++Builde5.0あたりがいいだろう。
このコンパイラ選択時において留意すべきことは、最近のC言語開発環境はC++開発環境も兼ねているものが多いので、C言語だけの環境では許されない書き方も、コンパイラがC++とみなして実行することが可能であるという部分であろう。
たとえば、
#include <stdio.h>
void main(int argc, char **argv)
{
printf("This is C language!\n") ; //"This is C language!"と出力
}
この//はC++の注釈記載方法であって、Cでは許されないが、Visual C++のような、ANSI C/C++開発環境の場合は許可されることになる。
また、Visual C++は完全32ビットコンパイラであるため、たとえばint(整数)は32ビットで表現するが、MS-DOS環境のコンパイラなどでは16ビットで表現している場合がある。このためビット操作でのパック10進数サンプルプログラムなどについては、1記憶単位への格納数が異なり、その実行結果に影響を受ける。この場合はプログラムを適宜マクロ定義の32を16にするなど変更して実行してほしい。
また、完全にWindows用C/C++開発環境としてVisual Basicのように、フォームにボタンやラベルを貼り付けていく方式だけになっているインプライズ社のBorland C++Buiderがある。
Borland C++Builderを使ってC言語の勉強をするのならVersion5.0がいい。
コンソールウイザードを使うと簡単にコードが記述できるようになる。
ただし、実行すると直ちにDOS窓が消えてしまうので、#include <conio.h>として、getch()という関数を使って何かの入力を待って終了させるといった工夫が必要だ。
このC++Builderはここに掲載したC/C++を習得してから使うと、たちどころにしてWindowsC/C++プログラマーになれることだろう。
したがって、Visual C++はANSI C/C++の習得用として、Windowsでプログラム作成するのならBorland C++Builder(プロフェッショナル版がいい)を開発環境にすれば効率が良いと思われる。
*****Linuxについて*****
さて、最近Linuxが台頭してきた。これを作成したのはLinuxが現在のように一般化される前の時点で、あくまでWindows95/98をベースとしてC/C++を学ぶという発想に立って作成した。
しかし今はどうだ?私もVine Linux 2.1CRを使っているが、GNUのgccという素晴らしいフリーの本物のコンパイラが最初から付属している。ここでいうフリーとは値段がただのことではなく、「自由」のことであるらしい。
純粋にC/C++を勉強しようと思うのなら、古いマシンにLinuxをインストールして、gccコンパイラなどを使用されることをお勧めする。MFCとかWindowsだけのクラスライブラリなど覚える必要もないし、UNIXに接することができる。
ただし、最低限のUNIXコマンド(bash)などは必要になるし、独自にドットファイルをアレンジしシェルスクリプトを作っておいて、コンパイルや実行を1つのコマンドで出来るように環境を整えておきたいところである。
Linuxだと、自分で作ったWEB SERVERがLinux版だとすると、たとえばCGIがC言語で作成できる。方法は至って簡単だ、一度コンパイルしたファイルの拡張子を".CGI"に変えてCGIのディレクトイに置くだけだ。
我がWebサーバのあるアメリカ東海岸の現在時間を見てみよう。ここをクリック
****Visual Basicについて****
ここで了承して頂きたいのは、プログラミング言語自体の持つ得手・不得手だ。
今や業務アプリとしてのデファクトスタンダードとも言えるAccessやExcelを自由に操るプログラムを書くのなら私はVisual Basicをお勧めする。結局、これらのマクロ自体がVBAというVisual Basicで作成されているから、C/C++がExcelやAccessを操作する目的でこいつに勝てるはずがない。
大切なのは、何をするかという目的によってプログラミング言語の選択肢が変わるということだ。
このVBもプログラマとして生きて行くには外せない要習得対象といったところだろう。
(4) C言語とC++について
私見であるが、ANSI C言語をマスターしてからC++に入るべきと考えていた。
しかし最近は最初からC++を学ぶことも悪くない方法とも思えるようになってきた。
だが、C++にしてもC言語の知識が必要とされることは確かだと思うので、C言語を最初にマスターするとC++がスムーズに習得できることも自分自身の経験から間違いではないと思われる。
(5) 備考と追記
掲載している完全形式のサンプルプログラムについては、Visual C++でコンパイルして、正しく実行する結果を確認したものを掲載したものであるが、後でHTML作成プログラム(Front Page 98)で注釈を追加した部分に、2バイトのスペースが入っているのに気がついて、あわてて修正したことがあり、もはやなくなったとは思われるが、まだ仮に残っていたとしたら、その場合はお許しいただき、ご不便ではありますが、注釈前後をカットして、再度コンパイルしていただくようお願いいたします。
なお、内容や実行結果等、おかしい部分があればご連絡いただければ幸いであります。
4 基本書・参考文献について
「C言語の研究」作成にあたって、プログラム作成技術の習得と第2種情報処理技術者試験合格の両方を視野に入れて作成して行くため、その両者の目的を兼ね揃えている優れた文献を見つけるのに非常に苦労をした。
その結果、私にとって、これが一番目的に合い、かつ、すぐれた文献である
「新」第2種合格ゼミ4 「C言語の総合研究」(平成7年度) 高田美樹・著 技術評論社・発行
を基本書として、記載順序や方向性をこれに習うこととした。
私自身、情報処理技術者試験については昭和58年に取得しており、当該基本書は、平成7年に私がC言語を勉強するために購入したものであることを追記しておきます。
なお、この基本書以外の参考文献については以下のとおりである。
○新ANCI「C言語辞典」 平林雅英・著 技術評論社・発行
○「ANSI C/C++辞典」 平林雅英・著 共立出版・発行
○明解「C言語入門」 柴田望洋・著 ソフトバンク・発行
○Dr.Jamsaの「C++超入門」 Kris Jamsa・著 アスキー出版社・発行
○3週間完全マスター「Visual C++ 5.0」 ナサン・グレビッチ、オリ・グレビッチ・共著 日経BP社・発行
○The Microsoft Guide to 「C++プログラミング」 Kaare Christian・著 アスキー出版局・発行
5 C言語とブルース・リーの哲学について
何事にも原点における思想(理念)というものが存在する。
C言語設計に当たっての設計思想は、全体を出来る限り低水準レベルに押さえる、そのかわりコンパイラをより一般性、移植性のあるコンパクトなものとして設計し、究極は、より発展性のあることと考えられる。
したがって、C言語はかなり荒削りの部分が残っている。ANCI規格は設定されたが、今後の発展は我々利用者にかかっていることを付記しておきたい。
今はなき史上最強のスーパースター、ブルース・リー(Bruce Lee)氏は、志なかばにしてこの世を去られたが、武術とともに残された彼の「哲学」の中に、C言語の設計思想とかなり近い部分が見受けられる。
この共通点について端的に言うならば「自由の精神」であると言えよう。
これについても当ページ中にRealProducer G2 Plusを利用して挿入している。
作成者からのお断り
最初に、私自身プロではなく、単なる趣味としてC/C++プログラミングを暇な時間に行っているだけのいわゆる「日曜プログラマ」にすぎない素人であり、高度なご質問に対応できるだけの知識を持っていないことをお断りしておきます。
また、ここでは前記基本書及び参考文献から多くのサンプルを引用しています。しかし、いずれについても原文とは内容を変え、完全なプログラムに仕上げるなど加工を施しておりますのでご了承願います。
Mashimo Manor
For the programmer of the future