Interested Article - Oxygene (язык программирования)
- 2020-07-29
- 1
Oxygene («Кислород») (ранее известный как Chrome («Хром») ) — язык программирования, разработанный компанией для стандарта Common Language Infrastructure . Язык Oxygene был создан на основе языка Object Pascal .
Первоначально привязанный к , после приобретения прав компанией 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[1].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
- Эйфель (язык программирования)
- Программа Hello, world!
- Java (язык программирования)
Дополнительные источники
- от 19 декабря 2021 на Wayback Machine (на немецком языке)
- (Обзорная статья на сайте «Компьютер-пресс»)
Примечания
- 2020-07-29
- 1