yhara.jp

Recent Posts

printfだけで画像を生成する(.ppm)

2017-02-21
Tech

自作のプログラムで画像を出力したいとき、どのフォーマットを選ぶのが良いだろうか。PNGやJPGなどは広く普及したフォーマットだが、マイナーな言語や自作のプログラミング言語の場合、出力するためのライブラリが存在しない場合がある。

そんなときに役立つのが、aobenchでも使われているPPMという画像フォーマットだ。PPMは仕様が極めてシンプルなので、例えばprintfが使えれば出力することができる。

以下はppmファイルの例である(上記ページから拝借)。

P3
3 2
255
(more...)

オブジェクト指向言語をLLVM IRにコンパイルするには

2017-02-07
Tech

昨年から、Esquisという言語を作っている。Rubyっぽい文法の静的型付け言語になる予定で、実行はLLVM IRを経由して行う。

ということで、(クラスベースの)オブジェクト指向言語をLLVM IRで表現する方法について考えていたので、分かったことをまとめておく。既存の実装としては主にCrystalの生成するLLVM IRを参考にした。

オブジェクトをstructに対応させる

LLVMにはstruct型というものがあり、オブジェクトはこれで表現することができる。問題はどのようなstruct型を定義するかだ。

最初に考えたのは、EsObjという型を作って、すべてのオブジェクトを表現するという方法だ。

(more...)

syntax-rules進捗

2017-02-06
Tech

去年の夏頃から、BiwaSchemeにsyntax-rulesを入れようと思ってぼちぼち調べてたんだけど、どうもこれは本腰入れて調べないと進捗しないなということで、年末からいろいろ文献を読むなどしていた。

その成果がこちら。

swapマクロを展開させてみたところ

orrというマクロを素朴に展開すると、マクロ内で使っているtという変数名が呼び出し側で定義しているtと衝突してしまう。これを自動でt.0とt.1にリネームしている、という図。

ソースコードはブランチにpushしてある。まだhygenic macroに対応したエクスパンダが本体とは独立に存在するという状態で、最終的にはこれで本体のエクスパンダ(Biwascheme.Interpreter.expand)を置き換えるということになる。

(more...)

llvmのsub expressionっぽいやつの書き方

2017-02-06
Tech

メモ。

LLVM IRは基本的に以下のような構造をしている。

; (レジスタ名) = (命令名) (引数 ...)
%2 = mul i64 %0, %1

ところがコンパイラが生成した.llファイルを見ていると、引数の部分に別の命令が入っていたりする。

%4 = mul i32 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i32), %3
(more...)

インドカレー屋のレジの横に置いてあるやつ買った

2017-01-23
Food

インドカレー屋のレジの横に置いてある甘いやつが好きなんだけど、ネットで買えるっぽいので注文してみた。ジップロック的なものに入ってるので便利。


あれの正体はフェンネルシードというハーブに砂糖をかけたもので、消化促進に効果があるらしい。食べてみると心なしか胃がすっきりするような気がするが、そうするとなんかもうちょっと食べられる気がしてお菓子とか食べてしまうので、プラマイゼロかもしれない。



マクロ展開時に副作用を起こすとどうなるか

2016-12-31
Tech

R7RSのマクロシステムはsyntax-rulesだけだが、R6RSにあったsyntax-caseや、いくつかの処理系が実装しているexplicit-renaming, implicit-renamingといったマクロシステムでは、マクロ展開時に任意の式が書ける。

では、マクロ展開時にdisplayを使って文字列を出力した場合、それはどのタイミングで評価されるのだろうか?特にインタプリタじゃなくてコンパイラの場合は?

Chicken Scheme

ということで適当なSchemeコンパイラを用意する。Macだとbrew install chickenでChiken Schemeが入る。マクロシステムはexplicit-renamingがあるようなのでそれを使う。

(define-syntax foo
(more...)

2016年に聴いた音楽

2016-12-31
Music

近年は音楽を聞くときはほぼMacのiTunesなので、iTunesを開けば何聴いてたか分かって便利。最近はApple Musicとか定額制のサービスも出てるけど、同じアルバムを何回も聞くタイプなので利用していない。

リンク先はYoutubeとかSoundCloudとかBandcampとか、何かしら試聴できるやつにしています。

特に良かった/よく聴いたもの

(more...)

A collision between Yard and FactoryGirl

2016-12-27
Tech

Today I encountered a curious error on running tests of a Rails app.

(snip)/gems/yard-0.8.7.6/lib/yard/globals.rb:16:in `log': wrong number of arguments (given 1, expected 0) (ArgumentError)

Solution

I did not indend to use yard while testing. By checking Gemfile.lock, I found pry-doc was the only gem depends on yard. The error was removed by fixing Gemfile to exclude pry-doc from the "test" group.

(more...)

BiwaSchemeのためにCPS(継続渡し形式)でマージソートを実装した話

2016-12-25
Tech

本記事は言語実装 Advent Calendar 2016の最終日の記事です。話題が多岐に渡っていて楽しいアドベントカレンダーでしたね。前日はEgisonのリーマン幾何学用記法の話でした。

BiwaSchemeは筆者が作っているJavaScriptによるScheme実装です。先月の話ですが、list-sortという関数を修正し、比較に使うScheme関数を受け取れるように改善しました。BiwaSchemeは中間言語方式(VM方式)かつライブラリを全てJSで実装するという方針になっているため、実装に少し工夫が必要でした。本稿ではそのことについて解説します。

中間言語方式

JavaScriptでScheme処理系を実装する場合、いくつかの方針が考えられます。

  1. インタプリタ方式 (S式を一つずつ読み、評価する)
  2. コンパイラ方式 (プログラム全体を等価なJavaScriptに変換する
(more...)

Posts

(more...)

Articles

(more...)

Category

Ads

About

About the author