ろじかるんるんものがたり

病人が特に何も書かない。無駄だからだ。

JVM におけるメモリ効率の良い末尾再帰最適化の実装の紹介

やあやあ病人です。今日は特に予定もないので、最近読んだ論文の中から、適当にいくつかピックアップして紹介したいと思います。

Memory-efficient Tail Calls in the JVM with Imperative Functional Objects

JVM における TCE(Tail Call Elimination) については、長い間研究されてきています。六年前に JVM での TCE についての Odersky 先生の論文を紹介する記事を書いたりもしました。もう六年前…こちらの論文は TCE の実現における常套手段が JVM では通用しないよという話や、historical な話が面白くて、実際の提案手法は、まあダメでしょ…みたいなものだったのですが、今回の論文の手法はかなり良いと思います。

JVM で TCE というと、矢張り Trampoline です。Trampoline というと、Free モナドが数年前だかに流行った頃に、皆さん少しは齧っていると思うので説明は省略します。Trampoline で大体良いのですが、Trampoline はメソッド呼び出しの都度 memory allocation が生じるので、結局最後は OOM で死ぬという問題がありました。実際少なくともひと昔前の Scalaz の IO を真面目に使うと OOM で死にます。まあ Scalaz が footprint いくらなんでも気にしなさすぎというのもあると思いますが、そんな感じです。今は IO の実装とか諸々変わってるかもしれません。
話を戻して…今回の論文の提案手法では、general な TCE をメモリ使用量定数で実現することができます。実現方法は、言われてみればという感じで、特に難しくはなく、論文の主題としてはそれを利用することで FCore という System F の拡張を作れるよ(作ったよ)という部分だと思います。が、まあ System F なんて誰も興味ないと思うのでそこは飛ばします。

JVM での関数の representation は、Function as Object つまり Java8 の Functional Interfaces(aka SAM) が一般的です。というか他に知らないです。Scala も Kotlin も Clojure も Frege も Java との Interoperability を考えると、どうしてもそうなってしまいます。Functional Interfaces が加わった Java8 以降は特にそうです。論文では、Function as Object の頭文字をとってこれらを FAO と呼んでいます。
それに対して、FAO に代わるものとして、新しい関数の representation、Imperative Function Object 略して IFO と呼ばれるものが提案されています。これはどういうものかというと…見てもらうのが一番早いと思うので見てください。

public abstract class Function {
  Object arg, res;
  abstract void apply();
}

これだけです。引数や返り値を、フィールドとして持つようにしただけですね。本当にこれだけですが、色々と変わってきます。

Trampoline の問題点は、FAO の allocation がどうしても必要なので、メモリ使用量が定数にならないというところでした。一方で、IFO は関数を「使いまわす」ことで、これを回避します。FAO では使いまわせないのかというと、少し考えればわかると思うのですが、関数呼び出しには当然引数が必要になります。Trampoline を利用すると、引数が決定されるタイミングより、実際に関数を適用を行うタイミングの方が遅くなるので、bind 相当の処理が必要になり、結果として bind された FAO の allocation が発生します。
IFO では、引数をフィールドとして持っているので、bind の必要はありません。単純明快ですね。処理全体の流れとしては殆どトランポリンと同じで、IFO を保持する比較的スコープの大きい変数を用意しておき、関数適用したい場合は、代わりにその変数に IFO を渡して return。次に処理すべき IFO があるかどうかチェックして、あれば呼び、なければ最後の返り値をフィールドから返り値を取り出す。相互再帰の場合も問題なくいけます。

というわけで IFO いい感じなんですが、課題も色々あります。currying は必須、Object で持つと boxing/unboxing が生じる、mutable な外部スコープの変数を持つクロージャだと困る、thread-safety に実装するの大変、Java との Interoperability が下がる(IFO 版呼ぶ FAO 定義することで回避可能)、FAO と違い都度生成するのではなく、最初に生成しちゃうので部分適用とか使われるとだるい、と色々あります。

前述のとおり既に実装はあるので、試したい人はどうぞ。


もう一つ紹介したかったんですが、結構前に読んだ論文だったので間違いがないか読み直してたら大分疲れてしまったのでおしまい。

歩き方

生活保護受給者に戻ることにしました。

しましたというか、現実的に考えてそうせざるをえないというか。今年二月に請けた仕事でお金貰った時点で、生活保護は廃止になったものだと思っていたんですが、廃止ではなく停止扱いになっていたみたいです。まあ病気が治ったわけではないというのは役所の人も把握していたので、妥当な判断だなあと思いました。それをボクが聞かされてなかった or 忘れてたのは問題だけれど…

あまり言い訳はしたくないのですが、体調悪くて正直あまり営業もできてないし、そも病人というだけで仕事取ってくる難易度は高くなるので、まあ今のところ営業進捗全くダメです。楽観的にみて、根気よくやれば今年中には見つかるのではないかみたいな大変渋い状態なんですが、一方でそこまで貯蓄はもうないので、生活保護受給再開です。受給額どんどん減ってるんで本当に辛い。

ここ最近は本当に体調がずっと悪くて、なんでだろう…と思っていたんですが、なんとか仕事を取らないと、という焦りからくるストレスで、諸々悪化していたんだと思います。実際焦っていたし、焦らざるを得ない状況だった。しかしそれが原因で体調悪くしてたんじゃ、取れるものも取れない…本当に自分の現状が悔しくて悔しくて、ただその一心で頑張ろうとしていたんですが、それが負担になってしまっていたわけですね。一定諦めた途端に体調良くなって気が付きました。ダメですね。病人が頑張ろうとしちゃいけません。というか、そのぐらい色んな面で追い込まれていたということと、追い込まれることで体調悪くなるんだなということが結構ショックです。

生活保護の受給を再開するからといって、仕事を探すことをやめるということではないです。これからはもう少しゆっくりと、病人なりのペースで探そうと思います。生活保護は本当に受給額が厳しくなっていて、以前にも増してまともな生活送るのも大変なので、できれば早めにお仕事を見つけてまた脱したいという気持ちは当然あるんですが、焦ってまた体調悪くすることだけは避けるように、しないといけない…

病人には病人なりの歩き方生き方があるのだということは、わかっていたつもりだったんですが、まだまだだったようです。病人歴六年目なんだけれど、人間学びませんね。それともボクが特別ダメなんだろうか。

そんなわけで報告でした。
前述のとおり、お仕事は今後も探しますし募集します。こんな病人ですけれど、一応人並み以上にはプログラミング他、諸々できるつもりではいるので、何かあったら lyrica.logical あっと gmail.com までメールお願いします。何卒。

追い詰められてるときほど、追い詰められてる自分を見失いがちですね。特に病気で体調悪いと、そんなこと考える余裕もないし。参っちゃうなあ…何か無駄に長くなった。おしまい。

時間の使い方

病人というのは、多かれ少なかれ健常者よりも活動可能な時間が短い。何をするかにもよるけれど、自分の場合はざっくりいって半分とかになるんじゃないかなあと思う。時間を大切に使わないといけない、と思っていても、実践するのはなかなか難しい。

請けている仕事がないなら、いくらでも時間があるじゃないと思われそうだし、ボクもそう思いたいのだけれど、痛みが酷くてダウンしている時間とか、体力の問題でお昼寝してるとか、その他諸々含めると、そんなにない。その中で、営業行ったりアポとったりして残った時間は、いうほど多くない。

今日は生活保護中の年金が支払われていないと家に人がやってきた。生活保護を受けていれば支払い義務はないと思っていたのだけれど、支払い義務がないことを示すための手続きが必要らしい。そうだった気もする。どの道、今月仕事を見つけられなかったら、貯蓄的な問題で、次の仕事が見つかるまでまた生活保護に戻らざるを得ないので、その下準備に(見つかるといいんだけれどなあ…)役所へは行くつもりだったので、そこで解決しようと思う。書類関係はいつも何かしら間違えるので、詳しい人間に教えて貰いながらやるのが一番だ。世の中の仕組みを自分より知っている人間のサポートを受けるのは、多分正しいことだ。というか世の中の仕組みを知らないので、今の状態があるわけで…

話がそれてしまった。そういえば働き始めた二月からの今までの年金についても同じ問題があるし絶対今の状態だと払えないな…まあ役所いこう。本当は、貰えるあてもない年金なんて働きたくはないのだけれど、別にアナーキーでもないし、払わないことで生じる問題を考えると何事もとりあえず払っておくのが楽でいい。お金で解決できることはお金で解決しとくのが大体妥当だ。今お金ないんだけど。

プログラミングや計算機科学だけに絞っても、やりたいことはたくさんある。取捨選択しないといけない。あれはあとで、これはあとでなんでやっていると、無限に溜まってしまって何から手を付ければいいか分からなくなるし、そもそもなぜやりたいと思ったのかもそのうち忘れてしまう。最近体調が悪かったり関西にいったりで時間が取れなかったので、今まさにそうなっている。改善したい。どうすればいいのか。

病気を言い訳にはしたくないけれど、事実としてできないことがたくさんあって、やりたいことも十分にできなかったりするわけで、ちゃんと考えて何事もやっていかなければとは思う…んだけれど、まだ健康だった頃のボクは、人間なんて好きなことやってればよくて、好きなことがお金を稼ぐことな人間は絶対に一定いるから、なんとなくそんな感じで勝手に世の中が回っていくべきなのだと思っていた気がする。理想世界の実現の前に、自分がダメになってしまった。

それはそうと、三連休だということを完全に失念していたので、お薬がなくなる。ピンチだ。デパスくらいコンビニで売っててほしい。他に飲んでいるお薬はまだ少し余裕がある。

とりとめもなく散漫としているけれど、終わり。

仕事がない

絶賛仕事がないので仕事ください状態です。

病人なのであまり働けないのですが。病人なのになんで働かないといけないんだろう。

 

あと今日とある社を見学させていただいたのですが、ブログとか見つからないのでツイッターアカウント(同僚に)伝えちゃいましたーといわれてしまいました、が、このように、あります。書くことがないので、何にも書いてないけれど。

 

何にせよとりあえず前の仕事で結構疲れたっぽいので七月はだらだらします。暑いし。八月は八月で祖父の初盆で実家に帰ることが決まっているし、どうしたものかな。