본문 바로가기
C and C++

[C++] Lexical Analyzer를 배우는 이유

by Henry Cho 2024. 3. 15.
728x90

Lexical Analyzer를 배우는 이유

포스트 난이도: HOO_Junior


# Lexical Analyzer란?

Lexcial analyzer 또는 한국말로 어휘 분석기는 Computer science (CS)를 전공하는 학생이거나 프로그래밍을 배운다면 오토마타 및 기본 컴퓨터 구조와 함께 배우는 첫 번째 단계의 Scanner(스캐너)이다. 첫 번째 단계의 스캐너라고 부르는 이유는 기계어에 해당하는 바이너리 컴파일까지 가기 위해서 여러 단계를 거치는데 그중에 대표적인 스캐너 방법 중 하나가 바로 Lexcial analyzer이기 때문이다. 한마디로 C++를 포함하여 여러 종류의 프로그래밍 언어들을 그대로 컴퓨터한테 전달할 수 없기 때문에 컴파일 또는 인터프리터로 변환하는 과정 중 첫 번째에 해당하는 방법이 바로 Lexcial analyzer인 셈이다.

 

아마 HOO_Junior 포스트 난이도를 보는 브로들에게는 Lexcial analyzer에 대한 정의와 어떻게 구현하는지에 대해서는 이미 충분히 많이 들어봤을 것이며, 글쓴이보다도 더 잘 말할 수 있을 수도 있다. 그렇다면 "우리가 왜 Lexcial analyzer를 수업이나 개발자가 되기 위해서 배우는 것일까?" 라는 의문이 들 수 있다. 개인적인 입장으로는 코딩을 하는 데에는 직접적으로 큰 영향을 미치지는 않는다. 그럼에도 우리가 Lexcial analyzer에 대해서 배우고 직접 예제를 만들어보는 이유는 컴파일의 구조를 파악하고 어떻게 작성된 코드가 변환되어 프로그램과 기계에 영향을 미치는지를 이해하기 위해서이다.

 

한마디로 언어를 배우는 데 있어서 당장 문법이나 언어 구조 자체를 이해하지 못해도 충분히 말하고 들을 수 있다. 하지만 말하고 듣는 것을 넘어서 글을 조리 있게 쓰고 보다 깊은 의미를 이해하기 위해서는 해당 언어에 대한 충분한 이해가 필요하다. 프로그래밍도 마찬가지이다. Lexcial analyzer를 통해서 당장의 코딩 실력이 늘지는 않지만 그럼에도 꼭 알고 있어야 하고 이해해야 되는 내용인 것은 맞다고 본다. 그래서 실질적으로는 필요가 없다고 느껴질 수는 있지만 Lexcial analyzer를 이해하고 예제를 통해서 연습을 하다 보면 컴파일 구조와 방식에 대해서 도움이 된다.

Figure 1. Lexical analyzer 예시, 다양한 조건으로 코드 구성이 가능하다.

또한 개인적으로 Lexcial analyzer에 대한 다양한 예제들이 있는데 대부분 조건과 반복문으로 이루어져 있는 걸 볼 수 있다. 특정 단어나 기호, 또는 문장을 토큰화하여 분류하고 나눠져야 하기 때문에 다양한 조건을 작성해줘야하며, 때로는 Nested로 구성된 다양한 문법들을 살펴볼 수 있다. 이러한 코드 구조는 코드 로직을 리뷰하는데 큰 도움이 되며, 실질적으로 머릿속으로 코드 흐름을 구조화하는 연습에도 도움이 된다.

 

결론은 프로그래밍 공부를 하는 브로들에게 있어서 이론적으로 컴파일 프로세스를 외우기보다 Lexcial analyzer 예제를 통해서 직접 코드를 작성해봄으로써 머리로 쉽게 이해할 수 있고 이 과정에서 코드 로직을 분석하고 머리로 이미지화하는 연습을 자연스럽게 해 볼 수 있다.


# Lexcial analyzer 장점

앞선 내용은 글쓴이의 개인적 경험에서 우러나온 견해였고 Lexcial analyzer는 실제로 오류를 감지하거나  구문 (Parses)을 단순화할 때 Lexical analyzer를 사용하기도 한다. 우리가 IDE를 통해서 편하게 Run을 누르지만 Lexcial analyzer를 통해서 일차적으로 Simplifies parsing, error detection 등의 과정이 자동적으로 이루어지게 된다. Simplifies parsing은 말 그대로 작성된 코드 문장이나 구문을 나눠서 이미 등록되어 있는 Token types로 분류하고 구분해 주는 역할을 수행한다. 그 뒤에 개발자가 잘못 입력한 부분이 있거나 기존에 Symbols로 등록되지 않은 Tokens가 산출된다면 이에 대한 에러를 나타내주는 역할을 Error detection 잡아준다. 결과적으로 Lexcial analyzer를 사용하는 이유는 프로그래밍 언어를 기계어로 변환을 해야 하는데 우선적으로 구문을 나눠줌으로써 컴파일 과정의 효율성을 높여주기 때문이다.


# Lexical Analyzer가 중요한 이유

"그러면 우리가 직접 Custom한 Lexcial analyzer를 만들어볼 수 있나요?"라는 질문을 하는 브로들과

"Lexical analyzer가 별로 중요해 보이지 않네요."라고 말하는 브로들이 있다.

 

정말 놀랍게도 우리는 Lexical analyzer를 알게 모르게 정말 많이 사용되고 있다. 프로그래밍 언어의 컴파일이라는 범위(Scope)에서 벗어나서 Lexical analzer의 기능과 특징만 보면 "앗"하고 생각이 드는 기술이 하나 있을 것이다.

 

바로 Natural language process (NLP)이다.

 

NLP에서 단어나 구문 구조를 분석하고 식별하는 과정에서 Lexical analysis가 사용된다. 물론 더 복잡하고 다양한 방식의 Lexical analysis가 사용되겠지만 궁극적으로 보면 컴퓨터에게 기계어로 전달하기 위해서는 빅데이터와 인공지능 학습으로 이루어진 Lexical analysis가 NLP에 사용되고 있다는 것이다. 결과적으로 처음 Lexical analyzer를 배우고 해당 예제를 만들어가 리뷰를 하다 보면 복잡하고 긴 코드에 답답함을 느끼고 지루할 수 있다. 하지만 Lexical analzer가 그저 공부하기 위한 지루한 내용이 아니라 데이터 분석이나 인공지능과도 연관성이 있는 아주 기본적인 내용이고 알아가야 할 내용이라는 것을 염두에 두고 본다면 막상 지루한 코드가 더 이상 아닐 수 있다는 것이다.


 

728x90

댓글