Ich suche nach Allzweck-Programmiersprachen, die
Unten ist meine Liste, was fehle ich?
Eine homebrew Forth-Laufzeit kann in der Tat mit sehr wenig Speicher implementiert werden. Ich kenne jemanden, der in den 70er Jahren einen auf einem Cosmac gemacht hat. Die Kernlaufzeit betrug nur 30 Bytes.
Ich habe gehört, dass CHIP-8, XPL0, PicoC und Objective Caml in grafische Taschenrechner portiert wurden. Der Wikipedia-Artikel "Lego Mindstorms" listet eine Reihe von Programmiersprachen auf, die angeblich auf der Lego RCX- oder Lego NXT-Plattform ausgeführt werden . Erfüllen einige von ihnen Ihre "Live-Codierungs" -Kriterien?
Vielleicht möchten Sie die anderen Mikrocontroller-Forths im Forth-Wiki überprüfen. Es listet mindestens 4 Forths für den Atmel AVR auf: amforth (was Sie bereits erwähnen), PFAVR, avrforth und ByteForth.
(Links zu diesen Interpreten sowie diese StackOverflow-Frage sind im wikibook " Embedded Systems " enthalten).
Ich würde LUA empfehlen (oder eLUA http://www.eluaproject.net/ ). Ich habe vor einiger Zeit LUA auf einen Cortex-M3 "portiert". Von meinem Kopf aus hatte es eine Flashgröße von 60 ~ 100 KB und brauchte ungefähr 20 KB RAM, um ausgeführt zu werden. Ich habe mich auf das Nötigste konzentriert, aber abhängig von Ihrer Anwendung könnte das reichen. Es gibt noch Raum für die Optimierung, insbesondere über die Anforderungen von RAM, aber ich bezweifle, dass Sie es in 8 KB komfortabel ausführen können.
Wren entspricht Ihren Kriterien - Standardmäßig sind nur 4 KB RAM erforderlich. AFAIK hat keinen wirklichen Nutzen gesehen, da der Typ, für den ich ihn geschrieben habe, entschied, dass er keinen Dolmetscher brauchte, der auf dem Zielsystem läuft.
Die Sprache wird am offensichtlichsten von ML und Forth beeinflusst.
Einige AVR-Interpreter/VMs:
Sie können einen Blick auf sehr leistungsfähige AvrCo Multitasking Pascal für AVR werfen. Sie können es unter http://www.e-lab.de ausprobieren. Die MEGA8/88-Version ist kostenlos. Es gibt jede Menge Treiber und Simulator mit dem JTAG-Debugger und Nice Live oder simulierten Visualisierungen aller Standardgeräte (LCDCHAR, LCDGRAPH, 7SEG, 14SEG, LEDDOT, KEYBOARD, RC5, SERVO, STEPPER ...).
Haben Sie über einen Port in C von Tiny Basic nachgedacht? Oder vielleicht die UCSD Pascal p-Maschine in Ihre Architektur von Z-80 umschreiben?
Im Ernst, JavaScript wäre zwar eine gute eingebettete Skriptsprache, aber ich habe keine Ahnung, wie wenig Speicherplatz mindestens für den VM + GC erforderlich ist, und wie schwer es ist, Betriebssystemabhängigkeiten zu entfernen. Ich habe mit NJS eine Weile gespielt, was möglicherweise Ihren Bedürfnissen entspricht. Dies ist insofern interessant, als der Compiler in JavaScript (Self-Hosting) geschrieben ist.
Es gibt auch JavaScript über Espruino .
Diese wurde speziell für Mikrocontroller entwickelt, und es gibt Versionen für verschiedene Chips (hauptsächlich STM32-Chips), die ein komplettes System in weniger als 8 KB RAM speichern.
Sie vermissen EmbedVM, homepage hier , svn repo hier . Vergiss nicht, dir beide [ 1 , 2 ] Videos auf der Titelseite anzusehen;)
Von der Homepage:
EmbedVM ist eine kleine einbettbare virtuelle Maschine für Mikrocontroller mit einem C-ähnlichen Sprach-Frontend. Es wurde mit GCC- und AVR-Mikrocontrollern getestet. Da die virtuelle Maschine jedoch recht einfach ist, sollte es einfach sein, sie auf andere Architekturen zu portieren.
Das VM simuliert eine 16-Bit-CPU, die auf bis zu 64 KB Arbeitsspeicher zugreifen kann. Es kann nur mit 16-Bit-Werten und Arrays mit 16-Bit- und 8-Bit-Werten gearbeitet werden. Komplexe Datenstrukturen (Strukturen, Objekte usw.) werden nicht unterstützt. Eine Funktion kann maximal 32 lokale Variablen und 32 Argumente enthalten.
Neben dem Arbeitsspeicher für die VM, einer kleinen Struktur mit dem Status VM und der angemessenen Menge an Arbeitsspeicher, die die EmbedVM-Funktionen auf dem Stapel benötigen, gibt es keine zusätzlichen Arbeitsspeicheranforderungen für die VM. Insbesondere das VM hängt nicht von einer dynamischen Speicherverwaltung ab.
EmbedVM ist auf Größe und Einfachheit optimiert, nicht auf Ausführungsgeschwindigkeit. Die VM selbst belegt auf einem AVR-Mikrocontroller etwa 3 KB Programmspeicher. Auf einem AVR ATmega168 mit 16 MHz kann der VM ungefähr 75 VM Anweisungen pro Millisekunde ausführen.
Alle von VM ausgeführten Speicherzugriffe werden mithilfe von Benutzer-Rückruffunktionen ausgeführt. So ist es möglich, einen Teil oder den gesamten VM Speicher auf externen Speichergeräten, Flash-Speichern usw. oder Hardware-Funktionen für die "Speicherzuordnung" der VM zu haben.
Der Compiler ist ein UNIX/Linux-Befehlszeilentool, das eine * .evm-Datei einliest und Bytecode in verschiedenen Formaten generiert (Binärdatei, Intel Hex, C-Array-Initialisierer und ein spezielles Debug-Ausgabeformat). Außerdem wird eine Symboldatei generiert, mit der über die Hostanwendung auf Daten im Speicher VM zugegriffen werden kann.
Die C-ähnliche Sprache sieht folgendermaßen aus: http://svn.clifford.at/embedvm/trunk/examples/numberquizz/vmcode.evm
Ich würde MY-BASIC empfehlen, läuft mit mindestens 8 KB RAM und ist einfach zu portieren.
Prolog - http://www.gprolog.org/
Gemäß einer Google-Suche "prolog small" kann die Größe der ausführbaren Datei sehr klein gemacht werden, indem die eingebauten Prädikate nicht verknüpft werden.
Ich würde Python vorschlagen. Aber jetzt ist das einzige Problem der Arbeitsspeicher, richtig? Ich habe also eine großartige Idee für Leute, die später in diesem Problem stecken könnten.
Zuerst schreiben Sie einen bf-Interpreter (oder holen Sie sich einfach irgendwo Quellcode). Der Dolmetscher wird wirklich klein sein. Auch bf ist eine komplette Turing-Sprache. Jetzt müssen Sie Ihren Code in Python schreiben und dann mit bfpy ( https://github.com/felko/bfpy/blob/master/README.md ) in bf umwandeln. Ich habe Ihnen die Lösung mit dem geringsten Aufwand gegeben und ich bin mir ziemlich sicher, dass ein BF-Interpreter leicht unter 10 KB RAM-Nutzung bleiben wird.
Keine der Sprachen in der Liste in der Frage oder in den Antworten erwies sich als zufriedenstellend für das Erfordernis einer extrem einfachen Kompilierung und Integration in ein vorhandenes Mikrocontroller-Projekt (Offenlegung: Ich habe nicht jeden einzelnen Vorschlag ausprobiert).
Ich habe stattdessen tinyscript gefunden, bei dem es sich um eine einzelne .c
+ .h
-Datei handelt, die mit den übrigen Quelldateien in meinem Projekt kompiliert wurde. Die einzige zusätzliche Konfiguration besteht darin, eine void outchar(int c)
bereitzustellen, die leer sein kann, wenn Sie keine Ausgabe benötigen aus den Skripten.
Die Ausführungsgeschwindigkeit ist für mich weit weniger wichtig als die einfache Erstellung, Integration und Interoperabilität mit C, da mein Anwendungsfall hauptsächlich nur das Aufrufen einiger C-Funktionen in der richtigen Reihenfolge umfasst.
Haben Sie überlegt, einfach den von busybox gelieferten /bin/sh
zu verwenden? Oder eine der kleineren Scriptsprachen empfehlen sie?
Ich habe in meiner vorherigen Arbeit busybox auf einem BlackFin verwendet.
wir haben dafür perl + php kompiliert, nachdem wir s/fork/vfork/g geändert hatten, funktionierte es ziemlich gut ... mehr oder weniger. Es ist keine gute Idee, kein MMU zu haben. Durch die Speicherfragmentierung wird der Server ziemlich schnell abgebrochen. Alles was ich tat war:
for i in `seq 1 100`; do wget http://black-fin-ip/test.php; done
Es starb, als ich zu meinem Chef ging und ihm sagte, dass der Server in der Produktion sterben wird :)