← 모든 글

엔지니어링 철학: 바버라 리스코프, 계약이 곧 타입이다

MIT 컴퓨터 과학자이자 2008년 튜링상 수상자 바버라 리스코프

핵심 요약

  • 추상화는 구조가 아니라 행동에 관한 것입니다. 타입은 그것이 지키는 계약 – 연산과 그 의미 – 이지, 저장하는 비트가 아닙니다. 우리는 어떤 것을 그 약속으로 사용하지, 결코 그 표현 방식으로 사용하지 않습니다.
  • 하위 타입은 상위 타입의 약속을 지켜야 합니다. 리스코프 치환 원칙(Liskov Substitution Principle)이 말하는 바입니다. 상위 타입이 기대되는 어느 자리에서든, 하위 타입은 호출자의 가정을 깨뜨리지 않고 동작해야 합니다 – 더 약한 사전 조건, 더 강한 사후 조건, 보존된 불변식.
  • 모듈성이란 전체 없이 한 부분만 두고 추론할 수 있음을 뜻합니다. 리스코프의 정확한 정의는 이렇습니다. 한 모듈을 그 의존 대상이 계약을 지키리라 믿으면서 따로 떼어내 이해하고 검증할 수 있다는 것. 추상화는 그 믿음을 정당하게 만드는 것입니다.
  • 그녀는 데이터 추상화를 프로그래밍의 기본 단위로 만들었습니다. CLU에서 Argus로, 그리고 2008년 튜링상에 이르기까지, 하나의 아이디어가 자료구조에서 분산 데이터베이스까지 확장됩니다. 계약을 정의하고, 메커니즘은 감추라.

원칙

“φ(x)를 타입 T의 객체 x에 대해 증명 가능한 속성이라고 하자. 그렇다면 S가 T의 하위 타입일 때, 타입 S의 객체 y에 대해서도 φ(y)가 참이어야 한다.” – 바버라 리스코프, 자넷 윙1

천천히 읽어 보면, 이것이 오늘날 이 분야가 리스코프 치환 원칙이라 부르는 것의 형식적 진술입니다. 1994년 자넷 윙과 함께 쓴 논문에서 나온 것입니다.1 표기법을 걷어내면, 거의 엄격하다고 할 만한 무언가를 말합니다. 하위 타입은 당신을 놀라게 할 자격이 없다는 것. 상위 타입에 대해 참임을 증명할 수 있었던 그 무엇이든, 대신 하위 타입을 프로그램에 건넸을 때에도 여전히 참으로 남아 있어야 합니다. 하위 타입은 부모의 약속을 물려받지, 단지 그 형태만 물려받는 것이 아닙니다 – 그리고 그 약속을 지킬 수 없다면, 타입 검사기가 무어라 하든 그것은 하위 타입이 아닙니다.

그 엄격함 뒤에는 리스코프가 40년간 좇은 하나의 아이디어가 정점을 이루고 있습니다. 타입은 그 표현이 아니라 행동으로 정의된다. 모듈은 계약 – 의미가 명시된 연산의 집합 – 이며, 계약의 본질은 그것이 어떻게 만들어졌는지 읽지 않고도 그 대상을 쓸 수 있다는 데 있습니다. 치환 가능성이란 바로 그 신념을 상속에 적용한 것입니다. S가 T의 일종이라 주장한다면, T가 약속되었던 어느 자리에서든 S는 똑같은 약속을 지켜야 합니다. 구조는 다를 수 있습니다. 행동은 다를 수 없습니다.

이것이 왜 중요한가는 그녀의 경력 전체를 관통하는 실마리입니다. 거대한 프로그램은 전체를 머릿속에 담지 않고도 한 조각을 추론할 수 있을 때에만 다룰 수 있습니다. 리스코프가 이를 가리킨 말이 모듈성이었고, 그녀는 그것으로 정확한 무언가를 뜻했습니다. 한 모듈을, 그것이 의존하는 모든 것이 명시된 계약을 지키리라 믿으면서, 따로 떼어내 이해하고 검증할 수 있는 능력 말입니다. 데이터 추상화는 그 믿음을 정당하게 만드는 것이고, 행동적 하위 타이핑은 상속이 그 믿음을 슬그머니 깨뜨리지 못하게 막는 것입니다. 이것은 좋은 시스템이란 심미안이 검토할 수 있는 기술적 시스템이 되도록 – 명시하고 검사할 수 있는 계약이 되도록 – 지어진다는, 전체 코드베이스를 읽어 흡수하는 전통이 아니라는 주장 밑에 흐르는 바로 그 신념입니다.

배경

바버라 제인 휴버먼 리스코프는 1939년 11월 7일 캘리포니아주 로스앤젤레스에서 태어났습니다.2 1961년 UC 버클리에서 물리학을 부전공으로 한 수학 학사 학위를 받았습니다.2 버클리와 프린스턴의 수학 대학원 과정에 지원했을 때, 프린스턴은 여성을 아예 받지 않고 있었습니다. 그녀는 대신 취업을 택했고, 거의 우연히 초기 컴퓨팅에 발을 들였습니다. Mitre Corporation과 하버드에서 프로그래밍을 하다가, 결국 박사 학위를 원한다고 마음을 굳혔습니다.2

1968년 스탠퍼드에서 박사 학위를 받았는데 – 미국에서 컴퓨터 과학 학과로부터 박사 학위를 받은 최초의 여성 가운데 한 명이었습니다.2 그녀의 지도교수는 Lisp의 창시자이자 인공지능이라는 분야의 창립자 중 한 사람인 존 매카시였습니다. 그녀의 박사 논문은 체스 엔드게임을 두는 프로그램을 만든 것이었고, 그 과정에서 킬러 휴리스틱을 고안했는데, 이는 게임 트리 탐색에서 지금도 쓰이는 수순 정렬 기법입니다.2 이 대목은 새겨둘 만합니다. 그녀는 인공지능이라는 용어를 만든 사람 아래에서 AI를 거쳐 올라왔고, 그런 다음 그것에서 등을 돌려 자신을 규정하게 될 문제로 향했습니다 – 기계를 어떻게 생각하게 만드느냐가 아니라, 거대한 프로그램을 어떻게 이해 가능하게 만드느냐는 문제로.

MIT의 바버라 리스코프

스탠퍼드 이후 그녀는 Mitre로 돌아가, Venus 운영체제의 설계를 이끌었습니다 – 세심한 기계 및 소프트웨어 아키텍처가 어떻게 시스템을 단순하게 만들 수 있는지 탐구하기 위해 만든, 작고 저비용의 대화형 시분할 시스템이었습니다.23 1972년 그녀는 MIT 교수진에 합류했고, 그 이후 줄곧 그곳에 머물러 지금은 그 기관이 수여하는 최고 직위인 인스티튜트 프로페서(Institute Professor)에 올라 있습니다.2 Venus는 그녀에게 질문을 가르쳐 주었습니다. 1970년대 초의 소프트웨어 위기 불안 – 프로그램이 누구도 추론할 수 없을 만큼 거대해졌다는 자각의 시작 – 이 그 질문을 날카롭게 벼렸습니다. 그 답이 CLU가 되었습니다.

업적

데이터 추상화와 CLU 언어

1973년부터 리스코프와 MIT의 학생들은 CLU를 설계하고 구축했는데, 이것은 지금껏 만들어진 가장 조용히 영향력 있는 언어 중 하나입니다 – 거의 아무도 그것으로 실제 운영 코드를 쓰지 않았지만, 그 아이디어는 이제 거의 모든 것에 들어 있습니다.4 그 핵심 개념은 클러스터(cluster)였고, 언어 이름도 여기서 나왔습니다. 데이터 표현을 그것에 허용된 연산과 함께 묶고, 그 연산의 집합 뒤로 표현을 완전히 감추는 단위입니다.4 클러스터는 추상 데이터 타입(abstract data type)의 구체적 실현이었습니다 – 타입은 그것을 쓰는 이들에게 오직 무엇을 하는지로만 알려져야 하며, 결코 비트를 어떻게 저장하는지로 알려져서는 안 된다는 아이디어 말입니다.45

CLU는 거기서 멈추지 않았습니다. 이제는 기본 소양이 된 놀라운 묶음의 기능들을 개척하거나 대중화했습니다. 이터레이터(iterator)yield 문을 쓰는 코루틴으로 구현되어, 내부 구조를 드러내지 않고도 컬렉션을 순회할 수 있게 했습니다. signalexcept를 쓰는 구조화된 예외 처리(exception handling)는, 덧붙여진 것이 아니라 정상적인 제어 흐름의 일부로 다루어졌습니다. 매개변수 다형성(parametric polymorphism) – 제약을 가진 타입 안전 매개변수화 타입으로, 제네릭의 조상이었습니다. 타입 안전 변형(variant) 타입. 그리고 병렬 대입을 통한 다중 반환값.4 이터레이터는 Python, C#, Ruby에 다시 나타났습니다. 매개변수화 타입은 Java와 C#에서 제네릭이 되었습니다. 예외 처리는 Java와 C++를 형성했습니다. Swift의 설계자들은 CLU를 이름까지 들어 공로를 인정했습니다.4 그 언어는 하나의 종자 은행이었습니다.

하지만 그 기능들은 원칙의 하류였습니다. 리스코프의 주장은 추상화가 우리가 복잡성을 다스리는 메커니즘이라는 것이었습니다 – 어려운 것을 만들 때, 깨끗한 경계를 정의하고, 그 경계를 무엇이 넘는지 명시한 뒤, 두 쪽을 한꺼번에 생각할 필요가 결코 없게 하는 것입니다. CLU는 프로그래밍 언어가 그 경계를 단지 허용하는 데 그치지 않고 강제할 수 있다는 증명이었습니다. 컴파일러가 계약의 우군이 된 것입니다.

리스코프 치환 원칙

1987년 리스코프는 OOPSLA에서 “데이터 추상화와 계층(Data Abstraction and Hierarchy)”이라는 제목의 기조 강연을 했고, 이듬해 SIGPLAN Notices에 실렸습니다.6 객체 지향 프로그래밍이 부상하고 있었고, 그와 함께 하위 타입(subtype) – 다른 타입을 상속하고 확장하는 타입 – 이라는 아이디어도 떠올랐습니다. 리스코프의 질문은 누구도 정확하게 진술하지 않았던 명백한 것이었습니다. 하위 타입을 그 상위 타입처럼 다루는 것이 실제로 안전한 때는 언제인가? 기조 강연 자신의 말로 표현한 그녀의 답은 치환 속성이었습니다. “여기서 원하는 것은 다음과 같은 치환 속성이다. 타입 S의 각 객체 o1에 대해, T로 정의된 모든 프로그램 P에서 o1을 o2로 치환했을 때 P의 행동이 변하지 않는 그런 타입 T의 객체 o2가 존재한다면, S는 T의 하위 타입이다.”6

당신이 어디서나 보게 될 대중적 의역 – “S가 T의 하위 타입이라면, 타입 T의 객체는 프로그램의 바람직한 속성을 어느 것도 바꾸지 않고 타입 S의 객체로 대체될 수 있다” – 은 그것을 충실하게 압축한 것입니다.7 1994년 리스코프와 자넷 윙은 “하위 타이핑의 행동적 개념(A Behavioral Notion of Subtyping)”이라는 논문에서 이를 엄밀하게 만들어, 참된 하위 타입이 충족해야 할 조건을 제시했습니다. 그 메서드는 상위 타입의 것보다 더 많이 요구해서는 안 되고(더 약하거나 같은 사전 조건), 더 적게 약속해서는 안 되며(더 강하거나 같은 사후 조건), 상위 타입의 불변식과 이력 속성을 보존해야 합니다.1 그 조건들이 한데 모인 것이 바로 행동적 하위 타이핑이 뜻하는 바입니다 – 그리고 이것이 “오리처럼 생겼고 오리처럼 꽥꽥거린다면” 식의 구어적 표현이 그녀의 것이 아니며 요점을 놓치는 이유입니다. 생김새와 꽥꽥거림은 형태일 뿐, 원칙은 지켜진 약속에 관한 것입니다.

고전적인 반례는 직사각형을 상속하는 정사각형입니다. Rectangle은 너비와 높이를 독립적으로 설정하게 해 줍니다. 클라이언트는 높이를 설정하고 너비가 변하지 않으리라 믿을 수 있습니다. 그것을 상속하는 Square는 둘이 같도록 강제해야 합니다 – 그래서 높이를 설정하면 너비가 슬그머니 바뀌고, 클라이언트의 합당한 가정은 침해됩니다.7 정사각형은 사전적 의미에서 직사각형이고, 모든 타입 검사를 통과하지만, 그래도 행동적 하위 타입이 아닙니다. 직사각형의 약속을 지킬 수 없기 때문입니다. 교훈 전체가 그 하나의 형상에 담겨 있습니다. 구조의 상속은 계약의 상속이 아닙니다.

분산 시스템: Argus와 Thor

리스코프는 언어 설계에 머물지 않았습니다. 1980년대 초 그녀는 Argus를 만들었는데, 분산 프로그램 – 독립적으로 실패하는 기계들에 흩어진 프로그램 – 의 구현을 지원한 최초의 고급 언어로 설명됩니다.23 CLU의 확장판인 Argus는 가디언(guardian)(분산 상태를 캡슐화하고 핸들러를 통해 접근되는 객체)과 원자적 동작(atomic action)(실패를 넘어서도 완전히 완료되거나 아예 일어나지 않는, 2단계 커밋으로 조율되는 트랜잭션)을 도입했고, 또한 프로미스 파이프라이닝(promise pipelining)을 보여 주었습니다. 호출을 보내고 그 결과가 돌아오기 전에 작업을 계속할 수 있게 하는 것입니다.9 분산의 어려운 문제는 부분 실패입니다 – 다른 노드들은 살아 있는데 한 노드가 죽는 것 – 그리고 Argus는 데이터 추상화를 그 문제에 적용했습니다. 가디언은 네트워크가 지키지 않을 때에도 지켜지는 계약입니다.

1990년대의 Thor는 분산 객체 지향 데이터베이스로, 여러 언어로 쓰인 프로그램들이 접근하는 객체의 신뢰성 있고 고가용성을 갖춘 영속 저장을 제공했습니다.23 CLU로부터 이어지는 흐름은 정확합니다. 클러스터는 표현을 연산 뒤로 감춥니다. 가디언은 분산 상태를 원자적 연산 뒤로 감춥니다. Thor 객체는 영속성을 타입이 명시된 인터페이스 뒤로 감춥니다. 모든 규모에서 – 자료구조, 네트워크 서비스, 데이터베이스 – 리스코프의 수는 같습니다. 계약을 정의하고, 메커니즘을 감추고, 시스템의 나머지가 계약만 두고 추론하게 하라.

강연하는 바버라 리스코프

2008년 튜링상과 유산

2009년 ACM은 리스코프에게 2008년 A.M. 튜링상 – 컴퓨팅 분야 최고의 영예 – 을 수여하며 다음과 같이 헌사했습니다. “프로그래밍 언어 및 시스템 설계의 실용적·이론적 기초에 대한 공헌, 특히 데이터 추상화, 결함 내성, 분산 컴퓨팅과 관련된 공헌에 대하여.”8 확장된 헌사는 그 일관된 흐름을 정확히 짚습니다. 그녀는 “데이터 추상화, 모듈성, 결함 내성, 영속성, 그리고 분산 컴퓨팅 시스템”을 진전시켰습니다.8 그녀는 이미 2004년에 “프로그래밍 언어, 프로그래밍 방법론, 분산 시스템에 대한 근본적 공헌”으로 IEEE 존 폰 노이만 메달을 받았고, 이후 미국 발명가 명예의 전당에 헌액되었으며(2012년), 벤저민 프랭클린 메달을 수상했습니다(2023년).2

그 유산은 가리켜 실행할 수 있는 언어나 시스템이 아닙니다. 오늘날 일하는 프로그래머들이 생각하는 방식 – “인터페이스에 맞춰 프로그래밍하라”, “구현이 아니라 계약에 의존하라”, “이 클래스는 LSP를 위반한다” – 이 리스코프의 어휘이며, 너무나 완전히 흡수되어 그것을 쓰는 대부분의 사람들은 그 논문을 읽어 본 적조차 없다는 것입니다. 이것이 가장 깊은 종류의 영향입니다. 당신의 아이디어가 공기가 되어 버려 더 이상 출처가 붙지 않게 될 때 말입니다.

방법론

그 방법론은 30년에 걸쳐 일관됩니다 – 운영체제, 언어 설계, 그리고 분산 데이터베이스에 이르기까지.

타입을 그 표현이 아니라 행동으로 정의하라. 거듭 등장하는 수는 경계를 긋고, 무엇이 그것을 넘는지 정확히 명시한 뒤, 어느 쪽도 상대의 내부에 의존하지 못하게 거부하는 것입니다. 클러스터, 가디언, Thor 객체는 모두 같은 행위입니다. 메커니즘을 감추는 계약 말입니다.45

모듈성을 문자 그대로 만들고, 그것을 강제하라. 리스코프에게 모듈성은 코드 정리에 대한 선호가 아니라 – 한 모듈을, 그 의존 대상이 계약을 지키리라 믿으면서 따로 떼어내 추론할 수 있는 능력입니다. CLU의 컴파일러는 추상화 장벽을 정중히 권하는 대신 강제했습니다. 도구가 검사할 때에만 그 규율은 비로소 실재합니다.4

하위 타입은 상위 타입의 약속을 지켜야 한다. 행동적 하위 타이핑은 상속이 편의가 아니라 계약이라는 원칙입니다. 더 약한 사전 조건, 더 강한 사후 조건, 보존된 불변식 – 하위 타입은 더 많은 일을 할 수는 있어도, 결코 그 상위 타입보다 더 많이 요구하거나 더 적게 약속해서는 안 됩니다.1

어려운 문제를 경계에서 공략하라. 분산 시스템에서 부분 실패가 가혹한 것은 바로 그것이 국소적으로 추론하는 능력을 깨뜨리기 때문입니다. Argus의 답은 추상화를 실패 모델 자체 안으로 밀어 넣는 것이었습니다 – 원자적 동작과 가디언 – 그리하여 프로그래머가 네트워크가 무너질 수 있는 모든 경우를 시뮬레이션하지 않고도 여전히 한 조각을 두고 추론할 수 있게 했습니다.23

하나의 아이디어를 끝까지 끌고 올라가라. 스택, 네트워크 서비스, 데이터베이스라는 규모에서의 데이터 추상화는 알아볼 수 있게 같은 아이디어입니다. 리스코프는 영역마다 새로운 철학을 발명하지 않았습니다. 그녀는 확장되는 그 하나를 찾아내, 1970년대 타입 시스템에서 1990년대 분산 저장소까지 그것을 타고 갔습니다.

영향의 사슬

그녀를 형성한 사람들

존 매카시. 스탠퍼드에서의 박사 지도교수이자 Lisp의 창시자, AI의 창립자인 그는 그녀에게 수학적 컴퓨터 과학의 엄밀함을 주었고 – AI에서 등을 돌려 프로그램 구조로 향한 그녀의 전환을 통해 – 그녀의 필생의 작업이 된 문제를 주었습니다.2 (직접적 영향)

소프트웨어 위기와 구조적 프로그래밍의 시대. 리스코프는 정확히 이 분야가 프로그램이 인간의 이해를 넘어서 자라났음을 인정한 그때에 연구자로 성장했습니다. 구조적 프로그래밍 운동 – 데이크스트라, 호어, 비르트 – 은 제어 흐름이 추론 가능하려면 규율을 갖춰야 한다고 주장했습니다. 리스코프는 같은 신념을 데이터로 확장했습니다. 프로그램이 어떻게 움직이는지를 규율하는 것으로는 충분하지 않습니다. 그 데이터가 무엇을 의미하는지, 그리고 누가 그것이 어떻게 저장되는지를 볼 수 있는지를 규율해야 합니다. (형성적 영향)

C.A.R. 호어와 명세의 규율. 사전 조건, 사후 조건, 불변식에 관한 호어의 작업 – 프로그램을 논리적 단언으로 추론하는 것 – 은 그녀와 윙이 정밀하게 만든 행동적 하위 타이핑 조건의 직접적인 지적 조상입니다. (형성적 영향)

그녀가 형성한 것들

모든 현대 타입 시스템. Java와 C#의 제네릭, Python과 C#의 이터레이터, C 계열 전반의 예외 처리, Swift의 설계 – CLU가 개척한 기능들은 이제 거의 모든 언어의 기본 가구입니다.4

객체 지향 실천. “구현이 아니라 인터페이스에 맞춰 프로그래밍하라”, 의존성 역전, 그리고 SOLID 어휘 전체에서 ‘L’은 리스코프의 원칙이 실무로 옮겨진 것입니다. 한 세대는 그것이 누구의 아이디어였는지 결코 배우지 않고도 나쁜 하위 클래스를 알아보는 법을 익혔습니다.7

분산 시스템 엔지니어링. 원자적 동작, 실패하는 노드들을 넘어선 트랜잭션 보장, 그리고 원격 서비스를 부분 실패에서도 살아남는 계약으로 다루는 실천은 Argus와 Thor를 거슬러 올라갑니다.23

관통하는 흐름

에츠허르 데이크스트라는 인간이 추론할 수 있도록 프로그램이 구조화되어야 한다고 주장했습니다 – 구조적 프로그래밍은 정확성에 봉사하는 제어 흐름의 규율이었습니다. 리스코프는 그 직접적인 계보입니다. 데이크스트라가 제어에 한 일을 그녀는 데이터에 했습니다. 모듈적 추론에는 규율 잡힌 루프만이 아니라 규율 잡힌 추상화 장벽이 필요하다고 역설하면서 말입니다. 그리고 톰슨과 리치가 “한 가지 일을 잘하고” 깨끗한 인터페이스를 통해 조립되는 작은 구성 요소를 중심으로 Unix와 C를 만들었던 곳에서, 리스코프는 그 조립이 신뢰할 만한지에 대한 이론을 주었습니다. 의지할 수 있는 구성 요소란 그 계약을 명시할 수 있고 그 하위 타입들이 그것을 지키는 구성 요소입니다. 그레이스 호퍼의 컴파일러조차 추상화의 행위였습니다 – 인간이 자신의 언어로 추론할 수 있도록 번역을 기계 안으로 옮긴 것입니다. 리스코프는 추상화 자체를, 컴파일러가 제공하는 편의가 아니라 프로그램 설계의 단위로 만들었습니다. (시리즈 연결)

내가 여기서 얻는 것

내가 간직하는 교훈은 인터페이스가 약속이며, 가치 있는 인터페이스란 오직 당신이 실제로 지키는 것들뿐이라는 점입니다. 타입 시그니처를 쓰는 일은 쉽습니다. 어려운 것은 그 시그니처가 함의하는 모든 것을 지키고, 새로운 하위 클래스나 리팩터링 아래에서 그것을 결코 슬그머니 위반하지 않는 일입니다. 리스코프의 원칙은 내가 경계를 견주는 기준입니다. “타입 검사가 통과하는가?”가 아니라 “호출자가, 그것이 어떻게 만들어졌는지 읽지 않고도, 그 부모가 신뢰받던 모든 자리에서 이것을 신뢰할 수 있는가?”입니다. 이것은 품질이 유일한 변수라는 것과 같은 기준입니다 – 질문은 결코 코드가 컴파일되느냐가 아니라, 그 계약이 실재하느냐입니다.

내가 지금 짓는 세계 – 에이전트, 도구 루프, AI 시스템 – 에서 리스코프의 신념은 그 어느 때보다 더 큰 하중을 견디고 있습니다. 내가 조립하는 구성 요소들이 본성상 불투명하기 때문입니다. 도구, 하위 에이전트, 모델 호출은 하나의 모듈입니다. 당신은 그것을 계약에 따라 호출하며, 그 내부는 읽을 수 없습니다. 게임 전체는 그 계약이 지켜지느냐에 달려 있습니다 – “코드베이스를 검색한다”고 주장하는 도구가 정말로 그 명세가 약속한 것을 반환하는지, 아니면 한 모델을 다른 모델로 바꿔치우는 것이 시스템의 나머지가 의존하던 사후 조건을 슬그머니 약화시키는지 말입니다. 그것이 2026년의 옷을 입은 리스코프 치환 원칙입니다. 치환된 구성 요소는 그것이 대체한 것의 약속을 지켜야 합니다. 계약을 명시하고 하위 타입들이 그것을 지키는지 검사하는 규율은, 증거 관문을 한낱 구호 이상으로 만드는 바로 그 규율입니다 – 각 조각이 제 말을 지키기에 조각조각 추론할 수 있는 시스템 말입니다.

자주 묻는 질문

바버라 리스코프의 엔지니어링 철학은 무엇인가요?

리스코프의 핵심 신념은 타입이 그 표현이 아니라 행동으로 정의된다는 것, 그리고 이것이 거대한 프로그램을 다룰 수 있게 만드는 것이라는 점입니다. 모듈은 계약 – 의미가 명시된 연산의 집합 – 이며, 계약의 목적은 그것이 어떻게 만들어졌는지 이해하지 않고도 그 모듈을 쓸 수 있다는 데 있습니다. 이 데이터 추상화의 아이디어는 CLU 언어부터 Argus 분산 시스템까지 그녀가 만든 모든 것을 관통하며, 그녀의 가장 유명한 결과를 낳았습니다. 하위 타입은 상위 타입이 한 모든 약속을 지켜야 한다는 원칙 말입니다.451

리스코프 치환 원칙이란 무엇인가요?

그것은 하위 타입이 호출자의 가정을 깨뜨리지 않고, 그 상위 타입이 기대되는 어느 자리에서든 사용 가능해야 한다는 요구입니다. 형식적으로는, 리스코프와 윙의 1994년 진술로 이렇습니다. “φ(x)를 타입 T의 객체 x에 대해 증명 가능한 속성이라고 하자. 그렇다면 S가 T의 하위 타입일 때, 타입 S의 객체 y에 대해서도 φ(y)가 참이어야 한다.”1 1987년 OOPSLA 기조 강연에서는 그것을 치환 속성으로 표현했습니다. 타입 S의 객체를 타입 T의 객체로 치환했을 때 모든 프로그램의 행동이 변하지 않는다면, S는 T의 하위 타입이라는 것입니다.6 실무에서 참된 하위 타입은 그 상위 타입보다 더 많이 요구해서는 안 되고(더 약하거나 같은 사전 조건), 더 적게 약속해서는 안 되며(더 강하거나 같은 사후 조건), 그 불변식을 보존해야 합니다. 대중적인 “오리처럼 생겼다면” 식의 표현은 리스코프의 것이 아니며 요점을 놓칩니다. 원칙은 겉모습의 닮음이 아니라 지켜진 약속에 관한 것입니다.7

바버라 리스코프는 무엇을 발명했나요?

그녀는 CLU 프로그래밍 언어(1973년 시작)를 설계하고 그 구현을 이끌었으며, 이 언어는 추상 데이터 타입, 이터레이터, 구조화된 예외 처리, 매개변수 다형성을 도입하거나 대중화했습니다 – 이제 Java, C#, Python, Swift 등에서 표준이 된 기능들입니다.4 그 이전에 그녀는 Venus 시분할 운영체제를 만들었고, 이후 분산 프로그램을 위한 최초의 고급 언어인 Argus와 분산 객체 지향 데이터베이스인 Thor를 만들었습니다.23 자넷 윙과 함께 그녀는 행동적 하위 타이핑을 형식화했으며, 이는 지금 리스코프 치환 원칙이라 불립니다.1

바버라 리스코프는 왜 튜링상을 받았나요?

ACM은 그녀에게 2008년 A.M. 튜링상을 수여하며 “프로그래밍 언어 및 시스템 설계의 실용적·이론적 기초에 대한 공헌, 특히 데이터 추상화, 결함 내성, 분산 컴퓨팅과 관련된 공헌에 대하여”라고 했습니다.8 그 인정은 그녀의 경력 전체에 걸쳐 있습니다. CLU를 통해 데이터 추상화를 프로그래밍 언어의 기본 단위로 만든 것, 모듈성과 하위 타이핑의 이론을 진전시킨 것, 그리고 그 아이디어들을 독립적으로 실패하는 기계들을 가로질러 신뢰성 있는 시스템을 짓는 어려운 문제에 적용한 것 말입니다. 그녀는 미국에서 컴퓨터 과학 박사 학위를 받은 최초의 여성 가운데 한 명이며(스탠퍼드, 1968년), MIT의 인스티튜트 프로페서입니다.2


출처


  1. Barbara H. Liskov and Jeannette M. Wing, “A Behavioral Notion of Subtyping,” ACM Transactions on Programming Languages and Systems 16, no. 6 (November 1994): 1811–1841. 하위 타입 요건: “φ(x)를 타입 T의 객체 x에 대해 증명 가능한 속성이라고 하자. 그렇다면 S가 T의 하위 타입일 때, 타입 S의 객체 y에 대해서도 φ(y)가 참이어야 한다.” 조건: 더 약하거나 같은 사전 조건과 더 강하거나 같은 사후 조건을 가진 메서드, 보존된 불변식과 이력 속성. 공식 출판처(DOI): 10.1145/197320.197383. 

  2. “Barbara Liskov,” Wikipedia. 1939년 11월 7일 로스앤젤레스 출생. 수학 학사(물리학 부전공), UC 버클리, 1961년. 박사, 스탠퍼드, 1968년, 지도교수 존 매카시, 체스 엔드게임 프로그램(킬러 휴리스틱)에 관하여. 미국에서 컴퓨터 과학 박사 학위를 받은 최초의 여성 중 한 명. Mitre에서의 Venus OS. CLU. Argus(“분산 프로그램의 구현을 지원한 최초의 고급 언어”, 프로미스 파이프라이닝 포함). Thor 객체 지향 데이터베이스. MIT 인스티튜트 프로페서. IEEE 존 폰 노이만 메달(2004년). 미국 발명가 명예의 전당(2012년). 벤저민 프랭클린 메달(2023년). 

  3. “Barbara Liskov,” Encyclopaedia Britannica. Venus 시분할 시스템. CLU와 데이터 추상화. Argus 분산 프로그래밍. Thor 분산 객체 지향 데이터베이스. 2008년 튜링상. 

  4. “CLU (programming language),” Wikipedia. 바버라 리스코프와 MIT의 학생들이 설계, 1973년 시작, 1975년 처음 등장. 클러스터(타입 확장/추상 데이터 타입 메커니즘). yield 코루틴을 통한 이터레이터. signal/except 예외 처리. 타입 안전 매개변수화 타입(매개변수 다형성)과 변형 타입. 다중 반환값. Java, C#, Python, Ruby의 제네릭과 이터레이터에 영향을 주었고, Swift의 설계자들에게서 공로를 인정받음. 

  5. Barbara Liskov and Stephen Zilles, “Programming with Abstract Data Types,” Proceedings of the ACM SIGPLAN Symposium on Very High Level Languages, 1974. CLU가 구현한 추상 데이터 타입 접근법을 도입한 토대가 된 논문. 리스코프의 회고 강연 “The Power of Abstraction”(OOPSLA, 2009)도 참고. 

  6. Barbara Liskov, “Keynote address – data abstraction and hierarchy,” ACM SIGPLAN Notices 23, no. 5 (May 1988): 17–34, OOPSLA ‘87 회의록 부록에서. 원래의 치환 속성: “What is wanted here is something like the following substitution property: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2, then S is a subtype of T.” 

  7. “Liskov substitution principle,” Wikipedia. 리스코프의 1987년 기조 강연과 1994년 리스코프–윙 형식화에 기원. 대중적 의역 “상위 클래스의 객체는 프로그램을 깨뜨리지 않고 하위 클래스의 객체로 대체될 수 있다”. 행동적 하위 타이핑 조건. 정식 반례로서의 직사각형/정사각형 위반. “덕 타이핑” 식 표현은 리스코프의 것이 아님. 

  8. “Barbara Liskov – A.M. Turing Award Laureate,” ACM. 2008년 튜링상 헌사: “프로그래밍 언어 및 시스템 설계의 실용적·이론적 기초에 대한 공헌, 특히 데이터 추상화, 결함 내성, 분산 컴퓨팅과 관련된 공헌에 대하여.” 발표 및 확장 헌사(“데이터 추상화, 모듈성, 결함 내성, 영속성, 그리고 분산 컴퓨팅 시스템”): CRA-WP. 

  9. Barbara Liskov, “Distributed Programming in Argus,” Communications of the ACM 31, no. 3 (March 1988): 300–312. CLU를 분산 프로그램용으로 확장한 Argus. 가디언(분산 상태를 캡슐화하고 핸들러를 통해 접근되는 객체). 2단계 커밋으로 조율되는 엄격한 일관성 및 원자성 보장을 가진 원자적 동작. 중첩된 분산 트랜잭션. “Guardians and Actions: Linguistic Support for Robust, Distributed Programs”(Liskov and Scheifler, 1983)도 참고. 

관련 게시물

엔지니어링 철학: 레슬리 램포트, 코딩 전에 생각하라

레슬리 램포트는 분산 시스템을 과학으로 만들었습니다. 시간은 전역적이지 않고, 실재하는 것은 인과이며, 코드를 쓰기 전에 설계를 명세합니다.

12 분 소요

엔지니어링 철학: 그레이스 호퍼, 컴퓨터가 인간의 언어를 말하게 하다

그레이스 호퍼는 프로그램을 인간의 언어로 작성할 수 있도록 최초의 컴파일러를 만들었고, 1나노초 길이의 전선으로 지연 시간을 손에 잡히는 물건으로 바꿔놓았으며, 낡은 통념과 싸웠습니다.

13 분 소요

The Shader Gallery That Lied: Debugging 216 WebGL Presets

A user said the shader playground looked broken. Pixel-readback testing found 30 dead presets, 11 that never compiled, a…

11 분 소요