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)
}
}
}
'scala' 카테고리의 다른 글
[scala] for .. yield 예시 (0) | 2016.04.05 |
---|---|
[scala 2.11.8] 간단한 변수 스코프 테스트시 유의사항 (0) | 2016.04.04 |
[scala] 암시적 타입 변환(implicit type conversion) 예시 (0) | 2016.03.25 |
[scala] 싱글톤 객체, 독립 객체, 동반 클래스 (0) | 2016.03.24 |
[scala] =과 함수 선언 (0) | 2016.03.23 |