Welche interaktiven Sprachen stehen in einem winzigen Speicher zur Verfügung? [geschlossen]


73

Ich suche Allzweck-Programmiersprachen, die

  • eine interaktive Eingabeaufforderung (Live-Codierung) haben
  • Arbeiten Sie in 32 KB RAM selbst oder in 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 bis jetzt, was vermisse ich?

  • Python : Die PyMite-VM benötigt 64 KB Flash und 8 KB RAM. Zielt auf LPC, SAM7 und ATmegas mit 8K oder mehr ab. Bereitgestellt.
  • Lua : In den eLua- FAQ werden 256 KB Flash und 64 KB RAM empfohlen.
  • FORTH : amforth benötigt 8K Flash, 150 Byte RAM, 30 Byte EEPROM auf einem ATmega.
  • Schema : Achselschema Schema Das kleinste Ziel ist der LPC2103 mit 32K Flash, 4K SRAM.
  • C : Interactive C läuft auf 68HC11 ohne Flash und 32K SRAM. Bereitgestellt.
  • C : picoc ein Open Source, Cross-Compiling, interaktives C-System. Bei der Kompilierung für AVR werden 63 KB Flash und 8 KB RAM benötigt. Der Arbeitsspeicher könnte reduziert werden, um die Tabellen im Flash zu halten.
  • C ++ : AngelScript ist eine Open Source, Bytecode-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 : Initialisiert mit einem 64K-Heap und ist möglicherweise anpassbar.
  • Lispeln
  • PostScript : (Ich habe noch keine FOSS-Implementierung für wenig Speicher gefunden.)
  • Shell : bitlash : Eine interaktive Befehlsshell für Arduino (ATmega). Siehe auch AVRSH .

2
Das vierte System, das Sie erwähnen, benötigt anscheinend nur 8 KB Flash, aber Sie listen es als 128 KB auf. Vermisse ich etwas
SingleNegationElimination

1) Die Flash / RAM-Nummern für das FORTH impl. ist für den genannten Prozessor. 2) Mir ist kein Community-Wiki im Stackoverflow bekannt. Ich werde es untersuchen.
dwhall

Es gibt eine Reihe von Versionen von Tcl für die eingebettete Programmierung: wiki.tcl.tk/1363
ars

2
Eine interessante Frage. Als Embedded-Programmierer bin ich gespannt, warum eine interaktive Eingabeaufforderung auf dem Embedded-System ausgeführt werden soll. Abgesehen vom "Neato" -Faktor. Solange mein eingebettetes System mit einem PC verbunden ist, würde ich versuchen, so viel wie möglich auf dem PC zu verarbeiten und nur minimalen Code im eingebetteten Gerät zu haben. Es ist im Allgemeinen einfacher, eine bestimmte Funktionalität in Code auf einem PC zu implementieren als in einem eingebetteten System.
Craig McQueen

2
Ich habe Interactive C während eines Wahlfachs Robotik im College verwendet. Durch die interaktive Eingabeaufforderung habe ich in 6 Wochen mehr über C gelernt als während des gesamten Semesters eines C-Labors. Ich programmiere Python seit 1996 und mit seiner interaktiven Eingabeaufforderung kann ich die Sprache (bis zu dem Punkt, an dem ich das tun muss, was ich tun musste) in 2 Tagen lernen. Daher glaube ich, dass interaktive Sprachen sich hervorragend zum Lernen und auch zum Rapid Prototyping eignen. Zuletzt bin ich der Hauptentwickler von PyMite, also suche ich nach Beispielen für Peer-Sprachen und lerne alles, was ich kann.
dwhall

Antworten:


9

Eine Homebrew-Forth-Laufzeit kann in der Tat in sehr wenig Speicher implementiert werden. Ich kenne jemanden, der in den 1970er Jahren einen auf einem Cosmac gemacht hat. Die Kernlaufzeit betrug nur 30 Bytes.


1
FORTH war bereits gelistet. Dies ist ein Kommentar, keine Antwort.
dwhall

8

Ich habe gehört, dass CHIP-8, XPL0, PicoC und Objective Caml auf Grafikrechner portiert wurden. Der Wikipedia-Artikel "Lego Mindstorms" listet eine Reihe von Programmiersprachen auf, die angeblich auf der Lego RCX- oder Lego NXT-Plattform laufen. Erfüllt einer von ihnen Ihre "Live-Codierungs" -Kriterien?

Vielleicht möchten Sie sich die anderen Mikrocontroller-Forths im Forth-Wiki ansehen. Es werden mindestens 4 Forths für den Atmel AVR aufgelistet: amforth (den Sie bereits erwähnen), PFAVR, avrforth und ByteForth.
(Links zu diesen Interpreten sowie diese StackOverflow-Frage sind im Wikibook " Embedded Systems " enthalten.)


5

Ich würde LUA (oder eLUA http://www.eluaproject.net/ ) empfehlen . Ich habe LUA vor einiger Zeit auf einen Cortex-M3 "portiert". Von der Oberseite meines Kopfes hatte es eine Flash-Größe von 60 ~ 100 KB und benötigte ungefähr 20 KB RAM, um zu laufen. Ich habe mich auf das Wesentliche beschränkt, aber je nach Ihrer Anwendung könnte das ausreichen. Es gibt noch Raum für Optimierungen, insbesondere in Bezug auf die RAM-Anforderungen, aber ich bezweifle, dass Sie es bequem in 8 KB ausführen können.


Danke, aber das eLua-Projekt war bereits auf meiner Liste (siehe den zweiten Punkt in der Frage).
dwhall

5

5

Wren entspricht Ihren Kriterien - standardmäßig ist es so konfiguriert, dass nur 4 KB RAM verwendet werden. AFAIK es hat keine wirkliche Verwendung gesehen, da der Typ, für den ich es geschrieben habe, entschieden hat, dass er keinen Dolmetscher braucht, der vollständig auf dem Zielsystem läuft.

Die Sprache wird am offensichtlichsten von ML und Forth beeinflusst.


2

Haben Sie einen Port in C of Tiny Basic in Betracht gezogen ? Oder schreiben Sie die UCSD Pascal p-Maschine von Z-80 in Ihre Architektur um?

Im Ernst, JavaScript wäre eine gute eingebettete Skriptsprache, aber ich habe keine Ahnung, wie hoch die Mindestspeicheranforderungen für VM + GC sind und wie schwierig es ist, Betriebssystemabhängigkeiten zu entfernen. Ich habe vor einiger Zeit mit NJS gespielt , was möglicherweise Ihren Bedürfnissen entsprechen könnte. Dieser ist insofern interessant, als der Compiler in JavaScript (Self-Hosting) geschrieben ist.


2

Sie können sich einen sehr leistungsstarken AvrCo Multitasking Pascal für AVR ansehen. Sie können es unter http://www.e-lab.de versuchen . Die MEGA8 / 88-Version ist kostenlos. Es gibt unzählige Treiber und Simulatoren mit JTAG-Debugger und schönen Live- oder simulierten Visualisierungen aller Standardgeräte (LCDCHAR, LCDGRAPH, 7SEG, 14SEG, LEDDOT, KEYBOARD, RC5, SERVO, STEPPER ...).


1

Sie vermissen EmbedVM, Homepage hier , SVN Repo hier . Denken Sie daran, beide [ 1 , 2 ] Videos auf der Titelseite zu lesen;)

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.

Die VM simuliert eine 16-Bit-CPU, die auf bis zu 64 KB Speicher zugreifen kann. Es kann nur mit 16-Bit-Werten und Arrays mit 16-Bit- und 8-Bit-Werten arbeiten. Komplexe Datenstrukturen (Struktur, Objekte usw.) werden nicht unterstützt. Eine Funktion kann maximal 32 lokale Variablen und 32 Argumente haben.

Neben dem Speicher für die VM, einer kleinen Struktur, die den VM-Status enthält, und der angemessenen Speichermenge, die die EmbedVM-Funktionen auf dem Stapel benötigen, gibt es keine zusätzlichen Speicheranforderungen für die VM. Insbesondere die VM ist nicht von einer dymaischen Speicherverwaltung abhängig.

EmbedVM ist auf Größe und Einfachheit optimiert, nicht auf Ausführungsgeschwindigkeit. Die VM selbst belegt etwa 3 KB Programmspeicher auf einem AVR-Mikrocontroller. Auf einem AVR ATmega168 mit 16 MHz kann die VM etwa 75 VM-Anweisungen pro Millisekunde ausführen.

Alle von der VM vorgenommenen Speicherzugriffe werden mithilfe von Benutzerrückruffunktionen ausgeführt. So ist es möglich, einen Teil oder den gesamten VM-Speicher auf externen Speichergeräten, Flash-Speicher usw. oder "Memory-Map" -Hardwarefunktionen für die VM zu haben.

Der Compiler ist ein UNIX / Linux-Befehlszeilentool, das eine * .evm-Datei einliest und Bytecode in verschiedenen Formaten (Binärdatei, Intel Hex, C-Array-Initialisierer und ein spezielles Debug-Ausgabeformat) generiert. Außerdem wird eine Symboldatei generiert, mit der über die Hostanwendung auf Daten im VM-Speicher zugegriffen werden kann.

Die C-ähnliche Sprache sieht folgendermaßen aus: http://svn.clifford.at/embedvm/trunk/examples/numberquizz/vmcode.evm



1

Es gibt auch JavaScript über Espruino .

Dies wurde speziell für Mikrocontroller entwickelt und es gibt Builds für verschiedene Chips (hauptsächlich STM32s), die ein vollständiges System in nur 8 KB RAM passen.


0

Haben Sie darüber nachgedacht, einfach die /bin/sh von Busybox gelieferte zu verwenden ? Oder eine der kleineren Skriptsprachen, die sie empfehlen?


3
Ich suche nach Sprachen, die auf Mikrocontrollern ohne MMU ausgeführt werden und über einen so kleinen RAM (8K-32K) verfügen, dass ein Betriebssystem nicht zumutbar ist. Ich werde die Frage bearbeiten, um dies klarer zu machen.
dwhall

ucLinux hat keine MMU und läuft auf Mikrocontrollern. Es verwendet Busybox.
Jay Atkinson

@DoxaLogos: Danke, dass Sie zu meiner Verteidigung gekommen sind, aber ich glaube nicht, dass ucLinix in diesem kleinen Speicherbereich ausgeführt wird. (Ich habe zuerst nicht gelesen. Die Antwort hinterlassen, weil sie für andere nützlich sein könnte.) Weiß jemand, wie klein ein Betriebssystem ist, das Sie schreiben können und das BB unterstützt?
dmckee --- Ex-Moderator Kätzchen

0

Prolog - http://www.gprolog.org/

Laut einer Google-Suche "prolog small" kann die Größe der ausführbaren Datei ziemlich klein gemacht werden, indem vermieden wird, dass die integrierten Prädikate verknüpft werden.


0

Keine der Sprachen in der Liste in der Frage oder in den Antworten erwies sich als zufriedenstellend für die Anforderung einer supereinfachen Kompilierung und Integration in ein bestehendes Mikrocontroller-Projekt (Offenlegung: Ich habe nicht jeden einzelnen der Vorschläge ausprobiert).

Ich habe stattdessen tinyscript gefunden , eine einzelne .c+ .hDatei, die mit den restlichen Quelldateien in meinem Projekt kompiliert wurde. Die einzige zusätzliche Konfiguration, die erforderlich ist, besteht darin, eine Datei bereitzustellen, void outchar(int c)die leer sein kann, wenn Sie keine Ausgabe von den Skripten benötigen.

Für mich ist die Ausführungsgeschwindigkeit weitaus weniger wichtig als die einfache Erstellung und Integration sowie die Interaktion mit C, da mein Anwendungsfall hauptsächlich darin besteht, einige C-Funktionen der Reihe nach aufzurufen.


-1

Ich habe in meiner vorherigen Arbeit Busybox auf einem BlackFin verwendet.

wir haben perl + php dafür kompiliert, nachdem wir s / fork / vfork / g geändert haben, hat es ziemlich gut funktioniert ... mehr oder weniger. Keine MMU zu haben ist keine gute Idee. Die Speicherfragmentierung wird den Server ziemlich leicht töten. Alles was ich getan habe 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 :)


Diese Antwort wird nicht akzeptiert, da Perl und PHP nicht in weniger als 32 KB RAM ausgeführt werden. Keine MMU zu haben ist eine Voraussetzung. Ich arbeite an tief eingebetteten Systemen. 32 KB ist die Gesamtmenge des RAM in dem System.
dwhall

-1

Ich würde vorschlagen, Python zu verwenden. Aber jetzt ist das einzige Problem der Speicheraufwand, oder? Ich habe also eine großartige Idee für Leute, die später in diesem Problem stecken bleiben könnten.

Als erstes schreiben Sie einen bf-Interpreter (oder holen Sie sich einfach den Quellcode von irgendwoher). Der Dolmetscher wird sehr klein sein. Auch bf ist eine vollständige Turing-Sprache. Jetzt müssen Sie Ihren Code in Python schreiben und ihn dann mit bfpy ( https://github.com/felko/bfpy/blob/master/README.md ) in bf transpilieren . Ich habe Ihnen die Lösung mit dem geringsten Aufwand gegeben und bin mir ziemlich sicher, dass ein bf-Interpreter problemlos unter 10 KB RAM-Auslastung bleibt.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.