Intro
일을 시작하고 나서 얼마 뒤
파이썬이 스크립트 언어냐는 질문을 들었다.
그래서 내가 한 말
“스크립트 언어가 뭔데요?”
하하
얼마나 어처구니 없었을까
기계어와 어셈블리어, 저급언어와 고급언어
컴파일과 인터프릿은 모두 “사람이 작성한 코드를 컴퓨터가 이해할 수 있게” 하는 행위입니다.
그렇다면 이 둘을 설명하기 전, 컴퓨터(기계)가 이해할 수 있다는 건 무언지부터 알아봐야겠죠?
기계어와 어셈블리어
기계어
기계어의 정의는 컴퓨터가 직접 읽을 수 있는 2진숫자(0과 1)로 이루어진 언어를 말합니다.
즉, 기계(CPU)가 어떠한 명령을 처리할 때 사용하는, 그리고 사용할 수 있는 유일한 언어입니다.
1
2
3
4
5
6
7
8
9
10
11
// 기계어의 예시 (x = 10 + 2)
// 출처 : 시스템 프로그래밍 (인텔 프로세서를 위한 ) (2015) 조충호, 이상곤 / 생능출판사
001001 11101 11101 1111111111111000 27BDFFF8
001000 00001 00000 0000000000001010 2020000A
001000 00001 00001 0000000000000010 20210002
101011 11101 00001 0000000000000000 =16진수=> AFA10000
001000 00010 00001 0000000000000100 20410004
101011 11101 00010 0000000000000100 AFA20004
001001 11101 11101 0000000000001000 27BD0008
위 숫자들은 x = 10 + 2라는 명령을 기계어로 번역한 내용입니다.
사람이 직관적으로 알기 쉽지 않으며, 이를 작성해야 한다면 더더욱 어려운 일일 겁니다.
가독성을 높이기 위해 16진수로 표현하기도 하지만, 여전히 사람이 직관적으로 이해하거나 쉽사리 작성하기에는 어렵습니다.
어셈블리어
그래서 등장한 것이 어셈블리어입니다. 어셈블리어는 기계어와 1대1 대응이 되는 프로그래밍 언어입니다.
아래 예시를 보도록 하겠습니다.
1
2
3
4
5
6
// 어셈블리어의 예시 (x = 10 + 2)
MOV AX, 10 ; Move the value 10 into the AX register
ADD AX, 2 ; Add the value 2 to the value in the AX register
MOV x, AX ; Move the result in the AX register to the variable 'x'
비교적 사람이 이해하기 쉬운 표현법으로 x = 10 + 2
가 표현됩니다.
AX 레지스터에 10을 넣고, 동일 레지스터에 2를 더합니다. 그 후 x라는 변수의 AX 레지스터에 그 결과값을 넣는 것이죠.
하지만 여전히 사람이 사용하는 언어와는 거리감이 있습니다. 한글로는 “10과 2를 더한 것이 x야” 라고 이해하기 쉽게 표현할 수 있죠.
그래서 사람이 더욱 이해하기 쉽도록 등장한 언어가 고급언어입니다.
저급언어와 고급언어
저급언어
low-level programming language
앞서 살펴봤던 기계어와 어셈블리어는 “컴퓨터가 이해하기 쉽게 작성된 프로그래밍 언어” 입니다.
그리고 이를 “저급언어”라고 합니다.
저급언어는 사람이 이해하기는 어렵지만, 앞서 말핸대로 “컴퓨터가 이해하기 쉬운” 특징에 따라 명령의 실행속도가 매우 빠르다는 장점이 있습니다.
예를 들어, 한국사람이 영어나 터키어로 하는 말을 듣고 이해하는 것보다 한국어를 듣고 이해하는 게 빠른 것과 비슷합니다.
고급언어
high-level programming language
저급언어로만 프로그래밍을 해야한다면 어떨까요?
작성하는 사람도 시간이 오래 걸릴 뿐더러, 작성된 코드를 수정하는 유지보수를 하기도 굉장히 어려울 것입니다.
그래서 사람이 좀 더 직관적으로 이해할 수 있도록 언어들이 등장하는데, 이들이 바로 고급 언어입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 고급 언어의 예시 (x = 10 + 2)
//파이썬
x = 10 + 2
//자바
int x;
x = 10 + 2;
//C
int x;
x = 10 + 2;
//JavaScript
let x;
x = 10 + 2;
어떤가요? 훨씬 이해하기 쉽지 않나요?
컴파일과 인터프릿
그러면 이 글을 보는 당신이 프로그래머라고 해봅시다.
저급언어와 고급언어 중 어떤 언어로 프로그래밍을 할까요?
아무래도 고급언어일 가능성이 높다고 생각합니다.
그런데 여기서 문제가 있습니다. 기계(컴퓨터)는 0과 1로 이루어진 명령어만 알아들을 뿐, 고급언어로 작성된 코드 자체를 이해할 수는 없습니다.
그래서 필요한 게 번역 즉, 컴파일과 인터프릿입니다.
컴파일과 인터프릿은 고급언어를 기계어로 1대1로 번역하는 과정입니다.
구분 | 영문 | 설명 | 장단점 | 번역기 |
---|---|---|---|---|
컴파일 | compile | 코드를 실행 하기 전, 고급언어로 작성된 소스코드”전체”를 기계어 번역해 실행파일로 만든다. | 전체 코드를 한 번에 번역하므로 실행파일을 만드는 데 오래걸린다. 반면 번역후 실행은 빠름 |
컴파일러 |
인터프릿 | interprit | 고급언어로 작성된 소스코드를 한 줄씩 기계어로 번역해 실행한다. | 컴파일 과정이 없으므로, 이에 소요되는 시간도 없다. 반면 실행시 번역이 동반되어 느림 |
인터프리터 |
참고 | 어셈블리어->기계어 | 어셈블러 |
컴파일
컴파일은 소스코드 “전체”를 기계어로 번역하여 실행파일을 만든 후, 그 실행파일을 통해 명령을 실행합니다.
이 때 소스코드 “전체”를 기계어로 번역해 실행파일을 만들어놓는 과정을 컴파일이라고 합니다.
컴파일 방식의 언어는 컴파일하는 과정에서 시간이 소요되나, 컴파일 이후에 실행은 빠르다는 장점이 있습니다.
컴파일 언어에는 Java, C, C++ 등이 있습니다.
(Java의 경우 JVM을 거치는 특징이 있음)
인터프릿
인터프릿은 컴파일과 같은 “사전 번역 과정(컴파일)”이 없습니다. 소스코드를 실행하면 인터프리터를 통해 바로 기계어로 번역되어 실행이 됩니다.
인터프리터는 사전 번역 과정(컴파일)이 없기 때문에 실행파일을 만드는 시간이 투입될 필요가 없습니다. 하지만 소스코드를 실행할 때 번역이 동반되므로 실행이 컴파일 언어에 비해 느리다는 단점이 있습니다.
인터프릿 언어에는 파이썬, 자바스크립트 등이 있습니다.
컴파일 언어와 스크립트 언어
컴파일 언어는 앞서 설명한 “컴파일”을 하는 언어이고, 스크립트 언어는 “인터프릿”을 하는 언어입니다.
그리고 그 장단점 또한 컴파일과 인터프릿의 장단점과 동일합니다.
Reference
두산백과 - 기계어 : 링크
프로그래머 김성엽 - 기계어, 어셈블리어 그리고 고급언어 : 링크
tmxklab - 어셈블리어 설명 및 종류 : 링크
기계어와 어셈블리어 : https://m.blog.naver.com/loveyou_a_a/222134634322
위키피디아 - 저급언어 : 링크
컴파일과 인터프릿 : https://swdevelopment.tistory.com/200#google_vignette
컴파일 언어와 스크립트 언어 : https://ryusm.tistory.com/m/105