equal
deleted
inserted
replaced
|
1 |
|
2 env = [i => 0, i => 1] |
|
3 |
|
4 |
|
5 def time_needed[T](code: => T) = { |
|
6 val start = System.nanoTime() |
|
7 code |
|
8 val end = System.nanoTime() |
|
9 (end - start)/(1.0e9) |
|
10 } |
|
11 |
|
12 time_needed(1, 1 + 2) |
|
13 |
|
14 def time_needed[T](f: T => T, arg: T) = { |
|
15 val start = System.nanoTime() |
|
16 f(arg) |
|
17 val end = System.nanoTime() |
|
18 (end - start)/(1.0e9) |
|
19 } |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
1 // A Small LLVM Compiler for a Simple Functional Language |
26 // A Small LLVM Compiler for a Simple Functional Language |
2 // (includes a lexer and parser) |
27 // (includes a lexer and parser) |
3 // |
28 // |
4 // |
29 // |
5 // call with |
30 // call with |
101 |
126 |
102 def draw(k: KVal) = "│" ++ draw_val(k, "", false) |
127 def draw(k: KVal) = "│" ++ draw_val(k, "", false) |
103 |
128 |
104 // val k1 = KVar("foo") |
129 // val k1 = KVar("foo") |
105 // val k2 = KNum(1) |
130 // val k2 = KNum(1) |
106 // val k3 = Kop("-", Kop("+", k1, k2), KNum(2)) |
131 // val k3 = Kop("-", Kop("+", k1, k2), KNum(2)) // not in SSA-form |
107 // println(draw(k3).mkString) |
132 // println(draw(k3)) |
108 // println(draw(KCall("bar", List(k1,k2,k3,k2,k1))).mkString) |
133 // println(draw(KCall("bar", List(k1,k2,k3,k2,k1)))) |
109 |
134 |
110 |
135 |
111 // CPS translation from Exps to KExps using a |
136 // CPS translation from Exps to KExps using a |
112 // continuation k. |
137 // continuation k. |
113 def CPS(e: Exp)(k: KVal => KExp) : KExp = e match { |
138 def CPS(e: Exp)(k: KVal => KExp) : KExp = e match { |
141 CPS(e)(y => KLet(z, KWrite(y), k(KVar(z)))) |
166 CPS(e)(y => KLet(z, KWrite(y), k(KVar(z)))) |
142 } |
167 } |
143 } |
168 } |
144 |
169 |
145 //initial continuation |
170 //initial continuation |
146 def CPSi(e: Exp) = CPS(e)(KReturn(_)) |
171 def CPSi(e: Exp) = CPS(e)(x => KReturn(x)) |
147 |
172 |
148 |
173 //write (1 + a) |
|
174 println(CPSi(Write(Aop("+", Num(1), Var("a")))).toString) |
149 |
175 |
150 //some testcases: |
176 //some testcases: |
151 // (1 + 2) * 3 |
177 // (1 + 2) * 3 |
152 println(CPSi(Aop("*", Aop("+", Num(1), Num(2)), Num(3))).toString) |
178 println(CPSi(Aop("*", Aop("+", Num(1), Num(2)), Num(3))).toString) |
153 |
179 |