Duktape

홈페이지: http://duktape.org/

cropped-w212-h212

자바는 현재.. 웹부라우저 영역이 아닌.. 서버 사이드, 임베디드등 다양한 분야에 사용되고 있음.
Duktape은 C/C++ 코드에 Java 스크립트 코드를 실행하기 위한 엔진(인터프리터) 제공을 목적으로 함.

/* test.c */
#include "duktape.h"

int main(int argc, char *argv[]) {
  duk_context *ctx = duk_create_heap_default();
  duk_eval_string(ctx, "print('Hello world!');");
  duk_destroy_heap(ctx);
  return 0;
}
$ gcc -std=c99 -o test test.c duktape.c -lm
$ ./test
Hello world!

Duktape는 Ecmascript E5 / E5.1과 호환되는 소형 JavaScript 엔진.
유니 코드 지원, 정규 표현 엔진탑재, GC도 탑재되어 있음.

SWT 개발

여기서는 이클립스없이 콘솔에서 swt를 사용하기 위한 방법을 간단히 적는다.
난 콘솔이 편하므로…

1. jdk 를 설치한다.

2. swt를 다운받은후 swt.jar 압축을 lib 폴더에 푼다. (우리가 작성할 소스코드와 외부 라이브러리를 분리하기 위함)
필요하면 다른 라이브러리도 이곳에 압축을 푼다.

환경변수를 등록해서 하는 경우

환경변수 CLASSPATH를 다음과 같이 수정한다.

.;.\lib

다음 컴파알한후 실행

javac Hello.java
java Hello

옵션으로 직접 적어주는 경우

javac -classpath ".\lib" Hello.java
java -classpath ".;.\lib" -Djava.library.path=".\lib" Hello

아래는 SWT Ribbon 예제를 실행한 화면.

swt_ribbon


import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
 
import com.hexapixel.widgets.generic.ImageCache;
import com.hexapixel.widgets.ribbon.RibbonButton;
import com.hexapixel.widgets.ribbon.RibbonButtonGroup;
import com.hexapixel.widgets.ribbon.RibbonCheckbox;
import com.hexapixel.widgets.ribbon.RibbonGroup;
import com.hexapixel.widgets.ribbon.RibbonShell;
import com.hexapixel.widgets.ribbon.RibbonTab;
import com.hexapixel.widgets.ribbon.RibbonTabFolder;
import com.hexapixel.widgets.ribbon.RibbonTooltip;
 
public class Hello {
 
	public static void main(String[] args)
	{
		Display display = new Display();
		final RibbonShell shell = new RibbonShell(display);
		shell.setText("SWT Ribbon Demo");
 
		RibbonTabFolder folder = shell.getRibbonTabFolder();
		RibbonTab tab1 = new RibbonTab(folder, "snakedj.ch - swiss java blog");
		RibbonTab tab2 = new RibbonTab(folder, "jugr.ch - Java User Group Graubunden");
		folder.pack();
 
		RibbonTooltip toolTip = new RibbonTooltip("RibbonTooltip", "This is a RibbonTooltip content text.\n\nhttp://www.snakedj.ch - \\c255000000swiss java blog \\x\nhttp://www.jugr.ch - \\c255000000Java User Group Graubunden \\x", ImageCache.getImage("tooltip.jpg"), ImageCache.getImage("questionmark.gif"), "Press F1 for more help");
		RibbonGroup group1 = new RibbonGroup(tab1, "Java", toolTip);
		new RibbonButton(group1, ImageCache.getImage("olb_picture4.gif"), "J2SE",RibbonButton.STYLE_ARROW_DOWN);
		new RibbonButton(group1, ImageCache.getImage("olb_picture5.gif"), "J2EE",RibbonButton.STYLE_ARROW_DOWN);
		new RibbonButton(group1, ImageCache.getImage("olb_picture6.gif"), "J2ME",RibbonButton.STYLE_ARROW_DOWN);
 
		RibbonGroup group2 = new RibbonGroup(tab1, "Miscellaneous", toolTip);
		RibbonButtonGroup buttonGroup = new RibbonButtonGroup(group2);
		new RibbonCheckbox(buttonGroup, "C++", SWT.NONE);
		new RibbonCheckbox(buttonGroup, "PHP", SWT.NONE);
		new RibbonCheckbox(buttonGroup, "PL / SQL", SWT.NONE);
		new RibbonCheckbox(buttonGroup, "Scala", SWT.NONE);
 
		Menu bigButtonMenu = shell.getBigButtonMenu();
		MenuItem menuItem1 = new MenuItem(bigButtonMenu, SWT.POP_UP);
		menuItem1.setText("Item1");
		MenuItem menuItem2 = new MenuItem(bigButtonMenu, SWT.POP_UP);
		menuItem2.setText("Item2");
 
		shell.addBigButtonListener(new SelectionListener() {
 
			@Override
			public void widgetDefaultSelected(SelectionEvent e) {
			}
 
			@Override
			public void widgetSelected(SelectionEvent e) {
				shell.showBigButtonMenu();
			}
 
		});
 
		shell.open ();
		while (!shell.isDisposed ()) {
			if (!display.readAndDispatch ()) display.sleep ();
		}
		display.dispose ();
 
	}
 
}

이클립스 플러그인을 만들고나서…

Core-A 툴체인 지원을 위한 이클립스의 CDT를 확장한 플러그인을 3일정도 시간을 투자하여 만들어 보았습니다.

툴 체인역시 cygwin의 종속성을 탈피하고자 MinGW 4.x로 재 컴파일하였는데, cygwin보다 빨라진 느낌입니다. (아니 확실히 빨라졌습니다.)

결국 이클립스 플러그인을 만들고 나니 빌드도 잘 되고,
GDB 서버와의 연동으로 디버깅도 잘 되고.. 대만족입니다.

core-a_plugin

사실 처음 개발할때 자바를 거의 해본적 없어서 고민을 좀 했는데…

만들어 놓고 보니 기존 플러그인을 상속받아 확장하는건 그래도 쉽더라구요.
(단 확장 포인트지점 알아내는것… 힘들더라구요.)

하지만 전혀 새로운 플러그인을 만들려면 자바를 알아야겠더라구요. ㅠ_ㅠ

그래도 이클립스 플러그인을 만드는건 확실히 감을 잡았습니다. 만족!!