Sml#探検隊

823 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
823
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
1
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • TwitterとかGithubはこんなアイコンでやっています。\n名古屋から決ました。\n
  • ProofGeneralさんがかわいくなりました。\nシールくばってます。\n\n
  • \n
  • ・スタート系イベントにのっかってみた。(33人)\n・大堀先生と上野さんまで来た豪華スピーカー\n--\n・新しいLTスタイルがうまれた\n
  • ・名古屋にはどえりゃあというカフェがあったんですが、そこで10人くらいでハッカンやりました。\n・SML#コンパイラを改造する会\n・このときの成果物についてはあとでて話します。\n
  • 大堀本の読書会\n
  • 名古屋の人たちはSML#は好きだけどSMLには興味ない\n
  • 名古屋の人たちはSML#は好きだけどSMLには興味ない\n
  • ・おおほり先生の娘さんがかいた\n・not BSD\n
  • ・全部のレコードにidとかnameとかつけても大丈夫””\n
  • \n
  • ・OCaml 296,591、SML# 152,523、GHC 364,766\n・単純な比較はできない\n・改造しやすい\n
  • SMLのopはHaskellやOCamlの人には違和感がある\ncop = curried operator\n
  • \n
  • \n
  • ・ブラウザ上で試せる\n・サンドボックス内で実行している\n・SML#コンパイラ自体には、結局手をいれていない\n
  • \n
  • ・メモ帳でHaskell書いていた人を個人的に知ってますが、普通の人はエディタを使うと思います。\n・世界には2つのエディタがある。どちらが好きですか\n---\n・emacs: sml-mode\n---\n・Eclipse\n----\n・よんたさんが作ってた。最新版のSML#では動かないらしいので、使いたいひとは彼にmentionを送りましょう。\n
  • ・メモ帳でHaskell書いていた人を個人的に知ってますが、普通の人はエディタを使うと思います。\n・世界には2つのエディタがある。どちらが好きですか\n---\n・emacs: sml-mode\n---\n・Eclipse\n----\n・よんたさんが作ってた。最新版のSML#では動かないらしいので、使いたいひとは彼にmentionを送りましょう。\n
  • ・メモ帳でHaskell書いていた人を個人的に知ってますが、普通の人はエディタを使うと思います。\n・世界には2つのエディタがある。どちらが好きですか\n---\n・emacs: sml-mode\n---\n・Eclipse\n----\n・よんたさんが作ってた。最新版のSML#では動かないらしいので、使いたいひとは彼にmentionを送りましょう。\n
  • 選択肢が2つあるなら比較しないといけません。\n
  • \n
  • ・factぐらいならまだしもリアルなコードだと型がわからなくなってしまう。\n・どうやっても無理ならまだ諦めが付くわけですが、各変数の型情はコンパイラは知ってる。\n・なのでコンパイラを改造して、その情報を外から使えるようにします。\n
  • 普通はソースコードをコンパイルして実行ファイルを生成します。\n--\nコンパイラを改造して型情報をダンプしたannotファイルも生成するようにします。それをemacsから読みこむことで、型情報の表示を実現します。\n
  • 普通はソースコードをコンパイルして実行ファイルを生成します。\n--\nコンパイラを改造して型情報をダンプしたannotファイルも生成するようにします。それをemacsから読みこむことで、型情報の表示を実現します。\n
  • SML#コンパイラ、というかコンパイラは複数のパスによって構成されています。\nSML#コンパイラの場合、こんな感じになっています。(ちょっと待つ)\n
  • 今回は型情報のダンプが目的なので、後半の最適化やコード生成は無視します。\nで、最初のほうを見るとちょうど型推論をやっているパスが見つかります。\n--\nこの型推論がおわった直後に型情報をダンプしてやればよさそうです。\n--\nなのでこのあとに処理を追加して、ダンプできるようにします。\n
  • 今回は型情報のダンプが目的なので、後半の最適化やコード生成は無視します。\nで、最初のほうを見るとちょうど型推論をやっているパスが見つかります。\n--\nこの型推論がおわった直後に型情報をダンプしてやればよさそうです。\n--\nなのでこのあとに処理を追加して、ダンプできるようにします。\n
  • \n
  • \n
  • \n
  • ・宣言の型はこんな感じになっています。\n・フォントが小さくてみにくいと思うので、みなさんのローカルにあるSML#コードを直接見ていただいても結構です。...とうぜんダウンロードしてありますよね?\n・SML#の各宣言がコンストラクタに対応しています。上から順に関数宣言、多相の関数宣言、変数宣言になってます。\n---\n・ポイントは型情報と位置情報が含まれているということです。\n
  • ・宣言の型はこんな感じになっています。\n・フォントが小さくてみにくいと思うので、みなさんのローカルにあるSML#コードを直接見ていただいても結構です。...とうぜんダウンロードしてありますよね?\n・SML#の各宣言がコンストラクタに対応しています。上から順に関数宣言、多相の関数宣言、変数宣言になってます。\n---\n・ポイントは型情報と位置情報が含まれているということです。\n
  • ・(受けてたら)フォントが小さくてみにくいと思うので、みなさんのローカルにあるSML#コードを..\n・今度は式に対応するdatatypeです。上から順にsqlserverへの接続、適用、変数参照になってます。\n・これも型情報と位置情報が埋め込まれています\n
  • ・(受けてたら)フォントが小さくてみにくいと思うので、みなさんのローカルにあるSML#コードを..\n・今度は式に対応するdatatypeです。上から順にsqlserverへの接続、適用、変数参照になってます。\n・これも型情報と位置情報が埋め込まれています\n
  • ・型はtyToStringで文字列にできる\n・位置情報はlineOfPosで行番号、colOfPosで列番号がとれる\n
  • ・これで情報はそろったのでダンプするコードをがしがし書いていきます。\n・基本的にtpdeclとtpexpをなめていくコードになります\n
  • \n
  • \n
  • ・常にダンプするのも微妙なので、スイッチで切り替えれるようにする\n
  • \n
  • \n
  • \n
  • ・camlspotterっぽくしたい\n・多相レコードの型がうまく文字列化できない\n
  • これでみなさんもSML#を改造したくなったと思うので、いくつか開発tipsを紹介しておわろうと思います。\n
  • \n
  • 最近、MacがとれてOS Xのみになったとかそういう細かいことは許してください。\n64bitでビルドできないわけじゃないんですが、まあ、いろいろと面倒なので、いろいろ試すときはUbuntuのほうが楽です。\n
  • \n
  • Sml#探検隊

    1. 1. SML#探検隊 @mzp 1
    2. 2. @mzp 2
    3. 3. おしらせ 3
    4. 4. おしらせ 3
    5. 5. 名古屋におけるSML#熱の高 まり 元々はOCaml/Coqユー ザが多かった 1年ぐらい前からSML#熱 が高まりつつある 4
    6. 6. スタートSML# 1 Text 5
    7. 7. スタートSML# 1 LT発表者 Text 5
    8. 8. スタートSML# 2a.k.a. SML# Hackathon 6
    9. 9. 名古屋SML読書会 2回で消滅 7
    10. 10. 名古屋SML読書会 2回で消滅 主催者 7
    11. 11. 考察名古屋の人たち 8
    12. 12. 考察 SML# 好き名古屋の人たち 8
    13. 13. 考察 SML# 好き 興味ない名古屋の人たち SML 8
    14. 14. SML#の特徴マスコットがかわいい 9
    15. 15. SML#の特徴 多相レコード# fun get_x x = #x x;val get_x = fn : [a#{x: b}, b.a -> b]# get_x { x = 1, y = 2 };val it = 1 : int# get_x { x = 1, y = 2, z = 3 };val it = 1 : int 10
    16. 16. SML#の特徴 Cが呼べる# val puts = _import "puts" :string -> int;val puts = fn : string -> int# puts "hello";helloval it = 10 : int 11
    17. 17. SML#の特徴コンパイラがコンパクト400000300000200000100000 0 ghc OCaml SML# 12
    18. 18. 魔改造SML#: cop# op +;val it = <fun> : (int, int) -> int# cop +;val it = <fun> : int -> int -> int 13
    19. 19. 魔改造SML#: annot型情報の表示詳しくは後述 14
    20. 20. 魔改造SML#:LLVM(開発中) ↓開発中 @chunjp 15
    21. 21. Try SML#http://proofcafe.org/trysmlsharp 16
    22. 22. SML#+annotの紹介 17
    23. 23. エディタの紹介どのエディタが好きですか? or 18
    24. 24. エディタの紹介どのエディタが好きですか? or Emacs 18
    25. 25. エディタの紹介どのエディタが好きですか? or Emacs Eclipse 18
    26. 26. エディタの紹介どのエディタが好きですか? or Emacs Eclipse @keita44_f4 18
    27. 27. Emacs v.s. Eclipse 19
    28. 28. Emacs v.s. Eclipse 19
    29. 29. Emacsだと型が分からないfun fact n = if n = 0 then 1 else n * fact (n - 1) 20
    30. 30. Emacsだと型が分からないfun fact n = if n = 0 then 1 この型は? else n * fact (n - 1) 20
    31. 31. 型が分からないと困る.....struct structure MLLex = MLLexFun(structure Tokens = MLLrVals.Tokens) structure ParserData = MLLrVals.ParserData val makeLexer = fn s => fn arg => LrParser.Stream.streamify (MLLex.makeLexer s arg) val LrParse = fn (lookahead,lexer,error,arg) => (fn (a,b) => (MLLrVals.ParserData.Actions.extracta,b)) (LrParser.parse {table = ParserData.table, lexer=lexer,..... 21
    32. 32. 型が分からないと困る.....struct structure MLLex = MLLexFun(structure Tokens = MLLrVals.Tokens) ?????? structure ParserData = MLLrVals.ParserData val makeLexer = fn s => fn arg => LrParser.Stream.streamify (MLLex.makeLexer s arg) val LrParse = fn (lookahead,lexer,error,arg) => (fn (a,b) => (MLLrVals.ParserData.Actions.extracta,b)) (LrParser.parse {table = ParserData.table, lexer=lexer,..... 21
    33. 33. 改造の方針foo.sml SML#コンパイラ a.out 22
    34. 34. 改造の方針foo.sml SML#コンパイラ a.out foo.annot 22
    35. 35. 改造の方針foo.sml SML#コンパイラ a.out foo.annot 22
    36. 36. LoadFile DatatypeCompilati doBitmapANormal doRTLX86Emit Elaboration doStaticAnalysis doClosureConversi doRTLX86AsmGenVALRECOptimizati doInlining toYAANormal doRTLX86AssemblFundeclElaboration doMVOptimization doYAANormalOpti TypeInference doFunctionLocalize doStaticAllocationUncurryOptimizatio doStaticAnalysis doAIGeneration2PrinterGeneration doInlining doRTLX86SelectMatchCompilation doMVOptimization doRTLX86Stabilize FFICompilation doFunctionLocalize doRTLRenameRecordCompilation doBitmapCompilati doRTLX86Coloring
    37. 37. LoadFile DatatypeCompilati doBitmapANormal doRTLX86Emit Elaboration doStaticAnalysis doClosureConversi doRTLX86AsmGenVALRECOptimizati doInlining toYAANormal doRTLX86AssemblFundeclElaboration doMVOptimization doYAANormalOpti TypeInference doFunctionLocalize doStaticAllocationUncurryOptimizatio doStaticAnalysis doAIGeneration2PrinterGeneration doInlining doRTLX86SelectMatchCompilation doMVOptimization doRTLX86Stabilize FFICompilation doFunctionLocalize doRTLRenameRecordCompilation doBitmapCompilati doRTLX86Coloring
    38. 38. 型推論直後を狙う ElaborationVALRECOptimizationFundeclElaboration TypeInferenceUncurryOptimization 24
    39. 39. 型推論直後を狙う ElaborationVALRECOptimizationFundeclElaboration TypeInferenceUncurryOptimization 24
    40. 40. 型推論直後を狙う ElaborationVALRECOptimizationFundeclElaboration 型情報のダンプを TypeInference 追加するUncurryOptimization 24
    41. 41. 宣言の型 src/compiler/typedcalc/main/TypedCalc.ppg.smidatatype tpdecl = ... | TPFUNDECL of { argTyList:Types.ty list, bodyTy:Types.ty, funVarInfo:Types.varInfo, ruleList:{args:tppat list, body:tpexp} list} list * Loc.loc | TPPOLYFUNDECL of Types.btvEnv * { argTyList:Types.ty list, bodyTy:Types.ty, funVarInfo:Types.varInfo, ruleList:{args:tppat list, body:tpexp} list} list * Loc.loc | TPVAL of (Types.varInfo * tpexp) list * Loc.loc 25
    42. 42. 宣言の型 src/compiler/typedcalc/main/TypedCalc.ppg.smidatatype tpdecl = ... 型情報 | TPFUNDECL of { argTyList:Types.ty list, bodyTy:Types.ty, funVarInfo:Types.varInfo, ruleList:{args:tppat list, body:tpexp} list} list * Loc.loc | TPPOLYFUNDECL of Types.btvEnv * { argTyList:Types.ty list, bodyTy:Types.ty, funVarInfo:Types.varInfo, ruleList:{args:tppat list, body:tpexp} list} list * Loc.loc | TPVAL of (Types.varInfo * tpexp) list * Loc.loc 25
    43. 43. 宣言の型 src/compiler/typedcalc/main/TypedCalc.ppg.smidatatype tpdecl = ... 型情報 | TPFUNDECL of { argTyList:Types.ty list, bodyTy:Types.ty, funVarInfo:Types.varInfo, 位置情報 ruleList:{args:tppat list, body:tpexp} list} list * Loc.loc | TPPOLYFUNDECL of Types.btvEnv * { argTyList:Types.ty list, bodyTy:Types.ty, funVarInfo:Types.varInfo, ruleList:{args:tppat list, body:tpexp} list} list * Loc.loc | TPVAL of (Types.varInfo * tpexp) list * Loc.loc 25
    44. 44. 式の型datatype tpexp = ...| TPSQLSERVER of {loc:Loc.loc, resultTy:Types.ty, schema:Types.ty LabelEnv.map LabelEnv.map, server:string}| TPTAPP of {exp:tpexp, expTy:Types.ty, instTyList:Types.ty list, loc:Loc.loc}| TPVAR of Types.varInfo * Loc.loc 26
    45. 45. 式の型datatype tpexp = ...| TPSQLSERVER of {loc:Loc.loc, resultTy:Types.ty, schema:Types.ty LabelEnv.map LabelEnv.map, server:string}| TPTAPP of {exp:tpexp, expTy:Types.ty, instTyList:Types.ty list, loc:Loc.loc}| TPVAR of Types.varInfo * Loc.loc 型情報 26
    46. 46. 式の型datatype tpexp = ...| TPSQLSERVER of {loc:Loc.loc, resultTy:Types.ty, schema:Types.ty LabelEnv.map LabelEnv.map, server:string}| TPTAPP of {exp:tpexp, expTy:Types.ty, instTyList:Types.ty list, loc:Loc.loc}| TPVAR of Types.varInfo * Loc.loc 型情報 位置情報 26
    47. 47. 型の型・位置の型structure Types = struct val tyToString : ty -> stringendstructure Loc = struct ... val fileNameOfPos : pos -> string val lineOfPos : pos -> int val colOfPos : pos -> intend 27
    48. 48. 型情報のダンプfun outputExpr stream (e : tpexp) =      case e of        TPAPPM {funTy, loc, funExp, argExpList, ...} =>        (annot stream loc funTy;         outputExpr stream funExp;         List.app (outputExpr stream) argExpList)      | TPCASEM {ruleBodyTy, loc, expList, ruleList, ...} =>        (annot stream loc ruleBodyTy;         List.app (outputExpr stream) expList;         List.app (fn x => outputExpr stream (#body x)) ruleList)      | TPCAST (exp, ty, loc) =>        (annot stream loc ty;         outputExpr stream exp)      | TPCONSTANT {loc, ty, ...} =>        annot stream loc ty      | TPDATACONSTRUCT {loc, con, argExpOpt, ...} =>        (annot stream loc (#ty con);         case argExpOpt of             SOME x =>             outputExpr stream x 28
    49. 49.  | TPERROR =>       ()     | TPEXNCONSTRUCT {argExpOpt, exn,loc, ...} =>       (case exn of           EXEXN i =>           annot stream loc (#ty i)         | EXN i =>           annot stream loc (#ty i);        case argExpOpt of            SOME x =>            outputExpr stream x          | NONE =>            ())     | TPEXN_CONSTRUCTOR {exnInfo, loc} =>       annot stream loc (#ty exnInfo)     | TPEXEXN_CONSTRUCTOR {exExnInfo, loc} =>       annot stream loc (#ty exExnInfo)     | TPEXVAR (info, loc) =>       annot stream loc (#ty info)     | TPFFIIMPORT {loc, ptrExp:tpexp, stubTy:Types.ty,...} =>       (annot stream loc stubTy;        outputExpr stream ptrExp) 29
    50. 50. |  | TPFNM {bodyExp, bodyTy, loc, ...} =>     (annot stream loc bodyTy;      outputExpr stream bodyExp)   | TPGLOBALSYMBOL {loc, ty, ...} =>     annot stream loc ty   | TPHANDLE {exnVar, exp, handler, loc} =>     (annot stream loc (#ty exnVar);      outputExpr stream exp;      outputExpr stream handler)   | TPLET {body, decls, loc, tys} =>     (List.app (outputExpr stream) body;      List.app (outputDecl stream) decls     )   | TPMODIFY {elementExp , loc, recordExp, recordTy, ...} =>     (annot stream loc recordTy;      outputExpr stream elementExp;      outputExpr stream recordExp)   | TPMONOLET { binds, bodyExp, loc} =>     (List.app (fn (_,exp) =>                   outputExpr stream exp) binds;      outputExpr stream bodyExp)   | TPOPRIMAPPLY {argExp, loc, oprimOp, ...} =>     (annot stream loc (#ty oprimOp);      outputExpr stream argExp)   | TPPOLY {exp, expTyWithoutTAbs, loc, ...} =>     (annot stream loc expTyWithoutTAbs;      outputExpr stream exp) 30   | TPPOLYFNM {bodyExp, bodyTy, loc, ...} =>
    51. 51. スイッチsrc/compiler/control/main/Control.ppgval annot = ref falseval switchTable : switchTable =[  .... ("annot", BoolSwitch annot)]src/compiler/toplevel2/main/Top.smlif ! Control.annot then  Annot.dump tpcalcelse  () 31
    52. 52. 使い方$ lsfact.sml$ smlsharp -d annot=yes fact.sml$ lsa.out fact.sml fact.annot 32
    53. 53. EmacsLisp 33
    54. 54. デモ34
    55. 55. 今後の目標変数の参照元ジャンプ多相レコードの表示 35
    56. 56. 開発Tips--enable-fast-buildは意味がないmake -jは失敗する 36
    57. 57. 開発Tips for WindowsMingwでのビルドは無理 37
    58. 58. 開発Tips for WindowsMingwでのビルドは無理 Ubuntu(32bit)を使おう 37
    59. 59. 開発Tips for MacOS X64bitでのビルドは難しい 38
    60. 60. 開発Tips for MacOS X64bitでのビルドは難しい Ubuntu(32bit)を使おう 38
    61. 61. まとめ今、SML#がアツいSML#を改造するの楽しい型情報を表示する拡張をいれた(Emacsのみ)改造するときはLinuxでやろう 39

    ×