특집기사:X is for Abstraction

위클립스
이동: 둘러보기, 찾기
Article.png 특집기사 정보
원문 보기
저자 Jan Köhnlein
역자 이지율
Recipe.gif 이 문서는 번역된 문서입니다. 원문 읽기

itemis에서 일하는 지난 몇 년간 우리는 에서 'x'로 시작하는 몇개의 프로젝트들을 만들었다: Xtext, Xtend 그리고 Xbase. 이 포스트를 통해 이 셋의 각각의 유즈 케이스들을 명확히 해 보려한다.

목차

[편집] 모든 것은 자바로 부터...

자바는 많은 개발자들이 전 세계적으로 널리 알고있는 좋은 언어이다. 거대한 에코 시스템, 다양한 커뮤니티, 그리고 그에 걸맞는 훌륭한 IDE들은 자바의 성공에 핵심적인 역할을 한다.

그럼에도 불구하고, 몇몇 중대한 문제점들이 있다:

진단은 다음과 같다:

자바는 올바른 추상화 방법들이 부족하다.

뒤이어 소개할 기술들은, 자바 위에서 여러분들의 추상화 집합을 정의할 수 있도록 해준다. 각각은 문법적인 유연성, 처리 시간, 필요로하는 선수 기술과 멀티 플랫폼 커버리지에서 차이를 보인다.

[편집] External DSLs (Xtext)

Xtext는 텍스트 기반의 외부[1] DSL 언어를 위한 프레임워크이다. Xtext는 코드 생성기나, 인터프리터, 완전한 기능들을 갖춘 IDE를 포함하여 전혀 다른 새로운 언어를 손쉽게 만들 수 있게 해 준다. Xtext 홈페이지에서 수 많은 예제 프로젝트들을 확인할 수 있다.

언제 Xtext를 쓰는가?

첫째, 가장 대표적인 것은 문법적인 자유를 최대한 누리고 싶은 경우이다. Xtext DSL은 고유의 문법들을 통해 정의되므로, 호스트 언어의 문법에 제약을 받지 않는다. 둘째, JDT에 의한 디펜던시로 부터 자유롭고 싶거나, Java와의 연동이 필요 없는 경우, 순수[2] Xtext를 이용할 수 있다.

여러 플랫폼을 동시에 지원하고자 하는 언어를 만들때도 순수 Xtext가 이용될 수 있다. Xtext 언어 기반의 IDE를 만드는 데 필요한 기술 비용은 상대적으로 낮다. 개인적으로 "프로그래밍 한다는 비즈니스 맨"을 신뢰하지 않는 편이다. 그러나 Xtext는 기술적 비 전문가들이 순수 도메인 지향 언어를 작성하는데 사용될 수 있다는 것을 보여줬다. 또한 이렇게 생성된 기초 IDE 조차 매우 막강하며, 쉽게 커스터마징 가능해서, 심지어 몇몇 사용자들은 이미 존재하는 언어와 기 존재하는 컴파일러등이 있음에도 Xtext를 이용해 IDE를 만드는 사례도 있다.

그러나 문법을 변경한 경우, 언어 인프라 스트럭쳐를 다시 제네레이트하고, 사용자 환경에 언어 플러그인들을 재 배포해야한다. 후자의 경우 몇몇 시나리오에서 좀 도전이 될 수 있다.

간단한 표현식을 갖는 구조적인 언어의 대부분은 순조롭게 작성될 수 있다. 다소의 복잡성을 가진 표현식들은 일반적인 통합 기술(Gap 생성 패턴, 블랙박스 리터럴, 보호구역 등등) 패턴 프로그래밍을 통해 통합될 수 있다. 하지만 이들은 복잡성을 높이고, 추상화를 깨트리며, 유지보수가 어렵다.

(호스트 언어보다) 표현식이 좀더 주도권을 잡는 경우라면 다음 기술을 고려해 봐야 한다.

[편집] Java DSLs (Xtext with Xbase)

Xbase라는 코드명 프로젝트에서 우리는 고급 표현식 언어를 개발했고, 이 언어는 여러분들만의 Xtext 기반 DSL언어에 임베딩[3] 될 수 있다. 자바 타입 시스템을 재사용할 수 있으며, 자바가 나타낼 수 있는 모든 표현식을 다룰 수 있으며, 타입 추론이나 연산자 오버로딩, 람다 표현식등을 추가할 수도 있다.

Xbase의 기본 사용방법은 여러분의 언어를 구조적인 자바 모델로 변형하는 방법을 정의하는 것이다. 범용 코드 생성기가 이 모델로 부터 자바 코드를 생성하므로 별도의 코드 생성기를 만들 필요가 없다. 이 생성기는 평범한 자바 소스코드를 생성하므로, 손으로 쓰인 자바 코드와 자연스럽게 통합되며, 안드로이드등과 같은 바이트 코드에 기반한 플랫폼에서도 잘 동작한다.

Java DSL은 자바 소스파일 형태로 컴파일 되며, 필요한 경우 고급 표현식들을 사용할 수 있다. 이는 아마 여러분들이 기대하는 이상의 것들을 제공할 것이다. 일곱 언어의 예제들을 참고하라. 인터프리터 또한 공급되므로, 컴파일 단계를 건너뛰고, 실행할 수도 있다.

현재는 자바를 위한 실행환경만이 구성되어 있으므로, 다른 언어를 위한 환경이 필요하다면 그건 당신에게 달려있다. 표현식의 범위에 제한을 두는 것이 이러한 목적에 효과적일 수 있다. 또한 표현식에 새로운 표현식을 추가할 수도 있지만, 이미 문법 공간은 상당히 복잡하다.

비 기술적(non-technical) 사용자들은 보통 여기서 떨어져 나간다. 당신은 관리자에게 클로져가 뭔지 가르치고 싶지는 않을 것이다.

언어에 대해 문법적인 자유를 달성할 수 있지만, 변경이 일어날 때마다 다시 빌드하고 플러그인들을 배포해야만 한다.

[편집] Internal DSLs (Xtend)

단지 자바가 여러분들이 원하는 추상화 수단을 제공하지 않는다고 해서 꼭 새로운 언어를 만들어야 한다는 것을 의미하지는 않는다. 우리는 자바에 타입 추론이나 연산자 오버로딩, 람다 표현식등과 같은 멋진 요소들을 가미한 Xtend라는 범용 언어를 개발했다.

아마 여러분은 다음과 같이 추측할 수 있을 것이다:

Xtend는 Xbase 라이브러리에 기반해서 만들어 졌겠지.

그러나 Xtend는 구조적 요소(타입, 필드, 메소드, 어노테이션 등등)들도 정의하며, 확장 메소드, 다중 디스패치 메서드, 템플릿 표현식 그리고 훌륭히 통합된 IDE 마저 포함한다.

이는 이미 강략한 도구 집합이며, 언어 안에서 내부 DSL언어를 쉽게 작성하고 사용할 수 있게 해 준다. 이클립스 콘 2012 예제를 참고하라(특히 SWT, Distances & HTML Builder 예제).

또 하나의 도약은 액티브 어노테이션이다. 이 어노테이션들은 Xtend를 자바로 컴파일 할 때 여러분의 코드가 참여할 수 있도록 허용한다. 이들은 특정 디자인 패턴을 구현할 때 유용하다, 하지만 다른 시나리오에도 놀라울 정도로 강력하다. 다음의 멋진 예제들을 참고하라:

언어 그 자체만이 줄수 있던 당신이 필요로하는 모든 것들은, 이제 다시 생성되거나 배포될 필요가 없다. 툴 스택 또한 매우 단순히 유지된다. 단 반드시 Xtend 언어의 구문적 요소를 이용하여, 자바 소스만을 생성하는데만 쓸 수 있다는 제약이 따른다. 나는 비기술자들에게는 Xtend를 추천하지 않지만, 자바와 싸우고 있는 모두에게 권장한다.

역자주 Xtend를 응용하여 내부용 DSL이 어떻게 효과적으로 사용될 수 있는지 알고 싶다면, 특집기사:SWT, Xtend를 만나다문서를 추천한다.

[편집] 참조

  1. 외부: external 이란 호스트 언어(즉 일반적으로 Java)로부터 독립적이라는 의미이다.
  2. 순수: 원문에는 plain으로 표기되어 있다. JVM 모델과 연동되지 않는 Xtext DSL 언어를 의미한다.
  3. Xbase 임베딩: 특집기사:Xtext로 JVM 연동 언어를 만드는 5단계 문서를 참고 할 것.

이 기사에 대한 의견은 토론 페이지를 통해 나눌 수 있습니다.

개인 도구
이름공간
변수
행위
포탈
탐색
도움
도구모음