194 val instructions = compile_block(bl, Map.empty)._1 |
194 val instructions = compile_block(bl, Map.empty)._1 |
195 (beginning ++ instructions.mkString ++ ending).replaceAllLiterally("XXX", class_name) |
195 (beginning ++ instructions.mkString ++ ending).replaceAllLiterally("XXX", class_name) |
196 } |
196 } |
197 |
197 |
198 |
198 |
|
199 // compiling and running files |
|
200 // |
|
201 // JVM files can be assembled with |
|
202 // |
|
203 // java -jar jvm/jasmin-2.4/jasmin.jar fib.j |
|
204 // |
|
205 // and started with |
|
206 // |
|
207 // java fib/fib |
|
208 |
|
209 |
|
210 |
|
211 import scala.util._ |
|
212 import scala.sys.process._ |
|
213 import scala.io |
|
214 |
|
215 def compile_tofile(bl: Block, class_name: String) = { |
|
216 val output = compile(bl, class_name) |
|
217 val fw = new java.io.FileWriter(class_name + ".j") |
|
218 fw.write(output) |
|
219 fw.close() |
|
220 } |
|
221 |
|
222 def compile_all(bl: Block, class_name: String) : Unit = { |
|
223 compile_tofile(bl, class_name) |
|
224 println("compiled ") |
|
225 val test = ("java -jar jvm/jasmin-2.4/jasmin.jar " + class_name + ".j").!! |
|
226 println("assembled ") |
|
227 } |
|
228 |
|
229 def time_needed[T](i: Int, code: => T) = { |
|
230 val start = System.nanoTime() |
|
231 for (j <- 1 to i) code |
|
232 val end = System.nanoTime() |
|
233 (end - start)/(i * 1.0e9) |
|
234 } |
|
235 |
|
236 |
|
237 def compile_run(bl: Block, class_name: String) : Unit = { |
|
238 println("Start compilation") |
|
239 compile_all(bl, class_name) |
|
240 println("Time: " + time_needed(1, ("java " + class_name + "/" + class_name).!)) |
|
241 } |
|
242 |
|
243 |
199 // Fibonacci numbers as a test-case |
244 // Fibonacci numbers as a test-case |
200 val fib_test = |
245 val fib_test = |
201 List(Read("n"), // read n; |
246 List(Assign("n", Num(10)), // n := 10; |
202 Assign("minus1",Num(0)), // minus1 := 0; |
247 Assign("minus1",Num(0)), // minus1 := 0; |
203 Assign("minus2",Num(1)), // minus2 := 1; |
248 Assign("minus2",Num(1)), // minus2 := 1; |
204 Assign("temp",Num(0)), // temp := 0; |
249 Assign("temp",Num(0)), // temp := 0; |
205 While(Bop("<",Num(0),Var("n")), // while n > 0 do { |
250 While(Bop("<",Num(0),Var("n")), // while n > 0 do { |
206 List(Assign("temp",Var("minus2")), // temp := minus2; |
251 List(Assign("temp",Var("minus2")), // temp := minus2; |
208 // minus2 := minus1 + minus2; |
253 // minus2 := minus1 + minus2; |
209 Assign("minus1",Var("temp")), // minus1 := temp; |
254 Assign("minus1",Var("temp")), // minus1 := temp; |
210 Assign("n",Aop("-",Var("n"),Num(1))))), // n := n - 1 }; |
255 Assign("n",Aop("-",Var("n"),Num(1))))), // n := n - 1 }; |
211 Write("minus1")) // write minus1 |
256 Write("minus1")) // write minus1 |
212 |
257 |
213 // prints out the JVM-assembly program |
258 |
214 |
259 compile_run(fib_test, "fib") |
215 println(compile(fib_test, "fib")) |
260 |
216 |
261 |
217 // can be assembled with |
|
218 // |
|
219 // java -jar jvm/jasmin-2.4/jasmin.jar fib.j |
|
220 // |
|
221 // and started with |
|
222 // |
|
223 // java fib/fib |
|
224 |
|
225 import scala.util._ |
|
226 import scala.sys.process._ |
|
227 import scala.io |
|
228 |
|
229 def compile_tofile(bl: Block, class_name: String) = { |
|
230 val output = compile(bl, class_name) |
|
231 val fw = new java.io.FileWriter(class_name + ".j") |
|
232 fw.write(output) |
|
233 fw.close() |
|
234 } |
|
235 |
|
236 def compile_all(bl: Block, class_name: String) : Unit = { |
|
237 compile_tofile(bl, class_name) |
|
238 println("compiled ") |
|
239 val test = ("java -jar jvm/jasmin-2.4/jasmin.jar " + class_name + ".j").!! |
|
240 println("assembled ") |
|
241 } |
|
242 |
|
243 |
|
244 compile_all(fib_test, "fib") |
|
245 |
|