프로그래밍 언어 공부하기

프로그래밍 언어는 컴퓨터 프로그램을 만들기 위해서 알 필요가 있다. 어떻게 공부하면 좋은가.

먼저, 컴퓨터가 어떻게 작동하는지 알 필요가 있다. 컴퓨터 공학을 정식으로 전공하지 않은 사람들이나 컴퓨터의 구조와 작동원리에 대해서 구체적으로 공부하지 않은 사람들에게 컴퓨터라는 기계는 키보드와 마우스를 움직여서 뭔가를 입력하면 모니터에 원하는 그림을 그려주는 장치일 뿐이다. 그렇다면 프로그래밍을 공부하기 위해서 컴퓨터라는 기계는 어떻게 이해해야 할 것인가?

컴퓨터는 연산장치, 기억장치, 제어장치, 입력장치, 출력장치로 되어 있다. 다른 형태로 되어 있는 컴퓨터가 있는지, 만들어질 것인지는 나도 잘 모르겠지만, 우리가 현재 컴퓨터라고 부르는 모든 장치는 모두 저 다섯가지 기본 요소를 갖고 있다. 믿을 수 없겠지만, 당신이 지금 사용하고 있는 모든 프로그램, 운영체제라든가, 워드, 엑셀, 게임 같은 것들은 모두 저 다섯가지 기능의 조합으로 이루어진 것이다. 저것들이 구체적으로 어떻게 작동하는가는 굉장히 복잡한 내용이다. 하지만 프로그래밍을 하기 위해서 알아야 하는 것은 저 다섯가지 장치의 역할들이다.

먼저, 연산장치는 연산을 담당한다. 여기서 말하는 연산이란 숫자를 갖고 하는 사칙연산이다. 그거 맞다. 덧셈, 뺄셈, 곱셈, 나눗셈을 말한다. 연산장치는 외부에서 숫자 두개를 받아서 원하는 사칙연산을 한 후, 그 결과물을 밖으로 내보낸다. 연산장치에 숫자를 전해주거나 그 결과물을 받는 것은 기억장치이다. 기억장치는 그 내부에 숫자를 저장할 수 있는 공간을 여러개 갖고 있는데, 위치를 알려주면 그 위치에 저장된 숫자를 알려주거나, 반대로 위치와 숫자를 넣으면 그 위치에 숫자를 저장하는 기능이 있다. 제어장치는 연산장치에 어떤 연산을 할지 정하거나, 숫자를 기억장치의 어떤 위치에 넣거나 읽어올지 정하는 장치다. 입력장치는 사용자에게서 숫자를 입력받을 수 있다. 정확히 말하면, 기억장치에 숫자를 입력하는 모든 장치를 입력장치라고 한다. 출력장치는 기억장치에 저장된 숫자를 읽어서 외부에서 알 수 있게 내보내는 장치이다. 모든 컴퓨터 프로그래밍 언어에는 컴퓨터가 갖고 있는 이 다섯가지 기능을 사용할 수 있는 명령어가 있다.

컴퓨터 프로그래밍 언어는 고수준 언어, 저수준 언어, 이런 것들이 있다.(고 한다.) 그것들을 어떤 기준으로 어떻게 구분하는가는 별로 중요한 문제가 아니고, 저수준 언어는 기계어, 어셈블리어가 있고 나머지는 다 고수준 언어라고 생각하면 된다. 특이한 예외로 C언어는 저수준 언어의 특징과 고수준 언어의 특징을 모두 갖고 있는 언어이다.

예를 들어서, C언어를 생각해 보자. C언어는 가장 널리 쓰이고 있는 언어 중 하나이고, 아마 우리가 살아있을 동안은 계속해서 쓰일 언어이다. C언어에서는 그럼 위의 다섯가지 기능이 어떻게 구현되어 있을까?

먼저, 기억장치는 변수 선언을 통해서 이용할 수 있다.

int a=0;

자, 이런 명령을 쓰게 되면 a라는 이름을 가지는 변수가 생기고 거기에는 0이라는 정수가 들어간다. 이 때, a라는 이름은 실제로는 기억장치의 어딘가에 있는 주소와 연결되어 있다. 그 주소는 실제로는 굉장히 길고 복잡한 숫자로 되어 있는데, 그 주소를 a라고 부르는 것이다.

연산장치는 +, -, *, /라는 네가지 연산자를 통해서 사용할 수 있다. 물론 여러분이 알고 있는 그 기호 맞다. a와 b라는 두 변수에 숫자를 저장해 두었다고 할 때 a+b라고 쓰면 연산장치는 a에 있는 수와 b에 있는 수를 불러와서 더하는 역할을 한다. c=a+b라고 하면 a+b를 계산한 결과를 변수 c에 저장한다.

제어장치는 연산장치가 어떤 연산을 어떤 순서로 수행해야 하는지 정해준다. 별다른 지시사항이 없다면 컴퓨터는 시키는 순서대로 연산을 수행한다. 하지만 우리가 실제로 컴퓨터에게 일을 시키다보면 어떤 조건에 따라서 다른 연산을 수행하거나, 특정한 일을 반복하거나 해야 한다. 예를 들어 아무 생각 없이 a+b를 10번 계산해야 한다면, 프로그램에 a+b를 10번 써야 한다. 하지만 이렇게 되면 우리가 생각할 수 있는 모든 경우의 수를 모두 고려하여 처음부터 프로그램에 다 써넣어야 하기 때문에 굉장히 괴로워 질 것이다. 따라서 a+b를 10번 수행하라는 명령 그 자체를 입력할 수 있다면 편리하다. 이 때 사용하는 명령어가 if, for, while과 같은 제어문이다. goto도 있긴 한데 goto는 금단의 명령어, 악마의 유혹, 뭐 그런거라고 알아 두면 된다. if는 조건을 비교해서 조건이 만족되면 주어진 명령어를 수행하고, 조건이 만족되지 않으면 수행하지 않는다. for는 정해진 횟수만큼 명령을 반복하고, while은 다른 입력이 있을 때 까지 명령을 무한히 반복한다.

입력장치는 키보드, 마우스와 같은 장치에서 받은 신호를 컴퓨터가 이해할 수 있는 수로 바꿔서 기억장치에 집어넣는다. 사실은 하드디스크나 다른 장치에서 들어오는 모든 신호들 역시 입력장치에서 받아올 수 있고, 랜카드나 블루투스처럼 다른 장치와 통신하는 장비 역시 입력장치의 범주에 있다고 볼 수 있다. 즉, 여기서 말하는 입력장치는 기억장치에 수를 넣을 수 있는 모든 장치를 뜻한다.입력장치에 해당하는 C언어 함수로는 scanf()함수가 있다. scanf()는 키보드에서 입력을 받아서 지정된 변수에 집어넣는다. 앞서 말했듯이 변수는 기억장치를 뜻하므로, 이렇게 받은 입력은 기억장치에 들어간다.

출력장치는 반대로 기억장치에서 수를 읽어와서 다른 장치로 보내는 역할을 한다. 예를 들어 모니터는 컴퓨터의 비디오 메모리에 있는 값을 읽어와서 화면에 점들의 밝기를 조절하여 나타낸다. 스피커라든가, 프린터라든가 하는 모든 장치는 컴퓨터가 갖고 있는 기억장치에서 수를 읽어와서 외부로 보여주는 장치라고 생각하면 된다. C언어에서는 printf()라는 함수를 제공하는데, 이 함수는 주어진 변수에서 값을 읽어와서 화면에 출력하는 역할을 한다.

우리가 실제로 사용하는 컴퓨터는 이 다섯가지 장치를 하나씩 갖고 있는 것이 아니라, 여러개를 갖고 있다. 화면에 표시할 내용을 결정하는 그래픽카드는 컴퓨터 본체와 별도로 이 다섯가지 장치를 따로 갖고 있어서 컴퓨터 본체가 해야 할 일을 줄여준다. 하지만 모든 컴퓨터 장치는 이 다섯가지 장치들의 협력으로 작동하므로, 결국 우리가 프로그램을 만든다는 것은 이것들을 어떻게 다루느냐의 문제가 되는 것이다.

이 다섯가지 장치의 역할을 좀 더 추상적으로 얘기하면 이렇게 생각할 수 있다. 컴퓨터가 하는 것은 어떤 수를 입력받아서, 다른 수로 바꿔서 내놓는 일이다. 여기서 입력받은 수에 따라서 내놓는 수는 결정되어 있으며, 어떤 방식으로 바꿀 것인지를 프로그래머가 정해주는 것이다. 그리고, 어떤 방식으로 바꿀 것인지 그 구체적인 방식 그 자체를 알고리즘이라고 한다. 예를 들어, 굉장히 무식한 방식으로 프로그램을 만든다면 1에는 1, 2에는 5, 3에는 9, 4에는 8, … 이런 식으로 결과를 내놓으라고 할 수 있다. 그것도 물론 잘 작동할 수만 있다면 괜찮은 프로그램이다. 하지만 32비트 컴퓨터가 표현할 수 있는 수가 42억개인데, 우리가 42억개의 수에 대해서 하나하나 전부 그 결과값을 지정한다면 그건 코딩이 아니라 고문이라고 해야 할 것이다. 실제 프로그래머들은 그렇게 작업하지 않는다.

(이어서…)

댓글 남기기

이메일은 공개되지 않습니다.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑

%d 블로거가 이것을 좋아합니다: