Slide 1

Slide 1 text

HaskellͰLLVM Frontend 2014/5/11 Toshihiro Yagi

Slide 2

Slide 2 text

About me Twitter : @sys1yagi Blog : http://sys1yagi.com ! ! Android Engineer at

Slide 3

Slide 3 text

Status • ͍͢͝HຊΛಡॻձͰಡΜͩ • Haskell͕ଟগಡΊΔΑ͏ʹͳͬͨ • MaybeϞφυ͸ཧղ͍ͯ͠Δɻଟ෼ • ීஈॻ͍͍ͯΔίʔυ͸98%͘Β͍Java

Slide 4

Slide 4 text

΍Ζ͏ͱࢥͬͯͨࣄ • EBNFύʔαΛ࡞Δ • EBNFΛύʔεͯ͠ੜ੒ͨ͠ASTΛ࢖ͬͯLLVM IRΛ ు͘ϞδϡʔϧΛ࡞Δ • EBNFϑΝΠϧͱɺLLVM IRు͘ϞδϡʔϧͰͳΜ ͔͍͍ײ͡ʹίϯύΠϧ͢Δ

Slide 5

Slide 5 text

΍ͬͨࣄ • ʮ48࣌ؒͰSchemeΛॻ͜͏ʯͰSchemeͷΠϯλϓϦ λΛREPLลΓ·Ͱ࣮૷ • Implementing a JIT Compiled Language with Haskell and LLVMͰṖݴޠΛLLVM IRʹίϯύΠϧ͢ΔౕΛ৮Δ • SchemeΛίϯύΠϧͯ͠LLVM IRʹు͘Α͏ʹͨ͠(ͱ ͍ͬͯ΋਺஋ܭࢉ෦෼ͷΈ) • LLVM IRΛemscriptenͰjsʹ͢Δ http://ja.wikibooks.org/wiki/48%E6%99%82%E9%96%93%E3%81%A7Scheme%E3%82%92%E6%9B%B8%E3%81%93%E3%81%86 http://www.stephendiehl.com/llvm/

Slide 6

Slide 6 text

Demo https://github.com/sys1yagi/scheme-haskell-llvm

Slide 7

Slide 7 text

Environment • Mac Book Pro OSX 10.9.2 • GHC 7.6.3 • Cabal 1.20.0.1 • Sublime Text 2

Slide 8

Slide 8 text

Scheme • ParsecͰΰϦΰϦɻ • ϦετදݱɺϓϦϛςΟϒͳؔ਺ͱifࣜ·Ͱ࣮૷ • REPLͰಈ͘ • ΄΅͜Εˣ http://ja.wikibooks.org/wiki/48%E6%99%82%E9%96%93%E3%81%A7Scheme%E3%82%92%E6%9B%B8%E3%81%93%E3%81%86

Slide 9

Slide 9 text

Parsec • ੜ࢈ੑ͕ߴ͘ϞφσΟοΫͳύʔαίϯϏωʔλɻ ඪ४ϥΠϒϥϦɻBNFΆ͍هड़Ͱॻ͚Δ • <|> : ࣈ۟ղੳΛ͢ΔύʔαΛͭͳ͛Δ ex: var | val • many : ࢦఆͨ͠ύλʔϯʹ0ճҎ্Ϛον͢Δɻ ex:{ args } • many1 : ࢦఆͨ͠ύλʔϯʹ1ճҎ্Ϛον͢Δ ex:{ Uppercase }+ • optional : ࢦఆͨ͠ύλʔϯ͕1ճ͋ͬͯ΋ͳͯ͘΋Մ ex: [ args ] • try : ࢦఆͨ͠ύλʔϯʹϚον͠ͳ͍৔߹όοϑΝΛר͖໭ͯ࣍͠ͷύλʔϯ ͷϚονΛࢼΈΔ

Slide 10

Slide 10 text

γϯϘϧΛఆٛ ύʔαΛฒ΂Δ ύʔαΛॻ͘

Slide 11

Slide 11 text

LLVM • http://www.stephendiehl.com/llvm/ Λࢀߟʹɻ • LLVM3.4ΛίϯύΠϧͯ͠Πϯετʔϧ • llvm-general, llvm-general-pureͱ͍͏packageΛ࢖͏ • ࡞ͬͨASTΛḷͬͯLLVM IRΛు͔ͤΔ • emscriptenΛΠϯετʔϧɺemscriptenଆ͸fastcomp ͱ͍͏LLVM࣮૷Λ࢖͏

Slide 12

Slide 12 text

৭ʑLLVMͷઃఆͱ͔ॻ͍ͯ ASTḷͬͯ.llΛు͘

Slide 13

Slide 13 text

શମ૾ Main.hs Syntax.hs Lexer.hs Codegen.hs Emit.hs source file(scheme) input AST LLVM Assembly ࠓճ࡞ͬͨൣғ llvm-ac emcc LLVM Bitcode hoge.js

Slide 14

Slide 14 text

·ͱΊ • ࣮ݱੑΛઌʹߟ͑ͯ͠·࣮ͬͯ༻ੑ…·Ͱ͸ͨͲΓ ண͚ͳ͔ͬͨ • ΠϯλϓϦλͱLLVMͷ྆ํ͸େมͳͷͰɺ1ͭͣͭ ΍ͬͨํ͕Α͔ͬͨ • Parsec͸šŘŠŖɻJavaCCͱ͔Ͱ΍ΔΑΓѹ౗తʹָ • LLVM͸ͱ΋͔͘ɺParsecͰ৭ʑ΍Εͦ͏