"정적 타이핑"및 "동적 타이핑"과 같은 문구가 많이 사용되며 사람들은 미묘하게 다른 정의를 사용하는 경향이 있으므로 의미를 명확히하여 시작하겠습니다.
컴파일 타임에 검사되는 정적 유형을 가진 언어를 고려하십시오. 그러나 유형 오류는 치명적이지 않은 경고 만 생성하며 런타임에 모든 유형은 오리 유형입니다. 이 정적 유형은 프로그래머의 편의를 위해서만 제공되며 codegen에는 영향을 미치지 않습니다. 이는 정적 타이핑 자체가 제한을 두지 않으며 동적 타이핑과 상호 배타적이지 않음을 보여줍니다. (Objective-C는 이와 비슷합니다.)
그러나 대부분의 정적 유형 시스템은이 방식으로 작동하지 않습니다. 정적 유형 시스템에는 다음과 같은 두 가지 공통 속성이 있습니다.
컴파일러는 정적 유형 오류가 포함 된 프로그램을 거부 할 수 있습니다.
많은 유형 안전 프로그램에 반드시 정적 유형 오류가 포함되기 때문에 이는 제한 사항입니다.
예를 들어 Python 2와 Python 3으로 실행 해야하는 Python 스크립트가 있습니다. 일부 함수는 Python 2와 3 사이에서 매개 변수 유형을 변경 했으므로 다음과 같은 코드가 있습니다.
if sys.version_info[0] == 2:
wfile.write(txt)
else:
wfile.write(bytes(txt, 'utf-8'))
Python 2 정적 유형 검사기는 실행되지 않더라도 Python 3 코드를 거부합니다 (또는 그 반대). 내 유형 안전 프로그램에 정적 유형 오류가 있습니다.
다른 예로, OS X 10.6에서 실행 되길 원하지만 10.7의 새로운 기능을 활용하는 Mac 프로그램을 고려하십시오. 10.7 메소드는 런타임에 존재할 수도 있고 존재하지 않을 수도 있으며, 프로그래머는 나를 감지합니다. 정적 형식 검사기는 형식 안전을 보장하기 위해 내 프로그램을 거부하거나 런타임에 형식 오류 (함수 없음)가 발생할 가능성과 함께 프로그램을 수락해야합니다.
정적 유형 검사는 런타임 환경이 컴파일 시간 정보에 의해 적절하게 설명되어 있다고 가정합니다. 그러나 미래를 예측하는 것은 위험합니다!
한 가지 더 제한 사항이 있습니다.
컴파일러는 런타임 유형이 정적 유형이라고 가정하는 코드를 생성 할 수 있습니다.
정적 유형이 "정확"하다고 가정하면 최적화에 대한 많은 기회가 제공되지만 이러한 최적화는 제한적일 수 있습니다. 좋은 예는 원격과 같은 프록시 객체입니다. 다른 프로세스에서 메소드 호출을 실제 오브젝트로 전달하는 로컬 프록시 오브젝트를 원한다고 가정하십시오. 프록시가 일반 (따라서 객체로 가장 할 수 있음) 투명하고 (기존 코드가 프록시와 통신하고 있음을 알 필요가 없도록) 투명하면 좋을 것입니다. 그러나이를 위해 컴파일러는 정적 유형을 올바른 것으로 가정하는 코드를 생성 할 수 없습니다 (예 : 정적 인라인 메소드 호출). 객체가 실제로 프록시 인 경우 실패하기 때문에 실패합니다.
이러한 원격 기능의 예로는 ObjC의 NSXPCConnection 또는 C #의 TransparentProxy가 있습니다 (이 구현에는 런타임에 약간의 비관 화가 필요했습니다- 여기 를 참조 하십시오 ).
codegen이 정적 유형에 의존하지 않고 메시지 전달과 같은 기능이있는 경우 프록시 객체, 디버깅 등으로 많은 멋진 작업을 수행 할 수 있습니다.
타입 체커를 만족시킬 필요가없는 경우에 할 수있는 것들 중 일부를 샘플링 한 것입니다. 정적 유형이 아니라 강제 정적 유형 검사에 의해 제한이 적용됩니다.