카테고리 보관물: cs

cs

정적 유형 검사의 보수적이지 않은 예는 무엇입니까? 할 수

에서 프로그래밍 언어의 개념 , 존 미첼은 정적 타입 검사 때문에 중단 문제의 (지나치게 엄격한) 반드시 보수적이라고 씁니다. 그는 예를 들면 다음과 같습니다.

if (complicated-expression-that-could-run-forever)
   then (expression-with-type-error)
   else (expression-with-type-error)

누군가 실제적으로 우려 할만한 미해결 된 답변을 제공 할 수 있습니까?

Java는 다음과 같은 경우 동적으로 확인 된 캐스트를 허용합니다.

if (foo instanceof Person) {
    Person p = (Person) foo;
    :
}

그러나 나는 언어 간 문제보다 더 많은 Java 언어 / 컴파일러 부족의 필요성을 고려합니다.



답변

나는 알고리즘을 전혀 표현할 수 있는지 아닌지에 대한 것보다 편의상 항상 더 많이 보았습니다. 만약 내가 Mitchell이 ​​고안 한 것과 같은 프로그램을 정말로 실행하고 싶다면, 정적 타입 언어로 적절한 Turing Machine 시뮬레이터를 작성하면된다.

정적 유형 시스템의 트릭은 유연성을 통해보다 쉽게 ​​유지 관리 할 수있는 코드를 작성할 수있는 경우에 적합한 유연성을 제공하는 것입니다.

다음은 정적 형식 언어보다 동적으로 관리하기가 더 쉬운 프로그램 구조화 기술의 예입니다.

제네릭과 컨테이너

ML (c. 1973) 및 CLU ( 1974.c ) 이전의 정적으로 유형이 지정된 언어에서는 빨강-검정 문자열 트리, 빨강-검정 정수 트리, 적-검정 트리 수레 또는 특정 유형의 요소의 레드-블랙 트리 Foo. 그러나 정적으로 검사되고 이러한 데이터 유형 중 하나를 처리 할 수있는 단일-검은 색 트리의 단일 구현을 작성하는 것은 어려웠습니다 (아마도 불가능할 수도 있음). 문제를 해결하는 방법은 (1) 유형 시스템을 완전히 분리하는 것입니다 (예 :void * C), (2) 자신에게 일종의 매크로 프리 프로세서를 작성한 다음 원하는 각 특정 유형에 대한 코드를 생성하는 매크로를 작성하거나 (3) 추출 된 유형을 확인하는 Lisp / Smalltalk (및 Java) 접근법을 사용하십시오. 동적으로 객체.

ML 및 CLU는 각각 유추 및 명시 적으로 선언 된 (정적) 매개 변수화 된 유형의 개념을 도입하여 일반 정적 유형 컨테이너 유형을 작성할 수 있습니다.

아형 다형성

Simula67 (c. 1967) 및 Hope (c. 1977) 이전의 정적으로 유형이 지정된 언어에서는 동적 디스패치를 ​​수행 하고 모든 하위 유형에 대해 사례를 다루 었는지 정적으로 확인할 수 없었습니다. 많은 언어의 형태했다 태그 조합을 하지만, 프로그래머의 책임가 있는지 확인하는 것이 었 case또는 switch문, 또는 점프 테이블, 가능한 모든 태그를 포함했다.

Simula 모델 (C ++, Java, C #, Eiffel)을 따르는 언어는 컴파일러가 각 서브 클래스가 상위 클래스에 의해 선언 된 모든 메소드를 구현했는지 확인할 수있는 서브 클래 싱이있는 추상 클래스를 제공합니다. Hope 모델 (SML / NJ에서 Haskell까지의 모든 ML 변형)을 따르는 언어에는 대수 하위 유형이 있으며 컴파일러에서 모든 typecase명령문이 모든 하위 유형을 포함 하는지 확인할 수 있습니다 .

원숭이 패치 및 Aspect 지향 프로그래밍

다이나믹 타입 시스템은 다양한 프로토 타이핑 기술을 훨씬 쉽게 만듭니다. 문자열에서 함수 (예 : Python, Javascript, Ruby)에 대한 해시 맵으로 유형이 표시되는 언어에서는 특정 유형에 의존하는 모든 모듈의 동작을 전체적으로 변경하는 것이 매우 간단합니다. 유형.

원숭이 패치를 사용하여 프로그램을 유지 관리하기 어렵게 만들 수있는 확실한 방법이 있지만 실제로는 “악”보다는 “좋은”방법으로 사용할 수 있습니다. 특히 측면 지향 프로그래밍 에서는 가상화 된 파일 시스템을 가리 키도록 파일 유형을 수정하여 “무료”에 대한 단위 테스트 인프라를 구축하거나 간단한 예외 유형을 수정하는 등의 기술을 사용하여 원숭이 패치 기법을 사용할 수 있습니다. 디버깅 가능성을 높이기 위해 적발 될 때마다 로그 메시지를 인쇄합니다.

1970 년대에 주요 정적 검사 아이디어를 구할 수 있었던 Generics 및 Subtype Polymorphism과 달리 Aspect 지향 프로그래밍에 대한 정적 검사는 활발한 연구 분야라고 생각합니다. 2001 년부터 AspectJ 라는 언어가 있다는 점을 제외하고는 그것에 대해 잘 모릅니다 .


답변