MCU를 이용한 기능적 프로그래밍


12

Haskell, LISP 또는 Scheme과 같은 기능적 언어를 통해 프로그래머는 기능적 프로그래밍 패러다임을 사용하여 빠르게 작업 할 수 있습니다. 그들은 비효율적 이지만 내 응용 프로그램은 프로그램 자체의 효율성보다 프로그래머 효율성에 중점을 둡니다.

기계 제어 등을 위해 마이크로 컨트롤러에서 기능 프로그래밍을 사용하고 싶습니다.

최소 시스템 리소스와 같은 제한 사항은 무엇입니까?
이러한 언어의 구현 예는 무엇입니까?


1
질문이 " 가장 강력한 프로그래밍 언어로 기계 를 프로그래밍 하는 것이 가치가 없다면" C ++Java 질문을 읽는 것이 좋습니다 (기능적 프로그래밍보다는 OOP에 관한 것).
Kevin Vermeer

1
첫 번째 문단은 논쟁의 여지가있어 몇 차례의 찬성 투표를 얻었습니다. 보다 수동적 인 것 ( "기계 제어를위한 기능 프로그래밍 사용, 임베디드 시스템을위한 Haskell / LISP / Scheme 구현의 예"에 관심이 있음) 또는 완전히 제거하는 것을 고려하십시오.
Kevin Vermeer

2
나는 당신의 "비효율적 인"진술을 사지 않습니다. 당신은 취미 / 시제품 측면에 대한 극도의 편견을 가지고있는 것 같습니다. C / C ++ / asm은 충분한 속도와 공간으로 프로세서를 사용할 수있을 때 더 작고 더 빠른 코드로 수천 또는 수백만 번 증폭됩니다. 임베디드가 내장되어 있습니다. 범용 OS에서 프로그래밍하고 있지 않습니다.
Nick T

4
@Nick T- "C / C ++ / asm은 충분한 속도와 공간으로 프로세서를 사용할 수있을 때 수천 또는 수백만 번 증폭되는 더 작고 더 빠른 코드를 생성합니다."-유지 관리는 어떻습니까? 함수형 언어는 종종 한 줄로 C- 프로그램이해야 할 일을 할 수 있습니다. 즉, 버그의 여지가 적습니다. 또한, 그들은 (예를 들어 Haskell) 준수 될 수 있고, 대상에서 실행되도록 할 수 있으며, 이는 통역사보다 빠릅니다. 컴파일 된 Haskell이 C 응용 프로그램보다 빠르지 만 개발이 더 빠를 수 있기 때문에이 주제를 조금 탐구하고 싶었습니다. 현상 유지에 대한 질문이 필요했습니다.
J. Polfer

1
@Sheepsimulator 불행히도, 마지막 말과 같은 의견은이 논쟁과 같은 질문을합니다.
Kellenjb

답변:


11

ARMPIT SCHEME는 ARM 코어를 사용하는 RISC 마이크로 컨트롤러에서 실행되는 Scheme 언어 (Lysp의 어휘 범위 언어)에 대한 인터프리터입니다. 이 지침은 알고리즘 언어 체계 (r5rs) 개정 보고서의 설명을 기반으로하며 일부 확장 (I / O 용) 및 일부 생략 (MCU 메모리에 적합)이 있습니다. 또한 멀티 태스킹 및 멀티 프로세싱을 지원하도록 설계되었습니다. Armpit Scheme은 제어 및 계측 과정의 학생 프로젝트 또는 마이크로 컨트롤러가 필요한 캡 스톤 설계 과정을 포함하여 교육 환경에 적합 할 것으로 예상됩니다. 이는 MCU (예 : BASIC 및 FORTH)에 사용할 수있는 다양한 해석 언어를 풍부하게하며 MCU 기반 바이트 코드 해석기 (예 : Scheme 또는 Java) 및 컴파일 된 언어 (예 : C)의 대안이 될 수 있습니다.

http://armpit.sourceforge.net/

당신은 말합니다 :

C, C ++, 어셈블리 등을 사용하는 것은 Haskell, LISP 또는 Scheme과 같은 언어에 비해 매우 비효율적입니다.

고급 언어를 사용하는 것이 프로그래머 시간을보다 효율적으로 사용하지만 컴퓨팅 리소스를 덜 효율적으로 사용하는 경우가 종종 있습니다. 대량으로 제조 된 임베디드 시스템의 경우 비용과 성능이 개발 노력보다 우선 순위가 높습니다.



5

C, C ++ 및 Assembly는 모두 기계어에 매우 가깝습니다. 더 높은 수준의 언어를 사용하면 더 빠르고 쉬운 개발 등의 대가로 추가 오버 헤드가 추가됩니다.


3
-1 : 나는이 답변에 동의하지 않습니다. 어셈블리가 기계 언어에 가깝다는 것에 대한 귀하의 권리는 있지만 C와 C ++는 매우 다른 고급 언어입니다.
BG100

1
@ BG100, 실제로 C의 어딘가에 "높은 수준 / 낮은 수준"라인을 그리는 대신 높은 수준의 언어라고 부릅니다. 산술, 포인터 (문자열) 연산 및 기타 일반적인 기본 작업을 수행 할 때 일반적으로 컴파일러에서 생성하는 명령어에는 CPU가 추상화 계층없이 데이터를 직접 조작합니다.
Nick T

@ Nick T : 요점을 알지만 이것을 고려하십시오 : 일반적으로 가능한 한 빨리 실행 해야하는 인터럽트 루틴을 작성하면 C에서 실행하는 데 얼마나 오래 걸리는지 알 수 없지만 어셈블러에서는 지시 사항을 세어보세요. 저수준이 프로그램에서 정확히 진행되고 있음을 알고 있다고 생각합니다. C를 사용하고 있는지 확실하지 않습니다.
BG100

@ BG100 : 동일한 어셈블러 명령어는 피연산자와 해당 주소 지정 모드를 기반으로 실행하는 데 다른 횟수의 사이클이 걸릴 수 있습니다. C에서는 컴파일 후에는 변경할 수없는 정적 코드가 생성됩니다. 사실, 이것은 다소 논쟁의 여지가 있지만, 만약 우리가 큰 빨간 선을 그리려고 미적 애를 주장한다면 ...
Nick T

3

최근에 Python으로 ARM 보드를 프로그래밍 해 왔으며 훌륭하다고 생각합니다. 실시간 제어에는 좋지 않지만 웹 관련 작업을 더 많이하고 있습니다. 이는 C보다 고급 언어로 훨씬 더 즐겁습니다.


3

대부분의 마이크로 컨트롤러는 여전히 8 비트 및 16 비트 디바이스입니다 (이는 느리게 변경되지만). 지금까지 다른 답변에서 언급 한 두 가지 고급 언어 인스턴스 (Scheme 및 Python)는 모두 32 비트 ARM 코어에서 실행됩니다. 더 작은 8 비트 및 16 비트 장치 (몇 달러 정도만들 수 있음)에는 언급 된 언어를 지원하기에 충분한 RAM이 없으며 일반적으로 몇 KB의 RAM 만 있습니다.

또한 이러한 고급 언어는 지연 시간이 짧은 인터럽트 처리기 등을 작성하도록 설계되지 않았습니다. 마이크로 컨트롤러 인터럽트 핸들러가 초당 수백 또는 수천 번 호출되는 것은 드문 일이 아니며 매번 수십 마이크로 초 이하로 작업을 수행하는 데 필요합니다.


1
Scheme은 70 년대 중반과 80 년대 초반에 개발되었습니다. Scheme은 결코 32 비트 프로세서 나 메가 바이트의 메모리를 요구하지 않습니다. 체계는 80 년대 중반 AT 급 PC에서 사용 가능했습니다. 최근 구현은 리소스가 많은 환경에 최적화되어있을 수 있지만, 오늘날 "소규모"컴퓨팅 플랫폼에서 실행되는 체계에 대한 명확한 예가 있습니다.
광자

@ThePhoton 나는 정정했다. 수십 KB의 메모리를 가진 프로세서를 목표로하는 BIT 프로젝트에 대해 알고 있었지만 (대부분의 소형 마이크로 컨트롤러에서 사용할 수있는 것보다 더 많은), 나는 Montmont 와 Université Laval의 두 학생이 디자인 한 PICBIT을 발견 했습니다 . 이는 실제 Scheme 프로그램이 최소 2K의 RAM으로 PIC 프로세서에서 실행될 수 있도록합니다. 꽤 놀랍습니다.
tcrosley December

3

Lua 언어로 일부 기능 프로그래밍을 수행 할 수 있습니다. 실제로 루아는 다중 패러다임 언어입니다. Wikipedia 는이 언어가 '스크립팅, 명령형, 기능성, 객체 지향, 프로토 타입 기반'언어라고 주장합니다. 이 언어는 단일 패러다임을 강요하지 않지만 프로그래머가 상황에 적용 가능한 패러다임을 구현할 수있을 정도로 유연합니다. Scheme의 영향을 받았습니다.

Lua의 기능에는 기능 프로그래밍에 유용한 일류 함수 , 어휘 범위 및 클로저코 루틴 이 포함됩니다. 기능 프로그래밍 전용 페이지있는 Lua 사용자 위키에서 이러한 기능이 어떻게 사용되는지 확인할 수 있습니다 . 나는 또한 이 Google 코드 프로젝트 를 보았지만 그것을 사용하지 않았습니다 (당신이 언급 한 다른 언어 인 Haskell의 영향을 받았다고 주장합니다).

eLua 는 ARM7TMDI, Cortex-M3, ARM966E-S 및 AVR32 아키텍처를위한 여러 개발 보드 용으로 구성 할 수있는 구현이며, 오픈 소스이므로 자신의 플랫폼에 맞게 구성 할 수 있습니다. Lua는 ANSI C로 구현되며 전체 소스의 무게는 200kB 미만이므로 C 컴파일러를 사용하여 대부분의 플랫폼에서 빌드 할 수 있습니다. 최소 128k 플래시 및 32k RAM이 권장됩니다. 현재 PIC32 포트에서 작업 중입니다 (여전히 'PIC32 보드 가져 오기'단계).

Lua의 가장 큰 장점은 접착제 언어로 설계되었으므로 인터럽트 등의 빠른 속도를 필요로하는 항목에 대해 C 확장을 작성하고 언어의 동적이고 해석 된 기능을 사용하여 빠르게 수행 할 수 있다는 점입니다. 프로그램 로직 개발.

Lua는 순전히 기능적인 언어는 아니지만 많은 기능적 프로그래밍을 수행 할 수 있으며 빠르고 다른 (스크립팅 언어와 비교하여) 작 으며 프로그램을 시험하기 위해 장치를 다시 플래시 할 필요가 없습니다. 대화식 통역사도 있습니다!


1

"어려운 문제를 해결하기 위해 MCU에서 기능 언어로 기능 프로그래밍을 수행하는 방법이 있습니까?"

네, 방법이 있습니다. 그러나 단점은 32 비트 프로세서, MMU, 128MB RAM, SSD, RTOS 및 $$$가 필요하다는 것입니다.

마이크로 컨트롤러는 마이크로 프로세서와 다릅니다. 마이크로 컨트롤러는 8 비트 CPU, 1K RAM, 8K ROM 일 수 있지만 UART, PWM, ADC 등이 내장되어 있으며 1.30 달러에 불과합니다.

따라서 모든 고급 언어를 실행할 수 있지만 비용이 많이 듭니다.


2
마이크로 컨트롤러의 정의를 다시 방문해야한다고 생각합니다. 많은 마이크로 컨트롤러는 이제 작은 언어를 위해 인터프리터를 실행할 수있는 충분한 공간 인 128kB 이상의 플래시와 64kB 이상의 RAM을 갖추고 있습니다. 임베디드 Linux 장치에 대한 사양을 제공하는 것 같습니다. OP가 전용 포트를 요구하고 있다고 생각합니다.
Kevin Vermeer

1
8 비트 MCU에 대해 1.30 달러를 지불하는 경우 더 저렴한 32 비트 MCU가 여러 개 있습니다. 또한 시장에 나와있는 대부분의 8 비트 MCU는 80 년대 초반부터 디자인이 상속 된 끔찍한 코드 비효율 아키텍처입니다.
Lundin December

0

이 책은 가벼운 느낌의 FP로 프로그래밍하는 방법을 제공합니다. http://www.state-machine.com/psicc2/

그러나 실제 FP는 런타임에 함수를 구성하여 프로그램 전체에 전달할 수 있어야합니다. 여기에 문제가 있습니다 :이 생성 된 함수를 어떻게 표현할 수 있습니까? 어떻게이 기능을 효과적으로 실행할 수 있습니까? 대규모 시스템에서는 첫 번째 함수 애플리케이션에서 실제 머신 코드를 생성하는 동적 컴파일을 사용할 수 있습니다. MCU에는 Forth 언어 코어와 같은 매우 원시적 인 컴파일러를 구현할 수있는 RAM 만 있습니다.

당신이이입니다 선호하는 경우 유일한 방법은 당신이 FP 또는 OOP를 사용할 수있는 메타 프로그래밍 : 쓰기 복잡한 기능 /의 OOP의 MCU를위한 프로그램 생성 프로그램 (예를 들어 C 소스 코드, 또는 LLVM IL)를. 이 변형에서는 패러다임 또는 프로그래밍 방법의 복잡성에 의해 제한되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.