나는이 용어가 여러 다른 상황에서 계속 던져지고 있다고 들었습니다. 무엇입니까?
답변
선언적 프로그래밍은 원하는 방식이 아니라 원하는 방식으로 코드를 작성할 때 사용됩니다. 방법을 알아내는 것은 컴파일러에게 맡겨져 있습니다.
선언적 프로그래밍 언어의 예로는 SQL 및 Prolog가 있습니다.
답변
다른 답변은 이미 선언적 프로그래밍이 무엇인지 설명하는 환상적인 작업을 수행하므로 유용한 이유에 대한 몇 가지 예를 제공하겠습니다.
상황 독립
선언적 프로그램은 상황에 따라 다릅니다 . 그들은 궁극적 인 목표 만 선언하고 그 목표를 달성하기위한 중개 단계는 선언하지 않기 때문에 다른 프로그램에서 동일한 프로그램을 사용할 수 있습니다. 그것들은 종종 문맥 (예 : 숨겨진 상태)에 의존하기 때문에 명령형 프로그램 과 는 관련이 없습니다.
가지고 yacc
예를 들어. 파서 생성기 일명입니다. 컴파일러 컴파일러, 언어의 문법을 설명하기위한 외부 선언적 DSL로 해당 언어의 구문 분석기가 설명에서 자동으로 생성 될 수 있습니다. 문맥 독립성 때문에 다음과 같은 문법으로 여러 가지 일을 할 수 있습니다.
- 해당 문법에 대한 C 파서를 생성합니다 (의 원래 사용 사례
yacc
) - 해당 문법에 대한 C ++ 파서를 생성
- 해당 문법에 대한 Java 파서 생성 (Jay 사용)
- 해당 문법에 대한 C # 파서 생성 (GPPG 사용)
- 해당 문법에 대한 루비 파서 생성 (Racc 사용)
- 해당 문법에 대한 트리 시각화 생성 (GraphViz 사용)
- yacc 소스 파일 자체를 예쁘게 인쇄하고, 화려하게 형식화하고, 구문을 강조하기 만하면 참조 설명서에 언어의 구문 사양으로 포함시킬 수 있습니다.
그리고 더 많은 …
최적화
어떤 단계를 거치고 어떤 순서로 컴퓨터를 처방하지 않기 때문에 프로그램을 훨씬 더 자유롭게 재정렬하고 일부 작업을 병렬로 실행할 수도 있습니다. 좋은 예는 SQL 데이터베이스에 대한 쿼리 플래너 및 쿼리 최적화 프로그램입니다. 대부분의 SQL 데이터베이스에서는 실제로 실행중인 쿼리와 실행 하도록 요청한 쿼리를 표시 할 수 있습니다. 종종 이러한 쿼리는 아무것도 보이지 않습니다.서로처럼. 쿼리 플래너는 디스크 플래터의 회전 대기 시간 또는 완전히 다른 사용자를 위해 완전히 다른 일부 응용 프로그램이 비슷한 쿼리와 테이블을 실행했다는 사실과 같이 꿈도 꾸지 못했던 것을 고려합니다. 로드를 피하기 위해 열심히 노력했다는 사실은 이미 메모리에 있습니다.
기계가 알아 내기 위해 더 열심히 일해야 :이 흥미로운 트레이드 오프는 여기에 방법 이 명령형 언어에서와보다 뭔가를하지만,이 때 않는 그림 그것을 밖으로, 그것은 최적화를위한 더 많은 자유와 더 많은 정보를 가지고 단계.
답변
느슨하게:
선언적 프로그래밍은 다음과 같은 경향이 있습니다.
- 각각은 문제 영역에서 의미를 가지며 독립적이고 독립적으로 이해 될 수있는 선언 또는 선언문 집합입니다.
명령형 프로그래밍은 다음과 같은 경향이 있습니다.
- 각각의 동작을 수행하는 일련의 명령; 그러나 문제 영역에서 의미가 있거나 없을 수 있습니다.
결과적으로 명령형 스타일은 독자가 시스템이 실제로 수행하는 작업의 메커니즘을 이해하는 데 도움이되지만 해결하려는 문제에 대한 통찰력을 거의 제공하지 못할 수 있습니다. 다른 한편으로, 선언적 스타일은 독자가 문제 영역과 시스템이 문제 해결을 위해 취하는 접근법을 이해하는 데 도움이되지만, 기계 문제에 대해서는 덜 유익합니다.
실제 프로그램 (ProLog 또는 C와 같이 스펙트럼의 끝을 선호하는 언어로 작성된 프로그램조차도)은 다양한 점에서 다양한 스타일로 존재하여 조각의 다양한 복잡성 및 통신 요구를 충족시키는 경향이 있습니다. 한 스타일은 다른 스타일보다 우수하지 않습니다. 그들은 단지 다른 목적에 봉사하며 인생의 많은 것들과 마찬가지로 중재가 핵심입니다.
답변
다음은 예입니다.
CSS (HTML 페이지 스타일 지정에 사용)에서 이미지 요소의 높이와 너비가 100 픽셀이되도록하려면 다음과 같이 원하는 것을 “선언”하면됩니다.
#myImageId {
height: 100px;
width: 100px;
}
CSS를 선언적인 “스타일 시트”언어로 생각할 수 있습니다.
이 CSS 를 읽고 해석 하는 브라우저 엔진 은 이미지를 키가 크고 넓게 보이도록 자유롭게 만들 수 있습니다. 다른 브라우저 엔진 (예 : IE 엔진, Chrome 엔진)은이 작업을 다르게 구현합니다.
물론 고유 한 구현은 선언적 언어로 작성되지 않고 Assembly, C, C ++, Java, JavaScript 또는 Python과 같은 절차 적 언어로 작성됩니다. 이 코드는 단계별로 수행되는 많은 단계이며 함수 호출을 포함 할 수 있습니다. 픽셀 값을 보간하고 화면에 렌더링하는 등의 작업을 수행 할 수 있습니다.
답변
미안하지만 다른 많은 답변에 동의하지 않아야합니다. 선언적 프로그래밍의 정의에 대한이 오해를 막고 싶습니다.
정의
하위 표현식의 참조 투명도 (RT) 는 선언적 프로그래밍 표현식 의 유일한 필수 속성입니다 . 명령형 프로그래밍과 공유되지 않는 유일한 속성이기 때문입니다.
선언적 프로그래밍의 다른 인용 된 속성은이 RT에서 파생됩니다. 자세한 설명은 위의 하이퍼 링크를 클릭하십시오.
스프레드 시트 예
두 가지 답변에 스프레드 시트 프로그래밍이 언급되었습니다. 스프레드 시트 프로그래밍 (일명 수식)이 변경 가능한 전역 상태에 액세스하지 않는 경우 선언적 프로그래밍입니다. 변경이 용이 한 셀의 값은 단일체 때문이다 입력 과 출력 의 main()
(전체 프로그램). 새 값은 각 수식이 실행 된 후 셀에 기록되지 않으므로 선언적 프로그램 수명 동안 스프레드 시트에서 모든 수식이 실행되도록 변경할 수 없습니다. 따라서, 서로에 대해, 상기 식은 이러한 가변성 세포를 불변성으로 본다. RT 함수는 불변의 글로벌 상태 (및 변이 가능한 로컬 상태 ) 에 액세스 할 수 있습니다 .
따라서 프로그램이 종료 될 때 (의 출력으로 main()
) 셀의 값을 변경하는 기능 은 규칙 컨텍스트에서 변경 가능한 저장된 값을 만들지 않습니다. 중요한 차이점은 각 스프레드 시트 수식이 수행 된 후에 셀 값이 업데이트되지 않으므로 수식을 수행하는 순서는 중요하지 않습니다. 모든 선언식이 수행 된 후 셀 값이 업데이트됩니다.
답변
선언적 프로그래밍은 그림이며 명령형 프로그래밍은 해당 그림을 그리는 지침입니다.
컴퓨터가 원하는 위치에 도달하기 위해 수행해야하는 단계를 설명하는 것이 아니라 “그것이 무엇인지 알려면”선언적 스타일로 작성합니다.
XML을 사용하여 데이터를 마크 업하는 경우 “이 사람은 생일이고 거리 주소가 있습니다”라고 말하고 있기 때문에 선언적 프로그래밍을 사용하고 있습니다.
선언적 프로그래밍과 명령형 프로그래밍이 더 큰 효과를 위해 결합되는 몇 가지 예 :
-
Windows Presentation Foundation은 선언적 XML 구문을 사용하여 사용자 인터페이스의 모양과 컨트롤과 기본 데이터 구조 간의 관계 (바인딩)를 설명합니다.
-
구조화 된 구성 파일은 선언적 구문 ( “key = value”쌍과 같이 단순한)을 사용하여 문자열 또는 데이터 값의 의미를 식별합니다.
-
HTML은 텍스트 전체가 문서 전체에서 어떤 역할을하는지 설명하는 태그로 텍스트를 표시합니다.
답변
선언적 프로그래밍은 선언, 즉 선언적 문장으로 프로그래밍됩니다. 선언적 문장에는 명령형 문장과 구별되는 여러 속성이 있습니다. 특히 선언은 다음과 같습니다.
- 정류 (재주문 가능)
- 연관성 (재 그룹화 가능)
- dem 등원 (의미의 변화없이 반복 가능)
- 단조 (선언은 정보를 빼지 않습니다)
관련 포인트는 모두 구조적 특성이며 주제와 직교한다는 것입니다. 선언은 “What vs. How” 에 관한 것이 아닙니다 . “what”을 선언하는 것처럼 “how” 를 쉽게 선언 (표시 및 제한) 할 수 있습니다 . 선언은 내용이 아니라 구조에 관한 것입니다. 선언적 프로그래밍은 코드를 추상화하고 리팩토링하는 방법과 코드를 서브 프로그램으로 모듈화하는 방법에 크게 영향을 주지만 도메인 모델에는 그다지 중요하지 않습니다.
종종 문맥을 추가하여 명령형에서 선언 형으로 변환 할 수 있습니다. 예 : “왼쪽으로 돌립니다. (… 기다립니다 …) 우회전” “밥은 11시 01 분에 푸와 바의 교차로에서 좌회전합니다. 밥은 11시 6 분에 바와 바즈의 교차로에서 우회전합니다.” 후자의 경우에는 문장이 dem 등하 고 정식적인 반면, 전자의 경우에는 문장의 재 배열이나 반복이 프로그램의 의미를 심각하게 변화시킬 수 있습니다.
단조 론 에 관해서는 , 선언은 가능성 을 빼는 제약 을 추가 할 수 있습니다 . 그러나 제약 조건은 여전히 정보를 추가합니다 (보다 정확하게는 제약 조건은 정보 임). 시변 선언이 필요한 경우 명시적인 시간적 의미론을 사용하여이를 모델링하는 것이 일반적입니다. 예를 들어 “공은 평평합니다”에서 “공은 시간 T에 평평합니다”. 모순되는 선언이 두 개있는 경우 일관성이없는 선언 시스템이 있지만 이는 부드러운 제약 조건 (우선 순위, 확률 등)을 도입하거나 불일치 논리를 활용하여 해결할 수 있습니다.
