Programming

1.1. 프로그래밍 언어 개요

CECRI 2010. 12. 25. 22:40
프로그래밍 언어는 크게 두가지 종류로 나뉜다. 그중 하나는 명령형 프로그래밍 언어(imperative programming language, http://en.wikipedia.org/wiki/Imperative_programming) 이고 다른 하나는 함수형 프로그래밍 언어(functional programming language, http://en.wikipedia.org/wiki/Functional_programming)이다. 사실 이것은 분류의 한가지 방법일뿐 객체지향을 중요하게 생각하는 사람이면 OOP/ Non OOP로 나눌 수도 있고, 이런 방식으로 나누면 stack을 이용하는 forth나 논리형 프로그램언어인 prolog는 자리가 애매해 지기도 한다. 하지만 내가 이러한 방식으로 프로그래밍 언어를 나눈 것은 이러한 분류방법이 컴퓨터 모델에 대한 가장 큰 두가지 방식과 일치하기 때문이다. 


컴퓨터는 무엇을 계산가능할까? 또 어떤 종류의 문제들을 빨리 계산할수 있을 것인가? 이러한 의문에 답해주는 것이 계산이론(Theory of computation, http://en.wikipedia.org/wiki/Computational_theory)이다. 이것은 논리학을 가지고 컴퓨터가 어느것을 계산할수 있는지와 없는지를 알려준다. 이 이론을 전개하는 방식은 여러가지가 있는데, 그중 대표적인 두가지 방식이 튜링머신(Turing Machine, http://en.wikipedia.org/wiki/Turing_machine)과 람다대수(Lambda calculus, http://en.wikipedia.org/wiki/Lambda_calculus) 이다. 


튜링머신은 앤런 튜링이라는 사람이 만든 컴퓨터의 모델로 기본적으로 무한한 메모리와 몇가지 명령어로 계산하는 컴퓨터의 수학적 모델이다. 너무 자세히 들어가면 복잡해 지니 기본적인 개념만 살펴보자. 기본적으로 튜링머신은 자신의 상태, 무한한 테이프, 다음에 읽을 테이프의 위치 그리고 입력과 상태에 따라서 다음 상태를 알려주는 상태표로 결정된다. 컴퓨터 구조에 익숙한 사람이라면 기본적인 폰 노이만 모델을 떠올릴 수 있을 것이다. 현대 컴퓨터로는 상태는 CPU의 register 값들, 테이프는 메모리, 다음에 읽을 위치는 PC, 상태전이표는 CPU명령어(어셈블리어 명령)에 대응한다. 이때 가장 중요한 특징은 순차적으고 메모리를 사용한다는 것이다. 이것은 명령형 프로그래밍 언어의 모델이된다. 즉, 메모리는 각각의 변수에 대응되고 순차적으로 상태를 바꾸는 것이 변수들의 값을 바꾸고 반복문과 조건문을 이용하는 것이 된다. 


그렇다면 람다대수는 어떻게 되는 것인가? 람다대수도 튜링머신과 완전히 동등하게 컴퓨터를 묘사한다. 하지만 람다대수에는 메모리나 상태같은 것이 없다. 대신 함수를 통해 그것을 나타낸다. 또한 반복문 대신 재귀호출을 통해 연속된 것을 표현한다. 또한 함수는 가장 기본적인 형태로 함수가 함수의 인자로 들어가는 것이 매우 자연스럽다. 이것들이 가장 큰 특징이자 다른 점이다. 자세한 것을 실제 프로그래밍을 통해 알아보도록 하자.


하지만 보통의 프로그래밍 언어에서 이러한 두가지 방법이 완전히 구분되지는 않는다. 명령형 프로그래밍 언어라고 하더라도 어느정도 함수형 언어의 기능을 가지고 있고 함수형 프로그래밍 언어라고 하더라도 어느정도는 멍령형의 특징을 가지게 된다. 특히나 우리가 사용하는 컴퓨터는 튜링머신에 기반을 둔 모델로 만들어졌기 때문에 함수형 프로그래밍언어도 실행될때의 모습은 순차적인 명령형 프로그램을 수 밖에 없다. 


다음부터는 Python과 Caml 프로그래밍 언어를 통해 두개의 다른 프로그래밍 언어들의 특징을 알아보도록 하자.