맨위로가기

선언형 프로그래밍

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

선언형 프로그래밍은 프로그램이 수행해야 할 목표를 설명하는 방식을 취하며, 명령형 프로그래밍과 대비되는 개념이다. 이는 부작용이 없거나 참조 투명성을 만족하는 프로그래밍 언어, 또는 수학적 논리와 연관성이 명확한 언어에서 주로 나타난다. 선언형 프로그래밍은 원하는 결과를 설명하는 비명령형 프로그래밍 스타일을 사용하며, 함수형, 논리형, 제약 프로그래밍과 같은 다양한 프로그래밍 패러다임을 포함한다. 선언형 프로그래밍은 계산식의 추상화, 계산 최적화, 미래 요소 포함 계산, 부작용 제거, 상태 분리 등의 장점을 가지며, 하스켈, 프롤로그, SQL, XSLT 등이 선언형 프로그래밍 언어 또는 프레임워크의 예시로 제시된다.

더 읽어볼만한 페이지

  • 선언형 프로그래밍 - 스위프트 (프로그래밍 언어)
    2014년 애플 세계 개발자 컨퍼런스에서 처음 공개된 스위프트는 크리스 래트너가 개발한 애플의 범용 프로그래밍 언어로서, Objective-C를 대체하며 다양한 플랫폼 지원, 모던 문법, 안정성, 인터랙티브한 개발 환경, SwiftUI 등의 특징을 가진다.
  • 선언형 프로그래밍 - 제약 프로그래밍
    제약 프로그래밍은 제약 조건을 프로그래밍 언어에 통합하여 제약 만족 문제 해결에 사용되는 패러다임으로, 제약 조건 유형과 다양한 해 탐색 알고리즘을 활용하여 여러 영역에 적용될 수 있다.
  • 프로그래밍 패러다임 - 지식 표현
    지식 표현은 컴퓨터가 인간의 지식을 이해하고 활용하도록 정보를 구조화하는 기술이며, 표현력과 추론 효율성의 균형, 불확실성 처리 등을 핵심 과제로 다양한 기법과 의미 웹 기술을 활용한다.
  • 프로그래밍 패러다임 - 의도적 프로그래밍
    의도적 프로그래밍은 프로그래머의 의도를 명확히 포착하고 활용하여 소프트웨어 개발 생산성을 향상시키기 위한 프로그래밍 패러다임으로, 트리 기반 저장소를 사용해 코드 의미 구조를 보존하고, WYSIWYG 환경에서 도메인 전문가와 협업하며, 코드 상세 수준 조절 및 자동 문서화를 통해 가독성과 유지보수성을 높이는 데 중점을 둔다.
선언형 프로그래밍
개요
패러다임프로그래밍 패러다임
종류함수형 프로그래밍
논리 프로그래밍
데이터플로 프로그래밍
병행 제약 프로그래밍
상세 내용
정의계산의 논리를 모델링하는 프로그래밍 패러다임
특징프로그램의 실행 방법을 명시하는 대신 원하는 결과를 선언
장점가독성 향상, 유지보수 용이, 병렬 처리 용이
명령형 프로그래밍과 비교명령형 프로그래밍은 프로그램의 상태를 변경하는 명령을 순서대로 나열하는 방식
사용 예시SQL
HTML
XML
CSS

2. 정의

선언형 프로그래밍은 명령형 프로그래밍과 대비되는 개념으로, 프로그램이 수행해야 할 목표를 설명하는 방식을 취한다. 이는 프로그램이 *무엇을* 해야 하는지에 초점을 맞추는 것이다.[21][24]

선언형 프로그래밍의 주요 특징은 다음과 같다.


  • 계산이 수행해야 하는 작업을 설명하는 고수준 언어이다.
  • 부작용이 없거나 참조 투명성을 만족한다.[6]
  • 수학적 논리와 명확한 연관성을 가진다.[6]
  • 식은 단독으로 평가될 뿐만 아니라, 인자에 적용되어 평가값 (반환값)이 된다. 식은 다른 식의 인자가 되기도 하며, 고계 논리의 식은 다른 식을 인자로 한다.


참조 투명성은 같은 인자에 대한 연산자의 동작과 반환값이 변하지 않음을 의미한다.[26]

선언형 프로그래밍은 병렬 프로그래밍과의 친화성이 높다. 이는 세마포어, 뮤텍스 등을 사용하는 명령형 프로그래밍에 비해 장점이다. 선언형 프로그래밍에서는 식으로서의 프로세스를 대수로 취급하여 비동기적인 병행성을 실현할 수 있다.

함수형 프로그래밍 언어는 대부분 명령형과 선언형의 절충 형태를 취하고 있지만, 순수 함수형 언어는 선언형 프로그래밍을 엄격하게 따르며 프로그램의 정당성에 대한 형식적 검증을 가능하게 한다.

프롤로그, SQL과 같은 데이터베이스 쿼리 언어와 같은 일부 논리 프로그래밍 언어는 원칙적으로 선언적이지만 절차적 프로그래밍 스타일도 지원한다.

3. 하위 패러다임

선언형 프로그래밍은 함수형 프로그래밍, 논리형 프로그래밍, 제약 프로그래밍 등 다양한 하위 프로그래밍 패러다임을 포함하는 상위 용어이다.[1]


  • '''제약 프로그래밍:''' 변수 간의 관계를 제약 조건으로 표현하고, 이를 만족하는 해를 찾는 방식이다.
  • '''도메인 특화 언어 (DSL):''' 특정 분야에 특화된 언어로, HTML, SQL 등이 있다.
  • '''함수형 프로그래밍:''' 함수 적용을 통해 식을 평가하며, 하스켈, Scheme 등이 대표적이다.
  • '''논리형 프로그래밍:''' 프로그램의 논리적 결과를 증명하거나 목표가 참임을 보여주는 방식으로, 프롤로그, 데이터로그 등이 있다.


이 외에도 혼합형 언어나 모델링 등도 선언형 프로그래밍의 하위 패러다임으로 볼 수 있다. Make 파일은 종속성을 선언적으로 지정하면서도 명령형 코드를 포함하며,[7] Yacc는 문맥 자유 문법을 선언적으로 지정하지만 C 코드 조각을 포함한다. 물리 시스템의 수학적 모델은 선언적 코드로 구현될 수 있는데, 이는 동작 관계를 설명하는 방정식들로 구성된다.[1]

3. 1. 제약 프로그래밍

제약 프로그래밍은 변수 간의 관계를 제약 조건 형태로 나타내고, 이러한 제약 조건을 만족하는 해를 찾는 프로그래밍 방식이다. 제약 조건 집합은 각 변수에 값을 부여하여 최대한 많은 제약 조건을 만족하도록 해결된다. 제약 프로그래밍은 종종 함수형, 논리형, 명령형 프로그래밍과 같은 다른 패러다임을 보완하는 데 사용된다.[1]

3. 2. 도메인 특화 언어 (DSL)

도메인 특화 언어(Domain-specific language, DSL영어)는 특정 분야의 문제를 해결하기 위해 설계된 언어이다. HTML, SQL, 정규 표현식 등이 대표적인 예시이며, 튜링 완전성을 갖지 않아도 된다는 장점이 있다.

선언형 프로그래밍은 특수 분야 언어의 형태로 자주 사용된다. 예를 들어, HTML은 웹페이지와 하이퍼텍스트 영역을 표현하는 특수 분야 언어이다. 특수 분야 언어는 튜링 완전성이 보장되지 않으므로, 보통 범용 언어에 '내장'되어 사용된다. 이렇게 하면 프로그래머는 특수 분야 언어가 강점을 가지는 분야에서는 특수 분야 언어를 사용하고, 특수 분야 언어로 해결하기 어렵거나 불가능한 문제는 범용 언어를 사용할 수 있다.

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

선언형 도메인 특화 언어(DSL)의 예시로는 yacc 파서 생성기 입력 언어, QML, Make 빌드 명세 언어, Puppet 구성 관리 언어, 정규 표현식, Datalog, answer set programming, 그리고 SQL의 하위 집합(예: SELECT 쿼리) 등이 있다. DSL은 튜링 완전성을 가질 필요가 없으며, 이는 언어를 순수하게 선언적으로 만드는 것을 더 쉽게 해준다.

HTML, MXML, XAML, XSLT 또는 기타 사용자 인터페이스 마크업 언어와 같은 많은 마크업 언어는 종종 선언적이다. 예를 들어 HTML은 웹 페이지에 무엇이 나타나야 하는지만 기술하며, 페이지를 렌더링하기 위한 제어 흐름이나 페이지의 가능한 사용자와의 상호 작용은 지정하지 않는다.

3. 3. 함수형 프로그래밍

하스켈, Scheme, ML과 같은 함수형 프로그래밍 언어는 함수 적용을 통해 식을 평가한다. 절차적 프로그래밍 패러다임과 달리, 함수형 프로그래밍은 명시적인 순차성에 거의 강조를 두지 않는다. 대신, 계산은 다양한 종류의 재귀적인 고차 함수 적용 및 합성으로 특징지어지며, 따라서 단순히 정의역과 공역 사이의 매핑 집합으로 간주될 수 있다. ML 및 Lisp 계열의 대부분을 포함한 많은 함수형 언어는 순수 함수형 프로그래밍이 아니며, 프로그램에서 상태 효과를 도입할 수 있다.[9]

Lisp는 수학적 표기법과 앨론조 처치의 람다 대수에서 영감을 얻은 프로그래밍 언어 계열이다. Common Lisp와 같은 일부 방언은 주로 명령형이지만 함수형 프로그래밍을 지원한다. Scheme과 같은 다른 방언은 함수형 프로그래밍을 위해 설계되었다.

Scheme에서 팩토리얼 함수는 다음과 같이 정의할 수 있다.



(define (factorial n)

(if (= n 0)

1 ;;; 0! = 1

(* n (factorial (- n 1))))) ;;; n! = n*(n-1)!



이것은 재귀적 정의를 사용하여 팩토리얼 함수를 정의한다.

Lisp과 람다 대수에서 함수는 일반적으로 일급 객체이다. 이것은 함수가 다른 함수의 입력과 출력이 될 수 있음을 의미한다.

예를 들어 Racket에서 처음 n개의 제곱수를 출력하는 함수는 다음과 같이 수행할 수 있다.



(define (first-n-squares n)

(map

(lambda (x) (* x x)) ;;; A function mapping x -> x^2

(range n))) ;;; List of the first n non-negative integers



map 함수는 함수와 리스트를 받는다. 출력은 입력 리스트의 각 요소에 대한 입력 함수의 결과 리스트이다.

ML (1973)은 "메타 언어"(Meta Language)를 의미한다. ML은 정적으로 타입이 지정되며, 함수 인자와 반환 타입에 주석을 달 수 있다.[10]



fun times_10(n : int) : int = 10 * n;



''ML''은 ''Lisp''만큼 괄호 중심적이지 않으며, 코드 요소 간의 관계를 부호화하기 위해 더 다양한 구문을 사용한다. 다음은 `times_10`의 적용 예시이다.



times_10 2



이것은 "20 : int", 즉 `20`, 타입 `int`의 값을 반환한다.

''Lisp''와 마찬가지로, ''ML''은 리스트를 처리하도록 설계되었지만, 리스트의 모든 요소는 동일한 타입이어야 한다.[11]

함수형 프로그래밍 언어의 대부분은 명령형과 선언형의 절충이 되어 있다. 즉, 명령과 부작용의 취급도 허용한다. 순수 함수형 언어는 선언적으로 철저하며, 프로그램 정당성의 형식적 검증을 가능하게 한다.

3. 4. 논리형 프로그래밍

프롤로그, 데이터로그, 응답 집합 프로그래밍과 같은 논리 프로그래밍 언어는 프로그램의 논리적 결과를 증명하거나 프로그램에서 정의된 모델에서 목표가 참임을 보여줌으로써 계산을 수행한다. 프롤로그는 후진 추론을 사용하여 하향식으로 목표를 하위 목표로 줄여 계산하는 반면, 대부분의 데이터로그 시스템은 전진 추론을 사용하여 상향식으로 계산한다. 응답 집합 프로그램은 일반적으로 프로그램의 모델을 생성하기 위해 SAT 솔버를 사용한다.

프롤로그 (1972)는 "PROgramming in LOGic"의 약자이다. 자연어 질의 응답을 위해 개발되었으며,[12] SL 해상도[13]를 사용하여 질의에 대한 답변을 추론하고 자연어 문장을 구문 분석하고 생성한다.

프롤로그 프로그램의 구성 요소는 ''사실''과 ''규칙''이다. 다음은 간단한 예시이다.

```prolog

cat(tom). % tom은 고양이다

mouse(jerry). % jerry는 쥐다

animal(X) :- cat(X). % 각 고양이는 동물이다

animal(X) :- mouse(X). % 각 쥐는 동물이다

big(X) :- cat(X). % 각 고양이는 크다

small(X) :- mouse(X). % 각 쥐는 작다

eat(X,Y) :- mouse(X), cheese(Y). % 각 쥐는 각 치즈를 먹는다

eat(X,Y) :- big(X), small(Y). % 각 큰 존재는 각 작은 존재를 먹는다

```

이 프로그램이 주어지면 쿼리 `eat(tom,jerry)`는 성공하지만 `eat(jerry,tom)`는 실패한다. 또한 쿼리 `eat(X,jerry)`는 답 대입 `X=tom`으로 성공한다.

프롤로그는 SLD 해상도를 사용하여 거꾸로 추론하면서 프로그램을 톱다운 방식으로 실행하여 목표를 하위 목표로 줄인다. 이 예에서는 프로그램의 마지막 규칙을 사용하여 쿼리에 답하는 목표 `eat(X,jerry)`를 먼저 `big(X)`가 성립하는 X를 찾고, 그 다음 `small(jerry)`가 성립함을 보이는 하위 목표로 줄인다. 하위 목표를 다른 하위 목표로 계속 줄이는 규칙을 반복하여 결국 프로그램의 사실과 모든 하위 목표를 결합하는 데 성공한다. 이 역방향 추론, 목표 축소 전략은 논리 프로그램의 규칙을 프로시저로 취급하며, 프롤로그를 선언적 및 절차적 프로그래밍 언어로 만든다.[14]

프롤로그 응용 분야의 광범위한 범위는 프롤로그 50주년을 기념하는 Year of Prolog Book에 강조되어 있다.[15]

데이터로그의 기원은 논리 프로그래밍 초창기로 거슬러 올라가지만, 1977년경 별개의 분야로 인식되었다. 구문론과 의미론 측면에서 볼 때, 데이터로그는 프롤로그의 부분 집합이다. 그러나 복합 항이 없기 때문에 튜링 완전하지 않다.

대부분의 데이터로그 시스템은 규칙을 사용하여 프로그램을 하향식으로 실행하며, 기존 사실로부터 새로운 사실을 추론하고, 더 이상 파생될 새로운 사실이 없거나 파생된 사실이 쿼리와 통합될 때 종료된다. 위 예시에서 전형적인 데이터로그 시스템은 먼저 다음과 같은 새로운 사실을 파생할 것이다.

```prolog

animal(tom).

animal(jerry).

big(tom).

small(jerry).

```

이러한 사실을 사용하여 추가적인 사실을 파생할 것이다.

```prolog

eats(tom, jerry).

```

그런 다음 종료되는데, 이는 새로운 추가 사실을 파생할 수 없기 때문이고, 새로 파생된 사실이 쿼리

`eats(X, jerry).`와 통합되기 때문이다.

데이터로그는 데이터 통합, 정보 추출, 네트워킹, 보안, 클라우드 컴퓨팅 및 머신 러닝과 같은 문제에 적용되어 왔다.

답변 집합 프로그래밍(ASP)은 1990년대 후반, 논리 프로그래밍의 안정 모델 (답변 집합) 의미론을 기반으로 발전했다. 데이터로그와 마찬가지로 프롤로그의 부분 집합이며, 복합 용어가 없기 때문에 튜링 완전성을 갖지 않는다.

ASP의 대부분의 구현은 먼저 프로그램의 모든 변수를 가능한 모든 방식으로 상수로 대체하여 프로그램을 "그라운딩"한 다음, DPLL 알고리즘과 같은 명제 SAT 솔버를 사용하여 프로그램의 하나 이상의 모델을 생성하여 프로그램을 실행한다.

ASP의 응용 분야는 어려운 탐색 알고리즘과 지식 표현 문제를 해결하는 데 중점을 둔다.[18][19]

3. 5. 혼합형 언어

Make 파일은 종속성을 선언적인 방식으로 지정하지만,[7] 수행할 일련의 명령을 포함하기도 한다. 마찬가지로, Yacc는 문맥 자유 문법을 선언적으로 지정하지만, 일반적으로 명령형인 C 코드 조각을 포함한다.

3. 6. 모델링

물리 시스템의 수학적 표현인 모델은 컴퓨터 코드에 선언적으로 구현될 수 있다. 이 코드는 명령형 할당이 아닌, 동작 관계를 설명("선언")하는 다수의 방정식들을 포함한다.[1] 모델이 이러한 형식으로 표현되면, 컴퓨터는 해법 알고리즘을 최적으로 공식화하기 위해 대수 조작을 수행할 수 있다.[1] 수학적 인과 관계는 일반적으로 물리 시스템의 경계에서 부과되는 반면, 시스템 자체의 동작 설명은 선언적이거나 비인과적이다.[1] 선언적 모델링 언어와 환경에는 Analytica, Modelica, Simile이 있다.[1]

4. 장점

선언형 프로그래밍은 명령형 프로그래밍과 달리 명령과 부작용을 최소화하고 프로그램의 기본 단위를 으로 간주하는 방식이다. 이는 계산 내용을 명확하게 파악하고, 프로그램의 정당성을 검증하기 쉽게 만든다.

선언형 프로그래밍의 주요 특징은 다음과 같다.


  • 참조 투명성: 같은 인자에 대해 항상 같은 결과를 반환하여 프로그램의 예측 가능성을 높인다.[26]
  • 고계 프로그래밍: 계산 자체를 계산 대상으로 다룰 수 있어 프로그램의 유연성을 높인다.
  • 수리 논리학 기반: 프로그램의 정확성을 수학적으로 검증할 수 있다.[25]


선언형 프로그래밍은 부작용을 제한하고 순수 코드를 분리하여 문제점을 쉽게 파악할 수 있게 한다. 또한, 식을 대수적으로 처리하여 병렬 프로그래밍에 유리하며, 비동기적인 병행성을 쉽게 구현할 수 있다. 이는 세마포어, 뮤텍스 등을 사용하는 명령형 프로그래밍에 비해 장점이다.

선언형 프로그래밍은 계산식의 추상화, 계산 최적화, 미래 요소 포함 계산, 부작용 제거, 상태 분리 등의 특징을 가지며, 이는 프로그램의 효율성과 안정성을 높이는 데 기여한다.

4. 1. 계산식의 추상화

참조 투명한 계산식은 시공간에 제약 없이 추상적인 값으로 취급할 수 있다.[27] 같은 인수에 대해 언제 어디서 계산하더라도 같은 결과가 나오면, 굳이 계산하지 않고 추상적인 값으로 취급하는 것이 선언형 접근 방식이다.[28]

이러한 개념은 클로저를 통해 구현 가능하다. 클로저는 다른 식이나 함수의 바인딩 변수로 사용될 것을 전제로 하는 렉시컬 스코프 기준의 익명 함수이다.

함수 객체를 통해서도 구현 가능한데, 함수 객체에서는 처리와 반환 값의 청사진이 되는 불변 부분과, 인수로 결정되는 처리 및 반환 값의 가변 부분이 명확하게 분리되어 있다. 선언형 프로그래밍은 점진적 상세화한 각 요소를 불변 부분과 가변 부분으로 구성하는 접근 방식을 취한다. 이러한 기술을 따르는 가상 DOM은 XML 및 HTML 문서를 변환한 트리 구조의 각 노드를 불변 및 가변 구성의 선언적 객체로 재변환한다.[29] 이때 불변 부분은 불변 상태와 같으며, 불변성 개념으로 설명되기도 한다.

4. 2. 계산 최적화

선언적 UI는 명령형 객체 지향 UI(OOUI)에 비해 경량성과 빠른 재 렌더링 속도에서 이점이 있다. 철저한 지연 결합을 지향하는 OOUI에서는 UI 요소 간의 메서드 호출(메시지)과 UI 요소 각각의 종합적인 재해석이 매번 이루어지는 경향이 있다. 반면 선언적 UI에서는 각 UI 요소가 불변 부분을 가지고, 가변 부분에 적용되는 인수는 메모화되어 있어, 같은 인수가 전달된 경우에는 계산이 생략된다[30]. 업데이트 이벤트는 각 UI 요소에 대한 인수로 변환되어, 변경된 UI 요소만 재해석되므로 재 렌더링 계산량이 줄어들기 쉽다[31]. 이전의 렌더링 상태는 고려할 필요가 없다[32]. 이처럼 불필요한 계산을 명확히 하여 전체 최적화를 하는 것이 선언적 접근 방식이다.

4. 3. 미래 요소 포함 계산

참조 투명성한 계산식은, 다음 식에서 확정될 미래 요소(전방 참조나 지연 평가)를 남겨둔 채 결과값을 반환할 수도 있다. 그 결과값은, 다음 식에서 인수가 주어지는 것을 전제로 한 일급 함수가 된다. 이는 다음 식에서 확정될 전방 참조 요소를 남겨둔 채 미평가식이며, 다음 식의 묶인 변수가 되거나 식 외부의 변수에 묶여 저장되는 등, 다음 식에서 전달되는 인수에 의해 최종적인 결과값이 된다.[21][24]

선언형은 다음 식에서 확정될 전방 참조 요소를 남겨둔 채 추상값을 취급하는 접근 방식을 취한다. 그 구현 예시에는 Future 등이 있다. 이를 고도로 응용한 수학 이론이 병행 프로그래밍 분야의 액터 모델이나 프로세스 대수이다.[25]

또한 선언형은 전방 참조 요소가 남겨진 추상값끼리 그대로 계산하는 것도 접근한다. 여기에는 부분 평가나 부분 계산 등의 수학 이론이 사용된다. 제약 프로그래밍은 여기에 준거한다.[26]

4. 4. 부작용 제거

참조 투명한 계산식에서는 식의 외부 상태(데이터 등)는 완전히 무시된다. 계산식이 외부 상태를 다룰 수 있는 것은, 인수로 전달될 때뿐이다. 그 인수를 가공한 반환값은 그대로는 단순한 데이터이며, 그것이 외부 상태에 반영될지는 식 외부의 프로세스 담당이 된다.[26] 또한, 참조 투명한 계산식은 식 내부에 가변적인 상태를 가질 수 없다. 가변적인 내부 상태에 의존한 계산에서는 그 멱등성이 상실되기 때문이다. 이러한 성질은 순수 함수라고도 불린다.

예를 들어, 누를 때마다 온/오프가 전환되는 전기 스위치 연산자가 있다고 가정한다. 명령형 연산자에서는 현재 온/오프 상태를 저장할 수 있으므로, 별도의 변수를 참조하는 형식으로 연산자와 온/오프 상태를 유닛으로 구현할 수 있다. 이에 반해 선언형 연산자에서는 인수로 전달된 온/오프 상태를 참조하는 형식이 되며, 여기에서는 연산자와 온/오프 상태를 별도로 취급하게 된다. 이것만으로는 선언형 방식이 단지 번거롭게 보일 수 있다. 그러나 그 "상태"에 온/오프뿐만 아니라 주야 구별이나 암페어 허용, 기타 여러 요소가 더해진다면, 그렇지 않다는 것이 선언형 접근 방식이다.

이때 필요한 대상값과 "상태"를 세트로 하여 순수 함수를 실현하는 기법으로는, 부분 구조 논리에서 유래한 서브 구조 타입 시스템과 범주론에서 유래한 모나드 등이 있다.

4. 5. 상태 분리

선언형 프로그래밍에서는 선언 부분과 상태를 분리할 수 있다. 선언 부분에서는 "어떤 상태가 되어야 하는지"를 선언하기 때문에, 그 전의 상태는 중요하지 않다. 예를 들어, "복도의 전등은 켜져 있다"라고 선언하면, 현재 복도 전등의 상태와 관계없이 켜져 있는 상태가 되어야 한다. 즉, 선언형 프로그래밍에서는 시간에 따라 어떻게 변하는지(상태)를 선언 부분에서 고려할 필요가 없다.[33]

명령형 프로그래밍으로 "복도의 스위치를 누른다"라는 명령을 코딩하여 복도 전등을 제어하면, 실행 후 전등의 상태는 현재 값에 따라 달라진다. 따라서 결과를 예측하려면 상태 변화 과정을 알아야 한다. 상태 변화 과정을 알려면, 상태를 조작하는 다른 코드를 파악하고 그 조작 이력을 알아야 한다. 만약 상태가 여러 개이고 서로 상호작용을 한다면, 상태 예측은 매우 어려워지고, 디버깅을 포함한 프로그래밍이 복잡해진다. 반면, 선언형 프로그래밍에서는 선언 부분이 상태 변화 과정과 분리되어 있으므로, 선언 부분의 출력은 항상 명확하다.

주의할 점은, 상태가 분리된 것이지, 상태가 없어진 것은 아니라는 점이다. 선언형 프로그래밍에서는 `light` 변수를 통해 "어떤 조명 상태"(켜짐/꺼짐)를 유지하고, 현재 시각에 따라 `light` 변수를 전환하며, "복도의 전등은 {light}이다"라는 선언에 반영되어 실제로 복도 전등이 켜지는 방식이다. `light` 변수라는 상태는 존재하며, 선언 부분과 분리되어, 선언 부분은 최신 `light` 변수가 나타내는 현재 전등 상태만을 반영한다. (과거 전등 상태와는 관계없음) 명령형 프로그래밍에서 문제가 되었던 예측의 어려움은 `light` 변수의 변화 과정 예측의 어려움으로 분리된다. `light` 변수를 누가 언제 조작했는지는 여전히 추적하기 어렵지만, 선언 부분이 분리되어 문제의 위치가 한정되었다.

5. 선언형 언어 예시

6. 선언형 프레임워크 예시

Java 테스트 프레임워크인 JUnit은 클래스나 객체를 선언적 프레임워크에 포함시켜 국소적인 선언적 연산자로 만들고 그 동작을 검증하는 예시이다.[21]

참조

[1] citation Practical Advantages of Declarative Programming
[2] 웹사이트 declarative language https://foldoc.org/d[...] 2004-05-17
[3] 서적 Concepts of programming languages Pearson
[4] 웹사이트 Imperative programming: Overview of the oldest programming paradigm https://www.ionos.co[...] 2023-05-23
[5] 웹사이트 DAMP 2009: Workshop on Declarative Aspects of Multicore Programming http://www.cse.unsw.[...] Cse.unsw.edu.au 2009-01-20
[6] 학위논문 On the Massively Parallel Execution of Declarative Programs http://www.cse.unsw.[...] Technische Universität Berlin 1997-02-14
[7] 웹사이트 An overview on dsls http://phoenix.labri[...]
[8] 웹사이트 Declarative modelling http://www.simulisti[...] Simulistics
[9] 웹사이트 From LCF to HOL: a short history http://www.cl.cam.ac[...] 2021-10-30
[10] 서적 Comparative Programming Languages, Third Edition Addison-Wesley
[11] 서적 Comparative Programming Languages, Third Edition Addison-Wesley
[12] 웹사이트 Birth of Prolog http://alain.colmera[...] 2022-05-25
[13] 간행물 Linear Resolution with Selection Function http://www.doc.ic.ac[...] 1971-Winter
[14] 문서 Robert Kowalski Predicate Logic as a Programming Language http://www.doc.ic.ac[...] Memo 70, Department of Artificial Intelligence, University of Edinburgh. 1973
[15] 서적 Prolog: The Next 50 Years Springer, Cham. 2023
[16] 컨퍼런스 Datalog and Emerging applications http://www.cs.ucdavi[...] Association for Computing Machinery 2011-06-12
[17] 컨퍼런스 Neural Datalog Through Time: Informed Temporal Modeling via Logical Specification
[18] 서적 Knowledge Representation, Reasoning and Declarative Problem Solving https://archive.org/[...] Cambridge University Press
[19] 서적 Handbook of Knowledge Representation Elsevier
[20] citation Practical Advantages of Declarative Programming
[21] 문서 what declarative programming is. Intuitively, it is programming by defining the what (the results we want to achieve) without explaining the how (the algorithms, etc., needed to achieve the results).
[22] 웹사이트 declarative language https://foldoc.org/d[...] 2004-05-17
[23] 서적 Concepts of programming languages Pearson
[24] 간행물 ソフトウェアの30年とこれから https://doi.org/10.1[...] 日本ソフトウェア科学会
[25] 학위논문 On the Massively Parallel Execution of Declarative Programs http://www.cse.unsw.[...] ベルリン工科大学 1997-02-14
[26] 문서 We say the operation is declarative if, whenever called with the same arguments, it returns the same results independent of any other computation state.
[27] 문서 時間軸と何が起きたかを意識せずに宣言的に記述できる https://speakerdeck.[...] sonatard. (2019) 宣言的UI. p.37
[28] Youtube Here is the critical thing. We no longer need to think about how our UI changes over time. What happens is, when we get in the data, we show what it should look like. We show what the next state is. And then framework controls how to get from one state into the other. And so now we no longer need to think about it. And that's the critical piece. https://www.youtube.[...] Leland Richardson (2019-10-24) "Understanding Compose (Android Dev Summit '19)"
[29] 문서 programming concept where an ideal ... representation ... is kept in memory and synced with the “real” DOM by a library ... This approach enables the declarative API ... : You tell React what state you want the UI to be in, and it makes sure the DOM matches that state. This abstracts out the attribute manipulation, event handling ... React. ''[https://reactjs.org/docs/faq-internals.html Virtual DOM and Internals]
[30] 문서 declarative UI ... works by conceptually regenerating the entire screen from scratch, then applying only the necessary changes. React. ''[https://developer.android.com/jetpack/compose/mental-model#paradigm Thinking in Compose]''. Jetpack Compose.
[31] 문서 React provides a declarative API so that you don’t have to worry about exactly what changes on every update. React. ''[https://reactjs.org/docs/reconciliation.html Reconciliation]''.
[32] 문서 前回のViewの状態に依存せずに、最終的に描画されるViewを宣言的に記述できる https://speakerdeck.[...] sonatard. (2019) 宣言的UI. p.37
[33] Youtube Here is the critical thing. We no longer need to think about how our UI changes over time. What happens is, when we get in the data, we show what it should look like. We show what the next state is. And then framework controls how to get from one state into the other. And so now we no longer need to think about it. And that's the critical piece. https://www.youtube.[...] Leland Richardson (2019-10-24) "Understanding Compose (Android Dev Summit '19)"



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com