하드웨어에 가까운 언어, 사람에 가까운 언어
언어는 무엇을 기준으로 나눌 수 있을까요?
프로그래밍 언어는 사람의 말과 기계어 사이에 놓인 언어입니다. 그런데 그 「사이」가 한 자리는 아닙니다. 기계 쪽에 바짝 붙은 언어도 있고 사람 쪽에 가까운 언어도 있습니다. 이 거리로 나눈 것이 저급 언어(low-level language)와 고급 언어(high-level language)입니다.
「저급」은 나쁘다는 뜻이 아닙니다
여기서 낮고 높은 것은 품질이 아니라 하드웨어로부터의 거리입니다. 하드웨어에 가까우면 저급, 사람의 말에 가까우면 고급입니다. 그래서 「고급 언어가 더 좋은 언어」라는 말은 성립하지 않습니다. 지금도 저급 언어가 아니면 못 하는 일이 있습니다.
저급 언어
하드웨어가 알아듣는 방식에 맞춰 적는 언어입니다. 부품을 직접 다룰 수 있고 낭비 없이 돌게 만들 수 있습니다. 대신 사람이 읽고 쓰기 어렵고, 기계가 달라지면 그대로 쓸 수 없습니다.
- 기계어 — 0과 1로 된 명령. 부품이 그대로 받는다
- 어셈블리어(assembly language) — 기계어의 명령 하나하나에 사람이 읽을 수 있는 짧은 이름을 붙인 것
고급 언어
사람이 쓰는 말과 수식에 가깝게 적는 언어입니다. 배우기 쉽고 짧게 적을 수 있으며, 같은 코드를 여러 종류의 기계에서 쓸 수 있는 경우가 많습니다. 대신 부품을 세세히 다루는 일은 언어가 대신 처리해 버려 손이 덜 닿습니다.
- 이 과목에서 다루는 C와 Python이 모두 여기 속한다
- 둘 다 고급 언어이지만 하드웨어와의 거리는 서로 다르다
둘 사이는 선이 아니라 띠입니다
저급과 고급은 어디까지가 저급인지 딱 떨어지는 경계가 있는 구분이 아닙니다. 같은 고급 언어끼리도 하드웨어에 더 가까운 쪽과 더 먼 쪽이 있습니다. 두 이름은 위치를 가늠하는 말이라고 보면 됩니다.
「요즘은 고급 언어가 있으니 저급 언어는 필요 없다」라는 말은 왜 성립하지 않을까요? 부품을 직접 다뤄야 하는 일을 하나 떠올려 근거로 삼아 보세요.
컴파일러와 인터프리터
소스 코드를 옮기는 번역기는 크게 두 갈래입니다.
번역기는 한꺼번에 옮겨 두는 쪽과 실행하면서 옮기는 쪽으로 나뉩니다. 두 쪽에는 각각 이름이 있습니다.
컴파일러(compiler)
한꺼번에 옮겨 두는 쪽
소스 코드 전체를 미리 번역해 실행 파일을 만들어 둡니다. 번역하는 동안 규칙에 어긋난 곳을 실행하기 전에 모아서 알려 줍니다. 만들어 둔 실행 파일은 번역기 없이도 실행할 수 있습니다.
인터프리터(interpreter)
실행하면서 옮기는 쪽
실행 파일을 따로 만들지 않고 실행하면서 번역합니다. 다만 실행을 시작하기 전에 파일 전체의 문법을 먼저 검사하는 인터프리터가 많습니다. Python도 그래서, 문법이 틀린 곳이 한 군데라도 있으면 첫 줄조차 실행하지 않습니다. 미리 만들어 두는 단계가 없어 고친 것을 곧바로 확인하기 편합니다. 대신 실행할 때마다 인터프리터가 함께 있어야 합니다.
| 무엇이 다른가 | 컴파일러 | 인터프리터 |
|---|---|---|
| 번역하는 때 | 실행하기 전에 전체를 | 실행하는 중에 차례로. 문법 검사는 실행 전에 먼저 하는 도구가 많다 |
| 오류를 알려 주는 때 | 규칙에 어긋난 곳은 실행 전에 모아서 알려 준다 | 문법 오류는 실행 전 검사에서 드러나는 도구가 많다(Python도 그렇다). 그 밖의 문제는 실행 중 만난 줄에서 멈춘다 |
| 고쳐 가며 확인하기 | 고칠 때마다 다시 만들어야 한다 | 고치고 바로 실행해 볼 수 있다 |
| 실행할 때 필요한 것 | 만들어 둔 실행 파일 | 소스 코드와 인터프리터 |
속도는 어느 쪽이 빠른가요
미리 번역해 둔 쪽이 실행할 때 할 일이 적으므로 대체로 실행이 빠른 편입니다. 다만 언제나 그런 것은 아닙니다. 같은 언어라도 번역기를 어떻게 만들었느냐에 따라 달라지고, 프로그램이 실제로 오래 걸리는 이유가 번역 방식이 아니라 짜 놓은 방법 자체에 있는 경우가 훨씬 많습니다. 「어느 쪽이 빠르다」를 외우기보다 왜 그런 차이가 생기는지를 잡아 두는 편이 낫습니다.
언어가 방식을 정하는 것은 아닙니다
「이 언어는 컴파일 언어, 저 언어는 인터프리터 언어」라고 짝지어 외우기 쉽지만, 번역 방식은 언어가 아니라 그 언어를 처리하는 도구가 정합니다. 같은 언어를 두고 두 방식의 도구가 모두 나와 있기도 하고, 두 방식을 섞어 쓰는 도구도 있습니다. 어느 쪽이 흔한지와 어느 쪽만 가능한지는 다른 이야기입니다.
코드를 조금씩 바꿔 가며 결과를 계속 확인해야 하는 상황이라면 어느 쪽이 편할까요? 비교표의 「고쳐 가며 확인하기」 줄을 근거로 들어 보세요.
지금 많이 쓰이는 언어들
저마다 어떤 일에 잘 쓰이고 있을까요?
세상에 나와 있는 프로그래밍 언어는 아주 많습니다. 하나하나가 그때 풀어야 했던 문제에 맞춰 만들어졌기 때문에, 생김새도 잘하는 일도 서로 다릅니다. 여기서는 학교에서 자주 만나게 되는 것들만 봅니다.
C
운영 체제를 만들려고 나온 언어라 하드웨어에 손이 닿는 편입니다. 메모리를 어떻게 쓸지 프로그래머가 직접 정하므로 작고 빠르게 만들 수 있는 대신 신경 쓸 것이 많습니다. 운영 체제, 기계 안에 들어가는 프로그램처럼 자원이 빠듯한 곳에 쓰입니다.
Python
문법이 간결해서 같은 일을 짧게 적을 수 있습니다. 남이 만들어 둔 기능 묶음이 풍부해 가져다 쓰기 쉬운 것이 큰 장점입니다. 데이터 분석, 인공지능, 자동화처럼 빨리 만들어 보고 고쳐 가는 일에 많이 쓰입니다.
Java
한 번 만든 것을 여러 운영 체제에서 그대로 쓰는 것을 목표로 설계됐습니다. 규모가 큰 프로그램을 여러 사람이 나눠 만들 때 쓰기 좋은 구조를 갖추고 있어, 기업용 시스템과 안드로이드 앱 쪽에서 널리 쓰여 왔습니다.
JavaScript
웹 브라우저가 직접 실행할 수 있는 언어입니다. 버튼을 눌렀을 때 화면이 바뀌는 것 같은 웹 페이지의 움직임을 맡습니다. 지금은 브라우저 밖에서도 쓰이지만, 브라우저 안에서 도는 쓰임이 여전히 대표적입니다.
PHP
웹 페이지를 서버 쪽에서 만들어 내보내는 일을 위해 나온 언어입니다. HTML 안에 끼워 넣어 쓸 수 있고 데이터베이스와 붙이기 쉬워, 게시판처럼 내용이 바뀌는 웹 사이트를 만드는 데 오래 쓰여 왔습니다.
Scratch
글자를 치는 대신 블록을 끌어다 맞추는 방식으로 문법 걱정을 아예 없앤 교육용 언어입니다. 문법이 쉬운 초보용 언어라기보다, 문법을 틀릴 일이 없게 만들어 순서를 짜는 일 자체에 집중하게 한 언어입니다.
같은 일을 시켜 보면
화면에 「안녕하세요」라고 한 줄 띄우는, 가장 단순한 프로그램입니다. 지금 문법을 읽을 필요는 없습니다. 생김새가 얼마나 다른지만 보면 됩니다.
C
#include <stdio.h>
int main(void) {
printf("안녕하세요\n");
return 0;
}Python
print("안녕하세요")한쪽은 빈 줄을 빼면 다섯 줄, 다른 쪽은 한 줄입니다. C가 쓸데없이 길게 적는 것이 아닙니다. 프로그램이 어디서 시작하는지, 어떤 기능을 끌어다 쓸 것인지를 프로그래머가 직접 적도록 되어 있는 언어이기 때문입니다. Python은 그 부분을 언어가 대신 정해 둔 것입니다. 드러나는 것이 많은 대신 손이 가고, 감춰진 것이 많은 대신 손이 덜 간다는 맞바꿈이 이 다섯 줄에 이미 들어 있습니다.
C · Python · Java · JavaScript · PHP · Scratch 가운데 「한 번 만들어 여러 운영 체제에서 쓰는 것」을 목표로 삼은 언어는 어느 것이었나요? 그리고 그 목표가 왜 필요했을지 짐작해 보세요.
언어는 무엇을 보고 고를까
가장 좋은 언어를 고르는 것이 아니라면, 무엇을 보는 걸까요?
어떤 일에서든 가장 나은 언어 하나는 없습니다. 어떤 언어가 잘하는 일은 대개 다른 것을 내려놓아서 얻은 것이기 때문입니다. 그래서 고를 때 묻는 것은 「어느 것이 좋은가」가 아니라 「지금 만들려는 것에 무엇이 맞는가」입니다.
무엇을 만드는가
웹 페이지에서 도는 것인지, 기계 안에 들어가는 것인지, 데이터를 분석하는 것인지에 따라 애초에 그 자리에서 돌 수 있는 언어가 정해지는 경우가 있습니다.
어디서 실행되는가
메모리가 빠듯한 작은 기계인지, 여러 운영 체제에서 함께 써야 하는지를 봅니다. 실행되는 환경이 언어를 먼저 걸러 냅니다.
가져다 쓸 것이 있는가
하려는 일을 이미 남이 만들어 둔 기능 묶음이 있다면 처음부터 짤 이유가 없습니다. 같은 일을 해도 언어에 따라 남의 힘을 얼마나 빌릴 수 있는지가 크게 다릅니다.
함께 만드는 사람들
혼자 만들 것이 아니라면 같이 만드는 사람들이 읽고 고칠 수 있는 언어여야 합니다. 이미 만들어 둔 프로그램에 이어 붙이는 일이라면 선택의 여지가 없기도 합니다.
그럼 처음에는 무엇을 배워야 하나요
처음 배우는 언어를 무엇으로 하느냐는 생각만큼 중요하지 않습니다. 순서를 짜는 일, 조건을 나누는 일, 반복하는 일은 언어가 달라져도 거의 그대로이기 때문입니다. 한 언어를 제대로 익혀 두면 다음 언어는 문법 차이를 확인하는 정도로 넘어가는 경우가 많습니다.
교실 온도를 측정해서 자동으로 알려 주는 작은 장치를 만든다고 해 봅시다. 무엇을 만드는가 · 어디서 실행되는가 · 가져다 쓸 것이 있는가 · 함께 만드는 사람들 가운데 어느 기준이 가장 먼저 걸림돌이 될지 하나만 골라 이유를 적어 보세요.
핵심 정리
저급 언어와 고급 언어
기준은 하드웨어로부터의 거리
- 저급 = 기계어 · 어셈블리어, 부품을 직접 다룬다
- 고급 = 사람의 말에 가깝고 여러 기계에서 쓰기 쉽다
- 낮고 높은 것은 품질이 아니고, 둘의 경계도 선이 아니다
컴파일러와 인터프리터
번역하는 때가 다르다
- 컴파일러는 실행 전에 전체를 옮겨 실행 파일을 만든다
- 인터프리터는 실행 파일 없이 실행하면서 번역한다. 문법 검사는 실행 전에 먼저 하는 것이 많다(Python)
- 방식은 언어가 아니라 도구가 정한다
주요 언어
저마다 무엇을 내려놓았나
- C는 손이 많이 가는 대신 하드웨어에 닿는다
- Python은 짧게 적는 대신 세부를 언어에 맡긴다
- 잘하는 일은 대개 다른 것을 내려놓아 얻은 것이다
언어를 고르는 기준
좋은 언어가 아니라 맞는 언어
- 무엇을 만드는가 · 어디서 실행되는가
- 가져다 쓸 것이 있는가 · 함께 만드는 사람들
- 순서 · 조건 · 반복은 언어가 달라져도 거의 그대로다
확인 퀴즈
배운 내용을 확인해 봅시다.
저급 언어와 고급 언어에 대한 설명으로 옳지 않은 것은?
인터프리터의 특징으로 알맞은 것은?
언어를 고르는 일에 대한 설명으로 옳지 않은 것은?