Ceylon - объектно-ориентированный , строго статически типизированный язык программирования с упором на неизменяемость , созданный Red Hat . Программы Ceylon выполняются на виртуальной машине Java (JVM) и могут быть скомпилированы в JavaScript . [6] [7] Дизайн языка фокусируется на читабельности исходного кода , предсказуемости , инструментальности , модульности и метапрограммируемости . [8]
Парадигма | Объектно-ориентированный |
---|---|
Разработано | Гэвин Кинг |
Разработчик | Фонд Затмения |
Впервые появился | 2011 |
Стабильный выпуск | 1.3.3 / 21 августа 2017 г . |
Печатная дисциплина | Статичный , прочный , безопасный |
Платформа | Виртуальная машина Java , JavaScript |
Лицензия | Лицензия Apache 2.0 |
Расширения имени файла | .ceylon [1] |
Веб-сайт | ceylon-lang |
Под влиянием | |
Java , [2] Скала , Smalltalk , М. Л. , [3] Лисп , [4] Whiley [5] |
Важные особенности Цейлона: [9]
- Система типов, обеспечивающая нулевую безопасность и существование элементов списка во время компиляции
- Регулярный синтаксис и семантика, избегание особых случаев и примитивно определенных конструкций в пользу синтаксического сахара
- Поддержка общего программирования и метапрограммированием, с реифицированные дженериков
- Модульность, встроенная в язык, основана на модулях JBoss , взаимодействующих с OSGi [10] и Maven [11]
- мощные инструменты, включая IDE на основе Eclipse [12]
Название «Цейлон» косвенно отсылает к Яве, поскольку Ява и Шри-Ланка , ранее известные как Цейлон, являются островами, известными выращиванием и экспортом кофе и чая .
В августе 2017 года Цейлон был передан в дар Фонду Затмения .
Особенности языка
Ceylon сильно зависит от синтаксиса Java , но добавляет много новых функций.
Система типов
Один из самых новых аспектов Ceylon по сравнению с Java - это система типов . Ceylon отказывается от примитивных типов Java [13] и бокса в пользу системы типов, полностью состоящей из объектов первого класса. Хотя в некоторых ситуациях это может вызвать накладные расходы на упаковку, это делает систему типов более единообразной.
Ceylon допускает типы объединения и пересечения , аналогично TypeScript , Whiley и Flow.
Написанные типы объединения A|B
позволяют переменной иметь более одного типа. В следующем примере показана функция Ceylon, которая может принимать целое число или строку :
shared void integerOrString ( Integer | String input ) { if ( is Integer input ) { print ( "Получил целое число` input`` ); } else { print ( "Получил строку '` `input``'" ); } }
Записанные типы пересечений A&B
являются теоретической основой чувствительной к потоку печати :
shared void integerOrString ( Integer | String input ) { Integer added = input + 6 ; // незаконно; оператор + не определен в Integer | String если ( это целое число вход ) { Целый добавлен = вход + 6 ; // законный; теперь известно, что input является целым числом print ( «Получил целое число« input » ); } else { print ( "Получил строку '` `input``'" ); } }
Условие is Integer input
сужает тип input
до
, который распределяется по Integer&Integer | String&Integer
, которые, как String
и Integer
являются непересекающимися типами, эквивалентны Integer&Integer | Nothing
( Nothing
является пустым нижним типом), что упрощается до просто Integer
.
Нулевая безопасность
Типы объединения и пересечения используются для обеспечения нулевой безопасности. Верхний тип иерархии типов Цейлона - это класс Anything
, который имеет два подкласса: Object
суперкласс всех нормальных классов и всех интерфейсов и Null
с единственным экземпляром null. Поскольку Object
и Null
являются непересекающимися типами, большинство обычных типов, таких как Integer
or List
, не допускают значения NULL; обнуляемый типом является объединением Integer|Null
, сокращенно Integer?
. [14]
Типы пересечения могут использоваться для получения необязательного типа из возможно необязательного типа, такого как параметр типа. Например, сигнатура функции, удаляющей null
элементы из потока значений, может быть следующей:
Iterable < Element & Object > removeNulls < Element > ( поток Iterable < Element > );
Когда removeNulls
вызывается с потоком Integer|Null
элементов, результатом будет поток
элементов, который упрощается до Integer
.
Функции
Подобно многим современным языкам, Ceylon поддерживает функции первого и более высокого порядка , включая типы функций и анонимные функции [15]
// Функция верхнего уровня высшего порядка, использующая синтаксис блока (не связанная с какими-либо пользовательскими классами) String process ( String text , String transformString ( String toChange )) { return transformString ( text ); }// Функция верхнего уровня, вызывающая String.reverse в форме выражения. Строка обратного ( строка текста ) => текст . перевернутый ;// Ссылка на функцию String.reversed, но в основном эквивалентна функции выше. Строка ( Строка ) reverseFunctionReference = Строка . перевернутый ;// Пример, в котором функция верхнего уровня, указанная выше, предоставляется в качестве аргумента для функции более высокого уровня, указанной выше String reversed1 = process ( "one" , reverse );// Пример, где анонимная функция - (текст) => текст + текст - предоставляется вышестоящей функции высшего порядка. String reversed2 = process ( "один" , ( текст ) => текст + текст );
Перечислимые типы
Подобно Java и многим другим языкам, и с механизмом, аналогичным алгебраическим типам , Ceylon поддерживает перечисляемые типы , также известные как перечисления. Это реализовано на Цейлоне с помощью шаблона ограничения экземпляров абстрактного класса при объявлении ограниченным набором объектов (в данном случае экземплярами синглтонов). Другой способ реализовать этот шаблон - использовать новую функцию конструктора в Ceylon 1.2, где объекты реализованы как объявления конструкторов с разными именами. [16]
// Традиционный синтаксис для перечисленных типов, в данном случае, ограничивая экземпляры трех объектов (для этой цели: Singletons) абстрактный класс автомобиля ( общая строка имя ) в плоскости | поезд | автомобиль {}объект plane extends Транспортное средство ( "самолет" ) {} объект поезд расширяется Транспортное средство ( "поезд" ) {} объект автомобиль расширяется Транспортное средство ( "автомобиль" ) {} // Ошибка компиляции: тип не является подтипом любого случая перечисляемого супертипа: «лодка» наследует «Транспортное средство» // объект «лодка» расширяет Транспортное средство («лодка») {}// Новая (как Цейлон 1.2.0) конструктора на основе синтаксиса класса Vehicle в плоскости | поезд | автомобиль { String name ; абстрактное новое имя ( String pName ) { name = pName ; } shared new plane extends named ( "plane" ) {} shared new train extends named ( "train" ) {} общий новый автомобиль расширяется named ( "автомобиль" ) {} // Ошибка компиляции: конструктор значения не встречается в разделе неабстрактный перечислимый класс: 'лодка' не указана в пункте 'Транспортное средство' // общая новая лодка расширяется с именем ("лодка") {} }
Вывод типа
Ceylon строго и статически типизирован, но также поддерживает вывод типов . value
Используется ключевое слово , чтобы определить тип переменной, и function
ключевое слово используется для вывода типа функции. Каждая из следующих двух пар определений эквивалентна:
Целое число i = 3 ; значение i = 3 ;Сложение целого числа ( целое число i1 , целое число i2 ) { return i1 + i2 ; } функция add ( Integer i1 , Integer i2 ) { return i1 + i2 ; }
Однако, чтобы сделать возможным однопроходный вывод типа, вывод типа разрешен только для объявлений не верхнего уровня и объявлений без общего доступа. [17]
Точка входа с именами
По умолчанию starter ( ceylon run
) запускает общую функцию run () модуля:
/ * Классическая программа Hello World * / shared void run () { print ( "Hello, World!" ); }
но любую другую общую функцию без параметров можно использовать в качестве основного вызова программы с параметром --run, например:
ceylon run --compile=force --run hello default
Версии
Выпущены версии Ceylon: [18]
- M1 0,1 «Ньютон» (20 декабря 2011 г.)
- М2 0.2 "Минитель" (02.03.2012)
- M3 0,3 "V2000" (21 июня 2012 г.)
- M3.1 0.3.1 "V2000" (6 июля 2012 г.)
- M4 0.4 "Аналитическая машина" (29 октября 2012 г.)
- M5 0,5 «Неса Понг» (13 марта 2013 г.)
- M6 0.6 "Virtual Boy" (23 сентября 2013 г.)
- 1.0 бета "Virtual Boy" (24 сентября 2013 г.)
- 1.0.0 «Нет больше мистера Славного Парня» (13 ноября 2013 г.)
- 1.1.0 "Ultimate Ship The Second" (9 октября 2014 г.)
- 1.2.0 «Серия неправдоподобных объяснений» (28 октября 2015 г.)
- 1.2.1 «Необычный апокалипсис» (11 февраля 2016 г.)
- 1.2.2 «Очаровательно, но иррационально» (11 марта 2016 г.)
- 1.3.0 «Полное внутреннее отражение» (19 сентября 2016 г.)
- 1.3.1 «Теперь мы попробуем сделать это по-своему» (22 ноября 2016 г.)
- 1.3.2 «Толерантная улыбка» (2 марта 2017 г.)
- 1.3.3 «Содержание может отличаться» (21 августа 2017 г.)
Лицензия
Все части Ceylon доступны как бесплатное программное обеспечение , в основном это лицензия Apache . [19] Часть исходного кода находится под лицензией LGPL.
Смотрите также
- Dart (язык программирования) , имеет собственную виртуальную машину, компилируется в JS, система типов не очень строгая, поддерживает миксины
- Fantom (язык программирования) , компилируется в JVM, система типов не очень строгая, поддерживает миксины
Рекомендации
- ^ Король, Гэвин. «Цейлонский язык: §4.1 Структура модуля компиляции» . Проверено 4 декабря 2015 .
Модуль компиляции
представляет собой текстовый файл с расширением имени файла
.
.ceylon
- ^ «Часто задаваемые вопросы: что такое Цейлон?» . Проверено 4 декабря 2015 .
Ceylon - новый язык программирования, на который сильно повлияла Java.
- ^ "ceylon / пользователь - Gitter" . Проверено 4 декабря 2015 .
- ^ "ceylon / пользователь - Gitter" . Проверено 4 декабря 2015 .
- ^ «10 лучших особенностей языка Цейлона, о которых мечтает Java» . Проверено 29 ноября 2019 .
- ^ «Цейлон 1.0 бета» . Проверено 26 сентября 2013 .
- ^ «Проект Цейлон - Red Hat создает замену Java» . Регистр . 2011-04-13 . Проверено 27 ноября 2011 .
- ^ Кинг, Гэвин (2012-01-10). «Принципы, которыми руководствуется этот проект» . Проверено 4 декабря 2015 .
- ^ «Часто задаваемые вопросы о языковом дизайне: цели» . Проверено 4 декабря 2015 .
- ^ Фестал, Дэвид (2014-10-10). «Напишите на Цейлоне, разверните как OSGI, используйте в Java EE» . Проверено 4 декабря 2015 .
- ^ "Репозитории Maven" . Проверено 4 декабря 2015 .
- ^ «Особенности Ceylon IDE» . Проверено 4 декабря 2015 .
- ^ Король, Гэвин. «Цейлон: FAQ по языковому дизайну» .
- ^ Король, Гэвин. «Цейлонский язык: §1.4.3 Безопасность во время компиляции для значений NULL и типизации с учетом потока» . Проверено 4 декабря 2015 .
- ^ Король, Гэвин. «Цейлонский язык: 4.7 функции» . Дата обращения 5 декабря 2015 .
- ^ Король, Гэвин. «Цейлонский язык: 4.5.8 Нумерованные классы» . Проверено 6 декабря 2015 .
- ^ Король, Гэвин. «Цейлонский язык: §3.2.9 Вывод типа» . Проверено 4 декабря 2015 .
- ^ https://ceylon-lang.org/download-archive/ Цейлон: Загрузить предыдущие версии Цейлона
- ^ «Цейлон: Лицензии» . Проверено 4 декабря 2015 .
Внешние ссылки
- Официальный веб-сайт