Study 📔

[Study] 컴파일러 언어와 인터프리터 언어

SeongJo 2022. 11. 4. 23:53
반응형

안녕하세요 성조입니다.

 

혹여나 올바르지 못한 지식 전달이 있는 경우. 언제든지 피드백 댓글 남겨주시면 감사드리겠습니다.


컴파일러 언어(Compiled language)란?

컴파일러 언어는 전체 프로그램 코드를 읽어서 해당 코드를 머신 코드(컴퓨터의 프로세서가 이해할 수 있는 코드로 변경)로 바꾸는 방식을 말한다. 컴파일 시간이 다소 걸릴 수 있으나, 한번 변환된 이후에는 속도가 빠른 장점이 있다.

 

컴파일러 언어는 당연할 수 있으나, 컴파일 과정을 진행한다.

컴파일 과정으로 다양한 언어를 기준을 잡을 수 있으나, C언어를 기준으로 예시를 들겠다.

 

컴파일을 시작하면 다음과 같이 진행된다.

1. 전처리(Preprocessing)

#include와 같이 전처리 지시어가 처리되는 구간이다. #include <stdio.h>와 같은 헤더 파일의 내용을 불러서 컴파일러에 필요한 헤더 파일들이 메인 소스 코드에 포함되는 과정을 말한다.

 

2. 컴파일(Compiling)

전처리된 소스 코드가 실제로 컴파일되며, 2가지 부분으로 나눠진다.

- 구문 분석(Parsing)

컴파일러가 소스 코드를 읽고, 그것이 언어의 문법에 맞는지 확인한다. 구문 분석에서 오류가 발생하고, 감지되면 구문 에러가 발생하여 컴파일을 실패한다.

 

- 코드 생성(Cod Generation)

구문에 오류가 없다면 컴파일러는 중간 표현 형식(Intermediate Representation, IR)을 생성하고 최적화를 수행한다. 이후, 컴파일러는 IR를 특정 시스템 및 아키텍처에 맞는 어셈블러 언어로 변환시켜 준다. 코드 생성의 결과물은 '.s' 또는 '.asm'의 확장자를 가진 파일로 저장된다.

 

3. 어셈블(Assembling)

어셈블리 코드를 머신 코드로 변환하는 단계이다. 이때 오브젝트 파일이라는 형식으로 생성되며, 확장자는 '.o' 또는 '.obj' 확장자를 가지게 된다.

 

4. 링킹(Linking)

링커가 하나 이상의 파일과 필요한 라이브러리를 결합하여 단일 실행 파일을 생성한다. 이 과정에서 외부 라이브러리의 함수 호출과 같이 다른 부분에 대한 참조를 해결한다. 과정이 끝나고 실행 파일이 생성되는 것이다.

 

 

대표적인 컴파일러 언어로 C, C++, Java, Swift 등이 나오는데 Java와 같은 언어들은 컴파일러 언어이면서 JVM에서 인터프리팅 단계를 가지고 있기 때문에 무조건 컴파일 언어라고 정의하기 어렵다.

 

 

인터프리터 언어(Interpreter language)란?

프로그램을 한 줄씩 읽어서, 즉시 해당 코드를 실행하는 것이 인터프리터 언어의 특징이다.

전체 프로그램을 미리 컴파일할 필요가 없어서 초기 실행 시간이 빠르나, 한 줄씩 읽는 속도로 인하여 전체 실행 시간은 느려지는 단점과 프로그램을 재실행할 때마다 다시 코드를 해석해야 하는 단점이 존재한다.

 

언어 예시 Python, JavaScript, Ruby 등이 존재한다.

 

컴파일러 언어와 인터프리터 언어의 차이점

컴파일러와 인터프리터는 모두 소스 코드를 실행 가능한 코드로 변환하는 역할을 한다.

 

컴파일러 언어의 경우.

전체 프로그램 코드를 읽어서 머신 코드로 바꾸는 방식이다.

 

인터프리터 언어의 경우.

한 줄씩 읽어서 즉시 해당 코드를 실행하는 것이다.

 

 

컴파일러 언어의 경우. 이미 코드가 컴파일된 코드를 실행하는 것이라 컴파일 이후의 속도가 빠르다. 컴파일러 언어는 전체 코드를 통으로 컴파일하여 사용하기 때문에 컴파일로 인한 실행 속도가 늦어질 수 있는 문제점이 있다.

 

인터프리터 언어의 경우. 코드를 실행하면서 즉시 개발과 디버깅을 빠르고 쉽다는 장점이 있다. 하지만 단점으로 프로그램의 규모가 커질 때 컴파일러 언어에 비해. 코드 베이스가 크고 복잡해질 수 있어 실행 속도가 느려지는 단점이 있다.

 

 

혼용하여 사용되는 언어.

Java의 경우. 컴파일러 단계에서 자바 소스 코드는 .java 파일로 작성되지만 컴파일러 javac에 의해 바이트코드 .class로 컴파일된다. 이 바이트코드는 플랫폼에 독립적인 중간 코드로, 머신 코드 즉, 기계어가 아닌 단계이다.

또한, 바이트코드는 JVM(자바 가상 머신)에서 실행되는데 이 바이트코드를 해석(Interpret)하여 사용하거나, JIT(Just-In-Time) 컴파일러를 사용해 실시간으로 머신 코드로 컴파일하여 실행한다.

컴파일과 인터프리팅을 모두 사용하고 있기 때문에 하이브리드 언어로 이해된다.

 

Python 또한, 평소 인터프리터 언어로 사용되지만 Python 코드는 실행 시간에 바이트코드로 컴파일된 뒤에 인터프리터에 의해 실행되는 원리라서 인터프리터 언어지만 컴파일하지 않는 것은 아니다.

JavaScript는 순수한 인터프리터 언어였지만 V8 엔진에서 JIT 컴파일 기술을 사용하여 성능 향상을 시키는 과정이 추가됐다.

Ruby 언어도 내부적으로는 YARV라는 바이트코드로 컴파일하기 떄문에 순수 인터프리터라고 정의하기 어렵다.

 

 

 


오타나 잘못된 지식이 있다면 언제든지 댓글 부탁드리겠습니다!

다음 포스팅 때 뵙겠습니다. 감사합니다!

반응형