명령형, 절차 형 및 구조화 된 프로그래밍의 차이점은 무엇입니까?


85

주변에서 연구 (도서, Wikipedia, SE에 대한 비슷한 질문 등)를 통해 나는 명령 프로그래밍이 컴퓨터가 실행할 명령 (또는 문장)을 설명하는 주요 프로그래밍 패러다임 중 하나라는 것을 알게되었습니다. 특정 조치를 취하기 위해 많은 주문을하므로 이름은 "제국"입니다. 여태까지는 그런대로 잘됐다.

반면 절차 적 프로그래밍은 명령형 프로그래밍의 특정 유형 (또는 하위 집합)으로, 컴퓨터에서 수행해야하는 명령을 설명하기 위해 프로 시저 (예 : 함수)를 사용합니다.

첫 번째 질문 : 절차 적이 지 않은 명령형 프로그래밍 언어가 있습니까? 다시 말해, 절차없이 명령형 프로그래밍을 할 수 있습니까?

업데이트 :이 첫 번째 질문에 대한 답변이있는 것 같습니다. 절차 적이거나 구조화되지 않은 언어는 필수적입니다. 순수한 어셈블리 언어가 그 예입니다.

그런 다음 구조적 프로그래밍도 있는데, 이는 GOTO 문에 대한 의존성을 제거하기 위해 등장한 명령형 프로그래밍의 또 다른 유형 (또는 서브 세트) 인 것 같습니다.

두 번째 질문 : 절차 적 프로그래밍과 구조적 프로그래밍의 차이점은 무엇입니까? 다른 하나 없이도 가질 수 있습니까? 절차 적 프로그래밍이 이미지에서와 같이 구조화 된 프로그래밍의 하위 집합이라고 말할 수 있습니까?

여기에 이미지 설명을 입력하십시오

답변:


52

프로그래밍 언어, 특히 객체 지향 언어 이외의 언어에 대해서는 많은 용어를 재사용 (종종 오용) 할 수 있습니다.

다음은 용어에 대한 작은 설명입니다.

  1. 명령형 프로그래밍-프로그래밍이 광범위하게 조립되어 있던 옛날에는 코드에 수많은 GOTO가있었습니다. FORTRAN 및 BASIC과 같은 고급 언어조차 동일한 프리미티브를 사용하기 시작했습니다. 이 프로그래밍 패러다임에서 전체 프로그램은 단일 알고리즘이거나 단계별로 작성된 선형 기능입니다. 이것은 필수 스타일 입니다. 현대 C 언어로도 완전히 나쁜 명령을 작성할 수는 있지만 더 높은 수준의 언어로 코드를 구성하는 것은 매우 쉽다는 것을 이해하십시오.

  2. 구조적 및 모듈 형 프로그래밍-대부분의 경우 상호 교환 가능하지만 미묘한 차이가있는 용어를 사용할 수 있어야합니다. 더 높은 수준의 언어가 더 풍성해지기 시작했을 때, 모든 작업 단위가 더 작고 다루기 쉬운 부분으로 나뉘어 야한다는 것을 깨달았습니다. 즉, 함수가 존재하고 프로그래밍이 함수의 계층이되어 낮은 수준의 많은 사람들이 재사용 될 수 있습니다.

    • 구조적 프로그래밍 은 기능이 for loop, while loop, if... then블록 구조 와 같은 단위로 나뉘어 질 때의 모든 프로그래밍 입니다.
    • 또한 여기에서 코드 (기능)를 재사용 할 수 있습니다.
    • 에서 모듈 프로그래밍 , 하나는 패키지의 물리적 형태를 만들 수 있습니다 - 배송 할 수있는 코드의 덩어리, 즉; 이것은 상당히 일반적인 목적이며 재사용이 가능합니다. 이를 함께 컴파일 된 요소 모듈 이라고 합니다 .
    • 따라서 구조화되지 않은 모듈 식 프로그램은 거의 볼 수 없으며 그 반대도 마찬가지입니다. 기술적 정의는 미묘하게 다르지만 대부분 구조화 된 코드는 모듈 식 및 다른 방식으로 만들 수 있습니다.
  3. 그런 다음 문헌에 잘 정의 된 "객체 지향 프로그래밍"이 나왔습니다. 객체 지향 프로그래밍 정의에 의한 구조적 프로그래밍의 한 형태 라는 것을 이해하십시오 . 구조화 된 코드이지만 객체 지향적이 아닌 모든 함수 기반 코드의 새로운 이름을 종종 절차 적 프로그래밍이라고합니다.

    • 따라서 기본적으로 함수 (또는 프로 시저)가 데이터를 지배하는 구조화 된 코드를 절차 적이라고하고 클래스 및 객체 기반 표현을 객체 지향이라고합니다. 정의에 따라 둘 다 모듈 식입니다.

많은 사람들은 모든 구조화 된 프로그래밍 (객체 기반 건너 뛰기)을 명령형 프로그래밍이라고 생각합니다. 필자는 이것이 명령형 프로그래밍에 대한 명확한 정의가 없기 때문일 뿐이라고 생각합니다. 많은 명령을 수행하지 않을 때 구조화 된 프로그래밍을 수행하고 있습니다! 그러나 여전히 많은 함수와 C 또는 FORTRAN 프로그램 내부에 많은 goto 문을 작성하여 혼합 할 수 있습니다.

귀하의 질문에 구체적으로 :

첫 번째 질문 : 순수한 어셈블리 언어는 구조적이거나 절차 적이 지 않은 명령형 언어입니다. (단계적으로 해석 제어 흐름이 있다고해서 절차적인 것은 아닙니다. 그러나 기능을 기능으로 나누는 것이 언어 절차를 만드는 것입니다).

  • 수정 * 대부분의 최신 형태의 어셈블리 DO는 기능 사용을 지원합니다. 사실, 높은 수준의 코드에서 가능한 모든 것이 작동하기 위해 낮은 수준으로 존재합니다. 절차 코드를 작성하는 것이 훨씬 좋은 방법이지만 절차 코드와 명령 코드를 모두 작성할 수 있습니다. 후자와는 달리, 유지 관리가 쉽고 이해하기 쉽습니다 (끔찍한 스파게티 코드는 피함). 필자는 순전히 명령 적이라는 칭찬에 더 잘 맞는 쉘 / bash 스크립트가 있다고 생각하지만 대부분의 경우 기능이 있기 때문에 개발자는 자신의 가치가 얼마나되는지 분명히 이해합니다.

두 번째 질문 : 절차 적 프로그래밍이있다 FORM 구조화 프로그래밍.


보너스

  • 일부 분류법에 따르면 기본 분류는 선언적 (또는 기능적 언어) 대 명령형입니다. 선언적 언어는 제어 흐름을 설명하지 않고 계산할 수있는 반면, 명시 적 제어 흐름 (단계별)이 정의되어야합니다. 이러한 분류에 따라 명령형 프로그래밍은 구조화 된 모듈 식 및 OO 프로그래밍의 수퍼 세트 일 수 있습니다. 이 참조 OOP 대 기능 프로그래밍

  • 객체 지향 이후에 발명 된 다른 프로그래밍 패러다임이 있습니다. 자세한 내용은 여기를 참조하십시오. 측면 지향, 주제 지향 및 역할 지향 프로그래밍의 차이점은 무엇입니까?


1
따라서 절차 적 프로그래밍은 반드시 구조적 프로그래밍이지만, 그 반대는 사실이 아니지만 (종종 경우에 따라) 그렇지 않습니까?
Daniel Scocco

2
네, 그렇게 말할 것입니다.
Dipan Mehta

1
내 대답에서 나는 명령 적 대 구조적을 정의했습니다-명령 적 프로그래밍은 단계별 실행으로 작성되고 구조화되지 않습니다. 그러나 일부 정의에 따르면 다른 분류가 있습니다. 이것은 선언적 (또는 기능적 언어)과 명령형의 분류입니다. 선언적 언어는 명시 적 제어 흐름 (단계별)이 정의 된 곳에서 제어 흐름을 설명하지 않고 계산을 허용합니다. 이 분류에 따라 명령형 프로그래밍은 일부의 경우 구조화 된 상위 집합이 될 수 있습니다. 일부는 그 정의를 따르지 않습니다.
Dipan Mehta

구조적 프로그래밍의 정의와 관련하여 다른 의견이 있습니다. 구조적 프로그래밍과 모듈 식 프로그래밍은 같은 것이 아닙니다. 이 노트의 끝에있는 정의를 참조하십시오. 동일한 링크는 Assembler **가 ** 구조화 된 프로그래밍 언어임을 나타냅니다! STP : en.wikipedia.org/wiki/Structured_programming 정의에 대한 참조 – Emmad Kareem
NoChance

"물리적 형태의 패키지"는 ... 파일입니까, 파일 / 디렉토리 / 파일입니까? (또는 그렇지 않은데, 다른 것입니다.)
n611x007

4

첫 번째 질문 : 예. 많은 순수한 객체 지향 언어가 적합합니다. 함수에 매우 가까운 메소드가 있지만 메시지로 이러한 메소드를보고 언어 프로 시저를 호출하기에 충분한 가중치를 부여하지 않습니다.

두 번째 질문 : 차이점은 종종 다른 범위에 있습니다. 어디에서나 goto 문으로 함수를 가질 수 있습니다. 프로 시저 스타일이지만 구조화 된 프로그래밍은 아닙니다. 반면, 대부분의 OO 언어는 구조적 프로그래밍을 지원하고 권장하지만 절차 적 프로그래밍은 지원하지 않습니다.

절차 적 프로그래밍은 프로그램의 글로벌 순서를 설명합니다. 절차 프로그램은 콜 그래프를 보면 가장 효과적으로 이해되는 프로그램입니다. 구조 프로그래밍은 로컬 속성으로, goto와 반대로 if와 while을 사용하는 데 적용됩니다.

따라서이 두 속성은 분리되어 있으므로 둘 중 하나를 가질 수 있습니다.


1
절차 적 절차에 대한 유일한 리트머스 테스트는 언어에 절차 (함수 또는 방법 )가 포함되어 있고 명령형이어야한다는 것입니다. 비 선언적. 이는 순수한 기능이 아닌 대부분의 OO 언어가 절차 적이라는 것을 의미합니다.
dietbuddha

1
@dietbuddha :이 정의에 따르면 Haskell은 모나드를 사용하여 절차 언어로 사용할 수 있습니다. 언어 절차 절차를 만들기 위해 절차에 어느 정도 의존해야합니다.
thiton

나는 Haskell을 잘 모르지만, Haskell은 Monads의 부작용을 감싸기 때문에 순수한 기능적 언어라고 생각했습니다.
dietbuddha

2
음, 어떤 사람들은 (또는 GHC에 있기 때문에 외부 세계와 상호 작용 할 수 있기 때문에 하스켈은 순수하게 작동하지 주장 확장 , unsafePerformIO하복 (Havok)을 wreaking 허용을). 다른 사람들은 Haskell이 가장 좋아하는 명령형 프로그래밍 언어라고 농담합니다. 그러나 사실, 매우 큰 수준의 Haskell 코드는 깨끗하게 분리되어 IO있으며 비표준 허점을 사용하여 부작용을 몰래 사용하고 순수하게 기능합니다.

1
@thiton 동의하지 않습니다. 모나드는 기능적인 구성이기도합니다. 그들은 Haskell의 구문 설탕 ( "표기법")으로 인해 필수적으로 보입니다. 모나드의 설탕을 제거하면 기능적 특성이 분명해집니다. 대조적으로, OO 언어는 반드시 필수적입니다. 핵심적으로 순차적 인 문장 실행을 기반으로합니다.
Andres F.

2

지난 50 년 동안 인기있는 대부분의 언어는 Von Neumann 아키텍처 라고 불리는 널리 알려진 컴퓨터 아키텍처를 중심으로 설계되었습니다 .

이러한 언어를 명령형 언어라고합니다.

폰 뉴 마안 컴퓨터에서, 데이터와 프로그램은 모두 같은 메모리에 저장됩니다. 명령어를 실행하는 CPU는 메모리와 분리되어 있습니다. 따라서 명령어와 데이터는 메모리에서 CPU로 전송되어야합니다. CPU의 작업 결과는 메모리로 다시 이동해야합니다. 1940 년대 이후에 구축 된 거의 모든 디지털 컴퓨터는 폰 뉴 마안 아키텍처를 기반으로합니다.


1
+1이 질문과 어떤 관련이 있는지 확실하지 않지만 흥미로운 답변입니다.
척 콘웨이

2
뭐? 명령형 대 절차 적 등의 부분은 어디에 있습니까?
bbqchickenrobot

여기서 중요한 점은 프로그램 구조 (불법적, 선언적, 절차 적, 객체 지향적, 기능적 등)에 대한 문제는 언어 구성이며 모든 프로그램은 궁극적으로 Von Neumann 아키텍처 시스템에서 처리된다는 것입니다. 이것은 모든 Turing Complete 언어가 동일하다고 말하는 것과 비슷합니다.
ChuckCottrill

2

나는 지금까지 주어진 답변 중 어느 것도 개념의 핵심을 잘 포착하지 못하고 있습니다.

명령형, 절차 형 및 구조는 상호 배타적 인 속성이 아니며 모델링 논리의 단일 측면에만 중점을 둡니다.

명령형은 선언적의 반대 부분입니다. 기본적으로 명령형 컴퓨터 는 사용자가 제공하는 일련의 명령을 실행하여 수행 할 작업 을 컴퓨터에 알려줍니다 . 반면에 선언적 프로그램은 무엇을 성취해야하는지 알려줍니다 . 즉, 단계를 정의하고 결과를 정의하십시오.

절차 적 프로그래밍은 프로세서 (하드웨어 또는 인터프리터)가 명령어를 컴파운드로 마무리하고 컴파운드로 점프 한 후 컴파운드가 실행되면 점프 후 포인트로 돌아갈 수있는 기능을 말합니다. 이것은 사소한 것처럼 들릴 수 있지만 오늘날의 표준에 따르면이 작업을 수행하기 전에 기계에서 약간의 기본 지원이 필요합니다. 스택 포인터. 마이크로 프로세서는 곧이 기능을 제공했지만 펀치 테이프 또는 펀치 카드 프로세서와 같이 순차적으로 공급되는 명령 만 실행할 수있는 기본 프로세서를 상상할 수 있습니다.

구조화 된 프로그래밍은 다른 명령어로 건너 뛰는 능력에서 다음 단계입니다. 궁극적으로 모든 것이 점프로 귀결되지만 조건부 점프가 가능한 경우 if-then, for, while, repeat-until 및 switch와 같은 기본 제어 흐름 명령문을 작성할 수 있습니다. 이를 적용하는 것을 구조적 프로그래밍이라고합니다.

현대의 프로그래밍 환경에서는 위의 모든 내용을 마음대로 사용할 수 있으며 당연한 것으로 간주하여 더 이상 그런 말을하지 않습니다. 언어 간의 차별화 특성은 오랫동안 객체 지향 및 기능 프로그래밍과 같은 상위 레벨 패러다임으로 전환되었습니다.

선언적 프로그래밍은 여전히 ​​흔하지 않은데, 주로 도메인이 항상 어느 정도는 특정 적이기 때문입니다. 범용 선언 언어를 사용할 수 없습니다. 이것이 우리가 선언적 프로그래밍 또는 "모델링"이 4 세대로 간주 될 소위 3 세대 언어에 여전히 붙어있는 이유입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.