NIER Ingegneria è diventata Società Benefit →

L’evoluzione dei Tool T3: Data Compiler in RUST per cliente leader ferroviario.

SERVIZIO MERCATO CLIENTE Leader settore ferroviario ANNO 2023

Brief

NIER è stata incaricata di progettare diversi strumenti classificati come “di classe T3” secondo la norma EN 50128:2011 del settore ferroviario. Tra questi strumenti vi sono quelli specifici per la generazione dei dati di configurazione dei sistemi di segnalamento ferroviari, noti come Data Compiler (DC). Un tool di classe T3 è in grado di generare output che possono influire direttamente o indirettamente sull’esecuzione del codice di sistemi critici per la sicurezza. Nel caso dei Data Compiler, è fondamentale garantire che i dati generati siano corretti, consistenti e integri.

Sfide di progetto

Ogni DC può essere implementato secondo tre diverse strategie architetturali.

Nell’architettura 2oo2, il DC è realizzato attraverso lo sviluppo di due canali di elaborazione, denominati Compiler A e Compiler B, implementati con due linguaggi di programmazione diversi per ridurre la probabilità di errori “di modo comune” derivanti da interpreti o compilatori dei linguaggi scelti. Entrambi i canali di elaborazione ricevono gli stessi input e generano gli output desiderati. Il successo della generazione è confermato solo se la comparazione delle uscite attesta che i file prodotti da Compiler A sono identici a quelli prodotti da Compiler B.

In un’architettura con ricostruttore, il DC viene realizzato attraverso lo sviluppo di un singolo canale di elaborazione, Compiler, e di un Ricostruttore. Il Compiler ha il compito di generare gli output richiesti partendo dai dati di input. Il Ricostruttore è responsabile di ricostruire i dati di input utilizzati dal Compiler a partire dai file di output prodotti. La validità dei file di output è confermata solo se i file di input ricostruiti corrispondono esattamente a quelli utilizzati dal Compiler.

In un’architettura con checker, il DC è realizzato attraverso lo sviluppo di un singolo canale di elaborazione, Compiler, il cui scopo è generare i file di output richiesti. Successivamente, questi file vengono sottoposti a verifica da un secondo strumento, chiamato Checker, implementato con un linguaggio di programmazione diverso (Sw Diversity) con l’obiettivo di eseguire controlli indipendenti rispetto al Compiler, verificando che ciascun dato di output sia corretto in relazione ai dati di input corrispondenti. Solo se tutti i controlli eseguiti dal Checker hanno esito positivo, i file di output sono considerati validi.

 

 

 

Soluzione

Nel processo di sviluppo dei DC, NIER ha optato per l’uso del linguaggio di programmazione Rust (https://www.rust-lang.org/), e ha realizzato:

  • un canale di elaborazione (per un DC con architettura 2oo2);
  • un Checker (per un DC con architettura con checker).

Rust è dotato di caratteristiche che lo rendono più sicuro e robusto del C (spesso utilizzato in ambiti safety critical). I punti di forza del linguaggio Rust possono essere sintetizzati nei seguenti aspetti:

Prestazioni: Rust è estremamente veloce ed efficiente nel consumo di memoria, senza l’uso di garbage collector. È adatto a servizi dove le prestazioni sono cruciali, può essere impiegato su dispositivi embedded e si integra facilmente con altri linguaggi di programmazione.

Affidabilità: Il modello di ownership e il ricco type system di Rust garantiscono sicurezza nella gestione della memoria e dei thread, consentendo di eliminare diversi tipi di bug già in fase di compilazione.

Produttività: Rust ha una documentazione eccellente, un compilatore con messaggi di errore informativi e strumenti avanzati, come un package manager integrato, un supporto evoluto per molteplici editor con funzionalità di completamento automatico e type inspection, oltre a uno strumento per la formattazione automatica del codice.

Fasi di esecuzione

FASE 1

Analisi delle esigenze derivanti dalla configurazione di un apparato coinvolto in un sistema ferroviario complesso (attori coinvolti, input e output esterni, tipologia e formato dei dati, analisi funzionale dei dati, definizione delle specifiche tecniche quali, ad esempio, il linguaggio di programmazione).

FASE 2

Sviluppo del primo canale di elaborazione per il DC con architettura 2oo2  e del singolo canale di elaborazione per il DC con architettura con checker, adibiti alla generazione dei dati di configurazione.

 

 

 

FASE 3

Sviluppo in RUST del secondo canale di elaborazione per il DC con architettura 2oo2 (per generare il secondo set dei dati di configurazione) e del Checker per il DC con architettura con checker (per verificare i dati di configurazione prodotti).

FASE 4

Validazione dei tool T3 (DC1+DC2, DC+Checker) tramite test funzionali.

 

FASE 5

Stesura della documentazione necessaria alla validazione dei tool T3 rilasciati.

Risultati ottenuti

L’esperienza di NIER è che Rust sia un ottimo linguaggio di programmazione, che garantisce l’eliminazione di molti possibili bachi già in fase di compilazione e alleggerisce il carico cognitivo del programmatore rispetto ai controlli di defensive programming, ineliminabili in C e derivati.

L’impiego di Rust da parte di molte grandi realtà affermate come Google, Amazon Web Services, Huawei, Meta, Microsoft solo per citarne alcune e la sua diffusione anche in sistemi embedded come il Kernel di Linux, non fa che confermare l’affidabilità e la sicurezza di questo linguaggio, nonché la sua manutenzione a lungo temine.

Anche la macchina normativa sta evolvendo verso nuove tecnologie ed è in corso di approvazione (“formal vote”) la nuova norma EN 50716:2022 che andrà a sostituire EN 50128:2011 e EN 50657:2017, amendments e corrigenda compresi, introducendo interessanti novità proprio riguardo ai linguaggi e le tecniche di programmazione. Non sono più citati esplicitamente i noti linguaggi C e Ada, ma sono tracciate le caratteristiche che il linguaggio scelto deve avere:

  • premettere di realizzare un codice che sia scritto, verificato, e mantenuto nel modo più veloce, efficace ed efficiente;
  • permettere di rilevare il prima possibile gli errori sistematici;
  • avere una chiara e ben documentata semantica (mandatoria per SIL3 e SIL4);
  • favorire un approccio modulare e ricco di commenti;
  • essere fortemente tipizzato ed essere accompagnato da un compiler efficace e/o da tool di analisi.

È evidente che RUST risulta la risposta ottimale a questa evoluzione tecnologica e normativa.

 

 

 

Articoli collegati

Iscriviti alla Newsletter .