Ракетка (язык программирования) - Racket (programming language)

Ракетка
Racket-logo.svg
Drracket.png
DrRacket на Ubuntu
Парадигма Мультипарадигма : функциональная , императивная , логическая , мета , модульная , объектно-ориентированная , рефлексивная.
Семья Лисп
Разработано PLT Inc.
Разработчик PLT Inc.
Впервые появился 1995 ; 26 лет назад ( 1995 )
Стабильный выпуск
8.1  Отредактируйте это в Викиданных / 4 мая 2021 г . ; 46 дней назад ( 4 мая 2021 г. )
Печатная дисциплина Динамичный , статичный , сильный
Платформа x86 , PowerPC , SPARC , MIPS , ARM
Операционные системы Кроссплатформенность
Лицензия MIT или Apache 2.0
Расширения имени файла .rkt
Веб-сайт racket-lang .org
Диалекты
FrTime, Lazy Racket, Scribble, Typed Racket
Под влиянием
Эйфелева , Схема
Под влиянием
Clojure , Ржавчина , Схема

Racket - это универсальный , мультипарадигмальный язык программирования, основанный на диалекте Scheme Lisp . Он разработан как платформа для разработки и реализации языков программирования . В дополнение к основному языку Racket, Racket также используется для обозначения семейства языков программирования и набора инструментов, поддерживающих разработку на Racket и вместе с ним. Racket также используется для написания сценариев , обучения информатике и исследований.

Платформа Racket предоставляет реализацию языка Racket (включая систему времени выполнения , библиотеки и JIT-компилятор ) вместе с интегрированной средой разработки DrRacket (IDE), написанной на Racket. Racket используется информационно-пропагандистской программой ProgramByDesign , цель которой - превратить информатику в «неотъемлемую часть учебной программы по гуманитарным наукам ».

Основной язык Racket известен своей обширной макросистемой , которая позволяет создавать встроенные и предметно-ориентированные языки , языковые конструкции, такие как классы или модули , и отдельные диалекты Racket с разной семантикой .

Распространение платформы - это бесплатное программное обеспечение с открытым исходным кодом, распространяемое по лицензиям Apache 2.0 и MIT . Расширения и пакеты, написанные сообществом, могут быть загружены в каталог пакетов Racket .

История

Разработка

Маттиас Фелляйзен основал PLT Inc. в середине 1990-х, сначала как исследовательскую группу, а вскоре после этого как проект, посвященный производству педагогических материалов для начинающих программистов (лекции, упражнения / проекты, программное обеспечение). В январе 1995 года группа решила разработать среду педагогического программирования на основе Scheme . Мэтью Флетт сколотил MrEd, оригинальную виртуальную машину для Racket, из libscheme, wxWidgets и нескольких других бесплатных систем. В последующие годы команда, в которую входили Флетт , Робби Финдлер , Шрирам Кришнамурти , Кормак Фланаган и многие другие, разработала DrScheme, среду программирования для начинающих программистов на Scheme и среду исследований для мягкой печати . Основной язык разработки, поддерживаемый DrScheme, назывался PLT Scheme.

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

В последующие годы PLT добавила в DrScheme языки обучения, алгебраический степпер, прозрачный цикл чтения-оценки-печати , принтер на основе конструкторов и многие другие инновации, создав среду разработки педагогических программ прикладного качества. К 2001 году основная команда (Феллейзен, Финдлер, Флатт, Кришнамурти) также написала и опубликовала свой первый учебник « Как разрабатывать программы» , основанный на их философии преподавания.

В Манифесте Racket подробно описаны принципы, лежащие в основе разработки Racket, представлена ​​структура оценки, лежащая в основе процесса проектирования, и подробно описаны возможности для будущих улучшений.

История версий

Первое поколение редакций схемы PLT представило возможности для программирования в целом с модулями и классами . Версия 42 представила модули - первоклассную модульную систему - в дополнение к классам для крупномасштабной разработки. Система классов приобрела функции (например, интерфейсы в стиле Java ), а также потеряла несколько функций (например, множественное наследование ) в этих версиях. Язык развивался на протяжении ряда следующих друг за другом версий и приобрел значительную популярность в версии 53, что привело к обширной работе и следующей версии 100, которая будет эквивалентна выпуску «1.0» в текущих популярных системах версий.

Следующая крупная ревизия получила название «Версия 200», в которой была представлена ​​новая модульная система по умолчанию, которая взаимодействует с макросами. В частности, модульная система обеспечивает разделение вычислений во время выполнения и времени компиляции для поддержки «башни языков». В отличие от юнитов, эти модули не являются первоклассными объектами .

Версия 300 представила поддержку Unicode, поддержку сторонних библиотек и усовершенствования системы классов. Позже в серии 300 улучшена производительность языковой среды выполнения за счет добавления JIT-компилятора и перехода на генеральную сборку мусора по умолчанию .

К следующему основному выпуску проект перешел на более обычную нумерацию версий на основе последовательностей . Версия 4.0 представила #langсокращение для указания языка, на котором написан модуль. Кроме того, в новой версии были введены неизменяемые пары и списки, поддержка мелкозернистого параллелизма и статически типизированный диалект.

7 июня 2010 года PLT Scheme была переименована в Racket. Переименование совпало с выпуском версии 5.0. Впоследствии серверная часть графического пользовательского интерфейса (GUI) была переписана в Racket с C ++ в версии 5.1 с использованием собственных наборов инструментов пользовательского интерфейса на всех платформах. Версия 5.2 включала инструмент фоновой проверки синтаксиса , новую библиотеку построения графиков, библиотеку базы данных и новый расширенный REPL. Версия 5.3 включает новую функцию подмодуля для необязательно загружаемых модулей, новые инструменты оптимизации , библиотеку JSON и другие функции. Версия 5.3.1 внесла значительные улучшения в DrRacket: фоновая проверка синтаксиса была включена по умолчанию, и был добавлен новый инструмент предварительного просмотра документации.

В версии 6.0 Racket выпустила систему управления пакетами второго поколения. В рамках этой разработки основной репозиторий DrRacket и Racket был реорганизован и разделен на большой набор небольших пакетов, что позволило установить минимальную ракетку и установить только те пакеты, которые необходимы.

Версия 7 Racket была выпущена с новым расширителем макросов, написанным на Racket, в рамках подготовки к поддержке перехода на систему времени выполнения Chez Scheme и поддержки нескольких систем времени выполнения. 19 ноября 2019 года была выпущена Racket 7.5. Лицензия Racket 7.5 была менее строгой. Сейчас они используют либо лицензию Apache 2.0, либо лицензию MIT.

13 февраля 2021 года была выпущена Racket 8.0. Racket 8.0 знаменует собой первый выпуск, в котором Racket CS является реализацией по умолчанию. Racket CS быстрее, проще в обслуживании и разработке, имеет обратную совместимость с существующими программами Racket, имеет лучшую параллельную сборку мусора и обычно дает уменьшение размера сгенерированного кода на 10–30%.

Функции

Основной язык Racket включает макросы , модули , лексические замыкания , хвостовые вызовы , продолжения с разделителями , параметры (переменные), программные контракты , зеленые потоки и потоки ОС и многое другое. Язык также поставляется с примитивами, такими как пространства событий и хранители, которые контролируют управление ресурсами и позволяют языку действовать как операционная система для загрузки и управления другими программами. Дальнейшие расширения языка создаются с помощью мощной системы макросов, которая вместе с системой модулей и настраиваемыми синтаксическими анализаторами может контролировать все аспекты языка. Большинство языковых конструкций в Racket реализовано как макросы на базовом языке. К ним относятся система классов миксинов, система компонентов (или модулей), столь же выразительная, как непрозрачное приписывание в модульной системе ML и сопоставление с образцом .

Кроме того, в языке есть первая контрактная система для языка программирования более высокого порядка . Система контрактов Racket вдохновлена работой « Дизайн по контракту» для Eiffel и расширяет ее для работы со значениями более высокого порядка, такими как первоклассные функции , объекты, ссылочные ячейки и т. Д. Например, объект, который проверяется контрактом, может быть гарантирован для выполнения проверок контракта, когда его методы в конечном итоге вызываются.

Racket включает в себя компиляторы как байт-кода, так и JIT (JIT). Компилятор байт-кода создает внутренний формат байт-кода, выполняемый виртуальной машиной Racket , а JIT-компилятор переводит байт-код в машинный код во время выполнения.

С 2004 года язык также поставляется с PLaneT, менеджером пакетов, который интегрирован в модульную систему, так что сторонние библиотеки можно прозрачно импортировать и использовать. Кроме того, PLaneT имеет встроенную политику управления версиями для предотвращения ада зависимостей .

В конце 2014 года большая часть кода Racket была перенесена в новую систему упаковки, отдельную от основной кодовой базы. Эта новая система упаковки обслуживается клиентской программой raco . Новая система пакетов предоставляет меньше возможностей, чем PLaneT; сообщение Джея Маккарти в блоге Racket объясняет причины изменения и способы дублирования старой системы.

Интегрированная расширяемость языка и макросы

Функции , которые наиболее четко отличают ракетки от других языков в семье Лиспа являются его встроенным языком расширяемость функций , которые поддерживают строительство новых предметно-ориентированные и общее назначение языков. Функции расширяемости Racket встроены в модульную систему, чтобы обеспечить контекстно-зависимый и модульный контроль над синтаксисом. Например, #%appсинтаксическая форма может быть переопределена, чтобы изменить семантику применения функции . Точно так же #%module-beginформа позволяет произвольный статический анализ всего модуля. Поскольку любой модуль может использоваться в качестве языка через #langнотацию, это фактически означает, что практически любой аспект языка может быть запрограммирован и контролироваться.

Особенности расширяемости уровня модуля объединены с Схемой -каком гигиенической макросистемы, которая предоставляет больше возможностей , чем в Lisp система манипуляции с-выражение, схема 84 - й гигиенический простираться-синтаксические макросы или R5RS «s синтаксических правил . Действительно, можно сказать, что макросистема представляет собой тщательно настроенный интерфейс прикладного программирования (API) для расширений компилятора . Используя этот API-интерфейс компилятора, программисты могут добавлять функции и целые предметно-ориентированные языки таким образом, чтобы они были полностью неотличимы от встроенных языковых конструкций.

Макро система в Ракетке была использована для построения целых языковых диалектов . Сюда входят Typed Racket, который представляет собой постепенно типизированный диалект Racket, который упрощает переход от нетипизированного к типизированному коду, Lazy Racket - диалект с ленивым вычислением и Hackett, сочетающий Haskell и Racket. Педагогический язык программирования Pyret изначально был реализован в Racket.

Другие диалекты включают FrTime ( функциональное реактивное программирование ), Scribble (язык документации), Slideshow ( язык презентаций ) и несколько языков для обучения.

Основной дистрибутив Racket предоставляет библиотеки для помощи в разработке языков программирования. Такие языки не ограничиваются синтаксисом на основе s-выражений . В дополнение к обычным расширениям синтаксиса на основе таблиц для чтения директива #langпозволяет вызывать произвольные синтаксические анализаторы, которые могут быть реализованы с помощью библиотеки инструментов синтаксического анализатора. См. Пример такого языка в разделе « Логическое программирование Racket» .

Среда программирования

Языковая платформа предоставляет автономную IDE с именем DrRacket, веб-сервер на основе продолжения , графический пользовательский интерфейс и другие инструменты. Как жизнеспособный инструмент создания сценариев с библиотеками, такими как обычные языки сценариев , его можно использовать для создания сценариев оболочки Unix. Он может анализировать аргументы командной строки и запускать внешние инструменты.

DrRacket IDE

DrRacket (ранее DrScheme) широко используется среди вводных курсов по информатике, которые преподают Scheme или Racket, и известен своей простотой и привлекательностью для начинающих программистов. IDE изначально создавалась для использования с TeachScheme! проект (теперь ProgramByDesign ), информационно-пропагандистская работа Северо-Восточного университета и ряда аффилированных университетов по привлечению старшеклассников к курсам информатики на уровне колледжа.

Редактор обеспечивает выделение синтаксических ошибок и ошибок времени выполнения, сопоставление скобок, отладчик и алгебраический степпер. Его удобные для студентов функции включают поддержку нескольких «языковых уровней» (начинающий студент, средний студент и т. Д.). Он также имеет встроенную поддержку библиотеки и сложные инструменты анализа для продвинутых программистов. Кроме того, модульно-ориентированное программирование поддерживается браузером модулей, контурным обзором, интегрированным тестированием и измерениями покрытия , а также поддержкой рефакторинга . Он обеспечивает интегрированный контекстно-зависимый доступ к обширной гиперссылочной справочной системе под названием «Help Desk».

DrRacket доступен для Windows , macOS , Unix и Linux с системой X Window, и программы ведут себя одинаково на всех этих платформах.

Примеры кода

Вот банальная программа hello world :

#lang racket
"Hello, World!"

Запуск этой программы дает результат:

"Привет мир!"

Вот несколько менее тривиальная программа:

Результат этой программы, как показано в DrRacket
#lang racket
(require 2htdp/image)

(let sierpinski ([n 8])
  (if (zero? n)
    (triangle 2 'solid 'red)
    (let ([t (sierpinski (- n 1))])
      (freeze (above t (beside t t))))))

Эта программа, взятая с веб-сайта Racket, рисует треугольник Серпинского , вложенный до глубины 8.

Используя #langдирективу, исходный файл может быть написан на разных диалектах Racket. Вот пример факториальной программы в Typed Racket, статически типизированном диалекте Racket:

#lang typed/racket

(: fact (Integer -> Integer))
(define (fact n)
  (if (zero? n) 1 (* n (fact (- n 1)))))

Приложения и практическое использование

Помимо основы теории языков программирования , Racket разрабатывался как универсальный язык для производственных систем. Таким образом, в дистрибутиве Racket есть обширная библиотека, которая охватывает системное и сетевое программирование, веб-разработку, унифицированный интерфейс для базовой операционной системы, динамический интерфейс внешних функций , несколько разновидностей регулярных выражений , генераторы лексических / парсеров, логическое программирование и полная структура графического интерфейса .

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

Racket использовался для коммерческих проектов и веб-приложений. Ярким примером является веб-сайт Hacker News , который работает на Arc , разработанной на Racket. Naughty Dog использовала его в качестве языка сценариев в нескольких своих видеоиграх.

Racket используется для обучения студентов алгебре через игровой дизайн в программе Bootstrap .

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

дальнейшее чтение

Внешние ссылки