Хьюм (язык программирования)
Эта статья нуждается в дополнительных ссылок для проверки . ( апрель 2022 г. ) |
Парадигма | Функциональный |
---|---|
Семья | Хаскелл |
Разработано | Грег Майклсон Эндрю Айрленд Энди Уоллес |
Разработчики | Университет Сент-Эндрюс Университет Хериот-Ватт |
Впервые появился | 2000 |
Стабильная версия | 0,8
/ 25 апреля 2008 г |
Дисциплина набора текста | Предполагаемый , статичный , сильный |
Платформа | ИА-32 , PowerPC |
ТЫ | macOS , Red Hat Linux |
Под влиянием | |
Хаскелл |
![](http://upload.wikimedia.org/wikipedia/commons/thumb/a/ac/HumeStatue-Edinburgh2006.jpg/220px-HumeStatue-Edinburgh2006.jpg)
Hume — это функционально-ориентированный язык программирования, разработанный в Университете Сент-Эндрюс и Университете Хериот-Ватт в Шотландии с 2000 года. Название языка является одновременно аббревиатурой, означающей «Единая мета-среда высшего порядка», и почетным знаком 18-го века. философ века Дэвид Юм . Он нацелен на вычислений в реальном времени встроенные системы , стремясь создать дизайн, который является одновременно очень абстрактным, но при этом позволяет точно определить временные и пространственные затраты на выполнение. Это позволяет гарантировать ограниченность требований по времени и пространству при выполнении программ.
Юм сочетает идеи функционального программирования с идеями конечных автоматов . Автоматы используются для структурирования взаимодействующих программ в серию «блоков», где каждый блок сопоставляет входные данные с выходными чисто функциональным способом, используя сопоставление с образцом высокого уровня. Он структурирован как ряд уровней, каждый из которых раскрывает различные свойства машины.
Модель дизайна [ править ]
Дизайн языка Хьюма пытается сохранить основные свойства и функции, необходимые для области встроенных систем (особенно для прозрачной оценки затрат времени и пространства), в то же время включая максимально высокий уровень абстракции программы. Он нацелен на приложения, начиная от простых микроконтроллеров и заканчивая сложными системами реального времени, такими как смартфоны . Эта амбициозная цель требует включения как понятий низкого уровня, таких как обработка прерываний , так и понятий высокого уровня, связанных с абстракцией структур данных и т. д. Такие системы программируются по-разному, но дизайн языка должен учитывать такие различные требования.
Язык Хьюма представляет собой трехуровневый язык: внешний (статический) уровень объявления/ метапрограммирования , промежуточный координационный уровень, описывающий статическое расположение динамических процессов и связанных с ними устройств, и внутренний уровень, описывающий каждый процесс как (динамическое) отображение шаблонов в выражения. Внутренний слой не имеет состояния и чисто функционален.
Вместо того, чтобы пытаться применить моделирование затрат и технологию доказательства правильности к существующей языковой структуре напрямую или путем изменения более общего языка (как, например, в случае с RTSJ ), подход, принятый разработчиками Юма, заключается в том, чтобы спроектировать Юма таким образом, чтобы формально модели и доказательства определенно могут быть построены. Хьюм структурирован как серия перекрывающихся языковых уровней, где каждый уровень добавляет выразительности к семантике выражений, но либо теряет некоторые желаемые свойства, либо увеличивает техническую сложность обеспечения формальных моделей правильности/стоимости. [1]
Характеристики [ править ]
Версии интерпретатора и компилятора немного отличаются.
- интерпретатор (доказательство концепции) допускает тайм-аут и пользовательские исключения.
- компилятор допускает ограничение стоимости кучи и стека, но исключения печатают только имя исключения.
Система координации подключает блоки в стиле программирования потоков данных .
Язык выражений похож на Haskell .
Система параллельной передачи сообщений запоминает или JoCaml шаблоны соединения аккорды C Sharp Polyphonic , но все каналы асинхронны.
Имеется встроенный планировщик, который постоянно проверяет соответствие шаблону во всех ящиках по очереди, приостанавливая те ящики, которые не могут копировать выходные данные в занятые места назначения ввода.
Примеры [ править ]
Торговый автомат [ править ]
данные Монеты = Никель | Дайм | Фальшивый ;
данные Напитки = Кофе | Чай ;
данных Кнопки = BCoffee | BTea | БОтмена ;
введите Int = int 32 ;
исключение EFakeCoin :: ( Int , строка ) ;
показать v = v как строку ;
коробка кофе
в ( монета :: Монеты , кнопка :: Кнопки , значение :: Int ) — входные каналы
out ( drink_outp :: string , value ' :: Int
, return_outp :: string , display :: string ) — именованные выходы
в пределах 500 КБ ( 400 Б ) ограничения стоимости максимальной кучи (максимального стека)
— дескрипторы EFakeCoin , TimeOut , HeapOverflow , StackOverflow
match
— * подстановочные знаки для незаполненных выходных данных и неизрасходованных входных данных
( my_coin , * , v ) {- ''join- эквивалент шаблона: coin(my_coin) & value(v) -}
-> let v ' = инкрементный кредит my_coin v
in ( * , v ' , * , show v ' )
-- ограничение по времени ('' в пределах x единицы времени '') поднимает TimeOut()
| ( * , BCoffee , v ) {- эквивалент шаблона соединения: button(BCoffee) & value(v) -}
-> ( продажа кофе 10 v ) в течение 30 с
| ( * , BTea , v ) -> ( продажа Чай 5 v ) в течение 30 с
| ( * , BCancel , v ) -> let return u = "Refund" ++ show u ++ " \n "
в ( * , 0 , return v , * )
handle
EFakeCoin ( v , msg ) -> ( * , v , * , сообщение )
| TimeOut () -> ( * , * , * , "возможно, контент исчерпан, позвоните в службу!" )
| HeapOverflow () -> ( * , * , * , «ошибка: превышен лимит кучи» )
| Переполнение стека () -> ( * , * , * , «ошибка: превышен лимит стека» )
;
IncreitCredit coin v =
монета из v
никеля -> + 5 Dime
- > v + 10
Fake -> поднять EFakeCoin ( v , «монета отклонена» )
;
продажи напитка стоимость v =
if v >= Cost
then ( served Drink , v - cost , * , "ваш напиток" )
else ( * , v , * , "денег не хватает" ++ show ( cost - v ))
;
подача напитка = случай напитка Кофе
Чай -> «Кофе \n »
- > «Чай \n »
;
поле управления
in ( c :: char )
out ( coin :: Coins , button :: Buttons )
match
'n' -> ( Nickel , * )
| 'd' -> ( Дейм , * )
| 'f' -> ( Подделка , * )
| 'c' -> ( * , BCoffee )
| 't' -> ( * , BTea )
| 'x' -> ( * , BCancel )
| _ -> ( * , * )
;
передать console_outp в "std_out" ;
поток console_inp из "std_in" ;
--
данных Coffee
источники
( control.coin ) control.button , Coffee.value , ; console_outp ) ' входы -- изначально 0 , --
выходы
( ) , Coffee.value назначения console_outp ( console_outp , поток каналов
--
проводное управление
( console_inp )
( кофе.монета , кофе.кнопка )
;
Ссылки [ править ]
- ^ Экелен, Марко Ван (2007). Тенденции функционального программирования . Интеллектуальные книги. п. 198. ИСБН 978-1-84150-176-5 .
Дальнейшее чтение [ править ]
- Патай, Гергели; Ханак, Питер (2007). «Встроенное функциональное программирование в Hume» (PDF) . Архивировано из оригинала (PDF) 23 декабря 2016 года.
Внешние ссылки [ править ]
- Веб-сайт языка программирования Хьюма
- Проект Хьюма в Университете Хериот-Ватт
- Проект EmBounded сертифицирует код, ограниченный ресурсами, в Hume.
- Хьюм и многоядерность