자바의 클로저 지원

Posted 2007. 2. 21. 01:40
자바 7에 추가될 자바 언어 관련 변화로는 클로저 지원이 있습니다. 클로저는 이미 함수형 언어에서는 보편적으로 쓰이고 있고, 루비에서도 코드 블록(code block)이라는 이름으로 지원되고 있는 언어 기능입니다. 이와 관련하여 클로저 명세를 주도하고 있는 Neal Grafter가 발표한 <Advanced Topics In Programming Languages: Closures For Java>를 구글 비디오를 통해 보았습니다.

Grafter의 강연에 따르면 자바의 클로저 지원도 자바 제네릭스와 마찬가지로 컴파일 타임에 모두 이루어지며, 내부적으로 익명 내부 클래스(anonymous inner class)를 사용하고 있습니다. 다만 익명 내부 클래스는 예외 처리, final 외에 지역 변수를 받는 방법, return 문 지원 등과 관련하여 제약 사항이 있는데, 이를 클로저에서 해결하는데 복잡한 이슈가 있다고 하네요.

위 강연 비디오는 1시간 50분 정도로 꽤 길긴 한데, 자바 클로저의 요구사항과 해결 방법을 아주 명쾌하게 설명하고 있어서 좋더군요. 더불어 클로저를 지원했을 때 JDK API가 어떻게 변화하게 될지에 대해서도 이야기하고 있습니다. 좀 더 관심 있으신 분은 현재 논의 중인 자바 클로저 명세서(Closures for the Java Programming Language)도 참고하시기 바랍니다.

강연을 보면서 받은 느낌은 JDK를 통해 구현된 API(예를 들어 Collection 클래스에 map이나 reduce 함수 등을 추가)를 사용하는 것은 간단하지만, 직접 클로저를 사용하는 메서드를 구현하기는 상당히 까다로울 것으로 보입니다. 이 부분은 JVM을 고치지 않고 어떻게든 컴파일러로 모두 처리하려고 노력한 제네릭스랑 상당히 유사한 면이 있습니다. 또한 lexical scoping하는 요소가 변수 밖에 없는 Scheme과 같은 언어와 달리 생각해야 할 요소가 많아서 사용자 입장에서는 별로 직관적이지 않은 구현이 될 수 밖에 없는 부분이 있고요.



뱀다리

블로그의 제목을 "소프트웨어 이야기"에서 "프로그래밍 언어 이야기"로 변경하였습니다. 앞으로는 주 관심 분야인 프로그래밍 언어 쪽에 좀 더 관심을 집중하고 자세히 다루려고 합니다.


DMDScript

Posted 2007. 1. 31. 05:40
D 언어로 알려진 Digital Mars 사에서도 EcmaScript 엔진을 만들어서 팔더군요. DMDScript라는 제품은 ECMA 262 스크립트 언어(네스케이프 구현은 자바스크립트, MS의 구현은 JScript로 알려져 있음)를 구현한 엔진입니다. D 언어를 만든 Digital Mars 사답게 이 엔진도 D 언어를 사용해서 만들었더군요.

D 언어 컴파일러를 설치하고, DMDScript를 컴파일해서 실행시켜보았는데, DMDScript에 포함된 "Sieve prime number calculation" 벤치마크 결과는 다음과 같습니다.

[1] 인터넷 익스플로러 7.0

Microsoft Internet Explorer ie
ScriptEngine JScript Build 5730

Eratosthenes Sieve prime number calculation


10 iterations
1899 primes
elapsed time = 938

[2] DMDScript 엔진

$ ./ds.exe sieve.ds
Digital Mars DMDScript 1.13
www.digitalmars.com
Compiled by Digital Mars DMD D compiler
Copyright (c) 1999-2007 by Digital Mars
written by Walter Bright
1 source files
10 iterations

1899 primes
elapsed time = 265

속도 차이가 대략 3.5 배 정도 DMDScript가 빠름을 알 수 있습니다.



** 벤치마크에 사용된 자바스크립트 소스 코드

/* Eratosthenes Sieve prime number calculation. */

size = 8190;
sizepl = 8191;

var flags = new Array(sizepl);

var i, prime, k, count, iter;

print("10 iterations\n");
starttime = new Date();
for (iter = 1; iter <= 10; iter++)
{   count = 0;
    for (i = 0; i <= size; i++)
        flags[i] = true;
    for (i = 0; i <= size; i++)
    {   if (flags[i])
        {   prime = i + i + 3;
            k = i + prime;
            while (k <= size)
            {
                flags[k] = false;
                k += prime;
            }
            count += 1;
        }
    }
}
elapsedtime = new Date() - starttime;
print("\n" + count + " primes\n");
print("elapsed time = " + elapsedtime + "\n");

벤치 마크에 사용된 소스 코드가 비교적 단순해서 쉽게 결론 내리기는 어렵지만, 기존 인터넷 익스플로러나 모질라에 포함된 자바스크립트 엔진이 상당한 개선의 여지가 있다는 생각이 드네요.


더불어 DMDScript의 라이센스는 GPL로 소스 코드는 공개 되어 있습니다. 상업적으로 이용하기 위해서는 DMDScript Commercial License를 구입해야 하는데, $999.00 이면 살 수 있고 별도의 로얄티(running royalty)는 받지 않는군요.


자바스크립트의 함정 중에 하나는 객체 비교 연산자가 ==와 === 두 가지 버전으로 있다는 점입니다.

Operator (==)
Tests for equality in value between two operands.

Operator (===)
Tests for equality between two operands both in terms of value and type. Supported in JavaScript 1.3+


==는 자동으로 변환을 수행하여 비교 연산을 하기 때문에 a = 1과 b = "1"을 비교했을 때 a == b는 true를 리턴하게 됩니다. 반면에 ===는 타입과 값을 모두 비교하기 때문에 서로 다른 타입인 a와 b를 비교하는 a === b는 false를 리턴합니다.

다음은 자바로 작성된 자바스크립트 엔진인 Rhino1.6 R5에서 ==와 ===를 수행한 결과입니다.

$ java -jar js.jar
Rhino 1.6 release 5 2006 11 18
js> a = 1
1
js> b = "1"
1
js> a  == b
true
js> a === b
false







이전에 메릴랜드 있을 때 참석하던 Software Chat에서 "Enforcing and Validating Programmer-Defined Type System"라는 주제의 강연 메일을 받았다.

프로그램의 중요한 속성(well-formedness properties)을 보장하는 데 타입 시스템이 자연스러운 접근 방법인 것은 사실이다. 하지만 프로그래머마다 원하는 속성이 다르고, 언어 설계자가 이 모든 요구사항을 언어 타입 시스템에 모두 녹여 넣을 수 없다. 따라서 UCLA의 Todd Millstein의 아이디어는 언어 타입 시스템 자체를 확장성 있게 만들어 프로그래머가 필요한 속성을 체크할 수 있도록 타입 시스템을 확장할 수 있게 해주자는 것이다.

Clarity 프레임워크의 경우 C의 타입 시스템을 확장해서 nonnull, positive, tained 같은 타입 한정자(type qualifier)를 손쉽게 추가할 수 있게 해준다. JavaCOP은 이 아이디어를 자바 쪽으로 확장하여 객체 한정(object confinement)나 레이스 컨디션 검사 등을 자동화하는 것이다.

스크립트 언어를 위시한 한 쪽에서는 그나마 있던 컴파일 타임 검사도 안 하는 판인데, 학계에서는 각종 검사를 컴파일 타임에 조금이라도 더할 수 있게 만들고, 또 언어 사용자가 이런 검사를 추가할 수 있는 프레임워크를 만들고 있다는 게 참 재미난 현상이다.

« PREV : 1 : 2 : 3 : NEXT »