Ceylon: Реальный прорыв или просто очередной язык?

Объектно-ориентированное и функциональное программирование для массового пользователя

Путь развития языков программирования в информатике усеян трупами языков, которые некогда обещали стать очередным прорывом. И хотя многие нишевые языки находят некоторое применение в написании сценариев или специализированных приложений, С (и его производные) и Java трудно сместить с их позиций. Но язык Ceylon, разработанный Red Hat, похоже, предлагает интересное сочетание возможностей, соединяя известный C-синтаксис с поддержкой объектной ориентированности и полезных функциональных аспектов в дополнение к акценту на краткости. Исследуйте Ceylon и выясните, сможет ли этот будущий язык для виртуальных машин найти свое место в разработке корпоративного программного обеспечения. Обновление: добавлено пояснение к блоку fail в листинге 7. - Ред.

M. Тим Джонс, инженер-консультант, Emulex Corp.

М. Тим ДжонсМ. Тим Джонс - архитектор встроенного ПО и, кроме того, автор книг Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming (выдержавшей на данный момент второе издание), AI Application Programming (второе издание) и BSD Sockets Programming from a Multilanguage Perspective. Он имеет обширный опыт разработки ПО в самых разных предметных областях - от ядер специальных ОС для геосинхронных космических аппаратов до архитектур встраиваемых систем и сетевых протоколов. Тим - инженер-консультант Emulex Corp., Лонгмонт, Колорадо.



07.03.2012

Linux и Open Source традиционно связаны с передним краем разработки языков программирования. Возможно, дело в доступных инструментах, которые поддерживают разработку языков, или в открытости платформы, способствующей развитию новых языковых возможностей. Или, возможно, дело в открытых языках (таких как семейство компиляторов GNU, Ruby, Python и Perl), основанных на open source-технологиях, которые стимулируют и поощряют эксперименты и использование (не говоря уже о том, что именно Red Hat стоит за разработкой Ceylon). Так или иначе, Linux-разработчики имеют доступ к широкому кругу языков, от редко используемых старых до самых современных и передовых.

Ceylon - не Java

"Ceylon — не Java, это новый язык, на который сильно повлияла Java, созданный бескомпромиссными фанатами Java. Java в ближайшее время не умрет, ему ничто не угрожает". — Гэвин Кинг

Однако стоит ли нам, живущим в мире, где есть C/C++, Java™, Scala, Ruby, Python, Perl, Erlang, Lua, Scheme и многие другие языки, обращать внимание на появление очередного нового языка, нацеленного на разработку бизнес-ориентированного программного обеспечения для предприятий? Во многих случаях ответ будет отрицательным, но давайте изучим язык будущего от Red Hat под названием Ceylon, чтобы узнать, сможет ли он подняться до уровня самых популярных в настоящий момент языков.

Введение в Ceylon

Ceylon — это новый проект Red Hat, возглавляемый Гэвином Кингом. Кинг является основателем проекта Hibernate — решения для реализации персистентности в рамках языка Java. Хотя Кинг является фанатом технологии Java — одного из первых языков, пригодных для масштабной разработки, — он говорит, что неоднократно разочаровывался в этом языке (в том числе в таких языковых сложностях, как дженерики, спешно разработанный и малопонятный Standard Edition SDK, неуклюжий синтаксис аннотаций, непродуманная блочная структура, зависимость от XML и т.д.).

В итоге Кинг задался вопросом: как должен был бы выглядеть язык с учетом уроков, извлеченных из преимуществ и недостатков языка Java и SDK? Его ответом стал Ceylon, статически типизированный язык, который сохраняет некоторые из лучших особенностей языка Java (и работает на JVM), но при этом обладает лучшей читаемостью, встроенной модульностью, а также включает ряд возможностей функциональных языков, такие как функции высшего порядка. Ceylon также включает в себя возможности C и Smalltalk. Во многом похожий на Java, этот новый язык ориентирован на бизнес-приложения, но при этом гибок и полезен и в других областях.

Некоторые называют Ceylon «убийцей» Java (возможно, из-за вопросов о будущем языка Java), но на самом деле Ceylon работает на JVM, так что это расширение Java-технологии, а не ее замена. Использование виртуальной машины Java для поддержки выполнения Ceylon — это идеальная модель, потому что это означает переносимость Ceylon (как и Java) на все множество архитектур, которые в настоящее время поддерживают JVM.


Возможности языка Ceylon

Большинство современных языков не поддаются простой классификации, предоставляя целый спектр различных стилей программирования. Ceylon — не исключение. Ceylon — это статически типизированный язык (что означает, что проверка типов производится во время компиляции, в отличие от динамически типизированных языков, таких как Lisp, где проверка типов производится во время выполнения). Ceylon — объектно-ориентированный язык, как Java, а также поддерживает функции высшего порядка (что означает, что входные и выходные параметры функций сами могут быть функциями). Он имеет типичный синтаксис в стиле C. В Java функции высшего порядка непосредственно не поддерживаются, так что эта особенность является одним из уникальных различий между этими двумя языками.

Иногда, однако, усовершенствования заключаются скорее в том, что убирается из языка, чем в том, что в него добавляется. В Ceylon многие элементы языка Java удалены или упрощены и заменены более простой схемой. Одним из примеров упрощения является удаление ключевых слов public, protected и private. Вместо этого Ceylon просто имеет аннотацию shared, которая определяет, какие элементы класса видны снаружи. В Ceylon также исключена возможность перегрузки, но предусмотрены обходные пути для этой функциональности (такие как упорядоченные параметры и параметры по умолчанию) с более простым синтаксисом.

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


Ceylon на примере

Хотя на момент написания этой статьи пригодный для использования компилятор еще не опубликован, структура языка Ceylon уже определена, что позволяет разрабатывать примеры приложений, чтобы исследовать язык и судить о его применимости и читабельности. В этом разделе рассматривается несколько примеров приложений на Ceylon, иллюстрирующих его структуру.

Hello World

На примере "Hello World" я проиллюстрирую процесс создания простой программы для вывода простой текстовой строки на экран. Пример, показанный в листинге 1, содержит метод верхнего уровня под названием hello, в котором вызывается метод writeLine для выдачи текстовой строки на стандартный вывод.

Листинг 1. Программа Hello World на языке Ceylon
doc "Hello World Program"
by "Gavin King"
void hello() {
  writeLine( "Hello World." );
}

Обратите также внимание на аннотацию, служащую для документирования API (аналогично таким инструментам, как doxygen), которая позволяет указать метод и автора (аннотации doc и by соответственно).

Типы данных в Ceylon

Ceylon включает в себя традиционный набор типов, которые реализуются как обычные классы:

  • Natural. Беззнаковое целое, включая 0.
  • Integer. Целое число со знаком.
  • Float. Число с плавающей точкой.
  • Whole. Целое число произвольной точности со знаком.
  • Decimal. Десятичная дробь произвольной точности и произвольной величины.

По умолчанию типы Natural, Integer и Float 64-разрядные, но вы можете снабдить их аннотацией small, чтобы указать 32-разрядную точность.

Классы в Ceylon

Поскольку Ceylon — объектно-ориентированный язык, код строится из классов. Тип Class в Ceylon инкапсулирует набор операций (которые называются методами) и состояние, а также определение того, как состояние инициализируется при инициализации объекта класса (инициализатор класса, подобный конструктору).

Чтобы понять подход Ceylon, рассмотрим простой класс. В листинге 2 приведен простой класс для счетчика. Строка 2 определяет класс с необязательным значением, что означает, что пользователь может как определить его, так и не определять; это значение обозначается шаблоном Type?. Вместо конструктора тело класса содержит инициализатор класса. Этот код определяет приватную переменную (никакие переменные не видны снаружи, пока не аннотированы как shared), а затем задает логику инициализации. Сначала вы проверяете наличие начальной переменной. Если она есть, она используется в качестве начального значения для вашего счетчика. Ваш первый метод, аннотированный как shared и поэтому видимый снаружи класса, определяет операцию увеличения значения счетчика. При вызове этот метод просто увеличивает ваш счетчик.

Наконец, вы определяете метод-получатель, который возвращает текущее значение счетчика для пользователя, и метод-установщик, который устанавливает в качестве текущего значения счетчика значение, предоставленное пользователем. Обратите внимание на использование здесь ключевого слова assign для создания атрибута переменной для установки значения счетчика. В дополнение к иным методам обработки конструкторов (код встроен в класс), здесь нет деструкторов и нет возможности реализовать несколько конструкторов (еще одно отличие от языка Java).

Листинг 2. Простой класс в Ceylon
01    doc "Simple Counting Class"
02    class Counter( Natural? start ) {
03    
04      doc "Class Initializer"
05      variable Natural count := 0;
06      if (exists start) {
07        count := start;
09      }
10    
11      doc "The incrementer"
12      shared void increment() {
13        count++;
14      }
15    
16      doc "The getter"
17      shared Natural currentValue {
18        return count;
19      }
20
21      doc "The setter"
22      shared assign currentValue {
23        count := currentValue;
24      }
25
26    }

Теперь, когда наш простой класс определен, давайте посмотрим, как использовать этот класс в Ceylon. Листинг 3 содержит блок кода, который использует ваш класс Counter. Он начинается с создания экземпляра класса — объекта cnt. Обратите внимание, что в Ceylon нет ключевого слова new. Определив новый объект Counter вы вызываете метод increment, а затем возвращает значение Counter с помощью метода-получателя. Обратите внимание, что операторы = и := в Ceylon различаются: спецификатор = используется только для неизменяемых значений, а присвоение значения переменной осуществляется с помощью оператора :=.

Листинг 3. Использование класса Counter
01    Counter cnt = Counter(1);
02    cnt.increment();
03    writeLine( c.currentValue );

Ceylon поощряет максимально широкое использование неизменяемых атрибутов. Это означает, что объект инициализируется значением и более не изменяется. Чтобы указать, что именованное значение является изменяемым (может быть изменено после инициализации), его необходимо снабдить аннотацией variable, как показано в листинге 2 в строке 5.

Еще один элемент, на который стоит обратить внимание, — важнейшее отличие управляющих структур Ceylon. Обратите внимание, что во многих языках фигурные скобки ({}) после условного выражения могут быть опущены, например, если далее следует одиночное выражение:

if (cnt > 10) statement();

В Ceylon такой синтаксис запрещен и наличие скобок обязательно. Это означает, что показанный выше образец кода должен быть написан на Ceylon в следующем виде:

if (cnt > 100) { statement(); }

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

Функции высшего порядка

В Ceylon реализован элемент функционального стиля программирования — т.н. функции первого порядка. Это означает, что функции рассматриваются как объекты первого класса и могут использоваться в качестве параметров функций, а также могут возвращаться из функций. Возьмем пример определения метода repeat из презентации Кинга (см. листинг 4). В данном случае метод принимает два аргумента: количество повторений (Natural) и функцию, которую необходимо вызывать. В теле метода repeat вы просто создаете цикл for (используя диапазон) и вызываете метод, который передается в качестве функционального параметра.

Листинг 4. Функции высокого уровня в Ceylon
01    void repeat( Natural times, void hfunction() ) {
02      for (Natural n in 1..times) {
03        hfunction();
04      }
05    }

Использовать этот метод легко, как показано в строке 7 листинга 5. Как видно, имя метода используется без аргументов.

Листинг 5. Использование функций высшего уровня в Ceylon
01    void sayhello() {
02      writeLine( "Hello World." );
03    }
04
05    ...
06
07      repeat( 10, sayhello );

В отличие от других языков с поддержкой функционального программирования, Ceylon не поддерживает анонимные функции (неименованные функции, которые появляются непосредственно в выражениях). В то же время он поддерживает замыкания (которые по существу являются функциями, которые могут ссылаться на состояние в другой функции).

Уточнение типов

Ceylon не включает оператор instanceof из языка Java, а также не имеет приведения типов, как в С. Вместо этого в Ceylon реализовано т.н. уточнение типа, которое позволяет за один шаг выполнить проверку и ограничение типа объектной ссылки. Рассмотрим фрагмент кода, приведенный в листинге 6. Этот код содержит специальную конструкцию (is ... ) для проверки объектной ссылки на соответствие заданному типу. После того как тип определен, используется специфический для этого типа метод. Эта конструкция похожа на конструкцию (exists ...), которую вы видели ранее в листинге 2 для необязательных параметров.

Листинг 6. Уточнение типа в Ceylon
01    Object obj = <some object>;
02    
03    switch (obj)
04    
05      case (is Counter) {
06        obj.increment();
07      }
08      case (is ComplexCounter) {
09        obj.incrementBy(1);
10      }
11      else {
12        stream.writeLine("Unknown object");
13      }

Ceylon имеет еще одну похожую конструкцию, определяемую как (nonempty ...), которую можно применить к последовательностям (массивы или списки), чтобы определить, что последовательность не содержит элементов, и поэтому соответствующие операции к ней применяться не могут.

Наконец, обратите внимание на синтаксис выражения switch, который отличается и от С, и от Java. Там, где эти два языка могут быть подвержены ошибкам, Ceylon навязывает блочную структуру для вариантов и исключает вариант default, отдавая предпочтение блоку else. Ceylon также проверяет (во время компиляции), что выражение switch содержит исчерпывающий перечень проверок случаев или как минимум выражение else для обеспечения полного охвата. Компилятор автоматически проверяет выражение switch и выдает ошибку, если какой-то случай не охвачен.

Другие управляющие структуры

Fail или else

Как вы можете видеть из комментариев читателей ниже, возможности языка активно обсуждаются. Блок fail в том виде, как он описан здесь, является результатом непреждевременного выхода из цикла. В качестве возможной альтернативы также рассматривается подход с использованием вместо fail оператора else, указывающего, что альтернативная часть цикла представляет собой блок выбора.

Как и следовало ожидать, Ceylon реализует традиционные выражения if...else, а также средства обработки исключений языка Java(try, catch, finally). Ceylon также вводит блок под названием fail, который используется с циклами for, чтобы определить, когда они не прекращаются преждевременно. Рассмотрим пример, показанный в листинге 7.

Листинг 7. Блок fail в Ceylon
01 for (Instrument i in instruments) {
02   if (i.failing()) {
03     break;
04   }
05 }
06 fail {
07   // Все instruments работают...
08 }

Этот шаблон проектирования принят как в С, так и в Java и поэтому является полезным дополнением к Ceylon.


Будущее Ceylon

Кинг отмечает, что Ceylon является результатом коллективной работы, и призывает разработчиков и тестировщиков программного обеспечения помогать в проектировании, построении и проверке языка и SDK. Этот призыв также может стимулировать отклики от пользователей Java, чтобы поддержать их переход на Ceylon. Кинг по-прежнему ничего не сообщает о текущем состоянии Ceylon и только говорит, что существуют спецификация языка и грамматика, написанная на ANTLR (Another Tool for Language Recognition).


Глядя в будущее

Хотя необходимость очередного нового языка многим может показаться спорной, языки программирования можно рассматривать и с другой точки зрения — как набор инструментов, который можно использовать для решения проблем. Не каждый язык подходит или идеален для каждой отдельно взятой задачи, но многие языки отлично подходят для конкретных областей, поэтому наличие множества языков — это благо, а не проклятие. Поскольку Ceylon все еще находится в стадии разработки, неизвестно, сможет ли он найти свое место в рядах популярных языков, используемых сегодня. Но этот язык содержит много интересных функций, так что его будет интересно изучить в действии, когда он наконец появится.

Ресурсы

Научиться

Получить продукты и технологии

  • Оценивайте продукты IBM (EN) так, как вам удобнее: скачивайте ознакомительные версии, испытывайте продукты в онлайновом режиме, используйте продукты в облачной среде или проведите несколько часов в песочнице SOA (EN), чтобы узнать, как можно эффективно использовать сервис-ориентированную архитектуру.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



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

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Open source
ArticleID=801025
ArticleTitle=Ceylon: Реальный прорыв или просто очередной язык?
publish-date=03072012