Хьюм (язык программирования) - Hume (programming language)

Статуя Юма в Эдинбурге

Юм это функционально-ориентированный язык программирования, разработанный в Сент-Эндрюсский университет и Университет Хериот-Ватт в Шотландия с 2000 года. Название языка является одновременно аббревиатурой, означающей «Единая мета-среда высшего порядка», и почтением философу 18-го века. Дэвид Хьюм. Он нацелен в реальном времени встроенные системы, стремясь создать дизайн, который одновременно является в высшей степени абстрактным, но при этом позволяет точно извлечь временные и пространственные затраты на выполнение. Это позволяет программистам гарантировать ограниченные требования по времени и пространству для выполнения программ.

Юм сочетает функциональное программирование идеи с идеями из конечные автоматы. Автоматы используются для структурирования взаимодействующих программ в серии «ящиков», где каждая ячейка сопоставляет входы с выходами в чисто функциональный способ с использованием высокоуровневого сопоставления с образцом. Он структурирован как серия уровней, каждый из которых раскрывает различные свойства машины.

Модель дизайна Юма

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

Hume - это трехуровневый язык: внешнее (статическое) объявление /метапрограммирование слой, промежуточный уровень координации, описывающий статический макет динамических процессов и связанных устройств, и внутренний уровень, описывающий каждый процесс как (динамическое) отображение из шаблонов в выражения. Внутренний уровень не имеет состояния и является чисто функциональным.

Вместо того, чтобы пытаться применить моделирование затрат и технологию доказательства правильности к существующей языковой структуре либо напрямую, либо путем изменения более общего языка (как, например, RTSJ ), подход, выбранный дизайнерами Юма, состоит в том, чтобы спроектировать Юма таким образом, чтобы можно было определенно построить формальные модели и доказательства. Юм структурирован как ряд перекрывающихся языковых уровней, где каждый уровень добавляет выразимости семантике выражения, но либо теряет некоторые желаемые свойства, либо увеличивает техническую сложность предоставления формальных моделей корректности / стоимости.

Характеристики

Версии интерпретатора и компилятора немного отличаются.

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

Провода системы согласования коробки в программирование потока данных стиль.

Язык выражения Haskell -подобно.

Система параллелизма передачи сообщений запоминает JoCaml с Шаблоны соединений или же Полифонический C Sharp аккорды, но со всеми каналами асинхронными.

Имеется встроенный планировщик, который непрерывно проверяет соответствие шаблонов во всех блоках по очереди, задерживая блоки, которые не могут копировать выходные данные в занятые места назначения ввода.

Примеры

Торговый автомат

данные Монеты = Никель | Дайм | Не настоящие;данные Напитки = Кофе | Чай;данные Кнопки = BCoffee | BTea | BCancel;тип Int = int 32 ;исключение EFakeCoin :: (Int, нить) ;Показать v = v в качестве нить ; коробка кофев ( монета :: Монеты, кнопка :: Кнопки, ценить :: Int ) - входные каналыиз ( drink_outp :: нить, ценить :: Int    , return_outp :: нить, отображать :: нить)  - названные выходыв 500КБ (400B) - ограничение максимальной стоимости кучи (max stack)ручки EFakeCoin, TimeOut, HeapOverflow, Переполнение стекаматч- * подстановочные знаки для незаполненных выходов и неиспользованных входов  ( my_coin, *, v)  {- эквивалент "шаблона соединения": монета (my_coin) & value (v) -}                 -> позволять v = инкремент my_coin v                   в ( *, v, *, Показать v)            - ограничение по времени ('' в пределах x единицы времени '') вызывает TimeOut ()| ( *, BCoffee, v) {- эквивалент "шаблона соединения": кнопка (BCoffee) & value (v) -}                   -> (продавать Кофе 10 v) в 30s | ( *, BTea, v)    -> (продавать Чай 5 v) в 30s| ( *, BCancel, v) -> позволять возврат ты = "Возврат " ++ Показать ты ++ ""                      в ( *, 0, возврат v, *)ручка   EFakeCoin (v, сообщение) -> ( *, v , *, сообщение)|  TimeOut () -> (*, *, *, "Возможно, содержание исчерпано, звоните в службу!")|  HeapOverflow () -> (*, *, *, "ошибка: превышен предел кучи")|  Переполнение стека () -> (*, *, *, "ошибка: превышен предел стека") ;инкремент монета v =     дело монета из      Никель -> v + 5      Дайм -> v + 10      Не настоящие -> поднимать EFakeCoin (v, "монета отклонена")    ;  продавать напиток Стоимость v =     если v >= Стоимость       тогда ( обслуживать напиток, v - Стоимость, *, "ваш напиток")        еще ( *, v, *, "денег не хватает" ++ Показать (Стоимость - v))    ; обслуживать напиток = дело напиток из               Кофе -> "Кофе"               Чай -> "Чай"    ; коробка контрольв (c :: char)из (монета :: Монеты, кнопка:: Кнопки)матч 'п' -> (Никель, *) | 'd' -> (Дайм, *) | 'f' -> (Не настоящие, *) | 'c' -> (*, BCoffee) | 'т' -> (*, BTea) | 'Икс' -> (*, BCancel) | _ -> (*, *); транслировать console_outp к "std_out" ;транслировать console_inp из "std_in" ;-- поток данных провод кофе    - входы (истоки каналов)    (контроль.монета, контроль.кнопка, кофе.ценить первоначально 0)  --     - выводит направления    (console_outp, кофе.ценить, console_outp, console_outp) ; провод контроль    (console_inp)    (кофе.монета, кофе.кнопка);

внешняя ссылка