StaDyn(프로그래밍 언어)
StaDyn (programming language)![]() | |
패러다임 | 객체 지향 |
---|---|
설계자 | 프란시스코 오틴[1] |
개발자 | 오비에도 대학 컴퓨터 반사 연구[2] 그룹 |
처음 등장한 | 전( |
안정된 릴리스 | 2.2.1 / 2022년 5월 ; 전( |
타이핑 분야 | 하이브리드 정적 및 동적 타이핑, 점진적 타이핑, 강력, 추론 |
구현 언어 | C# |
플랫폼 | 공통 언어 인프라스트럭처(.NET 프레임워크) |
면허증. | MIT 라이선스[3] |
웹 사이트 | reflection |
주요 구현 | |
C# | |
영향을 받다 | |
C#, OCaml, StrongTalk, Boo |
StaDyn은 의 객체 지향 범용 프로그래밍 언어입니다.동일한 프로그래밍 언어로 정적 및 동적 입력을 모두 지원하는 NET 플랫폼.
StaDyn 컴파일러는 동적으로 입력된 코드에 대한 유형 정보를 수집합니다.이 유형 정보는 컴파일 시 유형 오류를 감지하고 중요한 최적화를 수행하는 데 사용됩니다.이를 위해 유형 재구성(추론), 흐름에 민감한 유형, 결합 및 교차 유형, 제약 조건 기반 유형, 별칭 분석 및 방법 전문화를 제공합니다.C# 3.0의 수정판으로 2007년에 첫 시제품이 등장했습니다.다음을 포함하여 유형 추론이 지원되었습니다.var
C#과는 달리 새로운 타입으로서var
초기화된 로컬 변수를 정의합니다.흐름의 영향을 받기 쉬운 타입의var
참조는 컴파일러에 의해 추론되어 타입 세이프 [4]덕타이핑을 제공합니다.프로그래머에 의해 보다 관대한 접근이 요구되면dynamic
대신 타입을 사용할 수 있습니다.var
유형 추론이 여전히 수행되고 있지만,dynamic
참조는 동적 언어의 참조에 가깝게 동작합니다.
StaDyn은 Oviedo 대학의 Francisco[1] Ortin에 의해 디자인되었습니다.이 언어는 Francisco Ortin 외에도 Miguel Garcia, Jose Baltasar Garcia Perez-Scofield 및 Jose Quiroga를 포함한 Computational Reflection 연구 [2]그룹의 다른 구성원에 의해 구현되었습니다.
StaDyn이라는 이름은 스태틱과 다이내믹의 합성어로, 스태틱과 다이내믹 타이핑의 장점을 모두 제공하는 것을 목적으로 하고 있습니다.
코드 샘플
유형이 다른 변수
동적 언어와 마찬가지로 변수는 동일한 범위에서 서로 다른 유형을 포함할 수 있습니다.
사용. 시스템.; 학급 프로그램. { 일반의 정적인 무효 주된() { 콘솔.기입하다("번호: "); 변화하다 나이 = 콘솔.인.라인 읽기(); 콘솔.기입선("자릿수: " + 나이.길이); 나이 = 변환.ToInt32(나이); 나이++; 콘솔.기입선("생일 축하해, 넌" + 나이 + "이제 몇 살이야"); 인트 길이 = 나이.길이; // * 컴파일러 오류 } }
그age
변수는 처음에 문자열로 추론되기 때문에 그 값을 취득하는 것이 안전합니다.Length
소유물.그러면 정수가 들어가니까age++
는 유효한 표현입니다.컴파일러는 마지막 줄에서 오류를 검출합니다.Length
에 의해 제공되지 않게 되었습니다.age
.
생성된 코드는 1개를 사용하지 않습니다.Object
age를 나타내는 변수입니다만, string과 int 타입의 2개의 다른 변수입니다.이것은 SSA [5]폼을 계산하기 위한 알고리즘의 변경에 의해 실현됩니다.런타임 유형 변환이 필요하지 않으므로 생성된 코드가 더 효율적입니다.
흐름의 영향을 받기
var
그리고.dynamic
변수에는 흐름의 영향을 받기 쉬운 유형을 포함할 수 있습니다.
사용. 시스템.; 학급 프로그램. { 일반의 정적인 무효 주된(스트링[] args) { 변화하다 예외.; 한다면 (args.길이 > 0) 예외. = 신규 어플예외.("응용 프로그램 예외"); 또 다른 예외. = 신규 시스템 예외("시스템 예외"); 콘솔.기입선(예외..메세지); } }
안전합니다.Message
로부터의 재산.exception
둘 다ApplicationException
그리고.SystemException
그 재산을 제공하라.그렇지 않으면 컴파일러 오류가 표시됩니다.이와 같이 StaDyn은 타입 세이프 스태틱 덕 타이핑 시스템을 제공합니다.
다음 프로그램에서:
사용. 시스템.; 학급 프로그램. { 일반의 정적인 무효 주된(스트링[] args) { 변화하다 예외.; 전환하다 (args.길이) { 사례. 0: 예외. = 신규 어플예외.("응용 프로그램 예외"); 브레이크.; 사례. 1: 예외. = 신규 시스템 예외("시스템 예외"); 브레이크.; 체납: 예외. = "이것은 예외가 아닙니다."; 브레이크.; } 콘솔.기입선(예외..메세지); // * var에서는 컴파일러 오류가 발생하지만 다이내믹에서는 발생하지 않습니다. 콘솔.기입선(예외..알 수 없는); // * 컴파일러 오류 } }
그Message
에서 속성을 제공하지 않습니다.String
컴파일러 에러가 표시됩니다.exception.Message
하지만, 만약 우리가 선언한다면exception
~하듯이dynamic
이전 프로그램은 컴파일러에 의해 받아들여집니다. dynamic
보다 관대하다var
다이나믹한 언어의 풍미를 따르고 있습니다.단, 스태틱타입 체크는 계속 실행됩니다.이것은 코드의 마지막 줄에 나타나 있습니다.여기서 컴파일러는 에러를 표시합니다.exception.Unknown
라 할지라도exception
로서 선언되다dynamic
이는 3가지 유형 중 어느 것도 가능하지 않기 때문입니다.ApplicationException
,SystemException
그리고.String
)는Unknown
메시지를 [6]표시합니다.
비록 ~일지라도dynamic
그리고.var
타입을 명시적으로 사용하여 안전하고 관대한 타입 체크를 얻을 수 있습니다.싱글의 역동성var
참조는 명령줄 옵션, XML 구성 파일 및 Visual [7]Studio용 플러그인을 사용하여 수정할 수도 있습니다.
필드 유형 추론
var
그리고.dynamic
유형은 객체 필드로 사용할 수 있습니다.
학급 래퍼 { 사적인 변화하다 기여하다; 일반의 래퍼(변화하다 기여하다) { 이것..기여하다 = 기여하다; } 일반의 변화하다 얻다() { 돌아가다 기여하다; } 일반의 무효 세트(변화하다 기여하다) { 이것..기여하다 = 기여하다; } } 학급 시험 { 일반의 정적인 무효 주된() { 스트링 a스트링; 인트 aInt; 래퍼 포장지 = 신규 래퍼("안녕하세요"); a스트링 = 포장지.얻다(); aInt = 포장지.얻다(); // * 컴파일러 오류 포장지.세트(3); a스트링 = 포장지.얻다(); // * 컴파일러 오류 aInt = 포장지.얻다(); } }
그Wrapper
class는 모든 유형을 래핑할 수 있습니다.전화할 때마다set
방법, 유형attribute
는 인수 유형으로 추론됩니다.각 개체는 잠재적으로 다른 유형의attribute
그 때문에, 그 타입은 클래스 전체가 아닌, 모든 인스턴스용으로 보존됩니다.이와 같이 위의 코드에 나타난2 행은 컴파일 오류를 보고합니다.이 [8]동작을 지원하기 위해 타입 기반의 에일리어스 분석 알고리즘이 실장되어 있습니다.
제약 조건 기반 유형
다음 방법을 분석합니다.
일반의 정적인 변화하다 위쪽의(변화하다 파라미터) { 돌아가다 파라미터.토우퍼(); }
의 종류parameter
함수 반환 값은 컴파일러에 의해 추론됩니다.이 목적을 위해 제약이 추가되어upper
method: 인수는 다음 명령어를 지정해야 합니다.ToUpper
매개 변수가 없는 메서드.호출할 때마다 제약 조건이 확인됩니다.또한 반환 유형:upper
해당하는 반환 유형으로 추론됩니다.ToUpper
인수에 [9]의해 구현되는 메서드.
프로그래머는 다음 중 하나를 사용할 수 있습니다.var
또는dynamic
선언하다parameter
메서드 호출 시 타입 체크 실행 방법을 변경합니다.의론이 다음에게 전달되었다고 가정해 봅시다.upper
흐름의 영향을 받기 쉬운 타입(예:ApplicationException
,SystemException
또는String
exception
변수)를 지정합니다.와 함께var
가능한 모든 유형의 인수는 다음과 같이 지정해야 합니다.ToUpper
;와dynamic
, 적어도 1개의 타입은 다음을 제공해야 합니다.ToUpper
.
런타임 퍼포먼스
StaDyn에 의해 수집된 유형 정보는 생성된 코드에서 중요한 최적화를 수행하기 위해 사용됩니다. 유형 검사 및 유형 캐스트의 수가 감소하고, 반사가 방지되며, 빈번한 유형이 캐시되고, 제약이 있는 메서드가 전문화됩니다.모든 최적화의 요점은 런타임에 실행되는 유형 검사 작업의 수를 줄이는 것입니다. 이는 대부분의 동적 언어의 주요 성능 저하입니다.이러한 타입 체크의 대부분은 StaDyn 컴파일러에 의해 조기에 실행됩니다.StaDyn의 런타임 성능에 대한 자세한 평가는 [4]에 자세히 설명되어 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ a b "Francisco Ortin". uniovi.es. Retrieved May 17, 2022.
- ^ a b "Computational Reflection Research Group". uniovi.es. Retrieved May 17, 2022.
- ^ "StaDyn Download". uniovi.es. Retrieved May 17, 2022.
- ^ a b Francisco Ortin; Miguel Garcia; Sean McSweeney. "Rule-based program specialization to optimize gradually typed code". doi.org. Retrieved May 17, 2022.
- ^ Jose Quiroga; Francisco Ortin. "SSA Transformations to Facilitate Type Inference in Dynamically Typed Code". doi.org. Retrieved May 17, 2022.
- ^ Francisco Ortin; Miguel Garcia. "Union and intersection types to support both dynamic and static typing". doi.org. Retrieved May 19, 2022.
- ^ Francisco Ortin; Francisco Morero; Anton Morant. "Static type information to improve the IDE features of hybrid dynamically and statically typed languages". doi.org. Retrieved May 19, 2022.
- ^ Francisco Ortin; Daniel Zapico; J.B.G. Perez-Schofield; Miguel Garcia. "Including both static and dynamic typing in the same programming language". doi.org. Retrieved May 20, 2022.
- ^ Francisco Ortin. "Type Inference to Optimize a Hybrid Statically and Dynamically Typed Language". doi.org. Retrieved May 20, 2022.
- ^ Miguel Garcia; Francisco Ortin; Jose Quiroga. "Design and implementation of an efficient hybrid dynamic and static typing language". doi.org. Retrieved May 20, 2022.