Arantium Maestum

プログラミング、囲碁、読書の話題

2021-05-01から1ヶ月間の記事一覧

OCamlのlambda IRをいじる(代数的データ型)

代数型データ型とそれに対するパターンマッチのlambda IRへのコンパイルを見ていく タグのみ直和型 まずは簡単なタグのみ直和型を見てみる: type t = A | B | C let () = let x = C in match x with | A -> print_int 1 | B -> print_int 2 | C -> print_in…

OCamlのlambda IRをいじる(レコード)

レコード型を定義して使うコードがどのようにlambda IRにコンパイルされるかを見ていく。 定義して使う 簡単なレコード型を定義した上でa.xなどとアクセスして使ってみる: type t = { x : int; y : string } let () = let a = {x=1; y="hello"} in print_en…

OCamlのlambda IRをいじる(リスト)

リストとパターンマッチ、Listモジュール使用のコンパイルを見ていく。 簡単なパターンマッチ 簡単なリストを作り、リストのコンストラクタ2つに対しての素直なパターンマッチをする: let () = let xs = [1;2] in match xs with | [] -> print_endline "he…

OCamlのlambda IRをいじる(タプル)

タプルとそれに対するパターンマッチがどうlambda IRにコンパイルされるかを見ていく。 fst/snd まずは非常に簡単なタプルと、その値をfst/sndでアクセスするコード: let () = let x = (1,2) in print_int @@ (fst x) + (snd x) -dlambdaでコンパイル: (se…

OCamlのlambda IRをいじる(再帰関数)

再帰関数のことを忘れていた! というわけで幕間的な記事。 Factorial 再帰で階乗なコード: let () = let rec f x = if x = 0 then 1 else x * (f (x-1)) in print_int @@ f 5 -dlambdaでコンパイル: (seq (let (*match*/83 = (letrec (f/80 (function x/8…

OCamlのlambda IRをいじる(関数)

前回に続いて、ローカルとモジュールレベルでの関数定義がどうlambda IRにコンパイルされるかを見ていく。 ローカル関数 まずはこんな感じの簡単な関数: let () = let f x = x + 1 in print_int @@ f 5 ocamlopt -c -dlambda localfunc.mlなどとすると: (s…

OCamlのlambda IRをいじる(変数)

前回に続いて、モジュール内で変数を定義して使うプログラムがどのようなlambda IRにコンパイルされるかを見ていく。 ローカル変数1つ OCamlで変数を定義する場合、モジュールのトップレベルでの定義と、ある式の一部としてlet x = y in zのxのような定義の…

OCamlのlambda IRをいじる(はじめに)

OCamlのコンパイラの話題でよく聞くflambdaという最適化ステップについて資料を読んでいた: https://ocaml.org/meetings/ocaml/2013/slides/chambart.pdf スライド5にコンパイラの中間表現のステップと説明が書いてあったのが面白かった。 parse tree: AST…