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