- Compiler: PP → Lexer → Parser → Analyzer → Gengo pipeline - Parser: 232/236 (98%) Harbour compatibility, registry-based dispatch - RTL: 351 Harbour-compatible functions - RDD: DBF/NTX/CDX engines with Rushmore bitmap optimization - Go Interop: IMPORT + pkg.Func() + obj:Method() with FastPath (15M calls/sec) - HB_FUNC API: Full Harbour C API compatible Go bridge - Concurrency: SPAWN/LAUNCH/GOROUTINE, <-, WATCH, PARALLEL FOR, ASYNC/AWAIT - Extensions: Multi-return, DEFER, Slice, f-string, Nil-safe ?:, CONST - Macro Compiler: Runtime AST parsing and evaluation - Debugger: TUI debugger with source display, breakpoints, stepping - FRB: Native + Pcode dual mode runtime binary - Tests: 13 packages ALL PASS Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
23 KiB
23 KiB
Five Development Plan
Harbour + Go 융합 플랫폼 "Five" 개발 계획 4개 설계 문서 기반 실행 계획
Copyright (c) 2026 Charles KWON OhJun (charleskwonohjun@gmail.com) All rights reserved.
관련 문서
| 문서 | 내용 |
|---|---|
| harbour-type-system-analysis.md | HB_ITEM 타입 시스템 분석, Tagged Value 16B 설계 |
| harbour-prg-to-go-transpiler.md | PRG→Go 트랜스파일러, gencc.c 패턴 분석 |
| harbour-go-evolution-strategy.md | 융합 전략, 언어 진화, Go 생태계 연동 |
| harbour-go-compiler-design-review.md | 컴파일러 설계 관점 분석, DBF/Index 이식 전략 |
프로젝트 구조
five/
├── docs/ ← 설계 문서 (현재)
├── cmd/
│ └── five/ ← CLI 엔트리포인트
│ └── main.go five build, five run, five fmt
├── compiler/ ← PRG → Go 컴파일러
│ ├── token/ 토큰 정의
│ │ └── token.go
│ ├── lexer/ 렉서
│ │ ├── lexer.go
│ │ └── lexer_test.go
│ ├── ast/ AST 노드
│ │ └── ast.go
│ ├── parser/ 파서 (recursive descent)
│ │ ├── parser.go
│ │ ├── parser_expr.go
│ │ ├── parser_stmt.go
│ │ ├── parser_cmd.go xBase 명령어 파싱
│ │ └── parser_test.go
│ ├── analyzer/ 의미 분석
│ │ ├── scope.go
│ │ ├── types.go
│ │ └── analyzer.go
│ └── gengo/ Go 코드 생성
│ ├── gengo.go
│ ├── gen_expr.go
│ ├── gen_stmt.go
│ ├── gen_symbol.go
│ └── gengo_test.go
├── hbrt/ ← 핵심 런타임
│ ├── value.go Tagged Value 16B
│ ├── value_test.go
│ ├── thread.go 실행 컨텍스트
│ ├── stack.go eval 스택
│ ├── symbol.go 심볼 테이블
│ ├── class.go CLASS 시스템
│ ├── error.go 에러/SEQUENCE
│ ├── macro.go 매크로 컴파일러
│ ├── ops_arith.go 산술 연산
│ ├── ops_compare.go 비교 연산
│ ├── ops_string.go 문자열 연산
│ ├── bridge.go Go ↔ Five 타입 변환
│ └── vm.go VM 초기화/관리
├── hbrtl/ ← 표준 라이브러리 (Harbour RTL 호환)
│ ├── strings.go SUBSTR, ALLTRIM, UPPER, PAD, ...
│ ├── numeric.go STR, VAL, INT, ROUND, MOD, ...
│ ├── datetime.go DATE, TIME, CTOD, DTOC, YEAR, ...
│ ├── array.go AADD, ADEL, AINS, ASORT, AEVAL, ...
│ ├── hash.go HB_HASH, HB_HGET, HB_HSET, ...
│ ├── console.go QOUT, QQOUT, ACCEPT, INKEY, ...
│ ├── file.go FOPEN, FCLOSE, FREAD, FWRITE, ...
│ ├── convert.go ASC, CHR, CTOD, DTOC, STOD, ...
│ └── misc.go TYPE, VALTYPE, EMPTY, ...
├── hbrdd/ ← RDD 엔진 (DBF/Index)
│ ├── driver.go Driver/Area interface 정의
│ ├── workarea.go WorkArea 관리
│ ├── alias.go ALIAS 시스템
│ ├── dbf/ DBF 드라이버
│ │ ├── header.go 헤더/필드 디스크립터
│ │ ├── record.go 레코드 읽기/쓰기
│ │ ├── field.go 필드 타입 변환
│ │ ├── lock.go 6종 락 스키마
│ │ ├── memo.go FPT 메모 필드
│ │ └── dbf.go DBF Area 구현
│ ├── ntx/ NTX 인덱스
│ │ ├── header.go NTX 헤더 (512B)
│ │ ├── page.go B-tree 페이지 (1024B)
│ │ ├── search.go SEEK 알고리즘
│ │ ├── update.go 삽입/삭제/밸런싱
│ │ ├── build.go INDEX ON (병렬 빌드)
│ │ └── ntx.go NTX Indexer 구현
│ ├── cdx/ CDX 인덱스
│ │ ├── header.go CDX 헤더 (1024B)
│ │ ├── tag.go 태그 관리
│ │ ├── page.go 페이지 (512-8192B)
│ │ ├── compress.go 비트 패킹 압축/해제
│ │ ├── search.go SEEK 알고리즘
│ │ ├── update.go 삽입/삭제
│ │ └── cdx.go CDX Indexer 구현
│ └── filter.go SET FILTER / SET RELATION
├── hbsql/ ← SQL RDD (Phase 5)
│ └── sqldriver.go
├── hbweb/ ← HTTP 프레임워크 (Phase 5)
│ └── server.go
├── go.mod
├── go.sum
└── README.md
Phase 0: 프로젝트 기반 (1주)
목표
Go 모듈 초기화, 기본 구조 확립, Tagged Value 16B 구현 및 검증
작업
0.1 Go 모듈 초기화
- go mod init github.com/anthropics/five (또는 개인 레포)
- 디렉토리 구조 생성
- .gitignore, LICENSE, README.md
0.2 Tagged Value 16B 구현 (hbrt/value.go)
- Value struct { data uint64; info uint64 }
- 타입 상수 정의 (tNil, tLogical, tInt, tLong, tDouble, ...)
- 생성 함수 (MakeNil, MakeBool, MakeInt, MakeLong, MakeDouble, ...)
- 접근 함수 (Type, IsNil, IsNumeric, AsInt, AsDouble, ...)
- 포인터 타입 (MakeString, MakeArray, MakeHash, MakeBlock)
- HbString, HbArray, HbHash, HbBlock 보조 구조체
0.3 Value 테스트
- 모든 타입의 생성/접근 왕복 테스트
- 타입 체크 매크로 검증
- 메모리 레이아웃 검증 (unsafe.Sizeof == 16)
- 벤치마크: Value 연산 vs interface{} 비교
완료 기준
go test ./hbrt/ -v -run TestValue -bench BenchmarkValue
✓ 14개 타입 생성/접근 테스트 통과
✓ sizeof(Value) == 16 확인
✓ 정수 연산 벤치마크: interface{} 대비 2배+ 빠름
Phase 1: 최소 런타임 (2주)
목표
수동으로 작성한 Go 코드에서 ? "Hello World", ? 1 + 2가 실행되는 것
작업
1.1 Thread + Stack (hbrt/thread.go, stack.go)
- Thread 구조체 (stack, sp, locals, calls)
- Frame / EndProc (defer + recover)
- Push / Pop / Peek / SetTop
- PushLocal / PopLocal / PushStatic / PopStatic
1.2 산술 연산 (hbrt/ops_arith.go)
- Plus, Minus, Mult, Divide, Modulus, Power
- Negate, Inc, Dec
- 타입 승격 규칙 (Int+Int→오버플로우→Double)
- 소수점 전파 규칙 (decimal 메타)
- AddInt, MultByInt 최적화 함수
1.3 비교 연산 (hbrt/ops_compare.go)
- Equal, ExactEqual, NotEqual
- Less, LessEqual, Greater, GreaterEqual
- Not, And, Or
- PopLogical (bool 추출)
1.4 문자열 연산 (hbrt/ops_string.go)
- 문자열 연결 (Plus에서 분기)
- 문자열 비교 (Harbour 의미론: SET EXACT 고려)
1.5 심볼 테이블 (hbrt/symbol.go)
- Symbol 구조체
- Module (심볼 배열 + 이름)
- Registry (전역 심볼 테이블, sync.RWMutex)
- Find, Register, At
1.6 함수 호출 (hbrt/thread.go 확장)
- PushSymbol, PushNil
- Function(nArgs), Do(nArgs)
- RetValue, RetInt, RetNil
- CallFrame 저장/복원
1.7 기본 RTL (hbrtl/console.go, strings.go, numeric.go)
- QOut (?) / QQOut (??)
- Str, Val, Len, Type, ValType
- SubStr, Upper, Lower, AllTrim, PadR, PadL, PadC
- Empty, Space, Replicate
1.8 VM 초기화 (hbrt/vm.go)
- NewVM, RegisterModule, RegisterRTL
- Run(funcName)
완료 기준
// 이 Go 코드가 동작해야 함 (컴파일러 없이 수동 작성)
func HB_MAIN(t *hbrt.Thread) {
t.Frame(0, 1)
defer t.EndProc()
// ? "Hello World"
t.PushSymbol(sym_QOUT)
t.PushNil()
t.PushString("Hello World")
t.Function(1)
// LOCAL n := 10 + 20
t.PushInt(10)
t.AddInt(20)
t.PopLocal(1)
// ? "Result:", Str(n)
t.PushSymbol(sym_QOUT)
t.PushNil()
t.PushString("Result: ")
t.PushSymbol(sym_STR)
t.PushNil()
t.PushLocal(1)
t.Function(1)
t.Plus()
t.Function(1)
}
// 실행 결과:
// Hello World
// Result: 30
Phase 2: 파서 (3주)
목표
PRG 파일을 파싱하여 AST를 생성
작업
2.1 토큰 정의 (compiler/token/token.go)
- 키워드: FUNCTION, PROCEDURE, LOCAL, STATIC, PRIVATE, PUBLIC
- 키워드: IF, ELSEIF, ELSE, ENDIF, DO, WHILE, ENDDO
- 키워드: FOR, NEXT, RETURN, EXIT, LOOP
- 키워드: BEGIN, SEQUENCE, RECOVER, END
- 키워드: CLASS, ENDCLASS, DATA, METHOD, INHERIT
- xBase: USE, SEEK, REPLACE, APPEND, INDEX, SET, GO, SKIP
- 연산자: +, -, *, /, %, **, :=, ==, !=, <, >, <=, >=
- 연산자: .AND., .OR., .NOT., .T., .F.
- 특수: &, @, ::, ->, {|, |}
2.2 렉서 (compiler/lexer/lexer.go)
- UTF-8 소스 처리
- Harbour 키워드 대소문자 무시
- 문자열 리터럴 ("...", '...')
- 숫자 리터럴 (정수, 소수, 16진수)
- 날짜 리터럴 (CTOD("YYYYMMDD"))
- 줄 바꿈 = 문장 구분자
- 세미콜론 (;) = 줄 계속
- 주석 (// 또는 && 또는 /* */)
2.3 AST 정의 (compiler/ast/ast.go)
- Node, Expr, Stmt, Decl 인터페이스
- 식: BinaryExpr, UnaryExpr, CallExpr, SendExpr, IndexExpr
- 식: LiteralExpr (Int, Double, String, Bool, Date, Nil, Array, Hash)
- 식: IdentExpr, FieldExpr, AliasExpr, MacroExpr, BlockExpr
- 문: AssignStmt, ReturnStmt, ExprStmt
- 문: IfStmt, DoWhileStmt, ForStmt, ForEachStmt, SwitchStmt
- 문: SeqStmt (BEGIN SEQUENCE)
- 선언: FuncDecl, VarDecl (LOCAL/STATIC/PRIVATE/PUBLIC)
- 선언: ClassDecl, DataDecl, MethodDecl
- xBase: UseCmd, SeekCmd, ReplaceCmd, AppendCmd, IndexCmd
- xBase: GoCmd, SkipCmd, SetCmd, SelectCmd
2.4 파서 (compiler/parser/)
- parser.go: Parser 구조체, advance, expect, match
- parser_expr.go: 식 파싱 (연산자 우선순위, Pratt 파서)
- parser_stmt.go: 문 파싱 (IF, DO WHILE, FOR, ...)
- parser_cmd.go: xBase 명령어 파싱 (USE, SEEK, REPLACE, ...)
- 에러 복구: synchronize() (LSP 대비)
2.5 파서 테스트
- 기본 식: 1 + 2 * 3
- 함수 호출: Func(a, b, c)
- 메서드: obj:Method(args)
- xBase: USE customers VIA DBFCDX
- 코드 블록: {|x,y| x + y}
- 매크로: &cVariable
- 제어 흐름: IF/ELSEIF/ELSE/ENDIF
- CLASS: CLASS Person ... ENDCLASS
완료 기준
five parse test.prg --dump-ast
입력: FUNCTION Main()
LOCAL n := 10
? n + 5
RETURN n
출력: FuncDecl{
Name: "Main"
Params: []
Body: [
VarDecl{Scope:LOCAL, Name:"n", Init: Literal{Int:10}}
ExprStmt{Call{Func:"QOUT", Args:[Binary{+, Ident{"n"}, Literal{Int:5}}]}}
ReturnStmt{Expr: Ident{"n"}}
]
}
Phase 3: 코드 생성기 (3주)
목표
PRG → Go 소스 생성 → go build → 실행
작업
3.1 의미 분석 (compiler/analyzer/)
- 스코프 해석: LOCAL, STATIC, PRIVATE, PUBLIC 구분
- 심볼 수집: 함수, 변수, 클래스
- 상수 폴딩: 1 + 2 → 3
- 미사용 변수 경고
3.2 Go 코드 생성 (compiler/gengo/)
- gengo.go: 파일 헤더, import, main() 생성
- gen_expr.go: 식 → t.Push*() / t.Plus() 등
- gen_stmt.go: 문 → 제어 흐름 (goto 또는 for/if)
- gen_symbol.go: 심볼 테이블, STATIC 초기화 생성
3.3 CLI 통합 (cmd/five/main.go)
- five build <file.prg> [-o output]
- five run <file.prg>
- 내부: PRG → 임시 Go → go build → 실행
3.4 END-TO-END 테스트
- hello.prg → hello 바이너리
- 산술 테스트: 오버플로우, 소수점 전파
- 문자열 테스트: 연결, 비교
- 제어 흐름: IF, DO WHILE, FOR, FOR EACH
- 함수: 재귀, 다중 파라미터, STATIC 변수
- BEGIN SEQUENCE / RECOVER
완료 기준
five run hello.prg
// hello.prg:
FUNCTION Main()
LOCAL cName := "World"
LOCAL n := 0
FOR i := 1 TO 10
n += i
NEXT
? "Hello, " + cName + "!"
? "Sum 1..10 =", n
IF n > 50
? "Greater than 50"
ELSE
? "Not greater than 50"
ENDIF
RETURN NIL
// 출력:
// Hello, World!
// Sum 1..10 = 55
// Greater than 50
Phase 4: RTL 확장 + 코드 블록 (3주)
목표
Harbour 핵심 RTL 함수 100개 + 코드 블록 + 배열/해시 연산
작업
4.1 배열 연산 (hbrtl/array.go)
- AAdd, ADel, AIns, ASize, AClone, ACopy
- ASort, AEval, AScan, ATail
- Array(), ALen (= Len)
4.2 해시 연산 (hbrtl/hash.go)
- hb_Hash, hb_HGet, hb_HSet, hb_HDel
- hb_HHasKey, hb_HKeys, hb_HValues
- hb_HPos, hb_HLen
4.3 코드 블록 (hbrt/thread.go 확장)
- PushBlock(func, capturedLocals)
- EvalBlock(nArgs)
- 디태치된 로컬 (클로저 캡처)
4.4 추가 RTL 함수
- 문자열: At, Rat, Stuff, StrTran, hb_StrReplace
- 수치: Abs, Max, Min, Sqrt, Log, Exp, Round, Int
- 날짜: Date, Time, Year, Month, Day, CToD, DToC, DToS, SToD
- 변환: Asc, Chr, Bin2I, I2Bin, hb_NumToHex
- 파일: File, FErase, FRename, DirChange, CurDir
- 기타: Seconds, OS, GetEnv, hb_Run
4.5 Harbour 호환 테스트
- Harbour 테스트 스위트에서 RTL 관련 테스트 이식
- 엣지 케이스: 빈 배열, NIL 파라미터, 타입 변환
완료 기준
// 이 코드가 동작해야 함
FUNCTION Main()
LOCAL aData := { {"Kim", 30}, {"Lee", 25}, {"Park", 35} }
// 정렬
ASort(aData, {|a,b| a[2] < b[2]})
// 출력
AEval(aData, {|x| QOut(x[1] + " age:" + Str(x[2])) })
// 해시
LOCAL hConfig := { "host" => "localhost", "port" => 8080 }
? hConfig["host"] + ":" + Str(hConfig["port"])
RETURN NIL
Phase 5: RDD — DBF 엔진 (4주)
목표
기존 DBF/NTX/CDX 파일을 읽고 쓸 수 있는 RDD 엔진. 기존 Harbour/Clipper와 포맷 100% 호환.
작업
5.1 RDD Interface (hbrdd/driver.go)
- Driver, Area, Indexer, Locker 등 인터페이스 정의
5.2 WorkArea 관리 (hbrdd/workarea.go, alias.go)
- WorkAreaManager (Thread-local)
- ALIAS 등록/해제/전환
5.3 DBF 코어 (hbrdd/dbf/)
- header.go: DBF 헤더 읽기/쓰기 (32B, 바이트 동일)
- field.go: 필드 디스크립터 (32B×N)
- record.go: 레코드 읽기/쓰기 (고정 폭)
- lock.go: 6종 락 스키마 (Clipper/VFP/HB64)
- memo.go: FPT 메모 블록 읽기/쓰기
- dbf.go: DBFArea 구현 (Open/Create/Close/GoTo/Skip/...)
5.4 NTX 인덱스 (hbrdd/ntx/)
- header.go: NTX 헤더 (512B)
- page.go: B-tree 페이지 (1024B)
- search.go: SEEK (이진 검색 + 스택 탐색)
- update.go: 삽입/삭제/페이지 분할/밸런싱
- build.go: INDEX ON (병렬 정렬 + 바텀업 빌드)
5.5 CDX 인덱스 (hbrdd/cdx/)
- header.go: CDX 파일 헤더 (1024B)
- tag.go: 태그 헤더 (512B) + 다중 태그 관리
- compress.go: 비트 패킹 압축/해제 (DupBits/TrlBits/RecBits)
- page.go: 내부/리프 노드
- search.go: SEEK
- update.go: 삽입/삭제
5.6 xBase 명령어 연동 (컴파일러 + 런타임)
- USE path [VIA driver] [ALIAS name]
- GO TOP / GO BOTTOM / GO recno
- SKIP [n]
- SEEK value [SOFTSEEK]
- REPLACE field WITH value [, ...]
- APPEND BLANK
- DELETE / RECALL / PACK / ZAP
- INDEX ON expr TO file [FOR cond] [UNIQUE]
- SET INDEX TO file
- SET FILTER TO expr
- SET RELATION TO expr INTO alias
- SELECT alias
- FIELD->name / alias->name
5.7 호환성 테스트
- Harbour로 생성한 DBF → Five로 읽기
- Five로 생성한 DBF → Harbour로 읽기
- NTX/CDX 인덱스 교차 읽기
- 락 동시 접근 테스트 (Five + Harbour 프로세스)
완료 기준
// 기존 Harbour DBF 파일을 Five로 그대로 사용
FUNCTION Main()
USE customers VIA DBFCDX
SET INDEX TO cust_name
// 검색
SEEK "SMITH"
IF Found()
? FIELD->name, FIELD->salary
REPLACE salary WITH salary * 1.1
ENDIF
// 순회
GO TOP
DO WHILE !EOF()
IF FIELD->country == "KR"
? FIELD->name
ENDIF
SKIP
ENDDO
// 인덱스 생성
INDEX ON UPPER(name) TO temp_idx
USE
RETURN NIL
Phase 6: OOP + 매크로 (3주)
목표
CLASS 문법과 매크로 시스템 동작
작업
6.1 CLASS 시스템 (hbrt/class.go)
- ClassDef 구조체 (이름, DATA 목록, METHOD 목록)
- ClassRegistry (sync.RWMutex)
- 인스턴스 생성 (New)
- 메서드 디스패치 (Send)
- 상속 (INHERIT FROM)
- 연산자 오버로딩
6.2 CLASS 파서/코드 생성
- CLASS ... ENDCLASS 파싱
- DATA 선언 → Go struct 필드
- METHOD 선언 → Go 메서드
- INHERIT FROM → Go 임베딩
- :: (Self 접근) → Go receiver
6.3 매크로 컴파일러 (hbrt/macro.go)
- 미니 렉서 + 파서 (식 전용)
- &variable → 런타임 파싱 + 실행
- &(expression) → 런타임 파싱 + 실행
6.4 PP 전처리기 (compiler/pp/)
- #include, #define, #ifdef/#endif
- #command / #translate (xBase 명령어 정의)
- #pragma compatibility(...)
완료 기준
CLASS Person
DATA cName INIT ""
DATA nAge INIT 0
METHOD New(cName, nAge) CONSTRUCTOR
METHOD Greet()
ENDCLASS
METHOD New(cName, nAge) CLASS Person
::cName := cName
::nAge := nAge
RETURN Self
METHOD Greet() CLASS Person
? "Hello, I'm " + ::cName + " (" + Str(::nAge) + ")"
RETURN Self
FUNCTION Main()
LOCAL oPerson := Person():New("Kim", 30)
oPerson:Greet()
// 매크로
LOCAL cField := "cName"
? oPerson:&cField // "Kim"
RETURN NIL
Phase 7: Go 생태계 연동 (3주)
목표
IMPORT 문으로 Go 패키지를 PRG에서 직접 사용
작업
7.1 IMPORT 문법 (컴파일러)
- IMPORT "net/http"
- IMPORT "encoding/json"
- IMPORT "github.com/..."
- Go 타입을 Five에서 사용하는 브릿지 생성
7.2 타입 브릿지 (hbrt/bridge.go)
- ToGoValue(Value) interface{}
- FromGoValue(interface{}) Value
- Marshal / Unmarshal (구조체 ↔ Hash)
7.3 동시성 프리미티브
- GO 키워드 → goroutine
- CHANNEL(n) → make(chan Value, n)
- SEND(ch, val) → ch <- val
- RECEIVE(ch) → <-ch
- WAITGROUP → sync.WaitGroup wrapper
7.4 HTTP 프레임워크 (hbweb/)
- hbweb.New() → 라우터
- GET/POST/PUT/DELETE 라우팅
- JSON 응답
- 미들웨어
7.5 SQL RDD (hbsql/)
- database/sql 기반
- PostgreSQL, MySQL, SQLite 드라이버
- xBase 명령어로 SQL 테이블 조작
완료 기준
IMPORT "encoding/json"
FUNCTION Main()
// HTTP 서버
LOCAL oApp := hbweb.New()
oApp:GET("/api/customers", {|ctx|
USE customers VIA DBFCDX
LOCAL aResult := {}
GO TOP
DO WHILE !EOF()
AAdd(aResult, { "name" => FIELD->name, "city" => FIELD->city })
SKIP
ENDDO
USE
ctx:JSON(200, aResult)
})
// goroutine으로 병렬 처리
LOCAL ch := CHANNEL(10)
GO BackgroundTask(ch)
? "Server starting on :8080"
oApp:Listen(":8080")
RETURN NIL
Phase 8: 개발 도구 (2주)
목표
개발자 경험 완성: 포매터, LSP, 테스트 프레임워크
작업
8.1 five fmt — 코드 포매터
- 들여쓰기 정규화
- 키워드 대소문자 통일
- 줄 바꿈 규칙
8.2 five lsp — Language Server
- textDocument/completion (자동 완성)
- textDocument/definition (정의로 이동)
- textDocument/hover (타입 정보)
- textDocument/diagnostics (에러 표시)
- 증분 파싱 (파일 변경 시 부분 재파싱)
8.3 five test — 테스트 프레임워크
- ASSERT 함수
- 테스트 파일 자동 발견 (*_test.prg)
- 벤치마크 지원
8.4 VSCode 확장
- 구문 강조 (TextMate grammar)
- LSP 클라이언트 연결
- 스니펫
- 빌드 태스크
8.5 five migrate — 마이그레이션 도구
- 기존 PRG 분석
- 자동 수정 가능 항목 변환
- 수동 수정 필요 항목 보고
일정 요약
Phase 0: 프로젝트 기반 ·········· 1주 ██
Phase 1: 최소 런타임 ··········· 2주 ████
Phase 2: 파서 ················· 3주 ██████
Phase 3: 코드 생성기 ··········· 3주 ██████
Phase 4: RTL + 코드 블록 ······· 3주 ██████
Phase 5: RDD (DBF/NTX/CDX) ···· 4주 ████████
Phase 6: OOP + 매크로 ·········· 3주 ██████
Phase 7: Go 생태계 연동 ········ 3주 ██████
Phase 8: 개발 도구 ············ 2주 ████
────
합계 24주 (약 6개월)
마일스톤:
Month 1 끝: "Hello World" 실행 (Phase 0-1)
Month 2 끝: PRG 파싱 완료 (Phase 2)
Month 3 끝: PRG → 실행 가능한 바이너리 (Phase 3)
Month 4 끝: 실용적 프로그래밍 가능 (Phase 4)
Month 5 끝: DBF 완전 호환 (Phase 5) ← 핵심 마일스톤
Month 6 끝: 전체 기능 + 도구 (Phase 6-8)
우선순위 원칙
1. Phase 5 (DBF/Index)가 가장 중요하다.
→ 이것이 없으면 Five는 Harbour 대체가 될 수 없다.
→ 포맷 호환이 깨지면 기존 사용자가 올 수 없다.
2. Phase 1-3은 Phase 5의 토대이다.
→ 런타임과 컴파일러가 있어야 DBF를 테스트할 수 있다.
→ 최소한의 기능으로 빠르게 통과한다.
3. Phase 7 (Go 연동)이 Five의 미래를 결정한다.
→ DBF만 있으면 "Go로 만든 Harbour"일 뿐
→ Go 생태계 직접 접근이 있어야 "새로운 플랫폼"
4. Phase 8 (도구)이 개발자를 데려온다.
→ 기능이 아무리 좋아도 도구가 없으면 사용하지 않는다.
변경 이력
| 날짜 | 변경 내용 |
|---|---|
| 2026-03-27 | 초기 작성. 8 Phase, 24주 개발 계획 |