2018년 7월 22일 일요일

2018-07-23 스크립트언어를 위한 비교 처리프로그램 (5)

개발중인 스크립트 언어에서  비교문은 산술식과 결합된다.결과를 만드는 프로그램은 이미 완료된 상태지만 아직 IF 의 결과에 따른 처리문 은 이제 개발 할 예정이다.  다양한 많은 프로그램의 결과는 간단할지도 모르지만 숨겨진 과정은 어마어마 하다.(단순히 남의 코드를 복사하는 사람은 당연히 그 결과 이상을 개발 할수 없다. 이유는 결과이외엔 아는 것이 없기때문이다.)

2018년 7월 18일 수요일

2018-07-17 스크립트언어를 위한산술식 처리프로그램 (4)

스크립트 언어에서 사칙연산 을 포함한 문자열수식 계산함수는 필수로 요구된다.다음은 그 구현 원리를 간단하게 소개합니다.( 오늘2018-07-18 개발 및 적용된 예입니다. )

2018년 7월 16일 월요일

2018-07-13 AI를 위한 컴파일러 개발(3)

2018-07-17 AI를 위한 컴파일러 개발(3) by 백승기
*이제 이 스크립트 컴파일러의 이름을 정했습니다.( 임시이름 )  
그리고 변수처리기의 기능을 일부 마무리했고  
간단한 계산기정도의 처리능력을 발휘할 수 있습니다,  
명령어중 pr은 print 기능을 제공합니다.  
그리고 함수 호출기능이 추가되었고 이제 실행됩니다.
* 다음엔 if 와 goto 기능을 구현할까 합니다.
 단 if 문에 goto문은 구현이 되어지므로 따로 goto문을 구현하지는 않을 예정입니다.

MyCalc <가칭> 버전 1.00-> 스크립트 소스
"function main;" 
" A=123;" 
" B='NAME';" 
" pr '----------------------------';" 
" pr 'B=$01',B;" 
" B=1000;" 
" C=A+B;" 
" D=A+B*10;" 
" pr '----------------------------';" 
" pr '$02+$01=$03',A,B,C;" 
" pr 'D=$01',D;" 
" pr '----------------------------';" 
" call sub;" 
"end;" 
"" 
"function sub;" 
" pr '-sub function-';" 
"end;"
MyCalc <가칭> 버전 1.00-> 실행결과
----------------------------
B=NAME
----------------------------
1000+123=1123.00
D=10123.00
----------------------------
-sub function- 


2018년 7월 15일 일요일

스크립트언어를 개발하고 싶다면...

먼저 BASIC언어를 배우거나 테스트해보세요
기초에 불과한 언어일지라도 유용합니다.

BASIC 은 단지 교육용으로 사용하다가 이제 어디서 쓰는지 모르는 언어가 되었지만

기본적인 구조가 다음과 같습니다.
10 rem Basic Language
20 print "Good Morning"
30 goto 20

이것은 영원히 "Good Morning" 을 출력합니다.
10 라인은 rem -> 주석입니다.
20 "Good Morning" 을 출력합니다.
30 goto 20 => 20 번으로 가라는 뜻입니다.

어째서 영원히 "Good Morning" 을 출력할까?
이것은 모든 프로그램은 10-> 20-> 30 -> 순차적으로 흐르도록 되어 있습니다.
최근에는 EVENT 함수가 주를 이루어 순차적이 아니라 생각할지 모르지만
그것도 커널에서 순차적으로 명령을 처리합니다.
즉 위 프로그램은 10 -> 20-> 30-> 20->30-> 20->30-> ... 전원이 꺼질때까지 ...

프로그램의 모든것은 순서를 가지고 있습니다.
이것을 이해한다면 배우기도 편해지고 새로운 프로그램을 만들기도 쉬어 집니다.

2018년 7월 12일 목요일

2018-07-13 AI를 위한 컴파일러 개발(2)

백승기의 2018-07-13 AI를 위한 컴파일러 개발(2)

이번에는 실행과에 대한 설명을 먼저 합니다.
1.시행했을때 컴파일하고 선언하지 않았지만 소스속에서 변수라 예상되는 항목을 찾아내어 변수로 만들고 이름을 등록하고 초기화 해줍니다.2. 실행과정속에서 변수를 사용하는 코드를 분석에서 변경되는 값을 수정해줍니다.3. 이번 컴파일러의 변수는 수치,문자열 속성 구분따위 없앴습니다. (제 맘대로이니까요)4. 마지막에 최종 결과 값이 보입니다. (참고로 A+B의 덧셈연산을 수행한 최종 결과도 확인됩니다.)* 다음은 어디까지 할까요 역시 제 맘대로 입니다.

다음은 스크립트소스와 결과 입니다.

스크립트소스 원본: 개발중인 컴파일러가 이걸 컴파일합니다.// Comfile Code 
g_psr.fnLineSplit( 
"function main;" 
" A=123;" 
" B='NAME';" 
" pr 'B=$01',B;" 
" B=1000;" 
" C=A+B;" 
" pr '$02+$01=$03',A,B,C;" 
" call sub;" 
"end;" 
"" 
"function sub;" 
" pr '-sub function-';" 
"end;" 
); 
// Run Code 
g_psr.fnRunSplit();



다음은 실행결과 입니다.

2018년 7월 11일 수요일

2018-07-11 AI를 위한 컴파일러 개발(1)

2018-07-11 AI를 위한 컴파일러 개발(1)
이제 새로 스크립트 컴파일러를 개발중에 있습니다.다음소스코드는 원본 스크립트 코드 입니다.

// Comfile Code -컴파일단계
g_psr.fnLineSplit( 
"function main;" 
" A=123;" 
" B='NAME';" 
" pr 'B=$01',B;" 
" B=1000;" 
" C=A+B;" 
" pr '$02+$01=$03',A,B,C;" 
" call sub;" 
"end;" 
"" 
"function sub;" 
" pr '-sub function-';" 
"end;" 
); 
// Run Code  - 실행단계
g_psr.fnRunSplit();* 개발단계에서 이전에 한번 실행했던 방식에서 이제 컴파일단계와 실행단계로 구분합니다.실행단계에서의 결과물은 다음과 같습니다.

//결과 는 실행소스를 두가지로 구분하고 처리합니다.1. 하나는 소스 그룹이고 2. 두번째는 변수 그룹입니다.* 이제는 실행코드를 실제 실행되도록 작성할 겁니다.



2018년 7월 5일 목요일

2018-07-06 AI를 위한 직관적 컴파일러 준비

2018 - 07 - 06 AI를 위한 직관적 컴파일러 준비

지금까지 준비했던 스크립트 파일"struct one1 begin;" 
"int A=111,B=222,C=333;"    // 정수:초기화 -> to int array 
"chr D:40='aaa',E:32;" // 문자열:길이 -> to 크기를 지정함 <- 추가 
"int A=111,B=222,C=333;"    // 정수:초기화 -> to int array 
"str D1='ab cd',E1='';"      // 문자열:길이 -> to 가변 미구현 
"num F=11.1,G=12.12;" // FLOAT NUMBER  -> to double 
"end;" 
"program main begin;" 
"one1.A = 100;" 
"one1.B = 2;" 
"one1.C = one1.A + one1.B;" 
"exec notepad.exe;" 
"putln one1.F,one1.B,one1.G;" // like prinf 
"putln one1.A,one1.B,one1.C;" // like prinf 
"putln A = one1.A;" // like prinf 
"putln B = one1.B;" // like prinf 
"putln C = one1.C;" // like prinf 
"end;" 
 ---- 이것은 경험으로 남겨둡니다 ---구조체 및 실행문을 만들고 실행하는 코드를 만들었습니다. 왠지 코드가 제가 사용하기 복잡해서  계산 및 AI 스런 컴파일러로 재구성해야 할듯 합니다.
그래서 코드를 다음과 같이  구조체 및 변수 선언을 없애고 함수문만사용하는 형태로 코드를 다시 작성하고 있습니다.일종의 시행착오를 수정하지만 결코 느려지는 것은 아닙니다.어짜피 제가 쓰기 편한 스크립트 실행코드를 개발하는 것입니다.
별써 시작하고 있습니다.( 아래 컴파일 중 코드 )--> 새로운 형식의 직관적 코드
"function main;"
" A=123;"
" B='NAME';"
" pr '$02=$01',A,B;"
"end;" 

"function sub;"
"end;" 



2018년 7월 2일 월요일

[한이터백승기] AI준비단계 - 마지막(6)

이번것으로 컴파일러 준비단계는 마지막입니다.
프로그램은 소스코드를 메모리로 읽고 번역하고 실행하는 것으로 이어졌습니다.
실행대상은 변수구조체 선언문과 간단한 실행문을 처리하는 것으로 마무리됩니다.
1. 변수는 구조체만 정의 하였습니다.
    => 이유는 대표명이 있는 구조체가 분석하기 쉽습니다.
2. 실행코드는 간단한 연산문 덧셈과 할당 뿐입니다.
   => 사실은 사칙연산은 다 됩니다. 
뜻밖이지만 다중계산도 될지도 모릅니다.
여기서 마무리 짖는 것은 다음에 해야할 내용이 문장 및 구조 분석입니다.
물론  한글문장 분석은 좀더 나중에 할것입니다. 
지금은 좀더 고도의 산술식만 처리하는 스크립트 코드를 번역하고 실행하는 프로그램에 집중할것입니다.
=> 프로그램은 남이 한것을 가져다 자기이름으로 바꾸는 것은 쉽지만 , 
자기 스스로 프로그램을 만드는 것은 오랜경험없이 쉽게 만든다는것은 전부 거짓말입니다.
=> 이 프로그램은 제가 지금 몸이 아파 병원신세를 지기직전 상태로 요양중에 매일 잠깐동안만  작성하고 있는 것입니다. ( 1~2시간 정도 )
=> 한국에서는 이런 초급수준의 컴파일러도 만들수 없을 것입니다. 
( 연구소도 못할 것이고  대학생들은 가능할듯 합니다. => 빨리빨리 문화의 피해입니다. )

다음은 스크립트 소스코드 입니다.
  ==> [ 스크립트 컴파일러 소스코드는 공개하지 않을 예정입니다. ]

gRTN.demo(""
"struct one1 begin;"
"int A=111,B=222,C=333;"    // 정수:초기화 -> to int array
"chr D:40='aaa',E:32;" // 문자열:길이 -> to 크기를 지정함 <- 추가
"int A=111,B=222,C=333;"    // 정수:초기화 -> to int array
"str D1='ab cd',E1='';"      // 문자열:길이 -> to 가변 미구현
"num F=11.1,G=12.12;" // FLOAT NUMBER  -> to double
"end;"
"program main begin;"
"one1.A = 100;"
"one1.B = 2;"
"one1.C = one1.A + one1.B;"
"exec notepad.exe;"  
// <= 이것이 출력창입니다.
"putln one1.F,one1.B,one1.G;" // like prinf
"putln one1.A,one1.B,one1.C;" // like prinf

"putln A = one1.A;" // like prinf
"putln B = one1.B;" // like prinf
"putln C = one1.C;" // like prinf
"end;"
);





2018년 6월 25일 월요일

[한이터백승기] AI준비단계 - 컴파일 단계 준비(5)

오늘은 출력을 구현하지만notepad.exc 안에 출력하게 만들것입니다.
당장은 노트패드 지만 MSWORD 나 한글 도 가능합니다.
물론 대상 SW는 아무것도 수정하지 않습니다.
수정할수도 없습니다 만 ^^

[소스 원본]gRTN.demo(""
"struct one1 begin;"
"int A=111,B=222,C=333;"    // 정수:초기화 -> to int array
"chr D:40,E:32;" // 문자열:길이 -> to 크기를 지정함 <- 추가
"int A=111,B=222,C=333;"    // 정수:초기화 -> to int array
"str D1='abcd',E1='';"      // 문자열:길이 -> to 가변 미구현
"num F,G;" // FLOAT NUMBER  -> to double
"end;"
"program main begin;"
"one1.A = 100;"
"one1.B = 2;"
"one1.C = one1.A + one1.B;"
"exec notepad.exe;"
"putln one1.F,one1.B,one1.G;" // like prinf
"put one1.A,one1.B,one1.C;" // like prinf
//"putln ';';"
//"putln 'RESULT=[one1.A,one1.B,one1.A]';"
"end;"
);

[실행결과화면]

[실행결과]변수를 값으로 변환하기 전에 출력대상을 프로그램 상이 아닌 외부 프로그램인
[ notepad.exe ]를 이용했습니다.
--------------------------------------------
Test Command List
--------------------------------------------
. help   - (h) show this message
. run    - (r) run script
. edit   - (e) call editor
. quit   - (q) quit program!
--------------------------------------------
r
Run scriper!
[source list begin]
[0000] struct one1 begin
[0001] int A=111,B=222,C=333
[0002] chr D:40,E:32
[0003] int A=111,B=222,C=333
[0004] str D1='abcd',E1=''
[0005] num F,G
[0006] end
[0007] program main begin
[0008] one1.A = 100
[0009] one1.B = 2
[0010] one1.C = one1.A + one1.B
[0011] exec notepad.exe
[0012] putln one1.F,one1.B,one1.G
[0013] put one1.A,one1.B,one1.C
[0014] end
[source list end]


 [struct] [one1] [begin]
 [int] [A=111] [B=222] [C=333]
 [chr] [D:40] [E:32]
 [int] [A=111] [B=222] [C=333]
 [str] [D1=] [abcd] [E1=]
 [num] [F] [G]
 [end]
 [program] [main] [begin]
 [one1.A] [=] [100]
 [one1.B] [=] [2]
 [one1.C] [=] [one1.A] [+] [one1.B]
 [exec] [notepad.exe]
 [putln] [one1.F,one1.B,one1.G]
 [put] [one1.A,one1.B,one1.C]
 [end]

VAR_TY_NONE: <struct>
<BEGIN STRUCT>
 [sStructName:one1][tag:begin]
-var-: <int>[L=10,'111' ][A=111][L=10,'222' ][B=222][L=10,'333' ][C=333]
-var-: <chr>[L=40,'40' ][D:40][L=32,'32' ][E:32]
-var-: <int>[L=10,'111' ][A=111][L=10,'222' ][B=222][L=10,'333' ][C=333]
-var-: <str>[L=128][D1=][L=128][abcd][L=128][E1=]
-var-: <num>[L=20][F][L=20][G]
<END STRUCT>

memory address![end][1]
VAR_TY_NONE: <program>
<BEGIN PROGRAM>
 [sStructName:main][tag:begin]
-prg-: <one1.A>
memory address![one1.A][3]<=><100>
-prg-: <one1.B>
memory address![one1.B][3]<=><2>
-prg-: <one1.C>
memory address![one1.C][5]<=><one1.A><+><one1.B>
-prg-: <exec>
memory address![exec][2]<notepad.exe>
-prg-: <putln>
memory address![putln][2]<one1.F,one1.B,one1.G>
-prg-: <put>
memory address![put][2]<one1.A,one1.B,one1.C>
<END PROGRAM>

memory address![end][1]
[:00]  VAR:one1
program_cnt=8
[program] top address:00  name:end [sub cnt:0]
[program] top address:01  name:one1.A [sub cnt:2]
[x][y] memory address:[01][00]  name:= [type:999]
[x][y] memory address:[01][01]  name:100 [type:999]
[program] top address:02  name:one1.B [sub cnt:2]
[x][y] memory address:[02][00]  name:= [type:999]
[x][y] memory address:[02][01]  name:2 [type:999]
[program] top address:03  name:one1.C [sub cnt:4]
[x][y] memory address:[03][00]  name:= [type:999]
[x][y] memory address:[03][01]  name:one1.A [type:999]
[x][y] memory address:[03][02]  name:+ [type:999]
[x][y] memory address:[03][03]  name:one1.B [type:999]
[program] top address:04  name:exec [sub cnt:1]
[x][y] memory address:[04][00]  name:notepad.exe [type:101]
[program] top address:05  name:putln [sub cnt:1]
[x][y] memory address:[05][00]  name:one1.F,one1.B,one1.G [type:103]
[program] top address:06  name:put [sub cnt:1]
[x][y] memory address:[06][00]  name:one1.A,one1.B,one1.C [type:102]
[program] top address:07  name:end [sub cnt:0]


[RUN]program_cnt=8
Run ...TY_ETC
TY_ETC
[EQQ] SET:[01]  name:100 [type:999]
[EQQ] [RESULT] data:100
TY_ETC
[EQQ] SET:[01]  name:2 [type:999]
[EQQ] [RESULT] data:2
TY_ETC
[EQQ] SET:[01]  name:one1.A [type:999]
[EQQ] SET:[02]  name:+ [type:999]
[EQQ] SET:[03]  name:one1.B [type:999]
[EQQ] [RESULT] data:one1.A+one1.B
TY_EXE
[RUN] WORD:[00]  name:notepad.exe [type:101]
TY_PUTLN
[RUN] PUTLN:[00]  name:one1.F,one1.B,one1.G [type:103]
TY_PUT
[RUN] PUT:[00]  name:one1.A,one1.B,one1.C [type:102]
TY_ETC 

2018년 6월 20일 수요일

[한이터백승기] AI준비단계 - 컴파일 단계 준비(4)


이번에는 프로그램 을 실행시킬 겁니다.
이것은 다른방법으로도 쉬운것이고 누구나 간단히 구현하는 것이지요
물론 스크립트 소스를 만들고
실행시킬 스크립트 프로그램 원본 을 컴파일하고 이것을 실행시키는 프로그램은 전혀 다른 예기입니다.

* 보이는 소스를 실행하고 결과를 생성합니다.

1. 원본소스를 준비합니다. ( 파일 또는 다음과 같은 프로그램 내에서 사용합니다.)
2. 실행합니다. ( 모든 소스를 분해하고 확인해서 변수 와 실행부분으로 분리합니다.)
3. 결과 : 여기서는 exec notepad.exe 만 실행합니다.
옆부분의 notepad.exe가 실행되어 있고 이것이 결과 입니다.


다음에는 출력부분을 추가할 예정입니다.