developer tip

상당한 규모의 실시간 시스템에 Haskell 사용 : 어떻게 (만약?)?

copycodes 2020. 12. 31. 22:14
반응형

상당한 규모의 실시간 시스템에 Haskell 사용 : 어떻게 (만약?)?


Haskell의 힘을 임베디드 리얼 타임 세계에 적용 할 수 있는지 궁금해서 인터넷 검색에서 Atom 패키지를 찾았습니다 . 복잡한 경우 코드에 충돌, 메모리 손상 등의 모든 고전적인 C 버그가있을 수 있으며,이를 유발 한 원래 Haskell 코드를 추적해야합니다. 그래서, 이것은 질문의 첫 부분입니다 : "당신이 Atom에 대한 경험이 있다면, 컴파일 된 C 코드에서 저수준 버그를 디버깅하고 Haskell 원래 코드에서 수정하는 작업을 어떻게 처리 했습니까?"

Atom에 대한 몇 가지 예제를 더 찾았습니다. 이 블로그 게시물 에는 결과 C 코드 22KLOC (그리고 분명히 코드 없음 :)가 언급 되어 있습니다 . 포함 된 예제 는 장난감입니다. 참조는 좀 더 실제적인 코드를 가지고 있지만,이 곳이 끝입니다. 그리고 제가 주제에 "sizable"을 넣은 이유는 300KLOC + 범위에서 생성 된 C 코드로 작업 한 경험을 공유 할 수 있다면 가장 관심이 있습니다.

제가 Haskell 초보자이기 때문에 알 수없는 미지 때문에 찾지 못한 다른 방법이있을 수 있습니다. 따라서이 분야의 자기 교육에 대한 다른 조언은 대단히 감사하겠습니다. 이것이 질문의 두 번째 부분입니다. "Haskell에서 실시간 개발을 수행하는 다른 실용적인 방법은 무엇입니까?" 멀티 코어도 그림에 있다면 추가 플러스입니다 :-)

(이 목적을 위해 Haskell 자체를 사용하는 방법에 대해 : 이 블로그 게시물 에서 읽은 내용에서 Haskell의 가비지 수집과 게으름으로 인해 일정 계획이 다소 비 결정적이지만 2 년 후에는 뭔가 변경되었을 수 있습니다. 실제 Haskell 프로그래밍 질문 SO 이 주제에 가장 가깝게 찾을 수있었습니다)

참고 : 위의 "실시간"은 "하드 실시간"에 더 가깝습니다. 주 작업이 실행되지 않을 때 일시 중지 시간이 0.5ms 미만인지 확인할 수 있는지 궁금합니다.


Galois에서는 두 가지 용도로 Haskell을 사용합니다.

  • 소프트 실시간 (OS 장치 계층, 네트워킹), 1-5ms의 응답 시간이 그럴듯합니다. GHC는 빠른 코드를 생성하고 올바른 타이밍을 얻기 위해 가비지 수집기와 스케줄러를 조정하는 데 많은 지원을 제공합니다.
  • 진정한 실시간 시스템의 경우 EDSL은 더 강력한 타이밍 보장을 제공하는 다른 언어의 코드를 생성하는 데 사용됩니다. 예 : Cryptol, Atom 및 Copilot.

따라서 EDSL (Copilot 또는 Atom)과 호스트 언어 (Haskell)를 구별하는 데주의하십시오.


중요한 시스템의 몇 가지 예 및 경우에 따라 Galois가 제작 한 Haskell에서 작성하거나 생성 한 실시간 시스템.

EDSL

시스템

  • HaLVM- 임베디드 및 모바일 애플리케이션을위한 경량 마이크로 커널
  • TSE- 교차 도메인 (보안 수준) 네트워크 어플라이언스

작은 메모리에 맞고 1 밀리 초 미만의 일시 중지 시간을 보장 할 수있는 Haskell 시스템이 나오기까지는 오랜 시간이 걸릴 것입니다. Haskell 구현 자 커뮤니티는 이런 종류의 대상에 관심이없는 것 같습니다.

매우 효율적인 것으로 컴파일하기 위해 Haskell이나 Haskell과 같은 것을 사용하는 것에 대한 건전한 관심이 있습니다. 예를 들어 Bluespec 은 하드웨어로 컴파일됩니다.

나는 그것이 당신의 요구를 충족시킬 것이라고 생각하지 않지만, 함수형 프로그래밍과 임베디드 시스템에 관심이 있다면 Erlang에 대해 배워야 합니다.


앤드류,

예, 생성 된 코드를 통해 원래 소스로 문제를 디버깅하는 것은 까다로울 수 있습니다. Atom이 제공하는 한 가지는 내부 표현식을 조사한 다음 사용자가 이러한 조사를 처리하는 방법을 결정할 수 있다는 것입니다. 차량 테스트를 위해 송신기 (Atom)를 구축하고 CAN 버스를 통해 프로브를 스트리밍합니다. 그런 다음이 데이터를 캡처하고 형식을 지정한 다음 GTKWave와 같은 도구를 사용하여 후 처리 또는 실시간으로 볼 수 있습니다. 소프트웨어 시뮬레이션의 경우 프로브는 다르게 처리됩니다. CAN 프로토콜에서 프로브 데이터를 가져 오는 대신 C 코드에 후크를 만들어 프로브 값을 직접 들어 올립니다. 그런 다음 프로브 값은 단위 테스트 프레임 워크 (Atom과 함께 배포 됨)에서 사용되어 테스트가 통과 또는 실패했는지 확인하고 시뮬레이션 범위를 계산합니다.


나는 Haskell이나 다른 Garbage Collected 언어가 하드 리얼 타임 시스템에 매우 적합하다고 생각하지 않습니다. GC는 런타임을 짧은 일시 중지로 분할하는 경향이 있기 때문입니다.

Atom으로 작성하는 것은 Haskell에서 정확히 프로그래밍하는 것이 아닙니다. 여기서 Haskell은 작성중인 실제 프로그램의 순전히 전처리기로 볼 수 있기 때문입니다.

나는 Haskell이 멋진 전 처리기 라고 생각 하고, Atom과 같은 DSEL을 사용하는 것은 아마도 상당한 하드-리얼 타임 시스템을 만드는 좋은 방법 일 것입니다.하지만 Atom이이 법안에 맞는지 아닌지는 모르겠습니다. 그렇지 않다면, 가능한 DSEL을 구현하는 것이 가능하다고 확신합니다.

저수준 언어에 대해 Haskell과 같은 매우 강력한 전처리기를 보유하면 C 코드 텍스트 생성기로 구현 될 때 훨씬 더 서투른 코드 생성을 통해 추상화를 구현할 수있는 엄청난 기회가 열립니다.


나는 Atom과 장난을 쳤다. 꽤 멋지지만 작은 시스템에 가장 적합하다고 생각합니다. 예, 그것은 트럭과 버스에서 실행되고 실제의 중요한 응용 프로그램을 구현하지만 이러한 응용 프로그램이 반드시 크거나 복잡하다는 것을 의미하지는 않습니다. 실제로 하드 리얼 타임 앱을위한 것이며 모든 작업에 똑같은 시간이 걸리도록 많은 노력을 기울입니다. 예를 들어 실행 시간이 다를 수있는 두 코드 분기 중 하나를 조건부로 실행하는 if / else 문 대신 두 계산 된 값 중 하나를 조건부로 선택하기 전에 항상 두 분기를 모두 실행하는 "mux"문이 있습니다 (따라서 총 실행 시간은 어떤 값을 선택하든 동일합니다). 내장형 (C '와 비교할 수있는) 이외의 중요한 유형 시스템은 없습니다. s) Atom 모나드를 통해 전달 된 GADT 값을 통해 적용됩니다. 저자는 출력 C 코드를 분석하는 정적 검증 도구를 작업하고 있습니다. 이것은 꽤 멋지지만 (SMT 솔버 사용) Atom이 더 많은 소스 수준 기능과 검사를 통해 혜택을받을 것이라고 생각합니다. 내 장난감 크기의 앱 (LED 손전등 컨트롤러)에서도 패키지에 대해 더 많은 경험이있는 사람이 피할 수있는 많은 초보자 오류를 만들었지 만 그 결과 컴파일러에 의해 잡히고 싶은 버그가있는 출력 코드가 발생했습니다. 테스트 대신. 다른 한편으로는 여전히 0.1 버전이므로 의심 할 여지없이 개선 될 것입니다. 그러나 나는 Atom이 더 많은 소스 레벨 기능과 검사를 통해 이익을 얻을 것이라고 생각합니다. 내 장난감 크기의 앱 (LED 손전등 컨트롤러)에서도 패키지에 대해 더 많은 경험이있는 사람이 피할 수있는 많은 초보자 오류를 만들었지 만 그 결과 컴파일러에 의해 잡히고 싶은 버그가있는 출력 코드가 발생했습니다. 테스트 대신. 다른 한편으로는 여전히 0.1 버전이므로 의심 할 여지없이 개선 될 것입니다. 그러나 나는 Atom이 더 많은 소스 레벨 기능과 검사를 통해 이익을 얻을 것이라고 생각합니다. 내 장난감 크기의 앱 (LED 손전등 컨트롤러)에서도 패키지에 대해 더 많은 경험이있는 사람이 피할 수있는 많은 초보자 오류를 만들었지 만 그 결과 컴파일러에 의해 잡히고 싶은 버그가있는 출력 코드가 발생했습니다. 테스트 대신. 다른 한편으로는 여전히 0.1 버전이므로 의심 할 여지없이 개선 될 것입니다.

참조 URL : https://stackoverflow.com/questions/1263711/using-haskell-for-sizable-real-time-systems-how-if

반응형