0️⃣ 고급 언어와 저급 언어
컴파일 언어와 인터프리터 언어에 대해 알기 전에 먼저 이해하고 넘어가야 할 부분이 있다.
컴퓨터는 0과 1로 된 정보만을 읽고 이해할 수 있다.
위 말처럼 컴퓨터는 0과 1로 되어있는데 어떻게 사람이 쓴 프로그래밍 언어를 읽고 해석할 수 있는 걸까?
이를 알기 위해선 고급어와 저급어에 대한 개념을 이해해야 한다.
- 고급 언어(High-Level Language) : 사람을 위한 프로그래밍 언어 ex) Java, JavaScript, C ...
- 저급 언어(Low-Level Language) : 컴퓨터가 이해하고 실행할 수 있는 언어 ex) 기계어, 어셈블리어
즉, 컴퓨터는 저급 언어만을 이해할 수 있고 저급 언어는 고급 언어에 비해 훨씬 실행 속도가 빠르지만 저급 언어는 인간은 이해할 수 없을 정도로 난해하게 생겼다. (저급 언어의 종류 대한 내용은 아래 더보기에 자세히 나와있다.)
cf) 저급 언어의 종류 기계어와 어셈블리어
저급 언어도 기계어와 어셈블리어로 나뉜다.
- 기계어 : 0과 1의 이진법으로 이루어진 언어
- 아래 코드처럼 철저하게 0과 1로만 이루어진 언어를 기계어라고 부른다.
001001 11101 11101 1111111111111000
001000 00001 00000 0000000000001010
001000 00001 00001 0000000000000010
101011 11101 00001 0000000000000000
001000 00010 00001 0000000000000100
101011 11101 00010 0000000000000100
001001 11101 11101 0000000000001000
- 어셈블리어 : 기계어를 읽기 편한 형태로 번역한 언어 (기계어와 1:1 대응)
- 어셈블리어는 아래 그림처럼 생겼다.
기계어와 어셈블리어는 실행속도가 동일하다.
때문에 인간은 고급 언어를 통해 언어를 작성하고 이를 컴퓨터가 이해할 수 있도록 번역을 해주어야 하는데, 고급 언어를 저급 언어로 변환하여 실행하는 방식은 크게 2가지가 있다.
바로 컴파일 방식과 인터프리터 방식이다.
1️⃣ 컴파일 언어
- 컴파일 언어 : 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어
- 대표적인 예시로는 C, C++ 등이 있다.
컴파일의 특징은 소스 코드를 처음부터 끝까지 저급 언어로 번역(컴파일) 하는 것으로 코드 내에 오류가 하나라도 있다면 컴파일에 실패하게 된다. 이렇게 컴파일러를 통해 저급 언어로 변환된 코드를 목적 코드 라고 한다.
2️⃣ 인터프리터 언어
- 인터프리터 언어 : 소스 코드가 한 줄씩 저급 언어로 변환되어 실행되는 고급 언어
- 대표적인 예시로는 Python, Ruby, R 등이 있다.
인터프리터의 특징은 소스 코드를 컴퓨터와 대화하듯 한 줄씩 실행하기 때문에 코드 내에 오류가 있으면 오류가 있는 코드 직전까지는 올바르게 수행한다.
3️⃣ 컴파일 언어와 인터프리터 언어의 비교
사실 컴파일 언어와 인터프리터 언어를 명확히 구분할 수는 없다. 요즈음 나오는 많은 프로그래밍 언어는 컴파일과 인터프리터의 경계가 모호한 경우가 대부분이다. 사실은 Python과 Java 모두 컴파일과 인터프리터 방식을 사용하기 때문이다. 고로 이 개념에 대해 이해하되 모든 언어들을 명확하게 구분하기 위해 애쓸 필요는 없다.
컴파일 언어 | 인터프리터 언어 |
코드 실행 전, 컴파일 단계에서 소스 코드 전체를 한 번에 기계어로 변환 후 실행 실행 파일 생성 컴파일 단계와 실행 단계가 분리되어 있어 한 번만 실행하면 됨 1회 수행으로 인한 빠른 속도 |
코드 실행 단계인 런타임에 코드를 한 줄씩 중간 코드인 바이트 코드로 변환 후 실행 실행 파일 생성 X 인터프리터는 한 줄씩 코드를 읽어가며 실행하기 때문에 실행단계가 따로 분리되어있지 않고 이를 반복 수행함 반복 수행으로 인한 느린 속도 |
❗ 참고자료
- 강민철, 혼자 공부하는 컴퓨터구조 + 운영체제, 한빛미디어 (2022)
참고 사이트1 : https://velog.io/@congaweb/compiler-interpreter
'CS' 카테고리의 다른 글
[얼레벌레 공부하는 CS] 프로세스와 스레드 (1) | 2024.06.03 |
---|---|
[얼레벌레 공부하는 CS] 운영체제 (0) | 2024.05.31 |
[얼레벌레 공부하는 CS] RAM (0) | 2024.05.28 |
[얼레벌레 공부하는 CS] 2진법과 16진법 (0) | 2024.05.09 |
[얼레벌레 공부하는 CS] 자료구조와 Stack, Queue (2) | 2024.04.24 |