선언형/명령형 프로그래밍(declarative/imperative programming)

Rowan Lee·2023년 3월 3일

선언형(declarative) 프로그래밍


선언형 프로그래밍(declarative programming)은 두 가지 뜻으로 통용되고 있다.
1. 프로그램이 어떤 방법으로 해야 하는지를 나타내기보다 무엇과 같은지를 설명하는 경우에 "선언형"이라고 한다. 예를 들어, 웹 페이지는 선언형인데 웹페이지(HTML)는 제목, 글꼴, 본문, 그림과 같이 "무엇"이 나타나야하는지를 묘사하는 것이지 "어떤 방법으로" 컴퓨터 화면에 페이지를 나타내야 하는지를 묘사하는 것이 아니기 때문이다.
2. 프로그램이 함수형 프로그래밍 언어, 논리형 프로그래밍 언어, 혹은 제한형 프로그래밍 언어로 쓰인 경우에 "선언형"이라고 한다. 여기서 "선언형 언어"라는 것은 명령형 언어와 대비되는 이런 프로그래밍 언어들을 통칭하는 것이다.

HTML이나 SQL을 예시로 들곤 한다.

명령형(imperative) 프로그래밍


컴퓨터 과학에서 명령형 프로그래밍(imperative programming)선언형 프로그래밍과 반대되는 개념으로, 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종이다.

대부분의 현대 컴퓨터 하드웨어들은 명령형 프로그래밍을 따르고 있으며, 구체적으로 하드웨어가 가지는 고유의 언어 '기계어'가 명령형으로 되어있다.

폰 노이만 구조를 기반으로 명령 순차적 실행, 변수 사용 및 변수의 값을 변경하는 배정문을 사용한다.

비교분석


선언형과 명령형 프로그래밍은 반의어의 개념이다.
좀 더 쉽게 설명하자면, 선언형은 'What?' 명령형은 'How?'를 중점으로 기계에게 설명하는 방식이다.

집으로 가는 것을 선언형과 명령형 방식에서 접근해보자.
선언형(What): "우리 집 주소는 298 West Immutable Alley, Eden, Utah 84310 이야."
명령형(How): "주차장 북쪽 출구로 나와서 좌회전을 해. 12번가 출구에 도착할 때까지
I-15 북쪽 도로를 타고 와야 해. 거기서 IKEA에 가는 것처럼 출구에서 우회전을 해. 그리고 거기서
직진하다가 첫 번째 신호등에서 우회전을 해. 그 다음에 나오는 신호등을 통과한 후에 좌회전을 하면 돼.
우리 집은 #298 이야."

하지만 분명 선언적 방식은 방법을 알고 있는 컴퓨터에게만 설명할 수 있는 방법이다. 때문에 많은 선언적(Declarative) 접근 방식들의 기반에는 일종의 '명령적(Imperative) 추상화'가 존재한다.

side-effect


명령형 프로그래밍과 선언형 프로그래밍을 비교할때 side-effect는 중요한 역할을 한다.

컴퓨터 과학에서 부작용(side-effect)란 함수가 결과값 이외의 다른 상태를 변경시키는 것을 의미한다.
예를 들자면 인자로 넘어온 것들 중 하나를 변경하거나 화면이나 파일에 데이터를 쓰거나, 다른 부작용이 있는 함수에서 데이터를 읽어오는 경우가 있다.
이런 부작용은 프로그램의 동작을 예측하기 어렵게 한다.

명령형 프로그래밍은 이런 부작용을 사용하여 프로그램을 동작하게 하며, 함수형 프로그래밍은 이를 최소화한 순수한 함수를 사용하려 한다.

참조 투명성

부작용을 이용하려는 함수는 참조에 불투명(referentially opaque)하고 그렇지 않은 함수는 참조에 투명(referentially transparent)한 경우가 많다. 참조에 투명한 함수는 같은 인자를 주면 항상 같은 결과값을 돌려 주는 함수이다. 이 때문에 결정함수라고도 한다.

물론, 부작용은 없지만 참조에 불투명한 함수도 있다. ex) 시간을 불러오는 함수 전역상태를 전혀 건드리지 않지만, 시간이라는 전역변수가 변화

부작용의 단점

  • 버그가 생기기 쉽고 예외상황에 생기는 버그의 경우 찾기 어렵다
  • 프로그램 결과값 외에 다른 상태도 변경하기에 프로그램 순서에 따라 결과가 다르다
  • 마지막으로 상식에서 통하는 방법으로 표현식을 값으로 대체하거나 값 대신 변수로 대체하는 일을 할 수 없게 되며 수학적으로 다루기 어렵게 된다.

부작용/참조 투명성 요약

부작용: 결과값 외에 다른 상태를 변경시키는 것
참조투명성(결정함수): 같은 인자에 같은 결과를 주는 함수

profile
CS/Software Engineer

0개의 댓글