|    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  |         |