{{위키데이터 속성 추적}}
{{프로그래밍 패러다임}}
'''선언형 프로그래밍'''(宣言型 프로그래밍, {{llang|en|declarative programming}})은 두 가지 뜻으로 통용되고 있다.

한 정의에 따르면, 프로그램이 ''어떤 방법으로'' 해야 하는지를 나타내기보다 ''무엇''과 같은지를 설명하는 경우에 "선언형"이라고 한다. 예를 들어, 웹 페이지는 선언형인데 웹페이지는 제목, 글꼴, 본문, 그림과 같이 "무엇"이 나타나야하는지를 묘사하는 것이지 "어떤 방법으로" 컴퓨터 화면에 페이지를 나타내야 하는지를 묘사하는 것이 아니기 때문이다. 이것은 전통적인 [[포트란]]과 [[C (프로그래밍 언어)|C]], [[자바 (프로그래밍 언어)|자바]]와 같은 [[명령형 프로그래밍]] 언어와는 다른 접근방식인데, 명령형 프로그래밍 언어는 프로그래머가 실행될 [[알고리즘]]을 명시해주어야 하는 것이다. 간단히 말하여, 명령형 프로그램은 알고리즘을 명시하고 목표는 명시하지 않는 데 반해 선언형 프로그램은 목표를 명시하고 알고리즘을 명시하지 않는 것이다.

또 다른 정의에 따르면, 프로그램이 [[함수형 프로그래밍]] 언어, [[논리형 프로그래밍]] 언어, 혹은 [[제한형 프로그래밍]] 언어로 쓰인 경우에 "선언형"이라고 한다. 여기서 "선언형 언어"라는 것은 [[명령형 프로그래밍 언어|명령형 언어]]와 대비되는 이런 프로그래밍 언어들을 통칭하는 것이다.

이 두가지 정의는 서로 겹치는 부분도 있다. 특히, 제한형 프로그래밍과 논리형 프로그래밍은 필요한 해의 특성을 설명하고(무엇) 그 해를 찾는 데 사용하는 실제 알고리즘은 설명하지 않는다(어떤 방법). 그러나 대부분의 논리형과 제한형 언어들은 알고리즘을 설명할 수 있고, 상세한 부분을 구현할 수 있어서 첫 번째 정의를 따르는 엄밀한 의미의 선언형 프로그래밍 언어는 아니다.

마찬가지로, 명령형 프로그래밍 언어로 선언형으로 프로그램을 작성할 수도 있다. 라이브러리나 프레임워크 내부의 비선언형 부분을 [[캡슐화]]하여 이렇게 할 수 있다. 이런 형태의 예가 [[제이유닛]] [[유닛 테스트]] 프레임워크에 반영되어 쓰이고 있는데, 이것은 정의만 되어 있으면 프레임워크로 등록하여 유닛을 테스트하는 것을 가능하게 한다.

선언형 프로그램에서는 그 언어의 표준 알고리즘으로 처리되는 자료 구조를 작성하거나 선언한다. 예를 들어서 웹페이지를 작성한다고 하면, 페이지가 [[HTML]]에서 무엇을 보여주어야 하는지를 선언하고 브라우저의 절차적 알고리즘이 이것을 화면에 표시할 점들로 변환한다.

선언형 언어는 다른 언어와 같이 문법을 가지고 있고 언어의 단어들이 어떻게 결합되어야 하는지 설명하고 있으며, 어떻게 프로그램의 출력에 맞게 할 것인지를 언어의 문장으로 설명하는 의미구조가 있다.

== 특수 분야 언어 ==
선언형 프로그래밍은 특수 분야 언어({{lang|en|Domain-specific language, DSL}})의 형태로 자주 사용된다. 여기서 "분야"이라는 것은 "언어의 사용 분야"(즉, 그 언어가 표현하는 소재)을 의미한다. 예를 들어, HTML은 특수 분야 언어이며, HTML의 영역은 웹페이지와 하이퍼텍스트이다. 특수 분야 언어의 다른 예로 [[설정 파일]], [[스프레드시트]], 그리고 심지어는 전자 메일("보낸이:", "받는이:" [[헤더 (정보 기술)|헤더]]는 처리문을 통하여 본다.)까지도 들 수 있다.

특수 분야 언어의 한 가지 특징은 [[튜링 완전성]]이 보장하지 않는다는 것이다. 따라서 특수 분야 언어들은 보통 범용 언어에 ''내장''된다. 이렇게 하면 프로그래머가 특수 분야 언어가 힘을 발휘하는 분야에서 이것을 이용할 수 있고, 특수 분야 언어로 하기 어렵거나 불가능한 문제는 범용 언어를 이용할 수 있다.

범용 언어에 내장되지 않는 특수 분야 언어는 같은 프로그램을 작성할 때 내장된 언어보다 더 사용하기 쉬운 경우가 많은데 범용 언어가 지우는 복잡한 개념이 잘 추가되지 않기 때문이다.

== 예제 ==
선언형 프로그래밍을 포함한 프레임워크는 다음과 같다.

* [[루비 온 레일]]
* [[제이유닛]]

선언형 프로그래밍을 지원하는 특수 분야 언어는 다음과 같다.

* [[XSLT]]는 [[XML]] 문서를 변환하는 선언형 언어이다.
* [[SQL]]은 [[관계형 데이터베이스]] [[질의문]]의 선언형이다.
* [[TK Solver]]

선언형 프로그래밍을 지원하는 함수형/논리형/제한형 프로그래밍 언어는 다음과 같다.

* 함수형: [[하스켈]], [[리스프]]
* 논리형: [[프롤로그]]
* 제한형: [[오즈 프로그래밍 언어|오즈]]

[[:분류:선언형 프로그래밍 언어]]에 더 많은 선언형 프로그래밍 언어들이 있다.

== 같이 보기 ==
* [[선언형 프로그래밍 언어]] - 선언형 프로그래밍을 지원하는 프로그래밍 언어들을 알아보고자 할 때
* [[컴퓨터 프로그래밍]] - 일반적인 프로그래밍에 대해 알아보고자 할 때
* [[프로그래밍 패러다임]] - 일반적인 프로그래밍 패러다임에 대해 알아보고자 할 때
** [[명령형 프로그래밍]] - 상태를 다루는 것에 치중한 대조적인 패러다임을 알아보고자 할 때
** [[절차적 프로그래밍]] - 순서대로 따라가는 대조적인 패러다임에 대해 알아보고자 할 때

== 참고자료 ==
{{위키공용분류}}
* {{언어링크|en}} [https://web.archive.org/web/20070216133747/http://ftp.sunet.se/foldoc/foldoc.cgi?declarative+language Declarative language] in The Free On-line Dictionary of Computing, Editor Denis Howe.
* {{언어링크|en}} [https://web.archive.org/web/20070218134212/http://ftp.sunet.se/foldoc/foldoc.cgi?relational+language Relational language] in The Free On-line Dictionary of Computing, Editor Denis Howe.
* {{언어링크|en}} [https://web.archive.org/web/20070220185534/http://ftp.sunet.se/foldoc/foldoc.cgi?Logic+programming Logic programming] in The Free On-line Dictionary of Computing, Editor Denis Howe.
* {{언어링크|en}} [https://web.archive.org/web/20070219010702/http://ftp.sunet.se/foldoc/foldoc.cgi?functional+programming Functional programming] in The Free On-line Dictionary of Computing, Editor Denis Howe.

== 외부 링크 ==
* {{언어링크|en}} Frans Coenen. [https://web.archive.org/web/20060424045449/http://www.csc.liv.ac.uk/~frans/OldLectures/2CS24/declarative.html#detail Characteristics of declarative programming languages]. 1999.
* {{언어링크|en}} Olof Torgersson. [https://web.archive.org/web/20060330033506/http://www.cs.chalmers.se/~oloft/Papers/wm96/wm96.html A Note on Declarative Programming Paradigms and the Future of Definitional Programming]. 1996.
* {{언어링크|en}} David Mertz. [https://web.archive.org/web/20060615141501/http://gnosis.cx/publish/programming/xml_models_xslt.html Declarative Programming with XML Stylesheet Language Transformations]. 2001.
* {{언어링크|en}} Anders Norås. [http://www.dotnetjunkies.com/WebLog/anoras/archive/2004/08/09/21502.aspx Declarative JavaScript programming]. 2004-08-09.
* {{언어링크|en}} David Mertz. [http://www.onlamp.com/pub/a/python/2003/07/31/declarative_python.html Advanced OOP: Declarative Programming and Mini-Languages] {{웨이백|url=http://www.onlamp.com/pub/a/python/2003/07/31/declarative_python.html |date=20060312165131 }}. 2003-07-31.
* {{언어링크|en}} Narayanan Jayaratchagan. [http://www.onjava.com/pub/a/onjava/2004/04/21/declarative.html Declarative Programming in Java]. 2004-04-21.
* {{언어링크|en}} N. Alex Rupp. [https://web.archive.org/web/20070222162521/http://today.java.net/pub/a/today/2004/08/19/rulingout.html Ruling Out: Rule Engines and Declarative Programming Come to Java]. 2004-08-19.

{{프로그래밍 언어의 유형}}
{{전거 통제}}

[[분류:선언형 프로그래밍| ]]
[[분류:프로그래밍 패러다임]]