어느 날 외계인이 등장했다.
어느 날 갑자기 거대한 우주선이 지구에 내려왔습니다. 이 450M가 넘는 비행 물체는 미국, 중국, 러시아를 비롯한 세계 각지 상공에 등장합니다. 인류는 공포를 느끼며 비상상태를 선언합니다. 그리고 외계인들은 인간이 알 수 없는 웅얼거리는 소리를 냅니다. 이에 미국 정부는 언어학자 '루이즈 뱅크스'를 호출합니다. 그리고 이들이 말하는 언어를 해독해 달라는 요청을 합니다. 그리고 시작하는 외계인과의 대화 영화 '컨택트(Arrival, 2016)'는 외계어를 둘러싼 수수께끼는 풀고 그들이 지구를 방문한 이유와 인류를 향한 메시지가 해독하는 과정을 그린 영화입니다.
영화가 아닌 실제로 이런 무시무시한 비행물체가 등장한다면 우린 어떻게 해야 할까요? 가장 먼저 해야 할 일은 이들의 목적을 알아내는 것입니다. 그렇게 하기 위해서는 그들의 언어를 먼저 이해해야 합니다. 우리가 쓰는 언어가 아닌 그들이 쓰는 방식의 언어로 말이죠. 만약 원활한 소통이 되고 우리가 원하는 바를 전달할 수 있다면 아마도 우주에서 온 비행물체는 우리보다 똑똑하고, 특별한 일을 할 수 있을 것이고, 어쩌면 그 존재들에게 좀 더 새로운 과학기술을 배워 좀 더 발전된 문명을 이룰 수 있지 않을까요? 이런 멋진 일이 실현되기 위해서 우리의 언어를 그들에게 전달해야 합니다. 이런 과정을 저는 '코딩(Coding)'이라고 하겠습니다. 그리고 그런 일을 하는 사람들을 저는 '개발자(developer)'라고 하겠습니다.
내 책상 위에 외계인이 등장했다.
어느 날 갑자기 작고 네모난 우주선이 내 책상 위에 등장했습니다. 이 물체의 크기는 높이가 대략적으로 30Cm 정도뿐이 되지 않습니다. 어떠한 물체는 높이가 1Cm도 안되고 매우 얇은 그런 물체도 있습니다. 영화 속 거대한 우주선에 비하면 매우 작은 셈입니다. 그런데 이 낯선 물체는 오래가지 않아 모든 개발자 책상 위에 내려와 자리를 잡았습니다. 놀란 마음을 가다듬고 이제 전기를 연결하고 전원 버튼을 눌러보겠습니다. 잠시 후 이 무시무시한 작은 박스는 우리와 대화하기 위해 먼저 소통을 시도합니다. 모니터 화면에 하얀색의 글씨가 한 글자씩 느리고 선명하게 찍힙니다. 이후 깜빡 거리는 커서가 멈췄습니다.
'Hello World!'
'헬로 월드'라고 먼저 컴퓨터가 인사하네요. 세상과 만나는 외계인이 보내는 첫 메시지입니다. 그런데 이 뜬금없는 인사는 무엇일까요? 'Hello world'는 프로그래밍 언어를 학습할 때 첫 예제 프로그램으로 작성하는 메시지입니다. 그렇다면 어떻게 저 글자를 출력했을까요? 간단하게 코딩을 해보겠습니다.
print("Hello World!")
이 코드는 파이썬 Python이라는 프로그래밍 언어로 'Hello'라는 단어를 화면에 표시하는 명령어입니다.
printf("Hello World!");
이번에는 C라는 프로그래밍 언어로 'Hello'를 화면에 출력하는 명령어입니다. 파이썬과 다른 건 철자 하나네요.
System.out.println("Hello World!");
이번에는 다른 언어들보다. 조금 문장이 깁니다. 바로 자바(Java)에서 이렇게 언어마다 다양한 방식으로 세상과 조우하는 "hello world"라는 코드를 작성할 수 있습니다.
console.log("Hello World");
이번에는 자바스크립트입니다. Ecma International의 프로토타입 기반의 프로그래밍 언어기반의 스크립트 언어라 조금 다른 문법을 확인할 수 있습니다.
puts "Hello World"
마지막으로 루비입니다. puts라는 문법은 오직 문자열만을 출력하는 함수입니다.
'Hello World'는 의례적인 방식입니다. 마치 축구 대표팅 경기에 앞서 국기에 대한 경례를 하듯 새로운 프로그래밍 언어를 배우는 사람들이 가장 먼저 작성하는 의례의식입니다. 그리고 새로운 언어를 시험해 보는 차원에서 Hello World를 가장 먼저 화면에 출력해 보는 것이 목적이기도 합니다. 이러한 헬로 월드에 유래는 1978년에 '브라이언 커니핸(Brian Wilson Kernighan)'과 '데니스 리치(Dennis MacAlistair Ritchie)'가 쓴 "The C Programming Language" 교재의 첫 번째 예제가 바로 이 "Hello, world!"를 출력하는 것이었습니다. 이 밈이 유명해지면서 프로그래밍 언어의 첫 번째 예제로 굳어지게 되었습니다. 아마도 새로운 언어로 만나는 또 다른 세상을 뜻하는 게 아닐까요?
기계어
생각해 보니 이 작고 네모난 외계인은 우리가 아는 글자로 대화를 걸었네요? 어떻게 된 것일까요? 우리의 언어를 잘 아는 것일까요? 아닙니다. 사실 이들은 컴퓨터가 쓰는 언어인 '기계어(machine language)'로 우리에게 대화를 시도했습니다. 그 원본을 한번 같이 들여다볼까요?
10001100100100111110111111110111101100011000010101000
웬 숫자가 이렇게 많은데 0과 1뿐이 없네요. 이것이 무엇일까요? 숫자 두 개로 하는 짝수, 홀수 놀이일까요? 아니면 모스부호라도 되는 걸까요? 정답은 바로 기계어입니다. 바로 컴퓨터의 언어입니다. 컴퓨터가 별다른 해석 없이 읽을 수 있는 프로그래밍 언어입니다. 이번에는 좀 더 읽기 편하게 띄어쓰기로 구분을 해보겠습니다.
hello world 이렇게 보니 조금은 이해가 쉽게 되는 거 같습니다. 벌써부터 영화 속 언어학자처럼 외계인과 조우해 처음 그들의 언어를 알아가는 흥미진진함이 느껴집니다. '고트프리트 폰 라이프니츠(Gottfried Wilhelm Leibniz)'는 컴퓨터라는 물건이 나오기도 전에 2진법을 고안했습니다. 이후 '애니악(Electronic Numerical Integrator And Computer; ENIAC)'이라는 최초의 컴퓨터가 발명되었습니다. 이때의 컴퓨터는 배선을 통해 이루어져 있었습니다. 기판상에 있는 작은 전설들을 조작해서 연결이 이루어진 곳을 '1', 연결이 없는 곳은 '0'이라고 하였고, 전선을 연결한 조합이 당시의 프로그래밍이었습니다. ‘전기가 들어오고’, ‘전기가 들어오지 않고를 하나의 신호로 이해하기 시작했지만. 하지만 좀 더 간결하게 표현하기를 원했고 ‘예’, ’ 아니요’로 표현하였고 ‘참’, ‘거짓’으로 또는 0과 1로 표현하기 시작했습니다. 결론적으로 0과 1은 정보의 가장 작은 단위라고 할 수 있습니다.
코딩을 짜다 실무에서는 '코딩을 짜다'라는 표현을 많이 합니다. 마치 실로 옷을 만드는 과정처럼 말이죠. 실제로 초창기에 코딩은 이처럼 전선을 짜서 프로그래밍을 하였습니다. 키보드가 아닌 뜨개질처럼 전선을 이리저리 끼우면서 말이죠. 이처럼 초창기 개발자들은 컴퓨터와 대화하기 위해 많은 노력이 필요했습니다. 하지만 이 외계인과 우리는 점점 친해져 갔고 우리의 언어로 이야기로 할 수 있게 발전되었습니다. 그렇게 해서 등장한 게 바로 '고급언어'입니다.
고급언어
고급언어들 영화 속 언어학자 '루이즈 뱅크스'는 외계인의 언어를 배워 그들과 소통했지만 우리는 좀 달랐습니다. 우리 책상 위에 내려앉은 이 컴퓨터는 우리의 언어를 배우고 싶은 마음이 없는 까칠한 외계인이었습니다. 그래서 똑똑한 개발자들이 모여 고민을 시작했습니다.
"우리가 사용하는 일상적인 언어, 기호 등을 그대로 이용해서 이 네모난 컴퓨터와 이야기할 수 있을까?"
고민의 고민을 거듭한 결과 '고급언어'가 탄생했습니다. 컴퓨터와 대화하기 위해 인간과 좀 더 가까운 언어 방식으로 말이죠 이러한 언어를 사용하는 프로그래밍 대표적인 언어는 아래와 같습니다. 어디서 많이 들어본 단어들이죠?
C
C++
C#
Java
Pascal
Python
Visual Basic
개발자가 프로그래밍에서 사용하는 언어는 거의 대부분 고급언어입니다. 가끔 전설적인 이야기로 기계어 0과 1로 코딩을 짜는 인도개발자 이야기를 들어본 적은 있지만 실무에서는 단 한 번도 그런 천재를 본 적은 없습니다. 만약 기계어가 자유자재로 가능하다면 컴퓨터와 가까운 머리를 가진 사람이 아닐까 생각합니다. 그러나 우리는 천재가 아니기 때문에 고급언어로 컴퓨터와 대화를 시도해 보겠습니다.
고급언어 VS 기계어
#include <stdio.h>
int main(void)
{
printf("Hello World\n");
return 0;
}
우선 고급언어인 C언어로 간단한 예제를 코딩했습니다. 아까 그 'Hello World'를 출력하는 아주 간단한 문법입니다. 아직 C언어를 모르는 까막눈도 대충 느낌적으로 읽을 수는 있습니다. 고급언어는 이렇게 실생활에서 사용하는 영어 단어로 구성되어 있기 때문입니다. 그렇다면 이 보기 좋은 코드를 이진법으로 표현해 볼까요?
100011 1101001 1101110 1100011 1101100 1110101 1100100 1100101 111100 1110011 1110100 1100100 1101001 1101111 101110 1101000 111110 1101001 1101110 1110100 1101101 1100001 1101001 1101110 101000 1110110 1101111 1101001 1100100 101001 1111011 1110000 1110010 1101001 1101110 1110100 1100110 101000 100010 1001000 1100101 1101100 1101100 1101111 1010111 1101111 1110010 1101100 1100100 1011100 1101110 100010 101001 111011 1110010 1100101 1110100 1110101 1110010 1101110 110000 111011 1111101
네 무슨 말인지 하나도 모르겠습니다. 컴퓨터 외계인은 반대로 이 반복되는 0과 1을 보면서 "아 보기 편하다. 역시 기계어가 최고야!"라고 말하겠죠. 다행히 우리에게 고급언어가 탄생하였고 우리 방식대로 우리의 방법대로 코딩을 할 수 있게 되었습니다. 그렇다면 여기서 다른 언어들은 Hello World를 어떻게 표현하는지도 한번 알아볼까요?
자바
public class Hello World {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
자바에서 Hello World를 표현하는 문법입니다. 조금 더 길게 복잡하게 느껴집니다. 하지만 저에게는 가장 익숙한 방식입니다.
C++
#include <iostream>
int main()
{
std::cout << "Hello World" << endl;
return 0;
}
이번에는 c++ 입니다. 언뜻 보면 C와 굉장히 비슷하게 보이지만 약간 차이가 있습니다. C에서는 printf라는 단어를 사용하지만 C++에서는 std::cout를 사용합니다. 참고로 C++은 C의 기능을 상당 부분 지원하기 때문에 C++에서도 printf를 쓸 수 있습니다.
BrainFuck
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
이번에는 아주 괴상한 언어도 한번 알아보겠습니다. 저 문자가 ‘Hello world’를 출력하는 문법입니다. 기계어 보다 더 난해항거 같습니다. 8개 문자로 프로그래밍을 하는 이 언어는 이름도 특이한 브레인퍽입니다. 프로그래밍 방법은 엄청나게 난해하지만, 일단 튜링 완전 타입의 언어이기 때문에 이론적으로는 컴퓨터가 할 수 있는 모든 일을 다 할 수 있다고 합니다.
ArnoldC
IT'S SHOWTIME
TALK TO THE HAND "hello world"
YOU HAVE BEEN TERMINATED
이번에는 재밌는 언어를 소개해드리겠습니다. 아널드시(ArnoldC)라는 언어입니다. 영화배우 아널드 슈워제네거(ArnoldSchwarzenegger) 이름에 C를 더한 언어로 그가 영화에서 했던 대사로 이루어져 있는 재밌는 프로그래밍 언어입니다. Return 커맨드는 I'LL BE BACK, EqualTo는 YOU ARE NOT YOU YOU ARE ME, 그리고 False는 I LIED라고 합니다.
이렇게 다양한 언어로 세상과 조우 해봤습니다. 그럼 여기서 한 가지 의문이 들기 시작합니다. 그럼 컴퓨터가 우리의 언어를 어떻게 알아듣는 것일까요? 바로 번역기가 있기 때문입니다. 바로 '컴파일러(compiler)'입니다.
컴파일러
구글 번역 요즘 전 해외여행을 가도 두렵지가 않습니다. 바로 구글 번역기가 있기 때문이죠. 앱을 실행하고 한국어로 말합니다. 그리고 번역될 언어를 선택하면 그 나라에 맞게 번역되어 낯선 외국인들과 소통할 수 있습니다. 만약 좀 더 원활한 소통을 하고 싶다면 '통역가를' 초대합니다. 통역가는 좀 더 부드럽고 정확한 소통을 가능하게 해줍니다. 이것이 번역의 힘입니다.
고급언어라는 사람과 기계어라는 외계인 사이에도 번역을 해주는 통역가가 있습니다. 바로 '컴파일러'입니다. 고급언어로 작성된 소스는 컴퓨터가 바로 이해할 수 없습니다. 우리가 0과 1이 가득한 글자를 이해할 수 없는 것처럼 말이죠. 컴퓨터는 우리의 언어를 배울 생각이 전혀 없다고 말씀드렸습니다. 그러므로 이진수로 된 기계어만 고집하니다. 그래서 개발자들은 컴파일러라는 번역기를 개발하였습니다. 작성된 고급언어의 명령들을 기계어로 번역하는 프로그램을 말이죠. 우린 이 똑똑하고 듬직한 통역가를 믿고 우리만의 언어로 코드를 작성할 수 있게 되었습니다.
컴파일러는 프로그램을 컴파일합니다. 이 말은 코드로 작성된 프로그램을 다른 언어로 변환한다는 뜻입니다.
이 말은 한 언어로 컴파일러도 컴퓨터 프로그램입니다. 컴파일러는 보통 고급 언어를 저급 언어로 변환하는 방식으로 작동합니다. 프로그램을 컴파일러를 통해 실행하는 경우, 다음과 같은 작업이 일어납니다.
1. 코드를 작성한다.
2. 코드를 컴파일한다.
3. 컴파일러가 다른 컴퓨터에서 실행할 수 있는 프로그램을 생성한다.
4. 생성된 프로그램을 실행한다
자바와 C 언어 같은 다양한 언어들이 컴파일러에 의해 컴파일되어 실행되지만 파이썬이나 자바스크립트 같은 스크립팅 언어들은 인터프리터에 의해 실행 됩니다. 이 언어들은 인터프리터(interpreter)라는 통역기를 거
쳐 실행됩니다. 인터프리터는 프로그램을 저급 언어로 변환하지 않고 바로 실행해줍니다.. 인터프리터로 프로그램을 실행할 때는 다음과 같은 작업이 컴파일 언어보다 훨씬 단순하게 과정이 처리되는 것을 확인하실 수 있습니다.
1. 프로그램을 작성한다.
2. 인터프리터 안에서 프로그램을 실행한다.
만약 컴파일러가 없었다면 저는 오늘도 자바를 코딩할때 '010100111' 두 개의 숫자를 코딩을 하는 신세가 되었을 것입니다. 참 다행입니다.
작고 네모난 외계인과의 블록버스터
어느 날 등장한 기계어만 고집하는 컴퓨터와 소통하기 위한 개발자들의 노력으로 우린 코딩과 프로그래밍을 할 수 있게 되었습니다. 영화 '컨택트'에서 등장한 외계인과 인간의 조우보다 더 흥미진진한 컴퓨터와 조우를 한 편의 블록버스터 영화처럼 상영하였습니다. 하지만 인간은 아직도 컴퓨터와 소통을 위한 노력은 여전히 진행 중입니다. 키보드를 벗어나 마우스 클릭만으로 또는 목소리만으로 코딩을 할 수 있도록 점차 발전하고 있습니다. 좀 더 미래에는 컴퓨터가 스스로 생각하여 코딩할 수 있게 발전하지 않을까요?어쩌면 우린 영화 속 이야기보다 더 영화 속 같은 세상 속을 살아가는 건 아닐까요?
"자 이제 그럼!
코딩으로 컴퓨터 외계인과의 동행을 시작해 볼까요?"
* 출처
- '동아출판 프라임 영한사전'