컴파일러 Compiler, 어셈블리 언어 Assembly language 란 무엇일까 ?
컴퓨터 없이 살아가기 힘든 세상이 된 요즘. 마치 엑셀을 다루듯 코딩을 하고 프로그램을 만드는 일이 굉장히 대중화 되고 있는데요. 때문에 개발자로서의 경력을 쌓는 분들이 아니더라도 프로그래밍에 대해 알고 있어야 하는 시대가 되었어요. 그래서 저도 코딩 공부를 시작해 보았는데요. 컴퓨터에 대해 기초적인 지식이 하나도 없이 시작을 하니, 문제가 생겼을 때 정말 영문도 모른 채 당황해서 뭘 해야 할지 모르겠는 상황이 수도 없이 쏟아지지 뭐에요. 심지어 성격상 무언가 대략적인 원리가 이해가 안된다면 넘어가지 못하는 답답한 병이 있었어요. 그래서 저는 남들이 추천해 주는 이것저것 얕게 만들어보기만 하는 게 좋다는 조언을 따르기가 너무 힘들더라고요.
그래서 시작한 컴퓨터 기본기 공부와 프로그래밍 공부를 저같이 전공자로서의 공부가 아닌, 시대의 큰 메리트를 이용하기 위해 배우기 시작한 분들에게 도움이 되고자 글을 쓰게 되었습니다. 전공 서적을 기본으로 설명을 하겠지만, 어려운 언어들로 가득 차서 이해하기 힘든 글이 아닌, 최대한 쉬운 설명으로 머릿속에 큰 그림을 그리며 컴퓨터를 사용하실 수 있게 간단하게 설명하려고 합니다.
코딩 열풍이 지나고, AI 가 도래하는 시대가 되어서도 변하지 않는 것들이 있죠. 바로 컴퓨터는 하드웨어와 소프트웨어로 구성된다는 사실입니다.
하드웨어는 쉽게 말해서 실질적인 장치를 의미합니다. 컴퓨터를 분해하면 보이는 장치들이죠. 소프트웨어는 반대로 컴퓨터를 분해한다고 해서 찾을 수 있는 것이 아닙니다. 눈에 보이지 않는 장치이죠. 사람들과 고철덩이를 서로 대화할 수 있게 해주는 언어, 데이터의 영역입니다.
마치 우리가 외국인들과 대화하기 위해서 영어와 스페인어를 하는 역할이죠.. 한국어를 영어로 번역을 하는 것이라고 생각하면 쉽습니다. 때문에 우리가 영어와 스페인어와 불어를 사용할 수 있는 것처럼 다양한 프로그래밍 언어로 작성이 되게 되는데요. 오늘은 다양한 프로그래밍 언어들을 알아보는 것이 아닌 그보다 조금 더 기본적인 뼈대, 프로그래밍 언어의 유행이 바뀌더라도 바뀌지 않는 뼈대에 관해 이야기해 보겠습니다.
모든 컴퓨터의 작동의 시작은 프로그램을 만드는 개발자로부터 시작된다고 생각해 봅시다. (컴퓨터 하드웨어가 먼저 아니냐고 하실 수도 있지만, 어디까지나 인간의 입장에서는 사람들에게 유용한 프로그램을 사용할 수 없는 컴퓨터 하드웨어는 고철 덩어리일 뿐이기에 소프트웨어를 먼저 설명하겠습니다) 개발자들은 컴퓨터가 실행했으면 하는 프로그램을 만들어줍니다. 이때 이 프로그램은 개발자들이 컴퓨터에 보내는 편지 같은 것이죠. “내가 입력하는 값을 이렇게 저렇게 처리해서 결과를 보여줄 수 있겠어?”라는 기본적인 요청입니다.
사람이 사람에게 물어보는 것들은 거절을 당할 위험이 있지만, 다행히도 컴퓨터는 마법사 지니처럼 기본 조건에만 충족이 된다면, 모든 소원을 들어주는 착한 요정이죠.
그런데 한 가지 문제가 있습니다. 그 요정 지니와 개발자는 언어가 다른 종족인 거죠. 그래서 그들은 언어를 번역해 주는 장치를 이용하기로 합니다.
바로 언어를 번역해 주는 역할을 하는 것이 compiler 컴파일러 이며, 개발자들이 쓰는 단어는 high level language라고 합니다. 그리고 컴퓨터 (지니)가 쓰는 단어는 low level language라고 하죠. 컴퓨터 용어에서조차 인간이 더 우월하다는 관념이 있는 것 같은 느낌이 들지만, 어쨌든 개발자들이 쓰는 언어는 high level 이라고 합니다.
오늘은 사실 이 간단한 과정을 이야기 하는 것이 목적이었기 때문에, 사실상 여기까지만 알고 넘어가도 괜찮습니다. 하지만 프로그래밍을 공부하다 보면 초보자에게는 모든 단어가 생소할 수 밖에 없는데요. 하지만 개발자들이 그렇게 친절하게 모든 단어를 설명해 주진 않습니다. 예를 들어 어셈블리 언어 assembly language라는 말을 프로그래밍 공부 중에 많이 들을 수 있는데요. 어셈블리 언어를 직접적으로 작성하거나 직접 보는 일은 없지만, 계속해서 나오는 이 단어가 안 그래도 새롭고 어색한 프로그래밍 공부에 조금이라도 혼란을 부추기게 됩니다.
이 어셈블리 언어는 이 컴파일이 일어나는 과정 중에 중간 과정의 언어입니다. 위에서 컴파일러 과정을 간단하게 설명했지만, 엄밀히 말해서 컴파일은 4가지의 과정을 거치는 작업인데요. 프로그래밍 언어를 직접 만들지 않는 한 컴파일러를 하나하나 뜯어볼 일은 많지 않기 때문에, 과정을 간단하게 보여드리겠습니다.
위의 사진에 있는 네모 상자 가 바로 하나의 과정을 의미하는데요. 세 번째 네모 칸을 보면 어셈블러라는 표시가 있죠. 어셈블러라는 번역 과정을 거치기 전의 언어가 바로 어셈블리 언어 입니다.
이 어셈블리 언어를 간단히 소개하자면, 이 과정은 모든 컴퓨터에서 공통으로 같은 과정이 아닌데요. 우리가 영어권 사람들을 만나면 영어로 번역을 하고 스페인 사람을 만나면 스페인어로 번역을 하는 것처럼. 컴퓨터 구조에 따라 그리고 어떤 과정을 거쳐 기능을 수행할 것인지에 따라 달라진다고 해요.
마지막으로 간단하게 위의 과정들을 설명하고 마무리 하도록 할게요. 하지만 지금까지의 내용만 이해하고 넘어가더라도 큰 문제가 없답니다.
1. Preprocessor
전처리기라고도 불리는 이 프로그램은 컴파일러에 쓰이기 전 단계의 처리를 해준다. 이 또한 필요 동작에 따라 다양한 전처리 과정을 거치게 됩니다.
2. Compiler
Compiler 컴파일러는 위에서 설명한 대로 고급 프로그래밍 언어를 실행프로그램으로 만들기 위해 저급 프로그래밍언어로 바꾸는 역할을 하는데요. 이때 이 프로그램에 들어가기 전 문서를 소스코드라고 부르고, 이 프로그램에서 처리 후 나온 문서를 목적코드라고 부릅니다. 또한 프로그램이 진행되는 과정을 컴파일 이라고 말하며, 번역 프로그램 자체를 컴파일러라고 부릅니다.
3. Assembler
Assembler 어셈블러는 기계어 형태의 오브젝트 코드로 해석해 주는 번역 프로그램입니다.
네 번째 Linker 링커는 목적 파일들을 단일 프로그램으로 합쳐주는 역할을 하는 프로그램입니다. 컴파일러를 거쳐서 만들어지는 파일들이 여러 개일 경우 하나로 합쳐줌으로써 컴파일러 과정을 마무리하게 됩니다.
참조 : Book : Computer Systems A Programmer's Perspective - Randal E. Bryant. David R. O'Hallaron.
댓글
댓글 쓰기