Racket (язык программирования)

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая Gromolyak (обсуждение | вклад) в 06:29, 17 января 2018. Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску
Racket
Изображение логотипа
Класс языка мультипарадигмальный:
объектно-ориентированный, процедурный,
рефлективный,
функциональный,
логический,
мета
Появился в 1994
Автор PLT Inc.
Разработчик Matthias Felleisen[вд]
Расширение файлов .rkt, .rktl, .rktd, .plt, .ss или .scm
Выпуск 6.7 (26 октября 2016)
Система типов динамическая, строгая, статическая
Диалекты Typed Racket, Lazy Racket, Scribble, FrTime и т. д.
Испытал влияние Scheme, Eiffel[1]
Повлиял на Scheme[2]
Лицензия LGPL
Сайт racket-lang.org
Платформа кроссплатформенный

Racket (ранее — PLTScheme) — мультипарадигменный язык программирования общего назначения, принадлежащий семейству Lisp/Scheme. Одно из предназначений racket — создание, разработка и реализация языков программирования[3][4]. Язык используется в различных контекстах: как скриптовый язык, как язык общего назначения, в обучении информатике, в научных исследованиях.

Платформа предоставляет пользователю реализацию языка Racket, включая развитую среду выполнения (англ. run time system)[5], различные библиотеки, JIT-компилятор и т. д., а также среду разработки DrRacket (ранее известную, как DrScheme) написанную на Racket[6]. Эта программная среда используется в учебном курсе ProgramByDesign[англ.] массачусетского технологического института[7][8]. Основной язык Racket отличает мощная макросистема, позволяющая создавать встраиваемые и предметно-ориентированные языки программирования, языковые конструкции (к примеру, классы и модули) и диалекты Racket с различной семантикой[9][10][11][12].

Система является свободным и открытым ПО, распространяемым на условиях LGPL. Расширения и пакеты, написанные сообществом, доступны на PLaneT[13], веб-дистрибутиве системы[14].

История

Создание

Matthias Felleisen[англ.] основал компанию PLT Inc. в середине 1990-х, первоначально - как исследовательскую группу, а вскоре - проект по производству педагогических материалов для начинающих программистов (лекции, упражнения/проекты, программное обеспечение). В январе 1995 было решено разработать учебную среду программирования на языке Scheme. Matthew Flatt[англ.] собрал MrEd, оригинальную виртуальную машину Racket, используя libscheme, wxWidgets и некоторые другие свободные системы[15]. В течение последующих лет команда, в которую входили, в частности, Flatt, Robert Bruce Findler[англ.], Shriram Krishnamurthi[англ.], Cormac Flanagan, и многие другие выпускали среду DrScheme предназначенную для начинающих программистов-схемеров и исследований в области мягкой типизации (комбинации статической и динамической типизации)[6]. Основной язык программирования, поддерживаемый средой назывался PLT Scheme.

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

DrScheme был дополнен учебными языками, пошаговый алгебраический вычислитель (англ. algebraic stepper)[16], прозрачный REPL-цикл, подсистему печати на основе конструкторов (cons) и множество других нововведений, которые сделали DrScheme качественным образовательным продуктом. В 2001 году разработчиками языка была написан и опубликован учебник How to Design Programs[англ.], основанный на их философии обучения программированию.

Развитие DrScheme

В первое поколение версий DrScheme были введены средства для программирования в большом[англ.] c использованием модулей и классов. В версии 42 были добавлены юниты: система модулей — объектов первого класса, позволяющая дополнять модули в процессе разработки больших систем[17]. Система классов была с одной стороны дополнена (в частности интерфейсами в стиле Java), а с другой — сокращена (в частности было удалено множественное наследование)[10]. Язык развивался на протяжении ряда последовательных версий и набрал популярность к версии 53, что ещё ускорило работу над ним и следующая версия 100, стала эквивалентом «1.0».

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

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

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

Racket

7 июня 2010 года, PLT Scheme был переименован в Racket[20], что совпало с выпуском версии 5.0. Впоследствии, в версии 5.1, базовая программа GUI была переписана с C++ на Racket c помощью собственного инструментария пользовательского интерфейса на всех платформах[15]. В версии 5.2 включен инструмент фоновой проверки синтаксиса, новую библиотеку-плоттер, библиотеки баз данных, и новый расширенный REPL[21]. В версию 5.3 включена новая функциональность: подмодули для опционально загружаемых модулей[22] , новые инструменты оптимизации, библиотеку JSON, и другие возможности[23]. В версии 5.3.1 значительно улучшен DrRacket: добавлен новый инструмент просмотра документации, проверка синтаксиса в фоне включена по умолчанию[24].

Примеры кода

Тривиальная программа "hello world" будет выглядеть следующим образом:

#lang racket
"Hello, World!"

При её запуске будет выведено:

"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
(require racket/generator)
(define fib
  (generator
   () (let loop ((x 1)
                 (y 1))
        (yield x)
        (loop y (+ x y)))))

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

#lang typed/racket
(: fact (Integer -> Integer))
(define (fact n)
  (cond [(zero? n) 1]
        [else (* n (fact (- n 1)))]))

Примечания

  1. Strickland, T.S.; Fellesisen, Matthias DLS 2010: Contracts for First-Class Classes (2010). Архивировано из оригинала 23 мая 2013 года.
  2. Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton, et al. Revised6 Report on the Algorithmic Language Scheme (R6RS). Scheme Steering Committee (August 2007). Дата обращения: 13 сентября 2011. Архивировано из оригинала 23 мая 2013 года.
  3. Welcome to Racket. Дата обращения: 15 августа 2011. Архивировано из оригинала 23 мая 2013 года.
  4. Dialects of Racket and Scheme. Дата обращения: 15 августа 2011. Архивировано из оригинала 23 мая 2013 года.
  5. Flatt; Findler; Krishnamurthi; Felleisen (1999). Programming Languages as Operating Systems (or, Revenge of the Son of the Lisp Machine). {{cite conference}}: Неизвестный параметр |booktitle= игнорируется (|book-title= предлагается) (справка)
  6. 1 2 Findler; Clements; Flanagan; Flatt; Krishnamurthi; Steckler; Felleisen (2001). "DrScheme: A Programming Environment for Scheme" (PDF). Journal of Functional Programming.
  7. Шаблон:Cite article
  8. Overview. Program by Design. Дата обращения: 17 августа 2011. Архивировано из оригинала 23 мая 2013 года.
  9. Macros Matter (3 мая 2007). Дата обращения: 8 августа 2011. Архивировано из оригинала 23 мая 2013 года.
  10. 1 2 Flatt, M.; Findler, R. B.; Felleisen, M. (2006). "Scheme with Classes, Mixins, and Traits" (PDF). Asian Symposium on Programming Languages and Systems. {{cite conference}}: Неизвестный параметр |booktitle= игнорируется (|book-title= предлагается) (справка)
  11. Flatt, M.; Felleisen, M. (1998). "Units: Cool Modules for Hot Languages". Programming Language Design and Implementation. {{cite conference}}: Неизвестный параметр |booktitle= игнорируется (|book-title= предлагается) (справка)
  12. Tobin-Hochstadt, S.; St-Amour, V.; Culpepper, R.; Flatt, M.; Felleisen, M. (2011). "Languages as Libraries" (PDF). Programming Language Design and Implementation. {{cite conference}}: Неизвестный параметр |booktitle= игнорируется (|book-title= предлагается) (справка)
  13. PLaneT
  14. Matthews, J. (2006). "Component Deployment with PLaneT: You Want it Where?". Scheme and Functional Programming Workshop. {{cite conference}}: Неизвестный параметр |booktitle= игнорируется (|book-title= предлагается) (справка)
  15. 1 2 Rebuilding Racket's Graphics Layer (8 декабря 2010). Дата обращения: 23 августа 2011. Архивировано из оригинала 23 мая 2013 года.
  16. Clements, J.; Flatt, M.; Felleisen, M. (2001). "Modeling an Algebraic Stepper" (PDF). European Symposium on Programming Languages. {{cite conference}}: Неизвестный параметр |booktitle= игнорируется (|book-title= предлагается) (справка)
  17. 1 2 3 "Racket Core Release Notes". Дата обращения: 15 апреля 2012. Архивировано из оригинала 23 мая 2013 года.
  18. Flatt, M. (2002). "Composable and Compilable Macros". International Conference on Functional Programming. {{cite conference}}: Неизвестный параметр |booktitle= игнорируется (|book-title= предлагается) (справка)
  19. PLT Scheme version 4.0 (12 июня 2008). Дата обращения: 7 августа 2012. Архивировано из оригинала 23 мая 2013 года.
  20. From PLT Scheme to Racket. Racket-lang.org. Дата обращения: 17 августа 2011. Архивировано из оригинала 23 мая 2013 года.
  21. Racket 5.2 (9 ноября 2011). Дата обращения: 16 июня 2012. Архивировано из оригинала 23 мая 2013 года.
  22. Submodules (3 июня 2012). Дата обращения: 7 августа 2012. Архивировано из оригинала 23 мая 2013 года.
  23. Racket 5.3 (7 августа 2012). Дата обращения: 7 августа 2012. Архивировано из оригинала 23 мая 2013 года.
  24. Racket 5.3.1 (7 ноября 2012). Дата обращения: 7 ноября 2012. Архивировано из оригинала 23 мая 2013 года.

Литература

  • Matthias Felleisen, Conrad Barski M.D., David Van Horn, Eight Students of Northeastern University. Realm of Racket: Learn to Program, One Game at a Time!. — no starch press, June 2013. — 312 p. — ISBN 978-1-59327-491-7.

Уроки

Руководство по стилю

Ссылки