흐름에 민감한 타이핑
Flow-sensitive typing유형 시스템 |
---|
일반개념 |
주요 카테고리 |
부분류 |
프로그래밍 언어 이론에서 흐름 민감 타이핑(흐름 타이핑 또는 발생 타이핑이라고도 함)은 표현식의 유형이 제어 흐름의 위치에 따라 달라지는 유형 시스템이다.
정적으로 입력된 언어에서 표현식의 유형은 표현식을 구성하는 하위 표현식의 유형에 따라 결정된다.그러나 흐름에 민감한 타이핑에서 표현식의 유형은 표현식의 유형을 검증하는 연산을 따르는 경우 보다 구체적인 유형으로 업데이트될 수 있다.작업 검증에는 유형 술어, 필수 업데이트 및 제어 흐름이 포함될 수 있다.
예
실론
개념을 설명하는 실론에서 다음 예를 참조하십시오.
// Object?는 변수 "name"이 Object 또는 null 유형임을 의미한다. 공허하게 하다 안녕(오브젝트? 이름을 붙이다) { 만일 (이다 끈 이름을 붙이다) { // "이름"에 이 블록에 따라 "이름" 인쇄하다("안녕, ``이름!"); // 변수에 대해 String 메서드를 호출할 수 있음 인쇄하다("끈.사이즈는 ``name.size"이다.); } 다른 만일 (존재한다 이름을 붙이다) { // 이제 이 블록에 "이름"에 "이름" 인쇄하다("여보세요, 물건 "이름!"); } 다른 { 인쇄하다("안녕, 세상!"); } } 안녕(무효의); 안녕(1); 안녕("존 도");
다음 중 어느 것을 출력할 것인가?
안녕, 세상아!안녕, 물체 1! 안녕, 존 도!String.size는 8이다.
코틀린
코틀린에서 다음 예를 참조하십시오.
재미있다 안녕(오비지: 아무거나) { // 'obj'가 문자열이 아닌 경우 형식 캐스팅이 실패함 오비지 로서 끈 // 타입 캐스팅이 실패하지 않았으므로, 'obj'는 스트링임에 틀림없다! 발랄하게 하다 l = 오비지.길이 인쇄하다("'$오비지'는 길이의 끈이다.$l") } 안녕("무오오오.")
혜택들
이 기법은 유형 추론과 결합되어 모든 변수에 대한 유형 주석 작성의 필요성을 줄이거나 오리 타자를 사용하는 동적 언어와 같이 유형 주조를 수행한다.그것은 장황한 내용을 줄이고, 읽기 쉽고 수정하기 쉬운 테서 코드를 보충한다.
그것은 또한 언어 구현자들이 정적 예측을 통해 동적 언어를 더 빨리 실행하는 구현을 제공할 수 있도록 도울 수 있다.[1]
마지막으로, 그것은 유형 안전을 증가시키고, 무효 참조 발명가인 C.A.R. Hoare가 "억 달러의 실수"[2]라고 표기한, 무효 포인터로[how?] 인한 문제를 예방할 수 있다.
구현
체계의 유형 시스템인 Typeed Scheme은 이 기능을 가진 첫 번째 유형 시스템이었다.[3]그 후계자인 타이핑 라켓(라켓의 방언)은 여전히 발생 타이핑을 광범위하게 활용하고 있다.[4]Type Scheme 직후, David J. Pearce는 독립적으로 Sidy에서 플로우 타이핑을 다시 발명했다.[5][6]
타이핑된 자바스크립트는 "스크립팅" 언어에서 흐름 형식은 조건부 술어 이상에 의존하며 상태와 제어 흐름에도 의존한다고 관찰했다.[7]이 스타일은 이후 실론,[8] 타이프스크립트[9], 페이스북 플로우와 같은 언어로 채택되었다.[10]
또한 유니언 타입은 없지만 무효 타입은 있는 몇몇 언어가 있는데, C#,[11] 코틀린, [12][13]랍스터와 같이 무효 타입에만 적용되는 이 기능의 제한된 형태를 가지고 있다.[14]
대안
패턴 매칭은 흐름에 민감한 타이핑과 같은 목표에 도달한다. 즉, 장황한 내용을 줄이고 테더 코드를 보충하며 읽기 쉽고 수정하기 쉽다.이것은 다른 방식으로, 구조물의 유형을 일치시킬 수 있고, 새로운 변수를 선언함으로써 동시에 그 구조로부터 데이터를 추출할 수 있다.이와 같이 유형 주조 및 가치 추출에 관한 의식을 감소시킨다.패턴 매칭은 모든 사례를 열거하고 컴파일러에 의해 정적으로 확인할 수 있기 때문에 대수 데이터 유형과 함께 사용할 때 가장 잘 작동한다.
향후 Java 버전에 대해서는 다음 모의실험 예제를 참조하십시오.[15]
인트로 평가하다(노드 n) { 돌아오다 바꾸다(n) { // 캐스트 "Node"를 "IntNode"에 입력하고 "Int" 유형의 변수 "i"를 생성해 보십시오. // 효과가 있으면 "i" 값을 반환하십시오. 케이스 인트노드(인트로 i) -> i; // 캐스트 "Node"를 "NegNode"에 입력하고 "Node" 유형의 변수 "n"을 생성해 보십시오. // "n" 노드의 평가 부정을 반환하십시오. 케이스 NegNode(노드 n) -> -평가하다(n); // 캐스트 "노드"를 "AddNode"에 입력하고 "Node" 유형의 "왼쪽"과 "오른쪽" 변수를 생성해 보십시오. // "좌측" 및 "우측" 노드 평가의 추가 사항을 반환하십시오. 케이스 AddNode(노드 남겨진, 노드 맞다) -> 평가하다(남겨진) + 평가하다(맞다); // 캐스트 "노드"를 "MulNode"에 입력하고 "Node" 유형의 "왼쪽"과 "오른쪽" 변수를 생성해 보십시오. // "좌측" 및 "우측" 노드 평가의 곱셈을 반환하십시오. 케이스 멀노드(노드 남겨진, 노드 맞다) -> 평가하다(남겨진) * 평가하다(맞다); // 컴파일러는 가능한 모든 사례가 열거된 것을 알기 때문에 "기본값"이 없음 }; }
정적으로 입력된 언어에서, 흐름 민감 타이핑보다 패턴 매칭의 이점은 변수의 유형이 항상 동일하게 유지된다는 것이다. 즉, 변수의 유형은 제어 흐름에 따라 변하지 않는다.일치시킬 패턴을 적을 때, 새로운 유형을 갖는 새로운 변수가 선언된다.
참조
- ^ Lukas Eder (11 December 2014). "The Inconvenient Truth About Dynamic vs. Static Typing". blog.jooq.org. Retrieved 11 March 2016.
- ^ Tony Hoare (2009-08-25). "Null References: The Billion Dollar Mistake". InfoQ.com.
I call it my billion-dollar mistake. It was the invention of the null reference in 1965. At that time, I was designing the first comprehensive type system for references in an object oriented language (ALGOL W). My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.
- ^ "The Design and Implementation of Typed Scheme Lambda the Ultimate, 2008". lambda-the-ultimate.org.
- ^ "5 Occurrence Typing". docs.racket-lang.org.
- ^ David J. Pearce (22 September 2010). "On Flow-Sensitive Types in Whiley". whiley.org. Retrieved 11 March 2016.
- ^ David J. Pearce (8 April 2012). "Whiley - Flow Typing". whiley.org. Retrieved 11 March 2016.
- ^ "Typing Local Control and State Using Flow Analysis". Retrieved 14 November 2016.
- ^ "Ceylon - Quick introduction - Typesafe null and flow-sensitive typing". ceylon-lang.org. Retrieved 11 March 2016.
- ^ Ryan Cavanaugh (18 November 2014). "TypeScript 1.4 sneak peek: union types, type guards, and more". blogs.msdn.microsoft.com. Retrieved 11 March 2016.
- ^ Avik Chaudhuri, Basil Hosmer, Gabriel Levi (18 November 2014). "Flow, a new static type checker for JavaScript". code.facebook.com. Retrieved 11 March 2016.
{{cite web}}
: CS1 maint: 작성자 매개변수 사용(링크) - ^ "Design with nullable reference types". docs.microsoft.com.
- ^ "Null Safety". kotlinlang.org. Retrieved 11 March 2016.
- ^ "Type Checks and Casts". kotlinlang.org. Retrieved 11 March 2016.
- ^ "The Lobster Type System". aardappel.github.io.
- ^ Gavin Bierman and Brian Goetz (September 2018). "Pattern Matching for Java". openjdk.java.net. Retrieved 1 October 2021.