Oxygene (ранее известный как Chrome ) - это язык программирования, разработанный RemObjects Software для Microsoft Common Language Infrastructure , Java Platform и Cocoa . Oxygene на основе Delphi «s Object Pascal , но также имеет влияние от C # , Eiffel , Java , F # и других языках.
Разработчик | Программное обеспечение RemObjects |
---|---|
Впервые появился | 2005 [1] |
Платформа | Common Language Infrastructure , Java , Cocoa , CPU-Native, Windows 32/64 бит, Linux 32/64 бит, WebAssembly |
Лицензия | Пробная версия |
Веб-сайт | elementscompiler |
Под влиянием | |
Delphi «ы Object Pascal , C # |
По сравнению с устаревшим Delphi.NET , Oxygene не делает упор на полную обратную совместимость, но призван быть «переизобретением» языка, быть хорошим гражданином на платформах управляемой разработки и использовать все функции и технологии, предоставляемые Среды выполнения .NET и Java.
Oxygene является коммерческим продуктом , и предлагает полную интеграцию в Microsoft «s Visual Studio IDE на Windows, а также его собственный IDE называется Огонь для использования на MacOS . Компилятор командной строки доступен бесплатно. Oxygene - один из шести языков, поддерживаемых базовым набором инструментов Elements Compiler, рядом с C # , Swift , Java , Go и Mercury (на основе Visaul Basic.NET ).
С 2008 по 2012 год RemObjects Software предоставила Embarcadero лицензию на компилятор и технологию IDE для использования в их продукте Embarcadero Prism . [2] Начиная с осени 2011 года, Oxygene стал доступен в двух отдельных выпусках, причем во втором выпуске была добавлена поддержка сред выполнения Java и Android. Начиная с выпуска XE4, Embarcadero Prism больше не входит в состав RAD Studio. Для клиентов Prism существует множество вариантов поддержки и обновления для перехода на Oxygene. [3] По состоянию на 2016 год существует только одна редакция Oxygene, которая позволяет разрабатывать в Windows или macOS и может создавать исполняемые файлы для Windows, Linux, WebAssembly .NET, iOS, Android, Java и macOS.
Язык
Язык 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
синтаксис:
неявный оператор класса ( i : Integer ) : MyClass ;
Обратите внимание, что для перегрузки оператора у каждого оператора есть имя, которое должно использоваться в синтаксисе перегрузки оператора, потому что, например, «+» не будет допустимым именем метода в Oxygene. [4]
Структура программы
Oxygene не использует «Единицы», как Delphi, но использует пространства имен .NET для организации и группировки типов. Пространство имен может охватывать несколько файлов (и сборок), но один файл может содержать типы только одного пространства имен. Это пространство имен определяется в самом верху файла:
пространство имен ConsoleApplication1;
Файлы Oxygene разделены на интерфейс и раздел реализации, структура которых известна из Delphi. Раздел интерфейса следует за объявлением пространства имен. Он содержит uses
предложение, которое в Oxygene импортирует типы из других пространств имен:
использует System . Linq ;
Импортированные пространства имен должны находиться в самом проекте или в ссылочных сборках. В отличие от C #, в Oxygene псевдонимы нельзя определять для пространств имен, только для имен одного типа (см. Ниже).
После uses
предложения файл содержит объявления типов, как они известны из Delphi:
интерфейстип ConsoleApp = класс общественного класса метод Main ; конец ;
Как и в C #, метод Main является точкой входа для каждой программы. Он может иметь параметр args : Array of String
для передачи аргументов командной строки программе.
Можно объявить больше типов без повторения type
ключевого слова.
Реализация заявленных методов размещена в разделе реализации:
выполнение метод класса ConsoleApp . Главный ; begin // добавьте сюда свой код Console . WriteLine ( 'Hello World.' ) ; конец ;конец .
Файлы всегда заканчиваются на end.
Типы
В качестве языка .NET Oxygene использует систему типов .NET: существуют типы значений (например, структуры) и ссылочные типы (например, массивы или классы).
Хотя Oxygene не вводит собственные «предопределенные» типы, для некоторых из них предлагаются более «паскальные» общие имена [5], так что, например, их System.Int32
можно использовать как Integer
и Boolean
( System.Boolean
), Char
( System.Char
), Real
( System.Double
) для присоединения к семейству имен паскаль-типа тоже. Структурный характер этих типов, являющийся частью .NET, полностью сохраняется.
Как и во всех языках .NET, типы в Oxygene имеют видимость. В Oxygene видимость по умолчанию равна assembly
, что эквивалентно internal
видимости в C #. Другой возможный тип видимости - public
.
введите MyClass = конец общедоступного класса ;
Видимость может быть установлена для каждого определенного типа (классы, интерфейсы, записи, ...).
Для типов можно определить псевдоним, который можно использовать локально или в других сборках Oxygene.
тип IntList = public List < Integer >; // виден в других Oxygene-сборках SecretEnumerable = IEnumerable < String >; // не отображается в других сборках
Псевдонимы открытого типа не будут отображаться для других языков.
Записи
Записи - это то, что структуры .NET называются в Oxygene. Они объявлены так же, как классы, но с record
ключевым словом:
введите MyRecord = метод записи Foo ; конец ;
Поскольку это всего лишь структуры .NET, записи могут иметь поля, методы и свойства, но не имеют наследования и не могут реализовывать интерфейсы .
Интерфейсы
Интерфейсы - очень важное понятие в мире .NET, их активно использует сам фреймворк. Интерфейсы - это спецификация небольшого набора методов, свойств и событий, которые класс должен реализовать при реализации интерфейса. Например, интерфейс IEnumerable
определяет GetEnumerator
метод, который используется для перебора последовательностей.
Интерфейсы объявлены так же, как классы:
type MyInterface = метод открытого интерфейса MakeItSo : IEnumerable ; Свойство Bar : Строка чтения и записи ; конец ;
Обратите внимание, что для свойств геттер и сеттер явно не указаны.
Делегаты
Делегаты определяют сигнатуры для методов, так что эти методы могут быть переданы в параметрах (например, обратные вызовы) или сохранены в переменных и т. Д. Они являются типобезопасным NET-эквивалентом указателей на функции. Они также используются на мероприятиях. При назначении метода делегату необходимо использовать @
оператор, чтобы компилятор знал, что метод не требуется вызывать, а просто назначить его.
Oxygene может создавать анонимных делегатов; например, методы могут быть переданы Invoke
методу элемента управления без объявления делегата:
метод MainForm . MainForm_Load ( отправитель : System . Object ; e : System . EventArgs ) ; begin Invoke ( @ DoSomething ) ; конец ;
Анонимный делегат с подписью метода DoSomething
будет создан компилятором.
Oxygene поддерживает полиморфные делегаты, что означает, что делегаты с параметрами нисходящего типа совместимы по назначению. Предположим, что два класса, MyClass
а MyClassEx = class(MyClass)
затем в следующем коде BlubbEx
совместимо присваивание Blubb
.
введите делегат Blubb ( отправитель : Объект ; m : MyClass ) ; делегат BlubbEx ( отправитель : Объект ; mx : MyClassEx ) ;
Поля можно использовать для делегирования реализации интерфейса, если их тип реализует этот интерфейс:
Implementor = public class ( IMyInterface ) // ... реализовать интерфейс ... end ;MyClass = открытый класс ( IMyInterface ) fSomeImplementor : Implementor ; публично реализует IMyInterface ; // заботится о реализации интерфейса end ;
В этом примере компилятор создаст общедоступные методы и свойства в MyClass
, которые вызывают методы / свойства fSomeImplementor
для реализации членов IMyInterface. Это можно использовать для обеспечения функциональности, подобной миксину. [6]
Анонимные методы
Анонимные методы реализованы внутри других методов. Они недоступны вне метода, если они не хранятся в поле делегата. Анонимные методы могут использовать локальные переменные метода, в котором они реализованы, и поля класса, к которому они принадлежат.
Анонимные методы особенно полезны при работе с кодом, который должен выполняться в потоке графического интерфейса пользователя, что выполняется в .NET путем передачи метода do the Invoke
method ( Control.Invoke
в WinForms, Dispatcher.Invoke
в WPF):
метод Window1 . PredictNearFuture ; // объявлено как async в интерфейсе begin // ... Здесь вычисляем результат, сохраняем в переменной "theFuture" Dispatcher . Invoke ( DispatcherPriority . ApplicationIdle , method ; begin theFutureTextBox . Text : = theFuture ; end ) ; конец ;
Анонимные методы тоже могут иметь параметры:
метод Window1 . PredictNearFuture ; // объявлено как async в интерфейсе begin // ... Здесь вычисляем результат, сохраняем в переменной "theFuture" Dispatcher . Invoke ( DispatcherPriority . ApplicationIdle , method ( aFuture : String ) ; начало FutureTextBox . Text : = aFuture ; конец , theFuture ) ; конец ;
Оба исходных кода используют анонимных делегатов .
Уведомление о собственности
Уведомление о свойствах используется в основном для привязки данных, когда графический интерфейс должен знать, когда значение свойства изменяется. Платформа .NET предоставляет интерфейсы INotifyPropertyChanged
и INotifyPropertyChanging
(в .NET 3.5) для этой цели. Эти интерфейсы определяют события, которые должны запускаться при изменении / изменении свойства.
Oxygene предоставляет notify
модификатор, который можно использовать для свойств. Если этот модификатор используется, компилятор добавит интерфейсы к классу, реализует их и создаст код для вызова событий, когда свойство изменяется / было изменено.
свойство Foo : String read fFoo write SetFoo ; уведомить ; свойство Bar : String ; уведомить "Blubb" ; // сообщит, что свойство "Blubb" было изменено вместо "Bar"
Модификатор можно использовать для свойств, у которых есть метод установки. Затем код для создания событий будет добавлен к этому методу во время компиляции.
Примеры кода
Привет мир
пространство имен HelloWorld ;интерфейстип HelloClass = класс общественного класса метод Main ; конец ;выполнение метод класса HelloClass . Главный ; начать систему . Консоль . WriteLine ( 'Hello World!' ) ; конец ;конец .
Универсальный контейнер
пространство имен GenericContainer ;интерфейстип TestApp = класс общественного класса метод Main ; конец ; Person = класс публичное свойство FirstName : String ; свойство LastName : String ; конец ;выполнениеиспользует System . Коллекции . Универсальный ; метод класса TestApp . Главный ; begin var myList : = новый список < человек >; // вывод типа myList . Добавить ( новый человек ( FirstName : = 'John' , LastName : = 'Doe' )) ; myList . Добавить ( новый человек ( FirstName : = 'Jane' , LastName : = 'Doe' )) ; myList . Добавить ( новый человек ( FirstName : = 'James' , LastName : = 'Doe' )) ; Консоль . WriteLine ( myList [ 1 ] . FirstName ) ; // Приведение не требуется Console . ReadLine ; конец ;конец .
Общий метод
пространство имен GenericMethodTest ;интерфейстип GenericMethodTest = статический класс общественного класса метод Main ; метод частного класса Swap < T > ( var left , right : T ) ; метод класса DoSwap < T > ( слева , справа : T ) ; конец ; выполнение метод класса GenericMethodTest . DoSwap < T > ( слева , справа : T ) ; начало var a : = left ; var b : = right ; Консоль . WriteLine ( 'Тип: {0}' , typeof ( T )) ; Консоль . WriteLine ( '-> a = {0}, b = {1}' , a , b ) ; Поменять местами < T > ( var a , var b ) ; Консоль . WriteLine ( '-> a = {0}, b = {1}' , a , b ) ; конец ; метод класса GenericMethodTest . Главный ; начать var a : = 23 ; // вывод типа var b : = 15 ; DoSwap < Целое число > ( a , b ) ; // в этом методе нет понижающего преобразования до Object. var aa : = 'abc' ; // вывод типа var bb : = 'def' ; DoSwap < String > ( aa , bb ) ; // в этом методе нет понижающего преобразования до Object. DoSwap ( 1.1 , 1.2 ) ; // вывод типа для общих параметров Console . ReadLine () ; конец ; метод класса GenericMethodTest . Поменять местами < T > ( var left , right : T ) ; начать var temp : = left ; слева : = справа ; справа : = темп ; конец ;конец .
Вывод программы:
Тип: System.Int32-> а = 23, б = 15-> а = 15, б = 23Тип: System.String-> a = abc, b = def-> а = def, b = abcТип: System.Double-> а = 1,1, б = 1,2-> а = 1,2, б = 1,1
Различия между Delphi и Oxygene
- unit : заменено ключевым словом namespace . Поскольку Oxygene компилируется не для каждого файла, а для каждого проекта, это не зависит от имени файла. Вместо этого ключевое слово unit или namespace используется для обозначения пространства имен по умолчанию, в котором определены все типы для этого файла.
- процедура и функция : метод является предпочтительным ключевым словом, хотя процедура и функция по- прежнему работают.
- overload : в Oxygene все методы по умолчанию перегружены, поэтому для этого не требуется специального ключевого слова.
- .Create () : этот вызов конструктора был заменен ключевым словом new . Его по-прежнему можно включить в параметрах проекта по устаревшим причинам.
- строка : символы в строках отсчитываются от нуля и доступны только для чтения. Строки могут иметь нулевые значения, поэтому проверки на пустую строку не всегда достаточно.
Критика
Некоторые люди хотели бы перенести свой код Win32 Delphi на Oxygene, не внося серьезных изменений. Это невозможно, потому что, хотя Oxygene выглядит как Delphi, изменений достаточно, чтобы сделать его несовместимым для простой перекомпиляции. Название напоминает другую версию Delphi, но это не совсем так. [7]
Помимо языковой разницы, в Oxygene недоступна инфраструктура библиотеки визуальных компонентов . [8] Это еще больше затрудняет перенос, поскольку классический код Delphi в значительной степени зависит от VCL.
Смотрите также
- C #
- Object Pascal
- Embarcadero Delphi
- Свободный Паскаль
- Эйфелева
- Ява
Рекомендации
- ^ http://www.elementscompiler.com/elements/oxygene/history.aspx
- ^ «Страница Embarcadero Prism, внизу страницы изображение, подтверждающее, что она работает на RemObjects Oxygene» .
- ^ «Архивная копия» . Архивировано из оригинала на 2013-06-20 . Проверено 6 июня 2013 .CS1 maint: заархивированная копия как заголовок ( ссылка )
- ^ «Архивная копия» . Архивировано из оригинала на 2011-07-08 . Проверено 9 января 2010 .CS1 maint: заархивированная копия как заголовок ( ссылка )
- ^ «Архивная копия» . Архивировано из оригинала на 2011-07-08 . Проверено 10 января 2010 .CS1 maint: заархивированная копия как заголовок ( ссылка )
- ^ «Архивная копия» . Архивировано из оригинала на 2011-07-08 . Проверено 17 января 2010 .CS1 maint: заархивированная копия как заголовок ( ссылка )
- ^ «Обсуждение переполнения стека, в котором люди отмечают, что Oxygene не является Delphi Win32» . Архивировано из оригинала на 2012-10-25 . Проверено 25 июля 2016 .
- ^ «Обзор Delphi Prism 2010, где в третьем абзаце указано, что VCL.net недоступен» .
Внешние ссылки
- Официальный веб-сайт