- Ada, nacida en medio del caos del software del Departamento de Defensa de EE. UU. en los años 70, es un lenguaje cuyo núcleo se basa en tipado estático fuerte y separación entre especificación e implementación
- Mediante una estructura de paquetes y ocultamiento representacional, implementa una encapsulación completa, e influyó después en los sistemas de módulos de lenguajes modernos como Java, C# y Go
- Tipos con restricciones semánticas, genéricos, concurrencia (
task), y diseño por contrato son conceptos que Ada propuso décadas antes, y que luego heredaron Haskell, Rust y Swift, entre otros - SPARK Ada elimina incluso condiciones de carrera y errores lógicos mediante verificación formal, y se usa en ámbitos de alta confiabilidad como aviación, ferrocarriles y sistemas de defensa
- Ada no es un lenguaje popular, pero como “el lenguaje que funciona correctamente en silencio”, sentó principios fundamentales del diseño de lenguajes de programación modernos
Contexto del nacimiento de Ada y su filosofía de diseño
- A comienzos de los años 70, el Departamento de Defensa de EE. UU. (DoD) investigó una situación en la que más de 450 lenguajes y dialectos coexistían en sistemas de armas, logística y comunicaciones
- Cada sistema tenía problemas de falta de interoperabilidad, imposibilidad de mantenimiento y ausencia de los autores originales
- Esto provocó una crisis en la adquisición de software
- El DoD no adoptó lenguajes existentes (COBOL, Fortran, PL/1, etc.), sino que pasó por un proceso de cinco años para definir requisitos
- Los documentos evolucionaron de Strawman → Woodenman → Tinman → Ironman → Steelman
- Steelman (1978) exigía separación explícita de interfaces, tipado estático fuerte, concurrencia incorporada, manejo consistente de excepciones, independencia de la máquina, legibilidad y capacidad de verificación
- En la competencia de 1979 entre cuatro equipos (Green, Red, Blue, Yellow), fue elegido el equipo Green liderado por Jean Ichbiah, y el lenguaje recibió el nombre de Ada
- El nombre fue puesto en honor a Ada Lovelace, simbolizando la intención del lenguaje
Estructura de paquetes y encapsulación
- La estructura central de Ada es el paquete (
package), donde la especificación (specification) y el cuerpo (body) están separados físicamente- La especificación es el contrato expuesto al exterior, el cuerpo es la implementación, y el compilador obliga la relación entre ambos
- El código cliente no puede acceder a elementos que no estén en la especificación
- Esta estructura fue el prototipo de los sistemas de módulos, y lenguajes posteriores la imitaron parcialmente
- Java, Python, JavaScript, C, Go y Rust no logran implementar la separación estructural completa de Ada
- Los tipos
privateexponen solo el nombre, mientras que su representación interna permanece completamente opaca- El cliente no puede conocer la estructura interna del tipo y solo puede usar las operaciones permitidas
- Esto es un ocultamiento representacional más fuerte que el control de acceso
privatede Java
- Java y C# evolucionaron gradualmente durante décadas en dirección al nivel de encapsulación de Ada
Sistema de tipos y restricciones semánticas
- Ada define la distinción entre tipo y subtipo en sentido matemático
- Ejemplo:
type Age is range 0 .. 150crea un tipo separado con una restricción de rango - El paso entre tipos incorrectos se detecta como error en tiempo de compilación
- Ejemplo:
- En 1983, el sistema de tipos de Ada era mucho más expresivo que el de C, Fortran o Pascal
- Los tipos con restricciones semánticas ayudan a prevenir errores de dominio
- El registro discriminado (
discriminated record) es una estructura con campos distintos según el valor- Equivale a los tipos suma (
sum type) o tipos de datos algebraicos (ADT) de los lenguajes modernos - Haskell, Rust, Swift, Kotlin y TypeScript introdujeron el mismo concepto décadas después
- Equivale a los tipos suma (
Genéricos y polimorfismo
- Los genéricos (
generic) de Ada son unidades que reciben como parámetros tipos, valores, subprogramas y paquetes- Implementan polimorfismo estático (
parametric polymorphism) con verificación de tipos en compilación
- Implementan polimorfismo estático (
- C++ (1990), Java (2004), C# (2005) y Go (2022), entre otros, incorporaron funciones similares décadas después de Ada
- Java pierde información de tipos en tiempo de ejecución por borrado de tipos (
type erasure) - Ada conserva los tipos en tiempo de ejecución y además soporta parametrización de paquetes
- Java pierde información de tipos en tiempo de ejecución por borrado de tipos (
- Los genéricos de Ada ofrecen una expresividad al nivel del polimorfismo de orden superior (
higher-kinded polymorphism)- Un concepto similar a las type classes de Haskell, los traits de Rust y los concepts de C++20
Modelo de concurrencia y seguridad
- Ada incorporó desde 1983 concurrencia a nivel de lenguaje (
task)- Mediante la declaración de
tasky el modelo de comunicación rendezvous, implementa paso de mensajes sin estado compartido - Los channels de Go pertenecen a la misma familia conceptual de CSP (Communicating Sequential Processes)
- Mediante la declaración de
- Ada 95 introdujo el objeto protegido (
protected object)- Protege el acceso a los datos y se divide en
procedure,functionyentry - Ofrece condiciones de barrera automáticas y sincronización sin locks
- Protege el acceso a los datos y se divide en
- SPARK Ada demuestra matemáticamente, mediante verificación formal, la ausencia de condiciones de carrera, excepciones, errores de rango y violaciones de precondiciones y postcondiciones
- Mientras que el borrow checker de Rust solo garantiza seguridad de memoria, SPARK prueba incluso la consistencia lógica
Diseño por contrato y seguridad ante null
- Ada 2012 integró los contratos (
contracts) en el lenguaje- Permite especificar precondiciones (
precondition), postcondiciones (postcondition) e invariantes de tipo (invariant) - La cadena de herramientas de SPARK los usa para demostración estática
- Permite especificar precondiciones (
- Formalizó a nivel de lenguaje el concepto de Design by Contract de Eiffel (1986)
- C++, Java, Python y Rust se han quedado en implementaciones parciales o a nivel de biblioteca
- Ada 2005 introdujo los tipos
not null, dando soporte a la exclusión de null en tiempo de compilación- Por defecto, garantiza una falla segura mediante excepción en tiempo de ejecución (
Constraint_Error) - Un enfoque similar al de las referencias anulables de C# 8.0
- Por defecto, garantiza una falla segura mediante excepción en tiempo de ejecución (
Estructura del manejo de excepciones
- Ada 83 fue el primero en introducir manejo estructurado de excepciones (
structured exception handling)- Las excepciones se declaran antes de usarse, se manejan por ámbito y tienen reglas claras de propagación
- Las checked exceptions de Java son una forma más desarrollada que en Ada, ya que obligan al llamador a declararlas
- Ada permite libre propagación de excepciones
- Rust elimina las excepciones y adopta un manejo de errores basado en el tipo
Result- La contribución de Ada fue estructurar la propagación de excepciones y volverla predecible
Annex y estructura de estandarización
- El estándar de Ada tiene una estructura de extensiones opcionales llamada Annex
- Los Annex C~H definen funciones por áreas como sistemas, tiempo real, distribución, cálculo numérico y alta confiabilidad
- Los compiladores deben obtener certificación independiente para cada Annex
- La conformidad con el estándar se verifica mediante las pruebas ACATS de la ACAA
- La estructura del estándar de Ada puede aprovecharse directamente para la certificación de software aeronáutico DO-178C
- C/C++ también pueden certificarse, pero Ada es estructuralmente más adecuado
La influencia de Ada y el desequilibrio en su percepción
- Ada fue un lenguaje impulsado por el gobierno, por lo que no recibió atención dentro de la cultura de Silicon Valley
- En contraste con la preferencia cultural por sintaxis concisas basadas en C
- Los casos de éxito de Ada (aviación, ferrocarriles, sistemas de defensa) tienen poca visibilidad precisamente porque no fallan
- Los sistemas altamente confiables no generan debates ni incidentes
- La dirección de evolución de los lenguajes modernos converge hacia principios que Ada ya había planteado
- Separación entre especificación e implementación, verificación estática de tipos, concurrencia a nivel de lenguaje, seguridad basada en contratos, etc.
- Ada sigue operando en sistemas de alta confiabilidad como aviones, ferrocarriles y naves espaciales, y permanece como “el lenguaje que funciona correctamente en silencio”
1 comentarios
Comentarios en Hacker News
Me gusta Ada. Pero me sorprende que, al hablar del manejo de tipos, se haya omitido por completo a los lenguajes de la familia ML (ML, SML, CML, Caml, OCaml, etc.)
Estos lenguajes admiten tipos estructurales a nivel del compilador. El problema de Ada era que, como PL/I, PHP o Perl, el propio lenguaje era demasiado grande y su sintaxis compleja. El artículo dice que eso era una ventaja, pero personalmente creo que las extensiones estándar separadas en Annex eran mucho mejores. Si el lenguaje base hubiera sido más pequeño y se hubiera apostado por los Annex, probablemente se habría usado más
Una de las razones por las que Ada fue ignorado es que los compiladores costaban decenas de miles de dólares. En una época sin compiladores gratis ni de código abierto, otros lenguajes podían usarse sin pagar. Ese fue un factor decisivo
Mientras leía el artículo, tanto Ada como el texto en sí me parecieron interesantes, pero saltaron a la vista varios errores de hecho. Por ejemplo, decía que solo Ada separa por completo implementación y especificación, pero JavaScript también puede definir elementos privados con módulos ES6. La explicación sobre la visibilidad
privatede Java también era incorrecta. Por errores así, el artículo pierde credibilidadprivate, desde fuera no se puede acceder a los campos internos. En cambio, en JavaScript se pueden agregar o eliminar propiedades libremente a cualquier objeto. O sea, el nivel de protección en tiempo de compilación de Ada no se puede comparar con JSsetAccessible(true)incluso se puede modificar el interior de StringEn general el artículo estuvo bien, pero se volvió cansado por la repetición constante de frases como “el lenguaje X incorporó esta función después que Ada”. Con ejemplos de código habría sido mucho más convincente
Esta cuenta de Twitter fue creada en abril de 2026 y no indica quién es el autor. Ha mostrado una productividad enorme en muy poco tiempo, y resulta interesante que no revele su identidad
La afirmación de que “todos los lenguajes agregaron sum types en los últimos 20 años, pero Ada los tuvo desde el principio” es cierta, pero su origen no está en Ada. El lenguaje Hope o NPL aparecieron antes
UNION, y luego la idea evolucionó en ALGOL 68, Hope, Miranda y otros. Elunionde C es distinto de ese conceptoMe gustó tanto el artículo que quise creer que no lo había escrito una IA, pero la velocidad con la que publicaba en Twitter me pareció sospechosa
La Fuerza Aérea de EE. UU. originalmente quería usar Ada, pero como el desarrollo se retrasó terminó usando JOVIAL. Yo hice mi primer proyecto en JOVIAL en 1981, y en ese momento Ada todavía estaba en fase de especificación
En la página principal del sitio aparece la frase “esto no es una postura, es una propuesta”, y a partir de eso alguien afirma que es un sitio escrito por IA
El artículo decía que “el sistema de módulos de JavaScript no puede ocultar la representación interna de un tipo como Ada”, pero en realidad en los módulos de JS, si no exportas algo, queda suficientemente oculto. Me pregunté si Ada realmente tiene alguna ventaja especial ahí