Perlのエラーメッセージのコーナー。
Perlのエラーメッセージが表示される最小のプログラムを書いて、どういうときにどう怒られるかを研究する。
今回は
%s had compilation errors

を研究する。

これは、

(主語S):%s
(動詞V):had
(目的語O): compilation errors

という第2文型の文で、

(主語S):%s
(動詞V):にはあった
(補語C):コンパイルエラーが

という意味になる。
%sにはコンパイルエラーがあった

という訳になる。


プログラミング言語には2種類ある。
コンパイルをするものとコンパイルをしないものである。

compileという動詞はコンピューターの技術書では翻訳すると訳されるが、普通に英日翻訳とか言う時はtranslateを使うだろう。
英和辞書でcompileという動詞を引くと、堆積する、集める、編集すると書かれている。
歴史を一冊の本にまとめる、という感じである。

コンピューターの世界ではソースコードを実行形式(バイナリー)に変換することである。

コンパイルが必要なプログラミング言語にはC、Java、C#などがある。
これらはまずソースコード、つまり人間に読める形式のテキストファイルでプログラムを書き、それをコンパイルして実行形式に変換する。
Windowsでは実行形式はMZ形式と言われ、.exeという拡張子がついている。

最も有名なソースコードは「プログラム言語 C」に書かれた以下のようなものであろう。
#include

int main(void)
{
  printf("Hello, world!\n");
 return 0;
}
で、これをCコンパイラーというプログラムに掛けて実行形式を得る。
以下はWindowsの「メモ帳」アプリケーションの実行形式ファイルnotepad.exeを「メモ帳」アプリケーションでムリヤリ開いてみたものである。

20140319notepad

わけがわからない。
これは機械が解釈するために最適化されたバイナリーファイルで、人間が読むためのものではない。
と、思うが、最初にMZと書いている。
これはマジックナンバーと言って、バイナリーファイルであっても最初を見れば何のファイルか分かるようになっている。
MZは.exeファイルのマジックナンバーで、Mark Zbikowskiという人名から来ている。

ということで、C言語の場合、開発から実行までに以下のような過程をたどる。

 ソースコード(テキストファイル。拡張子.c)
  =Cコンパイラー=>
   実行形式ファイル(バイナリーファイル。拡張子.exe)

「メモ帳」アプリケーションの場合ソースコードはMicrosoftという会社がどっかに秘密に保管していると思われる。
消費者がお金を出して買うことが出来るのは.exeファイルだけである。
.exeファイルはOS(メモ帳の場合はWindows)が解釈して実行する。
LinuxやPerlのようなオープンソースソフトウェアの場合は実行形式と同時にソフトウェアが配布されるので、自由に改造することができる。

CコンパイラーもC言語で書かれたプログラムであるから、最初のCコンパイラーはどうやって作ったのか不思議な感じがする。
最初は手で機械語(アセンブリ言語)を打ち込んで最小の原始的な言語を作り、その言語を使ってもうちょっと高級な言語を作り・・・という風にして来たそうだ。
これをブートストラップ工法という。

建設中のビルの屋上には巨大なクレーンが付いているが、あれはビルの完成後どうやって屋上から下ろすのだろうか。
それは、もうちょっと小さいクレーンを巨大なクレーンで持ち上げて、そのクレーンを使って巨大なクレーンを下ろすそうだ。
そしてその小さめなクレーンをもうちょっと小さなクレーンで持ち上げる。
最終的にエレベーターに入るぐらいの手巻きのウインチに到達するという。
これもブートストラップ工法という。

こんな無駄話だったらいくらでも書ける。

さて、コンパイルが必要ない言語もあって、BASICがそうである。
BASICは1行1行の命令をインタプリター(interpreter 翻訳者)というプログラムが解釈実行する。
よって、最初にコンパイルを行わなくてもいきなり実行できるが、1行1行の実行が遅くなる。

ではPerlはどうだろうか。
Perlのスクリプトは、Perlエンジンと言われる、Perlのスクリプト(プログラム)を解釈するプログラムに渡される。
Windowsの場合はperl.exe、UNIXの場合はperlである。
言語名はPerlと大文字始まりなのに、Perlエンジンのファイル名はperlと小文字始まりなのに注意されたい。

PerlエンジンはまずPerlのスクリプトを中間コード(バイトコード)というバイナリーに解釈変換して、バイトコードをコンピューターのメモリーにキャッシュする。
で、キャッシュした中間コードを1行1行実行する。
ということで、コンパイルが必要なスクリプト言語である。
これをランタイムコンパイルという。

Perlエンジンのコンパイル速度は実用上非常に速く、あまり中間コードを保管してとっておく必要がない。
ソースコードと実行形式を別々に管理する手間がむしろ面倒なのである。
しかしCGI掲示板のように、Perlのプログラムを不特定多数の人が公開されたサーバーで使う場合は、この初期コンパイルに使われる時間(オーバーヘッド)が問題になる。
この場合はmod_perlというものを使って、一度解釈されたバイトコードをキャッシュして使う。
これで劇的に速くなる。

さて、このエラーを起こしてみよう。
コンパイルエラーの最も多くはセミコロンの打ち忘れで起きる。
#! /usr/local/bin/perl

print "Hello!\n"
print "I am Perl!\n"
ところがこのスクリプトを実行すると、微妙に違うメッセージが表示される。
[perl]$ helloPerl.pl
syntax error at /Users/query1000/perl/helloPerl.pl line 4, near "print"
Execution of /Users/query1000/perl/helloPerl.pl aborted due to compilation errors.
[perl]$


今回の「〜had compilation errors」というメッセージは、perlコマンドに-cオプションを渡した時に起きる。
#! /usr/local/bin/perl -c

print "Hello!\n"
print "I am Perl!\n"
これで以下のようなメッセージが出る。
[perl]$ helloPerl.pl
syntax error at /Users/query1000/perl/helloPerl.pl line 4, near "print"
/Users/query1000/perl/helloPerl.pl had compilation errors.
[perl]$
では-cオプションは何かというと、スクリプトのコンパイルだけを行い、実行はしないオプションである。

このプログラムを直すには文の末尾にセミコロン(;)を入れる。
#! /usr/local/bin/perl -c

print "Hello!\n";
print "I am Perl!\n";
実行してみる。
[perl]$ helloPerl.pl
/Users/query1000/perl/helloPerl.pl syntax OK
[perl]$
-cオプションを渡していたのでsyntax OK(文法的にはオッケーだ)というメッセージだけが出て実行はされない。
-cを除く。
#! /usr/local/bin/perl

print "Hello!\n";
print "I am Perl!\n";
実行してみる。
[perl]$ helloPerl.pl
Hello!
I am Perl!
[perl]$
できたね。
ちなみにセミコロン(;)は文の区切りに入れるものなので、1個目は必要だが2個目は必要ではない。
でも、いつ文を下に足したくなるかわからないから、不要でも入れる方が良い。
入れすぎる分にはかまわない。

なお、Perlのエラーはコンパイルエラーの他に実行時エラーもある。
ゼロによる割り算のように、実行時になるまで起きるかどうかわからないエラーは実行時エラーになる。

Perlの話からまた離れるが、compilationは動詞compileの名詞形で、コンピレーションと読む。
良く「70年代ディスコ決定版」のようなオムニバスアルバムのことをコンピレーションアルバムという。

日本語ではコンパイルという言葉を名詞としても動詞としても使う。
「コンパイルがうまくいかない」は英語では「compilation cannot be done」である。

逆に、動詞であっても名詞形を使う言葉がコミュニケーション(communication)である。
「彼とうまくコミュニケーションが出来ない」は英語では「I cannot communicate with him well.」というが「彼とコミュニケイトできない」という人はあまりいない。

日本語において、この違いはあまり厳密ではないらしい。
テニスのサーブ、サービスなどは動詞と名詞を両方使う。

CdM, intaglio di giulia, figlia di tito, seconda metà del I secolo dc., acquamarina firmata da Evodos, montatura carolingia (IX sec.) con 9 zaffiri e 6 perle