SlideShare una empresa de Scribd logo
1 de 24
Descargar para leer sin conexión
Scheme to x86
  コンパイラ
     多久島 信隆
経緯

tracing GCを作ったことがない ⇒ せっかくな
ので処理系のGCを作りたい ⇒ Lisp

interpreter OR compiler ⇒ 黒魔術感のある
compiler ⇒ ターゲットは資料の多いx86
経緯
SICP, PAIP, 3imp.pdf, Tiger book, EoPL,
MinCaml, etc. を参考にはじめる。実装も沢山
ある ⇒ An Incremental Approach to Compiler
Constructionに出会う ⇒ さくさく作れて楽し
い

この論文および関連資料を基礎にして進めてき
た
Schemeの紹介

極めてシンプル (ストイック) な言語仕様

予約語はありません

すべては式です

必要な構文は5つ (define quote if set! lambda)
S式
z1 → ((a . (b . ())) . ())

S式は最小限の労力で、グラフをテキストにシ
リアライズする手段

LispのプログラムコードはS式

a = 1 + 1 は (set! a (+ 1 1)) となる
Program as Data
 他の言語ならコンパイラが構文解析して内部に作られる構文木を、Lispでは
 直接プログラムとして書き下すわけだ。しかも、この構文木はプログラムか
 らアクセスできるから、構文木自身を操作するプログラムを書くことができ
 る。Lispではそのようなプログラムをマクロと呼ぶ。いわば、プログラムを
 生成するプログラムだ。


                            ポール・グレアム



⇒ 処理系が必要になれば、S式からS式のトランスレー
タを書けばよく、それは簡単、ということです。
特徴的な言語要素
レキシカルスコープ

無限のエクステント

1st class lambda, 1st class continuation

マクロ

GC
nanopassコンパイラ
R5RSサブセット            伝統的マクロ

x86=32bit register   Exact copying GC
machine
                     FFI callout, callback
3bit tagged value
                     Schemeで実装
CPS変換による
                     parser, 最適化はなし
continuation


https://github.com/nobutaka/nanopass
fixnum if
flonum string vector
let map list
vararg FFI call/cc
方針
コンパイルフェーズを細かく分け、小さな変換
を繰り返す ⇒ nanopass

micro schemeを実装してその上にfull scheme
を実装する

数値をコンパイルできるところからはじめ、ボ
トムアップに拡張する
コンパイルフェーズ
約10フェーズ (parserはGaucheのreadで代用)

ライブラリ追加 ⇒ マクロ展開 ⇒ 内部define除
去 ⇒ begin構文単純化 ⇒ CPS変換 ⇒ 代入, free
変数, ヒープリテラル解析 ⇒ 代入boxing/un-
boxing ⇒ ヒープリテラルlifting ⇒ lambda
lifting ⇒ プロローグ追加, コード生成
マクロ展開
詳しくはLisp in Small Pieces

コンパイル時に評価器が必要

マクロもコンパイルして実行 OR interpreterを
実装しておく OR 外部プログラムを呼び出す

Gaucheのevalを呼んで実装
継続の実装

スタックコピー OR CPS変換

スタックコピーの実装についてはfault on
continuation (Gauche-devel-jp)でぐぐる

コード変換だけで実装できることから、CPS変
換を選択
CPS変換
詳しくはThe 90 minute Scheme to C compiler

なんらかの簡約を行うか、素朴な変換を止め
ないとコードがとても大きくなります

継続がない場合はSSAと等価だそう

CPS変換するとすべて末尾呼び出しになります
クロージャの実装

プログラミング言語の進化を追え: 第4回 大人
のためのブラックボックス読解講座

interpreterならstatic linkをたどる実装が簡単

クロージャの自由変数を引数に追加して除去す
る、lambda liftingで実装
Code Generation
   Architecture
http://www.cs.indiana.edu/eip/compile/
back.html

frame, closure, allocation, accumulator,
temporary*3 registers + 独自のスタック

Destination-driven Code Generation: 単純かつ
トップダウンのアプローチ
GC

Cheney’s two-finger collectorをCで実装

current frame pointer, current closure pointer,
accumulator, temporary registersをrootとする

当初の目的だったGCの実装はわずか300行……
FFI callout
データ変換とメモリ管理が要点

C friendlyな型 (null終端文字列や32bit word)
を保持できるようにして、Scheme側で自動変
換。stable pointerではありません

(dlsym asciiz) (foreign-call fptr args size)

libffiなどは使えないのでOSXのABIに従いcall
FFI callback
Scheme↔Cの相互呼び出しがあり得る

tall callのみでなくなる (フレームが伸びる)

コンテキストスイッチのため実行時に
trampolineコードを生成

いつGCが動いてもよいような配慮
デモ
振り返ると
1 word 64bitにすべき   モデルと実装のギャッ
だった                プが埋まった

interpreterなら簡単な   竹内先生の最終講義を
ことが難しい             聞きに行ったり

脳がとけるかと思った         ちょっと草植えときま
GCのバグ              すね型言語 Grassが分
                   かるようになったり

   ま、とにかく楽しかったです

Más contenido relacionado

La actualidad más candente

Tokyo.R 白熱教室「これからのRcppの話をしよう」
Tokyo.R 白熱教室「これからのRcppの話をしよう」Tokyo.R 白熱教室「これからのRcppの話をしよう」
Tokyo.R 白熱教室「これからのRcppの話をしよう」Nagi Teramo
 
Run-time Code Generation and Modal-ML の紹介@PLDIr#2
Run-time Code Generation and Modal-ML の紹介@PLDIr#2Run-time Code Generation and Modal-ML の紹介@PLDIr#2
Run-time Code Generation and Modal-ML の紹介@PLDIr#2Masahiro Sakai
 
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data MatricesScalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data MatricesYasuo Tabei
 
#upcamp '12 Hack-a-thon Result
#upcamp '12 Hack-a-thon Result#upcamp '12 Hack-a-thon Result
#upcamp '12 Hack-a-thon ResultKazuhiro Hishinuma
 
How do you like jhc?
How do you like jhc?How do you like jhc?
How do you like jhc?Kiwamu Okabe
 
UniRx勉強会 reactive extensions inside(公開用)
UniRx勉強会   reactive extensions inside(公開用)UniRx勉強会   reactive extensions inside(公開用)
UniRx勉強会 reactive extensions inside(公開用)wilfrem
 
FPGAスタートアップ資料
FPGAスタートアップ資料FPGAスタートアップ資料
FPGAスタートアップ資料marsee101
 
Lispのべんきょう
LispのべんきょうLispのべんきょう
LispのべんきょうHatori Kouiti
 
20130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT7720130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT77nkt77
 
20130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT7720130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT77nkt77
 
Klab expert camp 成果発表
Klab expert camp 成果発表Klab expert camp 成果発表
Klab expert camp 成果発表teruyaono1
 
バイナリ解析入門
バイナリ解析入門バイナリ解析入門
バイナリ解析入門aksechack0001
 
レイトレ合宿7 発表スライド
レイトレ合宿7 発表スライドレイトレ合宿7 発表スライド
レイトレ合宿7 発表スライドSho Ikeda
 
数値計算のための Python + FPGA
数値計算のための Python + FPGA数値計算のための Python + FPGA
数値計算のための Python + FPGAryos36
 
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Lispmeetup #39 MGLの紹介: Common LispによるディープラーニングLispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Lispmeetup #39 MGLの紹介: Common LispによるディープラーニングSatoshi imai
 
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)洋史 東平
 

La actualidad más candente (20)

Rx Showcase
Rx ShowcaseRx Showcase
Rx Showcase
 
Tokyo.R 白熱教室「これからのRcppの話をしよう」
Tokyo.R 白熱教室「これからのRcppの話をしよう」Tokyo.R 白熱教室「これからのRcppの話をしよう」
Tokyo.R 白熱教室「これからのRcppの話をしよう」
 
Run-time Code Generation and Modal-ML の紹介@PLDIr#2
Run-time Code Generation and Modal-ML の紹介@PLDIr#2Run-time Code Generation and Modal-ML の紹介@PLDIr#2
Run-time Code Generation and Modal-ML の紹介@PLDIr#2
 
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data MatricesScalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
 
#upcamp '12 Hack-a-thon Result
#upcamp '12 Hack-a-thon Result#upcamp '12 Hack-a-thon Result
#upcamp '12 Hack-a-thon Result
 
How do you like jhc?
How do you like jhc?How do you like jhc?
How do you like jhc?
 
UniRx勉強会 reactive extensions inside(公開用)
UniRx勉強会   reactive extensions inside(公開用)UniRx勉強会   reactive extensions inside(公開用)
UniRx勉強会 reactive extensions inside(公開用)
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
FPGAスタートアップ資料
FPGAスタートアップ資料FPGAスタートアップ資料
FPGAスタートアップ資料
 
Lispのべんきょう
LispのべんきょうLispのべんきょう
Lispのべんきょう
 
20130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT7720130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT77
 
20130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT7720130626 kawasaki.rb NKT77
20130626 kawasaki.rb NKT77
 
Klab expert camp 成果発表
Klab expert camp 成果発表Klab expert camp 成果発表
Klab expert camp 成果発表
 
M1 gp
M1 gpM1 gp
M1 gp
 
バイナリ解析入門
バイナリ解析入門バイナリ解析入門
バイナリ解析入門
 
レイトレ合宿7 発表スライド
レイトレ合宿7 発表スライドレイトレ合宿7 発表スライド
レイトレ合宿7 発表スライド
 
数値計算のための Python + FPGA
数値計算のための Python + FPGA数値計算のための Python + FPGA
数値計算のための Python + FPGA
 
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Lispmeetup #39 MGLの紹介: Common LispによるディープラーニングLispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
Lispmeetup #39 MGLの紹介: Common Lispによるディープラーニング
 
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
 

Destacado

Intra process memory protection for applications on ARM and x86
Intra process memory protection for applications on ARM and x86Intra process memory protection for applications on ARM and x86
Intra process memory protection for applications on ARM and x86Priyanka Aash
 
ABI란 무엇인가요?
ABI란 무엇인가요?ABI란 무엇인가요?
ABI란 무엇인가요?진상 문
 
家に帰るまでが遠足です
家に帰るまでが遠足です家に帰るまでが遠足です
家に帰るまでが遠足ですCryolite
 
C++が仲間になりたそうにこちらを見ている
C++が仲間になりたそうにこちらを見ているC++が仲間になりたそうにこちらを見ている
C++が仲間になりたそうにこちらを見ているfjnl
 
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorAkira Takahashi
 
CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作
CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作
CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作Nobutaka Takushima
 
C# 뉴비를 위한 맛보기
C# 뉴비를 위한 맛보기C# 뉴비를 위한 맛보기
C# 뉴비를 위한 맛보기진상 문
 
SMP Implementation for OpenBSD/sgi [Japanese Edition]
SMP Implementation for OpenBSD/sgi [Japanese Edition]SMP Implementation for OpenBSD/sgi [Japanese Edition]
SMP Implementation for OpenBSD/sgi [Japanese Edition]Takuya ASADA
 
OpenBSD/sgi SMP implementation for Origin 350
OpenBSD/sgi SMP implementation for Origin 350OpenBSD/sgi SMP implementation for Origin 350
OpenBSD/sgi SMP implementation for Origin 350Takuya ASADA
 

Destacado (9)

Intra process memory protection for applications on ARM and x86
Intra process memory protection for applications on ARM and x86Intra process memory protection for applications on ARM and x86
Intra process memory protection for applications on ARM and x86
 
ABI란 무엇인가요?
ABI란 무엇인가요?ABI란 무엇인가요?
ABI란 무엇인가요?
 
家に帰るまでが遠足です
家に帰るまでが遠足です家に帰るまでが遠足です
家に帰るまでが遠足です
 
C++が仲間になりたそうにこちらを見ている
C++が仲間になりたそうにこちらを見ているC++が仲間になりたそうにこちらを見ている
C++が仲間になりたそうにこちらを見ている
 
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
 
CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作
CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作
CEDEC 2013 - 徹底的にチューンしたハイブリッドアプリ「D.O.T. Defender of Texel」の制作
 
C# 뉴비를 위한 맛보기
C# 뉴비를 위한 맛보기C# 뉴비를 위한 맛보기
C# 뉴비를 위한 맛보기
 
SMP Implementation for OpenBSD/sgi [Japanese Edition]
SMP Implementation for OpenBSD/sgi [Japanese Edition]SMP Implementation for OpenBSD/sgi [Japanese Edition]
SMP Implementation for OpenBSD/sgi [Japanese Edition]
 
OpenBSD/sgi SMP implementation for Origin 350
OpenBSD/sgi SMP implementation for Origin 350OpenBSD/sgi SMP implementation for Origin 350
OpenBSD/sgi SMP implementation for Origin 350
 

Similar a Scheme to x86コンパイラ

Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったかm2ym
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
研究生のためのC++ no.7
研究生のためのC++ no.7研究生のためのC++ no.7
研究生のためのC++ no.7Tomohiro Namba
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライドkoturn 0;
 
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門sandai
 
async/await不要論
async/await不要論async/await不要論
async/await不要論bleis tift
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23Masashi Shibata
 
リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道Satoshi Sato
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPyShiqiao Du
 
90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)ryos36
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用MITSUNARI Shigeo
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiKen'ichi Sakiyama
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めMITSUNARI Shigeo
 

Similar a Scheme to x86コンパイラ (20)

Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
研究生のためのC++ no.7
研究生のためのC++ no.7研究生のためのC++ no.7
研究生のためのC++ no.7
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門【学習メモ#4th】12ステップで作る組込みOS自作入門
【学習メモ#4th】12ステップで作る組込みOS自作入門
 
async/await不要論
async/await不要論async/await不要論
async/await不要論
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
 
リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
 
90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)90分 Scheme to C(勝手に抄訳版)
90分 Scheme to C(勝手に抄訳版)
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapi
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
 

Scheme to x86コンパイラ