프로그래밍 언어론 1-2강. 프로그래밍 언어의 스펙트럼

[프로그래밍 언어론]

2019. 10. 13. 00:12

수많은 언어들은 계산 모델(model of computation) 기반으로 구별이 가능하다.

 

 

[프로그래밍 언어의 분류]

1. 선언형(declarative)

  : 컴퓨터가 무슨일(What)을 해야하는지에 집중

  : 속성은 선언되지만, 실행 절차는 지정되지 않음

  ex)
    prolog : 이 언어는 프로그래머가 어떤 방법으로 답을 계산하는지 정의하지 않고, 관계를 정하거나, 어떤 관계인지 묻는 질문을 한다.
    SQL : insert, delete명령
    HTML : 페이지가 HTML에서 무엇을 보여줘야하는지 선언

 

2. 명령형(imperative)

  : 컴퓨터가 어떻게(How) 일을 하는지에 집중

  : 주로 성능상의 이유로 우세하다(더 빠름)

 

 

[각 분류의 언어들의 주요 세부 분류(subfamilies)]

: 구별 했지만 오늘날엔 서로 섞이고 있음. 주된 부분이 이렇게 나뉜다라는 관점에서 보기!

- 선언형(Declarative)

  1) 함수형 언어(Functional language)        예시) Lisp, ML, Haskell 등

    : 재귀(recursive) 기반의 계산 모델(반복문 개념 없음)

    : 람다 대수 기반

    : 함수가 기본이 되는 언어(함수로 모든것을 구현한다 보면 된다)

    

  2) 데이터 흐름 언어(DataFlow language)        예시) Id, Val등

    : 정보의 흐름(토큰)을 모델화 하는 언어

    

  3) 논리 및 유추 기반 언어(Logic or constaint-based language)        예시) Prolog, SQL등

    : 명확한 관계가 성립되는 값을 찾기위한 시도를 모델화 하는 언어

    

– 명령형(Imperative)

  1) 폰 노이만 언어(Von Neumann languages) = 절차적 언어(monolithic)        예시) Fortran, Pascal, Basic, C등

    : 대부분의 언어가 여기에 속함

    : 계산의 기본 수단은 값의 수정, 함수는 값의 표현 기반

    : 메모리의 값을 바꾸는 Side effect(함수나 표현이 변수의 값을 바꿈) 기반

    (함수형 언어는 내부적으로 일어나는 일이 외부에 영향을 주지 않지만, 이 언어들은 내부적으로 전역변수 값에 영향을 줄 수가 있다.)

 

  2) 객체지향 언어(Object-oriented languages)            예시)Smalltalk(완전 OOP), C++과 JAVA(완전한 OOP는 아님)

    : 본 노이만 언어와 유사하지만, 메모리와 계산간에 더 구조적인 모델이 존재.

    : 반독립 객체(semi-independent ojbects)들간의 상호작용 중심

      – 반독립 객체 : 독립된 상태(변수)와 실행가능한 함수의 조합.

    

  3) 스크립팅 언어(Scripting Language)                      예시) csh와 bash, awk, PHP와 JS, Lua, python, Perl, Ruby, Tcl

  : 폰 노이만 언어의 부분(subset) 집합이다.

  : 보통 해당 문맥이 좌표(coordinating) 요소 아니면

   “접합(gluing together)” 요소에 주안점을 두는지로 구별된다.

    – 접합 : 다른 언어, 라이브러리(다른 언어것도)들과 잘 연동되는 특성.

 

 

[세부분류별 간단한 예시(GCD 알고리즘- 최대공약수)]

a와 b의 gcd를 계산하기 위해선, a와 b의 값이 같은지 검사해라.
만약 같으면 이중 하나를 출력하고 멈춰라.
같지 않으면, 이중 큰 값을 두 값의 차이값으로 교체하고 위 과정을 반복해라.

1. 명령형 언어(imperative)  ex) C

1
2
3
4
5
6
int gcd(int a, int b){
while (a!= b){
if (a > b){ a = a-b; }
else{ b = b-a; }
return a;
}
cs

: 매우 명령적

 

2. 함수형 언어(Functional)  ex)Ocaml

1
2
3
4
lef rec gcd a b = 
if a = b then a
else if a > b then gcd b (a-b)
else gcd a (b-a)
cs

: 입출력간 수학적 관계 강조(재귀)

 

3. 논리형 언어(Logic)  ex)prolog

1
2
3
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).
cs

: 원하는 값을 찾기위해 규칙 증명과 공리의 집합 사용

 

 

[결론]

– 언어들 간에 명확한 경계가 없다.

  (대부분의 함수, 논리 언어들이 명령형의 특징을 포함)

함수형 언어에서 반복문 사용하기도 하고,
C++, JAVA 같은데서 객체지향적이 아닌 절차적으로 계산과정 작동 시킬수 있고,
Python에서 객체지향형으로 함수 작성할 수도 있다.

 

 

 

 

 

프로그래밍 언어들을 계산 모델 기반으로 구별할수 있다.
- 선언형(declartive) : 컴퓨터가 무슨 일을 하는지에 집중(what)
- 명령형(imperative) : 컴퓨터가 어떻게 일을 하는지에 집중(how)

두 분류를 또 세부분류로 나눌수 있다.
[선언형]
1) 함수형 언어 : 재귀 기반, 함수로 모든것을 구현
2) 데이터흐름 언어 : 정보의 흐름을 모델화
3) 논리 및 유추 기반 언어 : 명확한 관계 성립하는 값 찾는 시도를 모델화
[명령형]
1) 폰 노이만 언어 : 절차적 언어. 메모리 값 변경 side effect.
2) 객체지향 언어 : 객체(변수+메소드)들간 상호작용 중심
3) 스크립트 언어 : 접합에 주안점.(폰 노이만 의 부분 집합)

오늘날에 언어들간 명확한 경계 없다.(대부분의 언어가 다른 특성 가지곤 함)