진행 방식
- 책을 참고하며 코딩을 하는 클론코딩 방식으로 프로젝트를 진행해 보았다.
+ 과정에서 Go 언어를 놓은지 꽤 됐었기 때문에 Go 문법을 이해하지 못한 부분은 이전에 공부하는데 도움을 받았던 Discovery Go 라는 서적을 보며 다시금 익혔다.
- TDD 방법론을 통해 진행된다.
- 이전에 스스로 약속했듯이 하루에 한시간 정도 투자하고 있다.
- 깃허브를 통해 코드 관리를 한다.
- GoLand IDE를 사용해 코딩을 하고있다. 돈을써야 공부를 한다 ^^
공부 내용 정리
프로그래밍 과정에서 소스코드를 작성하면 이는 사람만이 알아볼 수 있는 텍스트 뭉치일 뿐이다. 인터프리터는 이 소스코드를 컴퓨터가 이해할 수 있도록 분해하고 조합하는데 도움을 주는 프로그램이다.
처음으로 인터프리터를 제작하며 해야할 일은 소스코드를 토큰 열로 변환하는 것이다. 이런 작업을 어휘분석(lexical analysis) 또는 줄여서 렉싱(lexing)이라 한다.
렉싱 작업을 해주는 친구를 렉서(lexer)라 부른다.
토큰은 소스를 분해하였을 때 분류를 도와주는 작은 자료구조이다.
토큰을 파서에 입력하면 파서는 전달받은 토큰 열을 '추상구문트리(Abstract Syntax Tree)'로 바꾼다.
ex)
// 토큰 열
let x = 5 + 5;
// 렉서가 렉싱한 결과물
[
LET,
IDENTIFIER("x"),
EQUAL_SIGN,
INTEGER(5),
PLUS_SIGN,
INTEGER(5),
SEMICOLON
]
모든 토큰은 소스코드의 표현과 매칭돼 있다.
토큰을 다루는 방법은 렉서마다 다르다.
ex) 공백의 길이가 중요한 Python과 같은 언어가 있고 C, JAVA와 같은 언어는 공백을 무시할 수 있도록 처리 돼 있다.
진행 사항
토큰 정의
- 식별자, 리터럴, 연산자, 구분자, 키워드를 포함한 토큰을 정의
렉서 제작
- 렉서의 메소드를 포함하여 메소드에서 사용하는 함수들을 제작하였다.
- NextToken : 코드를 읽어 해당되는 토큰을 반환하는 메소드
- readChar : 한 문자씩 문자를 읽어 분석하는 메소드
- peekChar : "==", "!="와 같이 문자열 길이가 2개인 토큰을 확인하는 메소드
- 등 숫자, 문자를 읽는 메소드와 이들을 도와주는 함수들을 제작하였다.
테스트 제작
- TDD 를 따라가기 때문에 우선 에러가 나는 input값(monkey 언어에서 사용하는 소스코드)을 제공하는 테스트 코드를 작성한다.
생각 정리
나름 다시 공부할 맛이 난다. 역시 좋아하는 걸 해야한다. 시간을 아끼려 문법적으로 부족한 부분은 지하철에서 출근 때에 공부하기도 한다. 스스로 대견하다.
TDD 로 개발을 진행하는 방식에 의문을 갖고 있었다. 이 과정을 통해 의문점을 해결할 수 있으리라 생각이 들었는데 지금까지는 여전히 의문스럽다. ㅎㅎ,,
정리는 항상 이정도로 할 것 같다. 한주에 한번 정도 할 듯 하고 취준을 하면서 공부를 위한 블로깅이 아니라 블로깅을 위한 공부가 되는 느낌을 받았었다. 그 때 보다 매우 몹시 엄청 시간이 적어진 지금 상황에서 가장 지양해야할 부분이라 생각이 든다.
클론 코딩이다 보니 생각없이 따라만 쓰는 내모습을 종종 볼 수 있는데 이부분 역시 항상 염두해 두고 찬찬히 진행해야 할 듯 하다.
고랭 귀엽다 재밋다 끗
기록
2024.02.27 - [내 이야기/나중에 돌아보면 재밌을 이야기] - 새로운 프로젝트 시작
참고 문헌 '밑바닥부터 만드는 인터프리터 in Go'
https://www.yes24.com/Product/Goods/103157156