El término "Vehículo Definido por Software (VDS)" se está volviendo cada vez más común en la industria del software automotriz. Se refiere a un vehículo cuyas características y funciones están implementadas principalmente en software y, además, los componentes de hardware utilizados en el vehículo desempeñan un papel secundario en la definición de las especificaciones del vehículo. Hay tres tendencias principales que impulsarán la evolución de los VDS: la electrificación, la conducción autónoma y la conectividad.
Los vehículos modernos vienen con más de 100 unidades de control electrónico (ECU) que ejecutan millones de líneas de código. Para los VDS, el número será aún mayor, ya que la potencia de cálculo necesaria para ejecutarlos escala aún más.
El software automotriz se desarrolla tradicionalmente en C y C++, ya que estos lenguajes son los más adecuados para sistemas integrados con recursos limitados. Sin embargo, estos lenguajes son muy propensos a problemas relacionados con la seguridad de la memoria y las condiciones de carrera de datos. Una buena alternativa es Rust; es un lenguaje diseñado específicamente para superar estas limitaciones sin la sobrecarga de un mecanismo de recolección de basura en tiempo de ejecución. Además, se ha observado en la industria que la eficiencia de Rust en cuanto a tiempo de ejecución y uso de memoria es comparable con C y C++: eso significa que no estás perdiendo rendimiento.
La seguridad incorporada contra fugas de memoria y condiciones de carrera ofrecida por Rust lo hace muy adecuado para el software automotriz, donde la seguridad funcional y la seguridad son altamente valoradas. Dado esto, organizaciones automotrices como AUTOSAR y SAE ya han formado grupos de interés (discutidos en secciones posteriores) para evaluar la usabilidad de Rust en middleware automotriz y software del sistema.
Además, al ser un lenguaje moderno, Rust ofrece herramientas de construcción sofisticadas, como Cargo, que facilitan a los desarrolladores seguir las mejores prácticas de desarrollo de software, como TDD, gestión de dependencias a través de "crates", verificaciones de linter, formato y documentación, entre otras cosas. Este ecosistema maduro de herramientas proporciona un enfoque estandarizado para gestionar proyectos grandes que mejora la productividad del desarrollador.
Este blog ofrece una perspectiva sobre Rust como un lenguaje preferido para el desarrollo de software automotriz y describe cómo Rust podría ser adoptado gradualmente por la industria automotriz.
Un caso a favor de un nuevo lenguaje
Datos recientes muestran que la mayoría de los errores graves en tiempo de ejecución están relacionados con la seguridad de la memoria y las carreras de datos:
- Aproximadamente el 70% de las vulnerabilidades observadas por Microsoft en su software de lanzamiento son problemas de seguridad de la memoria.
- Según lo observado en el proyecto Chromium, aproximadamente el 70% de los errores de alta gravedad son problemas de seguridad de la memoria (es decir, errores con punteros C/C++).
Por lo tanto, es razonable decir que el software escrito en C/C++ es propenso a problemas de seguridad de la memoria y que es difícil detectar estos problemas durante el proceso de desarrollo de software (compilación, QA, pruebas estáticas/dinámicas, etc.). Por lo tanto, la industria ha estado evaluando continuamente otros lenguajes; la alternativa más prometedora parece ser Rust.
¿Por qué Rust?
De hecho, hay una necesidad en la industria automotriz de buscar lenguajes de programación modernos que puedan resolver al menos los problemas críticos donde C y C++ fallan, sin sacrificar la eficiencia en tiempo de ejecución ofrecida por estos lenguajes. Aquí hay algunas razones por las cuales Rust se está considerando como una fuerte alternativa:
Rust impone la seguridad de la memoria en tiempo de compilación: el enfoque de Gestión de Recursos Basada en la Propiedad (OBRM, por sus siglas en inglés) utilizado por Rust para manejar datos garantiza la seguridad de la memoria sin comprometer la eficiencia en tiempo de ejecución.
Concurrencia segura: el enfoque de OBRM también asegura el intercambio seguro de datos entre múltiples hilos de ejecución sin condiciones de carrera.
Compilador y herramientas modernas: el compilador Rust produce advertencias y errores precisos que ayudan a los desarrolladores a corregir problemas rápidamente. El entorno de construcción de Rust incluye herramientas modernas como Cargo para la gestión de la construcción, formateador, linter, generador de documentación, pruebas, etc., lo que mejora la productividad del desarrollador.
Comunidad y ecosistema de Rust: a medida que aumenta la adopción de Rust en la industria, la comunidad de Rust crece rápidamente. Hay una gran colección de bibliotecas y proyectos de código abierto para que los desarrolladores naveguen por el viaje de desarrollo de Rust.
Impacto comercial
Aunque no es fácil cuantificar el impacto comercial directo de las características de Rust descritas anteriormente, podemos relacionar estas características con los resultados comerciales generales, como se muestra en la Figura 1.
Adopción de Rust en la industria automotriz
Para desarrollar software automotriz en Rust, deberás considerar algunos factores discutidos a continuación.
Interoperabilidad con código C y C++
Adoptar un nuevo lenguaje en un proyecto completamente nuevo es relativamente sencillo. Sin embargo, la mayoría de los proyectos comienzan con una base de código existente y con trabajo previo ya realizado. Claramente, no es práctico cambiar todo el código existente a Rust. Aparentemente, los diseñadores de Rust tuvieron en cuenta este hecho, y como resultado, el lenguaje proporciona buenos mecanismos para la interoperabilidad con C/C++.
La Interfaz de Función Externa (FFI, por sus siglas en inglés) proporciona soporte integrado para la vinculación con código C externo. Aunque las vinculaciones de C++ no son compatibles directamente con FFI, la biblioteca cxx proporciona un mecanismo seguro para llamar a código C++ desde Rust y a código Rust desde C++. Esto permite implementar algunas características nuevas en Rust en un proyecto donde el lenguaje principal de desarrollo es C o C++, o utilizar bibliotecas existentes de C/C++ en una aplicación Rust.
Vale la pena señalar que Rust puede no proporcionar la interoperabilidad sin problemas con C++ que Carbon ofrece. Aunque se ha hablado de Carbon como el sucesor natural de C++, actualmente se encuentra en una fase algo experimental; puede llevar mucho tiempo alcanzar un estado en el que se pueda utilizar para el desarrollo de software de producción en la industria automotriz.
Rust para sistemas críticos de seguridad
La seguridad funcional y la ciberseguridad son requisitos primordiales para el software automotriz. Rust ofrece inherentemente seguridad de memoria, seguridad de hilos y seguridad de tipos, que son requisitos previos para desarrollar software funcionalmente seguro y seguro.
Como se mencionó anteriormente, más del 70% de todas las vulnerabilidades y exposiciones comunes en Microsoft son problemas de seguridad de la memoria. Varios estudios a nivel de la industria indican observaciones similares sobre vulnerabilidades de seguridad. Esto hace de Rust un lenguaje particularmente útil para desarrollar software seguro.
En la actualidad, las herramientas estándar de Rust (compilador rustc) no cumplen con la norma ISO 26262. Sin embargo, múltiples iniciativas dentro de la industria automotriz indican que hay interés en adoptar Rust para el desarrollo de software automotriz. A continuación se presentan algunos proyectos/iniciativas que demuestran esta intención..
- Ferrocene Language Specification (FLS)
AdaCore y Ferrous Systems están construyendo una cadena de herramientas Rust calificada para sistemas críticos de seguridad para atender a mercados regulados como automotriz, aviónica, espacio y ferrocarriles.
AUTOSAR formó un subgrupo dentro del Grupo de Trabajo para la Seguridad Funcional (WG-SAF) para investigar cómo Rust podría aplicarse en el contexto de la Plataforma Adaptativa.
SAE International ha formado un grupo de trabajo para generar un documento que describa las pautas para escribir software crítico para la seguridad en Rust para la industria automotriz y aeroespacial.
- Eclipse SommR
SommR es una implementación automotriz de grado que sigue la especificación SOME/IP para sistemas Linux integrados. Este es un proyecto de la Fundación Eclipse que se está desarrollando en Rust.
Rust-for-Linux es un proyecto de la Fundación Linux que tiene como objetivo agregar soporte para el lenguaje Rust al núcleo de Linux. Aunque este no es un proyecto específico de la industria automotriz, Linux se utiliza ampliamente como sistema operativo en diversas industrias, incluida la industria automotriz.
Además, en el momento de escribir esto, se informa que el núcleo de Linux a partir de la versión 6.1 admitirá oficialmente Rust.
Rust with ROS
ROS (Sistema Operativo de Robot) es un kit de desarrollo de software de código abierto para aplicaciones de robótica. Está respaldado por varias compañías automotrices, ya que proporciona herramientas útiles para la conducción autónoma. Autoware es un proyecto de código abierto construido sobre ROS que ayuda específicamente a desarrollar software para vehículos autónomos.
ROS no admite oficialmente la biblioteca cliente de Rust, pero ros2-rust es un proyecto impulsado por la comunidad que incluye un conjunto de proyectos (la biblioteca cliente rclrs, generador de código, ejemplos y más) que ayudan a los desarrolladores a escribir aplicaciones ROS 2 en Rust.
Rust para sistemas integrados
Rust es adecuado para sistemas integrados sin sistema operativo, con recursos limitados de potencia de cálculo y memoria incorporada. Típicamente, se prefiere C (y, en menor medida, C++) para tales aplicaciones; sin embargo, la seguridad de la memoria y la seguridad de tipos ofrecidas por Rust pueden ser útiles en tales aplicaciones. El libro Rust integrado discute en detalle cómo se puede utilizar Rust para sistemas integrados.
Estrategia de adopción de Rust
Usar Rust para un proyecto completamente nuevo es sencillo: ¡solo necesitas elegir Rust para tu proyecto! Sin embargo, en muchos casos, tendrás una base de código existente o dependencias escritas en otros lenguajes como C++. Con las características de interoperabilidad disponibles en Rust para C/C++, es posible desarrollar algunos componentes del proyecto en Rust e integrar estos componentes con el resto del código C++. La biblioteca CXX proporciona un mecanismo seguro para la vinculación bidireccional entre el código C++ y Rust. Hay múltiples enfoques posibles; el que elijas dependerá en última instancia de la arquitectura, la estructura de archivos del proyecto y las herramientas de construcción principales.
Por ejemplo, en un proyecto C++ que utiliza herramientas de construcción CMake, puedes escribir comandos personalizados de Cargo para construir componentes de Rust.
También podría darse el caso de que hayas comenzado con un proyecto Rust y desees utilizar un componente C++ existente, como una biblioteca C++ con licencia. Cargo proporciona diferentes formas de compilar código C++ o utilizar bibliotecas C++ con código Rust.
Aunque técnicamente es factible combinar componentes de Rust y C++ en un proyecto, plantea ciertos desafíos para el mantenimiento y la gestión del proyecto. La arquitectura del software podría volverse un poco compleja y el equipo del proyecto inevitablemente necesitará tanto desarrolladores de C++ como de Rust. Si los desarrolladores de C++ existentes planean aprender y desarrollar en Rust, es importante tener en cuenta que hay una curva de aprendizaje significativa; esto significa que podría llevarles algún tiempo ponerse al día lo suficiente como para implementar código Rust.
Conclusión
Rust se equipara a C++ en cuanto a rendimiento y, en algunos aspectos, incluso más, especialmente en lo que respecta a la seguridad de la memoria, la gestión de problemas en tiempo de ejecución y las vulnerabilidades de seguridad. Por estas razones, podemos confiar en su uso en el espacio automotriz. A medida que el software automotriz evoluciona para los Vehículos Definidos por Software (SDVs), la transición a Rust probablemente aumentará en atractivo. Podría ayudar a gestionar los costos de mantenimiento después del lanzamiento y permitir que los equipos de productos se centren en nuevas características, reduciendo en última instancia el tiempo hasta la comercialización.
Los desafíos con Rust, como la falta de una cadena de herramientas compatible con ISO26262, su curva de aprendizaje y la disponibilidad de talento en la industria, son temporales. A medida que las herramientas disponibles para Rust obtengan certificaciones desde una perspectiva de seguridad y crezca el interés en el lenguaje, cualquier temor sobre su uso comenzará a disiparse. Además, debido a que Rust tiene características que lo hacen interoperable con otros lenguajes de programación, debería ser posible para los gerentes de proyectos desarrollar estrategias de entrega que minimicen retrasos y costos crecientes. En la situación actual, donde las empresas enfrentan problemas para manejar la creciente complejidad del software, muchas podrían sentir la tentación de evitar un movimiento tan audaz. Sin embargo, adoptar rápidamente Rust no solo ofrece una oportunidad real para obtener una ventaja competitiva, sino que también podría desencadenar un cambio en el dominio. La pregunta no es si Rust, sino ¡cuándo!
Aviso legal: Las declaraciones y opiniones expresadas en este artículo son las del autor/a o autores y no reflejan necesariamente las posiciones de Thoughtworks.