CS

[프로그래밍 언어론] 프로그래밍 언어 패러다임

Grace 2023. 11. 22. 15:01

프로그래밍 패러다임

패러다임이란 무엇인가?

  • 한 시대의 견해나 사고를 규정하는 양식, 규범, 체계를 통칭하는 말
  • 토머스 쿤의 책 ‘과학혁명의 구조’에서 소개한 용어
  • 과학 분야의 큰 발전에 따라 이전 믿음이 흔들리고 대체되는 과정을 표현함
  • 패러다임 전환의 사례
    • 과학: 천동설 → 지동설
    • 경제: 저축이 미덕 → 소비가 미덕
    • 생활: 둘만 낳아 잘 기르자 → 자녀에게 가장 좋은 선물은 동생입니다.
    • 언어: 너무 나쁘다. → 너무 좋다 (’너무’란 말의 의미가 바뀜)

프로그래밍 패러다임의 변화

  • 프로그램을 작성하는 전형적인 방식
  • 프로그래밍 패러다임의 변화: 주어진 데이터에 어떤 연산을 어떤 순서로 할지 결정하는 것이 중요 → 명령형 프로그래밍 패러다임 등장
  • 복잡한 데이터 처리를 위해 데이터 처리 방식 자체를 잘 정리하는 것이 중요 → 절차형 프로그래밍 패러다임 등장
  • 데이터가 저장된 메모리를 관리하는 것이 어려운 문제로 대두 → 함수형 프로그래밍 패러다임 등장
  • 계산 절차를 문제의 조건을 명시하는 규칙으로 생각
    • 논리 프로그래밍 패러다임 등장
    • 선언적 프로그래밍 패러다임의 한 종류
  • 같은 데이터에 대해 다른 처리 절차를 여러 개 명시해야 하는 경우가 흔히 발생 → 객체지향 프로그래밍 패러다임 등장

프로그래밍 패러다임 변화의 배경

  • 응용 도메인의 변화
    • 요구사향의 변화
    • 계산 분야 → 데이터베이스 관리, 인식 시스템, 임베디드 시스템 등 다양한 응용 분야
    • 예) 시뮬레이션을 위해 객체지향 프로그래밍이 등장
  • 프로그램 구성 방식
    • 문제를 해결하기 위한 프로그램 구성 방식이 다양하게 변화됨
    • 명령어의 나열로 인식 → 모듈로 인식
    • 큰 문제를 풀기 위해 작은 문제를 풀 때 사용하던 모듈을 조합
  • 계산 모델
    • 튜링기계 모델 → 새로운 방식의 계산 모델
    • 예) 재귀 함수론을 계산 모델로 삼은 함수형 패러다임, 연역 추론을 계산 모델로 삼은 논리 패러다임

프로그래밍 언어 패러다임

  • 프로그래밍 패러다임: 프로그램을 작성하는 전반적인 방식
  • 프로그래밍 언어 패러다임: 어떤 프로그래밍 패러다임을 해당 프로그래밍 언어가 지원하느냐 하는 것
  • 프로그래밍 언어가 특정 패러다임을 지원한다고 해도 그 패러다임으로만 프로그램을 작성해야 한다는 뜻은 아니며 해당 패러다임을 잘 지원한다는 뜻

주요 언어의 프로그래밍 패러다임

  명령형 절차형 함수형 논리 객체지향
BASIC o o      
C o o      
C++ o o o   o
Clojure   o o    
Haskell o   o   o
Java o o o   o
JavaScript o o o   o
LISP   o o    
Prolog   o   o  
Python o o o   o
Ruby o o o   o
Scala o o o   o
Smalltalk o o     o
Visual Basic o o     o
Visual Prolog   o   o o

프로그래밍 패러다임의 양립성

  • 새로운 패러다임의 등장으로 이전에 있던 패러다임이 더욱 공고히 완성
  • 다양한 프로그래밍 패러다임은 서로 양립할 수 있음
  • 주류 프로그래밍 패러다임이 바뀜에 따라 이를 언어가 수용하는 형태로 변화
    • Python: 명령형 패러다임, 절차형 패러다임 지원 → 객체지향 패러다임을 포함

여러 패러다임의 프로그램 예

명령형 프로그래밍

  • 프로그램을 일련의 명령어 나열로 간주
  • 장점: 프로그램을 쉽게 이해할 수 있도록 함
  • 단점: 프로그램이 복잡한 경우를 효과적으로 다루지 못함

절차형 프로그래밍

  • 프로그램은 서브루틴이라는 절차 집합으로 구성
  • 장점: 재귀호출을 사용하여 프로시저를 간단하게 정의할 수 있음

구조화 프로그래밍

  • goto 없이 프로그램을 작성하는 방법
    • goto 논란
      • E. W. 다익스트라의 편지: goto문(당시엔 go to 문)을 이용한 코드가 읽기 어려워 해로움
      • D. E. 커누스의 논문: goto를 이용해도 구조화 프로그래밍이 가능
  • 블록과 서브루틴을 이용하며 구조화된 제어문을 사용해야 함
  • 현재 우리가 사용하는 대부분의 언어는 블록 구조 언어임

객체지향 프로그래밍

  • 프로그램은 서로 통신할 수 있는 객체(obejct)의 집합
  • 객체의 개념
    • 객체는 상태를 지니고 있으며 외부의 요청에 반응하는 데이터
    • 상태는 필드(멤버 변수)로 나타내며, 반응은 메서드(멤버 함수)로 나타냄
    • 객체의 상태는 외부에 숨기고 메서드는 외부에 공개함
  • 처음으로 클래스 개념을 도입한 언어는 Simula로서 시뮬레이션 언어님
  • 객체지향 언어의 절정은 Smalltalk로서 GUI 개발에 큰 획을 그음
  • 객체지향 언어는 소프트웨어 재사용을 통해 빠른 개발을 지원함

함수형 프로그래밍

  • 프로그램 수행이란 원하는 값을 구하는 것 → 원하는 값은 초깃값에 함수를 반복적으로 적용함으로써 구할 수 있음
  • 함수형 언어는 함수 자체를 값으로 취급할 수 있음
  • 함수를 다룰 수 있는 함수를 고차함수(higher order function)라고 부름
  • 데이터 리터럴을 나타낼 수 있는 것처럼 함수 리터럴도 나타낼 수 있음
  • 최신 함수형 언어는 강력한 타입 및 타입 추론을 도입하여 프로그램 안정성을 꾀하고 있음

선언적 프로그래밍과 논리 언어

  • 프로그램은 논리식 집합으로 구성
  • 논리식의 열거를 통한 선언적 프로그래밍 지원
  • 논리식은 명제나 술어로 나타내는데 명제와 달리 술어는 인수를 받을 수 있음
  • 최초의 논리 언어인 Prolog는 언어 처리, 인공지능 분야에서 널리 사용됨
  • 논리 언어는 1990년대 초 연역적 데이터베이스 시스템에 도입되어 발전되었으나 현재는 사용되지 않음
  • 최근에는 제약조건 프로그래밍에 도입되어 다른 패러다임과 합쳐 사용됨

프로그래밍 언어와 프로그래밍 패러다임

  • 객체지향 패러다임: 객체 사이의 통신을 통해 계산을 표현
  • 함수형 패러다임: 함수의 적용을 통해 계산을 표현
  • 논리 패러다임: 논리식의 진위를 증명하는 과정을 통해 계산을 표현