42Seoulの開浦クラスターで、ふとLinux、Dart、Flutterなど多くのプロジェクトをオープンソースと呼んでいるけれど、ではC言語もオープンソースなのかという疑問が湧きました。
調べてみると、C言語はソフトウェアではありませんでした。そのためオープンソースというよりは定義された標準でした。そのため、さまざまなコンパイラが具体的に実装され、定義された標準に準拠しながらCコンパイラのオープンソースが増えていきました。例)GCC、MSVC
C言語は言語のための「標準」だけを指していました。誰かが所有できるものではなく、誰もが使える言語でした。この標準を使ってコンパイラやインタプリタを開発することは誰でも可能でした。しかし、コンピュータを知らない人や少人数では言語を作ることは容易なことではなかったでしょう。
C言語とは何か?#

C言語はプログラムが実行されるために従うべきルールを基準に.cファイル形式で記述されます。書かれたソースコードは人間だけが理解でき、コンピュータが直接理解できるものではありません。コンピュータが理解できるようにソースコードを機械語に変換する過程が必要で、この過程でコンパイラというツールが不可欠です。
コンパイル過程ではソースコードの文法エラーを検査し、そのファイルがコンピュータで実行可能な状態に変換されます。
- プリプロセッサによるコード前処理の実行
- コンパイラが前処理されたファイルを機械語に変換してオブジェクトファイルを生成
- リンカがオブジェクトファイルと必要なスタートアップコードなどを結合して最終実行ファイルを生成
C言語のコンパイラはなぜ多様なのか?
C言語はさまざまなOSやハードウェアで使用されるため、各環境に最適化されたコンパイラが必要でした。
さまざまな要求や性能、機能に合わせて異なるコンパイラが開発され、オープンソースコンパイラはコミュニティで自由に修正・配布されて特定の機能や環境に合わせた多様なバージョンが派生しました。
コンパイル過程#
コンパイル過程は複数の段階で構成されています。これをgccコマンドで段階ごとに確認できます。
- 前処理:
gcc -E main.c -o main.i
プリプロセッサは#include、#defineなどの前処理命令を解釈し、コードで必要な外部ファイルとマクロを処理して前処理済みファイルを生成します - コンパイル:
gcc -S main.i -o main.s
前処理済みファイルをアセンブリ言語に変換します。アセンブリ言語は特定のハードウェアで実行できるように変換されたコードの中間形態です - アセンブル:
gcc -c main.s -o main.o
アセンブリコードを機械語に変換してオブジェクトファイル(.o)を生成します - リンク:
gcc main.o -o main.exe
リンカはオブジェクトファイルをStartupコードなどと結合して実行ファイルを作ります。Startupコードはプログラム実行前に必要な準備作業を行い、main()関数を呼び出す役割を果たします。
Where focus goes, energy flows.
— Tony Robbins