파이썬을 언급했기 때문에 문제는 순전히 형식 이론이 아닙니다. 그래서 나는 유형에 대해 더 넓은 관점을 제시하려고 노력합니다. 유형은 사람들마다 다릅니다. 나는 적어도 5 가지 (그러나 관련성이있는) 유형의 개념을 수집했습니다.
유형 시스템은 논리 시스템이며 설정 이론입니다.
유형 시스템은 유형을 각 계산 된 값과 연관시킵니다. 유형 시스템은 이러한 값의 흐름을 검사하여 유형 오류가 발생하지 않음을 증명하거나 확인하려고합니다.
유형은 실제 유형, 정수 또는 부울과 같은 다양한 유형의 데이터 중 하나를 식별하는 분류로 해당 유형에 가능한 값을 결정합니다. 해당 유형의 값에 대해 수행 할 수있는 작업 데이터의 의미; 해당 유형의 값을 저장하는 방법
추상 데이터 형식을 사용하면 고급 언어로 데이터를 추상화 할 수 있습니다. ADT는 종종 모듈로 구현됩니다. 모듈의 인터페이스는 ADT 작업에 해당하는 절차를 선언합니다. 이 정보 숨김 전략을 통해 클라이언트 프로그램을 방해하지 않고 모듈의 구현을 변경할 수 있습니다.
프로그래밍 언어 구현은 값 유형을 사용하여 값이 필요한 스토리지와 값 조작을위한 알고리즘을 선택합니다.
인용문은 Wikipedia에서 가져온 것이지만, 필요할 경우 더 나은 참조를 제공 할 수 있습니다.
타입 -1은 러셀의 연구에서 생겨 났지만 오늘날은 역설을 막을뿐 아니라 형식화 된 호모 토피 타입 이론은 수학을 형식적이고 기계가 이해할 수있는 언어로 인코딩하는 새로운 방법이며 인간이 기초를 이해하는 새로운 방법이다 수학 "이전 방식은 공리 집합 이론을 사용하여 인코딩하는 것입니다."
타입 2-5는 버그를 피하고, 데이터 소프트웨어 설계자와 프로그래머가 함께 작업하고, 큰 시스템을 설계하고, 프로그래밍 언어를 각각 효율적으로 구현하기 위해 여러 가지 요구에서 프로그래밍을 시작했습니다.
C / C ++, Ada, Java, Python의 유형 시스템은 Russel의 작업이나 버그를 피하려는 열망에서 발생하지 않았습니다. 그들은 다양한 종류의 데이터 (예 : "성은 숫자가 아닌 문자열")를 설명하고, 소프트웨어 설계를 모듈화하고, 데이터에 대한 저수준 표현을 최적으로 선택해야하는 필요성에서 생겨났습니다. 이 언어에는 유형 -1 또는 유형 -2가 없습니다. Java는 유형 시스템을 사용하여 프로그램 정확성을 검증하는 것이 아니라 언어 (포인터 산술 없음) 및 런타임 시스템 (가상 머신, 바이트 코드 검증)을 신중하게 설계하여 버그로부터 상대적 안전을 보장합니다. Java의 유형 시스템은 논리 시스템이나 집합 이론이 아닙니다.
그러나 Agda 프로그래밍 언어의 유형 시스템은 Russel 유형 시스템의 최신 변형입니다 (나중에 작업하거나 Per Martin-Lof 및 기타 수학자 기반). Agda의 유형 시스템은 프로그램의 수학적 속성과 해당 속성의 증거를 표현하도록 설계되었으며 논리적 시스템과 이론입니다.
여기에는 흑백 구분이 없습니다. 많은 언어가 그 사이에 맞습니다. 예를 들어, Haskell 언어의 유형 시스템은 Russel의 연구에 뿌리를두고 있으며 간결한 Agda 시스템으로 볼 수 있지만, 수학적 관점에서는 논리적 시스템이나 이론으로 볼 때 일관성이 없습니다 (자기 모순).
그러나 Haskell 프로그램을 버그로부터 보호하기위한 이론적 수단으로 작동합니다. 유형을 사용하여 특정 속성 및 증명을 인코딩 할 수도 있지만 모든 속성을 인코딩 할 수있는 것은 아니며 프로그래머가 낙심 한 더러운 핵을 사용하는 경우에도 입증 된 속성을 위반할 수 있습니다.
Scala의 타입 시스템은 Russel의 작업과 Agda의 완벽한 교정 언어에서 멀어졌지만 여전히 Russel의 작업에 뿌리를두고 있습니다.
유형 시스템이 설계되지 않은 산업 언어의 속성을 입증하는 데는 많은 접근 방식과 시스템이 있습니다.
흥미롭지 만 다른 접근법은 Coq 및 Microsoft Boogie 리서치 프로젝트를 참조하십시오. Coq는 Coq 프로그램에서 명령형 프로그램을 생성하기 위해 유형 이론에 의존합니다. Boogie는 속성이있는 명령형 프로그램의 주석에 의존하며 Coq와 완전히 다른 접근 방식을 사용하여 Z3 정리를 통해 해당 속성을 증명합니다.