밑바닥부터 만드는 컴파일러 in Go란 책을 읽고 나서
포스트
취소

밑바닥부터 만드는 컴파일러 in Go란 책을 읽고 나서

개요

2022년 인턴을 진행하면서, 정말 낮은 저수준(Low-Level)의 개발이 무엇인지 알게 되었습니다. 특히 에트리에서 도서는 책을 마음껏 빌려서 읽을 수 있었습니다. 그 덕분에 Go 언어란 책을 찾아보니, “밑바닥부터 만드는 컴파일러 in Go”를 책을 빌려 읽은 뒤 나의 생각 변화와, 어떤것을 공부했는지 서술 합니다.

컴파일러가 무엇인가?

책에서 소개하는 내용은 아래와 같습니다. 코드를 돌릴 가상 머신, VM이 있고, VM을 돌릴 OpCode, 소스코드와 OpCode와의 중간 단계인 바이트 코드가 있습니다. 컴파일러 안에는 다양한 기능이 있습니다. 특히 Lexer와, Parser를 통해 Abstract Syntax Tree(AST)를 생성하고, 최종적으로 바이트 코드를 생성합니다. 그리고 해당 바이트 코드는 OpCode로 치환이 됩니다. 그리고 코드 상으로 만든, VM에서 OpCode를 실행 합니다. 즉 컴파일러는 소스 코드란 것을 넣게 되면 실행할 수 있는 OpCode를 최종적으로 생성하는 것 입니다.

내가 생각하는 컴파일러

소스코드를 넣으면 실행파일이 쨔쟌 하고 나타남!

책을 읽고 생각한 컴파일러

소스코드가 아닌 무언가 데이터를 넣으면 아무튼 실행 파일이 쨔쟌 하고 나타남!
컴파일러는 장비의 Instruction(명령어)를 생성하는 프로그램 이기 때문에, 명령어를 생성하는 프로그램이라면 무엇이든지 컴파일러가 될 수 있습니다!
그래서 명령어를 생성하는 프로그램이 명령어를 생성하는 프로그램이 바로 GCC 이라는 것을 알게 되었습니다.
LLVM은 IR을 생성하면 알아서, 자동적으로 옵션에 따라, 명령어를 생성 하기 때문에 IR을 생성하면 LLVM에 의한 최적화도 꾀할 수 있습니다.
(중요!) GCC를 통해 GCC를 만드는게 어떤 말인지 알게 되었습니다.

.Net 에서 접했던 내용

C# 에서 리플렉션을 이용하면서 특히 [Harmony]란 라이브러리는 C#은 빌드 하게 되면 중간 언어인 IL 이란 언어로 빌드가 되고, IL 언어는 닷넷 프레임워크를 통해 실시간으로 번역 및 실행할 수 있는 바이너리로 실행이 되는 구조 입니다. 그렇기 때문에 닷넷 프레임워크(모노, 코어)상에서 코드가 “런타임” 중 번역이 되기 때문에, 런타임에 코드를 강제로 삽입하고, 코드를 돌릴 수 있지 않을까? 란 개념에 나온 라이브러리 입니다.

리플렉션 기능은 C#에러 런타임에 타입을 체크 하기 위해, 존재하지만 본질은 그 내용이 아닌, 리플렉션의 핵심 기술인 ILGenerator가 핵심 입니다. ILGenerator는 런타임 중에 OpCode를 Emit하여 실행 합니다. 그렇기 때문에 ILGenerator를 이용하면, 런타임 중에 C#이 할 수 있는 모든 일을 할 수 있는것이 됩니다.

Harmony는, ILGenerator를 통해 각각의 Mono, Core, Framework의 버전별로 관리하는 라이브러리 입니다. 즉, OpCode를 Emit하는 것을 이용하여 클래스를 생성 및, 함수를 삭제 할 수 있었습니다. 그래서 기존에 이러한 내용을 알고 있었기 때문에 이 책을 읽는데 문제가 없었습니다.

컴파일러와 ASIC

무언가 성능적으로 최적화를 하기 위해 무언가의 모듈을 개발 하는것도 최선이 될 수 있겠지만, 이러한 최적화 옵션을 거치는 것 자체가 하나의 CPU Instruction을 낭비하는 행위가 될 수 있습니다. 그래서 1 Cycle이라도 중요한 초소형 임베디드 시스템의 소프트웨어가 들어갈 땐, 모든 행동 동작이 정의가 된 실행파일을 뽑아낼 수 있다면 라이브러리를 통한 최적화 보다 조금 더 최적화 할 수 있을것 입니다. 만약 이러한 소프트웨어보다 더 최적화 하길 원한다면 [Application-Specific Integrated Circuit]을 통하거나 [Field-programmable gate array]를 통해 하드웨어적으로 처리를 할수 있습니다.

대표적인 예로 TESLA의 완전 자율 주행 자동차는 ASIC으로 반도체 칩적으로 최적화가 되어 있습니다.

후기

정말 간단하지만 간단하지 않고, 성능의 최적화를 할 수 있고, 반드시 성능이 좋아진다는것을 알지만, 선뜻 적용하기 어려운 분야입니다. 컴파일 타임 때 실행시간은 무제한이니, 컴파일 했을 때 성능이 라이브러리에 비해 10%가 증가 한다면, 컴파일러나 ASIC의 개발 비용과 비교하여 적용하면 최고의 선택지 인것 같습니다.

즉 이러한 연구는 연구소에서 하고, 기술 이전 하는게 최고다…

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

OAuth2.0과 JWT를 활용한 회원가입 구현

WinAPI 활용한 MONO GUI 잔상 최적화