타입 검사 알고리즘


19

형식 검사 알고리즘에 대한 개인 서지 연구를 시작하고 있으며 몇 가지 팁이 필요합니다. 가장 일반적으로 사용되는 형식 검사 알고리즘, 전략 및 일반적인 기술은 무엇입니까?

특히 C ++, Java 5+, Scala 또는 기타와 같이 널리 알려진 강력한 정적 형식 언어로 구현 된 복잡한 형식 검사 알고리즘에 관심이 있습니다. IE, 기본 언어의 매우 간단한 타이핑 (Java 1.4 이하)으로 인해 매우 간단하지 않은 유형 검사 알고리즘.

특정 언어 X, Y 또는 Z에 관심이 없습니다. 대상 언어에 관계없이 형식 검사 알고리즘에 관심이 있습니다. "강력한 유형의 입력에 대해 들어 본 적이없는 언어 L과 같은 답을 입력하고 입력이 복잡한 경우 알고리즘 Z를 사용하여 X 및 Y를 확인하여 A, B 및 C를 수행하는 유형 확인 알고리즘이 있습니다." 스칼라에 사용 된 전략 X와 Y와 C #에 사용 된 A의 변형 Z는 그런 식으로 작동하는 R, S 및 T 기능 때문에 멋지다 "라고 대답하면 좋습니다.


3
특정 언어에 대한 유형 검사에 대해 질문하려면이 질문을 편집해야합니다. 개방형 목록 스타일의 질문은 일반적으로 SE에서 권장하지 않습니다 (이 특정 사이트에는 아직 관련 정책이 없지만). <type-system-elitist> 자바의 타입 시스템은 복잡하지 않다 </ type-system-elitist>.
sepp2k

3
아마도 그 질문은 더 구체적으로 표현 될 수 있지만 닫혀서는 안된다고 생각합니다.
Dave Clarke

1
@ sepp2k : 나는 그것이 조금 광범위하다는 것을 알고 있지만 대답의 유용성을 제한하고 싶지 않기 때문에 이런 식으로 끝났습니다. BTW, 나는 당신이 "<type-system-elitist> Java의 타입 시스템이 복잡하지 않다 </ type-system-elitist>"라고 말하고 싶은 것을 이해하지 못했습니다. 실제로 Java 1.4 이하 시스템은 간단하지만 Java 5의 제네릭은 훨씬 복잡해졌습니다.
Victor Stafusa

2
하나의 특정 언어를 요구하면이 사이트에 대한 질문이 더 적합하지 않게됩니다 (imho). 질문은 아마도 일반적인 기술을 요구해야 할 것입니다.
Raphael

1
@Victor 기본 도구는 속성 문법 입니다. 당신은 그들과 함께 상상할 수있는 모든 사악한 일을 할 수 없을지 모르지만, 그들은 좋은 출발점이됩니다.
Raphael

답변:


13

대부분의 연구는 실제로 완전한 프로그래밍 언어에 대한 유형 검사 알고리즘을 게시하지 않습니다. Drossopoulou와 Eisenbach의 Java 또는 Nipkov 등의 C ++ 작업 과 같이 전체 프로그래밍 언어를위한 형식 시스템의 대부분의 형식화가 있습니다 . 그러나 종종 언어의 일부 핵심 부분 (Featherweight Java가 하나의 예) 또는 scala로컬 형식 유추 접근법 과 같은 언어의 핵심 개념에 대한 형식 시스템 만 찾을 수 있습니다 .

POPL 및 ICFP와 같은 회의에서는 특정 유형의 유형 시스템에 대한 많은 유형 확인 알고리즘과 양방향 및 3 방향 유형 확인 과 같은 새로운 접근 방식을 찾을 수 있습니다.

좀 더 일반적으로, 논문의 참고 문헌을 따르고 구글 학자를 사용하여 Damas-Milner 알고리즘 , 로컬 유형 유추, 양방향 및 3 방향 유형 확인 에 대해 알고 확장해야합니다. 설명 된 접근법. 또한 위에서 제안한 것처럼 POPL, ICPF, ESOP, 심지어 ECOOP 및 OOPSLA와 같은 회의에는 귀하의 퀘스트와 관련된 서류가 있습니다.


Scala의 타입 시스템 인 Afaik은 연구 프로젝트에서 개발되어 출판되었습니다. 컴파일러도 오픈 소스입니다. 그래도 살펴 보지 않았습니다.
Raphael

내가 추론 할 필요가 없다. 내가 알고 스칼라의 타입 시스템에 게시 된 논문이 있다는 것을. 이 주장은 검색 하여 쉽게 확인할 수 있습니다. 또한 컴파일러의 소스 코드 를 알고리즘에 대한 충분한 게시로 계산합니다 (소스에 포함되어 있다고 가정하지만 확인하지는 않았습니다). 나의 초기 진술은 모호하고 사실이지만, 당신의 반응은 부적절 해 보입니다.
Raphael

2

기본 도구는 속성 문법 입니다. 당신은 그들과 함께 상상할 수있는 모든 사악한 일을 할 수 없을지 모르지만, 그들은 좋은 출발점이됩니다.

기본적으로 프로그램의 추상 구문 트리 하향식 및 / 또는 상향식을 살펴보고 정보를 전달할 수 있습니다. 예를 들어, 전역 범위 유형 정보 (예 : 클래스 및 해당 멤버)를 아래쪽으로 전달하고 표현식 유형을 재귀 적으로 (예 : 상향식으로) 결과 유형을 위쪽으로 전달하여 결정할 수 있습니다.

여기 슬라이드 (5 장) 에서 설명과 예를 찾으십시오 .


누군가 더 나은 참조가 있습니까? 요즘에 드래곤 북이나 빌헬름 / 마우어를 구입해야한다고 생각합니다.
Raphael

1
JastAdd 도구 는 참조 속성 문법을 기반으로하는 뛰어난 최신 컴파일러 컴파일러 시스템입니다. 우리는 많은 프로젝트에서 사용했습니다.
Dave Clarke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.