Program Arcade Games
With Python And PygameChapter 2: 컴퓨터 언어란 무엇인가?
무엇이 컴퓨터 언어(프로그래밍 언어)를 만드는가? 컴퓨터 언어는 왜 사용하는가? 왜 여러 종류의 컴퓨터 언어가 존재하는가?
자동차를 운전하기 위해 엔진의 원리를 이해할 필요까지는 없듯이, 기본적인 프로그래밍을 하기 위해 위 질문들에 대한 답을 꼭 알아야 하는 것은 아니다. 하지만 상급자 레벨로 더 나아가기 위해서는 알아 둘 필요도 있다. 이 번 Chapter에서는 프로그래밍을 시작하기 위한 간략한 설명을 하겠다.
2.1 프로그래밍에 대한 간략한 역사
컴퓨터는 전자기기이며 디지털(digital)이다. 컴퓨터입장에서는 회로상에 전압이 있거나, 혹은 없거나 하는 것이 전부이다. 전압이 없다는 것은 0을 의미하고, 어떤 전압 값이 있다는 것은 1을 의미한다. 컴퓨터는 여러개의 0과 1의 조합을 가지고 계산을 할 뿐, 그 이상도 이하도 아니다.
초창기에는, 컴퓨터 메모리에 0과 1을 저장하기 위해 스위치를 사용 했다. Figure 2.1, courtesy of Wikimedia Commons, 은 Altair 8800 이라는 최초의 개인용 컴퓨터를 보여 준다 . 전면 패널의 스위치들이 프로그램을 로딩하기 위해 사용되었다. 꼬마전구불빛은 출력을 보여주며, 모니터는 따로 없었다.
각 각의 on/off 스위치 세트들은 숫자를 표시한다. 각 숫자는 컴퓨터가 수행할 명령이나 데이터를 표현한다. 이렇게 오직 0과 1의 조합으로 숫자를 표시하는 것을 바이너리(Binary) 넘버 시스템이라고 한다.(이진표기법) 이런 형태의 컴퓨터 언어를 1GL(First Generation Language)라고 하기도 한다. 주: 실제 1GL이라는 프로그래밍 언어는 없으며 단지 First Generation Language의 약어이다. 1GL 은 숫자로만 프로그램을 위한 명령과 데이터를 표시하므로 기계어와 같다고 할 수 있다.
이진수는 보통 4개 묶음 단위로 표시를 한다 예를 들면:
1010 0010 0011
데이터와 명령어 모두 이진수 형태로 저장된다. 기계어라는 것은 컴퓨터가 수행할 명령들을 이진숫자로 표시한 것이다. 하지만 모든 이진 데이터가 기계어인것은 아니다. 문서, 데이터베이스, 회계관련숫자들 또한 컴퓨터에 이진수 형태로 저장되지만, 컴퓨터에 의해 수행되는 명령어는 아니다.
스위치로 프로그램을 입력하던 것이 16진수 코드를 사용함으로써 개선되었다. 대부분 사람들이 사용하는 10진수는 0~9까지 숫자를 사용한다. 16진수는 0~9숫자와 A~F문자를 이용하여 4개의 이진스위치 묶음 또는 0 ~ 15까지의 숫자를 표시한다. 아래 표는 이진수, 10진수, 16진수가 어떻게 연관되어 있는지를 보여준다
Binary | Decimal | Hexadecimal |
0 | 0 | 0 |
1 | 1 | 1 |
10 | 2 | 2 |
11 | 3 | 3 |
100 | 4 | 4 |
101 | 5 | 5 |
110 | 6 | 6 |
111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | A |
1011 | 11 | B |
1100 | 12 | C |
1101 | 13 | D |
1110 | 14 | E |
1111 | 15 | F |
1 0000 | 16 | 10 |
1 0001 | 17 | 11 |
이 후 프로그램 작성을 쉽게 하기 위해, 사용자들은 어셈블리어-assembly language라는 형태를 사용 할 수 있게 되었다. 각 각의 명령어 들은 니모닉(mnemonic)으로 작성이 되고, 컴파일러라는 프로그램이 이 니모닉을 컴퓨터가 이해할 수 있는 숫자형태로 바꿔주게 된다. 어셈블리어는 2GL 언어(Second Generation Language) 라고도 부른다.
Figure 2.2 은 어셈블리어 프로그램의 일부를 보여 준다. 또한 링크를 참고하라. courtesy of the Wikimedia Commons.
개선되긴 했지만, 여전히 프로그램 하기가 쉽지는 않다. 다음 세대 프로그램 언어는 좀더 높은 레벨의 추상화를 시도하게 된다. 3세대 언어의 첫번째 주자는 (COBOL, FORTRAN 그리고 LISP) 라고 할 수 있는데 기존 보다 훨신 이해하고 프로그래밍 하기 쉽게 발전 하였다.
2세대와 3세대 프로그램 언어는 컴파일러(compiler)라고 부르는 프로그램을 사용하게 된다. 컴파일러는 프로그래머에 의해 작성된 프로그램 (보통 소스 코드(source code)라고 부르는)을 기계언어로 변환하는 작업을 한다. 컴퓨터는 원본 소스 코드를 실행하는 것이 아니라, 컴파일된 기계어를 실행시키는 것이다.
만약 하나의 프로그램안에 여러개의 소스코드가 존재한다면 이들은 서로 연결(링크)되어야 하는데, 이는 링커(linker)라는 프로그램이 담당하게 된다. 링커는 컴파일러에 의해 생성된 기계어들을 서로 연결하여 최종 프로그램을 생성하는 역할을 한다. 이렇게 생성된 최종 프로그램 파일이 실행되는 것이며, 최종 프로그램 파일이 생성되면 원래 소스 코드는 필요 없게 된다.
기계어로 컴파일링한 것의 단점은 해당 프로그램이 특정 머신에서만 돌아 간다는 것이다. 윈도우 컴퓨터를 위해 컴파일된 프로그램은 애플, 맥, 리눅스에서는 실행되지 않는다.
초급 프로그래머에게는 컴파일과 링크의 전반적 과정이 다소 복잡해 보일 수 있기에 일부 언어에서는 대신인터프리터(interpreters)를 사용하기도 한다.. 이런 류의 프로그램은 소스코드를 바로 기계어로 해석하게 되므로, 해당 플랫폼에서 사용 가능한 인터프리터만 있다면 여러 플랫폼(윈도우, 맥, 유닉스 등)에서 구동 시키는 것이 가능하다.
인터프리터 사용의 단점은 기계어로 컴파일된 코드를 실행시키는 것 보다는 실행 속도가 좀 더 느리다는 것이다.
파이썬은 인터프리터 언어 중 하나이다. C보다는 파이썬으로 개발하는 것이 더 쉽지만 실행 속도가 상대적으로 느리고 파이썬 인터프리터가 있어야 한다.
Java와 같은 언어들은 프로그램이 기계어로 컴파일된 후 실제 머신이 아닌 가상머신(JVM)에서 실행된다. 인기 있는 언어 중 하나인 C#, Common Language Infrastructure (CLI)는 가상실행시스템(VES) 에서 돌아간다. 이 부분에 대한 깊이 있는 얘기는 이 책의 범위를 넘어서는 것이므로, 위키디피아 링크를 참고하여 읽어 보기 바란다.
오늘날 여러가지의 프로그래밍 언어가 존재한다. 컴퓨터가 워낙 다양한 작업을 수행하므로 프로그램 언어도 그러한 작업들에 최적화되어 개발 되어 왔다. C와 같은 언어는 운영체제나 작은 임베디드 컴퓨터에 적합하다. PHP 와 같은 언어는 웹페이지 개발에 특화 되어 있다. Python 은 사용하기 쉽다는 것에 특화된 범용적인 프로그램 언어라 할 수 있겠다.
Tiobe와 같은 회사들은 매달 업데이트되는 그들의 index를 통해 프로그램 언어의 인기도를 조사 해 놓고 있다. DICE와 같은 사이트의 구인란을 보면서 요즘 어떤 종류의 프로그래머를 많이 찾는지에 대한 정보를 보는 것도 동향을 파악하는데 좋은 아이디어 이다
다행히도 대부분의 프로그램 언어들이 유사한 연산자들을 사용하고 있으며, 하나의 언어를 배우면 비슷한 이론이 다른 언어에 유사하게 적용 될 수 있어 배우는 수고를 덜 수 있다.
컴퓨터의 오락적 기능에 대한 역사를 알고 싶다면 Robert X Cringley가 제작한 :Triumph of the Nerds를 보기를 추천한다. 컴퓨터의 기원에 대해 3개의 파트로 나눠 설명하는 다큐멘터리 형식인데, 모든 가족이 즐기기에 충분히 재미있게 구성되어 있다. 추천할 만한 책으로는Accidental Empires를 읽어 보길 권한다.
이 비디오들 뒤에는 무슨 일이 일어났는가? 심지어 인터넷의 탄생에 대해서도 다루지 않았다! 그러면 다음 비디오 시리즈를 감상해 보라. Nerds 2.0.1 이 또한 Robert X Cringely가 제작했다.
2.2 Review
2.2.1 Multiple Choice Quiz
Click here for a multiple-choice quiz.
2.2.2 Short Answer Worksheet
Click here for the chapter worksheet.
2.2.3 Lab
Click here for the chapter lab.
You are not logged in. Log in here and track your progress.
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin