3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

セミコロン;👀🤔:「やほーまた君のコードを邪魔しに来たよ!」(;;)

Posted at

~ただ「動くコード」で満足していませんか?~

こんにちは、しゅんです。
今回は、「セミコロン(;)」をテーマに、ちょっとポエムっぽく、でもハードウェアの裏側まで掘り下げていく記事を書きました。

ハードウェアの知識が必要な理由第3弾!

最後まで読んでいただけると嬉しいです!

はじめに

プログラミングを始めた頃、
「セミコロンを忘れたらエラーになる」という小さな挫折を、誰もが経験したと思います。

「たったこれだけで怒るの?」
「コードの意味はちゃんと伝わってるのに!」

でも、
本当にそうでしょうか?
セミコロンがないと、どれだけ裏で大きな問題が起きるのか
一緒に見ていきましょう。

セミコロンって何者?

遠いようでいて、すぐ目の前にある

image.png

image.png

ネット上ではこのように山ほどmemeが存在しています。

冗談は置いといて、まず知識の確認です。

  • C言語、Java、C++、JavaScript……
    多くの言語では「命令の終わり」を明示するためにセミコロンが使われます。
  • Pythonなどでは改行やインデントで区切るため、省略できる文化もあります。

つまり、セミコロンは人間のためではなく、コンピュータ(正確にはコンパイラとCPU)のために存在するのです。

インタプリタとコンパイラの違い

インタプリタ型(Pythonなど) コンパイラ型(Cなど)
実行方法 1行ずつ読みながらその場で実行 全体を一括で読んで変換
文の区切り インデントや改行で推測できる 明示的な区切りが必須

Pythonはインタプリタが人間のように空気を読んでくれますが、
C言語のコンパイラは空気を読めない
一文字一文字、厳密に意味を持たせないとダメです。

このときセミコロンは、
「ここで1つの命令が完結したよ!」という目印になります。

セミコロンがないと、裏では何が起きるのか?

ここからが本題です。
単なる文法ミスに見えるセミコロン忘れ、
実はコンパイル以降で深刻な問題を引き起こします。

1. コンパイル段階で命令がぐちゃぐちゃになる

C言語では、文の終わりがわからないと正しく機械語を生成できません

例えば、こんなコードを書いたとします。

int a = 3
int b = 5;

セミコロンが1個足りないだけで、コンパイラはこう解釈しようとします。

「int a = 3 int b = 5」

つまり、

  • 変数定義なのか
  • 代入なのか
  • 複数の命令なのか

がまったくわからない。

結果として、コンパイラは命令列を正常に組み立てられず、エラーを出して止まります。
(これが最初の防波堤)

2. もしコンパイラが甘かったら?(詳細版)

現実のコンパイラは、セミコロンがないと即エラーを出します
でも、もし仮に、コンパイラがこういう仕様だったらどうなるでしょう?

「まあ、セミコロンないけど、たぶんこのへんで区切れてるっしょ?ヨシ!」

……そんな"空気を読むコンパイラ"だったら、確かに楽かもしれません。
でも、その裏ではとんでもない悲劇が起きます。

コンパイラの本当の仕事

コンパイラは、知っての通りプログラムを機械語に変換する「翻訳機」です。
でもこれは単なる文字置き換えではありません。

例えば、C言語のこのコード:

int a = 5;
int b = 7;
int c = a + b;

これをコンパイラは次のように「機械に優しい指示書」に変換していきます。

  1. a用のメモリを確保 → 5を格納
  2. b用のメモリを確保 → 7を格納
  3. aとbを取り出して足し算 → 結果をcに格納

このプロセスで一番大事なことは、
「どこまでが一つの命令なのかを厳密に理解する」ことです。

もしセミコロンがなかったら、

  • 「int a = 5 int b = 7」と読んでしまう
  • 「aに5を入れる」+「bを宣言する」という別々の命令がごっちゃになる
  • 結果、間違ったメモリアドレスにデータを書き込んでしまう

例えば、

  • a用のメモリの後に、b用のメモリを確保するはずが、
  • aの領域にbの値を上書きしてしまうとか。

この時点で、プログラムのデータ整合性は完全に崩壊します。
コンパイラが「甘かった」だけで、プログラム全体がバグだらけになる。

実例:セミコロンなしの「破壊的コンパイル」

例えば本来こういう機械語にしたかったとします(仮想的な命令で表現します):

アセンブリ命令 意味
MOV R1, #5 レジスタR1に5を格納
MOV R2, #7 レジスタR2に7を格納
ADD R3, R1, R2 R1とR2を足してR3に格納

でも、セミコロンなしで読み間違えると:

アセンブリ命令 意味
MOV R1, #5MOV R2, #7 ???意味不明
  • 一行目から命令が壊れている
  • CPUは「MOV R1, #5MOV」という命令を持たないので即エラー(不正命令例外)

つまり、
コンパイラがちょっと甘くなっただけで、プログラムは「即死」するレベルで壊れるのです。

3. CPU目線で見る「セミコロンなしの世界」

さて、さらにその先。
もし間違った命令列がコンパイルされ、CPUに渡されてしまったら──?

CPUの立場で見てみましょう。

CPUの動作サイクル

CPUは、非常にシンプルなループを回し続けています。

  1. Fetch(命令を取り出す)
  2. Decode(命令を解読する)
  3. Execute(実行する)
  4. Writeback(結果を書き戻す)

これを数GHz(1秒間に数十億回)の速さでひたすら繰り返しています。

そして、
1命令=意味がきちんと定義された正しいビット列でなければなりません。

セミコロンなしの世界で起こること

もし命令が正しく区切られていなかったら、

  • Fetch → 変な途中までのビット列を取ってくる
  • Decode → 命令の意味がわからない(未知のオペコード)
  • CPU内部で「未定義命令例外(Undefined Instruction Exception)」が発生
  • OSが割り込み(Interrupt)で止めに入るか、最悪システムクラッシュ

という流れになります。

さらに悪い場合、
「たまたま未定義命令が正常命令っぽく読めてしまう」と、
完全に予期しない動作(メモリ破壊・ジャンプ暴走)が発生する危険もあります。

例:

  • 本当はint a = 5; だったはずが
  • 途中まで壊れた命令を読み込んで
  • 違うメモリアドレスを操作
  • システムの大事な設定領域(OSカーネル)を書き換えてしまう
  • → OSクラッシュ or セキュリティホール発生

つまりセミコロンがなかっただけで、
ハードウェア全体に影響を及ぼすバグや脆弱性の温床になるのです。

小さなセミコロンが、世界を守っている

  • コンパイラが「きちんと意味を区切る」
  • CPUが「正しく1命令ずつ処理する」
  • システムが「安定して動作し続ける」

このすべての流れを支えているのが、
たった一文字、セミコロン(;)。

僕たちは、
セミコロン一つ一つに、
コンパイラとCPUとOS、そしてコンピュータそのものからの信頼が託されていることを、
忘れてはいけないのかもしれません。

最後に

この記事も、私自身の思考を整理し、GPTのサポートを受けながら作成しました。
単なるコードの記号に見える「セミコロン」にも、実は深い意味があり、
そして結局はハードウェアとも繋がっているということを、どうしても伝えたかったのです。

もし少しでも共感してもらえたなら、とても嬉しいです。

そして、
もし今、この記事にたまたま辿り着いた初心者の方がいるなら。

セミコロンエラーで心が折れそうになったとき、
(;;)」と泣き顔になっても、
どうか、面白いコードの人生を諦めないでください。

セミコロンも、君の成長をそっと応援しているから。

最後まで読んでくれて、本当にありがとうございました!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?