Mark and Sweep GC より Reference count GC のほうがプログラミングが簡単になる
Python を使って驚いたことのひとつに、open したファイルを close しなくていいということがある。正確に言うと、close 自体は必要なのであるが、Python が勝手に close してくれるのでプログラマーが明示的に close しなくてもよい、ということである。
1: linenum = 0 2: def cat_n(filename): 3: global linenum 4: f = open(filename) # open するけど close してない 5: for line in f: 6: linenum += 1 7: print "%6d: %s" % (linenum, line), 8: 9: import sys 10: for filename in sys.argv[1:]: 11: cat_n(filename)
なぜこんなことが可能かというと、Python の GC は Reference count 方式だからである。そのため、4 行目で open したファイルオブジェクトは cat_n() を抜けるときに確実に GC 対象となり、そのときに Python により自動的に close される。
このような仕組みにより、Python では open したファイルを明示的に close しなくても GC により勝手に close される。
これを知ったときはとても感心した。Ruby のブロックを使った方法もうまいと思ったけど、Python の Reference Count GC を使った方法もよくできている。こうしてみると、Java や他の言語で try-catch-finally を使っているのがほんとバカらしく思えてくる。
Reference count GC は multi-thread と相性が悪いようだが (reference counter を増減するときに排他制御が必要になるため)、プログラミングが簡単になるという長所はもっと評価されていいと思う。
ただね、Jython は JVN の GC を使っているから、Reference count GC じゃないんだよね。そこが悩み。