프로그래밍 패러다임

Programming paradigm

프로그래밍 패러다임은 프로그래밍 언어를 특성에 따라 분류하는 방법입니다.언어는 여러 패러다임으로 분류할 수 있다.

일부 패러다임은 주로 부작용 허용과 같은 언어의 실행 모델에 대한 함의 또는 실행 모델에 의해 연산 시퀀스가 정의되는지 여부에 관한 것이다.다른 패러다임은 주로 코드에 의해 수정된 상태와 함께 코드를 단위로 그룹화하는 것과 같은 코드의 구성 방식과 관련이 있습니다.그러나 다른 사람들은 주로 구문과 문법의 스타일에 관심이 있다.

일반적인 프로그래밍 패러다임은 다음과 같습니다.[1][2][3]

  • 프로그래머가 기계에게 상태를 바꾸는 방법을 지시하는 필수 사항입니다.
    • 지침을 절차로 그룹화하는 절차,
    • 명령이 작동하는 상태의 일부와 함께 그룹화된 객체 지향,
  • 프로그래머가 단순히 원하는 결과의 속성을 선언하지만 그것을 계산하는 방법은 선언하지 않는 선언적
    • 원하는 결과가 일련의 기능 애플리케이션의 값으로 선언되는 기능,
    • 사실과 규칙의 체계에 대한 질문에 대한 답변으로 원하는 결과가 선언되는 논리
    • 최적화 문제의 해결책으로 바람직한 결과가 선언되는 수학
    • 데이터 스트림과 변화의 전파를 통해 원하는 결과를 선언하는 사후 대응적

프로그램이 자신을 참조할 수 있도록 하는 반사와 같은 기호 기법도 프로그래밍 패러다임으로 간주될 수 있다.그러나 이는 주요 패러다임과 호환되므로 그 자체로 진정한 패러다임은 아니다.

예를 들어, 명령 패러다임에 속하는 언어에는 두 가지 주요 특징이 있습니다: 그들은 연산 발생 순서를 명시하고, 그 순서를 명시적으로 제어하는 구조들과 함께, 그리고 그들은 코드의 한 단위 내에서 한 시점에서 상태가 수정될 수 있는 부작용을 허용하고, 나중에 다른 시점에서 읽을 수 있습니다.코드 단위가 다릅니다.코드 단위 간의 통신은 명시적이지 않습니다.한편, 객체 지향 프로그래밍에서 코드는 객체의 일부인 코드에 의해서만 수정되는 상태를 포함하는 객체로 구성됩니다.대부분의 객체 지향 언어도 명령어입니다.이와는 대조적으로 선언적 패러다임에 맞는 언어에는 연산을 실행하는 순서가 명시되어 있지 않습니다.대신 시스템에서 사용할 수 있는 많은 조작과 [4]각 조작이 허용되는 조건을 제공합니다.언어 실행 모델의 구현은 어떤 작업을 자유롭게 실행할 수 있는지 추적하고 순서를 독립적으로 선택합니다.멀티패러다임 프로그래밍 언어 비교에 대한 자세한 정보

개요

Peter Van[5]: 5 [6] Roy에 따른 다양한 프로그래밍 패러다임의 개요

소프트웨어 엔지니어링(프로세스로서의)이 다른 방법론에 의해 정의되는 처럼 프로그래밍 언어(계산 모델로서의)도 다른 패러다임에 의해 정의됩니다.어떤 언어들은 하나의 패러다임을 지원하도록 설계되어 있다(Smalltalk는 객체 지향 프로그래밍을 지원하며 Haskell은 기능 프로그래밍을 지원함). 다른 프로그래밍 언어들은 다중 패러다임을 지원한다(Object Pascal, C++, Java, JavaScript, C#, Scala, Visual Basic, Common Lisp, Scheme, PHP, Phython, Phython, F.예를 들어, C++, 오브젝트 파스칼 또는 PHP로 작성된 프로그램은 순수하게 절차적, 순수하게 객체 지향적일 수도 있고, 둘 다 또는 다른 패러다임의 요소를 포함할 수도 있습니다.소프트웨어 설계자와 프로그래머는 이러한 패러다임 요소의 사용 방법을 결정합니다.

객체 지향 프로그래밍에서 프로그램은 상호작용하는 객체 집합으로 취급됩니다.기능 프로그래밍에서 프로그램은 상태 비저장 기능 평가 시퀀스로 취급됩니다.프로세스 지향 프로그래밍에서 프로세서가 많은 컴퓨터나 시스템을 프로그래밍할 때 프로그램은 논리적 공유 데이터 구조에 작용하는 동시 프로세스 집합으로 취급됩니다.

많은 프로그래밍 패러다임은 이를 가능하게 하는 기술뿐만 아니라 금지하는 기술로도 잘 알려져 있습니다.예를 들어 순수 함수 프로그래밍은 부작용 사용을 허용하지 않는 반면 구조화된 프로그래밍goto 문 사용을 허용하지 않습니다.부분적으로 이러한 이유로, 새로운 패러다임은 종종 초기 [7]스타일에 익숙한 사람들에 의해 교조적이거나 지나치게 엄격하다고 여겨진다.그러나 특정 기술을 피하면 프로그램 동작을 더 쉽게 이해하고 프로그램 정확성에 대한 이론을 증명할 수 있습니다.

프로그래밍 패러다임은 API만을 사용하여 실행 모델을 호출할 수 있는 프로그래밍 모델과 비교할 수도 있습니다.프로그래밍 모델은 실행 모델의 특징에 따라 패러다임으로 분류될 수도 있습니다.

병렬 컴퓨팅에서는 언어 대신 프로그래밍 모델을 사용하는 것이 일반적입니다.그 이유는 병렬 하드웨어의 상세 내용이 하드웨어 프로그래밍에 사용되는 추상화에 누출되기 때문입니다.이로 인해 프로그래머는 알고리즘의 패턴을 실행 모델의 패턴에 매핑해야 합니다(하드웨어가 추상화에 누출되어 삽입된 패턴).그 결과, 어떤 병렬 프로그래밍 언어도 모든 계산 문제에 잘 대응하지 못합니다.따라서 기본 순차 언어를 사용하고 API 호출을 프로그래밍 모델을 통해 병렬 실행 모델에 삽입하는 것이 더 편리합니다.이러한 병렬 프로그래밍 모델은 공유 메모리, 메시지 전달 기능이 있는 분산 메모리, 코드에서 볼 수 있는 위치의 개념 같은 하드웨어를 반영하는 추상화에 따라 분류될 수 있습니다.이는 병렬 언어와 프로그래밍 모델에만 적용되는 프로그래밍 패러다임의 맛이라고 볼 수 있습니다.

비판

일부 프로그래밍 언어 연구자들은 패러다임의 개념을 프로그래밍 언어의 분류로 비판합니다.[8] 예를 들어 Harper와 Krishnamurthi.[9]그들은 많은 프로그래밍 언어들이 하나의 패러다임으로 엄격하게 분류될 수 없으며, 오히려 여러 패러다임의 특징을 포함하고 있다고 주장한다.멀티패러다임 프로그래밍 언어 비교를 참조하십시오.

역사

프로그래밍에 대한 다양한 접근법이 시간이 지남에 따라 개발되었으며, 이는 당시 또는 소급적으로 식별되었다.의식적으로 식별된 초기 접근법은 1960년대 중반부터 주창된 구조화된 프로그래밍이다."프로그래밍 패러다임"의 개념은 로버트 W의 튜링상 강연에서 적어도 1978년으로 거슬러 올라간다. Floyd는 "The Paradigms of Programming"이라는 제목으로 토마스 쿤이 과학 혁명 구조 (1962)[10]에서 사용한 패러다임의 개념을 인용합니다.

기계코드

가장 낮은 수준의 프로그래밍 패러다임은 일련의 숫자로 명령(프로그램 메모리의 내용)을 직접 나타내는 기계 코드이며, 기계 명령이 니모닉과 메모리 주소로 표현되는 어셈블리 언어에는 기호 라벨이 부여될 수 있습니다.이것들은 때때로 제1세대와 제2세대 언어라고 불린다.

1960년대에 어셈블리 언어는 라이브러리 복사와 상당히 정교한 조건부 매크로 생성 및 전처리 능력, CALL to (서브루틴), 외부 변수 및 공통 섹션(글로벌)을 지원하기 위해 개발되었으며, READ/WRITE/와 같은 논리 연산자의 사용을 통해 상당한 코드 재사용과 하드웨어 특이사항으로부터의 격리를 가능하게 했다.GET/PUT어셈블리는 시간적으로 중요한 시스템에 사용되었으며, 기계 작동을 가장 직접적으로 제어할 수 있는 임베디드 시스템에 사용되는 경우가 많습니다.

절차 언어

그 다음 발전은 절차 언어의 발전이었다.이러한 제3세대 언어(첫 번째는 고급 언어)는 해결 중인 문제와 관련된 어휘를 사용합니다.예를들면,

  • COMMon Business Oriented Language (COBOL)– 파일, 이동, 복사 등의 용어를 사용합니다.
  • FORmula TRANSLATION(FORTRAN) – 수학 언어 용어를 사용하여 주로 과학 및 엔지니어링 문제를 위해 개발되었습니다.
  • ALGOrithmic Language(ALGOL) – FORTRAN과 마찬가지로 수학적 언어 용어를 사용하여 알고리즘을 정의하는 데 적합한 언어가 되는 데 초점을 맞춥니다.
  • Programming Language One(PL/I) – 포인터를 지원하는 혼합 상용-과학 범용 언어.
  • 초보자용 심볼릭 인스트럭션 코드(BASIC)– 더 많은 사람이 프로그램을 작성할 수 있도록 개발되었습니다.
  • C – 1969년부터 1973년 사이에 AT&T Bell Labs에서 Dennis Ritchie에 의해 개발된 범용 프로그래밍 언어.

이 언어들은 모두 절차적 패러다임을 따릅니다.즉, 특정 문제를 해결하기 위해 최소한 특정 프로그래머에 따르면 따라야 하는 절차를 단계별로 설명합니다.따라서 이러한 솔루션의 효과와 효율전적으로 주관적이며 프로그래머의 경험, 창의성 및 능력에 따라 크게 좌우됩니다.

객체 지향 프로그래밍

프로시저 언어가 널리 사용되면서 Simula, Smalltalk, C++, Eiffel, Python, PHP, Java 및 C#과 같은 객체 지향 프로그래밍(OOP) 언어가 생성되었습니다.이러한 언어에서는 데이터와 이를 조작하는 방법이 객체라고 불리는 하나의 단위로 유지됩니다.OOP의 특징 중 하나인 완벽한 캡슐화를 사용하면 다른 개체 또는 사용자가 데이터에 액세스할 수 있는 유일한 방법은 개체의 메서드를 사용하는 것입니다.따라서 오브젝트를 사용하는 코드에 영향을 주지 않고 오브젝트의 내부 동작을 변경할 수 있습니다.알렉산더 스테파노프, 리처드 스톨만[11], 그리고 다른 프로그래머들이 OOP 패러다임 대 절차 패러다임의 유효성에 대해 제기한 몇 가지 논란이 여전히 있다.모든 오브젝트에 연관지을 수 있는 메서드가 필요하기 때문에 일부 회의론자들은 OOP를 소프트웨어 블러트와 연관지을 수 있습니다.이 딜레마를 해결하려는 시도는 다형성을 통해 이루어졌습니다.

객체 지향 프로그래밍은 언어가 아닌 패러다임으로 간주되기 때문에 객체 지향 어셈블러 언어도 만들 수 있습니다.HLA(High Level Assembly)는 초기 단계에도 불구하고 고급 데이터 유형 및 객체 지향 어셈블리 언어 프로그래밍을 완전히 지원하는 입니다.따라서 서로 다른 프로그래밍 패러다임은 한 수준에서 다음 단계로[citation needed] 진보를 나타내기보다는 지지자들의 동기부여 밈처럼 보일 수 있다.경쟁 패러다임의 유효성을 정확하게 비교하는 것은 유사한 실체와 프로세스에 적용되는 새롭고 다른 용어와 언어 간의 수많은 구현 차이 때문에 종종 더 어려워진다.

새로운 패러다임

명령형 프로그래밍의 한 형태로서 리터럴 프로그래밍하이퍼텍스트 에세이에서와 같이 프로그램을 인간 중심의 웹으로 구조화한다: 문서는 프로그램에 필수적이며 프로그램은 컴파일러 편의가 아닌 산문 설명 논리에 따라 구조화된다.

명령 분과와는 별개로 선언적 프로그래밍 패러다임이 개발되었습니다.이러한 언어에서 컴퓨터는 문제의 해결 방법이 아니라 무엇이 문제인지 알려 줍니다.프로그램은 예상되는 결과에서 찾는 일련의 속성으로 구성되어 있습니다.순서는 따르지 않습니다.데이터베이스 또는 규칙 집합이 지정되면 시스템은 원하는 모든 속성과 일치하는 솔루션을 찾으려고 합니다.선언언어의 원형은 제4세대 언어 SQL이며, 기능언어와 논리프로그래밍 계열이다.

함수 프로그래밍은 선언형 프로그래밍의 하위 집합입니다.이 패러다임을 사용하여 작성된 프로그램은 함수, 즉 수학 함수처럼 동작하도록 의도된 코드 블록을 사용합니다.함수 언어는 할당을 통해 변수 값의 변화를 억제하고 대신 재귀적 기능을 많이 사용합니다.

논리 프로그래밍 패러다임은 계산을 지식 본문에 대한 자동화된 추론으로 간주합니다.문제 영역에 관한 사실은 논리식으로 표현되며, 그 문제에 대한 답이 발견되거나 일련의 공식에 모순이 증명될 때까지 그 위에 추론 규칙을 적용하여 프로그램을 실행한다.

심볼 프로그래밍은 수식과 프로그램 구성요소를 데이터로 조작할 [3]수 있는 프로그램을 설명하는 패러다임입니다.따라서 프로그램은 효과적으로 수정되고 "학습"하는 것처럼 보일 수 있으므로 인공지능, 전문가 시스템, 자연어 처리 및 컴퓨터 게임과 같은 애플리케이션에 적합합니다.이 패러다임을 지원하는 언어로는 리스프[12]프롤로그가 있습니다.

차별화 가능한 프로그래밍은 프로그램을 구조화하며, 일반적으로 자동 미분을 통해 프로그램을 전체적으로 구분[13][14]수 있습니다.

다중 패러다임 지원

대부분의 프로그래밍 언어는 프로그래머가 특정 [15]작업에 가장 적합한 프로그래밍 스타일 및 관련 언어 구조를 사용할 수 있도록 하나 이상의 프로그래밍 패러다임을 지원합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ 노어마크, 커트4가지 주요 프로그래밍 패러다임개요.2011년 5월 9일 올보르 대학교2012년 9월 22일 취득.
  2. ^ Frans Coenen (1999-10-11). "Characteristics of declarative programming languages". cgi.csc.liv.ac.uk. Retrieved 2014-02-20.
  3. ^ a b Michael A. Covington (2010-08-23). "CSCI/ARTI 4540/6540: First Lecture on Symbolic Programming and LISP" (PDF). University of Georgia. Archived from the original (PDF) on 2012-03-07. Retrieved 2013-11-20.
  4. ^ "Programming paradigms: What are the principles of programming?". IONOS Digitalguide. Retrieved 2022-05-03.
  5. ^ Peter Van Roy (2009-05-12). "Programming Paradigms: What Every Programmer Should Know" (PDF). info.ucl.ac.be. Retrieved 2014-01-27.
  6. ^ Peter Van-Roy; Seif Haridi (2004). Concepts, Techniques, and Models of Computer Programming. MIT Press. ISBN 978-0-262-22069-9.
  7. ^ Frank Rubin (March 1987). "'GOTO Considered Harmful' Considered Harmful" (PDF). Communications of the ACM. 30 (3): 195–196. doi:10.1145/214748.315722. S2CID 6853038. Archived from the original (PDF) on March 20, 2009.
  8. ^ Harper, Robert (1 May 2017). "What, if anything, is a programming-paradigm?". FifteenEightyFour. Cambridge University Press.
  9. ^ 를 클릭합니다Krishnamurthi, Shriram (November 2008). "Teaching programming languages in a post-linnaean age". Sigplan. ACM. 43 (11): 81–83. doi:10.1145/1480828.1480846. S2CID 35714982. Not. 43, 11..
  10. ^ Floyd, R. W. (1979). "The paradigms of programming". Communications of the ACM. 22 (8): 455–460. doi:10.1145/359138.359140.
  11. ^ "Mode inheritance, cloning, hooks & OOP (Google Groups Discussion)".
  12. ^ "Business glossary: Symbolic programming definition". allbusiness.com. Retrieved 2014-07-30.
  13. ^ Wang, Fei; Decker, James; Wu, Xilun; Essertel, Gregory; Rompf, Tiark (2018), Bengio, S.; Wallach, H.; Larochelle, H.; Grauman, K. (eds.), "Backpropagation with Callbacks: Foundations for Efficient and Expressive Differentiable Programming" (PDF), Advances in Neural Information Processing Systems 31, Curran Associates, Inc., pp. 10201–10212, retrieved 2019-02-13
  14. ^ Innes, Mike (2018). "On Machine Learning and Programming Languages" (PDF). SysML Conference 2018. Archived from the original (PDF) on 2018-09-20. Retrieved 2019-02-13.
  15. ^ "Multi-Paradigm Programming Language". developer.mozilla.org. Mozilla Foundation. Archived from the original on 21 August 2013.

외부 링크