2009년 04월 17일
SWT의 D 언어 포트 DWT
D 언어라는 언어가 있다. C++의 리팩토링 판이라고 소개하곤 하는데 C++에 비하면 구조도 깨끗한 편이고 좀 더 현대적이라 할 수 있다. C++의 C 코드를 컴파일할 수 있어야 한다는 요구 사항을 과감히 걷어 냈기 때문에 가능해진 거라 생각한다.
많은 프로그래밍 언어들이 나오고 있지만 네이티브 바이너리를 생성할 수 있게 구현된 언어 환경은 별로 많지 않다. 이 때문에 데스크탑 GUI 응용프로그램을 만드려면 C++ 외엔 대안이 별로 없었는데 C++를 쓰기 싫어하는 사람에게는 D가 충분한 대안이 될 수도 있을 거 같다.
다만 D에 쓸만한 GUI 라이브러리가 있느냐가 문제인데 자바 환경에서 유명한 SWT 라이브러리를 포팅한 DWT로 이 문제를 해결할 수 있다.
SWT는 이미 Eclipse를 통해 그 유용성이 검증된 라이브러리라 할 수 있다. D의 특성을 살린 최적화같은 건 힘들겠지만 어쨌든 적은 노력으로 잘 만들어진 라이브러리를 쓸 수 있다는 건 좋은 일이다. 덤으로 나같이 자바에 익숙한 사람에겐 더 접근하기도 쉽다는 장점도 있다.
DWT 최신 버전은 Tango 런타임 라이브러리를 기반으로 만들어졌기 때문에 Tango 런타임 라이브러리를 설치해야 한다(D의 표준 런타임 라이브러리는 Phobos 이지만 Tango 라는 다른 런타임 라이브러리도 있다. 어떤 영문에서 Tango가 등장하였는지는 모르겠지만 지금은 Tango가 좀 더 많이 쓰이지 않나 생각한다. 영어로 쓰여진 유일한 D 책도 Tango를 기반으로 하고 있다. 관련 사항은 http://www.prowiki.org/wiki4d/wiki.cgi?StandardLib 를 참조). Tango는 http://www.dsource.org/projects/tango 에서 다운로드받을 수 있다.
DWT는 http://www.dsource.org/projects/dwt/wiki/Releases 에서 다운로드할 수 있다. http://www.dsource.org/projects/dwt/wiki/Installation 에서 설치 방법을 참조하여 설치할 수 있는데 기본적으로 라이브러리이므로 적당한 곳에 푼 다음 컴파일러와 링커 옵션을 조절하면 된다.
DWT는 SWT 패키지 이름 "org.eclipse.swt"가 "dwt"로 "org.eclipse"가 "dwtx"로 바뀌며 SWT 라는 이름이 DWT로 바뀐다는 점 정도만 알고 있으면 SWT와 거의 똑같은 방식으로 프로그래밍할 수 있다. 실제로 홈페이지에서도 참조 문서로 swt 문서들을 걸어 놓았을 정도다. SWT와의 차이점은 http://www.dsource.org/projects/dwt/wiki/DiffToOriginal 를 참조한다.
아래 코드는 FormLayout 을 이용하여 위젯을 배치시킨 코드이다. SWT의 예제를 그대로 번역(?)한 수준이다.
module FormLayoutExample;
import dwt.widgets.Display;
import dwt.widgets.Shell;
import dwt.layout.FormLayout;
import dwt.widgets.Button;
import dwt.DWT;
import dwt.layout.FormData;
import dwt.layout.FormAttachment;
import dwt.widgets.Text;
import dwt.widgets.Composite;
import dwt.layout.RowLayout;
void main()
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("FormLayout Example");
shell.setBounds(100, 100, 220, 180);
shell.setLayout(new FormLayout());
Button cancel = new Button(shell, DWT.PUSH);
cancel.setText("취소");
FormData formData = new FormData();
formData.right = new FormAttachment(100, -5);
formData.bottom = new FormAttachment(100, -5);
cancel.setLayoutData(formData);
Button ok = new Button(shell, DWT.PUSH);
ok.setText("확인");
formData = new FormData();
formData.right = new FormAttachment(cancel, -5);
formData.bottom = new FormAttachment(100, -5);
ok.setLayoutData(formData);
Composite composite = new Composite(shell, DWT.BORDER);
formData = new FormData();
formData.top = new FormAttachment(0, 5);
formData.left = new FormAttachment(0, 5);
formData.right = new FormAttachment(100, -5);
composite.setLayoutData(formData);
RowLayout layout = new RowLayout();
layout.spacing = 5;
composite.setLayout(layout);
Button open = new Button(composite, DWT.PUSH);
open.setText("open");
Button save = new Button(composite, DWT.PUSH);
save.setText("save");
Text text = new Text(shell, DWT.MULTI | DWT.BORDER);
formData = new FormData();
formData.top = new FormAttachment(composite, 5);
formData.bottom = new FormAttachment(cancel, -5);
formData.left = new FormAttachment(0, 5);
formData.right = new FormAttachment(100, -5);
text.setLayoutData(formData);
shell.open();
while (! shell.isDisposed()) {
if (! display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
이 코드를 컴파일, 빌드하면 2.17MB 크기의 실행 파일을 얻을 수 있으며 이를 실행한 모습은 다음과 같다.

DWT는 Wiki4D 에서 "Release for production" GUI 라이브러리로 소개할 정도로 안정적인 상태라 한다. SWT를 알고 있다면 금방 적용할 수 있다는 점도 장점이다.
# by | 2009/04/17 12:37 | 트랙백 | 덧글(0)
◀ 이전 페이지다음 페이지 ▶



















