わたしの名はフレイ 作家・デザイナー見習い
神々とともに生きる詩人 一等星シリウスの導きを信じて

コンパイラ

コンパイラインタプリタ

コンパイラとは、プログラミング言語で書かれたソースコード機械語に翻訳するアプリケーション。一度のコンパイルで全てを機械語に変換する。

インタプリタとは、プログラミング言語を「動的に」読み込みながら、逐次機械語の命令に翻訳していくアプリケーション。

プログラムとライブラリ

UNIXにおいては、プログラムには二種類ある。それは「プログラム」と「ライブラリ」である。

main関数が含まれたプログラムには、実行命令が下ると即座にmain関数から実行を始める。多くのコマンドプログラムや自立したアプリケーションはこちらに当たる。

これに対して、main関数が含まれていないライブラリと呼ばれるプログラムは、それ単体では実行できない。

ライブラリは、別のプログラムから呼び出される形で実行される。

ライブラリは、さまざまなプログラムに点在する「呼び出し命令」に基づいて、プログラムの中で下請けの専門業者のように、必要なところで必要な時に実行される。

ライブラリやその呼び出し規約を「API」と呼ぶ。このAPIに基づいた命令によって、プログラムは「難しい機能でも簡単に呼び出せる」ようになり、たとえばCの標準APIが含まれるlibcや、X11APIが含まれるxlib、あるいはGTK+やQtのようなツールキットなど、さまざまな命令や機能を「自分のプログラムから呼び出したい」時に、こうしたAPIを使う。

ライブラリAPIを使うことで、全てのことを自分で作る必要はなく、ライブラリを呼び出す形で簡単に高度で複雑なプログラムを開発できる。

/binと/lib

/binディレクトリには、実行可能ファイルを置き、/libディレクトリには共有ライブラリ(*.so)を置くのが一般的。

また、/usr/binや/usr/libがある環境では、/binや/libにはシステムを起動し管理するための最低限のプログラムを置き、アプリケーションプログラムなどは/usr/binや/usr/libに置く。これにより、もし/usrディレクトリが破壊されても、/binや/libが残っていればシステムの復旧や最低限の管理を行うことができる。

/etc/ld.so.confとldconfig

/etc/ld.so.confは、共有ライブラリがどこにあるかを指定するパスが含まれた設定ファイルで、ldconfigはこの情報をOSに伝えるコマンド。

GCC

GCCは、様々な言語に対応しているが、フロントエンドでC、C++Objective-CFortran、Ada、Goをコンパイル出来る。中間コードで最適化処理(コードをもっと高速にする改変)を加えて、バックエンドでさまざまなCPUアーキテクチャに対応する。

GCCLLVM/Clangにとってかわられようとしている。

GNU make

GNU makeは、プログラムのソースコードコンパイルする時、更新されたファイルだけをコンパイルするなど、色んなことが出来ます。

Autotools

Autotoolsは、色んなプラットフォームでソフトウェアをコンパイルする時に自動で設定・処理してくれるGNUの仕組みですが、結構理解し辛いので嫌われています。

このコマンドを実行することで簡単にソフトウェアがインストール出来るのは、Autotoolsのおかげ:

./configure && make && make install

--prefix=dirでインストール先を変更できる。

国際化・地域化

gettextのような仕組みを用いることで、国際化と地域化が容易になる。

文字列に

printf(_("hoge is %s."), name);

と言うエイリアスをつけ、.poファイルでこのように翻訳出来る。

#: src/prog.c:20
msgid "hoge is %s."
msgstr "ほげとは%sである。"

テキストとバイナリ

僕は、UNIXのシステムを考える上で、「テキストのソースコード」と「機械語のバイナリ」が重要だと思います。

実際のところ、プログラミングを行う上でもシステムを管理する上でも、大切なのは「機械語のバイナリ」であり、同時に、バイナリから読み書きしたりバイナリの外部に保管したりするものは「テキストデータ」であり、バイナリのほとんどは「テキストデータが元にできている」ということです。

僕は、これを直観的に理解するために、Gentoo LinuxPortageを使ってみることをおすすめします。全てのプログラムがテキストからバイナリへと変換されていく過程が分かりますし、設定は全てテキストファイルを手動で編集します。Gentoo Linuxを触ることで、「UNIXのどの部分がテキストで、どの部分がバイナリで、どのようにテキストからバイナリが形成されていくか」が、目で見て分かるのです。システムの全てのファイルを最初から最後まで全て形成していく過程が、Gentoo Linuxのインストールによってしかと見れます。またマウントやフォーマットなどのUNIXに必須のスキルも、Gentooのインストールと設定を行うことで、管理することができるようになります。