수많은 언어들은 계산 모델(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) 스크립트 언어 : 접합에 주안점.(폰 노이만 의 부분 집합) 오늘날에 언어들간 명확한 경계 없다.(대부분의 언어가 다른 특성 가지곤 함) |
'[프로그래밍 언어론]' 카테고리의 다른 글
프로그래밍 언어론 3강. 추상(Abstraction) (0) | 2019.10.26 |
---|---|
프로그래밍 언어론 1-6강. 컴파일 과정 Overview (0) | 2019.10.14 |
프로그래밍 언어론 1-4강. Compilation(편집) vs Interpretation(해석) (0) | 2019.10.14 |
프로그래밍 언어론 1-1강. 언어 디자인의 아트(The Art of Language Design) (0) | 2019.10.12 |
프로그래밍 언어론 0강. 소개(Introduction) (0) | 2019.10.12 |