Oxygene («Кислород») (ранее известный как Chrome («Хром»)) — язык программирования, разработанный компанией RemObjects Software для стандарта Common Language Infrastructure. Язык Oxygene был создан на основе языка Object Pascal.

Первоначально привязанный к Delphi.NET, после приобретения прав компанией Embarcadero, Oxygene не обладает полной обратной совместимостью. Так, например, в его состав не входят библиотеки классов, совместимые с библиотекой VCL, критикуемой за недостаточно эффективную реализацию, что практически исключило перенос на платформу .NET унаследованных приложений, созданных с помощью Delphi или Kylix и использовавших библиотеку классов VCL.

Компания «RemObjects Software» предлагает полную интеграцию с Visual Studio 2003/2005/2008, а с июня 2010 года - интеграцию с MonoDevelop и Visual Studio 2010. Отдельной IDE для Oxygene на данный момент не существует.

Особенности интеграция с CLI. Основан на Object Pascal с добавлением множества новых возможностей. Поддержка механизма «контрактов для классов» («class contracts») для ограничения на данные, схожего с контрактным программированием. Определение переменных непосредственно внутри блока кода. Анонимные типы. Анонимные методы и делегаты. Асинхронные методы и работа с потоками. Лямбда-исчисление. Поддержка .NET 2.0. Обобщённые типы и методы. (только для .NET 2.0) Обнуляемые типы (Nullable types). (только для .NET 2.0) Итераторы. Частичные классы (для .NET 1.1 и 2.0) Методы-расширения (Extension methods). Поддержка LINQ. Вывод типов. Виртуальные свойства и события. Улучшенная поддержка событий с несколькими обработчиками (multicast events). Инициализаторы переменных внутри кода. Улучшенная поддержка циклов for. Использование знака двоеточия для безопасной работы с типами. Поддержка в Windows системы для построения клиентских приложений (Windows Presentation Foundation). Полная поддержка альтернативных фреймворков, созданных для Visual Studio (смотри Portable.NET и среды разработки Mono)

Примеры кода

Hello World namespace HelloWorld;

interface

type HelloClass = class public class method Main; end;

implementation

class method HelloClass.Main; begin System.Console.WriteLine('Hello World!'); end;

end.

Обобщённый контейнер 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<Person>; //вывод типов myList.Add(new Person(FirstName := 'Иван', LastName := 'Петров')); myList.Add(new Person(FirstName := 'Маша', LastName := 'Петрова')); myList.Add(new Person(FirstName := 'Сергей', LastName := 'Петров')); Console.WriteLine(myList.FirstName); //Проверка не требуется Console.ReadLine; end;

end.

Обобщённый класс namespace GenericMethodTest;

interface

type GenericMethodTest = static class public class method Main; private class method Swap<T>(var left, right : T); class method DoSwap<T>(left, right : T); end;

implementation

class method GenericMethodTest.DoSwap<T>(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<T>(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<Integer>(a, b); // никаких приведений базового типа к дочернему (downcasting) для Object в этом классе.

var aa := 'abc';// вывод типа var bb := 'def'; DoSwap<String>(aa, bb); // никаких приведений базового типа к дочернему (downcasting) для Object в этом классе.

DoSwap(1.1, 1.2); // вывод типа для обобщённых параметров Console.ReadLine(); end;

class method GenericMethodTest.Swap<T>(var left, right : T); begin var temp := left; left:= right; right := temp; end;

end.

Программа должна вывести:

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

Улучшенная обработка операторов выбора case aClassID.ToUpper of 'XYZ': result := TMyXYZClass; 'ABC': result := TMyOtherClass; else raise new Exception('Неправильный ID класса'); end;

case aClass type of TMyXYZClass: TMyXYZClass(aClass).DoSomething; TMyOtherClass: TMyOtherClass(aClass).DoSomethingElse; else raise new Exception('Неправильная ссылка на класс'); end;

См. также C# (язык программирования) Object Pascal Free Pascal PascalABC.NET Эйфель (язык программирования) Программа Hello, world! Java (язык программирования)

Дополнительные источники Oxygene Wiki Домашняя страница Oxygene Oxygene / Форум, посвященный Chrome, на сайте C-Sharp-Forum.de (на немецком языке) Компилятор Object Pascal компании RemObjects Software (Обзорная статья на сайте «Компьютер-пресс») OXYGENE 3.0 глоток кислорода для Object Pascal Visual Studio>Tools>RemObjects Oxygene

Примечания

Категория:Объектно-ориентированные языки программирования Категория:Классовые языки программирования Категория:Языки программирования платформы .NET Категория:Компиляторы языка Object Pascal Категория:Object Pascal