Цейлон (язык программирования)
![]() | |
Парадигма | Объектно-ориентированный |
---|---|
Разработано | Гэвин Кинг |
Разработчик | Фонд Затмения |
Впервые появился | 2011 год |
Стабильная версия | 1.3.3
/ 21 августа 2017 г |
Дисциплина набора текста | Статический , сильный , безопасный |
Платформа | Виртуальная машина Java , JavaScript |
Лицензия | Лицензия Апач 2.0 |
Расширения имен файлов | .цейлон [1] |
Веб-сайт | Цейлон-Ланг |
Под влиянием | |
Ява , [2] Скала , Смоллток , ML , [3] Лисп , [4] Пока [5] |
Ceylon — объектно-ориентированный , строго статически типизированный язык программирования с упором на неизменяемость , созданный Red Hat . Цейлонские программы работают на виртуальной машине Java (JVM) и могут быть скомпилированы в JavaScript . [6] [7] При разработке языка особое внимание уделяется читаемости исходного кода , предсказуемости , удобству использования инструментов , модульности и метапрограммируемости . [8]
К важным особенностям Цейлона относятся: [9]
- Система типов, обеспечивающая нулевую безопасность и существование элемента списка во время компиляции.
- Регулярный синтаксис и семантика, избегание особых случаев и примитивно определенных конструкций в пользу синтаксического сахара.
- Поддержка универсального программирования и метапрограммирования с шаблонов . использованием универсальных
- Модульность, встроенная в язык, на основе модулей JBoss , совместимых с OSGi. [10] и Мейвен [11]
- мощные инструменты, включая IDE на базе Eclipse [12]
Название «Цейлон» является косвенной ссылкой на Яву, поскольку Ява и Шри-Ланка , ранее известные как Цейлон, являются островами, известными выращиванием и экспортом кофе и чая .
В августе 2017 года Цейлон был передан в дар фонду Eclipse Foundation . Развитие замедлилось и окончательно остановилось в 2020 году. [13] В апреле 2023 года Eclipse Foundation заявила о прекращении перехода. [14]
Языковые особенности [ править ]
Ceylon находится под сильным влиянием синтаксиса Java , но добавляет много новых функций.
Типовая система [ править ]
Одним из самых новых аспектов Ceylon по сравнению с Java является его система типов . Цейлон отказывается от примитивных типов Java [15] и бокс в пользу системы типов, полностью состоящей из первоклассных объектов. Хотя в некоторых ситуациях это может привести к накладным расходам на упаковку, это делает систему типов более единообразной.
Ceylon допускает типы объединения и пересечения , аналогично TypeScript , Whiley и Flow, которые, по сути, заимствовали идею у Ceylon.
Типы объединений, написанные A|B
, позволяет переменной иметь более одного типа. В следующем примере показана функция Ceylon, которая может принимать целое число или строку :
shared void integerOrString(Integer|String input) {
if (is Integer input) {
print("Got the integer ``input``");
} else {
print("Got the string '``input``'");
}
}
Типы пересечений, написанные A&B
, являются теоретической основой чувствительной к потоку типизации :
shared void integerOrString(Integer|String input) {
Integer added = input + 6; // illegal; the + operator is not defined on Integer|String
if (is Integer input) {
Integer added = input + 6; // legal; input is now known to be an Integer
print("Got the integer ``input``");
} else {
print("Got the string '``input``'");
}
}
Состояние is Integer input
сужает тип input
к <Integer|String> & Integer
,
который распределяется по Integer&Integer | String&Integer
,
который, как String
и Integer
являются непересекающимися типами, что эквивалентно Integer&Integer | Nothing
( Nothing
это тип пустого дна),
что упрощается до просто Integer
.
Нулевая безопасность [ править ]
Типы объединения и пересечения используются для обеспечения нулевой безопасности .
Верхним типом иерархии типов Цейлона является класс Anything
,
который имеет два подкласса: Object
, суперкласс всех обычных классов и всех интерфейсов, и Null
, с единственным экземпляром null
.
С Object
и Null
являются непересекающимися типами, большинство обычных типов, таких как Integer
или List<String>
не являются обнуляемыми;
тип , допускающий значение NULL, — это объединение Integer|Null
, сокращенно Integer?
. [16]
Типы пересечений можно использовать для получения необязательного типа из возможно необязательного типа, например параметра типа. Например, сигнатура функции, удаляющей null
элементами из потока значений могут быть:
Iterable<Element&Object> removeNulls<Element>(Iterable<Element> stream);
Когда removeNulls
вызывается с потоком Integer|Null
элементов, результатом будет поток <Integer|Null> & Object
элементы, что упрощает Integer
.
Функции [ править ]
Как и многие современные языки, Ceylon поддерживает функции первого класса и функции более высокого порядка , включая типы функций и анонимные функции. [17]
// A top-level higher-order function using block syntax (not associated with any user-created classes)
String process(String text, String transformString(String toChange)) {
return transformString(text);
}
// A top-level function calling String.reverse in expression form.
String reverse(String text) => text.reversed;
// A function reference to String.reversed but mostly equivalent to the function above.
String(String) reverseFunctionReference = String.reversed;
// An example where the top-level function above is provided as an argument to the higher-order function above
String reversed1 = process("one", reverse);
// An example where an anonymous function - (text) => text+text - is provided to the higher-order function above.
String reversed2 = process("one", (text) => text+text);
Перечислимые типы [ править ]
Подобно Java и многим другим языкам, а также с механизмом, аналогичным алгебраическим типам , Ceylon поддерживает перечислимые типы , также известные как перечисления. Это реализовано на Ceylon с помощью шаблона ограничения экземпляров абстрактного класса при объявлении ограниченным набором объектов (в данном случае одноэлементными экземплярами). Другой способ реализовать этот шаблон — новая функция конструктора в Ceylon 1.2, где объекты реализованы как объявления конструкторов с разными именами. [18]
// Traditional syntax for enumerated type, in this case, limiting the instances to three objects(for this purpose: Singletons)
abstract class Vehicle(shared String name) of plane | train | automobile {}
object plane extends Vehicle("plane") {}
object train extends Vehicle("train") {}
object automobile extends Vehicle("automobile") {}
// Compile error: type is not a subtype of any case of enumerated supertype: 'boat' inherits 'Vehicle'
//object boat extends Vehicle("boat") {}
// New (as of Ceylon 1.2.0) constructor-based syntax
class Vehicle of plane | train | automobile {
String name;
abstract new named(String pName) {
name = pName;
}
shared new plane extends named("plane") {}
shared new train extends named("train") {}
shared new automobile extends named("automobile") {}
// Compile error: value constructor does not occur in of clause of non-abstract enumerated class: 'boat' is not listed in the of clause of 'Vehicle'
//shared new boat extends named("boat") {}
}
Вывод типа [ править ]
Ceylon строго и статически типизирован, но также имеет поддержку вывода типа .
value
Ключевое слово используется для определения типа переменной,
и function
Ключевое слово используется для определения типа функции.
Следующие две пары определений эквивалентны:
Integer i = 3;
value i = 3;
Integer add(Integer i1, Integer i2) {
return i1 + i2;
}
function add(Integer i1, Integer i2) {
return i1 + i2;
}
Однако, чтобы сделать возможным однопроходный вывод типа, вывод типа разрешен только для объявлений не верхнего уровня и неразделяемых объявлений. [19]
Точка входа с именами [ править ]
По умолчанию стартер ( ceylon run
) запускает общую функцию run() модуля:
/* The classic Hello World program */
shared void run() {
print("Hello, World!");
}
но любая другая общая функция без параметров может использоваться в качестве основного вызова программы с параметром запуска , например:
ceylon run --compile=force --run hello default
Версии [ править ]
Выпущены версии Ceylon: [20]
- М1 0,1 «Ньютон» (20 декабря 2011 г.)
- М2 0.2 «Минитель» (2 марта 2012 г.)
- М3 0,3 «В2000» (21 июня 2012 г.)
- M3.1 0.3.1 "V2000" (6 июля 2012 г.)
- M4 0.4 «Аналитическая машина» (29 октября 2012 г.)
- M5 0.5 «Неса Понг» (13 марта 2013 г.)
- M6 0.6 «Виртуальный мальчик» (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 «Улыбайтесь толерантно» (02 марта 2017 г.)
- 1.3.3 «Содержимое может отличаться» (21 августа 2017 г.)
Лицензия [ править ]
Все части Ceylon доступны в виде бесплатного программного обеспечения , в основном по лицензии Apache . [21] Часть исходного кода лицензирована по лицензии LGPL.
См. также [ править ]
- Dart (язык программирования) , имеет собственную виртуальную машину, компилируется в JS, система типов не очень строгая, поддерживает миксины
- Fantom (язык программирования) , компилируется в JVM, не очень строгая система типов, поддерживает миксины
Ссылки [ править ]
- ^ Кинг, Гэвин. «Цейлонский язык: §4.1 Структура единицы компиляции» . Проверено 4 декабря 2015 г.
Единица компиляции представляет собой текстовый файл с расширением имени файла.
.ceylon
. - ^ «Часто задаваемые вопросы: Что такое Цейлон?» . Проверено 4 декабря 2015 г.
Ceylon — новый язык программирования, на который глубоко повлияла Java.
- ^ «Цейлон/пользователь — Гиттер» . Проверено 4 декабря 2015 г.
- ^ «Цейлон/пользователь — Гиттер» . Проверено 4 декабря 2015 г.
- ^ «10 лучших функций цейлонского языка, которые Java хотела бы иметь» . Проверено 29 ноября 2019 г.
- ^ «Цейлон 1.0 бета» . Проверено 26 сентября 2013 г.
- ^ «Проект Цейлон – Red Hat создает замену Java» . Регистр . 13 апреля 2011 г. Проверено 27 ноября 2011 г.
- ^ Кинг, Гэвин (10 января 2012 г.). «Принципы, которыми руководствуется этот проект» . Проверено 4 декабря 2015 г.
- ^ «Часто задаваемые вопросы о языковом дизайне: цели» . Проверено 4 декабря 2015 г.
- ^ Фестал, Дэвид (10 октября 2014 г.). «Пишите на Цейлоне, развертывайте как OSGI, используйте в Java EE» . Проверено 4 декабря 2015 г.
- ^ «Репозитории Maven» . Проверено 4 декабря 2015 г.
- ^ «Особенности Ceylon IDE» . Проверено 4 декабря 2015 г.
- ^ «Цейлон / Цейлон» . GitHub, Inc. 25 мая 2020 г. Архивировано из оригинала 03 октября 2023 г. Проверено 22 января 2024 г.
- ^ «Обзор прекращения действия Eclipse Ceylon™» . Фонд Эклипс. 05.04.2023. Архивировано из оригинала 23 апреля 2023 г. Проверено 23 апреля 2023 г.
- ^ Кинг, Гэвин. «Цейлон: часто задаваемые вопросы по языковому дизайну» .
- ^ Кинг, Гэвин. «Цейлонский язык: §1.4.3 Безопасность во время компиляции для нулевых значений и чувствительная к потоку типизация» . Проверено 4 декабря 2015 г.
- ^ Кинг, Гэвин. «Цейлонский язык: 4.7 функций» . Проверено 5 декабря 2015 г.
- ^ Кинг, Гэвин. «Цейлонский язык: 4.5.8 Перечисленные классы» . Проверено 6 декабря 2015 г.
- ^ Кинг, Гэвин. «Цейлонский язык: §3.2.9 Вывод типа» . Проверено 4 декабря 2015 г.
- ^ https://ceylon-lang.org/download-archive/ Цейлон: скачать предыдущие версии Цейлона.
- ^ «Цейлон: Лицензии» . Проверено 4 декабря 2015 г.