hirax.net::inside out::2009年01月01日

最新記事(inside out)へ  |   年と月を指定して記事を読む(クリック!)

2008年12月 を読む << 2009年1月 を読む >> 2009年2月 を読む

2009-01-01[n年前へ]

「行く年」と「動的言語」と「来る年」と 

 12月31日から1月1日に日付が変わる頃、脈絡もなく、「人生」は「動的に色々なものが定まっていくプログラム」と似ているのかもしれない、とふと考えました。

 そのどちらも、実行前に何かが定まってしまうのではなく、その時その瞬間にさまざまなことが決まっていくように思います。そんな一行一行が積み重なり動いていくさまを、なぜか連想したのです。

 Rubyスクリプトを実行できる形に変換することができるRubyScript2Exeというものがあります。このRubyスクリプトは、他の(実行形式に変えたい)Rubyスクリプトを一行一行実行しながら逐次必要ファイル情報などを集めていき、さらにRubyインタプリタも内包させた上で、最終的に実行形式に変換する、というものです。

 こういった動作でアプリケーションが作られるということは、実行形式に変換する際のプログラムの動き次第で、最終的に作成される実行形式ファイルが違ったものになる、ということです。たとえば、こんなRubyスクリプトを作ってみます。

i=2008+rand(2)
if i>2008
  puts 'in case of '+i.to_s
  sleep 3
  require 'win32GuiTest'
  gui=Win32GuiTest.new
  # (中略)
else
  puts 'in case of '+i.to_s
  sleep 3
end
 RubyScript2Exeは、Rubyスクリプトを実行しながら、必要なものを逐次集めていきますから、実行形式作成時に1行目のiが2009になったとしたら、win32GuiTest.rb ライブラリが読み込まれることになります。しかし、もしも、iに2008なったとしたらwin32GuiTest.rbは読み込まれません。

 つまり、実行形式を作成する際に、"i=2008+rand(2)"でiがどうのような値になったかで、win32GuiTest.rb ライブラリの読み込みの有無が異なる2種類の実行形式ファイルができあがるのです。試しに、実行形式作成時のiの値が異なっていたことによる、(RubyScript2Exe.rbで作成した)異なる2種類の実行形式ファイル(2008.exe, 2009.exe)を置いてみました。

 さて、実行形式ファイル作成時に、"i=2008+rand(2)"が2008になり、win32GuiTest.rb ライブラリが読み込まれていない実行形式ファイルが2008.exeです。この実行形式ファイル2008.exeを(たとえば実際にあなたが)実行するときには、"i=2008+rand(2)"は2008になるかもしれませんが、2009になることだって1/2の確率であるわけです。

 もしも、2008.exeを実行する時にiが2009になったとしたら、必要なライブラリが読み込まれていないので、未定義のクラスや関数が登場することになり例外が発生することになります。

 さて、実行形式ファイル作成時に"i=2008+rand(2)"が2009であった2009.exeの場合には、実行時にiが2008になっても2009でも動作します。2009.exeは、"i=2008+rand(2)"が2009になった場合には「ペイント」プログラムを立ち上げて、「初日の出もどき」を描きます。"i=2008+rand(2)"が2008だったら特に何もしません。

 「行く年」や「来る年」を見て、その「行く年」「来る年」の中を歩いていくたくさんの人たちをみて、なぜか「動的言語」を連想しました。これが、2009年の一番最初に作ったプログラムです。

OSX Development