판 비교

이전빈 문서 (처음 만든 판)
이후#302 · AI 조사: 게임 용어 문서 · GGWiki 자동 ·
+69줄−0줄+3,661자
1번째 줄 근처
추가: ## 개요
추가: 점진적 타이핑(gradual typing)은 정적 타이핑과 동적 타이핑을 하나의 언어 안에서 모두 허용하면서도, 실행 시점에 타입을 강제하는 타입 시스템이다. 개발자는 단일 언어 내에서 코드의 각 부분에 적합한 타이핑 패러다임을 선택적으로 적용할 수 있다. 많은 경우 기존 동적 언어에 점진적 타이핑을 추가하여 파생 언어를 만들지만, 처음부터 점진적 타이핑을 염두에 두고 설계된 언어도 존재한다. 다만 순수하게 동적인 타이핑이나 선택적 타이핑(optional typing)에 비해 성능과 구현 복잡도 측면에서 트레이드오프가 존재한다.[2]
추가:
추가: ## 역사·유래
추가:
추가: '점진적 타이핑(gradual typing)'이라는 용어는 2006년 제레미 식(Jeremy Siek)이 왈리드 타하(Walid Taha)와 함께 이 개념을 개발하면서 처음 사용하였다.[2]
추가:
추가: ## 작동 방식과 유형
추가:
추가: ### 동적 타입과 일관성 관계
추가:
추가: 점진적 타이핑 시스템에서는 정적으로 알 수 없는 타입을 나타내기 위해 `dynamic`이라는 특수 타입을 사용한다. 기존의 타입 동등성(type equality) 개념 대신 **일관성(consistency)**이라는 새로운 관계가 도입되는데, 이는 `dynamic` 타입을 다른 모든 타입과 연결한다. 일관성 관계는 반사적(reflexive)과 대칭적(symmetric)이지만 **이행적(transitive)은 아니다**.[2]
추가:
추가: ### 서브타이핑과의 차이
추가:
추가: 초기에는 `dynamic` 타입을 서브타이핑 계층의 최상위(top)와 최하위(bottom)로 동시에 만들려는 시도가 있었다. 그러나 서브타이핑은 이행성을 가지므로, 이 접근은 모든 타입이 서로 관련되게 만들어 정적 타입 오류를 걸러내는 서브타이핑의 기능을 무력화시킨다. 타입 시스템에 두 번째 단계인 '개연성 검사(plausibility checking)'를 추가해도 이 문제를 완전히 해결하지 못한다.[2]
추가:
추가: 점진적 타이핑은 이미 서브섬션 규칙(subsumption rule)을 사용하여 암시적 업캐스트를 허용하는 객체지향 언어의 타입 시스템에 자연스럽게 통합될 수 있다. 핵심 아이디어는 **일관성과 서브타이핑이 직교하는 개념**이며, 이들이 잘 조합된다는 점이다. 점진적 타이핑 언어에 서브타이핑을 추가하려면 서브섬션 규칙과 함께 `dynamic` 타입이 자기 자신의 서브타입이 되도록 하는 서브타이핑 규칙만 추가하면 된다(서브타이핑은 반사적이어야 하므로). 단, 서브타이핑 순서의 최상위(top)를 `dynamic`으로 만들면 안 된다.[2]
추가:
추가: ### 선택적 타이핑(optional typing)과의 비교
추가:
추가: 점진적 타이핑과 선택적 타이핑은 변수와 표현식에 타입을 부여하고 컴파일 시점에 타입 정확성을 검사한다는 점(정적 타이핑)에서 유사하다. 그러나 결정적인 차이가 존재한다.[2]
추가:
추가: * **점진적 타이핑**: 타입이 지정된 코드와 지정되지 않은 코드의 **경계에서 런타임 검사를 삽입**한다.
추가: * **선택적 타이핑**: 모든 타입 정보를 컴파일 시점에 **지워버리며(erasure)**, 타입이 없는 값이 타입 주석이 달린 코드를 자유롭게 통과할 수 있다.
추가:
추가: #### 구체적 동작 차이 예시
추가:
추가: `credit` 필드가 정수여야 하는 `Account` 클래스를 예로 들면:[2]
추가:
추가: * **점진적 타이핑 언어**: `new Account("2")`처럼 문자열을 전달하려는 순간 **즉시 예외가 발생**하며, 스택 트레이스는 잘못된 호출 지점에서 멈춘다.
추가: * **선택적 타이핑 언어**: `credit`에 문자열 `"1"`을 넣는 것 자체는 허용된다. 오류는 `spendCredit` 메서드에서 정수 1을 빼는 연산을 수행하려 할 때 **나중에야 발생**한다. `compare` 함수 등은 정상 동작하므로, 프로덕션 환경에서 유효하지 않은 `Account` 인스턴스가 생성·조작되어 데이터 저장소에 저장될 경우 **데이터 손상(data corruption)**으로 이어질 수 있다.
추가:
추가: 선택적 타이핑 언어에서 비슷한 안전성을 얻으려면 프로그래머가 수동으로 세터(setter) 등에 가드(guard) 코드를 삽입해 타입 검사를 수행해야 한다. 그러나 이 경우 스택 트레이스가 위반 지점이 아닌 세터를 가리키며, 외부 값을 세터를 거치지 않고 직접 전달하면 유효하지 않은 인스턴스가 생성되어 나중에야 발견될 수 있어 데이터 손상 방지와 원인 추적이 더 어려워진다.[2]
추가:
추가: ## 사례
추가:
추가: 자료에 언급된 점진적 타이핑 구현 언어 및 시스템은 다음과 같다.[2]
추가:
추가: ### 기존 동적 언어에서 파생된 경우
추가:
추가: * **Closure Compiler** (자바스크립트)
추가: * **Hack** (PHP용)
추가: * **PHP** (7.0 버전부터)
추가: * **Typed Racket** (Racket용)
추가: * **Typed Clojure** (Clojure용)
추가: * **cperl** (타입이 추가된 Perl 5)
추가: * **ActionScript** (ECMAScript와 상호운용되었으며, 원래는 별개로 출발했으나 둘 다 애플의 HyperTalk 영향을 받음)
추가: * **JS++** (2011년 공개, 자바스크립트 슈퍼셋으로 ECMAScript 및 DOM API 코너 케이스에 대해 건전(sound)한 점진적 타입 시스템 제공)
추가: * **GDScript** (고도(Godot) 게임 엔진의 주 스크립트 언어. 3.1 버전부터 점진적 타이핑 도입. 변수, 함수 매개변수, 배열, 딕셔너리에 타입 힌트 허용. `:=` 표기 사용 시 빌드 타임에 타입 추론 시도)
추가: * **J 프로그래밍 언어용 시스템** (강제(coercion), 오류 전파, 필터링을 일반 검증 속성에 추가하고, 타입 함수를 함수 정의 밖에서도 적용 가능하게 하여 타입 정의의 유연성 증가)
추가:
추가: ### 정적 언어에서 점진적 타이핑으로 확장한 경우
추가:
추가: * **C#** (정적 타이핑으로 시작했으나 4.0 버전부터 `dynamic` 타입을 통해 변수를 명시적으로 동적으로 표시할 수 있게 되어 점진적 타이핑 지원)
추가:
추가: ### 처음부터 점진적 타이핑을 채택한 경우
추가:
추가: * **Raku** (구 Perl 6). 값이 할당되거나 바인딩되는 모든 위치에서 타입 검사 발생. '타입 없는' 변수나 매개변수는 `Any` 타입으로 간주되어 (거의) 모든 값과 매치. 컴파일 타임에 성공 불가능한 타입 검사 충돌을 컴파일러가 플래그로 표시.
추가:
추가: ### 객체 포인터에 한정된 경우
추가:
추가: * **Objective-C** (객체 포인터의 메서드 호출에 대해 점진적 타이핑 지원. 특정 클래스 포인터로 타입 지정된 변수는 정적 검사 수행. `id` 타입 변수 사용 시 컴파일러가 모든 메서드 호출 허용)
추가:
추가: ## 규제·논란·평가
추가:
추가: 자료는 점진적 타이핑이 동적 타이핑이나 선택적 타이핑에 비해 **성능(performance)과 구현 복잡도(implementation complexity) 측면에서 트레이드오프가 존재**한다고 평가한다. 또한 선택적 타이핑과의 비교를 통해, 점진적 타이핑이 경계에서의 런타임 검사 덕분에 잘못된 타입 전달을 호출 지점에서 즉시 잡아내어 데이터 손상 방지와 디버깅 용이성에서 이점이 있음을 시사한다. 반면 선택적 타이핑은 타입 지우기 방식 때문에 런타임에 타입 오류가 지연되어 데이터 손상 위험이 커지고 원인 추적이 어렵다는 점이 지적된다.[2]
추가:
추가: 이 문서는 GGWiki AI가 공개 자료(아래 출처)를 조사해 새로 쓴 초안입니다. 틀린 내용은 편집하거나 이의 제기로 알려 주세요.