문제

나는 이 청력 장기 주위에 던져서 여러 가지 서로 다른 상황.그것이 무엇입니까?

도움이 되었습니까?

해결책

선언 프로그래밍은 코드를 작성하고 싶은 일을 설명하는 방식으로 코드를 작성할 때입니다. How를 알아 내기 위해 컴파일러에 맡겨집니다.

선언적 프로그래밍 언어의 예는 SQL과 Prolog입니다.

다른 팁

다른 답변은 이미 선언적인 프로그래밍이 무엇인지 설명하는 환상적인 일을하고 있으므로 왜 그것이 유용한 지에 대한 몇 가지 예를 제공 할 것입니다.

문맥 독립성

선언 프로그램입니다 문맥 독립적. 그들은 궁극적 인 목표가 무엇인지 선언하지만 그 목표에 도달하기위한 중개 단계는 아니기 때문에 동일한 프로그램을 다른 맥락에서 사용할 수 있습니다. 이것은 관련이 있습니다 필수 프로그램, 그들은 종종 상황에 의존하기 때문에 (예 : 숨겨진 상태).

가져가다 yacc 예로서. 파서 생성기 일명입니다. 언어의 문법을 설명하기위한 외부 선언 DSL 인 컴파일러 컴파일러, 해당 언어의 구문 분석기를 설명에서 자동으로 생성 할 수 있습니다. 문맥 독립성으로 인해 그러한 문법으로 많은 다른 일을 할 수 있습니다.

  • 해당 문법에 대한 C 파서를 생성하십시오 (원래 사용 사례 yacc)
  • 해당 문법에 대한 C ++ 파서를 생성하십시오
  • 그 문법에 대한 자바 파서를 생성하십시오 (Jay 사용)
  • 해당 문법에 대한 C# 파서를 생성하십시오 (GPPG 사용)
  • 그 문법에 대한 루비 파서를 생성하십시오 (RACC 사용)
  • 그 문법에 대한 트리 시각화 생성 (GraphViz 사용)
  • YACC 소스 파일 자체의 꽤 인쇄되고 멋진 형성 및 구문 강조 표시를 수행하고 언어의 구문 사양으로 참조 매뉴얼에 포함시킵니다.

그리고 더 많은 …

최적화

컴퓨터에 취해야 할 단계와 순서대로 규정하지 않기 때문에 프로그램을 훨씬 더 자유롭게 재배치 할 수 있으며 일부 작업을 병렬로 실행할 수도 있습니다. 좋은 예는 SQL 데이터베이스의 쿼리 플래너 및 쿼리 최적화기입니다. 대부분의 SQL 데이터베이스는 쿼리를 표시 할 수 있습니다. 실제로 실행 대 쿼리 물었다 실행합니다. 종종 그 쿼리가 보입니다 아무것도 아님 서로처럼. Query Planner는 꿈조차하지 않았다는 점을 고려합니다. 디스크 플래터의 회전 대기 시간 또는 완전히 다른 사용자를위한 완전히 다른 응용 프로그램이 유사한 쿼리와 귀하가있는 테이블을 실행했다는 사실. 가입하고 로딩을 피하기 위해 열심히 노력한 것은 이미 기억에 빠졌습니다.

여기에는 흥미로운 절충이 있습니다. 기계는 알아 내기 위해 더 열심히 노력해야합니다. 어떻게 명령적인 언어로보다 무언가를하는 것보다 하다 파악하면 최적화 단계에 대한 자유와 훨씬 더 많은 정보가 있습니다.

느슨하게:

선언 프로그래밍은 다음을 향한 경향이 있습니다.

  • 각각은 의미 (종종 문제 영역에서)를 갖고 독립적으로 그리고 독립적으로 이해 될 수있는 선언 또는 선언 진술 세트.

필수 프로그래밍은 다음을 향한 경향이 있습니다.-

  • 각각의 명령 시퀀스, 각각은 어떤 조치를 수행합니다. 그러나 문제 영역에서 의미가 있거나 없을 수도 있습니다.

결과적으로, 명령적인 스타일은 독자가 시스템이 실제로 수행하는 일의 역학을 이해하는 데 도움이되지만 해결하려는 문제에 대한 통찰력이 거의 없을 수 있습니다. 반면에 선언적 스타일은 독자가 문제 영역과 시스템이 문제의 해결책을 향한 접근 방식을 이해하는 데 도움이되지만 역학 문제에 대해서는 덜 유익합니다.

실제 프로그램 (Prolog 또는 C와 같은 스펙트럼의 끝을 선호하는 언어로 작성된 프로그램조차도 다양한 지점에서 다양한 각도에 두 스타일이 존재하는 경향이있어 다양한 복잡성과 커뮤니케이션 요구를 충족시키는 경향이 있습니다. 한 스타일은 다른 스타일보다 우월하지 않습니다. 그들은 단지 다른 목적을 제공하며, 인생의 많은 것들과 마찬가지로 중재가 핵심입니다.

미안하지만 다른 많은 답변에 동의하지 않아야합니다. 선언적 프로그래밍의 정의에 대한이 혼잡 한 오해를 중단하고 싶습니다.

정의

하위 표현의 참조 투명성 (RT)은 다음과 같습니다. 필요합니다 선언적 프로그래밍 표현식의 속성, 그것은 명령 프로그램과 공유되지 않은 유일한 속성이기 때문에.

선언적 프로그래밍의 다른 인용 속성은이 Rt에서 파생됩니다. 자세한 설명을 보려면 위의 하이퍼 링크를 클릭하십시오.

스프레드 시트 예

스프레드 시트 프로그래밍을 언급 한 두 가지 답변. 스프레드 시트 프로그래밍 (AKA 공식)이 변동성에 액세스하지 않는 경우 글로벌 상태, 그런 다음 선언적인 프로그래밍입니다. 돌연변이 성 세포 값이 모 놀리 식이기 때문입니다. 입력 그리고 산출main() (전체 프로그램). 새로운 값은 각 공식이 실행 된 후에 셀에 기록되지 않으므로 선언 프로그램의 수명에 대해 변이되지 않습니다 (스프레드 시트에서 모든 공식의 실행). 따라서 서로에 비해, 공식은 이러한 돌연변이 성 세포를 불변으로 본다. RT 기능에 액세스 할 수 있습니다 불변 글로벌 주 (및 또한 변하기 쉬운 현지의 상태).

따라서 프로그램이 종료 될 때 (출력으로서 main()), 규칙의 맥락에서 변이 가능한 저장 값을 만들지는 않습니다. 주요 차이점은 각 스프레드 시트 공식이 수행 된 후에 셀 값이 업데이트되지 않으므로 공식을 수행하는 순서는 중요하지 않습니다. 셀 값은 모든 선언적 공식이 수행 된 후에 업데이트됩니다.

여기 예입니다.

CSS (HTML 페이지 스타일에 사용됨)에서 이미지 요소가 100 픽셀 높이와 100 픽셀의 폭이 되려면 다음과 같이 원하는 것을 "선언"합니다.

#myImageId {
height: 100px;
width: 100px;
}

CSS를 선언적 "스타일 시트"언어로 간주 할 수 있습니다.

읽는 브라우저 엔진 해석 이 CSS는 이미지를 키가 크지 만 넓게 보이게 할 수 있습니다. 다른 브라우저 엔진 (예 : 엔진의 엔진, 크롬 엔진) 은이 작업을 다르게 구현합니다.

물론 그들의 고유 한 구현은 선언적 언어로 작성된 것이 아니라 어셈블리, C, C ++, Java, JavaScript 또는 Python과 같은 절차 적으로 작성됩니다. 이 코드는 단계별로 수행해야 할 여러 단계입니다 (기능 호출이 포함될 수 있음). 픽셀 값을 보간하고 화면에서 렌더링 할 수 있습니다.

선언 프로그래밍은 필수 프로그래밍이 그 그림을 그리는 지침 인 그림입니다.

컴퓨터가 원하는 곳으로가는 단계를 설명하기보다는 "무엇을 말하고 있는지"라는 선언적 스타일로 쓰고 있습니다.

XML을 사용하여 데이터를 표시 할 때 "이것은"사람, 생일이며 거리 주소가 있습니다 "라고 말하기 때문에 선언 프로그래밍을 사용하고 있습니다.

선언적이고 명령적인 프로그래밍이 더 큰 효과를 위해 결합되는 몇 가지 예 :

  • Windows Presentation Foundation은 선언적 XML 구문을 사용하여 사용자 인터페이스의 모습과 컨트롤과 기본 데이터 구조 사이의 관계 (바인딩)가 무엇인지 설명합니다.

  • 구조화 된 구성 파일은 선언 구문을 사용하여 ( "key = value"쌍과 같이 단순)를 사용하여 데이터의 문자열 또는 값이 의미하는 바를 식별합니다.

  • HTML은 전체 문서와 관련하여 각 텍스트가 어떤 역할을하는지 설명하는 태그로 텍스트를 표시합니다.

Excel 페이지를 상상해보십시오. 세금 신고를 계산하기 위해 열이 채워진 열이 있습니다.

모든 논리는 셀에서 선언 된 것으로, 계산 순서는 절차 적으로보다는 공식 자체에 의해 결정됩니다.

그것은 선언적인 프로그래밍의 일종입니다. 프로그램의 흐름보다는 문제 공간과 솔루션을 선언합니다.

Prolog는 내가 사용하는 유일한 선언 언어입니다. 그것은 다른 종류의 생각이 필요하지만 전형적인 절차 프로그래밍 언어 이외의 다른 것에 당신을 노출시키는 것이 좋습니다.

이전 답변을 썼기 때문에 새로운 정의 아래에 인용 된 선언적 재산의. 또한 명령 프로그래밍을 이중 속성으로 정의했습니다.

이 정의는 간결하고 더 일반적이기 때문에 이전 답변에서 제공 한 것보다 우수합니다. 그러나 프로그래밍에 적용 할 수있는 불완전 성 이론과 일반적으로 삶에 적용 할 수있는 불완전성 이론의 의미는 인간이 마음을 감싸기가 어렵 기 때문에 맥주하기가 더 어려울 수 있습니다.

정의에 대한 인용 된 설명은 그 역할에 대해 논의합니다 순수한 기능적 프로그래밍은 선언적 프로그래밍에서 재생됩니다.

선언적 대 필수

선언적 속성은 이상하고 둔감하며 기술적으로 정확한 정의로 캡처하기가 어렵습니다. 일반적으로 남아 있고 모호하지 않은 것이 모호하지 않습니다. 왜냐하면 우리는 의도하지 않은 부작용을 초래하지 않고 프로그램의 의미 (일명 의미론)를 선언 할 수 있다는 순진한 개념이기 때문입니다. 의미의 표현과 의도하지 않은 효과의 회피 사이에는 고유 한 긴장이 있으며,이 긴장은 실제로 불완전 성 정리 프로그래밍과 우주.

그것은 지나치게 단순화되고 기술적으로 부정확하며 종종 선언을 다음과 같이 정의하는 모호합니다. 해야 할 일 그리고 필수 수행하는 방법. 모호한 경우는“무엇”는“어떻게”프로그램을 출력하는 프로그램에서 컴파일러.

분명히 언어를 완성시키는 무한한 재귀, 또한 의미론에서 유사하게 평가의 구문 구조뿐만 아니라 (일명 운영 의미론). 이것은 논리적으로 괴델의 정리와 유사한 예입니다.모든 공리 시스템도 일관성이 없습니다".". 그 인용문의 모순 된 이상함을 숙고하십시오! 또한 의미론의 표현이 어떻게 입증 가능한 경계를 갖지 않는지 보여주는 예이기 때문에 우리는 증명할 수 없습니다.2 그 프로그램 (그리고 동시에 의미론)은 일명 정리 정리를 중단시킨다.

불완전성 이론은 우리 우주의 기본적 특성에서 비롯된다.엔트로피 (일명 독립 가능성의 #) 영원히 최대의 경향이 있습니다".". 프로그램의 코딩과 디자인은 결코 끝나지 않습니다. 살아 있습니다! - 실제 필요를 해결하려고 시도하고 실제 세계의 의미론은 항상 변화하고 더 많은 가능성으로 경향이 있습니다. 인간은 새로운 것을 발견하는 것을 멈추지 않습니다 (프로그램의 오류 포함 ;-).

이 이상한 우주 내에서 앞서 언급 한이 원하는 개념을 정확하고 기술적으로 포착하려면 (우리의 우주의 외부가 없다는 점을 숙고하십시오!) 설명 할 때까지 틀릴 수 없을 정도로 단순한 정의가 필요합니다. 깊이.

정의:


선언 속성은 각각의 특정 모듈 식 의미를 표현할 수있는 하나의 가능한 진술 세트 만 존재할 수있는 곳입니다.

명령 적 재산3 의미론이 구성에서 일관성이 없거나 진술 세트의 변형으로 표현 될 수있는 듀얼입니다.


선언에 대한이 정의는 독특합니다 현지의 의미 론적 범위에서, 모듈 식 시맨틱이 인스턴스화되고 어떻게 사용되는지에 관계없이 일관된 의미를 유지해야한다는 것을 의미합니다. 글로벌 범위. 따라서 각 선언적 모듈 식 시맨틱은 가능한 모든 다른 모든 사람들과 본질적으로 직교해야하며 불가능하지 않아야합니다 (불완전성 이론으로 인해) 글로벌 일관성을 목격하기위한 알고리즘 또는 모델, 이는 또한 "의 요점이기도합니다.더 많은 것이 항상 더 나은 것은 아닙니다”Carnegie Mellon University의 컴퓨터 과학 교수 인 Robert Harper : 표준 ML의 디자이너 중 한 명.

이러한 모듈 식 선언적 의미의 예에는 카테고리 이론 기능이 포함됩니다. 그만큼 Applicative, 명목 타이핑, 네임 스페이스, 필드 및 WRT, 작동 수준의 의미론 및 순수한 기능 프로그래밍.

따라서 잘 설계된 선언적 언어는 할 수 있습니다 더 명확하게 의미를 표현합니다, 표현 될 수있는 것에 대한 일반성이 약간 상실되었지만, 본질적인 일관성으로 표현할 수있는 것에 대한 이득.

앞서 언급 한 정의의 예는 스프레드 시트 프로그램의 셀의 공식 세트입니다. 이는 다른 열 및 행 셀로 이동할 때 동일한 의미를 부여하지 않을 것으로 예상되지 않습니다. IE 셀 식별자는 변경되었습니다. 셀 식별자는 의도 된 의미에 대해 불필요하지 않으며 의도적이지 않습니다. 따라서 각 스프레드 시트 결과는 일련의 공식에서 셀 식별자에 고유 한 WRT입니다. 이 경우 일관된 모듈 식 시맨틱은 셀 식별자를 입력 및 출력으로 사용하는 것입니다. 순수한 세포 공식의 기능 (아래 참조).

Hyper Text Markup Language aka HTML (정적 웹 페이지를위한 언어)는 매우 높은 예입니다 (그러나 완벽하게는 아닙니다.3) (적어도 HTML 5 이전)가 동적 행동을 표현할 능력이 없었던 선언 언어. HTML은 아마도 배우기 가장 쉬운 언어 일 것입니다. 동적 행동의 경우 JavaScript와 같은 명령 스크립팅 언어가 일반적으로 HTML과 결합되었습니다. JavaScript가없는 HTML은 각 공칭 유형 (예 : 태그)이 구문의 규칙 내에서 일관된 의미를 유지하기 때문에 선언적 정의에 맞습니다.

선언에 대한 경쟁 정의는 다음과 같습니다 정류 그리고 Idempotent 시맨틱 진술의 속성, 즉, 진술은 의미를 변경하지 않고 재주문 및 복제 될 수 있습니다. 예를 들어, 이름이 지정된 필드에 값을 할당하는 명령문은 프로그램의 의미를 변경하지 않고 재주문 및 복제 할 수 있습니다. 해당 이름이 묵시적 순서로 모듈 식 WRT 인 경우. 이름은 때때로 순서를 암시하고, 예를 들어 셀 식별자는 열과 행 위치를 포함합니다. 그렇지 않으면 이러한 속성에는 암시 적으로 요구됩니다 글로벌 의미론의 일관성. 순서와 복제가 의미론에 내재되어 있기 때문에 무작위로 순서 또는 복제 된 경우 진술의 의미를 설계하는 것은 일반적으로 불가능합니다. 예를 들어,“foo가 존재한다”(또는 건축)와“foo는 존재하지 않습니다”(및 파괴). 의도 된 의미론의 무작위 불일치 고병을 고려한다면,이 정의를 선언적 재산에 대해 충분히 일반적으로 받아들입니다. 본질적 으로이 정의는 의미론과 직교적으로 일관성을 만들려고 시도하기 때문에 일반화 된 정의로 공허합니다. 글로벌 일관성 패러다임.

(구조적 평가 순서) 하위 수준의 운영 의미론에 대한 정류 및 Idemotent 속성을 요구하는 것은 운영 의미를 선언으로 변환합니다. 현지화 모듈 식 시맨틱, 예를 들어 순수한 기능적 프로그래밍 (명령 루프 대신 재귀 포함). 그런 다음 구현 세부 정보의 운영 순서는 영향을 미치지 않습니다 (즉, 스프레드 전 세계 내로) 상위 수준의 의미론의 일관성. 예를 들어, 모든 출력이 계산 될 때까지 출력이 입력에 복사되지 않기 때문에 스프레드 시트 공식의 평가 순서 (및 이론적으로도 복제)가 중요하지 않습니다.

C, Java, C ++, C#, PHP 및 JavaScript는 특별히 선언적이지 않습니다. Copute의 구문과 Python의 구문은 더 선언적으로 의도 된 결과와 결합, 즉, 외부를 제거하는 일관된 구문 의미론은 코드를 잊어 버린 후에 쉽게 이해할 수 있도록 외부를 제거합니다. Copute and Haskell은 운영 의미론의 결정론을 집행하고 격려합니다.자신을 반복하지 마십시오”(건조)는 순수한 기능적 패러다임 만 허용하기 때문에.


2 우리가 프로그램의 의미를 증명할 수있는 곳, 예를 들어 언어 COQ와 함께, 이것은 표현 된 의미로 제한됩니다. 타이핑, 그리고 타이핑은 프로그램의 모든 의미를 캡처 할 수 없습니다. 예를 들어 HTML+CSS를 사용하는 언어조차도 정의되지 않은 의미를 나타내는 일관되지 않은 조합을 표현할 수 있습니다.

3 많은 설명은 명령적인 프로그래밍 만 구문 적으로 주문한 진술을 가지고 있다고 잘못 주장합니다. 나는 이것을 분명히했다 명령형과 기능적 프로그래밍 사이의 혼란. 예를 들어, HTML 문의 순서는 의미의 일관성을 줄이지 않습니다.


편집 : 나는 그것을 게시했다 다음 의견 Robert Harper의 블로그에 :

기능 프로그래밍에서 ... 변수의 변동 범위는 유형입니다.

기능을 명령 프로그램과 구별하는 방법에 따라 명령 프로그램에서 '할당 가능한'도 변동성에 결합 된 유형이있을 수 있습니다.

현재 기능 프로그래밍에 대해 이해하지 못하는 유일한 정의는 a) 일류 객체 및 유형으로 기능, b) 루프보다 재귀에 대한 선호도 및/또는 c) 순수한 기능-즉 원하는 의미론에 영향을 미치지 않는 함수입니다. 메모 화 될 때 프로그램의따라서 완벽하게 순수한 기능적 프로그래밍은 운영 의미의 영향으로 인한 범용 정의에 존재하지 않습니다. 예를 들어 메모리 할당).

순수한 함수의 Idempotent 속성은 변수의 함수 호출이 그 값으로 대체 될 수 있음을 의미하며, 이는 일반적으로 명령 적 절차의 인수의 경우가 아닙니다. 순수한 함수는 입력과 결과 유형 사이의 무관심한 상태 전이에 대해 선언적 인 것으로 보입니다.

그러나 순수한 기능의 구성은 그러한 일관성을 유지하지 않습니다. 순수한 기능 프로그래밍 언어에서 부작용 (글로벌 상태) 명령 프로세스를 모델링 할 수 있기 때문에, 예를 들어 Haskell의 iomonad 및 또한 그러한 행동을 방지하는 것은 전적으로 불가능합니다. 완전한 순수한 기능 프로그래밍 언어.

나처럼 썼다 2012 년에 비슷한 의견에 대한 합의에 최근 블로그, 그 선언적 프로그래밍은 의도 된 의미론이 결코 불투명하지 않다는 개념을 포착하려는 시도입니다. 불투명 의미의 예는 질서에 의존하는 것입니다 캐스트는 전환이 아니며 재구성 된 제네릭은 상위 수준의 의미를 제한합니다.) 및 프로그래밍 언어로 확인할 수없는 가변 값에 의존합니다.

따라서 나는 비결의 완전한 언어 만 선언 할 수 있다고 결론 지었다.

따라서 선언적 언어의 명백하고 뚜렷한 속성 중 하나는 출력이 열거 가능한 생성 규칙 세트에 순종하는 것으로 입증 될 수 있다는 것입니다. 예를 들어, 스크립트되지 않은 특정 HTML 프로그램 (통역사가 발산되는 방식의 차이를 무시 함)의 경우 (즉, 완료되지 않음) 출력 변동성이 열거 될 수 있습니다. 또는 더 간결하게 HTML 프로그램은 변동성의 순수한 기능입니다. 스프레드 시트 프로그램은 입력 변수의 순수한 기능입니다.

그래서 선언적 언어는 무한한 재귀, 예, 즉 괴델의 두 번째 불완전성 정리 자기 참조 정리는 입증 될 수 없습니다.

레지 램 포트 썼다 유형과 논리 사이의 합동 (Curry-Howard 서신 등)에 의해 프로그래밍 언어 컨텍스트에서 수학 증명에 적합한 Gödel의 불완전성 이론에 대한 유클리드가 어떻게 일했는지에 대한 동화.

설명을 기반으로 한 프로그래밍 방법입니다 무엇 설명하는 대신해야 할 일이 있어야합니다 어떻게 작동해야합니다.

다시 말해, 표현식으로 만든 알고리즘을 작성하지 않고 원하는 방식을 레이아웃 만 레이아웃합니다. 두 가지 좋은 예는 HTML과 WPF입니다.

이 Wikipedia 기사는 좋은 개요입니다. http://en.wikipedia.org/wiki/declarative_programming

무언가를하는 방법이 아니라 원하는 것을 컴퓨터에 설명합니다.

2011 년 12 월부터 제공 한 이후 선언 프로그래밍에 대한 이해를 정제했습니다. 답변 이 질문에. 여기 내 현재의 이해가 따릅니다.

내 이해의 긴 버전 (연구)은 이 링크, 아래에서 제공 할 요약에 대한 깊은 이해를 얻으려면 읽어야합니다.

필수 프로그래밍은 돌연변이 상태가 저장되고 읽는 곳이므로 프로그램 지침의 순서 및/또는 복제는 프로그램의 동작 (의미론)을 변경할 수 있으며 (즉, 의도하지 않은 동작도 마찬가지입니다).

가장 순진하고 극단적 인 의미에서 (이전 답변에서 주장한), 선언적 프로그래밍 (DP)은 모든 저장된 돌연변이 상태를 피하고 있으므로 프로그램 지침의 순서 및/또는 복제는 할 수 있습니다. 아니다 프로그램의 행동 (의미론)을 변경하십시오.

그러나 이러한 극단적 인 정의는 실제 세계에서는 그다지 유용하지 않을 것입니다. 거의 모든 프로그램에는 저장된 돌연변이 상태가 포함되기 때문입니다. 그만큼 스프레드 시트 예 새로운 상태가 저장되기 전에 전체 프로그램 코드가 입력 상태의 하나의 정적 사본으로 완료되기 때문에이 극단적 인 DP 정의를 준수합니다. 그런 다음 상태가 변경되면 반복됩니다. 그러나 대부분의 실제 프로그램은 이러한 모 놀리 식 상태 변화의 모델로 제한 될 수 없습니다.

DP의보다 유용한 정의는 프로그래밍 지침의 순서 및/또는 복제가 불투명 한 의미를 변경하지 않는다는 것입니다. 다시 말해, 시맨틱이 발생하는 의미의 무작위 변화는 없습니다. 프로그램 지침 순서 및/또는 복제의 변경으로 인해 프로그램의 행동에 대한 의도적이고 투명한 변경 만 원인이됩니다.

다음 단계는 어떤 프로그래밍 모델이나 패러다임이 DP에 도움이되는지에 대해 이야기하는 것입니다. 그러나 여기서는 문제가 아닙니다.

선언적 프로그래밍 프로그래밍 선언과 함께,즉선언 문장입니다.선언 문의 번호를 가지는 속성을 구별하는 필수적이다.특히,선언은:

  • 환(다시 주문하실 수 있습니다)
  • 연관(수 있습 집결)
  • 나무 등(반복할 수 있는 없이 의미가 변경)
  • 단조(선언하지 않을 빼 정보)

관련된 지점은 이러한 모든 구조적 특성 및 직교하는 주제를 파악할 수 있습니다.선언에 대한하지 않는 "무엇을 대는 방법".우리는 선언 할 수 있습니다(나타내고 제한)a 는 방법"" 으로 쉽게 우리가 선언 "무엇". 선언이 구조에 대해지 않는 내용입니다. 선언적 프로그래밍에 상당한 영향을 미치는 방법을 우리는 추상적이고 리팩터 우리의 코드,그리고 어떻게 우리가 그것은 모듈화 하위 프로그램으로,하지만 너무 많은 도메인 모델입니다.

종종 우리가 할 수 있습으로 변환이 필수적 선언을 추가하여 context.E.g."에서 좌회전합니다.(...다)우회전하십시오."를"밥에서 좌회전의 교차 Foo 및 바 11:01.밥은 차례 오른쪽의 교차로에서 바 Baz11:06." 참고 후자의 경우에 이 문장은 나무 등과 호환되는 반면,전자의 경우에는 다시 정렬하거나 반복되는 문장은 것이 심각하게 변화의 의미는 프로그램입니다.

단조, 선언 할 수 있습 추가 제약 는 빼기 가능성.그러나 제약 조건이 여전히 추가 정보를(더 정확하게 제약하는 정보).우리가 시간이 필요합-다양한 선언,그것은 전형적인 모델이 명시적인 시간적 의미를-예를 들어,에서"공은 평"을"공은 평 시 T".면 우리는 두 개의 모순이 선언을,우리는 일관성이 없는 선언적인 시스템지만,이를 통해 해결될 수도 있습 소개 소프트 제약 조건(우선순위,확률,etc.) 또는 활용하여 paraconsistent 논리입니다.

선언 프로그래밍은 "기계의 운영 모델보다는 개발자의 정신 모델을 준수하는 언어로 프로그래밍 행위"입니다.

선언적 프로그래밍과 명령 프로그램의 차이점은 구조화 된 데이터를 구문 분석하는 문제로 잘 설명되어 있습니다.

명령 프로그램은 상호 재귀 함수를 사용하여 입력을 소비하고 데이터를 생성합니다. 선언 프로그램은 데이터의 구조를 정의하여 구문 분석 할 수있는 문법을 표현합니다.

이 두 가지 접근법의 차이점은 선언 프로그램이 호스트 언어보다 문제의 정신 모델에 더 밀접하게 매핑되는 새로운 언어를 만듭니다.

이상하게 들릴지 모르지만 선언 시스템 목록에 Excel (또는 모든 스프레드 시트)을 추가합니다. 이것의 좋은 예가 제공됩니다 여기.

DP가 표현하는 방법이라고 설명합니다.

  • 목표 표현, 우리가 찾고있는 조건. 하나, 아마도 많은 것이 있습니까?
  • 알려진 사실
  • 알고있는 사실을 확장하는 규칙

... 그리고 공제 엔진이있는 곳은 일반적으로 통일 목표를 찾는 알고리즘.

내가 알 수있는 한, Prolog는 추상적 인 방식으로 사물을 선언하는 것에 관한 것이기 때문에 Prolog와 같은 프로그래밍 시스템을 설명하는 데 사용되기 시작했습니다.

위의 사용자가 제공 한 정의가 있기 때문에 점점 더 의미가 없습니다. HTML의 선언적 프로그래밍에 반대하는 Haskell의 선언적 프로그래밍 사이에는 걸프가 있음이 분명해야합니다.

몇 가지 다른 예에는 선언적 프로그래밍:

  • ASP.Net 태그에 대한 데이터 바인딩.그냥 말한다"이것을 채우드와 함께 이 소스",예를 들어,그리고 나뭇잎에 대한 시스템이 어떻게 일어난다.
  • 식 Linq

선언적 프로그래밍이 좋은 데 도움이 될 수 있기 때문에 화 정신 모델*코드고 할 수 있기 때문에 결국은 확장성을 보장할 수 있습니다.

예를 들어,말하자는 함수가 있는가를 각각 배열의 요소 또는 목록입니다.전통적인 코드는 다음과 같이 보일 것입니다.

foreach (object item in MyList)
{
   DoSomething(item);
}

No big deal there.하지만 무엇을 사용하는 경우에는 더 많은 선언적 구문을 대신 정의 DoSomething()동작으로?그런 다음 그것은 말할 수 있는 이 방법:

MyList.ForEach(DoSometing);

이것은 물론,더 간결하고 있습니다.그러나 나는 당신이 더 문제보다 단지 절약 두 줄의 코드입니다.성능에 대한 예입니다.옛날 방식으로,처리 할 수 있었습니다.어떤 경우.ForEach()메소드는 방법이 있었 당신을 위해 신호를 처리할 수있는 다음과 같은 작업을 수행한다 병렬이 자동으로?지금 갑자기 모든 당신이 당신의 코드 멀티-스레드에 안전한 방법으로 변경 한 줄의 코드입니다.고,사실이 있는 extension 습니다.Net 는 당신이 그 작업을 수행 할 수 있습니다.

  • 을 따르는 경우에는 연결,그것은 당신이 블로그 게시물에 의고 있습니다.전체 게시물은 약간의 장,하지만 당신은 아래로 스크롤 할 수 있습니다 제목은 제목 "문제"_and 그것을 선택하 거기에 아무 문제도 없습니다.*

텍스트에 답을 제출하는 방법에 따라 다릅니다. 전반적으로 특정 관점에서 프로그램을 볼 수 있지만 문제를 보는 각도에 따라 다릅니다. 나는 당신이 프로그램을 시작하게 할 것입니다 : Dim Bus, Car, Time, Height As Integr

다시 한 번 문제가 전반적으로 무엇인지에 달려 있습니다. 프로그램으로 인해 단축해야 할 수도 있습니다. 그렇지 않은 경우 이것이 피드백이 도움이되기를 바랍니다. 감사합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top