Парадигма | Функциональный |
---|---|
Семья | Хаскелл |
Разработано | Грег Майклсон Эндрю Айрленд Энди Уоллес |
Разработчики | Университет Сент-Эндрюс Университет Хериот-Уотт |
Впервые появился | 2000 ( 2000 ) |
Стабильный релиз | 0.8 / 25 апреля 2008 г. ( 2008-04-25 ) |
Дисциплина набора текста | Предполагаемый , статический , сильный |
Платформа | IA-32 , PowerPC |
ОС | macOS , Red Hat Linux |
Под влиянием | |
Хаскелл |
Hume — это функционально-ориентированный язык программирования, разработанный в Университете Сент-Эндрюс и Университете Хериот-Уотт в Шотландии с 2000 года. Название языка является одновременно аббревиатурой, означающей «Высшее унифицированное метаокружение», и почетным званием философа 18-го века Дэвида Хьюма . Он нацелен на встроенные системы вычислений в реальном времени , стремясь создать проект, который является одновременно высокоабстрактным и в то же время позволяет точно извлекать затраты времени и пространства на выполнение. Это позволяет гарантировать ограниченные требования времени и пространства для выполнения программ.
Хьюм объединяет идеи функционального программирования с идеями конечных автоматов . Автоматы используются для структурирования взаимодействующих программ в ряд «ящиков», где каждый ящик отображает входы в выходы чисто функциональным способом , используя высокоуровневое сопоставление с образцом. Он структурирован как ряд уровней, каждый из которых раскрывает различные свойства машины.
Проект языка Hume пытается сохранить основные свойства и функции, требуемые доменом встроенных систем (особенно для прозрачной оценки времени и пространства), в то же время включив как можно более высокий уровень абстракции программы. Он нацелен на приложения, варьирующиеся от простых микроконтроллеров до сложных систем реального времени, таких как смартфоны . Эта амбициозная цель требует включения как низкоуровневых понятий, таких как обработка прерываний , так и высокоуровневых понятий абстракции структуры данных и т. д. Такие системы программируются совершенно по-разному, но проект языка должен учитывать такие различные требования.
Hume — это трехслойный язык: внешний (статический) слой деклараций/ метапрограммирования , промежуточный слой координации, описывающий статическую схему динамических процессов и связанных с ними устройств, и внутренний слой, описывающий каждый процесс как (динамическое) отображение из шаблонов в выражения. Внутренний слой не имеет состояния и является чисто функциональным.
Вместо того, чтобы пытаться применить моделирование стоимости и технологию доказательства корректности к существующей языковой структуре либо напрямую, либо путем изменения более общего языка (как, например, RTSJ ), подход, принятый разработчиками Hume, заключается в проектировании Hume таким образом, чтобы формальные модели и доказательства могли быть определенно построены. Hume структурирован как ряд перекрывающихся языковых уровней, где каждый уровень добавляет выразительности к семантике выражения, но либо теряет некоторые желаемые свойства, либо увеличивает техническую сложность предоставления формальных моделей корректности/стоимости. [1]
Версии интерпретатора и компилятора немного различаются.
Система координации связывает блоки в стиле программирования потока данных .
Язык выражений похож на Haskell .
Система параллельной передачи сообщений запоминает шаблоны соединений JoCaml или полифонические аккорды до-диез , но все каналы асинхронны.
Встроенный планировщик непрерывно проверяет соответствие шаблону всех блоков по очереди, приостанавливая те блоки, которые не могут копировать выходные данные в занятые пункты назначения входных данных.
данные Монеты = Никель | Дайм | Фальшивый ; данные Напитки = Кофе | Чай ; данные Кнопки = BCoffee | BTea | BCancel ; тип Int = int 32 ; исключение EFakeCoin :: ( Int , string ) ; показывать v = v как строку ; коробка кофе в ( монета :: Монеты , кнопка :: Кнопки , значение :: Целое ) — входные каналы в ( выход_напитка :: строка , значение ' :: Целое , возврат_напитка :: строка , дисплей :: строка ) — именованные выходы в пределах 500 КБ ( 400 Б ) — максимальная стоимость кучи (максимальный стек) ограничивающие дескрипторы EFakeCoin , TimeOut , HeapOverflow , StackOverflow match -- * подстановочные знаки для незаполненных выходов и неиспользованных входов ( my_coin , * , v ) {- эквивалент ''join-pattern'': coin(my_coin) & value(v) -} -> let v ' = incrementCredit my_coin v in ( * , v ' , * , show v ' ) -- ограничение по времени (''в пределах x единиц времени'') вызывает TimeOut () | ( * , BCoffee , v ) {- эквивалент ''join-pattern'': button(BCoffee) & value(v) -} -> ( vend Coffee 10 v ) в течение 30 с | ( * , BTea , v ) -> ( vend Tea 5 v ) в течение 30 с | ( * , BCancel , v ) -> let return u = "Возврат денег " ++ show u ++ " \n " in ( * , 0 , return v , * ) handle EFakeCoin ( v , msg ) -> ( * , v , * , msg ) | TimeOut () -> ( * , * , * , "возможно, содержимое исчерпано, вызовите службу!" ) | HeapOverflow () -> ( * , * , * , "ошибка: превышен лимит кучи" ) | StackOverflow () -> ( * , * , * , "ошибка: превышен лимит стека" ) ; incrementCredit coin v = case coin of Nickel -> v + 5 Dime -> v + 10 Fake -> raise EFakeCoin ( v , "монета отклонена" ) ; продать напиток стоимость v = if v >= cost then ( serve drink , v - cost , * , "your drink" ) else ( * , v , * , "денег не хватает" ++ show ( cost - v )) ; подать напиток = case drink of Coffee -> "Кофе \n " 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 ) | _ -> ( * , * ) ; поток console_outp в "std_out" ; поток console_inp из "std_in" ; -- dataflow wire coffee -- входы ( источники каналов ) ( control.coin , control.button , coffee.value ' изначально 0 ) -- -- выходы назначения ( console_outp , coffee.value , console_outp , console_outp ) ; управление проводом ( console_inp ) ( coffee.coin , coffee.button ) ;