개요


명령형 언어(Imperative Language)와 선언형 언어(Declarative Language)의 차이점에 대해 알아봅시다.

용어 설명


명령형 언어와 선언형 언어는

각각 절차적 언어(Procedural Language)와

비절차적 언어(Non-Procedural Language)로 구분하기도 합니다.

명령형 언어는 어떻게(How) 결과를 얻어내는가에 대한

구체적인 절차를 기술하는 언어입니다.

명령형 언어의 종류로는 C, C++, 관계 대수 등이 있고

Java 같은 객체지향 언어 또한 이 범주에 속합니다.

선언형 언어는 결과가 무엇(What)인지에 대해 논리적으로 기술하는 언어입니다.

선언형 언어의 종류로는

LISP 같은 함수형 언어 (Functional Language),

XML 같은 마크업 언어 (Markup Language),

SQL 같은 질의형 언어 (Query Language)등이 있습니다.

관점의 차이


성적(grade)이 80점 이상인 학생(students)들의 학번(sid)과 이름(name)을 조회

위 작업에 대한 명령형 언어와 선언형 언어의 관점 차이에 대해 알아봅시다.

C언어 (명령형 언어)


1
2
3
4
5
for (i = 0; i < student_length; i++) {
if (student[i].grade >= 80) {
printf("sid: %d %s \n", students[i].sid, students[i].name);
}
}

우선 i에 0을 할당해야하고,

i가 student_length보다 작아야하고,

if문 비교를 해야하고,

조건에 충족하면 printf문을 실행해야하고,

… 반복

이렇듯 명령형 언어는

조건에 맞는 학생을 조회하기 위해

순차적인 명령을 기술하고 있습니다.

관계대수 (명령형 언어)


πsid,namegrade>=80(students))

우선 select를 통해 students 릴레이션에서

grade가 80이상인 튜플을 뽑아내고

sid와 name 속성을 project 하라는

절차적 명령을 기술하고 있습니다.

관계 해석 (선언형 언어)


관계 대수를 배울 때 보통 관계 해석을 같이 배웁니다.

{ t.sid, t.name | students(t) and t.grade >= 80 }

위 식은 πsid,namegrade>=80(students))와 결과는 같지만

의미하는 바가 다릅니다.

관계 해석으로 나타낸 식은

‘성적이 80점 이상인 학생들의 학번과 이름’을 뜻합니다.

관계 대수처럼

‘성적이 80점 이상인 학생들의 학번과 이름을 구하는 명령’이 아닙니다!

SQL (선언형 언어)


1
SELECT sid, name FROM students WHERE grade >= 80

학생 테이블에서 성적이 80점 이상인 학생의 학번과 이름이 무엇(what)인지 질의를 한 것 입니다.

사용자는 질의 만으로 DBMS가 어떤 절차로 sid와 name을 가져오는지 알 수 없습니다.

또한 어떻게(how) 해서 가져와라라고 명령 할 수 없습니다.

이제 좀 감이 오시나요?

절차가 없으면 어떻게 수행하는데?


선언형 언어에서는 절차는 중요하지 않습니다.

어떻게(how) 결과를 얻어내는지는 관심이 없는 것이죠.

이는 실제 구현이 캡슐화(encapsulation) 되었기 때문입니다.

“사용자 입장에선 학생의 학번과 이름이 무엇(what)인지 알고 싶은거지

학생의 학번과 이름을 어떻게(how)해야 얻을 수 있는지는 알고 싶지 않다.”

라는게 바로 핵심 포인트 입니다.

그렇다면 실제 머신에서 구현된 선언형 언어들은

명령형 언어를 캡슐화하여 탄생한 언어라고 볼 수 있습니다.

머신보다는 사용자 친화적이라

당연히 성능상의 trade off는 발생하겠지만

선언형 언어를 사용하면 검증된 코드의 재사용 통해

명령형 언어를 사용할 때 Low Level에서 발생하는 실수들을 방지하고

안정적인 코딩을 할 수 있습니다…

라고 함수형 프로그래머들이 꿈을 꾸었습니다.

행복한 꿈을 꾸었습니다

그들이 생각한 이상과 현실은 달랐다.

결론


명령형 언어는 어떻게(how) 할지 기술하는 언어이다.

선언형 언어는 무엇(what) 인지 기술하는 언어이다.