시대를 움직이는 것은 원칙이 아니라,
사람들의 다양한 개성이다.
- 오스카 와일드
[A. Programming/Common] - 프로그래밍 언어 종류 - 2
우리의 생각을 말로 하려면 어떤 언어로 할지 정한 후 말을 해야 합니다. 영어만 알아듣고 한국어는 모르는 사람에게 한국어로 아무리 말을 한다고 해도 알아들을 수는 없습니다.
컴퓨터 프로그래밍도 이와 비슷합니다. 어떤 프로그램을 만들 것인가가 결정되면 어떤 프로그래밍 언어를 이용하여 그 프로그램을 개발할지를 정해야 합니다. 현재 프로그래밍 언어는 매우 다양하고 서로 장단점을 가지고 있기 때문에, 개발하려는 프로그램에 적절한 프로그래밍 언어를 고르는 것이 프로젝트의 성공과 실패를 결정지을 수 있는 첫 번째 요인이 될 수 있습니다. (제가 다루려는 내용과 다소 엇나간 느낌이 있지만 그만큼 프로그래밍 언어에 대한 이해가 중요하다는 걸 표현하고 싶었습니다.)
여기서는 프로그래밍 언어들을 어떻게 분류할 수 있는지와 특성에 대해서 알아보려고 합니다.
프로그래밍 언어의 종류
프로그래밍 언어의 사전적 정의
컴퓨터 프로그램을 만들 때 사용하는 언어.
기계어와 어셈블러에 의하여 번역되는 어셈블리 언어, 컴파일러에 의하여 번역되는 컴파일러 언어, 인터프리터에 의하여 번역되는 베이식(BASIC)과 같은 인터프리터 언어 따위가 있다.
- 표준국어대사전
IT 용어에 대해 사전적인 정의를 찾는 것은 크게 의미가 없을 수도 있습니다. IT 용어의 특성상 시간의 흐름에 따라 그 뜻에 변화가 있을 수 있지만 일반적인 사전에서는 그 변화를 다 수용하지 못할 수 있기 때문입니다. 하지만 그럼에도 사전적인 정의를 찾아보는 것은 그래도 그 용어에 대한 가장 객관적인 정의라고 볼 수 있기 때문입니다.
앞으로 나올 새로운 용어들에 대해서 사전적 정의와 함께 위키백과나 나무위키 등의 지식백과를 같이 찾아보면 훨씬 도움이 될 것입니다(경험을 바탕으로 한 지극히 개인적인 생각입니다).
기계어(Machine Code)
앞서 살펴본 사전적 정의에서는 프로그래밍 언어들을 몇 가지로 분류했는데 이는 언어의 역사와도 관련이 있습니다. 프로그래밍 언어는 결국 컴퓨터(기계)가 원하는 대로 움직이도록 만드는 데 사용되는 언어입니다. 사실 컴퓨터는 여러 프로그래밍 언어로 작성된 코드 자체만으로 움직이는 것이 아닌 0과 1로 이루어진 기계어를 통해서만 움직일 수 있습니다.(컴퓨터가 0과 1을 통해서 움직이는 원리에 대해서 더 알아보고자 하시는 분은 '컴퓨터 구조'나 '마이크로프로세서'와 같은 내용을 찾아보시길 바랍니다.)
어셈블리어(Assembly Language)
하지만 0과 1만을 써서 프로그램을 만들기란 너무 어려운 작업이며, 제대로 동작이 되지 않더라도 문제를 찾는데 너무 많은 시간이 걸릴 것입니다. 이를 인간의 관점에서 사용하기 편하게 만든 게 어셈블리어입니다.
0과 1보다는 그래도 쓰기는 편하지만 어셈블리어는 컴퓨터를 만든 제조사에 의존적입니다. 보통 기계어와 일대일로 대응이 되기 때문에 성능 최적화가 중요한 분야에서는 여전히 쓰이고 있습니다. 보통 기계어와 어셈블리어까지를 저급 언어(low-level programming language)로 부릅니다(절대적인 것은 아닙니다). 저급 언어와 고급언어(high-level programming language)로 나누어지기도 하는데 저급에서 고급으로 갈수록 사람이 이해하기 쉽게 작성된 언어입니다.
PRINT:
PUSH AX
MOV AL, [SEC]
MOV [DSSEC], AL
MOV AL, [MIN]
MOV [DSMIN],AL
MOV AL, [HOUR]
MOV [DSHOUR],AL
;초 출력
MOV CL, [DSSEC]
MOV CH, 0
CALL PRINTDEC
; 대학교 과제로 했던 i8086 Emulator 코드 중 일부
컴파일 언어(Compile Language)
컴파일러에 의해 번역되어 다른 프로그래밍 언어로 바뀌는 언어를 말합니다. 프로그래밍 언어로 작성한 문서를 소스 코드 또는 원시 코드라고 부르고, 주로 다른 프로그램이나 기계에서 처리하기 용이한 형태로 출력된 문서를 목적 코드라고 부릅니다. 이 과정에서 소스 코드를 목적 코드로 변환하는 과정을 컴파일(Compile)이라고 부릅니다. 보다 좁은 의미로는 고급언어로 작성된 소스 코드를 저급 언어로 바꾸는 과정을 컴파일이라고 부르며, 가장 대표적인 프로그래밍 언어인 C언어가 컴파일 언어에 해당합니다.
#include <stdio.h>
int main()
{
printf("Hello, World!");
return 0;
}
// C언어를 배우는 사람들이 보통 가장 처음 보게 되는 코드
컴파일 언어가 등장하게 된 배경을 보면 어셈블리어의 불편함으로부터 시작했다고 볼 수 있습니다. 어셈블리어의 경우 CPU에 의존적일 수밖에 없는데 컴퓨터가 발전하면서 다른 CPU 아키텍처(Architecture)가 나올 때마다 같은 프로그램이라도 다시 작성해야 할 수밖에 없었습니다. 이를 해결하기 위하여 개발된 최초의 고급언어가 컴파일 언어입니다.
인터프리터 언어(Interpreter Language)
인터프리터를 통해 소스 코드를 바로 실행할 수 있는 언어들을 인터프리터 언어라고 부릅니다. 실행을 위해서 컴파일이라는 선처리를 거쳐야하는 컴파일 언어와 달리, 명령어들을 한 줄씩 읽어 들여서 실행되며 이를 인터프리터(Interpreter)라고 부릅니다. 대표적인 언어로는 파이썬(Python)이 있으며, 현재 사용되는 대부분의 고급 프로그래밍 언어가 이에 해당합니다.
print("Hello, World!")
# 한 줄만으로도 Hello, World! 출력이 가능하다
인터프리터는 실행시 소스 코드를 한 줄씩 기계어로 바꾸면서 동작하기 때문에 컴파일 언어보다는 느리며, 최근에는 이를 보완하기 위하여 가상 머신이나 바이트코드(Bytecode) 변환 등의 방법을 활용하고 있습니다. 프로그래밍 언어 역사적으로도 가장 최근 등장한 언어이며, 일반적으로 사람들이 사용하기 가장 편하고 가장 많이 활용되고 있습니다.
프로그래밍 언어의 현재와 미래?
사전적 정의에 따라 다양한 프로그래밍 언어를 기계어, 어셈블리어, 컴파일 언어, 인터프리터 언어로 나누어서 생각을 해보았습니다. 이런 분류도 가능하지만 시간이 흐름에 따라 이런 방식의 분류는 점점 애매해지고 있습니다. 고급 언어의 등장 이후부터 매우 다양한 언어들이 등장하고 각각의 단점을 보완하기 위해 서로의 장점들을 이용하며 최근에는 하이브리드(Compiler-Interpreter-Compiler) 방식도 등장하고 있습니다. Java가 최근 하이브리드의 형태를 띄고 있습니다.(일부 사람들은 여전히 Java가 컴파일 언어라고 하고, 또 일부는 인터프리터 언어라고 하기도 합니다.)
이 글을 통해 이렇게 프로그래밍 언어가 발전해왔다는 점에 대해서 알아보고 싶었습니다. 앞으로는 인터프리터 언어가 하이브리드 기법을 쓰는 형태로 바뀔 수도 있으며, 못 보던 형태의 언어가 나올 수도 있다고 생각합니다. 이렇듯 계속 발전해 나가고 있는 언어가 프로그래밍 언어이기 때문에 꾸준히 공부해나가야만 합니다.
다음 글에서는 많이 사용되어 지는 프로그래밍 언어 중 몇 가지에 대해서 더 자세히 알아보려고 합니다.
'A. Programming > Common' 카테고리의 다른 글
객체지향 프로그래밍(OOP) 절차적 프로그래밍(PP) (0) | 2021.07.04 |
---|---|
프로그래밍 언어 종류 - 2 (0) | 2021.07.02 |
코딩(Coding)과 프로그래밍(Programming) (0) | 2021.06.22 |