Oxygene (язык программирования)

редактировать
Кислород
Chrome-128.png
Разработчик Программное обеспечение RemObjects
Впервые появился 2005 ; 16 лет назад ( 2005)
Платформа Common Language Infrastructure, Java, Cocoa, CPU-Native, Windows 32/64 бит, Linux 32/64 бит, WebAssembly
Лицензия Пробная версия
Интернет сайт elementscompiler.com / elements / oxygene /
Под влиянием
Delphi «ы Object Pascal, C #

Oxygene (ранее известный как Chrome) - это язык программирования, разработанный RemObjects Software для Microsoft Common Language Infrastructure, Java Platform и Cocoa. Oxygene основан на Delphi «s Object Pascal, но также имеет влияние от C #, Eiffel, Java, F # и других языках.

По сравнению с устаревшим Delphi.NET, Oxygene не делает упор на полную обратную совместимость, но призван быть «переизобретением» языка, быть хорошим гражданином на платформах управляемой разработки и использовать все функции и технологии, предоставляемые Среды выполнения .NET и Java.

Oxygene является коммерческим продуктом, и предлагает полную интеграцию в Microsoft «s Visual Studio IDE на Windows, а также его собственный IDE называется Огонь для использования на MacOS. Компилятор командной строки доступен бесплатно. Oxygene - один из шести языков, поддерживаемых базовым набором инструментов Elements Compiler, рядом с C #, Swift, Java, Go и Mercury (на основе Visual Basic.NET ).

С 2008 по 2012 год RemObjects Software предоставила Embarcadero лицензию на компилятор и технологию IDE для использования в их продукте Embarcadero Prism. Начиная с осени 2011 года Oxygene стал доступен в двух отдельных выпусках, причем во втором выпуске была добавлена ​​поддержка сред выполнения Java и Android. Начиная с выпуска XE4, Embarcadero Prism больше не входит в состав RAD Studio. Для клиентов Prism существует множество вариантов поддержки и обновления для перехода на Oxygene. По состоянию на 2016 год существует только одна редакция Oxygene, которая позволяет разрабатывать в Windows или macOS и может создавать исполняемые файлы для Windows, Linux, WebAssembly.NET, iOS, Android, Java и macOS.

СОДЕРЖАНИЕ
  • 1 Язык
    • 1.1 Структура программы
    • 1.2 Типы
      • 1.2.1 Записи
    • 1.3 Интерфейсы
    • 1.4 Делегаты
    • 1.5 Анонимные методы
    • 1.6 Уведомление о собственности
  • 2 Примеры кода
    • 2.1 Привет, мир
    • 2.2 Универсальный контейнер
    • 2.3 Общий метод
  • 3 Различия между Delphi и Oxygene
  • 4 Критика
  • 5 См. Также
  • 6 Ссылки
  • 7 Внешние ссылки
Язык

Язык Oxygene берет свое начало в Object Pascal в целом и в Delphi в частности, но был разработан для отражения руководящих принципов программирования.NET и для создания полностью совместимых с CLR сборок. Поэтому некоторые второстепенные языковые функции, известные из Object Pascal / Delphi, были исключены или пересмотрены, в то время как в язык было добавлено множество новых и более современных функций, таких как Generics или Sequences and Queries.

Oxygene - объектно-ориентированный язык, что означает, что он использует классы, которые могут хранить данные и выполнять код для разработки программ. Классы - это «прототипы» объектов, как идея яблока - это прототип яблока, которое можно купить в магазине. Известно, что яблоко имеет цвет и его можно чистить: это данные и исполняемый «код» для класса яблока.

Oxygene обеспечивает поддержку на уровне языка некоторых функций параллельного программирования. Цель состоит в том, чтобы использовать все ядра или процессоры компьютера для повышения производительности. Для достижения этой цели задачи должны быть распределены между несколькими потоками. .NET Framework «s ThreadPoolкласс предложил способ эффективно работать с несколькими потоками. Task Parallel Library (TPL) был введен в.NET 4.0, чтобы предоставить больше возможностей для параллельного программирования.

Операторы могут быть перегружены в Oxygene, используя class operatorсинтаксис:

class operator implicit(i: Integer): MyClass;

Обратите внимание, что для перегрузки оператора у каждого оператора есть имя, которое должно использоваться в синтаксисе перегрузки оператора, потому что, например, «+» не будет допустимым именем метода в Oxygene.

Структура программы

Oxygene не использует «Единицы», как Delphi, но использует пространства имен.NET для организации и группировки типов. Пространство имен может охватывать несколько файлов (и сборок), но один файл может содержать типы только одного пространства имен. Это пространство имен определяется в самом верху файла:

namespace ConsoleApplication1;

Файлы Oxygene разделены на интерфейс и раздел реализации, структура которых известна из Delphi. Раздел интерфейса следует за объявлением пространства имен. Он содержит usesпредложение, которое в Oxygene импортирует типы из других пространств имен:

uses System.Linq;

Импортированные пространства имен должны находиться в самом проекте или в ссылочных сборках. В отличие от C #, в Oxygene псевдонимы нельзя определять для пространств имен, только для имен одного типа (см. Ниже).

После usesпредложения файл содержит объявления типов, как они известны из Delphi:

interface type ConsoleApp = class public class method Main; end;

Как и в C #, метод Main является точкой входа для каждой программы. Он может иметь параметр args : Array of Stringдля передачи аргументов командной строки программе.

Можно объявить больше типов без повторения typeключевого слова.

Реализация заявленных методов размещена в разделе реализации:

implementation class method ConsoleApp.Main; begin // add your own code here Console.WriteLine('Hello World.'); end; end.

Файлы всегда заканчиваются на end.

Типы

Как язык.NET, Oxygene использует систему типов.NET: существуют типы значений (например, структуры) и ссылочные типы (например, массивы или классы).

Хотя Oxygene не вводит собственные «предопределенные» типы, для некоторых из них предлагаются более «паскальные» общие имена, так что, например, их System.Int32можно использовать как Integerи Boolean( System.Boolean), Char( System.Char), Real( System.Double) присоединиться к семейству паскаль- typenames тоже. Структурный характер этих типов, являющийся частью.NET, полностью сохраняется.

Как и во всех языках.NET, типы в Oxygene имеют видимость. В Oxygene видимость по умолчанию равна assembly, что эквивалентно internalвидимости в C #. Другой возможный тип видимости - public.

type MyClass = public class end;

Видимость может быть установлена ​​для каждого определенного типа (классы, интерфейсы, записи,...).

Для типов можно определить псевдоним, который можно использовать локально или в других сборках Oxygene.

type IntList = public Listlt;Integergt;; //visible in other Oxygene-assemblies SecretEnumerable = IEnumerablelt;Stringgt;; //not visible in other assemblies

Псевдонимы открытого типа не будут отображаться для других языков.

Записи

Записи - это то, что структуры.NET называются в Oxygene. Они объявлены так же, как классы, но с recordключевым словом:

type MyRecord = record method Foo; end;

Поскольку это всего лишь структуры.NET, записи могут иметь поля, методы и свойства, но не имеют наследования и не могут реализовывать интерфейсы.

Интерфейсы

Интерфейсы - очень важное понятие в мире.NET, их активно использует сам фреймворк. Интерфейсы - это спецификация небольшого набора методов, свойств и событий, которые класс должен реализовать при реализации интерфейса. Например, интерфейс IEnumerablelt;Tgt;определяет GetEnumeratorметод, который используется для перебора последовательностей.

Интерфейсы объявлены так же, как классы:

type MyInterface = public interface method MakeItSo: IEnumerable; property Bar: String read write; end;

Обратите внимание, что для свойств геттер и сеттер явно не указаны.

Делегаты

Делегаты определяют сигнатуры для методов, так что эти методы могут быть переданы в параметрах (например, обратные вызовы) или сохранены в переменных и т. Д. Они являются типобезопасным NET-эквивалентом указателей на функции. Они также используются на мероприятиях. При назначении метода делегату необходимо использовать @оператор, чтобы компилятор знал, что метод не требуется вызывать, а просто назначить его.

Oxygene может создавать анонимных делегатов; например, методы могут быть переданы Invokeметоду элемента управления без объявления делегата:

method MainForm.MainForm_Load(sender: System.Object; e: System.EventArgs); begin Invoke(@DoSomething); end;

Анонимный делегат с подписью метода DoSomethingбудет создан компилятором.

Oxygene поддерживает полиморфные делегаты, что означает, что делегаты с параметрами нисходящего типа совместимы по назначению. Предположим, что два класса, MyClassа MyClassEx = class(MyClass)затем в следующем коде BlubbExсовместимость по присваиванию с Blubb.

type delegate Blubb(sender: Object; m: MyClass); delegate BlubbEx(sender: Object; mx: MyClassEx);

Поля можно использовать для делегирования реализации интерфейса, если их тип реализует этот интерфейс:

Implementor = public class(IMyInterface) //... implement interface... end; MyClass = public class(IMyInterface) fSomeImplementor: Implementor; public implements IMyInterface; //takes care of implementing the interface end;

В этом примере компилятор создаст общедоступные методы и свойства в MyClass, которые вызывают методы / свойства fSomeImplementorдля реализации членов IMyInterface. Это можно использовать для обеспечения функциональности, подобной миксину.

Анонимные методы

Анонимные методы реализованы внутри других методов. Они недоступны вне метода, если они не сохранены в поле делегата. Анонимные методы могут использовать локальные переменные метода, в котором они реализованы, и поля класса, к которому они принадлежат.

Анонимные методы особенно полезны при работе с кодом, который должен выполняться в потоке графического интерфейса пользователя, что выполняется в.NET путем передачи метода do the Invokemethod ( Control.Invokeв WinForms, Dispatcher.Invokeв WPF):

method Window1.PredictNearFuture; //declared as async in the interface begin //... Calculate result here, store in variable "theFuture" Dispatcher.Invoke(DispatcherPriority.ApplicationIdle, method; begin theFutureTextBox.Text:= theFuture; end); end;

Анонимные методы тоже могут иметь параметры:

method Window1.PredictNearFuture; //declared as async in the interface begin //... Calculate result here, store in variable "theFuture" Dispatcher.Invoke(DispatcherPriority.ApplicationIdle, method(aFuture: String); begin theFutureTextBox.Text:= aFuture ; end, theFuture); end;

Оба исходных кода используют анонимных делегатов.

Уведомление о собственности

Уведомление о свойствах используется в основном для привязки данных, когда графический интерфейс должен знать, когда значение свойства изменяется. Платформа.NET предоставляет интерфейсы INotifyPropertyChangedи INotifyPropertyChanging(в.NET 3.5) для этой цели. Эти интерфейсы определяют события, которые должны запускаться при изменении / изменении свойства.

Oxygene предоставляет notifyмодификатор, который можно использовать для свойств. Если этот модификатор используется, компилятор добавит интерфейсы к классу, реализует их и создаст код для вызова событий, когда свойство изменяется / было изменено.

property Foo: String read fFoo write SetFoo; notify; property Bar: String; notify 'Blubb'; //will notify that property "Blubb" was changed instead of "Bar"

Модификатор можно использовать для свойств, у которых есть метод установки. Затем код для создания событий будет добавлен к этому методу во время компиляции.

Примеры кода

Привет мир

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 Listlt;Persongt;; //type inference 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); //No casting needed Console.ReadLine; end; end.

Общий метод

namespace GenericMethodTest; interface type GenericMethodTest = static class public class method Main; private class method Swaplt;Tgt;(var left, right: T); class method DoSwaplt;Tgt;(left, right: T); end; implementation class method GenericMethodTest.DoSwaplt;Tgt;(left, right: T); begin var a:= left; var b:= right; Console.WriteLine('Type: {0}', typeof(T)); Console.WriteLine('-gt; a = {0}, b = {1}', a, b); Swaplt;Tgt;(var a, var b); Console.WriteLine('-gt; a = {0}, b = {1}', a, b); end; class method GenericMethodTest.Main; begin var a:= 23;// type inference var b:= 15; DoSwaplt;Integergt;(a, b); // no downcasting to Object in this method. var aa:= 'abc';// type inference var bb:= 'def'; DoSwaplt;Stringgt;(aa, bb); // no downcasting to Object in this method. DoSwap(1.1, 1.2); // type inference for generic parameters Console.ReadLine(); end; class method GenericMethodTest.Swaplt;Tgt;(var left, right: T); begin var temp:= left; left:= right; right:= temp; end; end.

Вывод программы:

Type: System.Int32 -gt; a = 23, b = 15 -gt; a = 15, b = 23 Type: System.String -gt; a = abc, b = def -gt; a = def, b = abc Type: System.Double -gt; a = 1,1, b = 1,2 -gt; a = 1,2, b = 1,1
Различия между Delphi и Oxygene
  • unit: заменено ключевым словом namespace. Поскольку Oxygene компилируется не для каждого файла, а для каждого проекта, это не зависит от имени файла. Вместо этого ключевое слово unit или namespace используется для обозначения пространства имен по умолчанию, в котором определены все типы для этого файла.
  • процедура и функция: метод является предпочтительным ключевым словом, хотя процедура и функция по- прежнему работают.
  • overload: в Oxygene все методы по умолчанию перегружены, поэтому для этого не требуется специального ключевого слова.
  • . Create (): этот вызов конструктора был заменен ключевым словом new. Его все еще можно включить в параметрах проекта по устаревшим причинам.
  • строка: символы в строках отсчитываются от нуля и доступны только для чтения. Строки могут иметь нулевые значения, поэтому проверки на пустую строку не всегда достаточно.
Критика

Некоторые люди хотели бы перенести свой код Win32 Delphi на Oxygene без внесения серьезных изменений. Это невозможно, потому что, хотя Oxygene выглядит как Delphi, изменений достаточно, чтобы сделать его несовместимым для простой перекомпиляции. Название напоминает другую версию Delphi, но это не совсем так.

Помимо языковой разницы, в Oxygene недоступна инфраструктура библиотеки визуальных компонентов. Это делает перенос еще более трудным, поскольку классический код Delphi в значительной степени зависит от VCL.

Смотрите также
использованная литература
внешние ссылки
Последняя правка сделана 2023-03-19 08:54:44
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте