Цыпленок (Схема реализации) - Chicken (Scheme implementation)

Схема с курицей
Логотип Chicken Scheme и wordmark.svg
Логотип для куриной схемы
Курица 5.0.0.png
Интерпретатор Chicken 5.0.0, работающий на macOS
ПарадигмыМультипарадигма: функциональный, императив, мета
СемьяЛисп
РазработаноФеликс Винкельманн
РазработчикКуриная команда
Впервые появился20 июля 2000 г.; 20 лет спустя (2000-07-20)[1]
Стабильный выпуск
5.2.0 / 29 февраля 2020; 8 месяцев назад (2020-02-29)
Печатная дисциплинаДинамический, скрытый, сильный
ОбъемЛексический
Язык реализацииСхема, C
ПлатформаIA-32, x86-64, РУКА, MIPS, SPARC 64, PowerPC
Операционные системыКроссплатформенность: Windows, Linux, macOS, FreeBSD, NetBSD, OpenBSD, Солярис, AIX, Хайку, Android, iOS
ЛицензияBSD
Расширения имени файла.scm
Интернет сайтwww.call-cc.org Отредактируйте это в Викиданных
Под влиянием
Лисп, Схема

Курица (стилизован под КУРИЦА) это язык программирования, в частности компилятор и переводчик которые реализуют диалект языка программирования Схема, и который компилирует Scheme исходный код к стандарту C. Это в основном R5RS совместимый и предлагает множество расширений к стандарту. Более новый стандарт R7RS поддерживается через расширение библиотека.[2] Курица бесплатное программное обеспечение с открытым исходным кодом доступно под Лицензия BSD. Он реализован в основном на Scheme, с некоторыми частями на C для повышения производительности или для упрощения встраивания в программы C.

Фокус

Целеустремленность курицы быстро ясна из ее слогана: "Практичная и портативная система Scheme".

Основное внимание Chicken уделяет практическому применению Scheme для написания реального программного обеспечения. Схема хорошо известна своим использованием в Информатика учебные планы и эксперименты с языком программирования, но они не нашли применения в бизнесе и промышленности.[3] Куриное сообщество выпустило большой набор библиотеки выполнять самые разные задачи. Вики-сайт Chicken (программа, на которой она запущена, также является программой Chicken) также содержит список программ, написанных на Chicken.[4]

Другая цель цыпленка - быть портативный. Компилируя промежуточное представление, в данном случае переносимый C (как и Гамбит и Bigloo ), программы, написанные на Chicken, могут быть скомпилированы для общих популярных операционные системы такие как Linux, macOS, Другой Unix-подобный системы, Windows, Хайку, и мобильные платформы iOS и Android.[5] Он также имеет встроенную поддержку кросс-компиляция программы и расширения,[6] что позволяет использовать его на различных Встроенная система платформы.

дизайн

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

Дизайн цыпленка был вдохновлен газетой 1994 года.[7] от Генри Бейкер в котором изложена инновационная стратегия компиляции Scheme в C.Программа Scheme компилируется в C функции. Эти функции C никогда не достигают вернуть заявление; вместо этого они называют новый продолжение по завершении. Эти продолжения являются функциями C и передаются в качестве дополнительных аргументов другим функциям C. Они рассчитываются компилятором.

Пока в этом суть стиль передачи. Новая идея Бейкера - использовать букву C стек вызовов для кучи схемы. Следовательно, могут использоваться обычные операции стека C, такие как автоматическое создание переменных, выделение массива переменного размера и т. Д. Когда стек заполняется (то есть указатель стека достигает вершины стека), вывоз мусора может быть инициирован. Используемый дизайн представляет собой копирование сборщика мусора первоначально разработанный К. Дж. Чейни, который копирует все живые продолжения и другие живые объекты в кучу.[8] Несмотря на это, код C не копирует фреймы стека C, а только объекты Scheme, поэтому он не требует знания реализации C.

В полном объеме куча схемы состоит из стека C в качестве питомник вместе с двумя кучами, необходимыми для сборщика мусора поколений. Такой подход обеспечивает скорость стека C для многих операций и позволяет использовать продолжения как простые вызовы функций C. Кроме того, решение Baker гарантирует асимптотический хвостовое рекурсивное поведение, как того требует стандарт языка Scheme. Реализация в компиляторе Chicken Scheme даже асимптотически безопасно для космоса.

Ограничения и отклонения от стандарта

Chicken Scheme в основном соответствует требованиям R5RS с некоторыми заметными ограничениями и отклонениями.[9] Совместимость с R7RS предоставляется в виде библиотеки расширений.[2]

Базовая система имеет базовую поддержку для UTF-8 символы, однако процедуры индексации строк и манипуляции с ними не поддерживают UTF-8. Существует библиотека расширений, которая добавляет поддержку полной поддержки UTF-8.[10]

Дополнительное программное обеспечение

Курица имеет большой репозиторий программного обеспечения добавленных библиотек и программ, называемых яйца.[11] Эта система очень похожа на RubyGems.[12]

Изначально эти яйца были разработаны в одном центральном хранилище svn,[13] в котором создание тега автоматически приведет к тому, что новая версия расширения станет доступной для загрузки. В настоящее время яйца могут развиваться где угодно и под любыми система контроля версий, сохраняя при этом полуавтоматический управление выпусками при использовании большинства популярных сайтов с кодовым хостингом.[14] Этот метод выпуска не зависит от VCS в том смысле, что пользователю не нужно устанавливать эти VCS. Разработчик может размещать файлы где угодно и даже может отказаться от общедоступного контроля версий и распространять только простые архивы tar.

Для всех выпущенных яиц последняя версия тестируется автоматически как часть непрерывная интеграция обработать. Канонический тест сервер существуют,[15] где основная система и все яйца тестируются ежедневно на соответствие самой последней разрабатываемой версии (для выявления регрессивных ошибок) и самой последней стабильной версии (чтобы убедиться, что все работает для пользователей стабильной системы). Кроме того, любой желающий может добровольно предоставить дополнительные возможности для тестирования на различных устройствах, операционных системах или основных выпусках.

особенности

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

Интерфейс внешней функции

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

Кроме того, существуют библиотеки расширений для взаимодействия с Python,[16] Lua,[17] и Ява, через Собственный интерфейс Java (JNI)[18] или мост.[19]

Кросс-компиляция

Относительно легко кросс-компиляция Код схемы для другой платформы (например, для встроенного использования на устройстве).

Чтобы сделать возможной кросс-компиляцию для кода схемы, Chicken применяет модель раздельной компиляции: скомпилированный модуль состоит из двух общие библиотеки. Одна библиотека содержит фактический код, который будет использоваться во время выполнения (скомпилированный для целевой платформы), а другая - модуль импорта, который будет использоваться для загрузки кода, который выполняется во время компиляции (на платформе хоста), например кода процедурного макроса.

Компилятор Chicken также можно легко скомпилировать. После перевода на C можно просто использовать компилятор C, настроенный для сборки для другой платформы.

Модули и макросы

Начиная с версии 4, Chicken имеет встроенную модульную систему и поддержку низкоуровневых гигиенические макросы через явное переименование макросы[20] (до версии 4 это было доступно через дополнительную библиотеку). Стандарт синтаксические правила макросы также поддерживаются, и неявное переименование макросы[21] что в основном перевернутый версия явного переименования.

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

Удаленный отладчик

Начиная с версии 4.11, Chicken поставляется с отладчиком с именем Перья.[22] Когда код схемы компилируется с необходимой опцией отладки, события отладки вводятся в определенные точки кода. Они реализованы как вызовы функции C, что относительно не требует отладки кода. При отладке он попытается установить TCP-соединение с серверным процессом Feathers, возможно, на другом компьютере. Процесс останавливается, пользователь может установить точки останова и запустить программу. Затем при достижении точки останова клиент (отлаживаемый процесс) входит в командный цикл, который позволяет опрашивать клиента, считывать переменные или изменять их.

Ограниченный статический анализ типа

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

Эта исследователь не допускает межмодульный анализ потока, поэтому его можно использовать только для оптимизации кода, который является частью одного компилируемого модуля (или модуля).

Смотрите также

использованная литература

  1. ^ Винкельманн, Феликс. "Объявление о компиляторе Chicken Scheme-to-C". Группы Google (comp.lang.scheme).
  2. ^ а б Эвхан (2018-11-09). "r7rs (Куриное руководство)". Схема с курицей. Получено 2019-02-28.
  3. ^ «Схема FAQ»., раздел "для чего используется схема?"
  4. ^ Бекс, Питер (sjamaan) (16.08.2018). «Программное обеспечение, написанное на Chicken Scheme». Схема с курицей. Получено 2019-02-26.
  5. ^ «Портативность». Вики Сообщества.
  6. ^ Бекс, Питер (sjamaan) (28 мая 2016 г.). «Перекрестное развитие». Схема с курицей (руководство). Получено 2019-02-26.
  7. ^ Бейкер, Генри (1994). "Минусы не должны ПРОТИВ его аргументов, Часть II: Чейни о M.T.A." Архивировано из оригинал на 2006-03-03.
  8. ^ Чейни, C.J. "Нерекурсивный алгоритм сжатия списка". CACM 13,11 (ноябрь 1970 г.), 677-678.
  9. ^ Бекс, Питер (sjamaan); Винкельманн, Феликс; Марио; svnwiki; Ираиков; 1126; Марио (28 мая 2016 г.). «Подтвержденные отклонения (Куриное руководство)». Схема с курицей. Получено 2019-02-28.CS1 maint: числовые имена: список авторов (ссылка на сайт)
  10. ^ Бекс, Питер (sjamaan); коуда; Марио; svnwiki; васамаса; кон; марио (2018-08-11). "utf8 (Руководство по курице)". Схема с курицей. Получено 2019-02-28.
  11. ^ «Куриные яйца». Схема с курицей.
  12. ^ "RubyGems". RubyGems.org. Получено 2019-02-26.
  13. ^ Бекс, Питер (sjamaan). «Независимое от VCS распределение языковых расширений»., сообщение в блоге "Больше магии"
  14. ^ «Инструкции по популярным методам хостинга кода и VCS». Курица вики.
  15. ^ «Куриные автоматизированные тесты». Схема с курицей. Получено 2019-02-28.
  16. ^ Ираиков (11.06.2016). "пиффи". Вики Сообщества. Получено 2019-03-03.
  17. ^ Бекс, Питер (sjamaan); Ираиков (11.03.2012). "Луа". Вики Сообщества. Получено 2019-03-03.
  18. ^ Марио; svnwiki (04.06.2013). "JNI". Вики Сообщества. Получено 2019-03-03.
  19. ^ Винкельманн, Феликс; Марио (04.06.2013). "Javahack". Вики Сообщества. Получено 2019-03-03.
  20. ^ Бекс, Питер (sjamaan); Винкельманн, Феликс; марио (23 сентября 2018). "Модуль (куриный синтаксис)". Схема с курицей. Получено 2019-02-28.
  21. ^ Бекс, Питер (sjamaan); Винкельманн, Феликс; марио (23 сентября 2018). "Модуль (куриный синтаксис)". Схема с курицей. Получено 2019-02-28.
  22. ^ Бекс, Питер (sjamaan) (25.11.2018). «Отладка». Схема с курицей.

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