wake-up-neo.com

Was sind die verfügbaren interaktiven Sprachen, die in winzigem Speicher ausgeführt werden?

Ich suche nach Allzweck-Programmiersprachen, die

  • eine interaktive (Live-Codierung) Eingabeaufforderung haben
  • arbeiten in 32 KB von RAM selbst oder 8 KB, wenn der Compiler auf einem separaten Computer gehostet wird
  • laufen Sie auf einem Mikrocontroller mit nur 8-32 KB RAM (ohne MMU).

Unten ist meine Liste, was fehle ich?

  • Python : Das PyMite VM benötigt 64K Flash, 8K RAM. Zielt auf LPC, SAM7 und ATmegas mit 8K oder mehr ab. Gehostet.
  • Lua : Das eLua FAQ empfiehlt 256 KB Flash und 64 KB RAM.
  • WEITER: amforth benötigt 8K Flash, 150 Bytes RAM, 30 Bytes EEPROM auf einem ATmega.
  • Schema : Achselschema Das kleinste Ziel ist der LPC2103 mit 32K Flash, 4K SRAM.
  • C: Interactive C läuft auf 68HC11 ohne Flash und 32K SRAM. Gehostet.
  • C: picoc ein quelloffenes, interaktives C-System zum Cross-Compilieren. Bei der Kompilierung für AVR sind 63K Flash und 8K RAM erforderlich. Das RAM könnte reduziert werden, um Tabellen in Flash zu halten.
  • C++ : AngelScript eine Open Source, Byte-Code-basierte, C/C++ ähnliche Skriptsprache mit einfachen nativen Aufrufen.
  • Tcl : TinyTCL läuft unter DOS, 60K binär. Sieht einfach zu portieren aus.
  • BASIC: TinyBasic : Wird mit einem 64-KB-Heap initialisiert und kann angepasst werden.
  • LISP
  • PostScript : (Ich habe noch keine FOSS-Implementierung für wenig Speicher gefunden)
  • Shell : bitlash : Eine interaktive Befehls-Shell für Arduino (ATmega). Siehe auch AVRSH .
71
dwhall

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).

7
David Cary

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.

5
Ron

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.

4
Darius Bacon
4
avra

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 ...).

2
avra

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.

2
James Hugard

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.

1
Gordon Williams

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

1
Morten Jensen

Ich würde MY-BASIC empfehlen, läuft mit mindestens 8 KB RAM und ist einfach zu portieren.

1
paladin_t

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.

0
Larry Watanabe

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.

0
Thomas

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.

0
Daniel Landau

Haben Sie überlegt, einfach den von busybox gelieferten /bin/sh zu verwenden? Oder eine der kleineren Scriptsprachen empfehlen sie?

0
dmckee

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 :)

0
elcuco