분석철학과 컴퓨터 과학에서의 참조 투명성과 참조 불투명성 개념을 정의와 예시, 형식적 성질 및 상호 관계와 함께 설명한다.
위키백과, 우리 모두의 백과사전에서
이 문서는 프로그래밍 언어 이론에서의 참조 투명성에 관한 것이다. 언어학과 철학에서의 용례는 불투명 맥락을 참고하라.
분석철학과 컴퓨터 과학에서, 참조 투명성(referential transparency)과 참조 불투명성(referential opacity)은 언어적 구성물의 성질이며[a] 그 확장으로서 언어의 성질이기도 하다. 어떤 언어적 구성물이 참조적으로 투명하다(referentially transparent)고 불릴 때란, 그 구성물로부터 만들어진 임의의 표현에서, 어떤 부분식을 동일한 값을 지시[b]하는 다른 부분식으로 치환하더라도 전체 표현의 값이 변하지 않는 경우를 말한다.[1][2] 그렇지 않으면 참조적으로 불투명하다(referentially opaque)고 한다. 참조적으로 불투명한 언어적 구성물로부터 만들어진 각 표현은 어떤 부분식에 관해 무언가를 진술하는 반면, 참조적으로 투명한 언어적 구성물로부터 만들어진 각 표현은 부분식 자체에 관한 것이 아닌 무언가를 진술한다. 이는 부분식이 표현에 대해 ‘투명’하여, 그저 다른 무언가를 가리키는 ‘참조’로서 기능함을 뜻한다.[3] 예를 들어, 언어적 구성물 ‘_ 은 현명했다’는 참조적으로 투명하다(예: _소크라테스는 현명했다_는 서양 철학의 창시자는 현명했다_와 동치다). 그러나 ‘ 가 말했다 _’는 참조적으로 불투명하다(예: _크세노폰은 ‘소크라테스는 현명했다’고 말했다_는 _크세노폰은 ‘서양 철학의 창시자는 현명했다’고 말했다_와 동치가 아니다).
프로그래밍 언어에서의 참조 투명성은 표현의 지시 대상들 사이의 의미론적 동치 또는 표현 그 자체의 맥락적 동치에 달려 있다. 즉, 참조 투명성은 언어의 의미론에 의존한다. 따라서 선언형 언어와 명령형 언어 모두, 부여된 의미론에 따라 참조적으로 투명한 위치와 불투명한 위치를 가질 수 있으며, 보통은 둘 다 갖는다.
참조적으로 투명한 위치의 중요성은, 그러한 위치에서 프로그래머와 컴파일러가 프로그램의 동작을 재작성 시스템으로서 추론할 수 있게 해 준다는 데 있다. 이는 정당성 증명, 알고리즘 단순화, 코드를 망가뜨리지 않고 수정하는 데의 도움, 또는 메모이제이션, 공통 부분식 제거, 지연 계산, 병렬화 등을 통한 최적화에 기여할 수 있다.
이 개념은 앨프리드 노스 화이트헤드와 버트런드 러셀의 저서 프린키피아 마테마티카 (1910–1913)에서 유래했다:[3]
진리 혹은 거짓의 매개체로서의 명제는 하나의 특정한 발생이며, 사실적으로 고찰되는 명제는 유사한 발생들의 한 계급이다. “_A_는 _p_를 믿는다”와 “_p_는 _A_에 관한 것이다”와 같은 진술에 나타나는 것은 사실적으로 고찰되는 명제이다.
물론 “소크라테스는 그리스인이다”라는 특정 사실에 관해 진술하는 것은 가능하다. 우리는 그것이 몇 센티미터 길이라고 말할 수 있고, 그것이 검다고 말할 수 있으며, 기타 등등을 말할 수 있다. 그러나 이것들은 철학자나 논리학자가 하고자 유혹되는 진술들이 아니다.
단언이 발생할 때, 그것은 단언된 명제의 한 사례인 특정 사실을 통해 이루어진다. 그러나 이 특정 사실은 말하자면 “투명하다.” 그 자체에 관해서는 아무것도 말하지 않되, 그것을 통해 다른 어떤 것에 관해 무언가가 말해진다. 진리 함숫값들에서 나타나는 명제에 속하는 바로 이 “투명한” 성질이 있다. 이는 _p_가 단언될 때 _p_에 속하지만, 우리가 “_p_는 참이다”라고 말할 때에는 속하지 않는다.
이 용어는 분석철학에서 윌러드 반 오만 콰인의 저서 Word and Object (1960)에서 채택되었다:[1]
어떤 단칭어가 문장에서 순수하게 그 지시 대상을 특정하는 데 사용되고, 그 문장이 그 대상에 대해 참이라면, 동일한 대상을 지시하는 다른 어떤 단칭어로 치환하더라도 그 문장은 확실히 참으로 남을 것이다. 여기서 우리는 소위 순수하게 지시적인 자리(purely referential position)에 대한 하나의 기준을 얻는다. 그 자리는 동일성의 치환가능성(substitutivity of identity)에 복종해야 한다.
[…]
참조 투명성은 구성물(§ 11)에 관한 것이다. 보다 구체적으로는, 단칭어나 문장이 다른 단칭어나 문장 안에 포함되는 방식에 관한 것이다. 나는 어떤 포함 방식 φ가 다음과 같을 때 참조적으로 투명하다고 부른다. 단칭어 _t_의 발생이 어떤 술어 또는 문장 ψ(t) 안에서 순수하게 지시적이라면, 그것은 포괄하는 술어 또는 문장 φ(ψ(t)) 안에서도 순수하게 지시적이어야 한다.
이 용어는 현대 컴퓨터 과학에서는 크리스토퍼 스트레이치의 기념비적 강의 노트 프로그래밍 언어의 기본 개념 (1967)에서 변수와 프로그래밍 언어에 대한 논의 속에 등장했다:[2]
표현식이 가지는 가장 유용한 성질들 가운데 하나는 콰인[4]이 부른 바 _참조 투명성_이다. 본질적으로 이것은, 만약 어떤 부분식을 포함하는 표현식의 값을 구하고자 할 때, 우리가 그 부분식에 관해 알아야 할 유일한 것은 그 값뿐이라는 뜻이다. 부분식의 다른 특징들, 예를 들어 내부 구조, 그 구성 성분의 수와 성질, 그것들이 평가되는 순서, 혹은 그것들이 쓰인 잉크의 색깔 따위는, 주된 표현식의 값과는 무관하다.
형식 언어에서 치환가능성과 관련된 근본적 성질은 세 가지가 있다. 참조 투명성, 정합성(definiteness), 전개 가능성(unfoldability)이다.[4]
이하에서 구문적 동치는 ≡로, 의미론적 동치는 =로 표기한다.
[편집]
위치(position)는 자연수의 수열로 정의된다. 빈 수열은 ε로 표기하고, 수열 생성자는 ‘.’로 표기한다.
예. — 식 (+ (∗ e 1 e 1) (∗ e 2 e 2))에서 위치 2.1은 e 2의 첫 번째 발생이 차지하는 자리이다.
표현식 _e_에서 위치 _p_에 표현식 _e′_를 삽입한 것을 e[e′/p]로 표기하고 다음과 같이 정의한다.
e[e′/ε] ≡ e′ e[e′/i.p] ≡ <Ω e 1 … e i[e′/p] … e n> if e ≡ <Ω e 1 … e i … e n> else undefined, for all operators Ω and expressions e 1, …, e n.
예. — 만약 e ≡ (+ (∗ e 1 e 1) (∗ e 2 e 2))라면 e[e 3/2.1] ≡ (+ (∗ e 1 e 1) (∗ e 3 e 2)).
표현식 _e_에서 위치 _p_가 순수하게 지시적(purely referential)이라는 것은 다음과 같이 정의된다.
e 1 = e 2 implies e[e 1/p] = e[e 2/p], for all expressions e 1, e 2.
다시 말해, 한 위치가 어떤 표현식에서 순수하게 지시적이라는 것은 그 위치가 ‘같은 것의 치환가능성’에 복종함과 동치이다. ε는 모든 표현식에서 순수하게 지시적이다.
연산자 Ω가 _i_번째 자리에 대해 _참조적으로 투명_하다는 것은 다음과 같이 정의된다.
p is purely referential in e i implies i.p is purely referential in e ≡ <Ω e 1 … e i … e n>, for all positions p and expressions e 1, …, e n.
그렇지 않으면 Ω는 _i_번째 자리에서 _참조적으로 불투명_하다.
한 연산자가 _참조적으로 투명_하다는 것은 모든 자리에서 참조적으로 투명함으로 정의된다. 그렇지 않으면 _참조적으로 불투명_하다.
형식 언어가 _참조적으로 투명_하다는 것은 그 언어의 모든 연산자가 참조적으로 투명함으로 정의된다. 그렇지 않으면 _참조적으로 불투명_하다.
예. — ‘_ 는 ~에 산다_’ 연산자는 참조적으로 투명하다:
그녀는 런던에 산다.
실제로, 진술에서 두 번째 자리는 _런던_을 _영국의 수도_로 치환해도 진술의 값이 변하지 않기 때문에 순수하게 지시적이다. 같은 치환가능성의 이유로 첫 번째 자리 역시 순수하게 지시적이다.
예. — ‘_ 은 ~을 포함한다_’ 연산자와 인용 연산자는 참조적으로 불투명하다:
‘London’은 여섯 개의 글자를 포함한다.
실제로, 첫 번째 자리는 런던_을 영국의 수도_로 치환하면 진술과 인용의 값이 변하므로 순수하게 지시적이지 않다. 그러므로 첫 번째 자리에서 ‘ 은 ~을 포함한다’ 연산자와 인용 연산자는 표현식과 그 표현식이 지시하는 값 사이의 관계를 파괴한다.
예. — 인용 연산자가 참조적으로 불투명함에도 불구하고, ‘_ 는 ~을 가리킨다_’ 연산자는 참조적으로 투명하다:
‘London’은 영국에서 가장 큰 도시를 가리킨다.
실제로, 인용에서는 그렇지 않지만 진술에서 첫 번째 자리는 런던_을 영국의 수도_로 치환해도 진술의 값이 변하지 않기 때문에 순수하게 지시적이다. 따라서 첫 번째 자리에서 ‘ 는 ~을 가리킨다’ 연산자는 표현식과 그 표현식이 지시하는 값 사이의 관계를 회복한다. 같은 치환가능성의 이유로 두 번째 자리 역시 순수하게 지시적이다.
형식 언어가 정합적(definite)이라는 것은, 한 변수의 모든 출현이 그 스코프 내에서 동일한 값을 지시하는 것으로 정의된다.
예. — 수학은 정합적이다:
3 x 2 + 2 x + 17.
실제로, _x_의 두 출현은 동일한 값을 지시한다.
형식 언어가 전개 가능(unfoldable)하다는 것은 모든 표현식이 β-축약 가능하다는 것으로 정의된다.
예. — 람다 계산은 전개 가능하다:
((λ x.x + 1) 3).
실제로, ((λ x.x + 1) 3) = (x + 1)[3/x].
[편집]
참조 투명성, 정합성, 전개 가능성은 서로 독립적이다. 정합성은 결정적 언어에 한해 전개 가능성을 함의한다. 비결정적 언어는 정합성과 전개 가능성을 동시에 가질 수 없다.
**^**언어적 구성물(포함 방식, 맥락, 연산자라고도 부름)은 구멍을 가진 표현식이다.
**^**여기서 값이란 평가 과정의 결과가 아니라, 표현식의 지시체(의미, 대상, 지시물이라고도 부름)를 말한다.
^ Jump up to: abQuine, Willard Van Orman (1960). Word and Object (1st ed.). Cambridge, Massachusetts: MIT Press. p.144. ISBN978-0-262-17001-7.
^ Jump up to: abStrachey, Christopher (1967). Fundamental Concepts in Programming Languages (Technical report). Lecture notes for the International Summer School in Computer Programming at Copenhagen. Also: Strachey, Christopher (2000). "Fundamental Concepts in Programming Languages". Higher-Order and Symbolic Computation. 13 (1–2): 11–49. doi:10.1023/A:1010000313106. S2CID14124601.
^ Jump up to: abWhitehead, Alfred North; Russell, Bertrand (1927). Principia Mathematica. Vol.1 (2nd ed.). Cambridge: Cambridge University Press. p.665. ISBN978-0-521-06791-1.
**^**Søndergaard, Harald; Sestoft, Peter (1990). "Referential Transparency, Definiteness and Unfoldability"(PDF). Acta Informatica. 27 (6): 505–517. doi:10.1007/bf00277387.