작년 10월 이후 시국도 어수선 하고 개인사정으로 인해 한동안 쉬다 최근 들어 다시 개발을 진행하고 있습니다. <div><br></div> <div>기존에는 컴파일러를 하나의 실행파일로 만들었으나 리팩토링을 거치면서 스캐너, 파서, API, 전처리지시어 등을 라이브러리화 하여 재사용이 가능하게 만든 후 컴파일러와 어셈블러를 분리하였습니다.</div> <div><br></div> <div>컴파일러와 어셈블러는 구조상 70% 이상 컴파일러 라이브러리를 공유하는 구조입니다.</div> <div><br></div> <div>스캐너, 심볼테이블, 에러처리 등 코어는 100% 동일합니다.</div> <div><br></div> <div>컴파일러는 어셈블러가 컴파일 할 수 있는 어셈블리 소스코드를 생성하거나 파싱된 토큰 파일을 생성할 수 있습니다. 인라인 어셈블러도 제공합니다.</div> <div><br></div> <div>어셈블러는 어셈블리 소스코드를 이용하여 컴파일 하거나 파싱된 토큰 파일을 통해 스캐닝과 파싱을 생략하고 직접 실행파일을 만들 수 있습니다.</div> <div><br></div> <div>콘솔 헬로우월드의 하이브리드 컴파일러 버전과 하이브리드 어셈블러 버전을 보여드리겠습니다.</div> <div><br></div> <div><b>하이브리드 컴파일러 버전</b></div> <div><br></div> <div><div># Console hello, world!</div> <div><br></div> <div>def main():</div> <div> print("Hello, world!")</div></div> <div><br></div> <div><br></div> <div><b>하이브리드 어셈블러 버전</b></div> <div><br></div> <div><div>; console Hello. world!</div> <div><br></div> <div>@format PE_CONSOLE</div> <div><br></div> <div>@section DATA</div> <div><br></div> <div>strHello db "Hello, world!",0</div> <div>qTemp dq 0</div> <div><br></div> <div>@section CODE</div> <div><br></div> <div>main:</div> <div> sub rsp, 0x28</div> <div> mov rcx, -11</div> <div> call $GetStdHandle</div> <div> mov rcx, rax</div> <div> mov rdx, strHello</div> <div> mov r8, 13</div> <div> mov r9, qTemp</div> <div> call $WriteConsoleA</div> <div> mov rcx, 1000</div> <div> call $Sleep</div> <div> xor rcx, rcx</div> <div> call $ExitProcess</div> <div> add rsp, 0x28</div> <div> ret</div></div> <div><br></div> <div>위의 헬로우월드 하이브리드 버전은 파이썬과 문법이 똑같고 가능하면 하이브리드를 파이썬에 호환되도록 만들고 싶었지만 정적변수, 메모리 안전성 보장, 초고속 성능 등 포기할 수 없는 부분들과 상충되는 부분이 많아 파이썬과의 호환은 완전히 포기하였고 대신 파이썬의 코드를 하이브리드로 컨버전 하기 쉽게 만들 생각입니다.</div> <div><br></div> <div><span style="font-size:9pt;">예제로 동일하게 작동하는 파이썬 앱과 하이브리드 앱을 작성할 생각이 있구요.</span></div> <div><br></div> <div>하이브리드 어셈블러는 현재 기본적인 어셈블리 문법만 지원하는 상태인데 중요한것은 하이브리드 컴파일러 이기 때문에 현재 버전에서 향후에도 크게 업그레이드는 없을 것 같습니다.</div> <div><br></div> <div>나중에 하이브리드 언어로 하이브리드 어셈블러를 다시 작성할 때 추가적인 기능에 대해 고민해 봐야겠죠.</div> <div><br></div> <div><br></div> <div><span style="font-size:9pt;">현재 가장 큰 고민은 언어의 기본적인 기능과 표준 라이브러리의 지원 방법입니다.</span></div> <div><br></div> <div>원래는 모든 기능은 소스코드 형태로 존재하여 컴파일시 사용되는 부분만 포함되어 컴파일 시키는 방식을 사용하려 했습니다.</div> <div><br></div> <div>하지만 향후 언어가 계속 커질 것을 고려한다면 컴파일시간의 증가와 실행파일들에 코드들이 중복되는 문제를 생각하지 않을 수 없더군요.</div> <div><br></div> <div>C런타임 라이브러리 처럼 DLL로 만들까도 고려중입니다.</div> <div><br></div> <div>일단 좀 더 개발을 진행해보고 나중에 결정할 생각입니다.</div>