1. 프로시저를 써서 요약하는 방법

  • 계산 프로세스(computational process)란 컴퓨터 속에서 데이터(data)를 조작해 어떤 일을 수행하는 것이다.
  • 프로세스(process)란 사람이 만든 규칙에 따라 어떤 일을 수행하는 것이다.
  • 프로그램(program)이란 프로세서의 정의 중 “사람이 만든 규칙”에 해당한다. 즉, 프로세스는 프로그램에 따라 어떤 일을 수행하는 것을 의미한다.

컴퓨터 프로그램은 여러 가지 표현식(symbolic expression)으로 구성되며, 이 표현식을 작성하는데 사용하는 말을 프로그래밍 언어(programming language)라고 한다.

인간은 생각을 글로 옮겨 적을 때는 한국어나 영어와 같은 자연어(natural language)를 사용하는 반면, 컴퓨터 프로세스를 나타낼 떄에는 프로그래밍 언어를 사용한다.

1.1 프로그램을 짤 떄 바탕이 되는 것

프로그래밍 언어는 “프로세스에 대한 사람의 생각을 짜임새 있게 담아내는 틀(framework)”이다. 단지 컴퓨터가 수행할 일을 지시하는 수단이 아닌 것이다.

좋은 프로그래밍 언어는 다음의 조건을 갖춰야 한다.

  1. 기본 식(primitive expression): 언어의 가장 단순한 것을 나타낸다.
  2. 엮어내는 수단(means of combination): 간단한 것을 모아 복잡한 것(compound element)으로 만든다.
  3. 요약하는 수단(means of abstraction): 복잡한 것에 이름을 붙여 하나로 다룰 수 있게 간추린다.

프로그램은 프로시저(procedure)와 데이터(data) 두 가지 용어를 사용해 설명할 수 있다. 이 둘이 반드시 명확히 구분되는 것은 아니다.

  • 프로시저(procedure): 데이터를 처리하는 규칙을 적은 것.
  • 데이터(data): 프로시저에서 가공하려는 대상.

1.1.1 식

Scheme 실행기의 경우, 식(expression)을 쳐 넣으면 셈(evaluation)을 거쳐 해당 값을 출력한다.

예를 들어, 486이라고 실행기에 입력하면 다음처럼 답한다.

Simple Expression

위의 식은 “수를 나타낸 식”이며, 그 자신을 값으로 돌려준다. 반면, +, -, *, / 와 같은 기호들은 “기본 프로시저(primitive procedure)”를 의미한다. 이 둘을 조합하면 다음과 같은 “복잡한 식(compound expression)”을 작성할 수 있다.

Example

(+ 137 349)

Output

486

여기서, “여러 식을 괄호로 묶어 리스트를 만들고 프로시저 적용(procedure application)을 뜻하도록 엮어놓은 식”을 엮은식(combination)이라고 부른다. 맨 왼쪽에 있는 식은 연산자(operator)가 되고 나머지 식은 피연산자(operand)들이 된다. 즉, 셈을 통해 도출되는 값은 피연산자에 해당하는 인자(argument)에 연산자에 해당하는 프로시저를 적용(apply)해 얻는다. 이처럼 연산자를 피연산자의 앞에 두는 방식을 앞가지 쓰기(prefix notation)라고 부른다.

식이 복잡해도 실행기가 하는 일은 항상 같다.

  1. 식을 읽어들인다 (read)
  2. 값을 구한다 (evaluate)
  3. 구한 값을 찍는다 (print)

이를 보통, 읽고 셈하고 찍는 일의 되풀이(read-eval-print loop)라고 한다.

1.1.2 이름과 환경

프로그래밍 언어에서 중요한 기능 중 하나는 계산 물체(computational object)에 이름을 붙이는 것(naming)이다. 이때 이름은 변수(variable)가 되고 그 변수의 값(value)은 계산 물체가 된다.

Scheme에서는 이름을 지을 때 define을 쓴다.

Example

(define size 2)
(* size 5)

Output

10

define을 활용해 둘레(circumference)를 구하는 식은 다음과 같다.

Example

(define pi 3.14159)
(define radius 10)
(define circumference (* 2 pi radius))

Output

62.8318

이처럼 복잡한 식에 이름을 붙이는 까닭은 다음과 같다.

  1. 계산식은 복잡해지기 쉽기 때문에 사람이 그것을 일일이 외워서 작성하기 어렵다.
  2. 복잡한 프로그램을 작성하기 위해서는 작고 단순한 대상에서 점차 복잡한 대상으로 만들어가는 방식을 따라야 한다.

실행기의 기능으로 미루어 실행기 속 어딘가에 이름-물체(name-object)의 쌍을 저장해 두는 메모리(memory)가 있다는 것을 유추할 수 있다. 이 기억 공간을 환경(environment)이라고 부르며, 이 경우는 맨 바깥쪽에 있는 바탕 환경(global environment)라고 부른다.

1.1.3 엮은식(combination)을 계산하는 방법

// …

1.2 프로시저와 프로세스

// …

1.3 차수 높은 프로시저(higher-order procedure)로 요약하는 방법