こんにちは、ナナです。
本記事では、皆さんが作成したソースコードから「実行ファイル」を製作するための、第2ステップである「コンパイラ」に焦点を当てます。
C言語を学ぶというと、「文法」や「アルゴリズム」といったものが、大切であると感じるかもしれません。
しかし、おろそかにしてはいけないのが、C言語というプログラミング言語を成立させているツールである「コンパイラ」についてです。
「コンパイラ」について詳しくなるということは、C言語が如何に成立しているのかを知ることと等しく、その原理を知ることでより深くC言語を学べるのです。
ビルドエラーが取り除けない、という悩みは「コンパイラ」に対する知識が不足しているからなのです。
本記事では次の疑問点を解消する内容となっています。
では、「コンパイラ」の役割を学んでいきましょう。
第1ステップである「プリプロセッサ」について知りたい方は、次の記事を参考にしてください。
コンパイラ 役割と機能
押忍!今日もやってきたっす。講義内容は「コンパイラ」っすね。知ってるっす。あれっすね、あれが、あれするやつっすね…。
うん、知らないよね。「コンパイラ」の主な仕事は、みんなが作ったプログラムの間違いを見つける校正作業と、コンピュータが理解できる形に変換する翻訳作業の2つだよ。
じゃあ、コンパイラについて学んでいこうね。
「コンパイラ」とは「翻訳者」という意味です。コンパイラの仕事内容を見てみましょう。
製作工程におけるコンパイラの位置づけ
作家が執筆した「原稿」に対して、編集者が整理・調整した原稿のことを「ゲラ」と呼ぶそうです。ゲラは次の工程である「校正」へと渡され、誤記や言い回しなどを厳しくチェックされます。
書籍出版の製作工程
この「校正・翻訳」の作業を、プログラムの製作工程で行うのが「コンパイラ」の仕事です。
プログラムの製作工程
プリプロセッサが編集した「前処理済みソースファイル」は、コンパイラによって次の段階へと変化していきます。
プリプロセッサは「ゲラ」に相当する「前処理済みソースファイル」を提供してくれます。コンパイラはそれを受け取って、さらに加工していくんです。
コンパイラの仕事内容
コンパイラが担う大きな仕事は次の2つです。
この2つの仕事は最初に校正、次に翻訳の順番で実施されます。
間違いがあった文章を翻訳しても意味がないですよね。
だから、最初に校正によって間違いを正すんです。そして、間違いがなくなったら翻訳をするんです。
コンパイラ 仕事の流儀:些細なミスも見逃さない!摘発する校正機能
押忍!自分は間違ったことが大嫌いっす。仲間が間違った道に進むのなら、自分が必ず止めて見せるっす。常にみんなのことを見てるっす。
君は、いいやつだね。僕もそんな友達が欲しかったよ。
「コンパイラ」も君と同じく正義感を持ったヤツなんだよ。みんなの作ったプログラムに間違いがあったら、遠慮なく指摘して正しい方向に導くんだよ。
皆さんもこれまでプログラミングをした際に、お世話になっていることでしょう。「ビルド」を実施した際にエラーメッセージが発生したことがありますね。
それは、コンパイラによる「校正」作業の結果、指摘されたメッセージ内容なのです。
コンパイラが指摘するコンパイルエラーとは
次のプログラムを皆さん見てください。どこかに誤りがあることに気がつきますか?
#include <stdio.h>
int main(void)
{
printf("Hello World")
return 0;
}
このプログラムを「ビルド」すると、結果として次のエラーが表示されます。
error C2143: 構文エラー: ';' が 'return' の前にありません。
このエラーのことを通称「コンパイルエラー」と呼び、プログラムのミスをコンパイラの「校正」機能が検出したことを示します。
このようにコンパイラは、皆さんに対する「赤ペン先生」として活躍しているのです。
もし、校正作業を人が実施しているのなら、大変申し訳ない気持ちになりますが、皆さんは安心してください。
コンパイラは皆さんが犯す間違いについて、どこまでも何回でも怒鳴ることもなく、冷静かつ的確に指導してくれます。ありがたや~。
私も長い開発経験の中で、いったいどれだけの数をコンパイラ先生に赤ペンを入れられたかわかりません。毎回指摘いただき感謝、感謝です。
本などの書籍の場合は、これを人がチェックしていると思うと頭が下がる思いです。校正・校閲担当の方はすごい能力ですね。
コンパイラが指摘するワーニングとは
コンパイラはエラー以外に「ワーニング」という警告を行うことがあります。
#include <stdio.h>
int main(void)
{
char num = 1000;
printf("%d", num);
return 0;
}
char型の変数は-128~127の範囲しか記憶できませんが、1000の値を代入しているためオーバーフローが発生します。そのため、次のワーニングが表示されます。
warning C4305: '初期化中': 'int' から 'char' へ切り詰めます。
ワーニングに対して無頓着な開発者も世の中にはいますが、決して無視してはいけません。
ワーニングは文章として間違いとは言えないが、怪しいから見直すべきというアドバイスです。せっかくコンパイラが指摘してくれているのですから、真摯に受け止めるべきなのです。
何回も警告されることを経験することで、自分の中に適切なプログラムパターンを刻み込むんです。そうすることで徐々に警告の数も減っていきます。
コンパイラの校正機能との付き合い方
コンパイラという担当は、時には皆さんに対して厳しくエラーやワーニングを指摘します。
しかし、
コンパイラの校正機能を敵だと思ってはいけません。皆さんの強力な味方がコンパイラなのです。
もしも、コンパイラから校正機能をなくしてしまったら、この世の中にどれほどの不具合が発生するか想像できません。それほど、この校正機能は不具合撲滅キャンペーンに大きく貢献しているのです。
コンパイラは皆さんの作ったプログラムの間違いを見つけてくれる「ちょっと厳しいけど親切な担当」なんです。
私はせっかく警告が出ていたのに、それを無視したために大きな問題に発展したケースを何度も見てきました。皆さんは決してそうなってはいけません。
コンパイルエラーとワーニングの取り除き方の鉄則
プログラムを作る工程において、ベテラン開発者といえどコンパイルエラーとワーニングは出してしまうものです。
その状況におけるベテランとビギナーの違いとは、エラーとワーニングを取り除くスピードです。ベテラン開発者は数多くの経験から、エラーの原因を瞬時に判断し問題を特定します。
このC言語入門カリキュラムを実施している方はプログラミング経験が浅い方なので、すぐにはエラーの原因を見つけられないことが多いでしょう。
しかし、経験が少ないからといって嘆いていても仕方ありません。大事なのは攻め方です。ベテラン開発者は、エラー要因をいち早く取り除くための「攻め方」を知っているのです。
まずは、エラーとワーニングが出た時にどのように対処していくのかを覚えましょう。
ここまで皆さんはプログラムを作る中でいくつかのビルドエラーを経験したことでしょう。
大量のエラーが発生し、あたふたしてしまったかもしれません。焦ることはありません、まずは落ち着いて鉄則通りに攻め落とします。
エラーと警告発生時の対処の鉄則
ビルドエラーと警告は、最初に検出された一番上の項目から順番に対処せよ!
コンパイラの校正作業は、プログラムの一番最初の行から下方にむけて順番にチェックします。
そのため、最初に検出したエラーやワーニングこそが、純粋に問題があると判定されたプログラムコードなのです。
2つ目以降のエラーは、1つ目のエラーが起因して発生することがあります。ですから2つ目以降のエラーを最初に取り除こうとすることは、無駄な時間を過ごすことになりかねません。
つまり、
対処方法としては「1つ目のエラーを直す」⇒「ビルドを実行する」⇒「1つ目のエラーを直す」⇒「ビルドを実行する」⇒・・・このように直しては「ビルド」を繰り返して取り除くのです。
統合開発環境では対象のエラーメッセージをダブルクリックすると、エラー/ワーニングの発生箇所にカーソルを移動させることができます。非常に便利な機能なので使ってみるとよいですよ。
コンパイラ 仕事の流儀:寸分違わぬ言語変換!完ぺきなる翻訳機能
お、押忍…。赤ペン先生に100個のエラーと警告の指摘を受けたっす。絶望の中なんとか合格の判定をようやく頂けたっす。なぜか目から水が流れ出てるっす! 夕日が眩しいっすねっ。
それはね、涙っていうんだよ。努力した時に流れる、涙という名の汗だね。
じゃあ、無事に校正が終わったら次は翻訳作業に入るよ。翻訳時にはもうエラーは出ないから安心してね。
校正作業が無事に終わったら、次は翻訳作業の工程に入ります。
コンパイラ それは言語を翻訳する者
コンパイラとは「翻訳する者」です。つまり、この翻訳作業こそがコンパイラの本質的な仕事であり、翻訳作業のことを「コンパイル」と呼びます。
コンパイラはC言語に限らず他の言語においても存在するため、C言語用のコンパイラのことを「Cコンパイラ」と呼ぶことがあります。
翻訳とは「ある言語で表現された文章の内容を、原文に即して他の言語に移しかえること」とされています。
CコンパイラはC言語で表現されたプログラムを、機械語と呼ばれるコンピュータが理解できる言語に移しかえます。
翻訳が必要となる理由
そもそも翻訳とは、「A」が理解している言語と「B」が理解している言語が異なるときに必要となります。皆さんが理解しているC言語は、コンピュータはそのままでは理解できません。
ここで、コンパイラという「翻訳者」を中継することで、指示内容を伝えられるようにします。
この言語を「機械語」と呼び、オブジェクトファイルというものに変換されます。
コンピュータの世界にも様々な言語圏があるという問題
私たちの世界においても、様々な国と言語が入り乱れていますね。
コンピュータといっても世の中にはいろいろな種類のコンピュータがあり、コンピュータ毎に理解できる機械語が異なります。
もし、皆さんが頑張って機械語Ⓐでプログラムをしても、CPUⒷとCPUⒸでは動かないのです。
皆さんが全てのCPUの機械語を覚えるということは、大変な労力であり現実的ではありません。特に組み込み開発者は様々なCPUを扱うことが多く、この問題は何とか解決せねばなりません。
ここで登場するのが「コンパイラ」です。
CPU毎に異なる機械語に翻訳する各コンパイラ
この世の中にコンパイラというツールは1つだけ存在するわけではありません。
コンパイラはCPU毎に異なるものが用意され、C言語のソースファイルを対象CPUの機械語に翻訳してくれます。
これにより皆さんはC言語を覚えるだけで、様々なCPUでプログラムを動かすことができるようになります。
CコンパイラがCPUの種類に応じて別のものが必要になりますが、ありがたいことにCコンパイラは多くのCPU向けに作られています。
そのため、C言語はほとんどの組み込み開発環境で使うことができるのです。
言語から言語への変換、それが翻訳です。コンパイラの翻訳は完ぺきなまでに正確に行われるんです。これって何気にすごいことですよ。
Q&A:コンパイラに関するよくある質問
コンパイラで困ってる人ここにおいでー!
Q:プログラムする度にエラーがたくさん出て泣きそうです…
押忍…はぁ。エラー、警告、エラー、警告、何回出してしまうんすかっ自分!
ビシッ、自分に活を入れたっす。甘えっす、自分への甘えが抜けきらないのが原因っすッ‼今日から糖分を禁止っす!
鼻血が出てるよ、拭こうね。まだまだ君はたくさんのコンパイルエラーやワーニングを経験すべき段階だよ。
それが悔しいのであれば、甘えを原因にするのではなくて、経験したエラーやワーニングに対してどんな対処ができるかを考えるべきだね。
コンパイルエラーはプログラミングの経験値が増えるほど、発生する確率は徐々に小さくなっていきます。開発経験が少ない人はあまり気にしないようにしましょう。
大事なことは一度起こしたコンパイルエラーの原因をしっかりと理解し、次に起こさないようにするにはどうしたらよいかと対策を講じることです。
しっかりとコンパイルエラーに向き合うことが、エラーの発生をおさえる特効薬です。
Q:コンパイルエラーが全然解決できません。何が間違っているのかさっぱりわかりません…
押忍、うぅ…。エラーの原因がさっぱりわかんないっす。何が悪いっていうんすかっ、全部見たっす、誰が何と言おうと合ってるっす!
うんうん、閉じ括弧がここに抜けてるね、ほらここ。「ポチッ」ほら、直ったね。まぁ落ち込むことないよー、よくあることだよー。ポンポン。
自分で記述したプログラムの間違いは、自分で書いているからこそなかなか間違いに気づきにくい面があります。
コンパイルエラーの対処法がまだ身についていない人は、周りに有識者がいれば積極的にアドバイスを求めとよいです。
エラーの解決に5分で済む人と1時間悩む人では、開発効率に雲泥の差が出てきます。
コンパイルエラーを出さないことも技術ですが、コンパイルエラーの原因をいち早く取り除ける技術はさらに大事な技術なのです。
コンパイラが出力したエラーメッセージを結構見ない人がいますが、ベテランの人からすると、それはあり得ないことです。
エラーメッセージは原因となる犯人を追い詰めるヒントなんです。目の前にヒントが落ちてるのに、それを見ない名探偵はいませんよね。
Q:エラーの指摘行を見ましたが、問題が見つかりません。指摘が間違っているんじゃないですか?
押忍(怒)!コンパイラがここがおかしいって言ってるっすけど、ここに絶対間違いはないっす!コンパイラが壊れたっす。修理するためにはどうしたらいいっすか?
落ち着こうね。確かにコンパイラもツールだから100%正しいってわけじゃないんだけど、コンパイラの指摘が間違っているってことは僕の経験上ではまずないんだよね。必ず君のプログラムに原因が潜んでいるよ。
原因がわからないと嘆くパターンとしてよくあるのが、エラー指摘行のすぐ上にエラー要因があるケースです。
対象行だけではなく1行前の処理も含めて処理を見直してみましょう。
初心者がよくやりがちなエラーが、これらの原因となるものです。
- セミコロン漏れ
- {}や()の整合が取れていない
- 変数定義を処理の後に書いてしまう
真っ先に疑ってみるとよいでしょう。
Q:ワーニングって直さなくてもプログラムは動きますよね?少しくらい残っていても問題ないですよね?
押ーー忍っ!ワーニング120個!もう嫌っす。ワーニングだからいいっす。動くっす。うぅ、でも自分の心が直せって言ってるっすよーーーっ!
自分自身との葛藤だね。120個も出たら僕もちょっと嫌になっちゃうかも。
でもね、放置した先には苦難の道が待ってるよ。僕ら開発者は未来の楽園を築くために、今を戦うべきなんだよ。だから、頑張りなよ。
残念ながらワーニングが放置されている開発環境は世の中にたくさんあります。
「割れ窓理論」というものがあり、ビルの窓が1つでも割れた状態で放置されると、どんどん窓が割れていき、状況がさらに悪化していく現象のことをいいます。
ワーニングの放置問題は、この問題と同じ理論が成り立ちます。
たくさんのワーニングが出ていると自分が新たに出してしまったワーニングも「まぁいっか」となってしまいます。
ワーニングは確かに大した警告でないものもあるのですが、非常に危険なものを警告してくれるものもあります。皆さんはワーニングを、放置しないようにしましょう。
警告を直さないのは今が楽になるだけで、将来高いツケを払うことになります。警告がたくさん出ていると、重要な警告とそうでない警告が交じり合って管理できなくなります。
だからこそ1つも発生させない、これがプロとしての意識です。