Jump to content

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

Хьюм
Парадигма Функциональный
Семья Хаскелл
Разработано Грег Майклсон
Эндрю Айрленд
Энди Уоллес
Разработчики Университет Сент-Эндрюс
Университет Хериот-Ватт
Впервые появился 2000 ; 24 года назад ( 2000 )
Стабильная версия
0,8 / 25 апреля 2008 г .; 16 лет назад ( 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)
;

Ссылки [ править ]

  1. ^ Экелен, Марко Ван (2007). Тенденции функционального программирования . Интеллектуальные книги. п. 198. ИСБН  978-1-84150-176-5 .

Дальнейшее чтение [ править ]

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 2fa94243179f803140b1e12fbe6a6adf__1695094200
URL1:https://arc.ask3.ru/arc/aa/2f/df/2fa94243179f803140b1e12fbe6a6adf.html
Заголовок, (Title) документа по адресу, URL1:
Hume (programming language) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)