Sml#探検隊
Upcoming SlideShare
Loading in...5
×
 

Sml#探検隊

on

  • 736 views

 

Statistics

Views

Total Views
736
Views on SlideShare
727
Embed Views
9

Actions

Likes
1
Downloads
0
Comments
0

1 Embed 9

http://192.168.0.50 9

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \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#探検隊 Sml#探検隊 Presentation Transcript

  • SML#探検隊 @mzp 1
  • @mzp 2
  • おしらせ 3
  • おしらせ 3
  • 名古屋におけるSML#熱の高 まり 元々はOCaml/Coqユー ザが多かった 1年ぐらい前からSML#熱 が高まりつつある 4
  • スタートSML# 1 Text 5
  • スタートSML# 1 LT発表者 Text 5
  • スタートSML# 2a.k.a. SML# Hackathon 6
  • 名古屋SML読書会 2回で消滅 7
  • 名古屋SML読書会 2回で消滅 主催者 7
  • 考察名古屋の人たち 8
  • 考察 SML# 好き名古屋の人たち 8
  • 考察 SML# 好き 興味ない名古屋の人たち SML 8
  • SML#の特徴マスコットがかわいい 9
  • 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
  • SML#の特徴 Cが呼べる# val puts = _import "puts" :string -> int;val puts = fn : string -> int# puts "hello";helloval it = 10 : int 11
  • SML#の特徴コンパイラがコンパクト400000300000200000100000 0 ghc OCaml SML# 12
  • 魔改造SML#: cop# op +;val it = <fun> : (int, int) -> int# cop +;val it = <fun> : int -> int -> int 13
  • 魔改造SML#: annot型情報の表示詳しくは後述 14
  • 魔改造SML#:LLVM(開発中) ↓開発中 @chunjp 15
  • Try SML#http://proofcafe.org/trysmlsharp 16
  • SML#+annotの紹介 17
  • エディタの紹介どのエディタが好きですか? or 18
  • エディタの紹介どのエディタが好きですか? or Emacs 18
  • エディタの紹介どのエディタが好きですか? or Emacs Eclipse 18
  • エディタの紹介どのエディタが好きですか? or Emacs Eclipse @keita44_f4 18
  • Emacs v.s. Eclipse 19
  • Emacs v.s. Eclipse 19
  • Emacsだと型が分からないfun fact n = if n = 0 then 1 else n * fact (n - 1) 20
  • Emacsだと型が分からないfun fact n = if n = 0 then 1 この型は? else n * fact (n - 1) 20
  • 型が分からないと困る.....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
  • 型が分からないと困る.....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
  • 改造の方針foo.sml SML#コンパイラ a.out 22
  • 改造の方針foo.sml SML#コンパイラ a.out foo.annot 22
  • 改造の方針foo.sml SML#コンパイラ a.out foo.annot 22
  • 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
  • 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
  • 型推論直後を狙う ElaborationVALRECOptimizationFundeclElaboration TypeInferenceUncurryOptimization 24
  • 型推論直後を狙う ElaborationVALRECOptimizationFundeclElaboration TypeInferenceUncurryOptimization 24
  • 型推論直後を狙う ElaborationVALRECOptimizationFundeclElaboration 型情報のダンプを TypeInference 追加するUncurryOptimization 24
  • 宣言の型 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
  • 宣言の型 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
  • 宣言の型 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
  • 式の型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
  • 式の型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
  • 式の型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
  • 型の型・位置の型structure Types = struct val tyToString : ty -> stringendstructure Loc = struct ... val fileNameOfPos : pos -> string val lineOfPos : pos -> int val colOfPos : pos -> intend 27
  • 型情報のダンプ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
  •  | 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
  • |  | 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, ...} =>
  • スイッチ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
  • 使い方$ lsfact.sml$ smlsharp -d annot=yes fact.sml$ lsa.out fact.sml fact.annot 32
  • EmacsLisp 33
  • デモ34
  • 今後の目標変数の参照元ジャンプ多相レコードの表示 35
  • 開発Tips--enable-fast-buildは意味がないmake -jは失敗する 36
  • 開発Tips for WindowsMingwでのビルドは無理 37
  • 開発Tips for WindowsMingwでのビルドは無理 Ubuntu(32bit)を使おう 37
  • 開発Tips for MacOS X64bitでのビルドは難しい 38
  • 開発Tips for MacOS X64bitでのビルドは難しい Ubuntu(32bit)を使おう 38
  • まとめ今、SML#がアツいSML#を改造するの楽しい型情報を表示する拡張をいれた(Emacsのみ)改造するときはLinuxでやろう 39