정글 TIL 1(프로그램의 컴파일 시스템(과정)_쉬운 ver)

김동준·2024년 1월 12일
1

진심

목록 보기
1/15

해당 내용은 CS:APP에 1.4.1까지의 내용과 용어들을 정리한 것입니다. 글을 읽고 이해가 되셨다면, CS:APP 책을 통해 꼭 복습하시길 권장합니다.

프로그램이란?
컴퓨터에게 작업할 일을 순서대로 알려주기 위해 만든 파일이며, 보통 확장자가 *.exe입니다. 컴퓨터가 작업할 내용을 컴퓨터가 이해할 수 있는 언어(기계어)로 만들어졌습니다.

그렇다면 프로그래밍 언어로 쓰여진 파일은 어떻게 컴퓨터가 읽을 수 있는 기계어로 번역될까요?
그 과정에 대해 살펴봅시다. 아래의 그림을 통해 컴파일 과정에 대해 간략하게 파악보세요!

컴파일 과정에서의 파일 변화 과정

각 과정에 대해 설명을 드리겠습니다.
소스 코드 파일 : 먼저, 프로그래머가 만들고 싶은 프로그램을 C 언어 문법을 사용하여 소스 코드 파일을 아래와 같이 작성한 것입니다. 다들 해보셨죠?

소스 코드 파일 작성 예(C언어)

전처리 : C언어에서는 #으로 시작하는 문장을 처리기라고 부릅니다. 전처리기(Pre-processor)는 ‘미리, 사전에’ 처리한다는 뜻입니다. 이 예제 소스 코드를 번역하기 위해 stdio.h 파일을 먼저 처리하라고 개발자가 컴파일러에게 지시하는 것입니다.

컴파일러: 전처리된 소스 코드는 이제 컴파일러를 통해 어셈블리 언어로 변환됩니다. 컴퓨터가 작업할 내용은 컴퓨터가 이해할 수 있는 언어인 기계어로 만들어졌습니다. 사람들이 사용하기 편한 언어로 작성한 작업 내용을 어셈블리어로 번역합니다.

어셈블리어 : 기계어와 일대일 매칭되는 언어로, 어셈블리어 하나의 명령어가 기계에 직접적인 명령을 내립니다. 어셈블리어 = 기계어이기 때문에 같다고 보셔도 됩니다!

어셈블리 과정 : 어셈블러(as)가 기계어 인스트럭션으로 번역하고, 이들을 재배치 가능 목적프로그램의 형태로 묶어서 목적 파일에 결과를 저장하는 과정입니다. 이 파일은 main 함수의 인스트럭션들을 인코딩하기 위한 바이너리 파일입니다.

  • 어셈블리 과정에서 어셈블러가 소스 코드를 어셈블리어로 변환해주는 것입니다.(용어가 헷갈리죠?)

목적 파일 : 목적 코드로 작성된 목적 파일은 컴파일러가 소스 파일을 번역(컴파일)하면 만들어지는 파일입니다.
컴파일러가 실행 파일을 만드는 시간을 줄이기 위해, 내용이 많은 파일에서 비슷한 작업들을 모아서, 여러 개로 나누고 각각의 파일을 컴파일 하는 방식을 사용합니다. 여러 개의 파일 중 작업하지 않은 파일은 재사용하여 시간을 단축시킵니다.


링커 : 링킹은 각기 다른 목적 코드를 하나의 실행 파일로 묶어 주는, 즉 연결시켜 주는 작업입니다. 참고로 링킹을 하기 전 오브젝트 파일을 재배치 가능한 오브젝트 파일이라 부릅니다. 링킹을 통해 실행 가능한 오브젝트 파일이 되어 디스크에 저장됩니다. 책에서 보신 단어죠?

라이브러리 : 프로그래밍에 사용할 수 있게 미리 만들어져 있는 함수나 변수들의 묶음입니다. #include <stdio.h>은 standard Input&Output library는 표준 입출력 라이브러리의 줄인말입니다. 입력 출력과 관련된 함수가 저장된 라이브러리라는 뜻이죠. python에서 import random은 랜덤 라이브러리를 불러와서 난수 생성 함수를 불러 오겠다는 뜻입니다.

실행 가능한 파일 : 목적 파일과 라이브러리를 링킹하여 만든 실행 가능한 파일입니다. 이제 확장자가 *.exe로 바뀌면서 실행할 수 있게 됩니다.

소결 : 위의 과정을 통틀어 빌드(Build)라고 하며, 컴파일하는 과정에서 연쇄적으로 사용하는 개발 도구들(컴파일러, 어셈블러, 링커)을 툴체인(ToolChain), 컴파일 시스템이라고 합니다.

배운 내용을 토대로 그림을 보며 보다 정확하게 이해해볼까요?

------------------------------------------------부록----------------------------------------------------

Python이 설치되면, 인터프리터와 지원 라이브러리가 설치됩니다. 인터프리터는 Python Script를 실행할 수 있는 소프트웨어이며 모든 프로그래밍 언어로 구현될 수도 있습니다. C언어로 구현된 Cpython이 대표적이며, Java로 구현된 Jpython도 있답니다. 파이썬의 컴파일 과정에 대해서도 간략하게 알아볼까요?
아래는 python.org로 들어가서 볼 수 있는 공식 Github에 담긴 레포지토리(저장소)입니다.


  • Step 1: 파이썬 컴파일러가 소스 코드를 읽습니다. 그리고 나서 소스 코드가 잘 작성되었는지를 판단하기 위해 문법 오류 검사를 진행합니다. 만일 문법 오류가 발견되었다면 그 즉시 컴파일 과정을 멈추고 에러 메시지를 출력합니다.
  • Step 2: 만일 에러가 발생하지 않았다면 컴파일러가 소스 코드를 바이트 코드(기계어)로 변환합니다.
  • Step 3: 마지막으로 바이트 코드는 PVM(Python Virtual Machine)에 보내집니다. PVM은 바이트 코드를 컴퓨터가 실행할 수 있는 기계어로 한줄 한줄 번역합니다. 만일 이 과정에서 에러가 발생하면 모든 것을 멈추고 에러 메시지를 출력합니다.
  • 바이트코드(Bytecode, portable code, p-code)는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법입니다. 하드웨어가 아닌 소프트웨어에 의해 처리되기 때문에, 보통 기계어보다 더 추상적입니다.
  • 가상머신(Virtual Machine)은 Python으로 작성된 프로그램과 OS 사이에 중간자 역할을 해줍니다. 가상머신 덕분에 소스 코드는 "운영체제에 비종속적"으로 동작할 수 있습니다.

프로세스 가상 머신은 응용 프로그램 가상 머신이라고도 하며, 운영 체제 안에서 일반 응용 프로그램을 돌리고 단일 프로세스를 지원한다. 목적은 플랫폼 - 아무 플랫폼에서나 같은 방식으로 실행하는 프로그램을 허용하고 기초가 되는 하드웨어나 운영 체제의 상세한 부분을 가져오는 독립 프로그래밍 환경을 제공하기 위함이다.

출처
Instruction (명령어)
컴파일(Compile)에 대한 이해
[Python] Interpreter and PVM (Python Virtual Machine)
[컴퓨터 구조] RISC-V 명령어 작동 과정 (RISC-V Instruction Operation Process)

profile
고민하고 고뇌하는 개발자 (점심, 저녁 메뉴를)

0개의 댓글