1.  javap

javap 라는 자바 유틸리티로 스칼라 클래스의 메소드만 살펴볼 수 있다.



$ javap YourInteger$.class

Compiled from "YourInteger.scala"

public final class YourInteger$ {

  public static final YourInteger$ MODULE$;

  public static {};

  public YourInteger intToYourInteger(int);

}



2. jad 

java deasemmbler로 유명한 jad를 다양한 운영체제에서 쓸 수 있다. 과거 jadclipse 또는 jad를 써본 사람은 익숙하다.

개인적으로도 좋아하는 툴이다.


http://varaneckas.com/jad/ 에서 운영체제에 맞게 다운로드한다.


다운로드하고 압축 파일을 풀면 jad 파일을 볼 수 있다. /usr/local/bin/으로 복사한다.

jad를 실행하고 디컴파일 된 파일을 보며 스칼라 컴파일러가 어떻게 스칼라 파일을 컴파일했는지 살펴볼 수 있다. 


$ jad YourInteger.class

Parsing YourInteger.class... Generating YourInteger.jad



$ cat YourInteger.jad

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.

// Jad home page: http://www.kpdus.com/jad.html

// Decompiler options: packimports(3)

// Source File Name:   YourInteger.scala


import scala.Predef$;

import scala.collection.mutable.StringBuilder;

import scala.runtime.BoxesRunTime;


public class YourInteger

{


    public static YourInteger intToYourInteger(int i)

    {

        return YourInteger$.MODULE$.intToYourInteger(i);

    }


    public int number()

    {

        return number;

    }


    public void method(int given)

    {

        Predef$.MODULE$.println((new StringBuilder()).append("Hi ").append(BoxesRunTime.boxToInteger(given)).toString());

    }


    public YourInteger plus(int given)

    {

        return new YourInteger(given + number());

    }


    public String toString()

    {

        return String.valueOf(BoxesRunTime.boxToInteger(number()));

    }


    public YourInteger(int i)

    {

        number = i;

    }


    private final int number;

}



3. scalac 의 -Xprint:parse 를 활용한다.


$ scalac  -Xprint:parse file.scala 처럼 사용한다.



예시)

object Hello {
def main(args: Array[String]): Unit = {
val res = for {
i <- 0 to 10
j <- i + 1 to 5
if i + j == 10
} yield s"$i $j"
println(res)
res.foreach(println)
}
}

스칼라 언어 관점으로 개발하면 for 문을, map, flatmap, filter, _에 익숙해지지만 유지보수성이 떨어질 수 있다. 

아직 완벽스럽지는 않지만, scala 컴파일러는 for문을 자연스럽게 flatmap, map, filter으로 변경한다. 



$ scalac  -Xprint:parse  Hello.scala

[[syntax trees at end of                    parser]] // Hello.scala

package <empty> {

  object Hello extends scala.AnyRef {

    def <init>() = {

      super.<init>();

      ()

    };

    def main(args: Array[String]): Unit = {

      val res = 0.to(10).flatMap(((i) => i.$plus(1).to(5).withFilter(((j) => i.$plus(j).$eq$eq(10))).map(((j) => StringContext("", " ", "").s(i, j)))));

      println(res);

      res.foreach(println)

    }

  }

}



Posted by '김용환'
,