コンピュータとプログラミング

プログラミング技法を学ぶ上で、コンピュータの構成とプログラミングで行うことの実際を理解することは重要である。ここでは、コンピュータにおける情報の取り扱いを簡単に説明した上で、コンピュータにおけるプログラミングの意味と実際に行っていることを説明する。

実行ファイルとデータファイル

コンピュータシステムにおけるファイルとは,記憶装置に記録されたデータのまとまりを意味する.プログラムやデータなどの情報は,それぞれ,独立したファイルとして記述・管理される。

プログラムファイル(実行ファイル)

コンピュータ上でそのまま実行できる.Windowsでは,一般に.exeという拡張子が使われる.

データファイル

それ自体では実行されず、プログラムから読み込み/書き込みされる.ASCII形式とバイナリ形式が存在する.

以下に,プログラムファイルとデータファイルの関係についての例を挙げる.

Webページを閲覧

Webブラウザのプログラムファイルは、サーバ上のデータファイル(HTMLファイル,画像ファイルなど)をダウンロードし,ウインドウ内に表示する.

ワープロで文書作成

ワープロソフトのプログラムファイルは,キーボードから入力された文章をデータファイルとして保存する。

実行ファイルの作成

データファイルはプログラムファイルの実行によって作成されるが,それでは実行ファイルはどのように作成するのだろうか.本講義で扱うプログラミング言語はC言語である.C言語によるプログラム開発では,コンパイラと呼ばれるプログラムが,テキストデータとして準備されたソースコードから実行ファイルを作成する.したがって,プログラム開発者は,コンパイラに入力するためのソースコード,すなわちテキストファイルをエディタなどのプログラムによって記述することになる.以下にC言語のソースコードの例を示す.

C言語で書かれたプログラムの例
#include <stdio.h>

int main() {
  int i;
  for (i = 0; i < 5; i++) {
    printf("Hello World!\n");
  }
}
Diagram

このソースコードからコンパイラによって作成された実行ファイルの内容の一部を,16進数を用いて以下に示す.

55 48 89 E5 48 83 EC 10 C7 45 FC 00 00 00 00 C7
45 F8 00 00 00 00 83 7D F8 05 0F 8D 1F 00 00 00
48 8D 3D 43 00 00 00 B0 00 E8 1A 00 00 00 89 45
F4 8B 45 F8 83 C0 01 89 45 F8 E9 D7 FF FF FF 8B

実行ファイルの内容は,通常,コンピュータが理解しやすいフォーマットとなっている.これを 機械語(マシン語) と呼び,一見,単なる数値となっていることがわかる.

ファイルシステム

OSやアプリケーションプログラムの実行には,非常に多くの実行ファイルやデータファイルが必要となる.ファイルシステムとは,多数のファイルを効率よく管理するための階層構造を実現するシステムである.WindowsではNTFSやFAT32,macOSではAPFSやHFS,Linuxではext4やxfsなどが使われている.

ディレクトリ(フォルダ)

あらゆるファイルは,ディレクトリ(Windowsではフォルダ)と呼ばれる階層構造に格納される.ディレクトリ自身も階層構造を取っており,最上位のディレクトリはルート(root)ディレクトリと呼ばれる.Windowsでは,複数のディスクにはそれぞれことなるドライブレター(C:からZ:)が付与されており,それぞれのドライブの最上位フォルダを\(日本語OSでは¥)で表す.以下,ディレクトリとフォルダは同じ意味を指す.Windowsにおける例を図 1に示す.

Windowsにおけるフォルダの階層構造例
図 1. Windowsにおけるフォルダの階層構造例

パス(PATH)

図 1において,今User1というフォルダを閲覧したいとしよう.このとき,ファイルシステム上でのUser1フォルダの位置をパスという.パスを指定する方法として,絶対パス指定と相対パス指定という2つの方法がある.

絶対パス指定

ルートから,目的のフォルダに至る道筋を記述する方法.ここでは,C:\Users\User1\となる.コマンドプロンプトやPowerShellなどのシェルにおいて,

cd C:\Users\Users1\

と入力することで当該フォルダへ移動できる.

相対パス指定

現在閲覧中のフォルダ(カレントディレクトリ/フォルダという)からの道筋を記述する方法.このとき.はカレントディレクトリを意味し,..はカレントディレクトリの一つ上位のディレクトリを指す.例えば,図図 1において,カレントディレクトリがApp2であるとすると,そこからUser1を指す相対パス指定は,..\Users\User1となる.また,カレントディレクトリがUsersであるとすると,そこからUser1を指す相対パス指定は,.\User1となる.

カレントディレクトリがApp2であるときに,User1へ相対パスを使って移動するには

cd ..\Users\Users1\

と入力する.

GUIとCUI

コンピュータと人間の間には,ユーザーインターフェース(User Interface)が存在する.マウスなどのポインティングデバイスを用いてウインドウ内に表示されたファイルやフォルダなどを操作するインターフェースを, Graphical UserInterface(GUI) と呼ぶ.これに対して,キーボードからのコマンド入力によって,ファイルやフォルダなどを操作するインターフェースを, Character User Interface(CUI) と呼ぶ.GUIによるファイル操作では,上述のパスなどの概念の必要性が理解できないかもしれない.Windowsではコマンドプロンプトと呼ばれるプログラムを実行すると,CUIによる操作が可能となる.CUIにおけるファイル操作では絶対パス・相対パスの理解がほぼ必須である.

統合開発環境

歴史的に,プログラム開発はCUIを基本としてきたが,プログラムの規模が大きくなり,その目的が多様化するにつれ,統合開発環境(Integrated Development Environment:IDE)を利用することが主流となっている.IDEとは,GUIの利点をプログラム開発にも導入した環境であり,ソースコードの記述はもちろんのこと,コンパイルプログラムの起動などがGUIによって操作できる.さらにプログラムのエラーを発見し修正する作業(デバッグという)や,コードの入力を支援する機能が備わっているため,開発者はプログラムの記述そのものに注力することができる.

代表的なIDEとして,Visual Studio, Xcode, Eclipseなどが知られている.本講義で用いるVisual Studio Codeはエディタであり,拡張機能をインストールし,コンパイラ等のインストールを行えばIDEのように利用することができる.