본문 바로가기
DuruScript

What is the Duru Script(Damul Script)?

by 두루물 2010. 9. 30.

About DuruScript(DamulScript)

순수국산::자작 인터프리터 프로그래밍 언어,두루 스크립트(다물 스크립트) 컴파일러(인터프리터)와 두루 스크립트 데모 소스 코드

[이것은 Korea 위상을 드높이 널리 알리는 다물 프로젝트의 일환입니다]


이 인터프리터 언어엔진을 좀더 개발해 발전시키면 PHP,Java 또는 Ruby,Python등과 같은 클라이언트 웹스크립트,서버사이드 스크립트 또는 게임내 스크립트,인스톨 쉴드나 플래시의 액션 스크립트등과 비슷한 각 용도별 응용분야에 따라 다양한 플랫폼에 이용할 수 있습니다. 현업에 종사하는 시간이외에 따로 개발할 수 있는 시간과 자본이 없는 관계로 이 개인연구 프로젝트는 2006년 일찌감치 마지막 개발을 중단한 채 현재는 무한 보류중 입니다.^^
(처음개발:1999~2000년,보충개발:2005~2006년 사이 약 3개월)

본 인터프리터 언어는 제작자가 개인적인 연구차원에서 머릿속에 있는 과거 까마득한 학창시절 전공 수강했던 컴파일러 이론에 어셈블러 개발 경험에 기초해 작성한 것으로 용어나 알고리즘,아키텍쳐가 이론에 100% 부합되지 않을 수도 있고 그만큼 체계적이지 않을수도 있습니다.(예를 들어,메모리 적재,절대주소등등)
이 데모에서 제공하는 것은 단순한 사칙연산,Hello World! 같은 단순한 메세지 박스 출력,n!(펙토리얼)같은 재귀호출등의 기법등 아주 기초적인 실행을 선보이지만 이처럼 어떤 3rd party 기능의 확장 함수를 더 덧붙여 제공하고 응용하느냐에 따라,그 용도는 기하급수적으로 달라질 수 있는 가능성을 제시하고 있습니다.
본 인터프리터는 자연어(고급언어 문법) 으로 코딩 => 중간언어 변환(자체 어셈블리) => 바이트 코드 변환
의 단계를 거칩니다.(자바로 비유하자면 .java => .class => exe,기계어쯤)
바이트 코드 인터프리터 언어가 갖는 특징처럼 자체 어셈블리는 실제 80x86 계열이나 68x 의 프로세서 기계어에 종속적이지 않는 자체적으로 보유한 어셈블리이자 중간언어 급 명령어(PUSH,POP,ADD,SUB..등등)로 해석한 후 이를 다시 바이트 코드로 1대1 변환하여 Binary 파일을 생성 합니다. 사실,여기서는 개발외적인 관점에서 보면 중간언어가 바이트코드인 셈입니다.물론,이럴 절차는 컴(디)파일러의 내장된 기능이고 실제로는 php 처럼 소스를 직접 실행할수도 있습니다.
실행타임시 Decompile 에 의해 이는 다시 중간언어로 변환되어 실행코드를 실행하게 되는 원리로 작동됩니다.따라서,자바와 같이 CPU 에 기계적인 종속성이 없이 플랫폼 독립적으로 작동할수 있는 것입니다.

아주 단순한 사칙연산을 예로 들자면,
a = b + c;
는 곧 중간언어
MOV A,B
ADD A,C
로 변환합니다.
또한,
a = b + 3;
는 위와는 달리(위의 경우는 변수의 주소가 들어감) 고정 상수 3의 값을 전달 합니다.
또한, 함수를 호출 할 경우
sum(a,b)는
스택에 각각
PUSH B
PUSH A
한후
CALL sum
하는 것입니다.
그럼 실제 사용자 정의 함수 sum에서는
POP B
POP A
하여 자신의 지역변수에 해당 값을 읽어들여 실행할수 있게 됩니다.
 
우선,이런 부분보다 더 골치아픈것은 문법 파싱이 되겠습니다.
즉,단순한 a+b 와 hap = ((a + b) * 2/(c+d)) /e; 와는 수준이 다릅니다.
또한, 구조체,배열,포인터를 구현해야 합니다.

아래는 이렇게 구현된 현재 다물스크립트가 지원하는 소스코드의 예입니다.
모든 O.S나 응용프로그램,기반기술을 개발한 원천은 C언어로 부터 출발하였지만 웹 CGI 이후까지 쓰이다가 4GL 언어가 지배한 이후로 원조 언어인 C는 무시받고 쇠퇴 당하였습니다.물론,보이지 않는 부분에서 오늘날도 많은 공헌을 하고 있는 언어이지만..그리하야, C언어를 웹환경이나 기존 스크립트 언어로 다시 부활시키고자 하는 마음으로 문법 스타일은 C/C++을 따릅니다.

example DuruScript source code
(thr results of this source is above screenshot)

prototype int test(int a,int b);

int *flag[5];
int * sum;

export void nevercalledfunction(int aa)
{
	//never called function:: auto remove in codesegment
	//rectA aa;
}
void sample2()
{
	
}

/* example : recursive function call */
 int Factorial(int n){
	int r;
	int t;
	if(n==0){
		return 1;
	}
	
	t = n -1;
	t = Factorial	(t);
	r = n * t;
	return r;
}

#define HEADER	<test.h>
#include HEADER

/*
   Damul script sample source
   Mi Script
   version:1.0
   created on: 2006.10.13
   Yeamaec communication,inc.(c)
 */ 
#ifndef TEST__H
#define MESSAGE "결과:\r\n\"test함수의 수행결과는 "

string str = "ab\r\n\":c\x";

#ifndef MUI_NOVERBOSE
  #define TRUE	1
  #define AAA
  #define COMP	a + b > 12
  #define KAKA  COMP
  #define TEST  KAKA
#endif
#endif

int sum;

function int test(int a,int b){
	int hap;
	//int 0a;
	string str = "abcd";
label1:
	hap = a + b;	
	hap = (a + b) * 2;
	alert(hap);
	return hap;
	
//	if((a + ( b * 2)) > 12)
	if(TEST){
			a = b + 2;
			alert(a);
	}
	else {
			if(a >= 7)
				alert("a >= 7");			
			else
				string msg;
				msg = "a는 7보다 작다";
				alert(msg);			
			endif
			alert("1234");
	}
label2:	
	a = 1;

	b = 10;
	while(a < 10){
	 b = b + 1;
	 a = a + 1;
	 if(a < 5)
	   continue;
	 
   if(a > 6)
   	break;
	 //while( b < 15)
	 	//alert("하하하");
	 	//b = b + 1;
	 //endw;
	}
	alert(hap);
	return hap;
}

struct recA
{
	int a[2];
	char b[2];
};

struct recB
{
	int  c;
	recA d[2];
};

/* example : call by reference */
function int getval(int & a, int &b)
{
	int i = 100;
	a = i;
	b = 200;
	return i;
}

/* example : return user defined type variable */
function recA mytest()
{
	recA ra;
	ra.a[0] = 1;
	ra.a[1] = 2;
	ra.b = "ST";
	return ra;
}

function void main(){
	string text = "abcd3";
	int aa = -5;
	int bb = 2;
	int ff;
	int len;
	int flag;
	char ch;
	string text2;
	int pos ;
	int mm[2];
	int nn[2];
	int * pp[2];
	int *mp;
	recA ra;	
	recA rb;
	recB rc;
	recB rd;
	char ss[2];
	rb = mytest();
	text2 = "rb구조체의 값 = " + rb.a + "," + rb.b;
	alert(text2);
	ss = "AB";
	mm[0] = nn[0];
	mm[0] = 1;
	mm[1] = 2;
	
	ff = 5 + 2;
	alert("ff의 값은 " + ff + " 입니다");
	mm = 3;
	mp = mm;
	*mp = 4;
	mp = & aa;
	mp = mp + 1;
	mp = 1 - mp;
	*mp = aa;
	aa = *mp;
	pp[0] = &mm[1];
	*pp[0] = *pp[0] + 2;
	mm[0] = mm[1];
	mp = mp + 1 + pp[0];

	nn[0] = 5 + 2 * 3;
	nn[1] = (5 + 2 * 3) * 2 + 1;
	if(aa+bb>5)
		aa = 3;
	alert(nn[0]);
	 *(mp + 1) = 5;
	mp = &aa;
	mp = mp + 1;
	*mp = aa;
	
	pp[1] = &mm[1];
	*pp[1] = mm[1];
	
	*pp[1] = 1;
	pp[1] = pp[1] + 1;
	*pp[1] =*pp[1] + 1;
	
	alert("윤아아빠안녕!!");
	
	alert(mm[1]);
	getval(aa,bb);
	alert(aa);
	alert(bb);
	nn = mm;
	ra.b =text;
	text2 = ra.b;
	ra.a[0] = 2;
	ra.a[1] = 3;
	rb = ra;
	rc.d[0] = ra;
	rd = rc;
	//rc.d[0].b = ss;
	//ra.b[1] = 1;
	
	if(rc.d[0] == ra)
		alert("같음");
	
	alert(ra.b);
	len = bb + text.length();
	//alert(len);	
	ch = text.getat(1);
	//alert(ch);
	flag = text.compare("abc1");
	len = text.length();
	text.setat(2,'q');
	//text.getat(2);
	text = "문자비교 = " + flag /*+ flag + "\r\n text = "*/ + text;
	text = text + "\\aaa";
	pos = text.findstring("ab",0);
	text2 = text.substring(-1,4);
	if(text.length() > 5){
	
		//len = "12345";
		alert("길이:" + text + "\r\n" + "len = " + len,"확인");
	}
//	alert(text2);
//	alert(pos);
//	alert(text);
//	alert(len);	
#ifndef FACT
test(mm[1],bb);
//return;
	ff = Factorial(2+4);
	text = "재귀호출 6의 팩토리얼은 " + ff + "이다";
	alert(text);
	return;
#endif
	test(aa,bb);
#ifdef AAA
	sum = test(5,2);
	text = MESSAGE + sum;
#else
  alert("#error please define AAA");
  #ifdef TRUE
  alert("TRUE is defined");
  #endif
	text = "test함수의 수행결과는 " + sum;

#endif	
	alert(text);
	alert("테스트\r\naaa");
}


사실,이것은 인스톨쉴러나 액션 스크립트 처럼 두루 인스톨러에 내장할 스크립트가 필요해 개발을 한것이 계기 였습니다.한번쯤 제대로 체계적으로 공부해서 이론과 병행하여 개발해보고 싶은 한 분야입니다.
왕년에 한번 반짝 '씨앗'이 나왔다가 결국 우리나라는 일찌감치 이런쪽엔 관심을 끊은듯 합니다.관심있으신 연구소나 개인은 문의 하셔도 좋습니다. 이것은 절대로 국외에 오픈소스 안합니다.

DuruScript is a C,C++ Style Interpreter Language like PHP,Java which has been developped by me.But it was not completed yet because i have no time to improve it.

Here is a sample and compiler.
(for demo run : dsc test.cc or dsc test.ds)

test.cc,test.ds,HelloWorld.ds 가 두루 스크립트 소스코드이며 dsc가 컴(디)파일러입니다.
dsc test.cc 혹은 dsc test.ds 혹은 dsc HelloWorld.ds /xHelloWorld 하시면 캡쳐화면 처럼 실행 합니다.물론 소스코드를 열어 편집후 실행하면 현재 구현된 지원되는 규칙하에 실행됩니다.^^