0. 프로그래밍 언어 스펙트럼
프로그래밍 언어 스펙트럼을 살펴보자.
computation(연산)의 modle을 기준으로 분류할 수 있다.
이 스펙트럼의 가장 상위 분류에는 "선언적(Declarative)" 언어와 "명령적(Imperative)" 언어가 있다.
소 제목은 각 분류의 언어들의 주요 세부 분류(subfamilies)
1. 선언적(Declarative) 언어
선언적 언어는 주로 "컴퓨터가 무엇(WHAT)을 해야 하는가"에 중점을 둔다.
프로그래머는 원하는 결과물 또는 속성을 선언한다.
어떤 순서로 실행해야 하는지를 명시하지 않는다.
선언적 언어의 하위분류로는
함수형(Functional), 데이터플로우(Dataflow), 논리 또는 제약 기반(Logic or Constrained-Based) 언어 등이 있다.
어떠한 입력이 오면, 컴퓨터가 어떤 동작(What to do)을 할 거야! 를 선언
1-1. Functional Languages
재귀적 정의 기반의 계산 모델이다.
변수 개념이 없다.
ex) Lisp, ML, Haskell
1-2. Dataflow Languages
정보의 흐름을 모델화 하는 언어이다.
ex) Id, Val, LabView
1-3. Logic or Constraint-based Language
계산을 특정한 관계를 만족하는 값들을 찾으려는 시도로 모델링하며,
논리적 규칙의 목록을 통한 목표 지향적인 검색을 사용하는 언어이다.
ex) Prolog, SQL
2. 명령적(Imperative) 언어
명령적 언어는 "컴퓨터가 어떻게(HOW) 해야 하는가"에 중점을 둔다.
프로그래머는 컴퓨터에게 실행할 일련의 동작을 순차적으로 명시한다.
주로 액션 중심적인(Action-Oriented) 관점을 가지고,
계산을 일련의 동작의 시퀀스로 본다고 이해한다.
주로, 성능상의 이유로 우세하다고 한다.
명령적 언어의 하위분류로는
폰 노이만 아키텍처(Von Neumann), 객체 지향(Object-Oriented), 스크립팅(Scripting) 언어 등이 있다.
2-1. Von Neumann Languages
명령적(imperative) 언어를 가리킨다.
사이드 이펙트(side effect)가 발생할 수 있는 언어이다.
사이드 이펙트(부수적인 효과 or 부작용) 이란 함수나 표현식이 값을 반환하는 것 외에도 어떤 상태를 변경하는 경우를 의미한다.
von Neumann 아키텍처를 따르는 컴퓨터 시스템에서는 주로 메모리의 내용을 변경하는 작업을 수행하며,
이로 인해 사이드 이펙트가 발생할 수 있다.
ex) Fortran, Pascal, Basic, C 등
2-2. Object-Oriented Languages
객체 지향 언어로써, 반 독립적인 객체 간의 상호작용을 중심으로 작동된다.
반독립적인 객체 : 프로그램은 서로 상호 작용하는 객체의 집합으로 구성된다.
각 객체는 자체의 상태(속성)와 동작(메서드)을 가지고 있으며, 다른 객체와 상호 작용하면서 작업을 수행한다.
(이를 테면, 자동차의 모양, 부품 등의 "상태"라고 하고, 자동차의 움직임에 관한 이야기를 "동작"으로 두고, 이를 나누어 코드를 구조화)
이렇게 하면 프로그램을 모듈화 하고 복잡성을 줄일 수 있다.
ex) Smalltalk (가장 pure 한 객체지향 언어) , C++과 JAVA, CLOS and OCaml (객체 지향의 성격을 가지고 있는 함수형 언어)
2-3. Scripting Languages
주변 환경에서 가져온 구성 요소들을 조율하거나 "붙이는" 데 중점을 둔 언어이다.
ex) csh와 bash, awk, PHP와 JS, Lua, python, Perl, Ruby, Tcl
3. GCD 예시를 통한 Imperative Language vs Funtional Language vs Logic Language
3-1. Imperative Language
명령적 언어를 사용하여 GCD를 계산할 때, 두 수 a와 b가 같은지 확인하고 같다면 그중 하나를 출력하고 종료한다.
그렇지 않으면 두 수 중, 큰 수를 구하고 그 차이로 두 수 중 큰 수를 대체하고 계속 반복한다. // C 언어
int gcd(int a, int b) {
while (a != b) {
if (a > b)
a = a - b;
else
b = b - a;
}
return a;
}
3-2. Funtional Language
함수형 언어를 사용하여 GCD를 계산할 때, 수학적 관계에 중점을 둔다.
a와 b의 GCD는
(1) a와 b가 같으면 a이며 / (2) a가 b보다 크면 b와 (a - b)의 GCD이며 / (3) b가 a보다 크면 a와 (b - a)의 GCD이다.
이 정의를 확장하고 간소화하여 GCD를 계산한다. // OCaml
let rec gcd a b =
if a = b then a
else if a > b then gcd b (a - b)
else gcd a (b - a)
3-3. Logic Language
논리 언어를 사용하여 GCD를 계산할 때,
프로그래머는 일련의 공리와 증명 규칙을 지정하여 시스템이 원하는 값을 찾도록 한다. // Prolog 언어
gcd(A, B, G) :- A = B, G = A.
gcd(A, B, G) :- A > B, C is A - B, gcd(C, B, G).
gcd(A, B, G) :- B > A, C is B - A, gcd(C, A, G).
#. 결론
프로그래밍 언어들 간의 경계가 명확하지 않다.