Funktionale Sprachen wie Haskell, LISP oder Scheme ermöglichen es einem Programmierer, schnell mit dem Paradigma der funktionalen Programmierung zu arbeiten . Sie haben ihre Ineffizienzen , aber meine Anwendung legt mehr Wert auf die Effizienz des Programmierers als auf die Effizienz des Programms selbst.
Ich möchte die funktionale Programmierung auf einem Mikrocontroller verwenden, um Maschinensteuerung usw.
Welche Einschränkungen gibt es, z. B. Mindestsystemressourcen?
Welche Beispielimplementierungen dieser Sprachen sind verfügbar?
ARMPIT SCHEME ist ein Interpreter für die Scheme-Sprache (lexikalischer Dialekt von Lisp), der auf RISC-Mikrocontrollern mit ARM-Kern läuft. Es basiert auf der Beschreibung im Revised Report on the Algorithmic Language Scheme (r5rs), mit einigen Erweiterungen (für E/A) und einigen Auslassungen (um in den MCU-Speicher zu passen). Es ist ferner darauf ausgelegt, Multitasking und Multiprocessing zu unterstützen. Es wird erwartet, dass Armpit Scheme gut für Bildungseinrichtungen geeignet ist, einschließlich Studentenprojekten in Kursen über Steuerung und Instrumentierung oder Capstone-Designkursen, in denen Mikrocontroller benötigt werden. Es soll das Spektrum der für MCUs verfügbaren interpretierten Sprachen (z. B. BASIC und FORTH) bereichern und kann eine Alternative zu MCU-basierten Bytecode-Interpretern (z. B. für Scheme oder Java) und zu kompilierten Sprachen (z. B. C) sein.
http://armpit.sourceforge.net/
Du sagst:
Die Verwendung von C, C++, Assembly usw. ist im Vergleich zu Sprachen wie Haskell, LISP oder Scheme ziemlich ineffizient
Die Verwendung von Hochsprachen ist eine effizientere Verwendung der Programmiererzeit, kann jedoch häufig eine weniger effiziente Verwendung von Computerressourcen sein. Bei in Serie hergestellten eingebetteten Systemen haben Kosten und Leistung oft eine höhere Priorität als der Entwicklungsaufwand.
Sie können auch AVR-Controller mit Haskell mit Atom/Copilot programmieren, zum Beispiel http://leepike.wordpress.com/2010/12/18/haskell-and-hardware-for-the-holidays/
C, C++ und Assembly sind der Maschinensprache sehr ähnlich. Durch die Verwendung einer Sprache auf höherer Ebene fügen Sie zusätzlichen Overhead im Austausch für eine schnellere/einfachere/usw. Entwicklung hinzu.
Ich habe kürzlich ein ARM-Board in Python programmiert und finde es großartig. Es ist nicht gut für die Echtzeitsteuerung, aber ich mache mehr webbezogene Sachen, was in einer Hochsprache weitaus angenehmer ist als in C.
Die Mehrheit der Mikrocontroller sind immer noch 8- und 16-Bit-Geräte (obwohl sich dies langsam ändert). Die beiden bisher in anderen Antworten erwähnten Instanzen höherer Sprachen (Scheme und Python) laufen beide auf 32-Bit-ARM-Kernen. Die kleineren 8- und 16-Bit-Geräte (die nur ein paar Dollar kosten können) haben nicht genug RAM, um die erwähnten Sprachen zu unterstützen – normalerweise haben sie nur ein paar KB RAM.
Außerdem sind diese höheren Sprachen nicht zum Schreiben von Interrupt-Handlern mit niedriger Latenzzeit und dergleichen ausgelegt. Es ist nicht ungewöhnlich, dass ein Mikrocontroller-Interrupt-Handler hundert- oder tausendmal pro Sekunde aufgerufen wird und jedes Mal seine Aufgabe in zehn Mikrosekunden oder weniger ausführen muss.
Es ist möglich, mit der Lua-Sprache einige funktionale Programmierungen durchzuführen. Wirklich, Lua ist eine Multi-Paradigma-Sprache; Wikipedia behauptet, es sei eine „scripting, imperative, funktionale, objektorientierte, prototypbasierte“ Sprache. Die Sprache erzwingt kein einzelnes Paradigma, sondern ist flexibel genug, um es dem Programmierer zu ermöglichen, jedes Paradigma zu implementieren, das auf die Situation anwendbar ist. Es wurde von Scheme beeinflusst.
Zu den Features von Lua gehören erstklassige Funktionen , lexikalischer Geltungsbereich sowie Closures und Coroutines , die für die funktionale Programmierung nützlich sind. Sie können sehen, wie diese Funktionen im Lua-Benutzer-Wiki verwendet werden, das eine Seite hat, die der funktionalen Programmierung gewidmet ist . Ich bin auch auf dieses Google Code-Projekt gestoßen , aber ich habe es nicht verwendet (es behauptet, von Haskell beeinflusst zu sein, einer anderen Sprache, die Sie erwähnt haben).
eLua ist eine Implementierung, die für eine Reihe von Entwicklungsboards für die Architekturen ARM7TMDI, Cortex-M3, ARM966E-S und AVR32 konfiguriert verfügbar ist und Open Source ist, sodass Sie sie für Ihre eigene Plattform konfigurieren können. Lua ist in ANSI C implementiert und der gesamte Quellcode wiegt weniger als 200 kB, sodass Sie es für die meisten Plattformen mit einem C-Compiler erstellen können sollten. Mindestens 128 KB Flash und 32 KB RAM werden empfohlen. Ich arbeite derzeit an einem PIC32-Port dafür (allerdings noch in der Phase "Get the PIC32 Board").
Das Tolle an Lua ist, dass es als Glue-Sprache konzipiert wurde, sodass es sehr einfach ist, C-Erweiterungen für Dinge zu schreiben, die schnell sein müssen (wie Interrupts usw.), und die dynamischen, interpretierten Funktionen der Sprache zu nutzen, um schnell zu arbeiten Entwicklung in der Programmlogik.
Lua ist keine rein funktionale Sprache, aber Sie können darin eine Menge funktionaler Programmierung durchführen, es ist schnell und klein ( im Vergleich zu anderen Skriptsprachen ) und Sie müssen Ihr Gerät nicht neu flashen, um ein Programm auszuprobieren. Es gibt sogar einen interaktiven Dolmetscher!
"Gibt es Möglichkeiten, mit einer funktionalen Sprache auf einer MCU funktional zu programmieren, um schwierige Probleme zu lösen?"
Ja, es gibt Wege. Aber der Nachteil ist, dass Sie einen 32-Bit-Prozessor, MMU, 128 MB RAM, SSD, ein RTOS und $$$ benötigen.
Mikrocontroller sind anders als Mikroprozessoren. Der Mikrocontroller ist vielleicht nur eine 8-Bit-CPU, 1K RAM, 8K ROM, aber er hat einen eingebauten UART, PWM, ADC usw. Und er kostet nur 1,30 $.
Sie könnten also all diese Hochsprachen ausführen, aber es kostet viel mehr, sie zu erstellen.
Dieses Buch bietet eine Möglichkeit, mit einem leichten Gefühl von FP zu programmieren. http://www.state-machine.com/psicc2/
Echtes FP erfordert jedoch die Fähigkeit, Funktionen zur Laufzeit zu erstellen und sie über Ihr Programm zu übergeben. Hier haben wir ein Problem: Wie können wir diese konstruierte Funktion darstellen? und wie können wir diese Funktion effektiv ausführen? Auf einem großen System können wir dynamische Kompilierung verwenden, die echten Maschinencode auf einer ersten Funktionsanwendung generiert. Auf der MCU haben wir nur RAM, um sehr primitive Compiler wie den Forth-Sprachkern zu implementieren.
Die einzige Möglichkeit, FP oder OOP zu verwenden, wenn Sie dies bevorzugen, ist die Metaprogrammierung : Schreiben Sie komplexe Funktions-/OOP - Programme, die Programme für MCU generieren (z. B. C-Quellcode oder LLVM IL). Bei dieser Variante sind Sie nicht durch die Komplexität von Paradigmen oder Programmiermethoden eingeschränkt.
Kevin Vermeer
Kevin Vermeer
Nick T
Kortuk
Kevin Vermeer
Kortuk
J. Pölfer
Kevin Vermeer
Kevin Vermeer
J. Pölfer
Kellenjb
Kellenjb