67

Sto cercando linguaggi di programmazione di uso generale cheQuali sono i linguaggi interattivi disponibili che vengono eseguiti in una memoria minuscola?

  • hanno un interattivo (codifica dal vivo) tempestive
  • lavoro in 32 KB di RAM per sé o 8 KB quando il compilatore è ospitato su una macchina separata
  • eseguito su un microcontrollore con un minimo di 8-32 KB di RAM totale (senza MMU).

Di seguito è la mia lista finora, cosa mi manca?

  • Python: Il PyMite VM ha bisogno di 64K flash, 8K RAM. Mira a LPC, SAM7 e ATmegas con 8K o più. Ospitato.
  • Lua: le domande frequenti eLua consigliano 256K flash, 64 KB di RAM.
  • FORTH: amforth ha bisogno di 8K flash, 150 byte di RAM, 30 byte EEPROM su un ATmega.
  • Schema: armpit Scheme L'obiettivo più piccolo è LPC2103 con 32K Flash, 4K SRAM.
  • C: Interactive C gira su 68HC11 senza flash e 32K SRAM. Ospitato.
  • C: picoc un sistema C interattivo, cross-compiling, open source. Quando compilato per AVR, richiede un flash da 63 K, 8 K RAM. La RAM potrebbe essere ridotta con lo sforzo di mantenere le tabelle in flash.
  • C++: AngelScript un linguaggio di scripting open source, basato su byte code, C/C++ con chiamate native semplici.
  • Tcl: TinyTCL eseguito su DOS, 60 KB binario. Sembra facile da portare.
  • BASIC: TinyBasic: Inizializza con un heap di 64 KB, potrebbe essere regolabile.
  • Lisp
  • PostScript: (non ho trovato un'implementazione FOSS a partire memoria ancora)
  • Shell: bitlash: Una shell di comando interattivo per Arduino (ATmega). Vedi anche AVRSH.
+1

Il quarto sistema che hai menzionato sembra richiedere solo 8k di flash, ma lo elencherai come 128k. Mi sto perdendo qualcosa? – SingleNegationElimination

+2

dovrebbe essere wiki della comunità. – SilentGhost

+0

1) I numeri Flash/RAM per l'impl di FORTH. è per il processore nominato. 2) Non sono a conoscenza di una wiki della comunità in StackOverflow. Lo esaminerò. – dwhall

risposta

8

ci sono un certo numero di versioni di Tcl per la programmazione incorporato:

http://wiki.tcl.tk/1363

+0

Ettcl è troppo grande per il limite di 32 KB, ma il collegamento che hai fornito ha altre implementazioni minori che si avvicinano. Grazie. – dwhall

+0

Hai ragione, mio ​​errore. Ho modificato la mia risposta per rimuovere quel collegamento dopo aver realizzato la stessa cosa. – ars

0

Avete considerato semplicemente l'utilizzo dello /bin/sh fornito da busybox? O su del smaller scripting languages loro raccomandano?

+3

Sto cercando linguaggi che girano su microcontrollori senza MMU e hanno una RAM talmente piccola (8K-32K) che un SO non è ragionevole. Modificherò la domanda per renderla più chiara. – dwhall

+0

ucLinux non ha una MMU e gira su microcontrollori. Usa busybox. –

+0

@DoxaLogos: Grazie per essere venuto in mia difesa e tutto il resto, ma non credo che ucLinix possa funzionare in questo piccolo spazio di memoria. (All'inizio non l'ho letto, lasciando la risposta perché potrebbe essere utile a qualcun altro che passa.) Qualcuno sa quanto piccolo è un sistema operativo che si può scrivere che supporterà BB? – dmckee

0

Ho utilizzato nel mio precedente busybox di lavoro su un BlackFin.

abbiamo compilato perl + php per questo, dopo aver cambiato s/fork/vfork/g ha funzionato abbastanza bene ... più o meno. Non avere una MMU non è una buona idea. La frammentazione della memoria ucciderà il server abbastanza facilmente.Tutto quello che ho fatto è stato:

for i in `seq 1 100`; do wget http://black-fin-ip/test.php; done 

E 'morto mentre stavo camminando al mio capo e lui che il server sta per morire nella produzione :) raccontare

+0

Questa risposta non è accettata perché Perl e PHP non vengono eseguiti con meno di 32 KB di RAM. Non avere MMU è un requisito. Sto lavorando su sistemi profondamente integrati; 32 KB è la quantità * totale * di RAM nel sistema. – dwhall

6

un tempo di esecuzione di homebrew Forth può essere implementata in poca memoria infatti. Conosco qualcuno che ne ha fatto uno su un Cosmac negli anni '70. Il runtime di base era di soli 30 byte.

+1

FORTH era già elencato. Questo è un commento, non una risposta. – dwhall

5

Suggerirei LUA (o Elua http://www.eluaproject.net/). Ho "portato" LUA su un Cortex-M3 qualche tempo fa. Dall'alto della mia testa aveva una dimensione del flash di 60 ~ 100KB e avevo bisogno di circa 20KB di RAM per funzionare. Mi sono spogliato fino all'essenziale, ma a seconda dell'applicazione, potrebbe essere sufficiente. C'è ancora spazio per l'ottimizzazione, in particolare per quanto riguarda i requisiti di RAM, ma dubito che sia possibile farlo funzionare comodamente in 8 KB.

+0

Grazie, ma il progetto eLua era già nella mia lista (vedi il secondo punto nella domanda). – dwhall

2

Avete considerato un port in C di Tiny Basic? O forse riscrivendo la p-machine UCSD Pascal nella tua architettura da Z-80?

Seriamente, JavaScript sarebbe un buon linguaggio di scripting incorporato, ma non ho idea di quali siano i requisiti minimi di memoria per VM + GC, né quanto sia difficile rimuovere le dipendenze del SO. Ho giocato con NJS un po 'indietro, che potrebbe adattarsi alle tue esigenze. Questo è interessante in quanto il compilatore è scritto in JavaScript (self hosting).

0

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

Secondo una ricerca google "Prolog piccola" la dimensione del file eseguibile può essere fatta piuttosto piccolo, evitando che collega i predicati built-in.

7

Ho sentito dire che CHIP-8, XPL0, PicoC, e Objective Caml sono stati portati su calcolatrici grafiche. L'articolo "Lego Mindstorms" di Wikipedia elenca una serie di linguaggi di programmazione che presumibilmente funzionano sulla piattaforma Lego RCX o Lego NXT. Qualcuno di loro ha i suoi criteri "live coding"?

Si potrebbe voler controllare gli altri Forth del microcontrollore nella wiki Forth. Elenca almeno 4 Forths per l'Atmel AVR: amforth (che già citi), PFAVR, avrforth e ByteForth.
(I collegamenti a tali interpreti, nonché questa domanda StackOverflow, sono inclusi nel wikibook "Embedded Systems").

2

È possibile dare un'occhiata a AvrCo Multitasking Pascal molto potente per AVR. Puoi provarlo allo http://www.e-lab.de. La versione MEGA8/88 è gratuita. Ci sono un sacco di driver e simulatore con debugger JTAG e belle visualizzazioni live o simulate di tutti i dispositivi standard (LCDCHAR, LCDGRAPH, 7SEG, 14SEG, LEDDOT, KEYBOARD, RC5, SERVO, STEPPER ...).

4
4

Wren si adatta alle vostre criteri - di default è configurato per l'utilizzo solo 4k di RAM. AFAIK non ha visto alcun uso effettivo, dal momento che il ragazzo che ho scritto per decidere ha deciso che non aveva bisogno di un interprete che si dirigesse interamente sul sistema di destinazione dopotutto.

La lingua è influenzata più chiaramente da ML e Forth.

1

Ti manca EmbedVM, homepage here, svn repository here. Ricordati di controllare entrambe le [1, 2] video in prima pagina;)

Dalla homepage:

EmbedVM è una piccola macchina virtuale embeddable per microcontrollori con un frontend linguaggio C-like. È stato testato con i microcontrollori GCC e AVR . Ma dato che la macchina virtuale è piuttosto semplice, lo dovrebbe essere facile per portarlo su altre architetture.

La VM simula una CPU a 16 bit che può accedere a 64kB di memoria. Lo può operare solo su valori a 16 bit e array di valori a 16 bit e 8 bit. Non c'è supporto per strutture dati complesse (struct, objects, ecc.). Una funzione può avere un massimo di 32 variabili locali e 32 argomenti .

Oltre alla memoria per la VM, una piccola struttura che tiene lo stato VM e ragionevole quantità di memoria funzioni EmbedVM bisogno in pila non vi sono requisiti di memoria aggiuntivi per la VM. Soprattutto la VM non dipende da alcuna gestione della memoria dinamica.

EmbedVM è ottimizzato per dimensioni e semplicità, non per velocità di esecuzione. La macchina virtuale occupa circa 3kB di memoria di programma su un microcontrollore AVR . Su un AVR ATmega168 in esecuzione a 16 MHz, la VM può eseguire circa 75 istruzioni VM per millisecondo.

Tutti gli accessi di memoria eseguiti dalla VM vengono parformati utilizzando le funzioni di callback utente . Quindi è possibile avere una parte o tutta la memoria VM su dispositivi di memoria esterna , memoria flash, ecc. O hardware "mappa di memoria" funzioni nella VM.

Il compilatore è uno strumento a riga di comando UNIX/Linux che legge in un file * .evm e genera bytecode in formati vaious (file binario, hex intel, C inizializzatori di array e uno speciale formato di output di debug). Inoltre, genera un file di simboli che può essere utilizzato per accedere ai dati nella memoria della VM dall'applicazione host.

Il linguaggio C-like si presenta così: http://svn.clifford.at/embedvm/trunk/examples/numberquizz/vmcode.evm

1

Suggerirei MY-BASIC, corre con in minima 8 KB di RAM, e facile da porto.

0

C'è anche JavaScript, tramite Espruino.

Questo è costruito specificamente per i microcontrollori e ci sono build per vari chip diversi (principalmente STM32) che si adattano a un sistema completo in un minimo di 8kB di RAM.

2

Suggerisco di usare python. Ma ora l'unico problema è il sovraccarico della memoria, giusto? Quindi ho una grande idea per le persone che potrebbero essere bloccate in questo problema in seguito.

Per prima cosa, scrivi un interprete bf (o ottieni semplicemente il codice sorgente da qualche parte). L'interprete sarà davvero piccolo. Anche bf è un linguaggio completo di Turing. Ora devi scrivere il tuo codice in python e poi trasferirlo su bf usando bfpy (https://github.com/felko/bfpy/blob/master/README.md). Ti ho dato la soluzione con il minimo sovraccarico e sono abbastanza sicuro che un interprete bf rimarrà facilmente sotto i 10KB di RAM.