Хьюм (язык программирования)
Эта статья нуждается в дополнительных цитатах для проверки . ( апрель 2022 г. ) |
Парадигма | Функциональный |
---|---|
Семья | Хаскелл |
Разработано | Грег Майклсон Эндрю Айрленд Энди Уоллес |
Разработчики | Университет Сент-Эндрюс Университет Хериот-Ватт |
Впервые появился | 2000 |
Стабильная версия | 0,8
/ 25 апреля 2008 г |
Дисциплина набора текста | Предполагаемый , статичный , сильный |
Платформа | ИА-32 , PowerPC |
ТЫ | macOS , Red Hat Linux |
Под влиянием | |
Хаскелл |

Hume — это функционально-ориентированный язык программирования, разработанный в Университете Сент-Эндрюс и Университете Хериот-Ватт в Шотландии с 2000 года. Название языка является одновременно аббревиатурой, означающей «Единая мета-среда высшего порядка», и почетным знаком 18-го века. философ века Дэвид Юм . Он нацелен на вычислений в реальном времени встроенные системы , стремясь создать дизайн, который является одновременно очень абстрактным, но при этом позволяет точно определить временные и пространственные затраты на выполнение. Это позволяет гарантировать ограниченность требований по времени и пространству при выполнении программ.
Юм сочетает идеи функционального программирования с идеями конечных автоматов . Автоматы используются для структурирования взаимодействующих программ в серию «блоков», где каждый блок сопоставляет входные данные с выходными способом чисто функциональным , используя сопоставление с образцом высокого уровня. Он структурирован как ряд уровней, каждый из которых раскрывает различные свойства машины.
Модель дизайна [ править ]
Дизайн языка Хьюма пытается сохранить основные свойства и функции, необходимые для области встроенных систем (особенно для прозрачной оценки затрат времени и пространства), в то же время включая как можно более высокий уровень абстракции программы. Он нацелен на приложения, начиная от простых микроконтроллеров и заканчивая сложными системами реального времени, такими как смартфоны . Эта амбициозная цель требует включения как понятий низкого уровня, таких как обработка прерываний , так и понятий высокого уровня, связанных с абстракцией структур данных и т. д. Такие системы программируются по-разному, но дизайн языка должен учитывать такие различные требования.
Язык Хьюма представляет собой трехуровневый язык: внешний (статический) уровень объявления/ метапрограммирования , промежуточный координационный уровень, описывающий статическое расположение динамических процессов и связанных с ними устройств, и внутренний уровень, описывающий каждый процесс как (динамическое) отображение шаблонов в выражения. Внутренний слой не имеет состояния и чисто функционален.
Вместо того, чтобы пытаться применить моделирование затрат и технологию доказательства корректности к существующей языковой структуре напрямую или путем изменения более общего языка (как, например, в RTSJ ), подход, принятый разработчиками Юма, заключается в том, чтобы спроектировать Юма таким образом, чтобы формальный модели и доказательства определенно могут быть построены. Хьюм структурирован как серия перекрывающихся языковых уровней, где каждый уровень добавляет выразительности к семантике выражений, но либо теряет некоторые желательные свойства, либо увеличивает техническую сложность обеспечения формальных моделей правильности/стоимости. [1]
Характеристики [ править ]
Версии интерпретатора и компилятора немного отличаются.
- интерпретатор (доказательство концепции) допускает тайм-аут и пользовательские исключения.
- компилятор допускает ограничение стоимости кучи и стека, но исключения печатают только имя исключения.
Система координации подключает блоки в стиле программирования потоков данных .
Язык выражений похож на Haskell .
Система параллельной передачи сообщений запоминает или JoCaml шаблоны соединения аккорды C Sharp Polyphonic , но при этом все каналы асинхронны.
Имеется встроенный планировщик, который постоянно проверяет соответствие шаблону во всех ящиках по очереди, приостанавливая те ящики, которые не могут копировать выходные данные в занятые места назначения ввода.
Примеры [ править ]
Торговый автомат [ править ]
data Coins = Nickel | Dime | Fake;
data Drinks = Coffee | Tea;
data Buttons = BCoffee | BTea | BCancel;
type Int = int 32 ;
exception EFakeCoin :: (Int, string) ;
show v = v as string ;
box coffee
in ( coin :: Coins, button :: Buttons, value :: Int ) -- input channels
out ( drink_outp :: string, value’ :: Int
, refund_outp :: string, display :: string) -- named outputs
within 500KB (400B) -- max heap ( max stack) cost bounding
handles EFakeCoin, TimeOut, HeapOverflow, StackOverflow
match
-- * wildcards for unfilled outputs, and unconsumed inputs
( my_coin, *, v) {- ''join-pattern'' equivalent: coin(my_coin) & value(v) -}
-> let v’ = incrementCredit my_coin v
in ( *, v’, *, show v’)
-- time bounding (''within x time-unit'') raises TimeOut ()
| ( *, BCoffee, v) {- ''join-pattern'' equivalent: button(BCoffee) & value(v) -}
-> (vend Coffee 10 v) within 30s
| ( *, BTea, v) -> (vend Tea 5 v) within 30s
| ( *, BCancel, v) -> let refund u = "Refund " ++ show u ++ "\n"
in ( *, 0, refund v, *)
handle
EFakeCoin (v, msg) -> ( *, v , *, msg)
| TimeOut () -> (*, *, *, "maybe content exhausted, call service!")
| HeapOverflow () -> (*, *, *, "error: heap limit exceeded")
| StackOverflow () -> (*, *, *, "error: stack limit exceeded")
;
incrementCredit coin v =
case coin of
Nickel -> v + 5
Dime -> v + 10
Fake -> raise EFakeCoin (v, "coin rejected")
;
vend drink cost v =
if v >= cost
then ( serve drink, v - cost, *, "your drink")
else ( *, v, *, "money is short of " ++ show (cost - v))
;
serve drink = case drink of
Coffee -> "Coffee\n"
Tea -> "Tea\n"
;
box control
in (c :: char)
out (coin :: Coins, button:: Buttons)
match
'n' -> (Nickel, *)
| 'd' -> (Dime, *)
| 'f' -> (Fake, *)
| 'c' -> (*, BCoffee)
| 't' -> (*, BTea)
| 'x' -> (*, BCancel)
| _ -> (*, *)
;
stream console_outp to "std_out" ;
stream console_inp from "std_in" ;
-- dataflow
wire coffee
-- inputs (channel origins)
(control.coin, control.button, coffee.value’ initially 0) --
-- outputs destinations
(console_outp, coffee.value, console_outp, console_outp)
;
wire control
(console_inp)
(coffee.coin, coffee.button)
;
Ссылки [ править ]
- ^ Экелен, Марко Ван (2007). Тенденции функционального программирования . Интеллектуальные книги. п. 198. ИСБН 978-1-84150-176-5 .
Дальнейшее чтение [ править ]
- Патай, Гергели; Ханак, Питер (2007). «Встроенное функциональное программирование в Hume» (PDF) . Архивировано из оригинала (PDF) 23 декабря 2016 года.
Внешние ссылки [ править ]
- Веб-сайт языка программирования Хьюма
- Проект Хьюма в Университете Хериот-Ватт
- Проект EmBounded сертифицирует код, ограниченный ресурсами, в Hume.
- Хьюм и многоядерность