Chez Scheme

たまたま見ていたGeekなページで、IPv6の普及が一番進んでるのはベルギーとかと解説 されてた。元ネタはgoogleで、公表値は50%とか。2人に一人が、先進的な利用をしてる わけだな。

かめとうさぎを生んだ国として、恥ずかしくないか? > そーむのおばちゃん&あべちゃん。

そして、同blogの著者の方が 「ポートとソケットがわかればインターネットがわかる」を書きました なんて、宣伝されてた。どんな本?

オイラーも最近IPv6やったばかりですからね。目次をざっと見て行くと、

getaddrinfo, ping6, dig, wireshark なんて言うのが出て来てた。オイラーも期せずして 同じものを取り上げているな。tcpdumpはオイラーは使ったけど、現代風読者向けにと言う魂胆で、 無視されてる。そして、オイラーも著者も無視したものに、nslookupがある。

NICに振ったipaddressを調べるコマンドは出てきていなけど、何を紹介してるのだろう? プチ興味が有るな。手に取って確かめてみたいぞ。

ああ、興味と言えば、getaddrinfoって、ライブラリィーなんですな。どこら辺にあるか、 ちょいとgdbで当たってみました。(nc -l ::1 1234)

こういう時、OpenBSDは非常に便利。ライブラリィーの中へ平気で入って行けますから。

(gdb) bt
#0  *_libc_getaddrinfo (hostname=0x7f7ffffdebca "::1", servname=0x7f7ffffdebce \
"1234", hints=0x7f7ffffda650, res=0x7f7ffffda618) at /usr/src/lib/libc/asr/geta\
ddrinfo.c:30
#1  0x0000123ec3405b79 in local_listen (host=0x7f7ffffdebca "::1", port=0x7f7ff\
ffdebce "1234", hints=...) at netcat.c:935
#2  0x0000123ec3404926 in main (argc=2, argv=0x7f7ffffdea58) at netcat.c:508

で、入って行って、いきなり迷子になりました。細かい土地勘が無いとだめですな。

crunchgenが自動生成したCソース

前回の積み残しと言うか、見るのを忘れていたやつ。

mainから呼ばれるのがこれ

crunched_main(int argc, char **argv, char **envp)
{
        if (argc <= 1)
                crunched_usage();
        return crunched_main2(argv[1], argc-1, argv+1, envp);
}

そして、こちらが動き出す。渡ってくる引数は一つずらしてあるのが味噌。

static int
crunched_main2(char *progname, int argc, char **argv, char **envp)
{
        struct stub     *ep;

        if (progname == NULL || *progname == '\0')
                crunched_usage();

        for (ep = entry_points; ep->name != NULL; ep++)
                if (!strcmp(progname, ep->name))
                        break;

        if (ep->name)
                return ep->f(argc, argv, envp);
        fprintf(stderr, "%s: %s not compiled in\n", EXECNAME, progname);
        crunched_usage();
}

テーブルを検索して見つからない時に、元になったファイルを表示するって、面白い 仕掛けだ。

busybox

ついでなので、リナ方面で流行っているというbusyboxもちょいと調べておく。

組み込みLinuxの十徳ナイフ。多数のコマンドを集めたBusyBoxの概要と使い方

やっぱりスイス アーミー ナイフって言ってるね。オイラーも昔ドイツに駐在してた時、 本物のスイス アーミー ナイフを土産に買ってきて、山行に携帯した事があるけど、 便利だったよ。ワインのコルク抜きが付いていたり、爪切りが有ったり、爪楊枝が 付いていたりした。爪楊枝って日本独特のものと思っていたけど、そうでもないのね。

そして、こちらは衝撃的な記事。 Windowsで仮想やCygwinなしでUnixコマンドを使う

これ、パイプやリダイレクトを使えるのだろうか? shellがサポートしてるかと、更に下層に あるOSのシステムコールがどうなっているかだな。下層のOSと言えば、この場合はWindows。 リダイレクトはあるはずだけど、パイプに偽物だったような(隠れた所で、ファイル経由 してた)。今は改善されてるのかな。

ああ、こういう事をやりだすと、セッションリーダーがなんたらこうたらと始まって、収拾が つかなくなる可能性大。ただ、パイプを使って、フィルターが簡単に組めればいいんで、 難しい事は、うっちゃっていいぞ。

今号の日経Linuxで特集してる、『荒業をWinで使う Windows版Linux超活用』が、霞んで しまうぐらいの衝撃が有ると思うんだけど、メディアの都合で、上記のようなものは、紹介 されないのね。(笑)

Chez Scheme

更にネットをうろうろしてたら、面白いものを見つけた。

Chez Scheme is Now Open Source

速い事で定評がある Chez Schemeがオープンソースになりました。しかもそのスポンサーが シスコってのが意味深。

シスコと言えば、サンフランシスコの略、、、、じゃなくて、当地で創業したIT機器メーカー。 地元に敬意をはらって、地名の一部を社名にした。ついでに、会社のロゴも、ゴールデンブリッジを図案化した。このメーカーのルーターを使わないと、今やインターネットは成り立たない ぐらい影響力を持つ会社。

そんな会社にも弱点が有った。シスコのルーター上で動くスクリプト類を何語で書くか、頭を 悩ましていたのさ。日本で有名なYAMAHAのルーターは、Luaを採用して成功を収めている。

日本に右へ倣えでは、沽券に関わる。そんな時、Chez Schemeの作者であるdybvig教授が やってた会社を手放す事にした。クリントンおばさん宜しく、老後は孫の面倒でもみて 楽しく過ごすわよみたいに、考えたんだろうね。そこに目を付けたシスコが、そんじゃ 後は引き受けましょ。

でも、シスコにscheme屋は居ない。だったら、オープンソースにして、世界のハッカーの 力を借りようってね。と、オイラーは想像したよ。

何はともあれ、教授が会社をやってた頃は、petiteって言うインタープリター版は無料。 この有償版は、インタープリターに加えて、コンパイラーが使える。

素直に記事を読めば、このコンパイラー版がOSSになったって事。本当かどうか、Debianで やってみる。

だって、Chez Scheme Version 8.4の頃は、FreeBSDや OpenBSDもサポートしてたんだけど、OSSになった Chez Scheme Version 9.4 Release Notes では、BSD系が抜け落ちてしまっているんだもん。その代わり、ARM版が入っているのは、時代の 流れ。

tar玉を取ってきて、configすると、curlが無いって文句を言われた。多分実行中にネットから お取り寄せでもするんだろうね。で、curlを入れてやり直すと、別のconfigエラーが発生。

ちょいと、どんな事をやってるか、trace。なんせ、schemeはtraceが大好きですから。

sakae@debian:~/ChezScheme-9.4$ sh -x configure
  :
+ [ a6le =  -o ! -f boot/a6le/scheme.boot ]
+ [ -d .git ]
+ [ ! -f nanopass/nanopass.ss ]
+ rmdir nanopass
rmdir: `nanopass' を削除できません: そのようなファイルやディレクトリはありません
+ exit 1

消すdirが有りませんって、矛盾してないか。そんな事で文句を言って来るとは、大学の先生の 深遠な配慮だろうか?

だったら、ダミーを置いて、騙しちゃえ。

sakae@debian:~/ChezScheme-9.4$ mkdir nanopass
sakae@debian:~/ChezScheme-9.4$ ./configure
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   140    0   140    0     0    156      0 --:--:-- --:--:-- --:--:--   156
100 3726k    0 3726k    0     0   404k      0 --:--:--  0:00:09 --:--:--  569k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   119    0   119    0     0    139      0 --:--:-- --:--:-- --:--:--   139
100  590k  100  590k    0     0   185k      0  0:00:03  0:00:03 --:--:--  406k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   119    0   119    0     0    134      0 --:--:-- --:--:-- --:--:--   134
100  206k    0  206k    0     0  83304      0 --:--:--  0:00:02 --:--:--  170k

何をdownloadしたか報告もしないで、ステータスだけ表示するcurlは、何処かの某OSに 似てるな。wgetの方がunixらしいと思うぞ。

そんな事で、configも無事に済んで、コンパイルを始めたら、 Xlib.h が無いと言ってエラーストップ。多分、 libx11-dev ぐらいを入れてやればいいだろうって思って入れたら、先に進んだ。

この件、コミュニティーサイトで、噛みついている人がいたね。

may not want Xlib

まあ、schemeなんて、emacsから使うものだから、GUIなんて不要ってのには激同意。 で、このスレッドの最後に、御大将がお出ましして、収めていたぞ。

sakae@debian:~$ petite
Petite Chez Scheme Version 9.4
Copyright 1984-2016 Cisco Systems, Inc.

>

おお、バナーがシスコになってる。

sakae@debian:~/ChezScheme-9.4/examples$ scheme
Chez Scheme Version 9.4
Copyright 1984-2016 Cisco Systems, Inc.

--------------------------------------------------------------------------------
compile                     compile-profile
compile-compressed          compile-program
compile-file                compile-program-handler
compile-file-message        compile-script
compile-imported-libraries  compile-to-file
compile-interpret-simple    compile-to-port
compile-library             compile-whole-library
compile-library-handler     compile-whole-program
compile-port
--------------------------------------------------------------------------------
> (compile-file "fib.ss")
compiling fib.ss with output to fib.so

上記、compileTAB して、補完が利いてるのを確認に図。そして、コンパイラーもちゃんと 動いた。後は、コンパイルして、シングルバイナリーをどうやって作るかだな。

そんなの、 Chez Scheme Version 9 User's Guideの何処かに書いてあるだろう。探してみれ。

(make-boot-file "app.boot" '("scheme" "petite") "app.so")

Section 2.8.あたりにある、こんなのかな?

情報感度の高い#:g1さんは、とっくに察知されて、試しておられた。やはり専門家は違う。

#:g1: Chez Scheme がオープンソース化されたので試してみる

まずは、インタープリター版

sakae@debian:~$ petite
Petite Chez Scheme Version 9.4
Copyright 1984-2016 Cisco Systems, Inc.

> (define (fib n)
    (if (< n 2)
        n
        (+ (fib (- n 1))
           (fib (- n 2)))))
> (time (fib 40))
(time (fib 40))
    no collections
    8.450009382s elapsed cpu time
    8.456771010s elapsed real time
    0 bytes allocated
102334155

今度はコンパイラー版。JITを進化させて、即ネイティブコードに落としているとな。

sakae@debian:~$ scheme
Chez Scheme Version 9.4
Copyright 1984-2016 Cisco Systems, Inc.

> (define (fib n)
    (if (< n 2)
        n
        (+ (fib (- n 1))
           (fib (- n 2)))))
> (time (fib 40))
(time (fib 40))
    no collections
    1.130246366s elapsed cpu time
    1.131452468s elapsed real time
    0 bytes allocated
102334155

これは良い。でも、速すぎると、コードを工夫しないで良しとしちゃうから、最後の 手段にするのが良かろう。おまけで、Fedora 24でもやってみた。

(time (fib 40))
    no collections
    1.097802243s elapsed cpu time
    1.108102106s elapsed real time
    0 bytes allocated

DebianはVBOXに入れてて、FedoraはVMWAREに入っているんだけど、仮想マシンの出来具合の 差かなあ。参考値として、DebianのC語で、-O3の結果。

sakae@debian:/tmp$ time ./a.out
102334155

real    0m0.382s
user    0m0.380s
sys     0m0.000s

Debianに初回に入れたのはスレッド無し。#:g1 さんに倣って、スレッド版にしたんだけど、 コンパイルの最後が

(if `cmp -s ../boot/ta6le/equates.h ../boot/ta6le/equates.h.bak`;\
          then mv -f ../boot/ta6le/equates.h.bak ../boot/ta6le/equates.h;\
          else rm -f ../boot/ta6le/equates.h.bak; fi)
bootfile comparison succeeded
make restoreboot
mv -f ../boot/ta6le/sbb ../boot/ta6le/petite.boot
mv -f ../boot/ta6le/scb ../boot/ta6le/scheme.boot
make resetbootlinks
touch bootstrap

そして、このあたりがインストールの工程。

(cd c ; make)
gcc  -m64 -msse2 -Wpointer-arith -Wall -Wextra -Werror -O2 -D_REENTRANT -pthre  -c -DX86_64 -I../boot/ta6le -I../zlib io.c
gcc  -m64 -msse2 -Wpointer-arith -Wall -Wextra -Werror -O2 -D_REENTRANT -pthre  -c -DX86_64 -I../boot/ta6le -I../zlib new-io.c
gcc  -m64 -msse2 -Wpointer-arith -Wall -Wextra -Werror -O2 -D_REENTRANT -pthre  -c -DX86_64 -I../boot/ta6le -I../zlib scheme.c
ld -melf_x86_64 -r -X -o ../boot/ta6le/kernel.o statics.o segment.o alloc.o syol.o intern.o gcwrapper.o gc-ocd.o gc-oce.o number.o schsig.o io.o new-io.o prt.o fasl.o stats.o foreign.o prim.o prim5.o flushcache.o schlib.o thread.o expitor.o scheme.o i3le.o ../zlib/libz.a
gcc  -m64 -msse2 -Wpointer-arith -Wall -Wextra -Werror -O2 -D_REENTRANT -pthre  -rdynamic -o ../bin/ta6le/scheme ../boot/ta6le/kernel.o ../boot/ta6le/main.olm -ldl -lncurses -lpthread -lrt
(cd s ; make bootstrap)
make[2]: 'bootstrap' is up to date.
make -f Mf-install
./installsh -o "" -g "" -m 555 bin/ta6le/scheme /usr/bin/scheme

さあ、残骸漁りをしてみよう。掘り出し物が見つかるかも。

来年のトレンドはどうなる? そんなのカレンダーを見ておけ

Lisp Advent Calendar 2016

clojureなカレンダーもあるけど、あいつは土台がアレなんで、無視の方向です。

とか言ってたら、

Lisp系自作言語のx86_64コンパイラを作り始めたときの話

こんなのを発見。面白そう。ワクワク。

ISPな方は、シスコがschemeに舵を切ったので、先行手配しておくのが吉。

sakae@debian:/tmp$ cat b.ss
  (import (rnrs))
  (display "What's up?\n")
sakae@debian:/tmp$ echo '(compile-program "b.ss")' | scheme -q
compiling b.ss with output to b.so
()
sakae@debian:/tmp$ scheme --program b.so
What's up?

こんな風にして、やたらカッコの多いスクリプトをコンパイルしgzipで圧縮されたファイルが 作られます。これはもう異次元な世界。

実行は、親が居ないと出来ないという難点はあります。なに、来年からは、iosをアップデート すれば、紛れ込んできますからご心配なく。

所で、シスコのルーターのファーム部分は専用の石を使ってるだろうけど、汎用のCPUって 何? ひょっとしてPowerPCな石かな。突然、辺鄙な石がサポートされるようになったんで、 疑っているのさ。

パケットの交通整理用シスコのルーターの趣味れーたーって、何処かに転がっていないかな。 確か、昔見たことがあるように思うんだけど。