Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Ракетка является универсальным , мульти-парадигмы языка программирования на основе схемы диалекта Лиспа . Он разработан как платформа для разработки и реализации языков программирования . [9] В дополнение к основному языку Racket, Racket также используется для обозначения семейства языков программирования [10] и набора инструментов, поддерживающих разработку в Racket и с его помощью. [11] Racket также используется для написания сценариев , обучения информатике и исследований.

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

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

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

История [ править ]

Развитие [ править ]

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

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

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

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

История версий [ править ]

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

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

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

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

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

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

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

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

Особенности [ править ]

Базовый язык Racket включает макросы , модули , лексические замыкания , хвостовые вызовы , продолжения с разделителями , [38] параметры (переменные переменной), программные контракты , [39] зеленые и потоки ОС , [40] [41] [42] и многое другое. Язык также поставляется с примитивами, такими как пространства событий и хранители, которые контролируют управление ресурсами и позволяют языку действовать как операционная система для загрузки и управления другими программами. [12] Дальнейшие расширения языка создаются с помощью мощной системы макросов, которая вместе с системой модулей и настраиваемыми синтаксическими анализаторами может управлять всеми аспектами языка. [43] В отличие от языков программирования, в которых отсутствуют макросистемы, большинство языковых конструкций в Racket написано на базовом языке с использованием макросов. Они включают в себя Mixin систему класса, [16] компонент (или модуль) системы в качестве выразительных как ML в непрозрачном приписывание , [17] и сопоставление с образцом .

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

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

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

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

Встроенная расширяемость языка и макросы [ править ]

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

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

Макро система в Ракетке была использована для построения целых языковых диалектов . Это включает в себя типизированные ракетки, которая постепенно напечатанный диалект Ракетки , что облегчает миграцию из нетипизированных к типизированному коду, [49] Ленивая Ракетка-говор с ленивой оценкой , [50] и Hackett, который сочетает в себе Haskell и ракетку. [51] Педагогический язык программирования Pyret изначально был реализован в Racket. [52] [53]

Другие диалекты включают FrTime ( функциональное реактивное программирование ), Scribble (язык документации), [54] Slideshow ( язык представления ) [55] и несколько языков для обучения. [56] [57] Основной дистрибутив Racket предоставляет библиотеки, помогающие в процессе создания новых языков программирования. [18]

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

Среда программирования [ править ]

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

DrRacket IDE [ править ]

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

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

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

Примеры кода [ править ]

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

#lang ракетка "Hello, World!"

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

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


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

Результат этой программы, как показано в DrRacket
#lang racket ( требуется  2htdp / изображение )( let  sierpinski  ([ n  8 ])  ( if  ( zero?  n )  ( треугольник  2  ' сплошной  ' красный )  ( let  ([ t  ( sierpinski  ( -  n  1 ))])  ( заморозить  ( над  t  ( рядом с  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 есть обширная библиотека, которая охватывает системное и сетевое программирование, веб-разработку [59], единый интерфейс для базовой операционной системы, динамический интерфейс внешних функций , [60] несколько разновидностей регулярных выражений , генераторы лексических / парсеров. , [58] логическое программирование и полный графический интерфейс .

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

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

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

Ссылки [ править ]

  1. ^ "Выпуск 8.0" . 4 февраля 2021 . Проверено 14 февраля 2021 года .
  2. ^ Тобин-Хохштадт, Сэм; Джерард, Сейдж; Дук, Джоэл; Флэтт, Мэтью ; Software Freedom Conservancy ; Честек, Памела (2019-11-15). «Завершение перелицензирования Racket» . Проверено 27 декабря 2019 .
  3. ^ "DrRacket Files" . Проверено 21 июля 2019 . Стандартное расширение файла программы Racket - «.rkt». Расширения «.ss», «.scm» и «.sch» также исторически популярны.
  4. ^ Стрикленд, TS; Феллезисен, Маттиас (2010). «DLS 2010: Контракты для первоклассных классов» (PDF) .
  5. ^ Боннер-сержант, Амвросий (2012). Практическая система дополнительных типов для Clojure (тезис). Университет Западной Австралии.
  6. ^ "Вопросы Planet2" .
  7. ^ «Библиография Ржавчины» .
  8. ^ Спербер, Майкл; Дибвиг, Р. Кент; Флэтт, Мэтью; Ван Страатен, Антон; и другие. (Август 2007 г.). «Пересмотренный отчет 6 по алгоритмической языковой схеме (R6RS)» . Руководящий комитет схемы . Проверено 13 сентября 2011 .
  9. ^ a b Felleisen, M .; Финдлер, РБ; Flatt, M ​​.; Krishnamurthi, S .; Barzilay, E .; McCarthy, J .; Тобин-Хохштадт, С. (2015). "Манифест ракетки" (PDF) . Труды Первого саммита по достижениям в языках программирования : 113–128.
  10. ^ "Диалекты ракетки и схемы" . Проверено 15 августа 2011 .
  11. ^ "Добро пожаловать в Racket" . Проверено 15 мая 2019 .
  12. ^ a b Flatt; Финдлер; Кришнамурти; Фелляйзен (1999). Языки программирования как операционные системы (или «Месть сына Лисп-машины») . Международная конференция по функциональному программированию.
  13. ^ а б в Финдлер; Клементс; Фланаган; Flatt; Кришнамурти; Стеклера; Фелляйзен (2001). "DrScheme: среда программирования для схемы" (PDF) . Журнал функционального программирования .
  14. ^ Felleisen; Финдлер; Flatt; Кришнамурти (2004). «Проект TeachScheme!: Вычисления и программирование для каждого студента» . Журнал компьютерного образования .
  15. ^ «Обзор» . Программа по дизайну . Проверено 17 августа 2011 .
  16. ^ a b c Flatt, M ​​.; Финдлер, РБ; Фелляйзен, М. (2006). «Схема с классами, миксинами и признаками» (PDF) . Азиатский симпозиум по языкам и системам программирования .
  17. ^ a b Flatt, M ​​.; Фелляйзен, М. (1998). «Юниты: Классные модули для горячих языков» . Разработка и реализация языков программирования .
  18. ^ a b c d Tobin-Hochstadt, S .; St-Amour, V .; Culpepper, R .; Flatt, M ​​.; Фелляйзен, М. (2011). «Языки как библиотеки» (PDF) . Разработка и реализация языков программирования .
  19. ^ Фелляйзен, Матиас; Финдлер, Роберт Брюс; Флэтт, Мэтью; Кришнамурти, Шрирам; Барзилай, Эли; Маккарти, Джей; Тобин-Хохштадт, Сэм (2018). «Программируемый язык программирования» . Коммуникации ACM . 61 (3): 62–71. DOI : 10.1145 / 3127323 . S2CID 3887010 . 
  20. ^ «Ракетка: Лицензия на программное обеспечение» . Проверено 20 октября 2015 .
  21. Перейти ↑ Benson, Brent W. Jr. (26–28 октября 1994 г.). "libscheme: Схема как библиотека C" . Написано в Санта-Фе, штат Нью-Мексико. Материалы симпозиума USENIX по языкам очень высокого уровня . Беркли, Калифорния: Ассоциация USENIX. С. 7–19. ISBN 978-1880446652. Проверено 7 июля 2013 года .
  22. ^ a b c «Восстановление графического слоя Racket» . 2010-12-08 . Проверено 11 декабря 2017 .
  23. ^ Clements, J .; Flatt, M ​​.; Фелляйзен, М. (2001). «Моделирование алгебраического шагового двигателя» (PDF) . Европейский симпозиум по языкам программирования .
  24. ^ a b c «Примечания к выпуску ядра Racket Core» . Архивировано из оригинала на 2013-05-23 . Проверено 15 апреля 2012 .
  25. ^ Flatt, М. (2002). «Составные и компилируемые макросы». Международная конференция по функциональному программированию .
  26. ^ "Версия схемы PLT 4.0" . 2008-06-12. Архивировано из оригинала на 2013-05-23 . Проверено 7 августа 2012 .
  27. ^ «От схемы PLT к ракетке» . Racket-lang.org . Проверено 17 августа 2011 .
  28. ^ «Ракетка 5.2» . PLT, Inc. 2011-11-09 . Проверено 16 июня 2012 .
  29. ^ «Подмодули» . 2012-06-03 . Проверено 7 августа 2012 .
  30. ^ «Ракетка 5.3» . PLT, Inc. 2012-08-07 . Проверено 7 августа 2012 .
  31. ^ «Ракетка 5.3.1» . PLT, Inc. 2012-11-07 . Проверено 7 ноября 2012 .
  32. ^ «Ракетка 6.0» . PLT, Inc. 2014-02-26 . Проверено 23 февраля 2016 .
  33. ^ "Racket-on-Chez Статус: январь 2018" . 2018-01-05. Архивировано из оригинала на 2018-04-13 . Проверено 13 апреля 2018 .
  34. ^ «Строительство Ракетки по Схеме Chez (Отчет об опыте)» (PDF) . 2019-08-01 . Проверено 25 июля 2019 .
  35. ^ «Релиз Racket 7.5» . Packt Hub . Проверено 28 ноября 2019 .
  36. ^ "Ракетка v7.5" . Ракетка | Блог . Проверено 28 ноября 2019 .
  37. ^ https://blog.racket-lang.org/2021/02/racket-v8-0.html
  38. ^ Flatt, M ​​.; Ю., Г .; Финдлер, РБ; Фелляйзен, М. (2007). «Добавление элементов управления с разделителями и компонентами в среду производственного программирования» (PDF) . Международная конференция по функциональному программированию .
  39. ^ «Контракты» .
  40. ^ «Нити» .
  41. ^ «Фьючерсы» .
  42. ^ «Места» .
  43. ^ Flatt, Мэтью (2012). «Создание языков в ракетке» . Коммуникации ACM . Проверено 8 апреля 2012 .
  44. ^ Финдлер, РБ; Фелляйзен, М. (2002). «Контракты на функции высшего порядка» (PDF) . Международная конференция по функциональному программированию .
  45. Перейти ↑ Matthews, J. (2006). «Развертывание компонентов с помощью PLaneT: где вы хотите?». Семинар по схемному и функциональному программированию .
  46. ^ "Система пакетов Racket и Планета" .
  47. ^ Flatt, Мэтью (2002). «Составные и компилируемые макросы, когда это нужно?» (PDF) . Международная конференция по функциональному программированию .
  48. ^ Flatt, Culpepper, Darais, Findler, Макросы , которые работают вместе; Привязки времени компиляции, частичное расширение и контексты определения
  49. ^ Tobin-Hochstadt, S .; Фелляйзен, М. (2008). «Разработка и реализация типизированной схемы». Принципы языков программирования .
  50. ^ Barzilay, E .; Клементс, Дж. (2005). «Лень без тяжелой работы: сочетание ленивого и строгого языков для обучения». Функциональное и декларативное программирование в образовании .
  51. ^ "Язык программирования Hackett" . Блог Алексиса Кинга . Проверено 16 июня 2019 .
  52. ^ Pyret Экипаж (24 мая 2011). «Код Пирета; или Обоснование языка программирования Пайрет» . Pyret . Проверено 16 июня 2019 .
  53. ^ "Программирование и языки программирования" . Индекс / . 20 сентября 2017 . Проверено 16 июня 2019 .
  54. ^ Flatt, M ​​.; Barzilay, E .; Финдлер, РБ (2009). «Scribble: закрытие книги об инструментах специальной документации». Международная конференция по функциональному программированию .
  55. ^ Финдлер, РБ; Флатт, М. (2004). «Слайд-шоу: функциональные презентации». Международная конференция по функциональному программированию .
  56. ^ Felleisen, M .; Финдлер, РБ; Flatt, M ​​.; Кришнамурти, С. (2009). «Функциональная система ввода-вывода (или развлечение для первокурсников)» (PDF) . Международная конференция по функциональному программированию .
  57. ^ Felleisen, M .; Финдлер, РБ; Flatt, M ​​.; Кришнамурти, С. (2004). «Структура и интерпретация учебной программы по информатике» (PDF) . Журнал функционального программирования . 14 (4): 365–378. DOI : 10.1017 / S0956796804005076 .
  58. ^ a b «Инструменты парсера: парсинг в стиле lex и yacc» . Проверено 16 августа 2011 .
  59. ^ a b Кришнамурти, Хопкинс; Маккарти; Граунке; Петтиджон; Фелляйзен (2007). «Внедрение и использование веб-сервера схемы PLT» (PDF) . Журнал высшего порядка и символического программирования . 20 (4): 431–460. DOI : 10.1007 / s10990-007-9008-у . S2CID 17731194 .  
  60. ^ Barzilay, E .; Орловский, Д. (2004). «Внешний интерфейс для схемы PLT» (PDF) . Схема и функциональное программирование .
  61. ^ «Функциональные DSL mzScheme в разработке игр» . Проверено 8 мая 2012 .
  62. ^ "Bootstrap" . bootstrapworld.org . Проверено 11 августа 2015 .

Дальнейшее чтение [ править ]

  • Felleisen et al. , 2013. Царство ракетки . Пресс без крахмала.
  • Felleisen et al. , 2003. Как разрабатывать программы . MIT Press.

Внешние ссылки [ править ]

  • Официальный веб-сайт