Hume(프로그래밍 언어)

Hume (programming language)
에든버러에 있는 흄상

Hume는 2000년부터 스코틀랜드의 St Andrews 대학과 Heriot-Watt 대학에서 개발된 기능 기반의 프로그래밍 언어입니다.이 언어 이름은 '고차 통합 메타 환경'을 의미하는 약자이면서 18세기 철학자 데이비드 흄에 대한 존칭어이다.이는 실시간 임베디드 시스템을 대상으로 하며, 매우 추상적이면서도 시간과 공간 실행 비용을 정확하게 추출할 수 있는 설계를 목표로 합니다.이를 통해 프로그래머는 프로그램 실행에 대한 제한된 시간과 공간 요구를 보장할 수 있습니다.

Hume는 기능적 프로그래밍 아이디어와 유한 상태 오토마타의 아이디어를 결합합니다.오토마타는 통신 프로그램을 일련의 "박스"로 구성하는데 사용됩니다.여기서 각 박스는 높은 수준의 패턴 매칭을 사용하여 순수하게 기능적인 방법으로 입력을 출력에 매핑합니다.이것은 일련의 레벨로 구성되며, 각 레벨은 서로 다른 기계 특성을 드러냅니다.

흄 디자인 모델

흄 언어 설계는 임베디드 시스템 영역에서 요구되는 필수 특성 및 기능을 유지(특히 투명한 시간과 공간 비용)하면서 가능한 한 높은 수준의 프로그램 추상화를 통합하려고 합니다.단순한 마이크로컨트롤러부터 스마트폰과 같은 복잡한 실시간 시스템까지 다양한 애플리케이션을 목표로 하고 있다.이 야심찬 목표를 달성하기 위해서는 인터럽트 처리와 같은 낮은 수준의 개념과 데이터 구조 추상화 등의 높은 수준의 개념을 모두 통합해야 합니다.물론 이러한 시스템은 매우 다른 방식으로 프로그래밍되지만 언어 설계는 이러한 다양한 요구사항을 수용해야 합니다.

Hume는 외부(정적) 선언/메타프로그래밍 레이어, 동적 프로세스 및 관련 장치의 정적 레이아웃을 기술하는 중간 조정 레이어 및 각 프로세스를 패턴에서 식까지의 (동적) 매핑으로 기술하는 내부 레이어입니다.내부 레이어는 스테이트리스이며 완전히 기능합니다.

비용 모델링 및 정확성 증명 기술을 기존 언어 프레임워크에 직접 적용하거나 보다 일반적인 언어(예: RTSJ)를 변경함으로써 시도하는 것이 아니라, Hume 설계자가 채택한 접근방식은 정식 모델과 증명이 확실히 구성될 수 있도록 흄을 설계하는 것입니다.Hume는 일련의 겹치는 언어 레벨로 구조화되어 있으며, 각 레벨은 표현 의미론에 표현성을 추가하지만 일부 바람직한 속성을 잃거나 형식적인 정확성/[1]비용 모델을 제공하는 기술적 어려움을 증가시킨다.

특성.

인터프리터와 컴파일러 버전은 조금 다릅니다.

  • 인터프리터(개념 프로버)는 타임아웃 및 커스텀 예외를 허용합니다.
  • 컴파일러는 힙 및 스택 비용 경계를 허용하지만 예외는 예외 이름만 출력합니다.

좌표 시스템은 데이터 흐름 프로그래밍 스타일로 상자를 배선합니다.

그 표현 언어는 하스켈과 같다.

메시지 전달 동시성 시스템은 JoCaml의 Join 패턴 또는 Polyphonic C Sharp 코드를 기억하지만 모든 채널이 비동기입니다.

모든 박스에서 패턴 매칭을 연속적으로 체크하는 스케줄러가 내장되어 있어, 비지 입력처에 출력을 카피할 수 없는 박스는 보류 상태가 됩니다.

예

자판기

데이터. 동전. = 니켈   다임   가짜; 데이터. 음료수 = 커피.   차; 데이터. 단추 = 비씨오피   BTea   BCancel;  유형 내부 = 인트 32 ;  예외. EFake Coin :: (내부, 스트링) ;  표시하다 v = v ~하듯이 스트링 ;   박스 커피. 에 ( 화폐를 만들다 :: 동전., 단추 :: 단추, 가치 :: 내부 ) --입력채널 나가. ( drink_outp :: 스트링, 가치’ :: 내부     , 환불_outp :: 스트링, 표시 :: 스트링)  -- 이름 있는 출력  이내에 500KB (400B) -- 최대 힙(최대 스택) 비용 제한 핸들 EFake Coin, 타임아웃, 히프오버플로우, 스택 오버플로우  경기 -- * 미필 출력 및 미소비 입력용 와일드카드   ( my_coin, *, v)  {- "my_coin" 상당: 코인(my_coin) & value(v) -}                  -> 허락하다 v’ = 인크리먼트 크레디트 my_coin v                    에 ( *, v’, *, 표시하다 v’)              -- 시간 제한("x시간 단위 이내")은 Time Out()을 올립니다.   ( *, 비씨오피, v) {- "join-pattern" 등가: 버튼(BCoffee) & 값(v) -}                    -> (판매하다 커피. 10 v) 이내에 30s    ( *, BTea, v)    -> (판매하다 차 5 v) 이내에 30s   ( *, BCancel, v) -> 허락하다 환불하다 u = "환불" ++ 표시하다 u ++ "\n"                       에 ( *, 0, 환불하다 v, *)  다루다    EFake Coin (v, 메시지) -> ( *, v , *, 메시지)    타임아웃 () -> (*, *, *, "콘텐츠가 소진될 수 있습니다.서비스 요청!")    히프오버플로우 () -> (*, *, *, "오류: 힙 제한을 초과했습니다.")    스택 오버플로우 () -> (*, *, *, "오류: 스택 제한을 초과했습니다.")  ;  인크리먼트 크레디트 화폐를 만들다 v =      사례. 화폐를 만들다 의       니켈 -> v + 5       다임 -> v + 10       가짜 -> 올리다 EFake Coin (v, "코인 거부")     ;    판매하다 마실것 비용. v =      한다면 v >= 비용.        그리고나서 ( 제공하다 마실것, v - 비용., *, "당신의 음료수")         또 다른 ( *, v, *, 돈이 모자라다 ++ 표시하다 (비용. - v))     ;   제공하다 마실것 = 사례. 마실것 의                커피. -> "커피\n"                차 -> "차\n"     ;   박스 통제 에 (c :: 차) 나가. (화폐를 만들다 :: 동전., 단추:: 단추) 경기  'n' -> (니켈, *)    'd' -> (다임, *)    'f' -> (가짜, *)    'c' -> (*, 비씨오피)    't' -> (*, BTea)    'x' -> (*, BCancel)    _ -> (*, *) ;   개울. console_outp 로. "std_out" ; 개울. 콘솔_inp 부터 "std_in" ;  -- 데이터 플로우   전선을 치다 커피.     -- 입력(채널 발신기지)     (통제.화폐를 만들다, 통제.단추, 커피..가치’ 처음에 0)  --     -- 출력처     (console_outp, 커피..가치, console_outp, console_outp)  ;   전선을 치다 통제     (콘솔_inp)     (커피..화폐를 만들다, 커피..단추) ; 

레퍼런스

  1. ^ Eekelen, Marko Van (2007). Trends in Functional Programming. Intellect Books. p. 198. ISBN 978-1-84150-176-5.

외부 링크