GoSuda

Lenguaje Moderno de la Era AI

By Rabbit Princess
views ...

Lenguajes Modernos

Un lenguaje moderno se refiere a un lenguaje que proporciona mayor productividad, estabilidad, seguridad y mantenibilidad en comparación con los lenguajes del pasado. Estos lenguajes adoptan activamente las técnicas y conceptos más recientes, proporcionando herramientas de desarrollo más eficientes y seguras para los desarrolladores. Ejemplos representativos de lenguajes modernos incluyen Java, Rust, Python, TypeScript, entre otros, y estos poseen las siguientes características.

1. Diseño Orientado a Objetos ( OOP )

La mayoría de los lenguajes modernos han sido diseñados basándose en conceptos de orientación a objetos. La orientación a objetos soporta principios como encapsulación, herencia y polimorfismo, y hace que la estructura del programa sea clara y flexible al dividir y gestionar sistemas complejos en unidades pequeñas de objetos. Esto es particularmente efectivo para controlar los costos de desarrollo y el esfuerzo en el desarrollo de software a gran escala, y para reducir los problemas que pueden surgir durante el mantenimiento.

2. Azúcar Sintáctico y Expresiones

Los lenguajes modernos ofrecen una variedad de azúcar sintáctico y sintaxis basada en expresiones para aumentar la legibilidad del código y la productividad del desarrollo. Funcionalidades como el operador ternario, las expresiones lambda y la coincidencia de patrones (pattern matching) reducen el código repetitivo (boilerplate code), hacen que el código sea predecible y mejoran la productividad del desarrollador.

3. Sistema de Módulos

Los lenguajes modernos permiten gestionar programas dividiéndolos en varias unidades a través de un sistema de módulos. Esto facilita la reutilización del código y la gestión de dependencias, y hace que el mantenimiento sea más sencillo incluso cuando el tamaño del proyecto aumenta. Ejemplos representativos incluyen Maven/Gradle en Java, Cargo en Rust, npm/yarn en TypeScript, entre otros.

4. Lenguaje Intermedio y Máquina Virtual

Los lenguajes modernos introducen lenguajes intermedios y máquinas virtuales para la independencia de la plataforma, la optimización del rendimiento y la seguridad. Ejemplos representativos incluyen JVM, LLVM, WASM, GraalVM, entre otros.

El Desarrollo en la Era de la IA y las Limitaciones de los Lenguajes Modernos

Los lenguajes modernos surgieron bajo la premisa de que los humanos escribirían la mayor parte del código. Naturalmente, el objetivo de los lenguajes modernos es reducir las tareas repetitivas, aumentar la productividad e implementar eficazmente software a gran escala a través de estructuras que permitan la colaboración entre desarrolladores. Sin embargo, en la era de la IA, esta premisa se está desmoronando gradualmente. Herramientas basadas en IA como Copilot, Cody, etc., están automatizando gran parte de la escritura de código, y la cantidad de código que un solo desarrollador puede producir está aumentando exponencialmente. Como resultado, las características de los lenguajes modernos que antes se percibían como ventajas se están convirtiendo gradualmente en desventajas obsoletas.

Diseño Orientado a Objetos

La IA puede analizar de forma rápida y precisa estructuras donde toda la información está explicitada dentro de una sola función o módulo. Por otro lado, a medida que el contexto aumenta, también lo hace el ámbito de inferencia, lo que reduce la productividad y precisión de la IA. El código escrito en OOP dispersa la lógica entre múltiples objetos en lugar de gestionarla en un solo lugar, lo que en última instancia requiere más contexto para la IA. Consideremos el siguiente código.

 1public class AnimalHandler {
 2    public void handle(Animal animal) {
 3        animal.speak();
 4    }
 5}
 6
 7public class Main {
 8    public static void main(String[] args) {
 9        AnimalHandler handler = new AnimalHandler();
10
11        Animal a1 = new Dog();
12        Animal a2 = new Cat();
13        Animal a3 = new Horse();
14
15        handler.handle(a1);
16        handler.handle(a2);
17        handler.handle(a3);
18    }
19}

En el código anterior, la IA debe repetir el siguiente proceso de inferencia para saber qué acción realizará realmente el método speak():

  1. ¿De qué clase concreta es instancia animal?
  2. ¿Dónde está definido el método speak() sobrescrito en esa clase?
  3. ¿Dónde están las definiciones de las clases Dog y Cat, y cuál es su comportamiento interno?
  4. ¿Existe la posibilidad de que las clases Dog y Cat sean sobrescritas en otras clases? Esta información no está agrupada en un solo archivo o una sola función, y solo puede entenderse siguiendo las relaciones entre los archivos de clase y la estructura de herencia. Además, los elementos que se deciden en tiempo de ejecución, como la reflexión o la carga dinámica, son como cajas negras desde la perspectiva de la IA, lo que hace que su análisis sea prácticamente imposible.

Azúcar Sintáctico y Expresiones

La IA prefiere acciones explícitas a acciones implícitas y prefiere combinar estructuras simples para producir una única respuesta en lugar de utilizar estructuras complejas tal cual. En contraste, el azúcar sintáctico permite una variedad de expresiones, pero a menudo su funcionamiento interno es idéntico o similar. La IA debe aprender el significado de estas diversas expresiones individualmente, y puede resultar difícil determinar la prioridad de qué sintaxis recomendar en una situación específica.

Lenguaje Intermedio y Máquina Virtual

La IA aprende principalmente basándose en el código fuente. Por otro lado, en el lenguaje intermedio (bytecode), el significado de los nombres de variables, etc., se elimina durante el proceso de compilación, y debe ser reinterpretado por la máquina virtual en tiempo de ejecución. Esta es una tarea muy difícil para la IA de entender o convertir. Por ejemplo, para la IA, la conversión de TypeScript a Go es posible, pero la conversión del bytecode del motor V8 al bytecode de JVM o a código máquina es prácticamente imposible.

El Verdadero Lenguaje Moderno en la Era de la IA

A través del contenido anterior, podemos observar que las características de los lenguajes modernos son, en realidad, elementos obsoletos que no son adecuados para la era de la IA. Entonces, ¿qué lenguaje podría ser el lenguaje moderno más adecuado para la era de la IA? Podemos obtener una pista de los elementos que los lenguajes modernos del pasado rechazaron. Un lenguaje moderno en la era de la IA debe

  1. tener una sintaxis explícita y un flujo natural.
  2. tener una estructura plana y simple, alejándose de estructuras OOP excesivas.
  3. crear diversas funcionalidades utilizando solo un conjunto limitado de palabras clave básicas, en lugar de azúcar sintáctico innecesario o patrones implícitos.
  4. tener un sistema de construcción (build system) simple y predecible, no uno complejo. El lenguaje que mejor se ajusta a estos criterios es Golang. El lenguaje Go fue diseñado para implementar la mayoría de las funcionalidades prácticas con un mínimo de palabras clave esenciales y combinaciones sintácticas simples, excluyendo rigurosamente la abstracción innecesaria y las acciones implícitas. Esta es una estructura ventajosa no solo para los desarrolladores, sino también para que la IA interprete y genere código. De esta manera, las características de Go que buscan una estructura predecible y plana, un flujo explícito y una sintaxis consistente, a diferencia de los lenguajes modernos existentes diseñados con el desarrollador humano como referencia, se adaptan mejor a un entorno de desarrollo en el que la IA participa activamente. La filosofía de diseño conservadora de Go, que en su momento fue considerada obsoleta, resulta ser la elección más avanzada en la era de la IA.