사람에게 시킬 때와 컴퓨터에게 시킬 때
같은 말을 했는데 왜 컴퓨터에게는 통하지 않을까요?
친구에게 「물 좀 끓여 줘」라고 부탁하면 친구는 알아서 합니다. 주전자를 찾고, 수도를 틀고, 어느 정도가 「좀」인지 눈대중으로 정하고, 가스레인지를 켜고, 물이 끓으면 불을 끕니다. 우리가 말하지 않은 부분을 친구가 알아서 메운 것입니다.
사람에게 시킬 때
상대가 겪어 본 것, 상식, 상황을 바탕으로 빠진 부분을 스스로 채웁니다. 그래서 짧게 말해도 됩니다. 다만 사람마다 채우는 방식이 달라 결과가 조금씩 달라질 수 있습니다.
컴퓨터에게 시킬 때
우리가 적어 준 것만 그대로 합니다. 빠뜨린 부분을 알아서 채워 주지 않습니다. 대신 같은 것을 적어 주고 같은 값을 넣으면 같은 순서로, 같은 결과를 냅니다. 무작위 수를 쓰듯 일부러 달라지게 적어 둔 경우가 아니라면 그렇습니다.
「물 좀 끓여 줘」를 컴퓨터가 알아들을 만큼 적어 본다면
- 주전자에 물을 500밀리리터 담는다.
- 주전자를 가열 장치 위에 올린다.
- 가열 장치를 켠다.
- 물의 온도를 측정한다.
- 온도가 100도보다 낮으면 4번으로 돌아간다.
- 가열 장치를 끈다.
한 문장이 여섯 줄이 됐습니다. 늘어난 만큼 애매한 곳이 사라졌습니다. 「좀」은 500밀리리터가 됐고, 「끓으면」은 100도가 됐습니다.
그런데 요즘은 컴퓨터가 사람 말을 알아듣지 않나요?
말로 물어보면 대답해 주는 프로그램들이 있습니다. 알아듣는 것처럼 보이는 것이 맞습니다. 다만 그것도 사람이 만들어 둔 프로그램이 정해진 절차대로 처리한 결과입니다. 대답하는 방식의 많은 부분은 방대한 데이터에서 학습해 얻지만, 학습하는 절차와 대답을 내놓는 절차는 누군가 빠짐없이 적어 둔 것입니다. 「알아서 채워 주는 층」이 하나 더 얹혔을 뿐, 그 아래에서 벌어지는 일은 바뀌지 않았습니다.
그래서 컴퓨터에게 일을 시키는 사람은 빠진 것을 스스로 찾아내는 일을 하게 됩니다. 무엇부터 할지, 어디까지 반복할지, 어떤 경우에 멈출지를 정하는 방법을 이 과목에서 배웁니다.
「물 좀 끓여 줘」를 풀어 적은 여섯 줄에서 「물의 온도를 측정한다」와 「100도보다 낮으면 4번으로 돌아간다」 두 줄을 지우면 어떤 일이 벌어질까요? 원래 부탁이 무엇이었는지를 떠올리며 답해 보세요.
프로그램 · 프로그래밍 · 소프트웨어
셋은 자주 섞어 쓰이는데, 가리키는 것이 서로 다릅니다.
프로그램(program)
컴퓨터가 할 일을 순서대로 빠짐없이 적어 둔 결과물입니다. 「만들어져 있는 물건」을 가리키는 말이라 저장하고, 복사하고, 남에게 건네줄 수 있습니다.
프로그래밍(programming)
그 결과물이 나오기까지의 일하는 과정 전체입니다. 무엇을 만들지 정하고, 순서를 짜고, 적고, 틀린 데를 고치는 일이 모두 여기 들어갑니다. 「하는 일」을 가리키는 말이라 건네줄 수 없습니다.
소프트웨어(software)
하드웨어와 짝을 이루는 말입니다. 하드웨어가 손에 잡히는 부품이라면, 소프트웨어는 그 부품을 움직이게 하는 쪽 — 프로그램과, 프로그램이 함께 쓰는 설정 · 자료 · 설명서까지 묶어서 부르는 말입니다. 그래서 프로그램 하나를 두고 소프트웨어라고 불러도 대개 틀리지 않지만, 소프트웨어라고 할 때는 보통 그 주변까지 함께 가리킵니다.
| 이름 | 무엇을 가리키는가 | 이렇게 쓴다 |
|---|---|---|
| 프로그램 | 만들어진 결과물 | 「프로그램을 내려받았다」 |
| 프로그래밍 | 결과물을 만드는 과정 | 「오늘 프로그래밍을 배웠다」 |
| 코딩 | 프로그래밍 중에서 실제로 적어 넣는 단계 | 「설계는 끝났고 코딩만 남았다」 |
| 프로그래머 | 프로그래밍을 하는 사람 | 「이 앱을 만든 프로그래머」 |
| 소프트웨어 | 하드웨어와 짝을 이루는 쪽 전체 | 「이 기계는 소프트웨어를 바꿔 쓸 수 있다」 |
코딩과 프로그래밍은 같은 말이 아닙니다
두 말이 같은 뜻으로 쓰이는 경우가 많지만, 이 과목에서는 구별해 씁니다. 코딩은 프로그래밍의 한 단계입니다. 무엇을 만들지 정하고 순서를 짜는 일이 앞에 있고, 만든 뒤 확인하고 고치는 일이 뒤에 있습니다. 적는 일만 프로그래밍이라고 생각하면 앞뒤에 있는 일을 통째로 빠뜨리게 됩니다.
「친구에게 프로그래밍을 보내 줬다」라는 문장은 어색합니다. 왜 그럴까요? 「친구에게 프로그램을 보내 줬다」는 자연스러운데, 두 문장은 무엇이 다를까요?
왜 따로 언어를 만들었을까
우리 말도 안 되고 컴퓨터 말도 안 된다면, 남는 방법은 무엇일까요?
컴퓨터의 부품이 실제로 받아들이는 것은 기계어(machine language)입니다. 0과 1 두 값으로만 적힌 명령이고, 부품이 그 값을 그대로 받아 동작합니다. 사람이 읽으라고 만든 것이 아니라서, 사람이 기계어로 긴 프로그램을 적는 일은 가능하기는 하지만 몹시 더디고 틀리기 쉽습니다.
그렇다고 우리가 평소에 쓰는 말인 자연어(natural language)를 그대로 쓸 수도 없습니다. 자연어는 같은 문장이 여러 뜻으로 읽히는 일이 흔하기 때문입니다.
한 문장, 여러 해석
「성적이 높은 학생을 찾아 줘.」 — 사람끼리는 통하는 말입니다. 그런데 이렇게 물을 수 있습니다.
- 몇 명을 찾으라는 뜻인가요? 한 명인가요, 여러 명인가요?
- 「높다」의 기준은 무엇인가요? 1등인가요, 평균보다 위인가요, 90점 이상인가요?
- 같은 점수인 학생이 둘이면 어떻게 하나요?
- 성적이 아직 입력되지 않은 학생은 어떻게 하나요?
사람은 상황을 보고 하나를 고릅니다. 컴퓨터는 고를 근거가 없습니다. 여러 뜻으로 읽힐 수 있다는 것 자체가 문제입니다.
그래서 사람이 읽고 쓸 수 있으면서, 뜻이 하나로만 정해지는 언어를 사이에 새로 만들었습니다. 이것이 프로그래밍 언어(programming language)입니다.
사람의 말 (자연어)
읽기 쉽지만 여러 뜻으로 읽힐 수 있다
프로그래밍 언어
사람이 읽을 수 있고, 뜻이 하나로 정해진다
기계어
부품이 그대로 실행하지만 사람이 다루기 어렵다
규칙이 엄격하다
쉼표 하나, 괄호 하나가 빠지면 받아들여지지 않거나 전혀 다른 뜻이 됩니다. 까다로워 보이지만, 규칙을 지켜 적은 문장은 읽는 쪽이 헷갈릴 여지가 없다는 뜻이기도 합니다.
뜻이 하나다
같은 문장이 사람마다 다르게 읽히지 않습니다. 「성적이 높은 학생」 문장처럼 해석이 나뉘는 곳을 남겨 두지 않습니다.
프로그래밍 언어는 하나가 아니라 아주 많고, 서로 생김새도 잘하는 일도 다릅니다. 지금은 언어가 하나가 아니라는 것까지만 잡아 둡니다.
「오늘 안에 끝내」라는 지시를 컴퓨터가 받았다고 해 봅시다. 「성적이 높은 학생」에 던진 되묻기처럼, 이 문장에 대해 물어야 할 것을 두 가지만 적어 보세요.
우리가 적은 것이 실행되기까지
사람이 읽을 수 있게 적었는데, 컴퓨터는 그것을 어떻게 실행할까요?
프로그래밍 언어로 적어 놓은 글을 소스 코드(source code)라고 합니다. 줄여서 그냥 코드라고 부르는 일이 많습니다. 소스 코드는 사람이 읽을 수 있는 글자로 되어 있어서, 그대로는 부품이 실행하지 못합니다. 어떤 방식으로든 부품이 실행할 수 있는 형태로 바뀌어야 합니다.
그 일을 하는 프로그램을 번역기(translator)라고 부릅니다. 번역기도 프로그램이므로, 프로그램을 만들 때 이미 만들어져 있는 프로그램을 쓰는 셈입니다.
번역하는 방식은 크게 두 갈래
한꺼번에 옮겨 두고 실행하기
소스 코드 전체를 미리 번역해 실행 파일을 만들어 둡니다. 만들어 두면 실행할 때마다 번역하지 않아도 됩니다. 대신 코드를 고칠 때마다 다시 만들어야 합니다.
실행하면서 옮기기
실행 파일을 만들어 두지 않고, 실행하면서 번역합니다. 실행을 시작하기 전에 문법이 맞는지 파일 전체를 먼저 검사하는 번역기가 많습니다. 고친 것을 바로 확인하기 편합니다. 대신 실행할 때마다 번역기가 함께 있어야 합니다.
두 방식은 좋고 나쁨이 아니라 쓰임이 다른 것입니다. 지금은 두 방식으로 나뉜다는 것까지만 봅니다.
번역이 안 되면 어떻게 되나요
번역기는 규칙에 맞지 않는 문장을 만나면 멈추고 어디가 이상한지 알려 줍니다. 처음에는 이 메시지가 잔소리처럼 느껴지지만, 실행하기 전에 잘못을 알려 주는 것이라 오히려 도움이 됩니다. 번역을 무사히 통과했다고 해서 내가 원한 대로 동작한다는 보장은 없습니다. 규칙에 맞게 적힌 문장이 엉뚱한 일을 하도록 적혀 있을 수도 있기 때문입니다. 지금은 번역을 통과하는 것과 원한 대로 동작하는 것이 서로 다르다는 것까지만 봅니다.
친구에게 내가 만든 프로그램을 건네주려고 합니다. 두 방식 가운데 친구 컴퓨터에 번역기가 없어도 되는 쪽은 어느 쪽일까요? 친구가 코드를 조금씩 고쳐 가며 써 보고 싶어 한다면 답이 달라질까요?
핵심 정리
컴퓨터에게 시킨다는 것
빠진 곳을 대신 메워 주지 않는다
- 적어 준 것만 적어 준 순서대로 한다
- 그래서 애매한 말을 걷어내는 일이 먼저다
- 말을 알아듣는 듯한 프로그램도 그 아래에서는 같은 방식
프로그램 · 프로그래밍
결과물과 과정
- 프로그램은 만들어진 결과물, 프로그래밍은 만드는 과정
- 코딩은 프로그래밍 중 실제로 적어 넣는 한 단계
- 소프트웨어는 하드웨어와 짝을 이루며 주변까지 묶어 부른다
프로그래밍 언어
programming language
- 자연어는 여러 뜻으로 읽히고, 기계어는 사람이 다루기 어렵다
- 그 사이에 둔 것이 사람도 읽고 뜻도 하나인 언어
- 규칙이 엄격한 것은 해석이 나뉘지 않게 하려는 것
소스 코드와 번역
source code
- 사람이 적은 글이 소스 코드, 이를 옮기는 프로그램이 번역기
- 한꺼번에 옮겨 두는 방식과 실행하면서 옮기는 방식이 있다
- 번역을 통과해도 원한 대로 동작한다는 뜻은 아니다
확인 퀴즈
배운 내용을 확인해 봅시다.
다음 중 「프로그램」이라는 말이 알맞게 쓰인 문장은?
우리가 평소에 쓰는 말을 그대로 컴퓨터에게 쓰지 않는 가장 큰 이유는?
소스 코드와 번역에 대한 설명으로 옳지 않은 것은?