|
| 1 | +# Kcode — 셀프 빌드 바이너리 |
| 2 | + |
| 3 | +> 이 디렉터리에는 Kcode가 **자기 자신을 컴파일**하여 생성한 최종 실행 파일이 저장됩니다. |
| 4 | +> |
| 5 | +> 소스: `src/*.han` / 부트스트랩 컴파일러: `../kinterp`, `../kbc` |
| 6 | +
|
| 7 | +--- |
| 8 | + |
| 9 | +## 버전 이력 |
| 10 | + |
| 11 | +| 버전 | 날짜 | 내용 | 빌드 방법 | |
| 12 | +|------|------|------|-----------| |
| 13 | +| v0.1.0 | 2026-03-22 | 부트스트랩 — C 컴파일러로 생성된 초기 바이너리 | `make` | |
| 14 | +| v0.2.0 | 2026-03-22 | §LLVM-SH — Kcode AST → LLVM IR 코드생성기 소스 완성 (9파일) | `src/kc_llvm*.han` | |
| 15 | +| v0.3.0 | 2026-03-22 | libkc_rt — Kcode 런타임 라이브러리 C 구현 + make rt | `make rt` | |
| 16 | +| v0.4.0 | 2026-03-22 | kcode.han 빌드실행() 구현 — §LLVM-SH 파이프라인 통합 | `kinterp kcode.han` | |
| 17 | +| v0.5.0 | 2026-03-22 | 쉐도우 스택 GC + 각각 codegen + 문자열 함수 8종 추가 | `make rt` | |
| 18 | +| v0.6.0 | 2026-03-22 | 선택문 codegen + 시도/오류 예외처리 IR + setjmp 런타임 | `make rt` | |
| 19 | +| v0.7.0 | 2026-03-23 | AST 정규화 패스 + 객체/멤버 codegen + KcObj 런타임 | `make rt` | |
| 20 | +| v0.8.0 | 2026-03-23 | 배열/사전 리터럴 codegen + `추가`/`배열포함` 내장 + kc_arr_contains 런타임 | `make rt` | |
| 21 | +| v0.9.0 | 2026-03-23 | 람다 codegen + 인덱스 대입 + `포함`/`찾기`/`자르기` 내장 + kc_str_contains 런타임 | `make rt` | |
| 22 | +| v1.0.0 | 2026-03-23 | `src/kllvm.han` 공개 API + kc_arr_find 런타임 + kcode.han §LLVM-SH v1.0.0 통합 | `make rt` | |
| 23 | +| v1.1.0 | 2026-03-23 | §LLVM-SH Hello World 엔드-투-엔드 컴파일 테스트 — 12 통과 / 0 실패 | `make test-llvm` | |
| 24 | +| v1.2.0 | 2026-03-27 | §LLVM-SH 풀 파이프라인 — `kinterp kcode.han src/khello.han -o /tmp/khello.out` 네이티브 빌드 성공 | `./kinterp kcode.han src/khello.han -o /tmp/khello.out` | |
| 25 | + |
| 26 | +--- |
| 27 | + |
| 28 | +## v0.1.0 — 부트스트랩 빌드 (2026-03-22) |
| 29 | + |
| 30 | +**빌드 방법:** `make` (gcc -std=c11) |
| 31 | + |
| 32 | +**포함 바이너리:** |
| 33 | + |
| 34 | +| 파일 | 크기 | 설명 | |
| 35 | +|------|------|------| |
| 36 | +| `kinterp` | 1.1 MB | 인터프리터 — `.han` 파일 즉시 실행 | |
| 37 | +| `kbc` | 414 KB | 바이트코드 VM — `.kbc` 컴파일 + 실행 | |
| 38 | +| `kcode_gen` | 371 KB | C 코드 생성기 | |
| 39 | + |
| 40 | +**기반 소스 버전:** |
| 41 | +- 인터프리터 엔진: `kinterp.c` v32.1.0 |
| 42 | +- 렉서: `klexer.c` v32.1.0 |
| 43 | +- 파서: `kparser.c` v32.1.0 |
| 44 | + |
| 45 | +**테스트 결과:** 98 통과 / 0 실패 |
| 46 | + |
| 47 | +--- |
| 48 | + |
| 49 | +## 디렉터리 구조 |
| 50 | + |
| 51 | +``` |
| 52 | +KcodeBuild/ |
| 53 | +├── bin/ ← 최종 셀프 빌드 바이너리 (이 디렉터리) |
| 54 | +│ ├── README.md ← 빌드 이력 (이 파일) |
| 55 | +│ ├── kinterp ← 인터프리터 |
| 56 | +│ ├── kbc ← 바이트코드 VM |
| 57 | +│ └── kcode_gen ← C 코드 생성기 |
| 58 | +├── src/ ← Kcode 셀프 호스팅 소스 |
| 59 | +│ ├── klexer.han ← 렉서 (Kcode 구현) |
| 60 | +│ ├── kparser.han ← 파서 (Kcode 구현) |
| 61 | +│ ├── kinterp.han ← 인터프리터 (Kcode 구현) |
| 62 | +│ ├── kc_llvm.hg ← §LLVM-SH 헤더 |
| 63 | +│ ├── kc_llvm_ctx.han ← 컨텍스트/모듈/빌더 |
| 64 | +│ ├── kc_llvm_type.han ← 타입 시스템 |
| 65 | +│ ├── kc_llvm_const.han ← 상수 생성 |
| 66 | +│ ├── kc_llvm_inst.han ← 명령어 생성 |
| 67 | +│ ├── kc_llvm_func.han ← 함수 관리 |
| 68 | +│ ├── kc_llvm_gen.han ← AST 순회 코드생성기 |
| 69 | +│ ├── kc_llvm_rt.han ← 런타임 바인딩 |
| 70 | +│ └── kc_llvm_out.han ← .ll 직렬화 + llc/clang |
| 71 | +│ └── *.hg ← 헤더 (상수/타입 정의) |
| 72 | +├── kcode.han ← 통합 CLI (셀프 호스팅 진입점) |
| 73 | +└── Makefile ← 부트스트랩 빌드 스크립트 |
| 74 | +``` |
| 75 | + |
| 76 | +--- |
| 77 | + |
| 78 | +## v0.2.0 — §LLVM-SH 코드생성기 소스 완성 (2026-03-22) |
| 79 | + |
| 80 | +**내용:** Kcode AST → LLVM IR 9단계 파이프라인 소스 완성 |
| 81 | + |
| 82 | +| 파일 | 역할 | |
| 83 | +|------|------| |
| 84 | +| `src/kc_llvm.hg` | 헤더 — 타입/명령코드/구조 상수 | |
| 85 | +| `src/kc_llvm_ctx.han` | 컨텍스트/모듈/빌더/기본블록 관리 | |
| 86 | +| `src/kc_llvm_type.han` | 타입 시스템 (void/i1~i64/float/ptr/struct) | |
| 87 | +| `src/kc_llvm_const.han` | 상수 생성 (정수/실수/문자열 전역/null) | |
| 88 | +| `src/kc_llvm_inst.han` | 명령어 생성 (alloca/load/store/산술/br/phi/call/gep) | |
| 89 | +| `src/kc_llvm_func.han` | 함수 관리 (선언/정의/extern/ABI) | |
| 90 | +| `src/kc_llvm_gen.han` | AST 순회 코드생성기 (표현식/문장/제어흐름) | |
| 91 | +| `src/kc_llvm_rt.han` | 런타임 바인딩 (C stdlib + Kcode RT extern 선언) | |
| 92 | +| `src/kc_llvm_out.han` | 출력 파이프라인 (.ll 직렬화 + llc/clang/opt 호출) | |
| 93 | + |
| 94 | +**다음 단계:** `libkc_rt.c` 구현 → llc/clang 링크 → 실행 파일 생성 |
| 95 | + |
| 96 | +--- |
| 97 | + |
| 98 | +## v0.6.0 — 선택문 codegen + 예외처리 IR (2026-03-22) |
| 99 | + |
| 100 | +**내용:** `선택문(switch)` LLVM IR 생성 + `시도/오류발생/잡기/항상` 예외처리 IR + setjmp/longjmp 런타임 |
| 101 | + |
| 102 | +| 파일 | 변경 내용 | |
| 103 | +|------|----------| |
| 104 | +| `src/kc_llvm_inst.han` | `llvm빌드switch()` — LLVM switch 명령어 생성 | |
| 105 | +| `src/kc_llvm_gen.han` | `llvm선택생성()` (정수→switch, 문자열→icmp 체인) + `llvm시도생성()` + `llvm오류발생생성()` | |
| 106 | +| `src/kc_llvm_rt.han` | `kc_try_begin/end/throw/catch_msg` extern 선언 추가 | |
| 107 | +| `kc_rt.h` | `KcExcFrame` 구조체 + 예외 함수 선언 | |
| 108 | +| `kc_rt.c` | setjmp/longjmp 기반 예외 프레임 스택 구현 | |
| 109 | + |
| 110 | +**예외 처리 패턴:** |
| 111 | +``` |
| 112 | +%r = call i32 @kc_try_begin() ; 0=정상, 1=예외 |
| 113 | +%cond = icmp ne i32 %r, 0 |
| 114 | +br i1 %cond, label %catch, label %try_body |
| 115 | +try_body: ... call @kc_try_end() ... br %finally |
| 116 | +catch: %msg = call ptr @kc_catch_msg() ... call @kc_try_end() |
| 117 | +finally: ... |
| 118 | +``` |
| 119 | + |
| 120 | +--- |
| 121 | + |
| 122 | +## v0.7.0 — AST 정규화 + 객체/멤버 codegen (2026-03-23) |
| 123 | + |
| 124 | +**내용:** kparser.han 원시 AST 형식과 kc_llvm_gen.han 기대 형식의 불일치를 `llvmAST정규화()` 패스로 해결 + 객체/멤버 IR 생성 |
| 125 | + |
| 126 | +| 파일 | 변경 내용 | |
| 127 | +|------|----------| |
| 128 | +| `src/kc_llvm_gen.han` | `llvmAST정규화()` — kparser.han `"자식들"/"문자열"/연산자int` → gen.han `"자식"/"이름"/연산자string` | |
| 129 | +| `src/kc_llvm_gen.han` | `llvm클래스선언생성()` — 클래스 등록 + 메서드 함수 emit | |
| 130 | +| `src/kc_llvm_gen.han` | `llvm멤버접근생성()` — `kc_obj_get(obj, field)` 호출 | |
| 131 | +| `src/kc_llvm_gen.han` | `llvm호출생성()` — 클래스 생성자 탐지 + 메서드 호출 처리 | |
| 132 | +| `src/kc_llvm_gen.han` | `llvm대입생성()` — `obj.field = val` → `kc_obj_set` 처리 | |
| 133 | +| `src/kc_llvm_gen.han` | `llvm이항생성()` — 문자열 `+` → `kc_str_concat` 자동 처리 | |
| 134 | +| `kc_rt.h` | `KcObj` 구조체 + `kc_obj_new/set/get/has` 선언 | |
| 135 | +| `kc_rt.c` | `KcObj` 64-필드 문자열 키 맵 구현 (GC 관리) | |
| 136 | +| `src/kc_llvm_rt.han` | `kc_obj_new/set/get/has` extern 선언 | |
| 137 | + |
| 138 | +--- |
| 139 | + |
| 140 | +## v0.8.0 — 배열/사전 리터럴 codegen (2026-03-23) |
| 141 | + |
| 142 | +**내용:** `NODE_ARRAY_LIT` / `NODE_DICT_LIT` IR 생성 + `추가`/`배열포함` 내장 함수 런타임 매핑 + `kc_arr_contains` 런타임 구현 |
| 143 | + |
| 144 | +| 파일 | 변경 내용 | |
| 145 | +|------|----------| |
| 146 | +| `src/kc_llvm_gen.han` | `llvmAST정규화()` — `NODE_ARRAY_LIT`/`NODE_DICT_LIT` 정규화 추가 | |
| 147 | +| `src/kc_llvm_gen.han` | 표현식 디스패처 — `NODE_ARRAY_LIT` → `llvm배열리터럴생성()`, `NODE_DICT_LIT` → `llvm사전리터럴생성()` | |
| 148 | +| `src/kc_llvm_gen.han` | `llvm배열리터럴생성()` — `kc_arr_new(cap)` + 원소별 `kc_arr_push` | |
| 149 | +| `src/kc_llvm_gen.han` | `llvm사전리터럴생성()` — `kc_obj_new("")` + 키/값 쌍별 `kc_obj_set` | |
| 150 | +| `src/kc_llvm_rt.han` | `kc_arr_contains` extern 선언 추가 + `추가`/`배열포함` 내장 매핑 추가 | |
| 151 | +| `kc_rt.h` | `kc_arr_contains(ptr arr, i64 val) → i64` 선언 | |
| 152 | +| `kc_rt.c` | `kc_arr_contains` 선형 탐색 구현 | |
| 153 | + |
| 154 | +**배열 리터럴 IR 패턴:** |
| 155 | +``` |
| 156 | +%arr = call ptr @kc_arr_new(i64 N) |
| 157 | +call void @kc_arr_push(ptr %arr, i64 %elem0) |
| 158 | +... |
| 159 | +``` |
| 160 | + |
| 161 | +**사전 리터럴 IR 패턴:** |
| 162 | +``` |
| 163 | +%obj = call ptr @kc_obj_new(ptr @.str.empty) |
| 164 | +call void @kc_obj_set(ptr %obj, ptr @.str.key0, i64 %val0) |
| 165 | +... |
| 166 | +``` |
| 167 | + |
| 168 | +--- |
| 169 | + |
| 170 | +## v0.9.0 — 람다 codegen + 인덱스 대입 (2026-03-23) |
| 171 | + |
| 172 | +**내용:** `NODE_LAMBDA` 익명 함수 IR 생성 (상태 저장/복원 패턴) + `arr[i] = val` 인덱스 대입 + 문자열 `포함`/`찾기`/`자르기` 내장 매핑 + `kc_str_contains` 런타임 추가 |
| 173 | + |
| 174 | +| 파일 | 변경 내용 | |
| 175 | +|------|----------| |
| 176 | +| `src/kc_llvm_gen.han` | `llvmAST정규화()` — `NODE_LAMBDA` 매개변수/본문 분리 | |
| 177 | +| `src/kc_llvm_gen.han` | 표현식 디스패처 — `NODE_LAMBDA` → `llvm람다생성()` | |
| 178 | +| `src/kc_llvm_gen.han` | `llvm람다생성()` — 함수 상태 저장/복원 + `__lambda_N` 함수 리프트 | |
| 179 | +| `src/kc_llvm_gen.han` | `llvm대입생성()` — `NODE_INDEX` 대상 → `kc_arr_set_i64` 호출 | |
| 180 | +| `src/kc_llvm_rt.han` | `포함` (str/arr), `찾기` (str/arr), `자르기` 내장 매핑 추가 | |
| 181 | +| `src/kc_llvm_rt.han` | `kc_str_contains(ptr, ptr) → i64` extern 선언 추가 | |
| 182 | +| `kc_rt.h` / `kc_rt.c` | `kc_str_contains()` 구현 추가 (`strstr` 기반) | |
| 183 | + |
| 184 | +**람다 IR 패턴:** |
| 185 | +```llvm |
| 186 | +define internal i64 @__lambda_0(i64 %x.arg) #0 { |
| 187 | +entry: |
| 188 | + %x.addr = alloca i64 |
| 189 | + store i64 %x.arg, ptr %x.addr |
| 190 | + %0 = load i64, ptr %x.addr |
| 191 | + %1 = add i64 %0, 1 |
| 192 | + ret i64 %1 |
| 193 | +} |
| 194 | +; ... 호출 지점에서: |
| 195 | +%fp = getelementptr ptr @__lambda_0, ... |
| 196 | +``` |
| 197 | + |
| 198 | +**인덱스 대입 IR 패턴:** |
| 199 | +```llvm |
| 200 | +call void @kc_arr_set_i64(ptr %arr, i64 %idx, i64 %val) |
| 201 | +``` |
| 202 | + |
| 203 | +--- |
| 204 | + |
| 205 | +## v1.0.0 — src/kllvm.han 공개 API + 파이프라인 통합 (2026-03-23) |
| 206 | + |
| 207 | +**내용:** §LLVM-SH v0.2.0 고수준 공개 API 래퍼 `src/kllvm.han` 신규 작성 + `kc_arr_find` 런타임 + `kcode.han` §LLVM-SH v1.0.0 전환 |
| 208 | + |
| 209 | +| 파일 | 변경 내용 | |
| 210 | +|------|----------| |
| 211 | +| `src/kllvm.han` | **신규** — §LLVM-SH v0.2.0 공개 API: `kllvm_IR생성()`, `kllvm_IR저장()`, `kllvm_IR문자열()`, `kllvm_빌드()`, `kllvm_진단()`, `kllvm_오류메시지()` | |
| 212 | +| `kcode.han` | `#포함 "src/kllvm.han"` 전환 + `kllvm_IR생성()` API 사용 + §LLVM-SH v1.0.0 주석 | |
| 213 | +| `src/kc_llvm_rt.han` | `kc_arr_find(ptr, i64) → i64` extern 선언 추가 | |
| 214 | +| `kc_rt.h` | `kc_arr_find()` 선언 추가 | |
| 215 | +| `kc_rt.c` | `kc_arr_find()` 선형 탐색 구현 추가 | |
| 216 | + |
| 217 | +**공개 API 요약:** |
| 218 | +```kcode |
| 219 | +목록 ctx = kllvm_IR생성(ast, 소스파일, 소스파일) // AST → IR 컨텍스트 |
| 220 | +논리 성공 = kllvm_IR저장(ctx, "output.ll") // .ll 파일 저장 |
| 221 | +문자 ir = kllvm_IR문자열(ctx) // IR 문자열 추출 |
| 222 | +정수 코드 = kllvm_빌드(ast, "src.han", "a.out", "-O2") // 풀 빌드 |
| 223 | +``` |
| 224 | + |
| 225 | +--- |
| 226 | + |
| 227 | +## 다음 버전 계획 |
| 228 | + |
| 229 | +| 버전 | 내용 | |
| 230 | +|------|------| |
| 231 | +| ~~v0.3.0~~ | ✅ 완성 — `kc_rt.c` / `libkc_rt.a` | |
| 232 | +| ~~v0.4.0~~ | ✅ 완성 — `kcode.han` `빌드실행()` 구현 | |
| 233 | +| ~~v0.5.0~~ | ✅ 완성 — 쉐도우 스택 GC + `각각` codegen + 문자열 8종 | |
| 234 | +| ~~v0.6.0~~ | ✅ 완성 — `선택문` codegen + `시도/오류발생` 예외처리 IR + setjmp 런타임 | |
| 235 | +| ~~v0.7.0~~ | ✅ 완성 — AST 정규화 패스 + `객체/멤버` codegen + KcObj 런타임 | |
| 236 | +| ~~v0.8.0~~ | ✅ 완성 — `배열/사전 리터럴` codegen + `추가`/`배열포함` 내장 매핑 + `kc_arr_contains` 런타임 | |
| 237 | +| ~~v0.9.0~~ | ✅ 완성 — `람다(NODE_LAMBDA)` codegen + `인덱스 대입` + `포함`/`찾기`/`자르기` 내장 + `kc_str_contains` 런타임 | |
| 238 | +| ~~v1.0.0~~ | ✅ 완성 — `src/kllvm.han` §LLVM-SH v0.2.0 공개 API + `kc_arr_find` + `kcode.han` 통합 업데이트 | |
| 239 | +| ~~v1.1.0~~ | ✅ 완성 — §LLVM-SH Hello World 엔드-투-엔드 컴파일 테스트 12 통과 / 0 실패 | |
| 240 | +| ~~v1.2.0~~ | ✅ 완성 — §LLVM-SH kinterp 경유 풀 파이프라인 — `./kinterp kcode.han src/khello.han -o /tmp/khello.out` → "Hello, World!" | |
0 commit comments