선언적 프로그래밍과 절차 적 프로그래밍 패러다임의 차이점은 무엇입니까?


답변:


108

피할 수 없는

절차 적 또는 객체 지향 프로그래밍 패러다임 과 같은 명령형 프로그래밍 패러다임에는 여러 하위 패러다임이 있습니다.

명령형 프로그래밍 패러다임에서는 다양한 추상화 수준에서 알고리즘을 단계별로 설명합니다.

절차 적 패러다임을 지원하는 프로그래밍 언어의 예 :

  • C (및 대부분의 다른 레거시 언어)
  • PHP, 대부분
  • 어떤 의미에서 모든 주요 언어는

객체 지향

일반적으로 기본 유형에서 파생 유형으로 메서드와 상태를 모두 상속하는 유형계층 구조 를 나타내는 언어를 나타내지 만 특이한 프로토 타입 기반 JavaScript도 포함합니다.

OO 패러다임을 지원하는 프로그래밍 언어의 예 :

  • 자바

선언적

기능적 또는 논리 프로그래밍 패러다임과 같은 선언적 프로그래밍 패러다임에는 여러 하위 패러다임이 있습니다.

선언적 프로그래밍 패러다임에서는 결과 또는 목표를 설명하고 " 블랙 박스 " 를 통해이를 얻습니다 . 명령 의 반대입니다 .

선언적 프로그래밍 패러다임을 지원하는 프로그래밍 언어의 예 :

  • 야크
  • 나무 꼭대기
  • SQL
  • 정규식
  • 법률
  • XSLT
  • 마크 업, troff, CSS, VHDL

기능의

함수형 프로그래밍은 부작용이없고 변경 가능한 상태가없는 함수의 적용을 강조합니다. 위의 선언적 시스템은 함수형 프로그래밍의 특정 측면을 보여줍니다.

선언적 기능 패러다임을 지원하는 프로그래밍 언어의 예 :

  • Haskell
  • OCaml
  • 계획
  • 얼랑
  • 에프#
  • 스칼라

61

선언적 프로그래밍은 방법을 말할 필요없이 원하는 것을 말하는 곳입니다. 절차 적 프로그래밍에서는 결과를 얻기 위해 정확한 단계를 지정해야합니다.

예를 들어 SQL은 쿼리가 결과를 생성하는 단계를 지정하지 않기 때문에 절차 적보다 선언적입니다.


2
SQL에 대한 좋은 예는 +1입니다. 더 많은 예를 들어 주시겠습니까?
mauris

5
Mauris : 프로그래밍 언어가 아닐 수도 있지만 HTML은 선언적입니다. "문자열 그리기, 문자열 측정, 위치 이동 등"을 작성하는 대신 원하는 내용 ( 이 비트 가 굵게 표시된 단락)을 설명하기 때문입니다 . 또 다른 예는 Prolog입니다. 여기서 "프로그램"은 사실과 관계 / 추론의 선언적 집합과 쿼리입니다. Prolog 엔진은 쿼리를 평가하는 방법을 알아냅니다. 그렇게하는 방법을 말할 필요가 없습니다. 마지막으로, 정규식 : 일치 여부를 테스트하는 단계를 철자가 아닌 패턴을 설명합니다.
itowlson

MXML (Flex 프레임 워크의 일부)은 선언적입니다. 객체 / 컨테이너를 표시 할 순서를 지정하고 수평 또는 수직으로 배치하도록 지시했는지 여부에 따라 레이아웃을 처리합니다. ActionScript 3는 OOP 패러다임을 지원하는 절차 적입니다.
Hooray Im Helping

메이크는 다른 아주 유명한 선언적 언어
스테파노 Borini

25

실제 예를 들어 보겠습니다. 차 한 잔이 필요합니다.

절차 :

  1. 주방으로 이동
  2. 설탕, 우유, 차를 마시고
  3. 그들을 섞고 불에 끓을 때까지 가열하십시오
  4. 컵에 담아서 가져와

선언적 :

  1. 차 한 잔주세요.

절차 적 언어에서는 전체 프로세스를 정의하고이를 수행하는 단계를 제공합니다. 주문을 제공하고 프로세스가 제공되는 방식을 정의하기 만하면됩니다.

선언적 언어에서는 명령 또는 순서를 설정하고 해당 순서를 완료하는 방법을 시스템에 표시합니다. 어떻게해야하는지 파헤 치지 않고 결과 만 있으면됩니다.


2
이 극도로 단순화 된 예제는 실제로 저를 위해 포인트를 가져 왔습니다. 그러나 한 가지 여전히 저를 괴롭 히고 차이점을 이해하려고 노력합니다. "차 한잔 가져와"명령이 없으면 어떻게해야합니까? 그런 다음 직접 만들어야합니까? 그렇다면 절차 적 예제와 유사한 함수를 만들지 않겠습니까? 나를 혼란스럽게 만드는 것은 절차 적선언적 이 특정 언어 의 고정 된 속성이 아니라 해당 언어를 사용하는 방법 처럼 보인다는 것 입니다. Java로 "Get me a cup of tea" 라고 말할 수 있습니다.이 방법이 사용 가능한 경우 ...
Magnus W

3
"1. Tea, Earl Grey, Hot"이 더 좋은 예일까요? 수행해야 할 작업이 아니라 전달해야 할 작업을 선언합니다 ( 'Get me ...')
JeffUK

Magnus, 당신의 질문은 절대적으로 옳습니다. 제 생각에는 선언적 언어는 더 높은 수준의 언어이며 절차 적 언어에서 파생됩니다. 개발자가 명령 줄을 사용하여 두 개의 숫자를 추가해야 할 때를 기억하십니까? 이제 간단한 함수로 두 개 이상의 숫자의 SUM을 얻을 수 있습니다. 따라서 제 관점에서 "Get me a cup of tea"명령이 없으면 생성해야합니다. 다음 사람이 사용하려고하면 거기에있을 것입니다. 그것은 나의 가난한 지식에 따른 것입니다. 감사합니다
Muhammad Zeeshan Tahir

5

절차 적 프로그래밍 :

절차 적 프로그래밍에서 프로그램이 시작되면 일련의 명령을 따릅니다. 지침은 일부 파일 또는 메모리 콘텐츠에 따라 변경 될 수 있지만 전반적으로 크게 다르지는 않습니다. 프로그램에 대한 입력은 일반적으로 실시간 사용자 입력이 아니라 미리 수집 된 데이터 세트에서 발생합니다.

선언적 프로그래밍 :

선언적 이벤트 기반 프로그래밍에서 프로그램이 수행 할 수있는 선택적 작업을 통해 데이터 본문을 중앙 집중화합니다. 예를 들어 워드 프로세서의 각 "이벤트"는 데이터, 문서에 영향을주는 마우스 또는 키보드 (또는 파일) 변경 사항입니다. 어떤 순서로도 수행 할 필요가 없습니다. 이벤트 기반 프로그래밍은 모두 공통 데이터 집합에서 작동하는 작은 프로그램 (이벤트 처리기)의 형태를 취하므로 각 작은 프로그램은 동일한 데이터 (이 예제의 문서)를 사용할 수 있습니다.


0

이 개 프로그래밍 언어 사이의 주요 차이점은, 절차 적 프로그래밍에서, 우리는 컴퓨터에게 어떻게 문제를 해결하는 방법과 선언적 프로그래밍에, 우리는 컴퓨터에게 무엇을 우리가 해결하려는 문제.


0

ansible 주석을 다루고 둘의 차이점 사이의 예를 제공 할 수 있습니다. Ansible은 puppet 또는 terraform과 같은 것이 선언적인 절차 적입니다. 예를 들어 ansible yaml 파일을 생성하여 다음과 같이 10 개의 ec2 인스턴스를 배포합니다.
-ec2 : count : 10 image : ami-058c6e5b73b074cd2 instance_type : t2.micro

해당 파일을 두 번 실행하면 20 개의 t2.micro ec2 인스턴스가 생성됩니다. terraform과 같은 선언적 언어로 동등한 것을 작성하고 두 번 실행하면 몇 번 실행하더라도 10 개의 t2.micro 인스턴스 만 실행됩니다. 선언적 언어는 종료 상태를 지정합니다. 절차 적 언어는 현재 또는 과거 상태에 관계없이 사용자가 말하는대로 수행합니다.


-1

그래서 YAML은 선언적 프로그래밍 언어입니까? 실제 논리를 작성하는 대신 원하는 것을 정의하기 때문입니다.

구성 관리 도구 인 Ansible을 아는 사람이 있으면 YAML을 사용하지만 여전히 절차 적 언어 범주에 속하기 때문에 이것을 묻습니다.



이것은 대답이 아닌 매우 주장 된 코멘트와 비슷합니다
zardilior

-2

절차 적 접근 방식에서는 결과를 얻기 위해 지침을 인코딩합니다. 선언적 접근 방식에서는 문제 해결에 대한 지식으로 해결해야 할 사항을 정의합니다. 두 가지 접근 방식에서 구현 한 절차 적 또는 선언적 접근 방식 예제를 살펴보십시오 .

예에서 볼 수 있듯이 선언적 접근 방식에서는 문제 해결 방법을 지시 할 필요가 없습니다.


여기에 작성된 것처럼 오프 사이트 예제를 참조하고 있습니다. 답변의 일부로 예제를 가져 오십시오.
ChronoFish 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.