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

Дилан
Дилан logo.png
Парадигмамультипарадигма: функциональный, объектно-ориентированный
РазработчикСообщество с открытым исходным кодом Компьютер Apple, Арлекин, Университет Карнеги Меллон
Впервые появился1992; 28 лет назад (1992)
Стабильный выпуск
2020.1 / 10 октября 2020 г.; 47 дней назад (2020-10-10)
Печатная дисциплинаСильный, динамичный
ПлатформаIA-32, x86-64
Операционные системыКроссплатформенность
Расширения имени файлаДилан
Интернет сайтопендилан.org
Основной реализации
Открыть Дилан, Гвидион Дилан
Диалекты
инфикс-дилан (AKA Dylan), префикс-дилан (AKA Lisp)
Под влиянием
ЗАКРЫТЬ, АЛГОЛ, Схема, EuLisp
Под влиянием
Лассо, Python, Рубин,Юля[1]

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

Краткий и подробный обзор языка можно найти в Справочном руководстве Дилана.[2]

Дилан происходит от Схема и Common Lisp и добавляет интегрированную объектную систему, основанную на Общая объектная система Lisp (ЗАКРЫТЬ). В Dylan все значения (включая числа, символы, функции и классы ) находятся первоклассные объекты. Дилан поддерживает множественное наследование, полиморфизм, множественная отправка, аргументы ключевого слова, интроспекция объекта, шаблон -основан макросы расширения синтаксиса и многие другие дополнительные функции. Программы могут выражать детальный контроль над динамизмом, допуская программы, которые занимают континуум между динамическим и статическим программированием и поддерживают эволюционное развитие (что позволяет быстро создавать прототипы с последующими постепенными уточнениями и оптимизацией).

Основная цель дизайна Дилана - создать динамический язык, хорошо подходящий для разработки коммерческое программное обеспечение. Дилан пытается решить потенциальные проблемы производительности, вводя «естественные» ограничения для полной гибкости Лисп системы, позволяющие компилятор чтобы четко понимать компилируемые единицы, такие как библиотеки.

Дилан заимствует большую часть своей семантики из Scheme и других Lisp; некоторые реализации Dylan изначально были построены в существующих системах Lisp. Однако у Дилана есть АЛГОЛ -подобный синтаксис вместо синтаксиса префикса, подобного Lisp.

История

Дилан был создан в начале 1990-х годов группой во главе с Компьютер Apple. Когда-то в процессе разработки он предназначался для использования с Яблочный Ньютон компьютер, но реализация Дилана не достигла достаточной зрелости во времени, и Ньютон вместо этого использовал смесь C и NewtonScript разработан Уолтером Смитом. Apple прекратила разработку Dylan в 1995 году, хотя они сделали доступной «технологическую» версию (Apple Dylan TR1), которая включала расширенный интегрированная среда развития (IDE).

Две другие группы внесли свой вклад в разработку языка и реализацию: Арлекин выпустила коммерческую IDE для Майкрософт Виндоус и Университет Карнеги Меллон выпустил Открытый исходный код компилятор для Unix системы под названием Gwydion Dylan. Обе эти реализации теперь имеют открытый исходный код. Реализация Harlequin теперь называется Open Dylan и поддерживается группой добровольцев, Dylan Hackers.

Язык Дилана носил кодовое имя Ральф. Джеймс Хоакин выбрал имя Дилан для «динамического языка».

Синтаксис

Многие синтаксические особенности Дилана берут начало в его наследии Лиспа. Первоначально Дилан использовал синтаксис префиксов, подобный Lisp, который был основан на s-выражения. К тому времени, как разработка языка была завершена, синтаксис был изменен на синтаксис, подобный АЛГОЛу, с ожиданием, что он будет более знаком более широкой аудитории программистов. Синтаксис был разработан Майклом Калем. Это подробно описано в Справочном руководстве Дилана.[2]

Лексический синтаксис

Дилан не чувствительный к регистру. Дилана лексический синтаксис позволяет использовать соглашение об именах, где дефис-минус знаки используются для соединения частей идентификаторов, состоящих из нескольких слов (иногда называемых "шепелявый случай " или же "чехол для шашлыка "). Это соглашение распространено в языках Lisp, но не может использоваться в языках программирования, которые обрабатывают любой дефис-минус, который не является частью числового буквальный как сингл лексический знак даже когда не окружен пробельные символы.

Помимо буквенно-цифровой символов и дефисов с минусом, Дилан допускает использование некоторых не буквенно-цифровых символов в составе идентификаторов. Идентификаторы не могут состоять только из этих не буквенно-цифровых символов или только из цифровых символов.[2] Если есть двусмысленность, используется пробел.

Пример кода

Простой класс с несколькими слотами:

определять учебный класс <point> (<object>)  слот точка-x :: <integer>,    необходимое-инициализирующее ключевое слово: Икс:;  слот точка-у :: <integer>,    необходимое-инициализирующее ключевое слово: y:;конец учебный класс <point>;

По соглашению классы именуются знаками «меньше» и «больше», используемыми как угловые скобки, например класс по имени <point> в примере кода.

В конечный класс <точка> обе учебный класс и <point> являются необязательными. Это верно для всех конец статьи. Например, вы можете написать конец, если или просто конец прекратить если утверждение.

Тот же самый класс, переписанный минимально возможным способом:

определять учебный класс <point> (<object>)  слот точка-x;  слот точка-у;конец;

Теперь оба слота набираются как <object>. Слоты необходимо инициализировать вручную.

По соглашению имена констант начинаются с символа «$»:

определять постоянный $ pi :: <double-float> = 3.1415927d0;

Факториальная функция:

определять функция факториал (п :: <integer>) => (п! :: <integer>)  дело    п < 0     => ошибка("Нельзя использовать факториал отрицательного целого числа:% d", п);    п = 0     => 1;    иначе => п * факториал(п - 1);  конецконец;

Здесь, п! и <integer> это просто обычные идентификаторы.

Нет явного заявление о возврате. Результатом метода или функции является последнее вычисленное выражение. Это распространенный стиль - оставлять точку с запятой после выражения в позиции возврата.

Модули против пространства имен

Во многих объектно-ориентированных языках классы являются основным средством инкапсуляции и модульности; каждый класс определяет пространство имен и контролирует, какие определения видны извне. Кроме того, классы во многих языках определяют неделимую единицу, которая должна использоваться как единое целое. Например, используя Нить функция конкатенации требует импорта и компиляции для всех Нить.

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

В Дилане концепции compile-unit и import-unit разделены, и классы не имеют к ним никакого отношения. А библиотека определяет элементы, которые следует скомпилировать и обрабатывать вместе, а модуль определяет пространство имен. Классы могут быть объединены в модули или разрезаны по желанию программиста. Часто полное определение класса не существует в одном модуле, а распределено по нескольким, которые при желании могут быть собраны вместе. В разных программах могут быть разные определения одного и того же класса, включая только то, что им нужно.

Например, рассмотрим дополнительную библиотеку для регулярное выражение поддержка на Нить. В некоторых языках, чтобы функциональность была включена в строки, функциональность должна быть добавлена ​​в Нить пространство имен. Как только это произойдет, Нить class становится больше, и функции, которым не нужно использовать регулярное выражение, все равно должны «платить» за это увеличением размера библиотеки. По этой причине подобные надстройки обычно помещаются в свои собственные пространства имен и объекты. Обратной стороной этого подхода является то, что новые функции больше не являются часть Нить; вместо этого он изолирован в собственном наборе функций, которые должны вызываться отдельно. Вместо myString.parseWith (myPattern), что было бы естественной организацией с точки зрения объектно-ориентированного подхода, что-то вроде myPattern.parseString (myString) используется, что эффективно меняет порядок.

Под Диланом многие интерфейсы могут быть определены для одного и того же кода, например, метод конкатенации строк может быть размещен как в интерфейсе String, так и в интерфейсе «конкатенация», который собирает вместе все различные функции конкатенации из различных классов. Это чаще используется в математических библиотеках, где функции, как правило, применимы к очень разным типам объектов.

Более практичным использованием конструкции интерфейса является создание общедоступных и частных версий модуля, которые другие языки включают в качестве болт на функция, которая неизменно вызывает проблемы и добавляет синтаксис. В соответствии с Диланом, каждый вызов функции можно просто разместить в интерфейсе «Частный» или «Разработка» и собрать общедоступные функции в Общественные. Под Ява или же C ++ видимость объекта определяется в коде, а это означает, что для поддержки аналогичного изменения программист будет вынужден полностью переписать определения и не может иметь две версии одновременно.

Классы

Классы в Дилане описывают слоты (элементы данных, поля, ivars и т. д.) объектов аналогично большинству объектно-ориентированных языков. Весь доступ к слотам осуществляется через методы, как в Болтовня. Методы получения и установки по умолчанию генерируются автоматически на основе имен слотов. В отличие от большинства других объектно-ориентированных языков, другие методы, применимые к классу, часто определяются вне класса, и поэтому определения классов в Dylan обычно включают только определение хранилища. Например:

определять учебный класс <window> (<view>)  слот заглавие :: <string> = "без названия", ключевое слово инициализации: заглавие:;  слот позиция :: <point>, необходимое-инициализирующее ключевое слово: позиция:;конец учебный класс;

В этом примере класс "<window>"определен. Синтаксис используется только в соглашении, чтобы имена классов выделялись - угловые скобки являются просто частью имени класса. Напротив, в некоторых языках принято использовать заглавную букву класса имя или добавить к имени префикс C или же Т (Например). <window> наследуется от одного класса, <view>, и содержит два слота, заглавие удерживая строку для заголовка окна, и позиция удерживая точку X-Y для угла окна. В этом примере заголовку присвоено значение по умолчанию, а позиции - нет. Необязательный init-ключевое слово синтаксис позволяет программисту указать начальное значение слота при создании экземпляра объекта класса.

В таких языках, как C ++ или Java, класс также определяет свой интерфейс. В этом случае в приведенном выше определении нет явных инструкций, поэтому на обоих языках рассматривается доступ к слотам и методам. защищенный, то есть они могут использоваться только подклассами. Чтобы разрешить несвязанному коду использовать экземпляры окна, они должны быть объявлены общественный.

В Дилане такие правила видимости считаются не частью кода, а частью системы модуля / интерфейса. Это добавляет значительную гибкость. Например, один интерфейс, используемый на ранней стадии разработки, мог бы объявить все общедоступным, тогда как тот, который использовался при тестировании и развертывании, мог ограничить это. В C ++ или Java эти изменения потребуют изменений в исходном коде, поэтому люди не будут этого делать, тогда как в Dylan это совершенно не связанная концепция.

Хотя в этом примере он не используется, Дилан также поддерживает множественное наследование.

Методы и общие функции

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

В Java одни и те же методы будут изолированы в определенном классе. Чтобы использовать эту функциональность, программист вынужден: импорт этот класс и ссылаться на него явно для вызова метода. Если этот класс недоступен или неизвестен во время компиляции, приложение просто не скомпилируется.

В Дилане код изолирован от хранилища в функции. У многих классов есть методы, которые вызывают свои собственные функции, благодаря чему они выглядят и ощущаются как большинство других объектно-ориентированных языков. Однако код также может находиться в общие функции, что означает, что они не привязаны к определенному классу и могут быть вызваны кем угодно. Связывание конкретной универсальной функции с методом в классе выполняется следующим образом:

определять метод посинеть (ш :: <window>)  ш.цвет := $ синий;конец метод;

Это определение похоже на определение в других языках и, вероятно, будет заключено в <window> учебный класс. Обратите внимание на вызов: = setter, который синтаксический сахар за установщик цвета ($ blue, w).

Полезность общих методов становится очевидной, когда вы рассматриваете более «общие» примеры. Например, одна общая функция на большинстве языков - это нанизывать, который возвращает некоторые человек читаемый форма для объекта. Например, окно может возвращать заголовок и позицию в скобках, а строка - сама себя. В Дилане все эти методы можно было собрать в один модуль под названием "нанизывать", тем самым удалив этот код из определения самого класса. Если конкретный объект не поддерживает нанизывать, его можно легко добавить в нанизывать модуль.

Расширяемость

Вся эта концепция может показаться некоторым читателям очень странной. Код для обработки нанизывать для окна не определено в <window>? Это может не иметь никакого смысла, пока вы не рассмотрите, как Дилан обрабатывает вызов нанизывать. На большинстве языков[который? ] при компиляции программы нанизывать за <window> ищется и заменяется указателем (более или менее) на метод. В Дилане это происходит при первом запуске программы; то время выполнения строит таблицу с подробностями имени метода / параметров и динамически ищет методы через эту таблицу. Это означает, что функция для определенного метода может быть расположена где угодно, а не только в единице времени компиляции. В конце концов, программисту предоставляется значительная гибкость с точки зрения того, где разместить свой код, собирая его по линиям классов, где это необходимо, и по функциональным линиям, где это не так.

Подразумевается, что программист может добавлять функциональные возможности к существующим классам, определяя функции в отдельном файле. Например, вы можете добавить проверку орфографии ко всем <string>s, который на большинстве языков требует доступа к исходному коду строкового класса, а такие базовые классы редко выдаются в исходной форме. В Дилане (и других «расширяемых языках») метод проверки орфографии может быть добавлен в проверка орфографии модуль, определяющий все классы, к которым он может применяться через определить метод построить. В этом случае фактическая функциональность может быть определена в одной универсальной функции, которая принимает строку и возвращает ошибки. Когда проверка орфографии модуль скомпилирован в вашу программу, все строки (и другие объекты) получат дополнительную функциональность.

Эппл Дилан

Apple Dylan - это реализация Dylan производства компании Компьютер Apple. Первоначально он был разработан для Яблочный Ньютон товар.

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

  1. ^ Стокель-Уокер, Крис. «Джулия: язык Златовласки». Приращение. Полоса. Получено 23 августа 2020.
  2. ^ а б c Андрей Шалит; Дэвид Мун; Орка Старбак (11 сентября 1996 г.). Справочное руководство Дилана. Apple Press. Эддисон-Уэсли. ISBN  9780201442113.

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