맨위로가기

옥시즌 (프로그래밍 언어)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

옥시즌은 델파이와 오브젝트 파스칼을 기반으로 .NET 환경에 맞춰 개발된 객체 지향 프로그래밍 언어이다. 공통 언어 기반, 람다 연산, LINQ 지원 등 다양한 기능을 제공하며, 델파이의 유닛 대신 .NET의 네임스페이스를 사용하여 코드를 구성한다. 옥시즌은 병렬 프로그래밍을 지원하며, 연산자 오버로딩, 익명 메서드, 속성 알림 등의 기능을 제공한다. 델파이와 유사한 문법을 사용하지만, 네임스페이스 사용, `method` 키워드 권장, `new` 키워드를 사용한 생성자 호출 등 몇 가지 차이점을 보인다.

더 읽어볼만한 페이지

  • 파스칼 컴파일러 - 터보 파스칼
    필립 칸이 개발하고 안데르스 헤일스베르그가 기반을 다진 터보 파스칼은 저렴한 가격, 빠른 컴파일, 사용하기 쉬운 IDE를 특징으로 1980년대 PC 프로그래밍에 혁신을 가져왔으며, 여러 기능 추가를 거쳐 델파이 등장 후 레거시 기술이 되었고 일부 버전은 프리웨어로 배포된다.
  • 파스칼 컴파일러 - GNU 컴파일러 모음
    GNU 컴파일러 모음(GCC)은 리처드 스톨먼이 1987년 처음 출시한 자유 소프트웨어 컴파일러 시스템으로, C, C++, Fortran, Ada, Go 등 다양한 프로그래밍 언어를 지원하며 여러 명령어 집합 아키텍처와 플랫폼에서 널리 사용된다.
  • 파스칼 프로그래밍 언어 계열 - 파스칼 (프로그래밍 언어)
    파스칼은 니클라우스 비르트가 구조적 프로그래밍 교육과 시스템 소프트웨어 개발을 위해 설계한 언어로, 프로그래밍 입문 언어로 널리 쓰였으며 애플의 주요 개발 언어로 사용되었고, 다양한 변형이 여러 분야에서 활용되고 있으며 현재도 여러 컴파일러가 존재한다.
  • 파스칼 프로그래밍 언어 계열 - 프리 파스칼
    프리 파스칼은 다양한 운영체제와 CPU 아키텍처를 지원하며 볼랜드 파스칼과 델파이의 파스칼 방언을 채택한 오픈 소스 파스칼 컴파일러로, 델파이 7과의 호환성 개선, macOS 인터페이스를 위한 Apple Pascal 문법 지원, 다양한 컴파일 호환 모드 제공, 런타임 및 컴포넌트 라이브러리와 라자루스를 포함한 다양한 IDE 지원을 특징으로 한다.
  • 닷넷 프로그래밍 언어 - 파워셸
    파워셸은 마이크로소프트에서 개발한 작업 자동화 솔루션으로, 명령줄 셸과 스크립트 언어의 기능을 결합하여 윈도우 시스템 관리를 위해 설계되었으며, .NET 프레임워크 기반의 객체 지향적 특징을 갖고 다양한 플랫폼에서 자동화 스크립트 작성 및 실행, 시스템 구성 관리 등에 활용된다.
  • 닷넷 프로그래밍 언어 - 코볼
    코볼은 1959년 CODASYL에 의해 개발된 공통 사무 처리용 프로그래밍 언어이며, 사무 처리 시스템의 표준 언어로 널리 사용되면서 객체 지향 기능과 새로운 기능이 추가된 표준이 발표되었다.
옥시즌 (프로그래밍 언어) - [IT 관련 정보]에 관한 문서
기본 정보
옥시즌 로고
옥시즌 로고
패러다임객체 지향
발표 연도2005년
설계자알 수 없음
개발사렘오브젝트 소프트웨어
최신 안정화 버전알 수 없음
최신 시험판 버전알 수 없음
타이핑알 수 없음
구현체알 수 없음
방언알 수 없음
영향을 받은 언어델파이의 오브젝트 파스칼, C#
영향을 준 언어알 수 없음
플랫폼공통 언어 기반, 자바, 코코아, CPU 네이티브, 윈도우 32/64비트, 리눅스 32/64비트, 웹어셈블리
라이선스트라이얼웨어
웹사이트옥시즌 공식 웹사이트

2. 특징

옥시젠은 델파이와 오브젝트 파스칼의 문법을 기반으로 하지만, .NET 환경에 맞게 여러 새로운 기능이 추가되었다.


  • 공통 언어 기반
  • 인라인 변수 선언
  • 익명 자료형, 익명 대리자
  • 비동기 메소드
  • 람다 연산
  • 반복자
  • 불완전 클래스
  • 확장 메소드
  • LINQ 지원
  • 형 추론
  • 인라인 변수 생성자
  • 완전한 비주얼스튜디오 지원


옥시젠은 객체 지향 프로그래밍 언어이다. 따라서 프로그램 설계를 위해 데이터와 코드를 실행할 수 있는 클래스를 사용한다. 클래스는 객체의 "프로토타입"과 같다.

옥시젠은 병렬 프로그래밍의 일부 기능을 언어 수준에서 지원한다. 목표는 컴퓨터의 모든 코어 또는 프로세서를 사용하여 성능을 향상시키는 것이다. .NET Framework의 ThreadPool 클래스는 여러 스레드로 효율적으로 작업할 수 있는 방법을 제공하며, 작업 병렬 라이브러리(TPL)는 .NET 4.0에 도입되어 병렬 프로그래밍을 위한 더 많은 기능을 제공한다.

옥시젠에서 연산자는 `class operator` 구문을 사용하여 오버로딩할 수 있다.

```delphi

class operator implicit(i : Integer) : MyClass;

```

연산자 오버로딩의 경우, 각 연산자에는 이름을 지정해야 하며, 이는 연산자 오버로딩 구문에서 사용되어야 한다.[4]

2. 1. 프로그램 구조

옥시즌은 델파이의 "유닛" 대신 .NET 네임스페이스를 사용하여 형식을 구성하고 그룹화한다. 파일은 인터페이스와 구현 섹션으로 나뉘는데, 이는 델파이의 구조와 유사하다.

인터페이스 섹션에는 `uses` 절이 포함되어 있어, 다른 네임스페이스의 형식을 가져올 수 있다.

```delphi

uses

System.Linq;

```

`uses` 절 다음에는 `type` 키워드를 사용하여 형식 선언을 한다.

```delphi

interface

type

ConsoleApp = class

public

class method Main;

end;

```

`implementation` 섹션에는 선언된 메서드의 구현을 작성한다.

```delphi

implementation

class method ConsoleApp.Main;

begin

// add your own code here

Console.WriteLine('Hello World.');

end;

end.

```

파일은 항상 `end.`로 끝난다.

2. 2. 형식 시스템

옥시젠은 .NET 형식 시스템을 사용하며, 값 형식(예: 구조체)과 참조 형식(예: 배열, 클래스)을 지원한다.[5]

옥시젠은 자체적인 "미리 정의된" 형식을 사용하지 않지만, `System.Int32`를 `Integer`로, `System.Boolean`을 `Boolean`으로, `System.Char`를 `Char`로, `System.Double`을 `Real`로 표현하는 등 일부 형식에 대해 더 "파스칼스러운" 일반 이름을 제공한다.[5] 이러한 형식들은 .NET의 구조체 특성을 그대로 유지한다.

옥시젠에서 형식은 가시성을 가지며, 기본 가시성은 `assembly`이다. 이는 C#의 `internal`과 같다. 다른 가능한 형식 가시성은 `public`이다. 가시성은 클래스, 인터페이스, 레코드 등 정의된 모든 형식에 대해 설정할 수 있다.

```delphi

type

MyClass = public class

end;

```

형식에 대한 별칭 이름을 정의할 수 있으며, 이는 로컬 또는 다른 옥시젠 어셈블리에서 사용할 수 있다.

```delphi

type

IntList = public List; // 다른 옥시즌 어셈블리에서 보임

SecretEnumerable = IEnumerable; // 다른 어셈블리에서는 보이지 않음

```

Public 형식 별칭은 다른 언어에서는 보이지 않는다.

2. 2. 1. 레코드 (Records)

옥시젠에서 레코드는 .NET 구조체이다. `record` 키워드를 사용하여 선언한다.

```delphi

type

MyRecord = record

method Foo;

end;

```

레코드는 .NET 구조체이므로 필드, 메서드 및 속성을 가질 수 있지만, 상속은 할 수 없으며, 인터페이스를 구현할 수 없다.

2. 3. 인터페이스 (Interfaces)

인터페이스는 .NET 환경에서 매우 중요한 개념이며, 프레임워크 자체에서 이를 광범위하게 사용한다. 인터페이스는 클래스가 인터페이스를 구현할 때 구현해야 하는 메서드, 속성 및 이벤트의 작은 집합에 대한 명세이다. 예를 들어, 인터페이스 `IEnumerable`는 시퀀스를 반복하는 데 사용되는 `GetEnumerator` 메서드를 지정한다.

인터페이스는 클래스와 마찬가지로 선언된다.[4]

속성의 경우 getter 및 setter가 명시적으로 지정되지 않음에 유의해야 한다.

2. 4. 대리자 (Delegates)

대리자는 메서드의 시그니처를 정의하여 이러한 메서드를 매개변수(예: 콜백)로 전달하거나 변수에 저장하는 등의 작업을 가능하게 한다. 이는 형식이 안전한 .NET의 함수 포인터와 같다. 또한 이벤트에도 사용된다.[4] 메서드를 대리자에 할당할 때는 `@` 연산자를 사용해야 한다. 이렇게 하면 컴파일러가 메서드를 호출하려는 것이 아니라 할당하려는 것임을 알 수 있다.

옥시즌은 익명 대리자를 생성할 수 있다. 예를 들어, 대리자를 선언하지 않고도 메서드를 컨트롤의 `Invoke` 메서드에 전달할 수 있다.

옥시즌은 다형성 대리자를 지원한다. 즉, 하위 형식의 매개변수를 가진 대리자는 할당 호환된다.

필드는 해당 유형이 이 인터페이스를 구현하는 경우 인터페이스의 구현을 위임하는 데 사용할 수 있다. 이는 믹스인과 유사한 기능을 제공하는 데 사용할 수 있다.[6]

2. 5. 익명 메서드 (Anonymous methods)

익명 메서드는 다른 메서드 내에서 구현된다. 델리게이트 필드 내에 저장되지 않는 한 메서드 외부에서 접근할 수 없다. 익명 메서드는 구현된 메서드의 지역 변수와 속한 클래스의 필드를 사용할 수 있다.

익명 메서드는 GUI 스레드에서 실행되어야 하는 코드 작업 시 특히 유용하며, 이는 .NET에서 `Invoke` 메서드에 메서드를 전달하여 수행된다(WinForms의 `Control.Invoke`, WPF의 `Dispatcher.Invoke`).

```delphi

method Window1.PredictNearFuture; //인터페이스에서 비동기로 선언됨

begin

// ... 여기서 결과를 계산하여 변수 "theFuture"에 저장

Dispatcher.Invoke(DispatcherPriority.ApplicationIdle, method; begin

theFutureTextBox.Text := theFuture;

end);

end;

```

익명 메서드는 매개변수를 가질 수도 있다.

```delphi

method Window1.PredictNearFuture; //인터페이스에서 비동기로 선언됨

begin

// ... 여기서 결과를 계산하여 변수 "theFuture"에 저장

Dispatcher.Invoke(DispatcherPriority.ApplicationIdle, method(aFuture : String); begin

theFutureTextBox.Text := aFuture ;

end, theFuture);

end;

```

두 소스 코드 모두 익명 델리게이트를 사용한다.

2. 6. 속성 알림 (Property notification)

속성 알림은 주로 데이터 바인딩에 사용되며, GUI가 속성 값의 변경 시점을 알아야 할 때 사용된다. .NET 프레임워크는 이러한 목적으로 `INotifyPropertyChanged` 및 `INotifyPropertyChanging` (.NET 3.5) 인터페이스를 제공한다. 이러한 인터페이스는 속성이 변경될 때 발생해야 하는 이벤트를 정의한다.

옥시젠은 속성에 사용할 수 있는 `notify` 수정자를 제공한다. 이 수정자를 사용하면 컴파일러가 클래스에 인터페이스를 추가하고, 구현하며, 속성이 변경될 때 이벤트를 발생시키는 코드를 생성한다.

```delphi

property Foo : String read fFoo write SetFoo; notify;

property Bar : String; notify 'Blubb'; //will notify that property "Blubb" was changed instead of "Bar"

```

수정자는 setter 메서드가 있는 속성에 사용할 수 있다. 그러면 이벤트 발생 코드가 컴파일 시 이 메서드에 추가된다.

3. 델파이와의 차이점


  • `unit`는 네임스페이스 키워드로 대체되었다. 옥시즌은 파일별로 컴파일하지 않고 프로젝트별로 컴파일하기 때문에 파일 이름에 의존하지 않는다. 대신 `unit` 또는 `namespace` 키워드를 사용하여 해당 파일에 정의된 모든 유형의 기본 네임스페이스를 나타낸다.
  • `procedure` 및 `function`는 `method`가 선호되는 키워드이지만, `procedure` 및 `function`도 여전히 작동한다.
  • `overload`: 옥시즌에서는 모든 메서드가 기본적으로 오버로드되므로 이를 위한 특별한 키워드가 필요하지 않다.
  • `.Create()`: 이 생성자 호출은 `new` 키워드로 대체되었다. 이전 버전과의 호환성을 위해 프로젝트 옵션에서 여전히 활성화할 수 있다.
  • `string`: 문자열의 문자는 0부터 시작하며 읽기 전용이다. 문자열은 nil 값을 가질 수 있으므로 빈 문자열에 대한 테스트만으로는 충분하지 않을 수 있다.

4. 비판

일부 사람들은 Win32 델파이 코드를 주요 변경 없이 옥시젠으로 포팅하기를 원한다. 그러나 옥시젠은 델파이와 유사해 보이지만, 단순 재컴파일로는 호환되지 않을 정도로 변경 사항이 많아 이는 불가능하다. 옥시젠이 델파이의 또 다른 버전처럼 보이지만, 완전히 사실이 아니다.[7]

언어 차이 외에도, 비주얼 컴포넌트 라이브러리(VCL) 프레임워크는 옥시젠에서 사용할 수 없다.[8] 기존 델파이 코드는 VCL에 크게 의존하기 때문에 이는 포팅을 더욱 어렵게 만든다.

5. 코드 예제

옥시즌(Oxygen)은 파스칼, 델파이, 오브젝트 파스칼 프로그래밍 언어의 문법과 기능을 확장하여 .NET, 자바, 오브젝티브-C 등 다양한 플랫폼에서 동작하는 코드를 작성할 수 있도록 설계된 프로그래밍 언어이다.

다음은 옥시즌 코드 예제이다.

### Hello World ###

```delphi

namespace 헬로월드;

interface

type

헬로클래스 = class

public

class method 메인;

end;

implementation

class method 헬로클래스.메인;

begin

writeLn('헬로 월드!');

end;

end.

```

### 제네릭 컨테이너 (Generic container) ###

```delphi

namespace GenericContainer;

interface

type

TestApp = class

public

class method Main;

end;

Person = class

public

property FirstName: String;

property LastName: String;

end;

implementation

uses

System.Collections.Generic;

class method TestApp.Main;

begin

var myList := new List; // 형식 유추

myList.Add(new Person(FirstName := 'John', LastName := 'Doe'));

myList.Add(new Person(FirstName := 'Jane', LastName := 'Doe'));

myList.Add(new Person(FirstName := 'James', LastName := 'Doe'));

Console.WriteLine(myList[1].FirstName); // 형변환 불필요

Console.ReadLine;

end;

end.

```

### 제네릭 메서드 (Generic method) ###

```delphi

namespace GenericMethodTest;

interface

type

GenericMethodTest = static class

public

class method Main;

private

class method Swap(var left, right : T);

class method DoSwap(left, right : T);

end;

implementation

class method GenericMethodTest.DoSwap(left, right : T);

begin

var a := left;

var b := right;

Console.WriteLine('Type: {0}', typeof(T));

Console.WriteLine('-> a = {0}, b = {1}', a , b);

Swap(var a, var b);

Console.WriteLine('-> a = {0}, b = {1}', a , b);

end;

class method GenericMethodTest.Main;

begin

var a := 23; // 타입 추론

var b := 15;

DoSwap(a, b); // 이 메서드에서는 Object로 다운캐스팅이 발생하지 않음.

var aa := 'abc'; // 타입 추론

var bb := 'def';

DoSwap(aa, bb); // 이 메서드에서는 Object로 다운캐스팅이 발생하지 않음.

DoSwap(1.1, 1.2); // 제네릭 매개변수에 대한 타입 추론

Console.ReadLine();

end;

class method GenericMethodTest.Swap(var left, right : T);

begin

var temp := left;

left:= right;

right := temp;

end;

end.

```

프로그램 출력:

```text

Type: System.Int32


  • > a = 23, b = 15
  • > a = 15, b = 23

Type: System.String

  • > a = abc, b = def
  • > a = def, b = abc

Type: System.Double

  • > a = 1,1, b = 1,2
  • > a = 1,2, b = 1,1

5. 1. Hello World

delphi

namespace 헬로월드;

interface

type

헬로클래스 = class

public

class method 메인;

end;

implementation

class method 헬로클래스.메인;

begin

writeLn('헬로 월드!');

end;

end.

5. 2. 제네릭 컨테이너 (Generic container)

delphi

namespace GenericContainer;

interface

type

TestApp = class

public

class method Main;

end;

Person = class

public

property FirstName: String;

property LastName: String;

end;

implementation

uses

System.Collections.Generic;

class method TestApp.Main;

begin

var myList := new List; // 형식 유추

myList.Add(new Person(FirstName := 'John', LastName := 'Doe'));

myList.Add(new Person(FirstName := 'Jane', LastName := 'Doe'));

myList.Add(new Person(FirstName := 'James', LastName := 'Doe'));

Console.WriteLine(myList[1].FirstName); // 형변환 불필요

Console.ReadLine;

end;

end.

```

이 코드는 옥시즌 프로그래밍 언어에서 제네릭 컨테이너를 사용하는 예시이다. `Person` 클래스는 `FirstName`과 `LastName` 속성(property)을 가진다. `TestApp` 클래스의 `Main` 메서드에서는 `Person` 객체들을 담을 수 있는 `List` 타입의 `myList` 변수를 선언하고, 세 개의 `Person` 객체를 생성하여 `myList`에 추가한다. 이때 변수 선언 시점에 `List`으로 타입을 명시했기 때문에, 컴파일러는 `myList`가 `Person` 객체만을 담을 수 있다는 것을 알 수 있다. (형식 유추). `Console.WriteLine(myList[1].FirstName)` 부분에서는 `myList`의 두 번째 요소(`myList[1]`)의 `FirstName`을 출력하는데, `myList`가 `Person` 객체만을 담고 있다는 것을 컴파일러가 이미 알고 있으므로 별도의 형변환이 필요 없다.

5. 3. 제네릭 메서드 (Generic method)

delphi

namespace GenericMethodTest;

interface

type

GenericMethodTest = static class

public

class method Main;

private

class method Swap(var left, right : T);

class method DoSwap(left, right : T);

end;

implementation

class method GenericMethodTest.DoSwap(left, right : T);

begin

var a := left;

var b := right;

Console.WriteLine('Type: {0}', typeof(T));

Console.WriteLine('-> a = {0}, b = {1}', a , b);

Swap(var a, var b);

Console.WriteLine('-> a = {0}, b = {1}', a , b);

end;

class method GenericMethodTest.Main;

begin

var a := 23; // 타입 추론

var b := 15;

DoSwap(a, b); // 이 메서드에서는 Object로 다운캐스팅이 발생하지 않음.

var aa := 'abc'; // 타입 추론

var bb := 'def';

DoSwap(aa, bb); // 이 메서드에서는 Object로 다운캐스팅이 발생하지 않음.

DoSwap(1.1, 1.2); // 제네릭 매개변수에 대한 타입 추론

Console.ReadLine();

end;

class method GenericMethodTest.Swap(var left, right : T);

begin

var temp := left;

left:= right;

right := temp;

end;

end.

```

프로그램 출력:

```text

Type: System.Int32

  • > a = 23, b = 15
  • > a = 15, b = 23

Type: System.String

  • > a = abc, b = def
  • > a = def, b = abc

Type: System.Double

  • > a = 1,1, b = 1,2
  • > a = 1,2, b = 1,1

참조

[1] 웹사이트 Evolution of the Oxygene Language | Oxygene | Elements https://www.elements[...] 2018-01-04
[2] 웹사이트 Embarcadero Prism page, at the bottom of the page an image stating it is powered by RemObjects Oxygene https://www.embarcad[...] 2011-12-14
[3] 웹사이트 Prism XE4, Where Art Thou? | RemObjects Blogs https://web.archive.[...] 2013-06-06
[4] 웹사이트 Operator Overloading - Delphi Prism https://web.archive.[...] 2010-01-09
[5] 웹사이트 Built-In Types - Delphi Prism https://web.archive.[...] 2010-01-10
[6] 웹사이트 Provide Mixin-like functionality - Delphi Prism https://web.archive.[...] 2010-01-17
[7] 웹사이트 A Stack Overflow discussion where people remark that Oxygene is not Delphi Win32 https://web.archive.[...] 2016-07-25
[8] 웹사이트 Delphi Prism 2010 review where they state in the third paragraph that VCL.net is not available https://www.infoq.co[...] 2009-12-14
[9] 웹사이트 http://www.elementsc[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com