海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
いま作って遊んでいるのが iscm0 です。 実行部に関しては「ナイーブ」を通り越してアホみたいなんですが、この点については反省しない。 とにかく僕はまだ Scheme について知らないことが多すぎるので、 Scheme 実行系を作りながら、Scheme について理解しましょうというのが iscm0 の主な目的になりそうです。
僕がどのくらい Scheme 素人かというと、
という感じである。でも、自分で作ってみると、よくわかるんだよねー……という作戦である。
なので、実行系が非効率だったりするのは、別にいいのだ。 この版では、とにかく、Scheme のセマンティクスをきっちり実現していくことを目指す、 それを僕が理解するために。
で、ほんとに作りたいのはネイティブコンパイラなんだけど、 iscm0 の、中間言語すらもたないナイーブな(を通り越してアホな)実装から、 一足飛びでネイティブコンパイラは無理げなので、あいだに挟まるのがこれ。
iscm0 の作成で、Scheme 言語についてのお勉強はできてしまっている筈なので、 こんどはコンパイラ技術の方に力をいれましょうというバージョンである。
別に作りたくもないインタプリタをまじめにつくるためには、 何かモチベーションの源が要るんだよなぁ (できあがるのが、単なる 「Gauche の劣化コピー」 では面白くない)というのが悩みだったんだが……。
実行部のバイトコードマシンのアーキテクチャを、Verilog でも実装しよう! そうしよう!
Very small computer を Verilog で書いてみようという遊びは、それはそれで面白く、 かつ、お手軽な遊びなんです。 僕自身、この遊びはちょっと前に済ませているんですが、 その very small computer をターゲットにしたコンパイラを書こうとして頓挫した経緯がある (アセンブラしか書けなかった)。
その、一度頓挫した計画と iscm1 をリンクさせてしまおうというのだ。
僕が一度つくった very small computer は、命令セットを絞りまくった RISC マシンで、 僕はこれを Bold と命名した。 この名前は、「おもしろいほどよく落ちる」と揶揄される SPARC に対抗して、 日本で有名な洗濯洗剤 の名前から拝借したものだ *2。
この Bold の ISA を大幅に変更して、iscm1 の VM と同一アーキにしちゃおうと。 ちょっと前、この日記でフリーの Verilog 処理系についてメモってたのは、Bold 向け だったんですよねー。
ネイティブコンパイラに挑戦。
型推論しなあかんのやろか、とか、eval に対処するには、 結局インタプリタをくっつけとかなあかんのやろか、とか、 GC なしにすることは可能なんだろうか、とか、 SML# の内部データではタグなしで double が生とか いってたなぁ、とか、 わからないことだらけですが、心配するのはもうちょっと先の話。
ターゲット言語は、x86, x86_64, sparc_v9 の assembly language とする。 いままで全く興味をもてなかった x86 のマシン語とか application binary interface について勉強する良い機会だろう。
以上、妄想じみてますが、本人は本気です。
アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアルの上、中A、中B、下あたりか。 すげーページ数だなぁ。
なんでもディスプレイ上で読めちゃう人もいるのかもしれませんが、 僕はけっこう印刷して読みたい。
プログラムソースなんかも、紙に印刷したいなぁと思うことがあるんですが、 出来ればハイライト(フォントロック)されたカラーのを読みたい (せっかくカラーのインクジェットプリンタがあんなに安く手に入るんだし)。
コード群をまとめて印刷するような場合には、目次もあるといいなぁ。
というわけで、このような望みを実現するスクリプトを書きました。 latex + listings パッケージに丸無げしているだけですが。
#!/bin/env ruby # -*- mode:Ruby -*- EXT2LANG = { 'c' => 'C', 'h' => 'C'} def pcode(f) ext = f.slice(/\.(\w+)$/, 1) if ext.class == String l = "language={#{EXT2LANG[ext]}}" end puts "\\newpage" puts "\\section{#{f}}" puts "\\begin{lstlisting}[#{l}]" puts open(f, 'r').read puts "\\end{lstlisting}" end puts DATA.read ARGV.each {|f| pcode(f)} puts '\end{document}' __END__ \documentclass{jsarticle} \usepackage{listings} \usepackage[dvipdfmx]{color} % \definecolor{hellgelb}{rgb}{1,1,0.8} \definecolor{colKeys}{rgb}{0,0,1} \definecolor{colIdentifier}{rgb}{0,0,0} \definecolor{colComments}{rgb}{1,0,0} \definecolor{colString}{rgb}{0,0.5,0} % \lstset{% float=hbp,% basicstyle=\ttfamily\small, % identifierstyle=\color{colIdentifier}, % keywordstyle=\color{colKeys}, % stringstyle=\color{colString}, % commentstyle=\color{colComments}, % columns=flexible, % tabsize=2, % frame=single, % extendedchars=true, % showspaces=false, % showstringspaces=false, % numbers=left, % numberstyle=\tiny, % breaklines=true, % backgroundcolor=\color{white}, % breakautoindent=true, % captionpos=b% } \begin{document} \tableofcontents
あ、このスクリプトに pcode という名前を付けました。
で、
% pcode iscm0.[hc] main.c eval.c > hoge.tex % platex hoge % platex hoge % platex hoge % dvipdfmx hoge
すると、こんなの が手に入る。
こんなのを手に入れて喜ぶのは僕だけかも知れないけど。
# あー、ハードタブが残念なことになっとるなぁ。あり? tabsize=2 の指定(どっかからコピペ)がよくないのかな?
やっぱり、tabsize=2 なのが僕の使っている環境(8タブ)と食い違っているのがだめだった。 tabsize=8 にして、ついでに showstringspaces=true にして作りなおしてみたのが これ。
店員に「ありがとう」と言う人が大嫌い。おかしいのでしょうかが炎上しているらしい。
僕は、なんとなくわかるような気がするよ。
あ、誤解の無いように一応付け加えておくと、僕自身がバイトしてたとしたら、 「ありがとう」とお客さんに言われたら嬉しいですよ。 ただ、そこでイラっとする若者がいるってことも、わかるような気がする。
kikulog コメント 経由で読んだ 技術開発者さんの話 を読んで、思い当たるフシがあったからです。
若いころの、融通の効かない心理的推論機構によると、 自分が行わない「善行」を許容することは、 その善行を行わない自分を否定することに繋がってしまうので嫌なんじゃないかな。
つまり、「店員に『ありがとう』と言う」を良いこととして認めてしまうと、 それをしない自分は「『良いこと』をしない人」になってしまう。 店員に「ありがとう」なんて言わなくていいじゃん、どうして言うんだそんなこと。 偽善者め!みたいな。
なんか、語るほどに「それじゃない症候群」に陥りそうですが、 こんな感じの感情には僕自身も覚えがある。
いじめられっこを庇うと、庇った子まで攻撃対象になってしまうという同調圧力にも、 このような心理が影響しているような気がする。 自分ができなかった「善行」を目の当たりにすると、イラっとするという。
だから、べつにおかしくないと思うよ。 別に特別なことじゃなくて、そのうち直るというか、(店員に「ありがとう」という他人と、 言わない自分の両方を)許せるようになるんじゃないのかなぁ。
「大阪弁で『ありがとう』と言われるのが特にイラつく」とかいわれると、 傷ついちゃうけど(笑)。