Linguaggio embedded mission critical [chiuso]

7

Forse la domanda sembra un po 'strana, quindi spiegherò un po' lo sfondo.

Attualmente sto lavorando a un progetto in un'università, che sarà un software di bordo completo per un satellite. Il sistema è programmato in C ++ su un sistema operativo in tempo reale. Tuttavia, alcuni sottosistemi come il sistema di controllo degli assetti e il rilevamento dei guasti e una simulazione spaziale sono attualmente implementati solo in Matlab / Simulink, per prototipare in modo efficiente gli algoritmi. Dopo la loro verifica, saranno tradotti in c ++.

Il software di bordo completo è diventato molto complesso e solo una manciata di persone conosce l'intero sistema. Inoltre, molti studenti non hanno ancora programmato in C ++ e la gestione manuale della memoria di C ++ rende ancora più difficile scrivere software mission-critical.

Ovviamente il sistema principale deve essere implementato in C ++, ma mi sono chiesto se è possibile usare un linguaggio embedded per implementare il sottosistema che è attualmente scritto in Matlab. Questo linguaggio incorporato dovrebbe includere:

  • tipizzazione statica / strong e controlli del compilatore per ridurre al minimo gli errori di runtime
  • utilizzo della memoria di piccole dimensioni e relativo tempo di esecuzione veloce
  • gli algoritmi di controllo degli assetti sono principalmente calcoli numerici, quindi un buon supporto numerico sarebbe bello
  • forse una sorta di funzione di programmazione funzionale, matlab / simulink ti incoraggiano a usarlo anche

Ho cercato su Google un po ', ma ho trovato solo Lua. È bello, ma non lo userei nel software mission-critical. Ti sei mai imbattuto in una situazione del genere o conosci qualche lingua che potrebbe soddisfare le condizioni?

EDIT: per chiarire alcune cose: embedded significa che dovrebbe essere in grado di incorporare la lingua nell'ambiente C ++ esistente. Quindi nessun linguaggio compilato come Ada o Haskell

    
posta Moe 15.11.2011 - 20:24
fonte

9 risposte

14

Usa C ++, non utilizzare alcun elemento incorporato / stratificato.

Risponderò alla domanda in modo negativo e ti dirò di usare C ++, assumere risorse appropriate e non sovrapporre qualcos'altro in cima. La maggior parte dei tuoi criteri è già compatibile con C ++: strong tipizzazione, runtime minimo, ecc. (Digitare non così strong come Haskell, ma meglio della maggior parte dei linguaggi di scripting)

Non hai nemmeno bisogno di usare molte classi e oggetti se non vuoi. Scrivi uno stile più funzionale, a meno che tu non abbia bisogno di funzioni di ordine superiore e currying. Non vi è alcun peccato specifico nell'usare C ++ come C migliore, a meno che non lo faccia per caso. Se lo fai intenzionalmente, poi a tutto vapore.

Data la presunta criticità della missione, probabilmente non vorrai avere gli ulteriori livelli di complessità e punti di errore che un linguaggio integrato ti porterà.

Detto questo: scrivi come C ++ moderno come puoi, in particolare usando puntatori intelligenti appropriati (se usi memoria heap). Il C ++ ha fatto molta strada, e in particolare gran parte delle attività manuali di gestione della memoria sono ora meglio automatizzate usando shared_ptr, unique_ptr e simili. Se devi scrivere delete stai facendo qualcosa di sbagliato.

Se sei bloccato a volere qualcosa di incorporato, dai un'occhiata a Boost Proto .

    
risposta data 15.11.2011 - 22:08
fonte
6

Non sono sicuro di quale sia "mission-critical", ma per quello che vale ho più di 10 anni di esperienza nello sviluppo di software per sistemi embedded critici per la sicurezza.

Indipendentemente dalla lingua che scegli, avrai sicuramente bisogno di uno standard di codifica . Cioè, regole su come scrivere programmi, quali meccanismi sono permessi e quali sono vietati. Le regole dovrebbero essere nel modo di "non usare goto", "non usare macro simili a funzioni" ecc.

Questo è particolarmente importante se hai programmatori junior che partecipano al progetto. Perché potrebbero non sapere quali meccanismi sono considerati buone prassi e quali sono cattivi. E quasi certamente non conosceranno tutte le centinaia di casi oscuri e subdoli di comportamento non definito che la lingua contiene e altri argomenti così avanzati, ma estremamente importanti. Ad esempio, si può probabilmente scrivere un libro molto spesso solo sull'argomento di tutti i comportamenti non definiti / non definiti / definiti nell'implementazione in C ++.

Inoltre, gli standard di sicurezza del settore come DO178B o IEC 61508 impongono l'uso di un sottoinsieme ben definito del linguaggio di programmazione, e quindi deve avere uno standard di codifica.

La cosa più sensata da fare se non si ha esperienza degli standard di codifica è scegliere uno tra quelli predefiniti e ampiamente riconosciuti che sono standard di fatto dell'industria: MISRA-C, MISRA-C ++, SPARK ADA, Cert C ecc. Il vantaggio di tali standard di codifica del settore è che esistono già strumenti di test del software, ovvero analizzatori di codici statici / dinamici con supporto per essi. Non considerare nemmeno questo progetto senza uno strumento di analisi del codice appropriato!

(Parentesi relativa a specifiche tecniche: qualsiasi forma di gestione dinamica della memoria è vietata con lettere in grassetto in tutti gli standard di codifica per sistemi ad alta integrità, a prescindere dal linguaggio.In generale, non ha senso che tali sistemi si comportino in modi deterministici e la memoria dinamica ha senso solo in scenari non deterministici.)

    
risposta data 07.02.2012 - 10:57
fonte
5

Suggerisco Haskell come spunto di riflessione, anche se non soddisfa tutti i tuoi criteri:

Pro:

  • sistema di tipo molto buono, molti controlli del compilatore - è estremamente difficile convincere Haskell persino a guardare il tuo programma, tanto meno compilarlo! :)
  • nessuna gestione della memoria manuale
  • puro linguaggio di programmazione funzionale, completo complemento delle funzionalità FP

Contro:

  • pochissime persone conoscono Haskell e potrebbero essere difficili da imparare
  • non è simile alle lingue tradizionali - diversi idiomi, metodologie
  • scrivere programmi efficienti per la memoria è possibile, ma molto difficile

Incerto:

  • che linguaggio incorporato è
  • supporto numerico - non sono sicuro di cosa hai bisogno
risposta data 15.11.2011 - 20:49
fonte
3

Potresti cercare Ada . Potresti avere problemi a trovare qualcuno al di fuori della NASA che abbia scritto codice in esso però.

    
risposta data 15.11.2011 - 20:38
fonte
3

Ada è un ottimo linguaggio mission-critical. Infatti Esterline Avista a Platteville, Wisconsin usa ADA per i loro contratti con Boeing e sono certificati CMMI livello 5. The Universtity of Wisconsin Platteville attualmente insegna ad Ada come parte della classe Programming Language Structures del dipartimento CSSE.

Ada è stato originariamente sviluppato per il DoD dal 1973 al 1983 ed è utilizzato in avionica, ferrovia, tecnologie bancarie, militari e spaziali.

Pro

  • strongmente digitato
  • Ottimo per i sistemi incorporati
  • Ottimo per i sistemi in tempo reale
  • orientato agli oggetti
  • ha una gestione dinamica della memoria di alto livello

Contro

  • strana nozione di OO
  • una curva di apprendimento superiore rispetto ad altre lingue imperative o simili ad ALGOL
risposta data 15.11.2011 - 21:28
fonte
2

Matlab ha una pagina su DO 178 conformità . La FAA richiede la DO-178 conformità per il software avionico e le riprese spaziali private richiedono l'autorizzazione della FAA. Adacore ha prodotti per C ++, C e Ada; così come roba per supportare DO-178. Hanno un programma per le università, quindi potresti essere in grado di ottenere quello che vuoi a un prezzo ridotto (o gratuito, forse).

    
risposta data 15.11.2011 - 23:27
fonte
1

Mi vengono in mente un paio di cose;

Prima di tutto, mettiti alla testa di tutti coloro che lavorano al progetto:

Non dare per scontato nulla . Se non lo sai; scoprire e verificare. Quindi lascia che qualcun altro verifichi.

In secondo luogo, la lingua scelta è in gran parte irrilevante; puoi rovinare tutto, inclusa Ada. Sì, la protezione è lì, ma lo sono anche i mezzi per aggirarla.

Se puoi lavorare con C ++, usa C ++; vuoi minimizzare la complessità, e aggiungere una lingua incorporata su di essa no. Se non puoi, prendi i [buoni] programmatori sul team ASAP e lascia che facciano le loro cose mentre tu fai i tuoi. Prendi / scrivi standard di codice ristretto e atteniti a loro. Evita tutto ciò che potrebbe andare in tilt (come in, ad esempio, dove non dovrebbe, o esaurire la memoria), e cercare di mantenere il codice il più semplice possibile. Quindi prova, verifica e prova ancora. Fai recensioni di codice spietate.

Ottimizza non a meno che tu non abbia altra opzione; l'affidabilità vince su tutto.

Oh, e probabilmente vuoi / devi leggere su DO-178B .

Infine; se non ti fidi, non farlo volare .

    
risposta data 15.11.2011 - 23:54
fonte
1

La lingua scelta per il software mission critical è solo una piccola parte dell'equazione. Il test ovviamente è una parte enorme di questo, molti livelli di test da parte di diversi gruppi di persone. il team che scrive il codice esegue alcuni test, ma richiede un sacco di test da parte di altri non su quel team, e quindi, poiché il componente è integrato in porzioni più grandi del veicolo, viene nuovamente testato come parte di quel (sotto) sistema.

Torna al team del software. Il linguaggio di livello inferiore che puoi sopportare senza aumentare l'errore umano è migliore, meno cose che il compilatore può fare male. Di solito disabilita completamente l'ottimizzazione, di nuovo togli il più possibile il compilatore dal loop. recensioni tra pari, codice walk through, giustificazione e verifica di ogni riga di codice. per il codice mission critical non ci si aspetta più di una riga di codice di debug al giorno (da sviluppatori esperti) inferiore a quella per i primi timer, forse una riga alla settimana. Non sto scherzando è così che è in quel business. Puoi ridurlo sì aggiungendo più persone nel processo di revisione, invece di poche righe di codice all'anno.

Prenderò almeno un po 'di tempo per esaminare l'output del compilatore anche se il compilatore è stato utilizzato per il lavoro DO-178.

vai con linguaggi e compilatori che sono stati utilizzati dalle industrie aerospaziale o automobilistica (o medica). ada essere il tradizionale, ma come detto, quanti programmatori di ada hai intenzione di trovare, e faranno un buon lavoro imparando la lingua sul loro primo progetto quando questo è un progetto mission-critical? no. Anche C o C ++ è stato utilizzato, uno o entrambi sono la lingua di scelta oggi per questo tipo di lavoro.

    
risposta data 16.01.2012 - 16:07
fonte
0

Dovresti guardare nuovamente alle tue esigenze e condizioni. Mentre C ++ è un linguaggio raffinato per le parti di elaborazione numerica della tua applicazione, provare ad andare ad avere tutto in una sola lingua sarà comunque problematico (lingue diverse hanno espressività di picco su diverse classi di problemi). Hai identificato alcuni dei motivi per cui, specialmente il fatto che i tuoi studenti non conoscono il C ++ quando iniziano. Inoltre, non otterrai la sicurezza perfetta attraverso l'uso di un sistema di tipi complessi; ci sono sempre problemi di livello più alto che possono farti inciampare visto che le prove di correttezza totale sono veramente difficili.

Ciò che avresti idealmente è una specie di ambiente di sviluppo che imita l'ambiente del satellite. (Beh, senza i problemi con il riavvio causato quando tutto va storto.) Una volta che hai una situazione del genere, puoi fare dei veri test di cose prima di mettere il software in uso; questo deve essere una buona idea , sì?

Forse dovresti considerare l'utilizzo di una soluzione multilingue, utilizzando un linguaggio di livello superiore per coordinare maggiormente i componenti e un linguaggio di livello inferiore per fornire implementazioni di tali componenti. C ++ è un linguaggio ragionevole per scrivere componenti, ma Lua è più adatto al coordinamento (e ovviamente non si scrive tutto in Lua, non è pensato per essere usato in questo modo!). Inoltre, questo approccio multi-lingua è comunemente usato in sistemi critici industriali (ad esempio, controllo di impianti pesanti, gestione di raffinerie di petrolio) e questo è un settore in cui è davvero importante fare le cose come sono in gioco le vite.

(Lua non è l'unico candidato per un linguaggio di integrazione: so per certo che Tcl è usato un po 'in quest'area e non sarebbe sorpreso nel vedere Python o Ruby usati anche per questo. i componenti di basso livello sono probabilmente C e Fortran, anche se tutto ciò che è conforme alla C ABI per le funzioni è trattabile qui. Non consiglierei linguaggi con runtime molto grandi - ad esempio, Java, C # - per i fornitori di componenti; integrarsi a meno che non si faccia tutto nel runtime.)

    
risposta data 16.01.2012 - 17:00
fonte