引用元:https://www.ioccc.org/2011/richards/richards.c
審査員・作者による説明:https://www.ioccc.org/2011/richards/hint.html
動作
逆ポーランド記法で書くdc風電卓。
$ gcc -o richards richards.c
$ echo '10 9 8 7 6 5 4 3 2 1*p*p*p*p*p*p*p*p*p' | ./richards
2
6
24
120
720
5040
40320
362880
3628800
解説
機械語を直接書かずにJITをしているとのこと。
正直良くわからないが、こんなことをしていそう。
- 巨大な関数
t
をマクロで用意し、その中で頻繁に関数rd
を呼ぶ。
- 関数
rd
はスタックを走査し、関数t
内のリターンアドレスと思われる値を探す(関数t
のアドレスと、その直後に定義された関数T
の間の値を探す)。
mmap
で実行可能にしたメモリ領域に関数t
の中のコード断片をmemcpy
でつなぎ合わせて作り、そこに関数呼び出しをする。
スタックの伸びる方向を限定していたり、関数の配置の位置関係も前提をおいていたりするので、まったくポータブルとは言えない。
しかし現実問題としては、Linux、Mac OS X、Windows、NetBSD、Alpha、Arm、MIPS、PowerPC、s390x、VAX、gcc、clang、tccで動作確認をしたとのことで、そのあたりが評価されていそう。
それでも、こういう作品は遠くない将来に動かなくなるような予感。