プログラミングキャンプ日記4日目

昨日は疲弊していて日記がなかったが、大分回復した。あと、完成しそうなめどが立つと精神的に大分ハッピーだね。

  • globals便利
  • ruby
    • make parseでバイトコードとかが表示される。
    • rb_internで文字列からIDをつくる
    • ID2SYMでシンボルにする
    • 関数の呼び出しはレシーバーをスタックに積んで、引数をスタックに積んで、セレクタや引数の個数とかはSEND_Rの引数

Python

>>> import dis
>>> def foo():
...     obj.method("args1")
... 
>>> dis.dis(foo)
  2           0 LOAD_GLOBAL              0 (obj)
              3 LOAD_ATTR                1 (method)
              6 LOAD_CONST               1 ('args1')
              9 CALL_FUNCTION            1
             12 POP_TOP             
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE        

Ruby

build$ cat ../ruby/test.rb
obj.method("args1")
build$ make parse
./miniruby -I../ruby/lib -I.ext/common -I./- -r../ruby/ext/purelib.rb  ../ruby/tool/parse.rb ../ruby/test.rb
# ----------------------------------------------------------------------
# target program: 
# ----------------------------------------------------------------------
obj.method("args1")
# ----------------------------------------------------------------------
# disasm result: 
# ----------------------------------------------------------------------
== disasm: <RubyVM::InstructionSequence:<main>@../ruby/test.rb>=========
0000 trace            1                                               (   1)
0002 putnil           
0003 send             :obj, 0, nil, 24, <ic>
0009 putstring        "args1"
0011 send             :method, 1, nil, 0, <ic>
0017 leave            
# ----------------------------------------------------------------------

Pythonはobj.methodの時点でobjからmethodという名前のattributeを取得してスタックに積んでおき、そのあとでcall functionしている。一方、Rubyはsendの時にmethodを指定している。ってのがわかりやすい。Ruby側、この例だとobjがobjというObject#objってメソッドの呼び出しだと解釈されているのか…


Rubyではグローバル変数には$をつけないといけない

build$ make parse
./miniruby -I../ruby/lib -I.ext/common -I./- -r../ruby/ext/purelib.rb  ../ruby/tool/parse.rb ../ruby/test.rb
# ----------------------------------------------------------------------
# target program: 
# ----------------------------------------------------------------------
$obj.method
# ----------------------------------------------------------------------
# disasm result: 
# ----------------------------------------------------------------------
== disasm: <RubyVM::InstructionSequence:<main>@../ruby/test.rb>=========
0000 trace            1                                               (   1)
0002 getglobal        $obj
0004 send             :method, 0, nil, 0, <ic>
0010 leave            
# ----------------------------------------------------------------------

できたできた


prelude.rbはCの文字列としてrubyに埋め込まれる。すべてのスクリプトの前につっこまれる。


MIDIator - a nice Ruby interface to your system's MIDI services.
autodetect失敗するなぁ。
Audio MIDI 設定 - Wikipedia
よくわからん。



# ----------------------------------------------------------------------
# target program: 
# ----------------------------------------------------------------------
def foo
  $obj.method
  "return_value"
end
# ----------------------------------------------------------------------
# disasm result: 
# ----------------------------------------------------------------------
== disasm: <RubyVM::InstructionSequence:<main>@../ruby/test.rb>=========
0000 trace            1                                               (   1)
0002 putspecialobject 1
0004 putspecialobject 2
0006 putobject        :foo
0008 putiseq          foo
0010 send             :"core#define_method", 3, nil, 0, <ic>
0016 leave            
== disasm: <RubyVM::InstructionSequence:foo@../ruby/test.rb>============
0000 trace            8                                               (   1)
0002 trace            1                                               (   2)
0004 getglobal        $obj
0006 send             :method, 0, nil, 0, <ic>
0012 pop              
0013 trace            1                                               (   3)
0015 putstring        "return_value"
0017 trace            16                                              (   4)
0019 leave                                                            (   3)
# ----------------------------------------------------------------------

関数を呼んだ後結果が必要なかったらpopが必要だよね、という例。最初

def foo
  $obj.method
end

って書いて「あれ、popしないじゃん」って思ったがRubyは明示的にreturnしないでも最後に評価した式の値を返すんだった。


BoFで「50年前の言語、50年後の言語」という話を議論することになった。最初のうち50年前の言語についての話をしているときはあんまり盛り上がらなくてどうしようかと思ったが、50年後の言語の話をしているうちにドーパミンが出まくってかなり面白くなった。

  • 50年後のハードウェアはとても速くなっている。地球シミュレータがポケットに入る
    • いやポケットには入れない。あちこちに小さなチップが貼り付いている
  • ネットワークもものすごく速くなるんじゃない
    • でも遅延は減らせない。何でもかんでも青天井に速くなるわけではない。
  • ハードウェアがとても小さく高速になるんだったらポケットじゃなくて脳に入れればいいんじゃない
  • ハードウェアの速度がとても速くなるんだからモンテカルロすればいいんじゃない
  • 協調フィルタリングでユーザをサポートする
  • ビジュアル言語
    • なんでビジュアル言語が成功しなかったのか?
    • 2次元にするのが次元が足りないんじゃないのか
    • 部品のチップの提示機能が足りない


ドーパミン垂れ流しながら口走った「マシンがすごく速くなるんだったら言語処理系がモンテカルロしまくってもいいんじゃないの」とか、昨日聞いた最近の型の話とか面白かったので何か作りたいなぁ。