コンピュータのハードウェアは、大きく分けて以下の3つの部分から構成されている。
- CPU(中央処理装置)
- 主記憶(メモリ)
- 入出力(I/O)インターフェースと周辺装置
CPU (Central Processing Unit = 中央処理装置)は、その名の表すとおり、コンピュータで実行される演算処理のほとんどを担う※。CPUは特定の機械語命令(コード)からなる命令セットに基づいて設計されている。
主記憶は、機械語命令やデータとなるバイト列を保存する部分であり、その内容は書き変えが可能である。
コンピュータのこの他の構成要素は周辺装置と呼ばれ、入出力インターフェースを介して接続されている。
コンピュータの上記の要素は、アーキテクチャと呼ばれる基本設計や設計思想に基づき構成されている。CPUは主記憶から機械語命令を逐次読み込みながら、その命令に従い演算を繰り返していく。(これを「ストアドプログラム方式」と呼ぶ。) 主記憶に記憶する機械語命令、すなわちソフトウェア(プログラム)の内容を変更することにより、コンピュータに多様な動作をさせることが可能となる。
コンピュータを正しく動作させるには、対象とするハードウェアのCPUが解釈可能な機械語命令でソフトウェアを構成する必要がある。さらに、正常に周辺装置を操作するために、対象とするハードウェアのアーキテクチャをも考慮してソフトウェアを作成しなければならない。近年では、多様な周辺装置に対応するために、これらの操作はオペレーティングシステム(OS)と呼ばれるソフトウェアを介して行っているので、使用するオペレーティングシステムに対応したソフトウェアを作成する必要がある。
(※近年では、3Dグラフィック処理や動画像のエンコード処理などの多量の演算を高速に行う必要のある処理については、専用のハードウェアで構成された周辺装置で行うもの も多くなってきている。)
機械語命令は単純なバイト列で構成されているために、人間が直接読んでも理解するのは困難である。そのため、ソフトウェアの作成にはプログラミング言語を用いるのが一般的となっている。
プログラマはプログラミング言語を用いて処理を記述したソースコードを作成し、言語処理系を用いて機械語命令列を生成する。この機械語命令列をオブジェクトコードやバイナリコードと呼ぶ。またこのファイルを、オブジェクトファイル、バイナリファイル、実行可能ファイルと呼ぶ。プログラミング言語の最も基本的なものはアセンブリ言語である。ソースコードは機械語命令と1対1に対応したニーモニックを用いたアセンブラで記述し、言語処理系でアセンブルすることによりオブジェクトコードを得る。
アセンブリ言語はきめ細かいハードウェアの操作を記述できる反面、プログラマはハードウェアに対する知識を要求される。また、処理の内容を読み取るにも、その記述方法は人間に対して直感的ではない。さらに、特定のプログラムを別のアーキテクチャを持つハードウェアに対応させるためには、ソースコードから記述しなおす必要があるなどの問題点もある。
アセンブリ言語に対してソースコードの抽象性を高め、人間にとって直感的でわかりやすい形で記述できるようにしたプログラミング言語を高級言語と呼ぶ。
ほとんどの高級言語は、順構造、分岐構造、繰り返し構造の3種類の基本的な制御構造をわかり易く記述できるようにした、構造化プログラミング言語となっている。構造化プログラミング言語には、プログラミング演習で扱うC言語とともに、FORTRAN、PASCAL、COBOLなどがある。
さらに近年では、プログラムの部品化とその独立性を高めたオブジェクト指向言語が、大規模なプログラム開発においては主流となってきている。オブジェクト指向言語にはC++、Javaなどがある。
C言語は、1972年にアメリカAT&T社のベル研究所でD. M. Ritchie氏とB. W. Kernighan氏によって開発された構造化プログラミング言語である。もともと Unix システムの記述用に開発されたため、高級言語でありながら、メモリ操作などのハードウェアよりの処理も可能である。
C言語処理系では、C言語で記述したソースコードから、コンパイル(翻訳)、リンクという作業を経て実行ファイルを得る。(コンパイル、リンクの仕組みの詳細についての説明は、課題2で行う。複数のソースファイルでプログラムを記述する分割プログラミング手法については、プログラミング演習IIで学習する。)
プログラミング演習では、Windows で動作するC言語処理系のひとつである Visual Studio 2010 開発環境を使用する。(Visual Studioは、C/C++ 処理系や Visual Basic言語処理系などが統合された開発環境である。)