【第1回】C言語の第一歩:MacでClang環境を整えて printf() を動かしてみよう
1. はじめに:なぜ今、C言語からPHPを学ぼうと思ったのか?
普段のWeb開発で何気なく使っているPHPですが、その本体やエンジン部分であるZend EngineなどがC言語で実装されていると知り、今回の学習を始めるに至りました。
いざPHPの内部構造を深く知ろうと調べてみると、C言語をベースにしたPHPエンジン(Zend Engineなど)の仕組みに関する日本語での解説情報は、インターネット上に少ないと感じました。
そこで、「ないのであれば、自分でゼロからC言語を学びながら、PHPの低レイヤーの仕組みを紐解いていく過程を記事に残そう」と思い、この連載を始めることにしました。
今回はその第一歩として、Macで利用できるClang(C言語コンパイラ)を使い、最も基本的なC言語のプログラムである printf() を動かしてみます。
2. C言語のコンパイルの仕組み
C言語のプログラムを実際に動かすには、ソースコードをコンパイルして実行可能なプログラムへ変換する必要があります。
ここでは、C言語のソースコードがどのように実行されるのか、そしてMacで利用できるClangがどのような役割を持つのかを確認します。
C言語のソースコードをコンパイルする
C言語は、ソースコードをコンパイラによってコンピュータが実行できる形式へ変換してから実行します。
PHPやPythonなどのスクリプト言語とは実行までの流れが異なり、C言語ではまずコンパイルという工程を行います。
基本的な流れは次のとおりです。
C言語のソースコード(.c)
↓
Clang
↓
実行可能なプログラム
↓
実行
↓
プログラムの結果
このように、C言語ではソースコードをコンパイルして実行可能なプログラムを作ることが基本的な流れになります。
MacではClangを使ってコンパイルできる
Macでは、Xcode Command Line Toolsに含まれるClangを使ってC言語のプログラムをコンパイルできます。
ClangはC言語のソースコードを読み取り、Mac上で実行できるプログラムへ変換するコンパイラです。
そのため、今回の学習ではClangを使って、実際にC言語のソースコードをコンパイルしてみます。
最初のC言語プログラムを作成する
まずは hello.c というファイルを作成し、以下のコードを記述してみましょう。
#include <stdio.h>
int main(void) {
printf("Hello, SS-Infra!\n");
return 0;
}
このプログラムをコンパイルして実行すると、ターミナルに次のように表示されます。
Hello, SS-Infra!
このシンプルなプログラムを通して、C言語の基本的な構造と、ソースコードをコンパイルして実行するまでの流れを確認できます。
printf() で文字列を表示する
printf() は、ターミナルなどの標準出力へ文字列を表示するために使用する関数です。
今回のプログラムでは、
printf("Hello, SS-Infra!\n");
と記述することで、Hello, SS-Infra! という文字列を表示しています。
末尾の \n は改行を表します。
また、printf() を使用するためには、プログラムの先頭に、
#include <stdio.h>
と記述します。
stdio.h は、標準入出力に関する機能を利用するためのヘッダーファイルです。
3. C言語を学ぶメリットとPHPへの理解
C言語を学ぶことは、単に新しいプログラミング言語を覚えるだけではありません。
特にPHPの内部構造を理解したい場合、メモリ・データ型・ポインタ・コンパイルなどの低レイヤーの知識を身につけることが、PHPの仕組みをより深く理解する助けになります。
ここでは、今回C言語を学び始めることの意味を確認します。
低レイヤーの仕組みを理解する
C言語を学ぶことで、普段PHPなどの高水準な言語を使っているだけでは意識しにくい、コンピュータ内部の仕組みに触れることができます。
例えば、変数がどのようにメモリ上で扱われるのか、データ型によってどのような違いがあるのかといった仕組みを、より具体的に理解できるようになります。
こうした知識は、PHPの内部構造やZend Engineの仕組みを調べる際にも役立ちます。
PHPの「裏側」を理解するための土台になる
PHPを普段使っているだけでは、変数や関数などの機能が内部でどのように処理されているのかを意識する機会は多くありません。
しかし、PHPの処理系であるZend EngineなどはC言語をベースに実装されています。
そのため、C言語の基本を学ぶことで、将来的にPHPのソースコードや内部処理を読むための土台を作ることができます。
今回の printf() のような小さなプログラムから始め、少しずつ低レイヤーの知識を身につけていきます。
4. C言語を始めるときの注意点
C言語を書き始めるときには、ちょっとした記述ミスでもコンパイルエラーになることがあります。
特に初学者の場合は、セミコロンの付け忘れ・ヘッダーファイルの書き忘れ・エラーメッセージの確認不足などでつまずきやすいため、最初の段階で基本的な注意点を押さえておきましょう。
セミコロンの付け忘れに注意する
C言語では、文の末尾にセミコロン(;)を記述する必要があります。
例えば、次のコードでは printf() の行末にセミコロンがありません。
#include <stdio.h>
int main(void) {
printf("Hello World")
return 0;
}
この状態でコンパイルするとエラーになります。
正しくは、次のようにセミコロンを付けます。
#include <stdio.h>
int main(void) {
printf("Hello World");
return 0;
}
C言語では、このような小さな記述ミスでもコンパイルできなくなるため、文末のセミコロンを忘れないようにしましょう。
#include <stdio.h> を忘れない
printf() を使用する場合は、プログラムの先頭に、
#include <stdio.h>
を記述します。
stdio.h は、標準入出力に関する機能を利用するためのヘッダーファイルです。
printf() を使っているのに、この記述を忘れてしまうと、コンパイル時に問題が発生する原因になります。
C言語では、使用する機能に応じて必要なヘッダーファイルを適切に読み込むことが重要です。
コンパイルエラーが出たら行番号を確認する
C言語のプログラムをコンパイルした際にエラーが表示された場合は、まずエラーメッセージと行番号を確認しましょう。
例えば、
hello.c:4:30: error: expected ';' after expression
のようなエラーが表示された場合、hello.c の4行目付近に問題があることが分かります。
エラーが表示された行だけでなく、その直前の行に記述ミスがないかも確認すると、原因を見つけやすくなります。
エラーメッセージを怖がらず、「どのファイルの何行目で、どのような問題が発生しているのか」を確認する習慣を身につけましょう。
5. まとめと次回予告
今回は、PHPの内部を低レイヤーから理解するという目的のもと、MacのClang環境を使ってC言語の基本である printf() による出力と、コンパイルから実行までの流れを確認しました。
今回学んだ内容を整理すると、次のとおりです。
- C言語のソースコードは、Clangなどのコンパイラを使って実行可能なプログラムへ変換する
printf()を使うと、ターミナルに文字列を表示できる#include <stdio.h>はprintf()などの標準入出力機能を利用するために必要- C言語では、セミコロンなどの基本的な記述ルールが重要
- コンパイルエラーが発生した場合は、エラーメッセージや行番号を確認する
今回の内容を通して、C言語の「ソースコードを書く → コンパイルする → 実行する」という基本的な流れを体験できました。
次回は、C言語の基本データ型である整数や文字などがどのように扱われるのか、「データ型と変数」の仕組みに迫っていきます。
C言語の変数がどのようなデータを保持し、それがメモリとどのように関係しているのかを、実際のコードを動かしながら確認していきます。
【お役立ちツールのご案内】
C言語やPHPの学習を進める中で、ご自身の書いたコードや既存のプロジェクトにセキュリティ上のリスクや古い書き方(非推奨関数など)が混ざっていないか気になった際は、安全な字句解析(
token_get_all())で一括スキャンできる当サイトの PHPレガシーコードスキャナー もぜひご活用ください。