선언적 프로그래밍
Declarative programming| 프로그래밍 패러다임 |
|---|
컴퓨터 과학에서 선언적 프로그래밍은 제어 [1]흐름을 설명하지 않고 계산의 논리를 표현하는 프로그래밍 패러다임이다.
이 스타일을 적용하는 많은 언어들은 프로그래밍 언어 원어민[2](언어의 구현에 맡겨진 방법)의 시퀀스로서 프로그램을 실행하는 방법을 설명하는 것이 아니라, 문제 영역의 관점에서 프로그램이 무엇을 달성해야 하는지를 설명함으로써 부작용을 최소화하거나 제거하려고 시도합니다.이는 알고리즘을 명시적 [3]단계로 구현하는 명령형 프로그래밍과는 대조적입니다.
선언형 프로그래밍은 종종 프로그램을 형식 논리 이론으로 간주하고 계산은 논리 공간에서 추론으로 간주합니다.선언적 프로그래밍은 병렬 [4]프로그램 작성을 크게 단순화할 수 있습니다.
일반적인 선언 언어에는 데이터베이스 쿼리 언어(예: SQL, XQuery), 정규 표현식, 논리 프로그래밍, 기능 프로그래밍 및 구성 관리 시스템의 언어가 포함됩니다.
정의.
선언적 프로그래밍은 종종 필수적이지 않은 프로그래밍 스타일로 정의됩니다.다른 많은 공통 정의들은 그것을 명령형 프로그래밍과 단순 대조함으로써 정의하려고 시도한다.예를 들어 다음과 같습니다.
이러한 정의는 상당히 중복됩니다.
선언적 프로그래밍은 프로그램이 수행해야 하는 명령이나 단계를 명시적으로 나열하지 않고 원하는 결과를 설명하는 비제국적 프로그래밍 스타일입니다.기능 및 논리 프로그래밍 언어는 선언형 프로그래밍 스타일로 특징지어집니다.논리 프로그래밍 언어에서 프로그램은 논리문으로 구성되며 프로그램은 문장의 증명을 검색하여 실행됩니다.
Haskell과 같은 순수한 함수 언어에서는 모든 함수에 부작용이 없으며 상태 변화는 프로그램 내에서 1등급 객체로 명시적으로 표현되는 상태를 변환하는 함수로만 표현됩니다.순수한 기능 언어는 비제국적이지만, 종종 일련의 단계로 함수의 효과를 설명하는 기능을 제공합니다.Lisp, OCaml 및 Erlang과 같은 다른 기능 언어는 절차적 프로그래밍과 기능적 프로그래밍을 혼합하여 지원합니다.
Prolog와 같은 일부 논리 프로그래밍 언어 및 SQL과 같은 데이터베이스 쿼리 언어도 원칙적으로는 선언형이지만 절차 형식의 프로그래밍을 지원합니다.
서브패러다그
선언형 프로그래밍은 더 잘 알려진 프로그래밍 패러다임을 포함하는 포괄적인 용어입니다.
제약 조건 프로그래밍
제약 조건 프로그래밍은 대상 솔루션의 속성을 지정하는 제약 조건의 형태로 변수 간의 관계를 나타냅니다.제약 조건의 집합은 솔루션이 제약 조건의 최대 수와 일치하도록 각 변수에 값을 지정함으로써 해결됩니다.제약 프로그래밍은 기능적, 논리적 또는 필수 프로그래밍과 같은 다른 패러다임을 보완하는 경우가 많습니다.
도메인 고유의 언어
DSL(Declarative Domain Specific Languages)의 잘 알려진 예로는 yacc 파서 생성기 입력 언어, QML, 빌드 사양 언어 만들기, Puppet의 구성 관리 언어, 정규 표현식 및 SQL의 하위 집합(예: SELECT 쿼리)이 있습니다.DSL은 유용한 반면 반드시 튜링 완전할 필요는 없다는 장점이 있으며, 이는 언어가 순수하게 선언적인 것을 쉽게 만든다.
HTML, MXML, XAML, XSLT 또는 기타 사용자 인터페이스 마크업 언어 등 많은 마크업 언어가 선언적인 경우가 많습니다.예를 들어, HTML은 웹 페이지에 표시되는 내용만 설명합니다. HTML은 페이지를 렌더링하기 위한 제어 흐름이나 사용자와의 가능한 상호작용을 지정하지 않습니다.
2013년 현재[update] 일부 소프트웨어[which?] 시스템은 기존의 사용자 인터페이스 마크업 언어(HTML 등)와 백엔드 서버 시스템이 선언된 인터페이스를 지원하기 위해 무엇을 해야 하는지를 정의하는 선언적 마크업을 결합하고 있습니다.일반적으로 도메인 고유의 XML 네임스페이스를 사용하는 이러한 시스템에는 SQL 데이터베이스 구문의 추상화 또는 Representational State Transfer(REST; 대표 상태 전송) [citation needed]및 SOAP를 사용하는 웹 서비스에 대한 파라미터화된 콜이 포함될 수 있습니다.
기능 프로그래밍
Haskell, Scheme 및 ML과 같은 함수 프로그래밍 언어는 함수 애플리케이션을 통해 식을 평가합니다.절차적 프로그래밍의 관련성이 있지만 보다 필수적인 패러다임과 달리, 기능적 프로그래밍은 명시적 시퀀싱에 거의 중점을 두지 않습니다.예를 들어 Scheme에서는 여러 종류의 하위 표현식의 평가 순서가 정의되지 않았거나 [6]암묵적입니다.대신, 연산은 다양한 종류의 재귀적 고차 함수 적용 및 구성에 의해 특징지어지며, I/O 및 데이터에 대한 명시적 참조가 드물게 나타나며, 가능한 한 상태 돌연변이를 피하거나 캡슐화한다.
하이브리드 언어
예를 들어 makefile은 선언적인 방식으로 [7]종속성을 지정하지만 수행할 작업의 필수 목록도 포함합니다.마찬가지로, yacc는 문맥 자유 문법을 선언적으로 지정하지만, 호스트 언어로부터의 코드 스니펫을 포함합니다.이것은, 통상은 필수입니다(C 등).
논리 프로그래밍
프롤로그 상태 및 쿼리 관계 등의 논리 프로그래밍 언어.이러한 쿼리에 대한 구체적인 답변 방법은 구현과 그 정리 방법에 따라 다르지만, 일반적으로 일종의 통일 형태를 취합니다.함수 프로그래밍과 마찬가지로, 많은 논리 프로그래밍 언어들이 부작용을 허용하고, 그 결과 엄격히 선언적이지 않습니다.
모델링.
물리 시스템의 모델 또는 수학적 표현은 선언적인 컴퓨터 코드로 구현될 수 있다.이 코드에는 행동 관계를 기술("선언")하는 필수 할당이 아닌 여러 방정식이 포함되어 있습니다.모델이 이 형식주의로 표현될 때, 컴퓨터는 해법 알고리즘을 가장 잘 공식화하기 위해 대수적 조작을 수행할 수 있다.수학적 인과관계는 일반적으로 물리적 시스템의 경계에 부과되는 반면, 시스템 자체의 행동 설명은 선언적 또는 통찰력적이다.선언적 모델링 언어 및 환경에는 Analytica, Modelica 및 Simile이 [8]포함됩니다.
예
리스프
Lisp(1958)는 "LIST Processor"[9]의 약자입니다.프로세스 목록에 맞게 조정됩니다.데이터의 전체 구조는 목록 목록을 구축함으로써 형성됩니다.메모리에는 트리 데이터 구조가 구축된다.내부적으로는 트리 구조가 재귀적 [10]기능에 적합합니다.트리를 작성하기 위한 구문은 공백으로 구분된 요소를 괄호로 묶는 것입니다.다음은 세 가지 요소의 목록입니다.처음 2개의 요소는 그 자체가 다음 2개의 요소의 목록입니다.
((A B) (HELLO WORLD) 94)
Lisp는 요소를 추출하고 재구성하는 기능을 가지고 있습니다.[11]함수head()는 목록의 첫 번째 요소를 포함하는 목록을 반환합니다.함수tail()첫 번째 요소를 제외한 모든 요소를 포함하는 목록을 반환합니다.함수cons()는 다른 목록과 연결된 목록을 반환합니다.따라서 다음 식은 목록을 반환합니다.x:
cons(head(x), tail(x))
Lisp의 한 가지 단점은 많은 함수가 중첩되어 있을 때 괄호가 [12]혼란스러워 보일 수 있다는 것입니다.최신 Lisp 환경은 괄호 일치에 도움이 됩니다.한편, Lisp는 할당문과 goto [13]루프의 명령어 조작을 지원합니다.또한 Lisp는 컴파일 시 요소의 데이터 타입에 관여하지 않습니다.대신 런타임에 데이터 유형을 할당합니다.이로 인해 개발 프로세스 초기에 프로그래밍 오류가 감지되지 않을 수 있습니다.
신뢰할 수 있고 읽기 쉬운 대형 리스프 프로그램을 작성하려면 사전 검토가 필요합니다.적절하게 계획되면 프로그램은 동등한 명령어 [12]프로그램보다 훨씬 짧을 수 있습니다.리스프는 인공지능에 널리 사용된다.그러나, 이것은 단지 필수 언어 조작이 있기 때문에 받아들여져 의도하지 않은 부작용을 일으킬 [14]수 있다.
ML
ML(1973)[15]은 "메타 언어"를 나타냅니다.ML은 동일한 유형의 데이터만 [16]서로 비교하는지 확인합니다.예를 들어, 이 함수는 하나의 입력 파라미터(정수)를 가지며 정수를 반환합니다.
재밌어요 횟수_10(n : 인트) : 인트 = 10 * n; ML은 Lisp와 같이 괄호 외향적이지 않습니다.다음은 의 적용 사례입니다.times_10():
times_10 2
"20 : int"를 반환합니다(결과와 데이터 유형이 모두 반환됩니다).
Lisp와 마찬가지로 ML은 프로세스 목록에 맞게 조정됩니다.Lisp와는 달리 각 요소는 동일한 데이터 [17]유형입니다.
프롤로그
프롤로그(1972)는 "프로그래밍 in Logic"의 약자다.그것은 [18]자연어를 처리하도록 설계되었다.프롤로그 프로그램의 구성 요소는 객체 및 객체와의 관계입니다.물건들은 그것에 [19]대한 진실한 사실들을 말함으로써 만들어진다.
집합 이론 팩트는 집합에 객체를 할당함으로써 형성됩니다.구문은 다음과 같습니다.setName(object).
- 고양이는 동물이다.
animal(cat).
- 쥐는 동물이다.
animal(mouse).
- 톰은 고양이입니다.
cat(tom).
- 제리는 쥐다.
mouse(jerry).
형용사 팩트는 다음과 같이 형성된다.adjective(object).
- 고양이는 크다.
big(cat).
- 마우스가 작다.
small(mouse).
괄호 안의 여러 항목을 사용하여 관계를 형성합니다.이 예에서는,verb(object,object)그리고.verb(adjective,adjective).
- 쥐는 치즈를 먹는다.
eat(mouse,cheese).
- 큰 동물은 작은 동물을 먹는다.
eat(big,small).
모든 사실과 관계를 입력하면 다음과 같은 질문을 할 수 있습니다.
- 톰은 제리를 먹을까?
?- eat(tom,jerry).
프롤로그의 사용은 목표 지향적인 언어로 [20]확대되었다.목표 지향 어플리케이션에서 목표는 하위 목표 목록을 제공함으로써 정의됩니다.그 후 각 서브목표는 서브목표 등의 리스트를 추가함으로써 정의된다.하위 목표 경로가 솔루션을 찾지 못하면 해당 하위 목표는 역추적되고 다른 경로가 체계적으로 [19]시도됩니다.실용적 적용으로는[18] 최단 경로 [21]문제 해결과 가계도 제작 등이 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Lloyd, J.W., Practical Advantages of Declarative Programming
- ^ "declarative language". FOLDOC. 17 May 2004. Retrieved 26 January 2020.
- ^ Sebesta, Robert (2016). Concepts of programming languages. Boston: Pearson. ISBN 978-0-13-394302-3. OCLC 896687896.
- ^ "DAMP 2009: Workshop on Declarative Aspects of Multicore Programming". Cse.unsw.edu.au. 20 January 2009. Retrieved 15 August 2013.
- ^ Chakravarty, Manuel M. T. (14 February 1997). On the Massively Parallel Execution of Declarative Programs (Doctoral dissertation). Technical University of Berlin. Retrieved 26 February 2015.
In this context, the criterion for calling a programming language declarative is the existence of a clear, mathematically established correspondence between the language and mathematical logic such that a declarative semantics for the language can be based on the model or the proof theory (or both) of the logic.
- ^ "Revised7 Report on the Algorithmic Language Scheme" (PDF). Scheme Working Group 1. Retrieved 2020-12-05.
- ^ [1] 2007년 10월 23일 Wayback Machine에서 아카이브 완료
- ^ "Declarative modelling". Simulistics. Retrieved 15 August 2013.
- ^ Jones, Robin; Maynard, Clive; Stewart, Ian (December 6, 2012). The Art of Lisp Programming. Springer Science & Business Media. p. 2. ISBN 9781447117193.
- ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 220. ISBN 0-201-71012-9.
- ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 221. ISBN 0-201-71012-9.
- ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 230. ISBN 0-201-71012-9.
- ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 229. ISBN 0-201-71012-9.
- ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 241. ISBN 0-201-71012-9.
- ^ Gordon, Michael J. C. (1996). "From LCF to HOL: a short history". Retrieved 2021-10-30.
- ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 233. ISBN 0-201-71012-9.
- ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 235. ISBN 0-201-71012-9.
- ^ a b "Birth of Prolog" (PDF). November 1992.
- ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 246. ISBN 0-201-71012-9.
- ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 245. ISBN 0-201-71012-9.
- ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 247. ISBN 0-201-71012-9.
외부 링크
- 프란스 코엔선언형 프로그래밍 언어의 특성.1999.
- 로버트 하퍼.
- 선언적 언어란 무엇인가?2013.
- 선언적 언어라는 것이 있으며, 그것은 세계 최고의 DSL이다.
- 올로프 토거슨.선언적 프로그래밍 패러다임과 정의적 프로그래밍의 미래에 관한 메모. 1996년.