parsecサイコー。llvm-general難しい
HaskellͰLLVM Frontend2014/5/11 Toshihiro Yagi
View Slide
About meTwitter : @sys1yagiBlog : http://sys1yagi.com!!Android Engineer at
Status• ͍͢͝HຊΛಡॻձͰಡΜͩ• Haskell͕ଟগಡΊΔΑ͏ʹͳͬͨ• MaybeϞφυཧղ͍ͯ͠Δɻଟ• ීஈॻ͍͍ͯΔίʔυ98%͘Β͍Java
Ζ͏ͱࢥͬͯͨࣄ• EBNFύʔαΛ࡞Δ• EBNFΛύʔεͯ͠ੜͨ͠ASTΛͬͯLLVM IRΛు͘ϞδϡʔϧΛ࡞Δ• EBNFϑΝΠϧͱɺLLVM IRు͘ϞδϡʔϧͰͳΜ͔͍͍ײ͡ʹίϯύΠϧ͢Δ
ͬͨࣄ• ʮ48࣌ؒͰSchemeΛॻ͜͏ʯͰSchemeͷΠϯλϓϦλΛREPLลΓ·Ͱ࣮• Implementing a JIT Compiled Language with Haskelland 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%86http://www.stephendiehl.com/llvm/
Demohttps://github.com/sys1yagi/scheme-haskell-llvm
Environment• Mac Book Pro OSX 10.9.2• GHC 7.6.3• Cabal 1.20.0.1• Sublime Text 2
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
Parsec• ੜ࢈ੑ͕ߴ͘ϞφσΟοΫͳύʔαίϯϏωʔλɻඪ४ϥΠϒϥϦɻBNFΆ͍هड़Ͱॻ͚Δ• <|> : ࣈ۟ղੳΛ͢ΔύʔαΛͭͳ͛Δ ex: var | val• many : ࢦఆͨ͠ύλʔϯʹ0ճҎ্Ϛον͢Δɻ ex:{ args }• many1 : ࢦఆͨ͠ύλʔϯʹ1ճҎ্Ϛον͢Δ ex:{ Uppercase }+• optional : ࢦఆͨ͠ύλʔϯ͕1ճ͋ͬͯͳͯ͘Մ ex: [ args ]• try : ࢦఆͨ͠ύλʔϯʹϚον͠ͳ͍߹όοϑΝΛר͖ͯ࣍͠ͷύλʔϯͷϚονΛࢼΈΔ
γϯϘϧΛఆٛύʔαΛฒΔύʔαΛॻ͘
LLVM• http://www.stephendiehl.com/llvm/ Λࢀߟʹɻ• LLVM3.4ΛίϯύΠϧͯ͠Πϯετʔϧ• llvm-general, llvm-general-pureͱ͍͏packageΛ͏• ࡞ͬͨASTΛḷͬͯLLVM IRΛు͔ͤΔ• emscriptenΛΠϯετʔϧɺemscriptenଆfastcompͱ͍͏LLVM࣮Λ͏
৭ʑLLVMͷઃఆͱ͔ॻ͍ͯASTḷͬͯ.llΛు͘
શମ૾Main.hsSyntax.hs Lexer.hs Codegen.hsEmit.hssource file(scheme)inputAST LLVM Assemblyࠓճ࡞ͬͨൣғllvm-acemccLLVM Bitcodehoge.js
·ͱΊ• ࣮ݱੑΛઌʹߟ͑ͯ͠·࣮ͬͯ༻ੑ…·ͰͨͲΓண͚ͳ͔ͬͨ• ΠϯλϓϦλͱLLVMͷ྆ํେมͳͷͰɺ1ͭͣͭͬͨํ͕Α͔ͬͨ• ParsecšŘŠŖɻJavaCCͱ͔ͰΔΑΓѹతʹָ• LLVMͱ͔͘ɺParsecͰ৭ʑΕͦ͏