타입 시스템으로 오류 방지
타입 시스템은 불법 프로그램을 제거합니다. 다음 파이썬 코드를 고려하십시오.
a = 'foo'
b = True
c = a / b
파이썬에서이 프로그램은 실패합니다. 예외가 발생합니다. Java, C #, Haskell 과 같은 언어 에서 이것은 법적 프로그램이 아닙니다. 입력 프로그램 세트에서는 불가능하기 때문에 이러한 오류를 완전히 피하십시오.
마찬가지로 더 나은 유형의 시스템은 더 많은 오류를 배제합니다. 우리가 최고급 타입 시스템으로 뛰어 올라가면 다음과 같이 말할 수 있습니다.
Definition divide x (y : {x : integer | x /= 0}) = x / y
이제 타입 시스템은 0으로 나누기 오류가 없음을 보장합니다.
어떤 종류의 오류
다음은 유형 시스템이 예방할 수있는 오류 목록입니다.
- 범위를 벗어난 오류
- SQL 주입
- 2, 많은 안전 문제 일반화 ( Perl 에서 오염 검사 가 무엇인지 )
- 순서에 맞지 않는 오류 (init 호출을 잊어 버림)
- 값의 하위 집합을 강제로 사용 (예 : 0보다 큰 정수만)
사악한 새끼 고양이 (예, 농담이었습니다)
- 정밀도 손실 오류
- 소프트웨어 트랜잭션 메모리 (STM) 오류 (순도, 유형도 필요)
- 8 일반화, 부작용 통제
- 데이터 구조에 대한 불변량 (이진 트리는 균형이 맞습니까?)
- 예외를 잊거나 잘못된 것을 던지기
그리고 이것은 또한 컴파일 타임에 있다는 것을 기억하십시오 . 단순히 타입 오류를 확인하기 위해 100 % 코드 적용 범위로 테스트를 작성할 필요가 없습니다.
사례 연구 : 유형 람다 미적분학
좋아, 모든 유형 시스템 중 가장 간단한 유형, 간단히 람다 미적분법을 살펴 봅시다 .
기본적으로 두 가지 유형이 있습니다.
Type = Unit | Type -> Type
그리고 모든 용어는 변수, 람다 또는 응용 프로그램입니다. 이를 바탕으로, 잘 입력 된 프로그램이 종료되었음을 증명할 수 있습니다. 프로그램이 멈추거나 반복되는 상황은 결코 없습니다. 이것은 정상적인 람다 미적분학에서는 증명할 수 없지만 사실이 아닙니다.
이것에 대해 생각해보십시오. 유형 시스템을 사용하여 프로그램이 영원히 반복되지 않고 오히려 멋지다는 것을 보장 할 수 있습니까?
동적 유형으로 우회
동적 유형 시스템은 정적 유형 시스템과 동일한 보장을 제공하지만 컴파일 타임이 아닌 런타임에 보장 할 수 있습니다. 실제로 런타임이기 때문에 실제로 더 많은 정보를 제공 할 수 있습니다. 그러나 특히 종료와 같은 정적 속성에 대한 일부 보장은 손실됩니다.
따라서 동적 유형은 특정 프로그램을 배제하지 않고 잘못된 형식의 프로그램을 예외 처리와 같은 잘 정의 된 조치로 라우팅합니다.
TLDR
따라서 길고 짧은 유형 시스템은 특정 프로그램을 배제한다는 것입니다. 많은 프로그램이 어떤 식 으로든 깨져 있으므로 유형 시스템을 사용하면 이러한 깨진 프로그램을 피할 수 있습니다.