옥시진(프로그래밍 언어)
Oxygene (programming language)![]() | |
개발자 | RemObjects 소프트웨어 |
---|---|
처음 등장한 | [1] | 전(
플랫폼 | 공통 언어 인프라스트럭처, Java, Cocoa, CPU 네이티브, Windows 32/64 비트, Linux 32/64 비트, Web Assembly |
면허증. | 트라이얼웨어 |
웹 사이트 | elementscompiler |
영향을 받다 | |
델파이의 오브젝트 파스칼, C# |
옥시진(옛 크롬)은 RemObjects Software가 마이크로소프트의 공용 언어 인프라, Java 플랫폼 및 코코아용으로 개발한 프로그래밍 언어입니다.Oxygene은 델파이의 Object Pascal을 기반으로 하지만 C#, Eiffel, Java, F# 및 기타 언어의 영향을 받습니다.
지금은 비천한 델파이에 비하면.NET, Oxygene은 완전한 하위 호환성을 강조하지 않고 언어를 '혁신'하고 관리 대상 개발 플랫폼에서 훌륭한 시민이 되어 에서 제공하는 모든 기능과 기술을 활용할 수 있도록 설계되었습니다.NET 및 Java 런타임
Oxygene은 상용 제품으로 Microsoft의 Windows용 Visual Studio IDE와 MacOS용 Fire라는 자체 IDE와의 완전한 통합을 제공합니다.Oxygene은 C#, Swift, Java, Go 및 Mercury(Visual Basic 기반) 옆에 있는 기본 Elements 컴파일러 도구 체인에서 지원되는 6가지 언어 중 하나입니다.네트워크)
2008년부터 2012년까지 RemObjects Software는 컴파일러와 IDE 기술을 엠바카데로에 라이선스하여 [2]엠바카데로 프리즘 제품에 사용했습니다.2011년 가을부터 옥시진은 두 가지 에디션으로 출시되었으며, 두 번째 에디션은 Java와 Android 런타임에 대한 지원을 추가하였다.XE4 출시 이후 엠바카데로 프리즘은 더 이상 RAD Studio SKU의 일부가 아닙니다.Prism 고객이 Oxygene으로 [3]이행하기 위한 수많은 지원 및 업그레이드 경로가 존재합니다.2016년 현재, Windows 또는 MacOS에서 개발을 허용하고 Windows, Linux, Web Assembly용 실행 파일을 만들 수 있는 옥시진은 단 한 가지 에디션만 있습니다.NET, iOS, Android, Java 및 macOS.
언어
옥시젠어는 일반적으로 오브젝트 파스칼, 특히 델파이에 기원을 두고 있지만 의 지침을 반영하도록 설계되었다.NET 프로그래밍 및 완전한 CLR 호환 어셈블리를 만듭니다.따라서 Object Pascal/Delphi에서 알려진 몇 가지 사소한 언어 기능은 삭제되거나 수정되었으며, Generics 또는 Sequences and Queries와 같은 새롭고 더 현대적인 기능들이 언어에 추가되었습니다.
Oxygene은 객체 지향 언어이며,[clarification needed] 이것은 프로그램을 설계하기 위해 데이터를 보관하고 코드를 실행할 수 있는 클래스를 사용한다는 것을 의미합니다.사과가 가게에서 실제로 살 수 있는 사과의 원형인 것처럼, 클래스는 사물에 대한 "프로토타입"이다.사과에는 색이 있고 껍질을 벗길 수 있는 것으로 알려져 있습니다. 사과 클래스의 데이터와 실행 가능한 "코드"입니다.
Oxygene은 병렬 프로그래밍의 일부 기능을 언어 수준으로 지원합니다.컴퓨터의 모든 코어 또는 프로세서를 사용하여 성능을 향상시키는 것이 목표입니다.이 목표를 달성하려면 태스크를 여러 스레드에 분산해야 합니다..NET Framework의ThreadPool
클래스는 여러 스레드로 효율적으로 작업할 수 있는 방법을 제공했습니다.Task Parallel Library(TPL)가 에 도입되었습니다.병렬 프로그래밍을 위한 더 많은 기능을 제공하는 NET 4.0.
연산자는 Oxygene에서 를 사용하여 오버로드될 수 있습니다.class operator
구문:
학급 교환입니다. 암묵적인(i : 정수) : 마이클래스;
연산자 오버로드에는 연산자 오버로드 구문에 사용되는 이름이 있습니다. 예를 들어 "+"는 [4]Oxygene에서 유효한 메서드 이름이 아니기 때문입니다.
프로그램 구조
Oxygene은 Delphi처럼 "Units"를 사용하지 않고 를 사용합니다.NET 네임스페이스: 유형 및 그룹화.네임스페이스는 여러 개의 파일(및 어셈블리)에 걸쳐 있을 수 있지만, 하나의 파일에는 하나의 네임스페이스 유형만 포함할 수 있습니다.이 네임스페이스는 파일 맨 위에 정의되어 있습니다.
네임스페이스 Console Application 1;
Oxygene 파일은 인터페이스와 구현 섹션으로 구분됩니다.이것은 델파이가 알고 있는 구조입니다.interface 섹션은 네임스페이스 선언에 따릅니다.그 안에uses
이 절은 Oxygene에서 다른 네임스페이스에서 유형을 가져옵니다.
사용하다 시스템..린크;
가져온 네임스페이스는 프로젝트 자체 또는 참조 어셈블리에 있어야 합니다.C#과 달리 Oxygene 에일리어스 이름은 네임스페이스에 정의할 수 없습니다.단일 유형 이름에 대해서만 정의할 수 있습니다(아래 참조).
에 이어uses
delphi에서 알고 있는 것과 같은 형식 선언이 파일에 포함되어 있습니다.
인터페이스 유형 콘솔 앱 = 학급 일반의 학급 방법 주된; 끝.;
C#과 같이 Main 메서드는 모든 프로그램의 시작점입니다.매개 변수를 가질 수 있습니다.args : Array of String
명령행 인수를 프로그램에 전달합니다.
더 많은 유형을 선언할 수 있습니다.type
키워드를 지정합니다.
선언된 메서드의 구현은 구현 섹션에 기재되어 있습니다.
실행 학급 방법 콘솔 앱.주된; 시작한다. // 여기에 자체 코드 추가 콘솔.기입선('헬로 월드'); 끝.; 끝..
파일은 항상 다음과 같이 끝납니다.end.
종류들
.NET 언어로서 Oxygene은 를 사용합니다.NET 타입 시스템:값 유형(구조체 등)과 참조 유형(배열 또는 클래스 등)이 있습니다.
Oxygene은 자체 "사전 정의된" 유형을 도입하지는 않지만 일부 [5]유형에 대해 더 많은 "pascalish" 일반 이름을 제공합니다.System.Int32
로 사용할 수 있다Integer
그리고.Boolean
(System.Boolean
),Char
(System.Char
),Real
(System.Double
)도 pascal-typename 패밀리에 가입합니다.의 일부인 이러한 유형의 구조 문자.NET, 는 완전하게 보존됩니다.
모두 마찬가지입니다.Oxygene의 NET 언어 유형에는 가시성이 있습니다.Oxygene의 기본 가시성은 다음과 같습니다.assembly
이것은, 에 상당합니다.internal
C#의 가시성.기타 가능한 유형 가시성은 다음과 같습니다.public
.
유형 마이클래스 = 일반의 학급 끝.;
정의된 모든 유형(클래스, 인터페이스, 레코드 등)에 대해 가시성을 설정할 수 있습니다.
유형에 대한 별칭 이름을 정의할 수 있으며 로컬 또는 다른 Oxygene 어셈블리에서 사용할 수 있습니다.
유형 내부 리스트 = 일반의 목록.< >정수>; //다른 Oxygene 어셈블리에 표시됨 시크릿 = IENumerable< >스트링>; //다른 어셈블리에서는 표시되지 않음
다른 언어에서는 공용 유형 별칭을 볼 수 없습니다.
기록.
레코드란 무엇인가.NET 구조는 옥시진이라고 불립니다.클래스와 마찬가지로 선언되지만record
키워드:
유형 마이레코드 = 기록. 방법 푸우; 끝.;
그들은 그냥.NET 구조, 레코드는 필드, 메서드 및 속성을 가질 수 있지만 상속이 없으며 인터페이스를 구현할 수 없습니다.
인터페이스
인터페이스는 에서 매우 중요한 개념입니다.NET의 세계, 프레임워크 자체가 그것들을 많이 사용하고 있다.인터페이스는 인터페이스를 구현할 때 클래스가 구현해야 하는 메서드, 속성 및 이벤트 세트의 사양입니다.예를 들어, 인터페이스는IEnumerable<T>
를 지정합니다.GetEnumerator
시퀀스에 걸쳐 반복하는 데 사용되는 메서드입니다.
인터페이스는 클래스와 마찬가지로 선언됩니다.
유형 마이 인터페이스 = 일반의 인터페이스 방법 그렇게 해 주세요. : IENumerable; 소유물 막대 : 스트링 읽어주세요 쓰다; 끝.;
속성에는 getter와 setter가 명시적으로 지정되어 있지 않습니다.
대표자
위임자는 메서드의 서명을 정의하여 이러한 메서드가 파라미터(콜백 등)로 전달되거나 변수에 저장될 수 있도록 합니다.함수 포인터와 동등한 타입 세이프 NET입니다.이벤트에도 사용됩니다.위임자에게 메서드를 할당할 때는@
연산자는 메서드를 호출하지 않고 할당하는 것을 알고 있습니다.
Oxygene은 익명의 대리인을 작성할 수 있습니다.예를 들어 메서드는Invoke
위임자를 선언하지 않고 제어하는 방법:
방법 기본 양식.메인폼_로드(송신자: 시스템..물건; e: 시스템..이벤트 어그); 시작한다. 호출하다(@어떻게 좀 해봐.); 끝.;
메서드의 서명을 가진 익명 위임자DoSomething
컴파일러에 의해 작성됩니다.
Oxygene은 다형성 대리인을 지원합니다. 즉, 내림차순 유형의 매개 변수가 있는 대리인은 할당 호환성이 있습니다.두 개의 클래스를 가정합니다.MyClass
그리고.MyClassEx = class(MyClass)
, 다음 코드에서는BlubbEx
에 대응하고 있는 할당은,Blubb
.
유형 위임하다 흐느끼다(송신자 : 물건; m : 마이클래스); 위임하다 블러브엑스(송신자 : 물건; mx : MyClassEx);
필드를 사용하여 인터페이스 구현을 위임할 수 있습니다.이러한 유형의 필드가 이 인터페이스를 구현하고 있는 경우:
실장자 = 일반의 학급(IMy 인터페이스) //... 인터페이스 구현... 끝.; 마이클래스 = 일반의 학급(IMy 인터페이스) fSome Implementor : 실장자; 일반의 용구 IMy 인터페이스; //인터페이스의 실장에 주의합니다. 끝.;
이 예에서는 컴파일러가 퍼블릭메서드와 속성을 만듭니다.MyClass
의 메서드/속성을 호출합니다.fSomeImplementor
IMyInterface 멤버를 구현합니다.이것은 믹스인과 같은 [6]기능을 제공하기 위해 사용할 수 있습니다.
익명 메서드
익명 메서드는 다른 메서드에 구현됩니다.위임 필드 내에 저장되지 않는 한 메서드 외부에서 액세스할 수 없습니다.익명 메서드는 메서드가 구현된 메서드의 로컬 변수와 해당 메서드가 속한 클래스의 필드를 사용할 수 있습니다.
어나니머스 메서드는 GUI 스레드에서 실행되어야 하는 코드를 사용할 때 특히 유용합니다( 참조).NET 메서드를 전달함으로써Invoke
메서드(Control.Invoke
WinForms에서Dispatcher.Invoke
WPF에서):
방법 윈도 1.예측 가까운 미래; //인터페이스의 비동기로서 동작합니다. 시작한다. //... 여기서 결과를 계산하고 변수 "The Future"에 저장 디스패처.호출하다(디스패처 프라이어리티.어플게으른, 방법; 시작한다. FutureText Box.본문 := 미래; 끝.); 끝.;
익명 메서드에는 다음과 같은 매개 변수도 있을 수 있습니다.
방법 윈도 1.예측 가까운 미래; //인터페이스의 비동기로서 동작합니다. 시작한다. //... 여기서 결과를 계산하고 변수 "The Future"에 저장 디스패처.호출하다(디스패처 프라이어리티.어플게으른, 방법(a미래 : 스트링); 시작한다. FutureText Box.본문 := a미래 ; 끝., 미래); 끝.;
속성 통지
속성 통지는 주로 GUI가 속성 값이 변경되었을 때 데이터 바인딩에 사용됩니다..NET 프레임워크는 인터페이스를 제공합니다.INotifyPropertyChanged
그리고.INotifyPropertyChanging
(.NET 3.5의 경우).이러한 인터페이스는 속성이 변경/변경되었을 때 발생해야 하는 이벤트를 정의합니다.
Oxygene은notify
속성에서 사용할 수 있는 수식자.이 수식자를 사용하면 컴파일러는 클래스에 인터페이스를 추가하고, 이를 구현하며, 속성이 변경되었을 때 이벤트를 발생시키는 코드를 만듭니다.
소유물 푸우 : 스트링 읽어주세요 ffoo 쓰다 셋푸; 알리다; 소유물 막대 : 스트링; 알리다 흐느껴 울다; //속성 "Blub"이 "Bar"가 아닌 "Blub"가 변경되었음을 알립니다.
수식자는 setter 메서드가 있는 속성에 사용할 수 있습니다.그런 다음 이벤트를 발생시키는 코드가 컴파일 시간 동안 이 메서드에 추가됩니다.
코드 예시
안녕 세계
네임스페이스 안녕 세계; 인터페이스 유형 Hello 클래스 = 학급 일반의 학급 방법 주된; 끝.; 실행 학급 방법 Hello 클래스.주된; 시작한다. 기입하다('헬로 월드!'); 끝.; 끝..
범용 컨테이너
네임스페이스 범용 컨테이너; 인터페이스 유형 테스트 앱 = 학급 일반의 학급 방법 주된; 끝.; 사람인 = 학급 일반의 소유물 이름: 스트링; 소유물 성: 스트링; 끝.; 실행 사용하다 시스템..컬렉션.포괄적인; 학급 방법 테스트 앱.주된; 시작한다. 변화하다 myList := 신규 목록.< >사람인>; //유형 추론 myList.더하다(신규 사람인(이름 := 존, 성 := '도')); myList.더하다(신규 사람인(이름 := 제인, 성 := '도')); myList.더하다(신규 사람인(이름 := 제임스, 성 := '도')); 콘솔.기입선(myList[1].이름); //주조 불필요 콘솔.라인 읽기; 끝.; 끝..
일반적인 방법
네임스페이스 Generic Method Test(일반적인 방법 테스트); 인터페이스 유형 Generic Method Test(일반적인 방법 테스트) = 정적인 학급 일반의 학급 방법 주된; 사적인 학급 방법 바꾸다< >T>(변화하다 왼쪽, 맞다 : T); 학급 방법 도스와프< >T>(왼쪽, 맞다 : T); 끝.; 실행 학급 방법 Generic Method Test(일반적인 방법 테스트).도스와프< >T>(왼쪽, 맞다 : T); 시작한다. 변화하다 a := 왼쪽; 변화하다 b := 맞다; 콘솔.기입선('타입: {0}', 유형(T)); 콘솔.기입선('-> a = {0}, b = {1}', a , b); 바꾸다< >T>(변화하다 a, 변화하다 b); 콘솔.기입선('-> a = {0}, b = {1}', a , b); 끝.; 학급 방법 Generic Method Test(일반적인 방법 테스트).주된; 시작한다. 변화하다 a := 23;// 유형 추론 변화하다 b := 15; 도스와프< >정수>(a, b); // 이 메서드에서는 객체에 다운캐스트되지 않습니다. 변화하다 aa := '실패';// 유형 추론 변화하다 bb := 정의; 도스와프< >스트링>(aa, bb); // 이 메서드에서는 객체에 다운캐스트되지 않습니다. 도스와프(1.1, 1.2); // 일반 파라미터에 대한 type inference 콘솔.라인 읽기(); 끝.; 학급 방법 Generic Method Test(일반적인 방법 테스트).바꾸다< >T>(변화하다 왼쪽, 맞다 : T); 시작한다. 변화하다 임시직 := 왼쪽; 왼쪽:= 맞다; 맞다 := 임시직; 끝.; 끝..
프로그램 출력:
유형: 시스템.Int32 -> a = 23, b = 15 -> a = 15, b = 23 유형: 시스템.문자열 -> a = abc, b = def -> a = def, b = abc 유형: 시스템.이중 -> a = 1,1, b = 1,2 -> a = 1,2, b = 1,1
델파이와 옥시진의 차이점
unit
: namespace 키워드로 대체합니다.Oxygene은 파일별 컴파일이 아니라 프로젝트별로 컴파일되므로 파일명에 의존하지 않습니다.대신 unit 키워드 또는 namespace 키워드를 사용하여 해당 파일에 대해 모든 유형이 정의되어 있는 기본 이름 공간을 나타냅니다.procedure
그리고.function
:method
권장되는 키워드입니다만,procedure
그리고.function
여전히 작동한다.overload
: Oxygene에서는 기본적으로 모든 메서드가 오버로드되므로 특별한 키워드는 필요 없습니다..Create()
: 이 컨스트럭터 호출은 에 의해 대체되었습니다.new
키워드를 지정합니다.이것은, 에서 유효하게 할 수 있습니다.project options
유산상의 이유로string
: 문자열의 문자는 제로 베이스로 읽기 전용입니다.문자열은 0 값을 가질 수 있으므로 빈 문자열에 대한 테스트가 항상 충분한 것은 아닙니다.
비판
큰 변경 없이 Win32 Delphi 코드를 Oxygene에 이식하고자 하는 사람도[who?] 있습니다.이는 Oxygene이 Delphi처럼 보이지만 단순한 재컴파일과는 호환되지 않을 정도로 많은 변경이 있기 때문에 가능하지 않습니다.이름은 델파이의 다른 버전처럼 보이지만 완전히 [7]사실이 아닙니다.
언어의 차이뿐만 아니라 Oxygene에서는 Visual Component Library [8]프레임워크를 사용할 수 없습니다.기존의 델파이 코드는 VCL에 크게 의존하기 때문에 이 때문에 포팅은 더욱 어려워집니다.
「 」를 참조해 주세요.
레퍼런스
- ^ "Evolution of the Oxygene Language Oxygene Elements". Archived from the original on 2018-01-05. Retrieved 2018-01-04.
- ^ "Embarcadero Prism page, at the bottom of the page an image stating it is powered by RemObjects Oxygene". Archived from the original on 2011-12-27. Retrieved 2011-12-14.
- ^ "Archived copy". Archived from the original on 2013-06-20. Retrieved 2013-06-06.
{{cite web}}
: CS1 maint: 제목으로 아카이브된 복사(링크) - ^ "Archived copy". Archived from the original on 2011-07-08. Retrieved 2010-01-09.
{{cite web}}
: CS1 maint: 제목으로 아카이브된 복사(링크) - ^ "Archived copy". Archived from the original on 2011-07-08. Retrieved 2010-01-10.
{{cite web}}
: CS1 maint: 제목으로 아카이브된 복사(링크) - ^ "Archived copy". Archived from the original on 2011-07-08. Retrieved 2010-01-17.
{{cite web}}
: CS1 maint: 제목으로 아카이브된 복사(링크) - ^ "A Stack Overflow discussion where people remark that Oxygene is not Delphi Win32". Archived from the original on 2012-10-25. Retrieved 2016-07-25.
- ^ "Delphi Prism 2010 review where they state in the third paragraph that VCL.net is not available". Archived from the original on 2009-09-04. Retrieved 2009-12-14.