インタプリタ

『初めてのRubyトークイベントの動画を見ていたら、Yuguiさんという人が、「Perl初心者の頃、後の方にある処理にエラーがあると前の方にある処理が実行されないところでつまづいた」というような発言をしていた。『初めてのRuby』では、そういうところを解説しているらしい。なるほど確かに、Pythonでもそういうことを解説している記事を見たことがない。


これはもちろん、一度バイトコードコンパイルして、バイトコードインタプリタで実行しているためで、コンパイル時にエラーを検出している。Pythonも同様で以下の場合、コンパイル時にエラーが起こるので実行までしておらず、1が表示される前に落ちる。

# test.py
print 1
pirnt 2
C:\>python test.py
  File "test.py", line 3
    pirnt 2
          ^
SyntaxError: invalid syntax


Pythonで同一ブロック内で、途中で参照している変数を変えるとコンパイル時にエラーが発生する問題も、Perlであれば以下のように問題ない。

# test.pl
$x = 99;

sub foo {
    print "$x\n";
    my $x = 2;
    print "$x\n";
}

&foo;
# 実行結果
99
2

Pythonで上記のような処理がエラーになるのは、Pythonがレキシカルスコープだからではなく、単に同一ブロックの変数は途中で参照先を変更してはいけないというルールがあるからだと思われる。この部分をきちんと理解してツッコミ入れてくれる人いないかな?


結局、『初めてのRuby』は、ALGOL系のプログラミングを理解している人がRubyをゼロから理解するために書いたらしく、こういうコンセプトは好きなので購入することにした。


ifとは、forとはなどの「プログラミングの基礎」という要素と、「Rubyで実現する方法」や「初心者がつまずきやすい所」という要素を見事に分離し、「プログラミング基礎」の内容を割愛しているところがすばらしい。


私は、「プログラミング一般」の知識は載せても良いと思っている。例えば、破壊的メソッドやDRY原則などの用語はRubyから来ていると思うし、Perlのダイナミックスコープやメソッドのlookupの方法などPerl特有の機能などは、Pythonのみを勉強している人には気づかない。しかし、あまりこういう知識を載せすぎると、どこまで載せるかという問題や、余計な情報が多くなり混乱の元になるケースもあるので、難しいところではあると思う。