progs/compile.scala
changeset 609 e33545bb2eba
parent 600 d488a3e7b0ec
child 624 8d0af38389bc
equal deleted inserted replaced
608:3db4970ad0aa 609:e33545bb2eba
   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