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

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Racket
Racket logo.png
Класс языка:

мультипарадигмальный:
объектно-ориентированный, процедурный,
рефлективный,
функциональный,
логический,
мета

Появился в:

1994

Автор(ы):

PLT Inc.

Релиз:

5.3.4[1] (8 мая 2013 года)

Система типов:

динамическая, строгая, статическая

Диалекты:

Typed Racket, Lazy Racket, Scribble, FrTime и т. д.

Испытал влияние:

Scheme, Eiffel[2]

Повлиял на:

Scheme[3]

Лицензия

LGPL

Сайт:

http://racket-lang.org/

Платформа:

кроссплатформенный

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

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

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

История[править | править вики-текст]

Создание[править | править вики-текст]

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

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

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

Развитие DrScheme[править | править вики-текст]

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

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

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

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

Racket[править | править вики-текст]

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

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

Тривиальная программа "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'a. Вот пример факториала на Typed Racket, диалекте со статической типизацией:

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

Примечания[править | править вики-текст]

  1. Racket blog, Racket v5.3.4
  2. DLS 2010: Contracts for First-Class Classes (2010). Архивировано из первоисточника 23 мая 2013.
  3. Revised6 Report on the Algorithmic Language Scheme (R6RS). Scheme Steering Committee (August 2007). Проверено 13 сентября 2011. Архивировано из первоисточника 23 мая 2013.
  4. Welcome to Racket. Проверено 15 августа 2011. Архивировано из первоисточника 23 мая 2013.
  5. Dialects of Racket and Scheme. Проверено 15 августа 2011. Архивировано из первоисточника 23 мая 2013.
  6. (1999) "{{{title}}}". Programming Languages as Operating Systems (or, Revenge of the Son of the Lisp Machine). 
  7. 1 2 (2001) «DrScheme: A Programming Environment for Scheme». Journal of Functional Programming.
  8. The TeachScheme! Project: Computing and Programming for Every Student.
  9. Overview. Program by Design. Проверено 17 августа 2011. Архивировано из первоисточника 23 мая 2013.
  10. Macros Matter (3 мая 2007). Проверено 8 августа 2011. Архивировано из первоисточника 23 мая 2013.
  11. 1 2 (2006) "Scheme with Classes, Mixins, and Traits". Asian Symposium on Programming Languages and Systems. 
  12. (1998) "Units: Cool Modules for Hot Languages". Programming Language Design and Implementation. 
  13. (2011) "Languages as Libraries". Programming Language Design and Implementation. 
  14. PLaneT
  15. Matthews, J. (2006). "Component Deployment with PLaneT: You Want it Where?". Scheme and Functional Programming Workshop. 
  16. 1 2 Rebuilding Racket's Graphics Layer (8 декабря 2010). Проверено 23 августа 2011. Архивировано из первоисточника 23 мая 2013.
  17. (2001) "Modeling an Algebraic Stepper". European Symposium on Programming Languages. 
  18. 1 2 3 "Racket Core Release Notes". Проверено 15 апреля 2012. Архивировано из первоисточника 23 мая 2013.
  19. Flatt, M. (2002). "Composable and Compilable Macros". International Conference on Functional Programming. 
  20. PLT Scheme version 4.0 (12 июня 2008). Проверено 7 августа 2012. Архивировано из первоисточника 23 мая 2013.
  21. From PLT Scheme to Racket. Racket-lang.org. Проверено 17 августа 2011. Архивировано из первоисточника 23 мая 2013.
  22. Racket 5.2 (9 ноября 2011). Проверено 16 июня 2012. Архивировано из первоисточника 23 мая 2013.
  23. Submodules (3 июня 2012). Проверено 7 августа 2012. Архивировано из первоисточника 23 мая 2013.
  24. Racket 5.3 (7 августа 2012). Проверено 7 августа 2012. Архивировано из первоисточника 23 мая 2013.
  25. 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

Уроки[править | править вики-текст]

Руководство по стилю[править | править вики-текст]

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