Bitggal
빛깔언어 - Bitggal Language
슬라이드로 보기
1. 서문 ¶빛깔(Bitggal)은 프로그래밍 언어에 부수적으로 사용될 수 있는 메타 스크립트 프레임 언어이며 부들에 의해 2008년 9월 시작되었습니다. 빛깔(Bitggal)은 언어의 이름인 동시에 KLDP에서 GNU General Public License (GPL)로 진행되는 프로젝트이름이기도 합니다. 언어명을 명확히 한다면 '빛깔언어(Bitggal Language)'라 부를 수 있습니다.
많은 고급 프로그래밍 언어가 기계어를 사람이 이해하기 쉽게 하자는 취지로 만들어졌음에도 불구하고 충분히 그렇게 못하며 비 영어권 개발자에게는 알파벳과 영문에 가까운 소스코드는 그 이해도에 있어서 차이가 있을수 있습니다. 이런 언어적인 문제는 이후에 필요한 업그레이드등 개선작업에도 많은 영향이 있습니다. 간헐적으로 제안되어온 한국어와 유사하고 한글을 충분히 사용할 수 있는 언어의 개발은 모든 개발자가 영어를 모국어처럼 사용하지 않는 한 지속적으로 그 필요성이 제기될 것입니다. 비단 이런 언어적인 문제는 한국어 사용자들에게만 해당되지 않는다는 것입니다. 어떤 모국어를 사용하는 사람이든 자신에게 유리한 언어적 환경은 당연한 요구입니다.
또한 갈수록 복잡하고 다양해진 개발환경은 프로그램에 대한 더욱 많은 사전지식을 요구하게 됨에 따라 보다 자연어에 가깝거나 보다 가독성이 개선된 언어가 요구될 것입니다. 프로그래밍 환경은 다양화되고 복잡해지고 있으며 따라서 개발환경을 인간의 언어에 가깝게 만드는 것은 매우 가치있는 일입니다. 빛깔(Bitggal)언어는 이러한 개발환경에 대한 대안으로 시도되었습니다. 개발자의 자연어에 충분히 가깝게 만듬으로써 가독성을 향상시키는 것이 주요한 목적입니다.
빛깔언어는 메타적인 피봇언어들의 프레임을 역할을 하게 되며 필요에 따라 실제적으로 사용할 수 있는 다양한 파생언어들을 만들어냄으로서 이런 목적에 적합한 기능을 수행 할 수 있습니다.
빛깔(Bitggal)언어의 주요한 모토은 논리적인 프로그램 언어들이 자연어를 위한 교량언어로 사용하기에 충분히 논리적이다는 것입니다. 즉 프로그래밍 언어는 기계를 제어하기 위한 용도로 만들어 졌지만 동시에 수 많은 다국어(자연어)들로 번역되는 것이 쉽게 가능하다는 것입니다. 나아가 이런 형태의 언어를 번역을 위한 피봇언어로 충분히 구현한다면 자연어간의 번역의 정확성을 보장해 줄 수 있게 될 것입니다. 이런 점에서 빛깔(Bitggal)언어을 짧게 표현한다면 소스코드을 활용한 교량언어라고도 할 수 있습니다.
빛깔(Bitggal)언어의 특징은 다음과 같이 요약할 수 있습니다.
2. 코드구조 : GGAL ¶빛깔언어의 기본적인 코드구조를 GGAL( '깔' - '빛깔알넘코드' )이라고 부르는데
빛깔언어의 기본적인 코드 구조를 설명하려면 먼저 Z3A2에 대해 이해하여야 합니다. Z3A2는 엔코딩 형식으로 빛깔언어의 GGAL의 원형이 되는 코드형식으로 실제 Z3A2 원형을 상당히 변형하여 사용합니다. 다음은 Z3A2에 대한 참고 문서입니다.
Z3A2는 알파벳만을 사용하지만 GGAL은 알파벳과 숫자를 기본적으로 사용하며 추가적으로 기호도 사용할 수 있습니다. 다음은 두 코드의 샘플을 비교한 것 입니다.
// Z3A2 : fafBfbfCfcfDeieJejeKekeLelQNukCHdXHWkCHdXROIgQUVeLqCliiiJijiKi.... // GGAL : R9Axx2XA3BC12KL5t9mA04zDKWhWwPewHHcH7s0CA6JK34XKK7CA7BA7EA7ZZZ.... 위 샘플로 볼때 두 코드 체계는 단순히 숫자의 있고 없음 차이를 가지고 있습니다. 그러나 이 차이로 인해 전혀 다른 용도로 사용할 수 있게 됩니다. Z3A2는 BASE64처럼 문자열이나 바이너리를 단순히 텍스트로 인코딩하기 위한 것이지만 GGAL은 프로그래밍언어의 토큰과 문장을 담기 위한 구조적인 형태를 위해 만들어진 것입니다. 즉 알파벳 사이의 숫자가 인덱스 토큰이며 동시에 알파벳을 분리하여 토큰화시켜주는 역할을 합니다.
이렇게 공백이 없이 답답한 코드로 프로그래밍을 하기에는 무리가 있을 수 있다고 여겨질지도 모릅니다. 공백이 없는 것이 불편하면 다음과 같이 풀어쓰는 것도 가능합니다. 또는 보다 보기편한 비주얼적인 코드로 변환할 수 도 있습니다.
R
9 Axx
2 XA
3 BC
12 KL
5 t
9 mA 0
4 zDKWhWwPewHHcH
7 s0CA
6 JK
34 XKK
7 CA
....
공백을 사용할 수 있음에도 불구하고 굳이 공백이 없는 코드를 기본적으로 사용하는 이유는 다음과 같습니다. 알파벳과 숫자가 공백없이 하나로 뭉쳐지면 대부분의 프로그래밍언어에서 변수명이나 함수명과 같은 식별자로 사용할 수 있게 됩니다. 즉 어떤 언어에서 하나의 식별자조차도 프로그래밍 할 수 있게 됩니다. 식별자에 자연어를 위한 교량언어를 프로그래밍 하면 쉽게 자연어 해석이 가능하게 됩니다.
이런 특징을 이용해 빛깔언어의 알넘코드는 다른 언어의 식별자로 사용됨과 동시에 여러가지 언어로 변환가능한 형식화된 코드를 내장하게 됩니다. 이런 기능으로 인해 빛깔언어를 소스코드를 활용한 교량언어라고 할 수 있습니다.
3. 토큰 ¶위에서 보듯 GGAL코드의 토큰은 공백없이 붙여쓰게 되는데 토큰화 될 수 있는 요인은 Z3A2라 는 인코딩형식과 관련이 있습니다. GGAL은 Z3A2라 는 인코딩형식을 포괄하는 형식으로 숫자에 의해 나누지는 알파벳 문자열들이 Z3A2의 형식에 매치되는 경우와 그렇지 않은 경우가 있습니다. 매치되는 경우는 바이너리,문자열에 해당 됩니다. 그렇지 않은 경우는 Z3A2의 정규식에 매치되지 않는 모든 알파벳 문자열로 분리자나 변수나 함수명과 같은 심볼에 해당됩니다.
빛깔언어의 코드를 구성하는 토큰요소는 다음과 같이 정규식 패턴으로 정의할 수 있습니다.
<B> => "(?:[O-Z][A-Z][A-Z]|[A-N][A-P])+", <N> => "[A-N][Q-Z][A-Z]+", <M> => "[A-N][A-P][A-Z]", <F> => "[A-N][Q-Z]" , <C> => "[O-Z][A-Z]" , <G> => "[A-Z]" , <D> => "(?:[1-9][0-9]*|0)" , <B>는 Z3A2 형식의 문자열이며, <N> 은 정수값 , <F>는 함수명 ,<C>는 변수 , <M>는 상수 , <G>는 문장입니다. <D>는 분리자이며 동시에 인덱스 역할을 합니다. Z3A2 문자열은 일부의 토큰요소로 사용됩니다.
특징을 좀 더 설명하자면 이름을 만드는 알파벳 패턴이 제한되어 있다는 점이 기존의 언어와 다릅니다. 예를 들어 C언어에서 'A'를 변수명으로도 함수명으로도 사용하는 것이 가능합니다. 그러나 ㅤ빛깔에서는 'A'는 문장명(for문, while문 등의 )이 되며 함수명이나 변수명으로 사용할 수 없습니다. 또한 함수명은 위 정규식에 맞춘다면 'AQ' , 'BX' 같이 두 문자로 되어야 합니다. (이름의 갯수에 대해서 제한이 있겠다고 생각할 수 있으나 확장할 수 있는 방법은 있습니다.)
앞 예문을 예로 설명하면 맨위의 'R' 은 어떤 문장의 시작을 표시하며 그 아래 들여쓰기된 요소들을 포함하여 하나의 문장이 형성됩니다. '5 t'는 문장내의 문장으로 '9 mA' 라는 하나의 하위요소를 가집니다. 그리고 숫자'0'은 분리자인 동시에 블럭을 닫는 역할을 합니다. 상위 문장인 'R' 또한 생략된 곳에 '0'이 있는 곳 까지 블럭영역이 됩니다. 그리고 zDKWhWwPewHHcH는 '수리1수리' 라는 문자열의 Z3A2 인코딩 문자열입니다.
빛깔언어를 언어유형으로 구분하지면 형태상 인덱스 역할을 하는 분리자가 있으니 마크업 또는 태그형 언어에 가깝게 볼 수 있습니다. 또한 하나의 문장 전체를 식별자 또는 문자열로 만들어 다른 언어 속으로 섞여 들어가며 메타적인 기능을 하므로 메타언어라고 할 수 있습니다.
4. XML과 비교 ¶빛깔언어는 XML, HTML과 같은 꺽쇠 태그는 아니지만 태그로 형성되는 구조와 유사한 트리구조를 만들어 줍니다. 메타 태그언어인 XML과 비교하여 설명하면 이해하는데 도움이 됩니다.
다음은 XML 문서의 한 예입니다.
<department>
<employee>
<name>John Doe</name>
<job>Software Analyst</job>
<salary>2000</salary>
</employee>
<employee>
<name>홍길동</name>
<job>Software Analyst</job>
<salary>2002</salary>
</employee>
<employee>
<name>Jane Fletcher</name>
<job>Designer</job>
<salary>2500</salary>
</employee>
</department>
XML은 호환성이 보장되는 장점으로 매우 많이 쓰이지만 반복문구가 많고 속도가 느리다는 단점이 있습니다.
위와 유사하게 빛깔언어의 GGAL구조의 문장으로 만들면 다음과 같이
언어별 프로토타입과 데이타를 분리하게 됩니다.
en_dic = {
D: { 0:'department' } ,
E: { 0:'employee' , 1:'name' , 2:'job' , 3:'salary' } ,
SA: { 0:'Software Analyst' }
}
ko_dic = {
D: { 0:'부서' } ,
E: { 0:'종업원' , 1:'이름' , 2:'작업' , 3:'급여' } ,
SA: { 0:'소프트웨어 분석' }
}
...
en_dic 영어 , ko_dic 한국어 등 , 사용자의 언어별 맵핑테이블을 구성할 수 있게 됩니다.
//--- pGGAL: 풀어쓴 GGAL ---//
D
1 E
1 "John Doe"
2 SA
3 +2000
0
1 E
1 "홍길동"
2 SA
3 +2002
0
1 E
1 "Jane Fletcher"
2 "Designer"
3 +2500
0
0
//--- GGAL ---//
D1E1ThPTfGJCsjb2SA3Gvb01E1WaKypkwxm2SA3Hvb01E1SZRsjBJDsjAseIsJYbJ2sJGsTvTffTPw3EuC00
위의 GGAL 데이타를 XML 과 크기면에서 비교한다면 XML경우 290 Byte 를 차지하며 GGAL에서는 프로토 타입을 제외하고 85 Byte 를 차지하게 됩니다. 따라서 GGAL을 태그형 데이타의 처리에 사용할 경우 전송하거나 처리해야할 크기를 줄일 수 있습니다. 또한 GGAL에서는 토큰을 분리하기 위한 정규식 처리가 간단하기 때문에 효울과 구현이 용이하다는 장점이 있습니다.
5. LISP 과 문장비교 ¶위 예문에서 보듯이 GGAL코드를 리스트들의 중첩된 문장구조라고 할 때 LISP과 유사하게 보일 수 있습니다. 그러나 LISP은 연결된 리스트인데 반해 GGAL 구조에는 각각의 리스트 원소에 인덱스가 부여 되어있다는 차이가 있습니다. 그리고 하나의 블럭에서 같은 인덱스가 여러 번 반복될 수 있는데 이 인덱스는 나중에 문장을 해석하는데 마크업과 같은 역할을 한다고 할 수 있습니다. 즉 각 문장에서 인덱스는 원소가 어떠한 역할을 하는지 표시하는 기능을 합니다.
(defun factorial (n)
(if (<= n 1)
1
(* n (factorial (- n 1)))))
만약 위 LISP의 문장과 동일한 구조의 BITGGAL문장을 만들어 보면 다음과 같은 문장이 됩니다.( BITGGAL은 메타언어이므로 실제 사용할 Bitssal에 대한 정의가 필요함 )
F 1 @AR
2 X 1 xa 0
3 I 1 Ez 1 xa 2 +1 0
2 +1
3 Gu 1 xa
2 AR 1 es 1 xa 2 +1 0
0
0
0
0
pGGAL형식의 코드는 인덱스라는 마크업 형태이기 때문에 좀 더 복잡하게 보입니다. 코드의 길이는 공백을 없앨 경우 거의 비슷하게 됩니다.
LISP: (defun_factorial(n)(if(<=_n_1)1(*n(factorial(-_n_1))))) GGAL: F1@AR2X1xa03I1Ez1xa2BQA02BQA3Gu1xa2AR1es1xa2BQA00000 6. 서브언어 : 빛살 Bitssal ¶Bitggal 빛깔언어는 실제는 메타언어의 프레임으로 프로그래밍 언어구현을 가지지 않습니다. 입력된 문자열의 토큰을 검사하고 'D','E' 같은 토큰이 어떤 문장의 종류라는 것만을 인식할 뿐입니다. 즉 Bitggal 만으로는 "Hellow World" 를 출력하는 예문이 제공될 수 없습니다.
대신 메타정의 ,문서정의 또는 프로그래밍 기능을 내포한 서브언어들을 불러서 사용합니다.
이 서브언어들을 통틀어 Bitssal(빛살)이라고 합니다.Bitssal(빛살)은 목적에 따라 다양하게 만들어질 수 있습니다. Bitggal(빛깔)과 Bitssal(빛살)의 관계는 XML과 SVG의 관계와 유사하다고 할 수 있습니다.
Bitssal은 컴파일러어나 인터프리터언어와 같이 독립된 환경의 언어 또는 도메인 특화언어(DSL)가 될 수 있습니다. 또는 메타프로그래밍을 위한 메타언어이거나 자연어의 교량언어로 기능할 수 있습니다.
Bitggal은 다만 언어정의를 위한 프레임만을 제공하며 코드의 무결성을 검사하는 역할과 토큰을 분리하고 코드를 언어사전에 맴핑하는 등 기본적인 역할을 합니다.
위 예제에서 사용한 간단한 프로토타입 또한 즉흥적으로 사용 할 수 있는 Unnamed-Bitssal 이라고 할 수 있습니다.
빛깔 프로젝트에서 실험적으로 추진하는 다음과 같은 빛살들이 있습니다.
7. 표현층과 구현층 ¶각각의 Bitssal은 표현층과 구현층을 가지고 있습니다. GGAL은 가장 기본적인 기저표현층이 됩니다.
Bitssal의 GGAL 코드는 다양한 표현층을 만들어 냅니다 . 앞서 기술한 pGGAL(펼친 GGAL) 또한 하나의 표현층이라 할 수 있습니다. 파일 편집을 위한 표현층, 대화식 셀의 입력창이 되는 표현층, 보기 위한 표현층 등 필요에 따라 구성됩니다. 또한 사용자의 언어(자연어)별로 원본 코드를 재구성하여 보여주는 교량언어기능 또한 이 표현층을 통해 실현됩니다.
예로 앞 예문은 보다 구조적인 형태의 파일 편집을 위해 jGGAL(JSON GGAL 표현층)형식을 취할 수 있습니다.
[":D",
["1:E" , "1:{John Doe}" , "2:SA" , "3:2000" ] ,
["1:E" , "1:{홍길동}" , "2:SA" , "3:2002" ] ,
["1:E" , "1:{Jane Fletcher}" , "2:{Designer}" , "3:2500" ]
]
위의 인덱스 코드 대신 한국어 사전과 맵핑을 사용하여 경우 다음 과 같이 보다 이해가 쉬운 코드로 입력할 수도 있습니다.
[":<부서>",
["1:<종업원>","<이름>:{John Doe}","<작업>:<소프트웨어 분석>","<급여>:2000" ] ,
["1:<종업원>","<이름>:{홍길동}","<작업>:<소프트웨어 분석>","<급여>:2002" ] ,
["1:<종업원>","<이름>:{Jane Fletcher}","<작업>:{Designer}","<급여>:2500" ]
]
구현층에 출력하는 함수를 만든다면 "Hellow World"문을 만들 수 있습니다. 단 메타프로그래밍으로 출력문을 만들었을 경우엔 그 출력문은 표현층에 해당됩니다.
8. 번역층(trGGAL)과 GREG ,GREPL ¶번역층은 표현층의 일부이며 가장 최상위의 표현층에 해당됩니다. 보통 읽을 수 만 있는 표현형식인 번역층은 각 언어별로 다양하게 만들어 질 수 있습니다. 번역층은 언어에 따라 각기 생성되지만 통틀어 trGGAL로 부르는데 각 언어의 trGGAL은 입력된 GGAL 코드를 자신의 언어로 번역할 표현형식에 대한 정의를 필요로 합니다. 이를 G정규식과 G치환식이라 하는데 GREG과 GREPL으로 표기합니다. GREG과 GREPL은 GGAL의 문장의 구성인자를 매치하고 치환하여 해당언어로 번역합니다. 다음은 간단한 pGGAL코드를 여러 언어의 코드로 번역한 예입니다.
D 1 +15 1 +23 1 +35 2 +77 0 위 pGGAL 코드는 다음과 같이 여러 언어로 번역할 수 있는데 이는 GGAL의 구조가 XML처럼 마크업된 인자로 구성되어 있기 때문입니다.
(덧셈이 틀린 이유는 예제가 계산을 실행하는 예가 아님을 나타내기위함)
ko: => 15와 23와 35를 더하면 77이다. en: => 15 plus 23 plus 35 is 77. lisp: => (+ 15 23 35) c: => ( 15 + 23 + 35 )위와 같이 번역이 되기 위해서는 다음과 같이 GREG과 GREPL이 UNNAMED_SSAL을 통해서 사전정의 되어야 합니다. (UNNAMED_SSAL이란 테스트 또는 즉시적인 목적을 위해 임시적으로 생성하는 BITSSAL을 말합니다.)
// UNNAMED BITSSAL
{
'*':{
D: {R: "A1+B2*"}
},ko:{
D: {R:"{:<A>를_더하면_<B>이다.}{A:\"@\":#와_#}{B::##}" }
},en:{
D: {R: "{:<A>_is_<B>.}{A::#_plus_#}{B::##}" }
},lisp:{
D: {R: "{:<A>}{A::(+_#_#)}{B::##}" }
},c:{
D: {R: "{:<A>}{A::(_#_+_#_)}{B::##}" }
}
}
위 예문에서 GREG는 *:{ D: {R: "A1+B2*"} }의 A1+B2*에 해당되고 GREPL은 각 언어별로 있는 D: {R: "...." } 의 "..."에 해당 됩니다. GREG는 하나지만 GREPL은 각 언어별로 가지고 있습니다. D는 GGAL의 문장코드를 의미하며 R은 속성으로 정규식 또는 치환식이라는 것을 의미합니다.
예문에 있는 GREG를 자세히 설명하면 'A1+'에서 '1'은 '1'이라는 인덱스에 해당하는 구성인자입니다. '+'는 '1'이 적어도 한번이상 반복될수 있다는 것이고 매치된 인자를 치환식(GREPL)의 'A'에 할당해 줍니다. 그 다음의 'B2*'는 없거나 한번 이상 반복되는 '2' 인덱스의 구성인자를 치환식의 'B'에 할당해 줍니다. 만약 정의된
GREG에 맞지 않는 GGAL코드가 입력된다면 문장오류를 발생합니다.
GREPL를 설명하기 위해 한국어의 GREPL를 설명하면 {:<A>를_더하면_<B>이다.}{A::#와_#}{B::##} 에서 <A>와 <B>는 최종적으로 반환될 치환문에서의 위치를 나타내며 {A::#와_#}에서 '#'기호가 두 개있는데 사이에 있는 '와_'는 반복되는 'A'인자들 사이에 반환됩니다.
만약 'A' 가 하나뿐이라면 '와_'는 반환되지 않습니다.만약 두'#' 앞에 있다면 맨 앞에 반환되며 두'#' 뒤에 있다면 마지막에 반환됩니다. c 의 REPL "{:<A>}{A::(_#_+_#_)}{B::##}" 를 보면 확실히 알 수 있습니다. 그리고 각 치환문 들은 각각 중괄호로 구분해야 하며 주의할 점은 JSON형식의 블럭이 아니며 모두 하나의 문자열로 묶어 구성되어야 합니다.
D: {R: "{:<A>_is_<B>.}{A::#_plus_#}{B::##}" }
9.1. 문장 만들기 ¶다음 pGGAL문장은 어떻게 번역될까요? 다음 입력코드를 넣고 테스트 해 보세요.
S 1 SA 3 Ze 2 D 1 +35 1 +43 2 +77 0 2 WA 0
{
'*':{
D: {R: "A1+B2*"},
S: {R: "S1O3V2+"}
},ko:{
D: {R:"{:<A>를_더하면_<B>이다.}{A::#와_#}{B::##}" } ,
S: {R: "{:<S>가_<O>에게_<V>라고_말했다.}{S::##}{V:'@':#라고_그리고 _#}"},
SA : {0: "김씨" },
WA : {0: "아침이다." }
},en:{
D: {R: "{:<A>_is_<B>.}{A::#_plus_#}{B::##}" } ,
S: {R: "{:<S>_tolk_<O>_that[<V>].}{S::##}{V:'@':#_and _#}" },
SA : {0: "Mr Kim." },
WA : {0: "it is morning" }
}
}
위 입력코드를 넣고 pGGAL ,GGAL , trGGAL 체크박스 모두 체크하고 버튼을 누른 후 결과가 다음과 같으면 성공입니다.
ko:{ 김씨가 Ze에게 { 35와 43를 더하면 77이다. }라고 그리고 '아침이다.'라고 말했다. }
en:{ Mr Kim. tolk Ze that[{ 35 plus 43 is 77. } and 'it is morning']. }
9.2. 메타 프로그래밍 1 ¶빛깔언어를 프로그래밍에 활용할 경우 이종 언어간의 매크로나 범용 메타 프로그래밍을 할 수 있습니다. 다음은 간단한 'hellow world'출력문을 만드는 예제입니다.
T
1 "Hello,"
1 "world!"
0
{
'*':{
T: {R: "A1+"},
},'d':{T: {R: "{:_writefln(<A>)}{A::\"##\"}" },
}, php:{T: {R: "{:_echo_<A>_;}{A::'##'}" } ,
}, cpp:{T: {R: "{:_std\:\:cout \<\<_<A>\<\<_std\:\:endl_;}{A::\"##\"}" } ,
}
}
9.3. 메타 프로그래밍 2 ¶다음과 같이 상당히 다른 문법을 가지는 언어들의 메타프로그래밍이 가능합니다. 다음 예제의 'F0F'는 확장형 문장토큰으로 팩토리얼 함수를 정의하도록 Unnamed_SSAL 에서 사전정의 됩니다.
F0F 1 'factorial' 2 'N' 0
{
'*':{ F0F : {R: "A1B2" } },
d: {
F0F : {R: "{:_long_<A>_(_int_<B>_)\{ _long_result_=_1; _for_(; <B> >= 2; --i)_result_*=_<B>;_return_result; \}_}" }
},
python: {
F0F : {R: "{:_<A>_= lambda_<B>\: (<B>==1_and_1)_or_ (<B>_*_<A>(<B> - 1)) }" }
},
ko:{
F0F: {R:"{: 입력인수'<B>'의_팩토리얼을_구하는_'<A>'라는_함수.}" }
}
}
결과 :
d: long factorial ( int N ){ long result = 1; for (;N=2;--i) result *= N; return result;}
python: factorial =lambda N:(N==1 and 1) or (N * factorial(N-1))
ko:입력인수'N'의 팩토리얼을 구하는 'factorial'라는 함수.
|
You shall be rewarded for a dastardly deed. |











![[http]](/imgs/http.png)