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

Кислород
Chrome-128.png
РазработчикПрограммное обеспечение RemObjects
Впервые появился2005; 15 лет назад (2005)[1]
ПлатформаОбщая языковая инфраструктура, Ява, Какао, CPU-Native, Windows 32/64 бит, Linux 32/64 бит, WebAssembly
ЛицензияПробная версия
Интернет сайтelementscompiler.com/ элементы/ кислород/
Под влиянием
Delphi с Object Pascal, C #

Кислород (ранее известный как Хром) это язык программирования разработан Программное обеспечение RemObjects за Microsoft Общая языковая инфраструктура, то Ява Платформа и Какао. Кислород на основе Delphi с Object Pascal, но также имеет влияние C #, Эйфель, Ява, F # и другие языки.

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

Oxygene является коммерческим продуктом и предлагает полную интеграцию с Microsoft с Visual Studio IDE в Windows, а также собственная IDE, Огонь для использования на macOS. Компилятор командной строки доступен бесплатно. Oxygene - один из четырех языков, поддерживаемых базовым Компилятор элементов набор инструментов, рядом с C #, Быстрый и Ява).

С 2008 по 2012 год RemObjects Software лицензировала свой компилятор и технологию IDE для Embarcadero для использования в их Embarcadero Prism товар.[2] Начиная с осени 2011 года, Oxygene стал доступен в двух отдельных выпусках, причем во втором выпуске была добавлена ​​поддержка сред выполнения Java и Android. Начиная с выпуска XE4, Embarcadero Prism больше не является частью RAD Studio SKU. Для клиентов 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 с ThreadPool class предложил способ эффективно работать с несколькими потоками. В Библиотека параллельных задач (TPL) был представлен в .NET 4.0, чтобы предоставить больше возможностей для параллельного программирования.

Операторы могут быть перегружены в Oxygene с помощью оператор класса синтаксис:

учебный класс оператор скрытый(я : Целое число) : Мой класс;

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

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

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

пространство имен ConsoleApplication1;

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

использует  Система.Linq;

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

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

интерфейстип  ConsoleApp = учебный класс  общественный    учебный класс метод Главный;  конец;

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

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

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

выполнениеучебный класс метод ConsoleApp.Главный;начинать  // добавьте сюда свой код  Консоль.WriteLine('Привет, мир.');конец;конец.

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

Типы

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

Хотя Oxygene не вводит собственные "предопределенные" типы, он предлагает более "паскалистые" общие имена для некоторых из них,[5] так что, например, System.Int32 может использоваться как Целое число и Булево (System.Boolean), Char (System.Char), Настоящий (System.Double) присоединиться к семейству имен паскальтипа. Структурный характер этих типов, являющийся частью .NET, полностью сохраняется.

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

тип  Мой класс = общественный учебный классконец;

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

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

тип  IntList = общественный Список<Целое число>; // виден в других Oxygene-сборках  SecretEnumerable = IEnumerable<Нить>; // не отображается в других сборках

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

Записи

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

тип  MyRecord = записывать    метод Фу;  конец;

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

Интерфейсы

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

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

тип  МойИнтерфейс = общественный интерфейс    метод Сделай это так : IEnumerable;    свойство Бар : Нить читать записывать;  конец;

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

Делегаты

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

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

метод MainForm.MainForm_Load(отправитель: Система.Объект; е: Система.EventArgs);начинать  Вызвать(@Сделай что-нибудь);конец;

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

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

тип  делегировать Blubb(отправитель : Объект; м : Мой класс);  делегировать BlubbEx(отправитель : Объект; mx : MyClassEx);

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

Разработчик = общественный учебный класс(IMyInterface)  // ... реализовать интерфейс ...конец;Мой класс = общественный учебный класс(IMyInterface)  fSomeImplementor : Разработчик; общественный орудия IMyInterface; // заботится о реализации интерфейсаконец;

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

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

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

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

метод Окно1.ПрогнозироватьБлижайшееБудущее;  // объявлен как асинхронный в интерфейсеначинать  // ... Здесь вычисляем результат, сохраняем в переменной "theFuture"    Диспетчер.Вызвать(ДиспетчерПриоритет.ApplicationIdle, метод; начинать      theFutureTextBox.Текст := будущее;    конец);конец;

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

метод Окно1.ПрогнозироватьБлижайшееБудущее;  // объявлен как асинхронный в интерфейсеначинать  // ... Здесь вычисляем результат, сохраняем в переменной "theFuture"    Диспетчер.Вызвать(ДиспетчерПриоритет.ApplicationIdle, метод(будущее : Нить); начинать      theFutureTextBox.Текст := будущее ;    конец, будущее);конец;

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

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

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

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

свойство Фу : Нить читать fFoo записывать SetFoo; уведомлять;свойство Бар : Нить; уведомлять 'Blubb'; // сообщит, что свойство "Blubb" было изменено вместо "Bar"

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

Примеры кода

Привет, мир

пространство имен Привет, мир;интерфейстип  Здравствуйте, класс = учебный класс  общественный    учебный класс метод Главный;  конец;выполнениеучебный класс метод Здравствуйте, класс.Главный;начинать  Система.Консоль.WriteLine('Привет, мир!');конец;конец.

Универсальный контейнер

пространство имен GenericContainer;интерфейстип  TestApp = учебный класс  общественный    учебный класс метод Главный;  конец;  Человек = учебный класс  общественный    свойство Имя: Нить;    свойство Фамилия: Нить;       конец;выполнениеиспользует  Система.Коллекции.Универсальный;учебный класс метод TestApp.Главный;начинать  вар мой список := новый Список<Человек>; // вывод типа  мой список.Добавлять(новый Человек(Имя := 'Джон', Фамилия := 'Доу'));   мой список.Добавлять(новый Человек(Имя := 'Джейн', Фамилия := 'Доу'));  мой список.Добавлять(новый Человек(Имя := 'Джеймс', Фамилия := 'Доу'));   Консоль.WriteLine(мой список[1].Имя);  // Приведение не требуется  Консоль.ReadLine;       конец;конец.

Общий метод

пространство имен GenericMethodTest;интерфейстипGenericMethodTest = статический учебный классобщественный  учебный класс метод Главный;частный  учебный класс метод Замена<Т>(вар оставили, верно : Т);  учебный класс метод DoSwap<Т>(оставили, верно : Т);конец;выполнениеучебный класс метод GenericMethodTest.DoSwap<Т>(оставили, верно : Т);начинать  вар а := оставили;  вар б := верно;  Консоль.WriteLine("Тип: {0}", тип(Т));  Консоль.WriteLine('-> a = {0}, b = {1}', а , б);  Замена<Т>(вар а, вар б);  Консоль.WriteLine('-> a = {0}, b = {1}', а , б);конец;учебный класс метод GenericMethodTest.Главный;начинать  вар а := 23;// вывод типа  вар б := 15;  DoSwap<Целое число>(а, б); // в этом методе нет преобразования в Object.  вар аа := 'abc';// вывод типа  вар bb := 'def';  DoSwap<Нить>(аа, bb); // в этом методе нет преобразования в Object.  DoSwap(1.1, 1.2); // вывод типа для общих параметров  Консоль.ReadLine();конец;учебный класс метод GenericMethodTest.Замена<Т>(вар оставили, верно : Т);начинать  вар темп := оставили;  оставили:= верно;  верно := темп;конец;конец.

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

Тип: System.Int32-> a = 23, b = 15-> a = 15, b = 23 Тип: System.String-> a = abc, b = def-> a = def, b = abcType: System.Double- > а = 1,1, б = 1,2-> а = 1,2, б = 1,1

Различия между Delphi и Oxygene

  • единица измерения: Заменено на пространство имен ключевое слово. Поскольку Oxygene компилируется не для каждого файла, а для каждого проекта, это не зависит от имени файла. Вместо этого ключевое слово unit или namespace используется для обозначения пространства имен по умолчанию, в котором определены все типы для этого файла.
  • процедура и функция: метод является предпочтительным ключевым словом, хотя процедура и функция все еще работают.
  • перегрузка: В Oxygene все методы по умолчанию перегружены, поэтому для этого не требуется специального ключевого слова.
  • .Создавать(): Этот вызов конструктора был заменен на новый ключевое слово. Его все еще можно включить в варианты проекта по причинам наследия
  • нить: Символы в строках отсчитываются от нуля и доступны только для чтения. Строки могут иметь нулевые значения, поэтому проверки на пустую строку не всегда достаточно.

Критика

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

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

Смотрите также

Рекомендации

  1. ^ http://www.elementscompiler.com/elements/oxygene/history.aspx
  2. ^ "Страница Embarcadero Prism, внизу страницы изображение, подтверждающее, что она поддерживается RemObjects Oxygene".
  3. ^ «Архивная копия». Архивировано из оригинал на 2013-06-20. Получено 2013-06-06.CS1 maint: заархивированная копия как заголовок (связь)
  4. ^ «Архивная копия». Архивировано из оригинал на 2011-07-08. Получено 2010-01-09.CS1 maint: заархивированная копия как заголовок (связь)
  5. ^ «Архивная копия». Архивировано из оригинал на 2011-07-08. Получено 2010-01-10.CS1 maint: заархивированная копия как заголовок (связь)
  6. ^ «Архивная копия». Архивировано из оригинал на 2011-07-08. Получено 2010-01-17.CS1 maint: заархивированная копия как заголовок (связь)
  7. ^ «Обсуждение Stack Overflow, в котором люди отмечают, что Oxygene не является Delphi Win32». Архивировано из оригинал на 2012-10-25. Получено 2016-07-25.
  8. ^ «Обзор Delphi Prism 2010, где в третьем абзаце говорится, что VCL.net недоступен».

внешняя ссылка