Subleq는 단일 명령어 집합 컴퓨터(OISC)를 위한 언어로, 텍스트 매크로를 사용하여 구현 난이도(Implementation Challenges)를 극복함
m4 매크로 프로세서를 활용하여 Subleq 코드를 생성하고, 이를 통해 튜링 완전성(Turing Completeness)을 달성함
GOSUB/RETURN 구현과 동적 GOTO를 통해 언어의 기능을 확장하고, 재귀 호출(Recursive Call)을 지원하지 않음
매크로 처리(Macro Processing)의 한계점(변수 스코핑, 디버깅, 컴파일 타임 vs 런타임 바인딩)을 언급하며, BASIC to C 변환 사례를 통해 확장성을 제시
게시물은 Subleq가 단 하나의 명령어, 즉 'SUBtract and branch if Less-than or EQual to zero'만을 지원하지만, 튜링 완전성(Turing Completeness)을 갖춘 언어임을 강조한다. 이는 Subleq가 모든 알고리즘을 실행할 수 있음을 의미하며, OISC(One Instruction Set Computer)의 핵심 특징을 보여준다. Subleq 명령어는 메모리 주소 A의 값을 메모리 주소 B에서 빼고, 결과가 0 이하면 주소 C로 분기하는 방식으로 작동한다.
저자는 Subleq 언어의 구현을 위해 m4 매크로 프로세서를 선택했다. m4는 텍스트 매크로를 사용하여 코드의 재사용성과 가독성을 높이는 데 기여한다. 예를 들어, `define(ENDFILE -1)`과 같이 매크로를 정의하여 코드 내에서 특정 문자열을 다른 문자열로 대체할 수 있다. 이러한 방식은 Subleq와 같이 어셈블리 언어와 유사한 언어에 기능을 추가하는 데 효과적이며, 을 단순화한다.
매크로 처리 방식은 변수 스코핑, 디버깅, 컴파일 타임과 런타임 바인딩, 그리고 구문 정보 부재와 같은 단점(Downside)을 가진다. 특히, 매크로 내에서 정의된 변수의 스코프가 전역적이기 때문에, 한 매크로에서 사용된 변수가 다른 매크로에 영향을 미칠 수 있다. 이러한 문제점을 해결하기 위해 저자는 변수를 매크로 시작 시점에 초기화하는 방식을 사용하지만, 복잡한 매크로에서는 여전히 어려움이 존재한다.
게시물은 GOSUB/RETURN 기능을 구현하기 위해 동적 GOTO(assigned goto)를 사용한다. 이는 FORTRAN과 같은 초기 프로그래밍 언어에서 사용되었으며, C/C++에서도 GCC의 labels-as-values 확장을 통해 지원된다. 동적 GOTO(Dynamic Goto)는 GOSUB 호출 시 반환 주소를 저장하고, RETURN 시 해당 주소로 점프하는 방식으로 구현된다. 이러한 방식은 재귀 호출을 지원하지 않지만, 다양한 프로그래밍 기법(예: dispatch tables, finite state machines)에 유용하게 사용될 수 있다.
저자는 매크로 기반 언어의 확장성에 대한 논의를 이어가며, Peter van Eerten의 m4 BASIC to C 변환기를 예시로 제시한다. 이 변환기는 BASIC 코드를 C 코드로 변환하며, 이를 통해 매크로를 사용하여 복잡한 언어 기능을 구현할 수 있음을 보여준다. 이 사례는 매크로 기반 언어가 코드 재사용성(Code Reusability)과 유지보수성(Maintainability)을 향상시키는 데 기여할 수 있음을 시사한다.