이번 글에서는 프로그래밍 언어의 발달 과정을 살펴봅시다. 이 부분 역시 프로그래밍을 하는데 반드시 알아야 하는 부분은 아닙니다. 대강의 흐름을 이해하시고 구체적인 언어의 문법을 이해하거나 외우려고 하시지 마세요.
기계어
처음 프로그래머들은 실제로 0과 1을 사용하여 프로그램을 작성하였습니다. 이를 기계어(Machine Language)라고 합니다.
000000 00001 00010 00110 00000 100000
이런 식이죠. 저는 기계어를 모르기 때문에 위 코드는 영문위키(https://en.wikipedia.org/wiki/Machine_code)에서 가져왔습니다. 내용을 해석해 보면,
[ op | rs | rt | rd |shamt| funct] 000000 00001 00010 00110 00000 100000 2진법 0 1 2 6 0 32 10진법
- 0번 오퍼레이션(op)의 32번 기능(funct)을 사용합니다.
- 이 기능은 rs 레지스트리의 값과 rt 레지스트리의 값을 더하여 rd레지스트리에 저장합니다. 여기서 레지스트리는 CPU에서 데이터를 임시로 저장하는 장치를 뜻합니다(윈도우 운영체제의 레지스트리와는 다릅니다).
- 즉 1번 레지스트리의 값(rs)에 2번 레지스트리값(rt)을 더하여 6번 레지스트리(rd)에 전달합니다.
바로 앞 강의에서 살펴 본 칩과 마찬가지로 0과 1로 구성된 32개의 신호를 CPU에 전달하면 CPU가 위 명령을 수행하기 위한 출력 신호를 생성하게 되고, 다음 장치들이 그 값을 받아 명령을 완수하게 됩니다.
기계어로 작성된 코드는 가독성이 굉장히 떨어지기 때문에 사람이 알아 보기 쉽게 하기 위해 나온 것이 어셈블리어(Assembly Language)입니다.
어셈블리어
10110000 01100001 <- 기계어
MOV AL, 61h <- 위 기계어에 해당하는 어셈블리어
저는 어셈블리어 역시 전혀 모르기 때문에 이 또한 영문 위키(https://en.wikipedia.org/wiki/Assembly_language)에서 가져왔습니다.
AL 레지스트리에 61h(h는 hex로 6진법을 뜻합니다. 6진법 61은 10진법으로 97입니다)를 넣으라(move)는 명령입니다.
10110000이라는 명령이 MOV AL이라는 문자로, 2진수인 01100001이 6진법인 61h가 되어 사람이 이해하기에 조금 더 쉬워졌습니다. 하지만 CPU는 0과 1밖에 모르기 때문에 어셈블리어로 작성된 코드는 CPU로 바로 전달될 수 없고 어셈블러(assembler)라는 프로그램을 통해 기계어로 번역된 후 CPU가 처리할 수 있습니다.
어셈블리어는 기계어를 단순히 사람이 보기 좋게 숫자를 문자로, 2진수를 다른 진수의 수로 변경한 것으로 기계어와 1대 1 변환이 가능합니다.
저급언어
기계어와 어셈블리어처럼 CPU에 직접 명령을 내리는 코드를 작성하는데 사용되는 언어를 저급언어라고 합니다. CPU에 명령어를 바로 전달하는 것은 초창기에는 너무 당연한 일이였겠지만, CPU가 발전하고 종류가 다양해지게 되면서 CPU 아키텍처가 바뀌면 프로그램이 작동하지 않게 되는 문제가 발생합니다. 즉 CPU 종류에 따라 각각의 프로그램을 작성해야 하는 것이죠. 기계어/어셈블리어는 하나의 언어가 아닙니다. 해당 CPU 메뉴얼에 맞춰 프로그래밍을 하는 것이 기계어로 코딩하는 것입니다.
또 다른 문제점은 CPU의 작동 방식이 사람이 이해하기에 난해하다는 점입니다. 예를들어, 2+3을 계산하려면 아래와 같은 명령들을 내려야 합니다.
- 2를 1번 레지스트리에 저장
- 1번 레지스트리의 값에 3을 더해서 2번 레지스트리에 저장
- 2번레지스트리의 값을 꺼내서 출력
굉장히 구체적으로 명령을 내려 줘야하기 때문에 익히기가 힘들고 코드가 복잡해지므로 생산성이 높지 않습니다.
고급언어
C언어, 자바, 자바스크립트, 파이썬 등과 같은 고급언어는 운영체제와 컴파일러/인터프리터 등의 프로그램을 통해 시스템에 맞는 기계어의 번역이 이루어 집니다. 또한 번역시 CPU가 처리해야 할 구체적인 과정이 알아서 처리되어 사람의 입장에서 명령을 내릴 수 있게 됩니다. 이것을 명령이 추상화가 되었다고 합니다. 물론 CPU의 입장에서 추상화가 된 것이죠.
2+3을 계산하는 명령을 그냥 2+3이라고 작성하면 이 명령이 기계어로 번역될 때 번역기가 이 문장을 이해하고 해당 CPU에 맞는 기계어를 알아서 생성하게 됩니다.
CPU의 입장에서 프로그래밍하는 언어가 저급언어, 사람의 입장에서 프로그래밍하는 언어가 고급언어라고 할 수 있습니다.
저급, 고급이 언어 자체의 좋고 나쁨을 뜻하지는 않습니다. 오히려 저급언어로 만들어진 프로그램이 CPU를 직접 제어하므로 고급언어보다 훨씬 빠른 프로그램을 만들 수 있습니다. 하지만 요즘은 컴퓨터 성능이 많이 좋아져서 고급언어로 만든 프로그램이 조금 비효율적이라도 여전히 빠르고, 프로그램을 만드는 효율(얼마나 쉽고 빠르게 프로그램을 만들 수 있는지)이 중요하게 여겨지기 때문에 대부분의 프로그램들이 고급언어로 만들어 지고 있습니다.
'프로그래밍 입문' 카테고리의 다른 글
자바스크립트로 프로그래밍 입문 6. 연산자(Operator)와 변수(Variable) (0) | 2018.10.03 |
---|---|
자바스크립트로 프로그래밍 입문 5. 비트(Bit), 바이트(Byte) 그리고 자료형(Data Type) (0) | 2018.09.21 |
자바스크립트로 프로그래밍 입문 4. 자바스크립트 Hello World (0) | 2018.09.19 |
자바스크립트로 프로그래밍 입문 2. 컴퓨터의 작동 원리 (0) | 2018.09.19 |
자바스크립트로 프로그래밍 입문 1. 프로그래밍이란 (0) | 2018.09.15 |