Con i sistemi embedded basati su microcontrollori a 8 e 16 bit, si arriva alla conclusione che è più semplice sviluppare software in grado di adattarsi alle risorse limitate di queste limitazioni di archiviazione molto modeste (forse qualche 100 byte di RAM per microcontrollori a 8 bit di fascia bassa , con 2-8 KiB di ROM o EPROM / Flash per la memorizzazione del codice).
In quei casi, linguaggi di piccole dimensioni come C o assembly tendono ad essere i linguaggi di sviluppo più comunemente utilizzati. Come confronto relativo molto approssimativo, un assemblatore completo e un compilatore C99 possono adattarsi a un singolo disco floppy, mentre sono necessari diversi MiB per un moderno sistema di sviluppo C ++ (con STL, ecc.).
Quando si guardano i micro di fascia più alta (high-end a 16 bit e principalmente a 32 bit, con 64 bit abbastanza rari) e DSP in ambienti embedded, le restrizioni si indeboliscono e lo sviluppo del software può costituire la maggior parte dello sviluppo sforzo, quindi ha senso utilizzare gli strumenti di sviluppo più produttivi, compresi linguaggi più avanzati con funzionalità come linguaggi di programmazione orientata agli oggetti (OOP) come C ++ e linguaggi più recenti (Java, Perl, Ruby, Python).
È possibile in Assembly e C prevedere la quantità di memoria utilizzata, in modo che sia possibile progettare con uno spazio limitato, ma funzionalità avanzate come modelli, gestione delle eccezioni e associazione runtime rendono impossibile conoscere esattamente il footprint di memoria necessario per un programma C ++ standard in anticipo. Non ne so abbastanza di MISRA C ++ , che è un sottoinsieme di C ++, per commentarlo.
I linguaggi basati su macchine virtuali che eseguono byte-code (Java, Perl, Python) sono meno maturi nell'esperienza dello sviluppatore incorporato e poiché questi linguaggi sono progettati per isolare il programmatore dal particolare hardware, rende anche più difficile essere coscienti di limitazioni e restrizioni di tale sistema hardware incorporato. Questo è meno un problema con processori veloci a 32 bit (ad esempio ARMv7) con MiB se non GiB di RAM.
Tutte le implementazioni BASIC di cui sono a conoscenza sono piuttosto semplicistiche nelle caratteristiche del linguaggio, rimanendo sostanzialmente fedele all'eredità di Dartmouth BASIC degli anni '60. Ciò significa che la lingua non ha librerie runtime complesse o gestione delle eccezioni e che un interprete o un compilatore è abbastanza semplice da scrivere ed ha anche dimensioni di file ridotte. La maggior parte dei microcontrollori ha almeno un compilatore BASIC disponibile per questo.
Spero che delinei i motivi per cui troverai C e assembly utilizzati principalmente su sistemi embedded più piccoli o più vecchi, e con le limitazioni dei nuovi sistemi embedded di fascia medio-alta differiscono solo leggermente da un personal computer desktop tradizionale.