ソースコードと実行ファイル
テキストファイルをソフトウェアに変換する
ソースコードとは、プログラミング言語の文法に従い、実現したい機能が記述されたファイルのことであると説明しました。
ソースコードの中身はただのテキストファイルで、普通のテキストエディタ(メモ帳とか)で開いて中身を確認、編集することができます。
しかし、この状態のままでは「テキストファイル内に書かれている文字を読む」以外に使い道はありません。
一方で、電卓ソフト等のプログラムファイルはテキストエディタで開いたり編集したりすることはできません。
無理やり開いてみても訳のわからない記号みたいなものが羅列されているだけです。
その代わり、電卓ソフトを起動すると電卓として使うことができます。
ソースコードはプログラムになる「元」であり、それ自体はプログラムとして実行する事は出来ません。
人間が読める形のソースを、コンピューターが読める(理解出来る)形のプログラムファイルに変換する必要があります。
コンパイル
ソースコードを実際に動くプログラムに変換する作業をコンパイルといいます。
コンパイルをする為のプログラムをコンパイラといいます。
ソースコードをコンパイラに読み込ませることで、実際にパソコン上で動くプログラムが生成されます。
ダブルクリック等で起動出来る状態になったプログラムを実行ファイルといいます。
Windowsでは、拡張子「.exe」のファイルが実行ファイルです。
リンク
実は上記の文章は実際の作業をちょっと省略して説明しています。
ソースコードをコンパイラに通すことで出力されるのは実はオブジェクトファイルとかオブジェクトコードと呼ばれるもので、この状態ではまだプログラムとして実行することはできません。
複数のオブジェクトファイルや必要なライブラリ(様々な機能を提供するプログラム)を結合して最終的に実行ファイルが作られます。
この作業をリンクといい、リンク処理を行うプログラムをリンカといいます。
コンパイルやリンク作業は手動で行うこともできますが、最近ではソフトウェアの開発ソフト(開発環境)が自動で行ってくれることが多く、意識することは少なくなっています。
共有ライブラリ
ソースコードをコンパイルして作られるのは実行ファイルだけではありません。
共有ライブラリという種類のファイルも同様の手順で作成されます。
共有ライブラリはプログラムに特定の処理を提供するファイルです。
WindowsではDLLファイル、Mac(UNIX)ではSOファイルと呼ばれます。
共有ライブラリは、それを使用する実行ファイルを起動させると自動的に読み込まれます。
プログラムは共有ライブラリが提供する機能を利用することができるようになります。
実行ファイルに共有ライブラリの機能を組み込んでしまうことは可能です。
わざわざファイルを分離するメリットは、機能をほかの実行ファイルと「共有」できることです。
例えば画面上に画像を表示する処理を作ったとします。
この機能を搭載したソフトウェアを普通に実行ファルとして作成すると、次に作るソフトウェアで同じ機能を実現したい場合は、再度その処理を実行ファイルに組み込む必要があります。
同じ処理を何度も書くのは手間ですし、実行ファイルの容量は無駄に大きくなりますし、機能を修正したい場合には複数の実行ファイルを修正せねばならず非常に面倒です。
しかし共有ライブラリとして分離しておけば、複数の実行ファイルから同じ機能を利用できるようになります。
機能の修正も共有ライブラリをひとつ修正するだけで済みますし、実行ファイル毎に組み込んでいた処理は省かれるので容量も削減できます。
新しいプログラムを作る場合も過去に作った機能を再利用しやすくなります。
(ただし修正によって動作を変更すると、その共有ライブラリを利用しているプログラムが正しく動かなくなるおそれもあります)
プログラミングを始めたばかりの初心者の人は自分で共有ライブラリを作成することはほとんどないでしょうけれど、こういうものがあるということは知っておいてください。
作ることはなくても、使うことはしょっちゅうあります。
バイナリ
ソースコードはただのテキストファイルで、テキストエディタさえあれば中身を読む読むことができます。
(もちろんそのプログラミング言語を理解しないと何をやっているかは理解できませんが)
それに対して実行ファイルはテキストエディタでは開けませんし、無理やり開いてみてもまともに読める形ではありません。
実行ファイルの正体は二進数の羅列です。
コンピューターというのは二進数しか扱えないのでこのような形式にする必要があるのです。
二進数化、あるいは二進数化されたファイルのことをバイナリ(バイナリファイル)といいます。
(binary=二値、二進数)
ソースコードはコンパイルによってバイナリファイル化されますが、これはもちろん単に文字列を二進数に置き換える作業ではありません。
テキストファイルも内部的には二進数で表現されているのでこれもバイナリと呼ぶことはできますが、プログラミングの世界ではテキストデータとバイナリデータは別のものとして用いられています。
人間が読める形式のものをテキストデータ、それ以外のものをバイナリデータと呼びます。
実行ファイルのほか、音楽や写真のデータなどもバイナリデータです。
バイナリファイルはテキストエディタでは開くことはできませんが、バイナリエディタと呼ばれるプログラムを使用すれば中身を確認したり編集することができます。
といっても、これも人間が見て素直に理解できるものではなく、0と1の並びを確認できるといった程度です。
ちなみに、ほとんどのバイナリエディタは二進数を十六進数表記に変換して表示します。
インタプリタ(インタプリタ言語)
ソースコードファイルはただのテキストファイルですが、これをコンパイルすることでバイナリ形式に変換し、プログラムとして実行できるようになります。
ソースコードはプログラムとして直接実行できないと説明しましたが、直接実行できる(ように見える)ものも存在します。
それがインタプリタです。
上で説明したコンパイル型の言語は、ソースコードをバイナリ形式(実行ファイル形式)に変換してから、実行ファイルを起動します。
インタプリタ型の言語は、ソースコードに書かれている命令を一行ずつコンピューターが読み込みながらプログラムを実行します。
(実際にはインタプリタにも複数の実行方法が存在します)
ソースコードをバイナリ形式に変換することなくプログラムが実行できるので、インタプリタ型の言語はお手軽なプログラミング言語と言われます。
コンピューターは二進数しか理解できないので、実際にはプログラムの実行時に自動的にコンパイル作業が行われています。
あらかじめ二進数に変換しておくコンパイル形式に比べて、実行時にコンパイル作業が行われるためインタプリタ型は実行速度がやや劣ります。
ただ、最近の高速なパソコンではあまり違いはありません。