[컴파일러 만들기] 1장 - 시작하며
1.0 시작하며
- 프로그래밍을 잘하기 위해서는?
- 어떤 것이든 만들어보기!
- 무엇을 만들어야 하는가?
- 게임 (좋은 선택지)
- 자료구조, 알고리즘, 그래픽, 사운드, 네트워크, 멀티 스레드, 객체지향, 수학 등...
- 컴파일러 (권장)
- 리스트, 트리, 스택, 재귀, 컴파일 타임, 런 타임, 함수 호출 규약, 프로그래밍 언어 등...
- 컴퓨터와 프로그램이 동작하는 원리와 구조를 배울 수 있음
1.1 프로그래밍 언어
- 나만의 프로그래밍 언어 디자인, 실행하는 인터프리터, 컴파일러, 가상머신 제작 가능
1.2 컴파일러
- 컴파일러: 코드를 입력받아 코드를 출력하는 프로그램 (컴파일러 입장)
- 입력 받은 코드 => 소스 코드 (프로그래밍 언어로 작성한 문자열 형태의 코드)
- 출력 하는 코드 => 목적 코드 (바이너리 형태의 코드, 바이트 코드)
- 소스 코드를 목적 코드로 번역하는 프로그램
- 컴파일러: 소스 코드를 번역하는 프로그램
- 컴파일; 소스 코드 -> 어휘 분석 -> 구문 분석 -> 코드 생성 -> 목적 코드
- 인터프리터: 소스 코드를 실행하는 프로그램
- 인터프리터; 소스 코드 -> 어휘 분석 -> 구문 분석 -> 인터프리터 -> 실행 결과
- 컴파일러가 출력하는 목적 코드를 실행하기 위해 가상 머신 필요 ex) JVM
1.3 예제 컴파일러
- Visual Studio Community 설치 및 설정
- github 예제 소스 코드
// Main.cpp (전체적인 틀)
auto main() -> void {
string sourceCode = R""""(
function main() {
print 'Hello, World!';
}
)"""";
auto tokenList = scan(sourceCode); // 어휘 분석
auto syntaxTree = parse(tokenList); // 구문 분석
// interpret(syntaxTree); // 인터프리터
auto objectCode = generate(syntaxTree); // 컴파일러
execute(objectCode); // 가상머신
}
1.4 마치며
- 전체 맥락을 파악하는 것이 제일 중요