トップ «前の日記(2008-02-21 (Thu)) 最新 次の日記(2008-02-25 (Mon))» 編集

uDiary

海野秀之(うんのひでゆき)の外部記憶

Twitter (twilog) / RSS / アンテナ / ぶくま

2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|

2008-02-22 (Fri)

[Scheme] iscm かいはつけいかく(妄想率たかめ?)

  • iscm0: とにかく動かす版: S 式をそのまま実行する、メモリリークしまくり*1、継続はあきらめ?
  • iscm1: 中間言語 (CPS?) を経て、バイトコードに変換。バイトコード VM を含む。
  • iscm2: ネイティブコンパイラ

iscm0

いま作って遊んでいるのが iscm0 です。 実行部に関しては「ナイーブ」を通り越してアホみたいなんですが、この点については反省しない。 とにかく僕はまだ Scheme について知らないことが多すぎるので、 Scheme 実行系を作りながら、Scheme について理解しましょうというのが iscm0 の主な目的になりそうです。

僕がどのくらい Scheme 素人かというと、

という感じである。でも、自分で作ってみると、よくわかるんだよねー……という作戦である。

なので、実行系が非効率だったりするのは、別にいいのだ。 この版では、とにかく、Scheme のセマンティクスをきっちり実現していくことを目指す、 それを僕が理解するために。

iscm1

で、ほんとに作りたいのはネイティブコンパイラなんだけど、 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 向け だったんですよねー。

iscm2

ネイティブコンパイラに挑戦。

型推論しなあかんのやろか、とか、eval に対処するには、 結局インタプリタをくっつけとかなあかんのやろか、とか、 GC なしにすることは可能なんだろうか、とか、 SML# の内部データではタグなしで double が生とか いってたなぁ、とか、 わからないことだらけですが、心配するのはもうちょっと先の話。

ターゲット言語は、x86, x86_64, sparc_v9 の assembly language とする。 いままで全く興味をもてなかった x86 のマシン語とか application binary interface について勉強する良い機会だろう。

以上、妄想じみてますが、本人は本気です。

メモ

アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアルの上、中A、中B、下あたりか。 すげーページ数だなぁ。

*1 すでに malloc はラップしてあるので、ここで Boehm GC を使うことにすればリーク問題は解決するのだが、この版でそんなことしても無意味かと。

*2 2007-03-30 の日記(非公開)には、こんなことが書いてあった:「スローガンは:『スパークは洗剤のなまえじゃありませんってば』または『ボールドだって、おもしろいほどよく落ちます』」

pcode (print code): ソースファイルをカラーで印刷、目次付き

なんでもディスプレイ上で読めちゃう人もいるのかもしれませんが、 僕はけっこう印刷して読みたい。

プログラムソースなんかも、紙に印刷したいなぁと思うことがあるんですが、 出来ればハイライト(フォントロック)されたカラーのを読みたい (せっかくカラーのインクジェットプリンタがあんなに安く手に入るんだし)。

コード群をまとめて印刷するような場合には、目次もあるといいなぁ。

というわけで、このような望みを実現するスクリプトを書きました。 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 にして作りなおしてみたのが これ

[Web] 「店員にありがとうという人が大嫌い」にいまさら釣られてみる

店員に「ありがとう」と言う人が大嫌い。おかしいのでしょうかが炎上しているらしい。

僕は、なんとなくわかるような気がするよ。

あ、誤解の無いように一応付け加えておくと、僕自身がバイトしてたとしたら、 「ありがとう」とお客さんに言われたら嬉しいですよ。 ただ、そこでイラっとする若者がいるってことも、わかるような気がする

kikulog コメント 経由で読んだ 技術開発者さんの話 を読んで、思い当たるフシがあったからです。

若いころの、融通の効かない心理的推論機構によると、 自分が行わない「善行」を許容することは、 その善行を行わない自分を否定することに繋がってしまうので嫌なんじゃないかな。

つまり、「店員に『ありがとう』と言う」を良いこととして認めてしまうと、 それをしない自分は「『良いこと』をしない人」になってしまう。 店員に「ありがとう」なんて言わなくていいじゃん、どうして言うんだそんなこと。 偽善者め!みたいな。

なんか、語るほどに「それじゃない症候群」に陥りそうですが、 こんな感じの感情には僕自身も覚えがある。

いじめられっこを庇うと、庇った子まで攻撃対象になってしまうという同調圧力にも、 このような心理が影響しているような気がする。 自分ができなかった「善行」を目の当たりにすると、イラっとするという。

だから、べつにおかしくないと思うよ。 別に特別なことじゃなくて、そのうち直るというか、(店員に「ありがとう」という他人と、 言わない自分の両方を)許せるようになるんじゃないのかなぁ。

「大阪弁で『ありがとう』と言われるのが特にイラつく」とかいわれると、 傷ついちゃうけど(笑)。


2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|
Categories 3imp | Card | Cutter | Dalvik | Euler | Football | GAE/J | Hand | Haskell | Re:View | Ruby | Scheme | TQD | Tiger | TigerBook読 | UikiTeXi | Verilog | Violin | Web | parconc | tDiary | お勉強 | エントロピー | ツン読 | | 将棋 | 政治について | | 模写してみよう | 確率論 | 設定など | 雑文 | 音声