반응형
이전 글에서 목적코드를 모두 생성했으니, 이제 코드를 실행할 수 있는 환경을 만들어줄 것이다.
스택프레임
- 함수의 호출은 스택 구조로 처리한다.
- 스택에 들어갈 자료형인 StackFrame 을 만들어준다.
Machin.cpp
struct StackFrame {
vector<any> variables;
vector<any> operandStack;
size_t instructionPointer = 0;
};
static vector<StackFrame> callStack;
- 파라미터, 지역변수, 피연산자 스택, 다음에 실행할 명령어 위치 을 담고 있는 구조체이다.
코드 실행기
main.cpp
vector<Token> scan(string sourceCode);
Program* parse(vector<Token> tokenList);
tuple<vector<Code>, map<wstring, size_t>> generate(Program* syntaxTree);
void execute(vector<Code> codeList, map<wstring, size_t> functionTables);
int main() {
string sourceCode = R"(
함수 시작() {
1 + 2;
}
)";
vector<Token> tokenList = scan(sourceCode);
Program* syntaxTree = parse(tokenList);
auto objectCode = generate(syntaxTree);
execute(get<0>(objectCode), get<1>(objectCode));
return 0;
}
- execute 함수를 추가해주었다.
void execute(vector<Code> codeList, map<wstring, size_t> functionTables)
{
callStack.emplace_back();
while (true)
{
auto code = codeList[callStack.back().instructionPointer];
switch (code.instruction)
{
case Instruction::Exit:
callStack.pop_back();
return;
}
callStack.back().instructionPointer += 1;
}
}
- execute함수는 3가지 동작을 반복한다.
- 명령어를 가져온다.
- 명령을 수행한다.
- 명령어 포인터를 업데이트한다.
- switch문을 완성해주면 된다.
자세한 코드 구현사항은 [컴파일러 만들기 - 유종원] 책을 참고하거나, 깃허브 소스코드를 참고해주시길.
Yoon6/korlang: korlang compiler.
GitHub - Yoon6/korlang: korlang compiler.
korlang compiler. Contribute to Yoon6/korlang development by creating an account on GitHub.
github.com
korlang playground
C++로 작성한 컴파일러를 wasm으로 빌드하여 github pages에 올려두었다.
https://yoon6.github.io/korlang/
에러 처리등 아직 문제가 많다.
토큰 리스트/파싱 트리도 볼 수 있게 만들고,
에러처리도 세분화하고, 문법도 추가하고 해 볼 예정이다.
언어는 C++ 같은 하이레벨 언어를 계속 쓸 것같다.
본 프로젝트의 목적은 학습이기 때문에 어셈블리까지 갈 필요는 없을 거 같음.
728x90
'CS > 컴파일러' 카테고리의 다른 글
[컴파일러 만들기] 3. Generator 만들기 (0) | 2025.03.26 |
---|---|
[컴파일러 만들기] 2. Parser 만들기 (0) | 2025.03.18 |
[컴파일러 만들기] 1. Scanner 만들기 (0) | 2025.03.16 |
[컴파일러 만들기] C++로 컴파일러 만들어보기 (0) | 2025.03.11 |