4.5) 한계
정말 많은 내용을 공부했고, 생각보다 결과도 괜찮다. 이 정도면 좀만 더 개선하면 컴파일러가 되지 않을까? 서문에서 밝힌 적이 있는데, 필자는 간단한 변수의 선언 및 정의(정확히는 구조체의 선언과 정의까지는 연구했었다)와 수식의 계산까지 완료했지만 함수 정의와 호출에서 막혀서 포기했다. 지금 작성한 코드로 함수, 조건문과 반복문,포인터 연산, 동적 할당 등을 모두 완성할 수 있다면 당신은 필자보다 아주 뛰어난 사람임에 틀림이 없다.
이는 아주 어려운 문제인데, 기존에 함수 정의와 호출을 구현하는 방법을 모르는 상태에서 이것을 구현하려면 순수하게 개발자의 아이디어만으로 프로젝트를 진행해야 하기 때문이다. 사고력을 키워준다는 점에서 의미가 없다고 할 수는 없으나, 그것에 들이는 노력에 비해 결과가 시원치 않을 가능성이 높고, 대개는 처음에 떠올린 설계 자체에 오류가 생겨서 그전까지 작성했던 코드를 몽땅 버려야 하는 상황이 생각보다 자주 닥치기 때문이다. 이 문서에서는 설계가 없는 프로그래밍의 위험성도 많이 강조할 것이다. 컴파일러의 설계도 없이 혼자 이 프로젝트를 진행하기에는, 학부생 수준의 프로그래밍 능력으로는 너무나도 어렵다. 따라서 이 문제에 대해 필자는 일단 납득하길 바라지만, 정 궁금하다면 자신이 스스로 컴파일러를 설계하여 그대로 진행해보는 것도 좋은 경험이 될 수는 있다고 생각한다.
참고로, 방금 우리가 작성한 dcl 모듈은 완전히 개선되지 않았다. 식별자에 대해 어떤 것을 고려해야 하는지를 떠오르는 대로 나열해보자.
- 자료형
- 값
- 주소
- 정적인가? (static)
- 상수인가? (const)
- 컴파일러가 최적화하는가? (volatile)
- 레지스터인가? (register)
- 외부에 존재하는가? (extern)
- 외부에서 참조할 수 없는가? (static)
- 형식인가? (typedef)
- 함수인가?
- 함수라면, 인자 정보는 어떠한가?
- 배열인가?
- 포인터인가?
- 사용자 정의 자료형인가? (struct, union, enum)
- 사용자 정의 자료형이라면, 멤버 정보는 어떠한가?
...
일단 이 문제부터 모두 해결할 수 있다면 바로 컴파일러에 도전해도 좋을 것 같다.