Se necesitan programas para hacer programas
Introductorio
Me preguntaron con que programa, se hacen los programas que hacen programas?
Si nos ponemos a pensar, parece ser un ciclo infinito, una paradoja. Se necesitan programas para hacer programas.
Pero este tema repasando un poco de historia es mucho más fácil de entender.
No pretendo en este artículo hacer un informe detallado y preciso de la historia de los lenguajes de programación, simplemente aportare los elementos mínimos para resolver esta paradoja.
En un principio...
En un principio siempre se programaba en lenguaje de máquina, esto se hacía por medio de tarjetas perforadas, el lenguaje de maquina son opcodes, lenguajes de 1ra generación, es decir solo números en código binario
Cada instrucción [opcode] tiene un equivalente mas nemotécnico en ensamblador, es decir por cada instrucción (numero de instrucción) que entiende el procesador existe una palabra que la representa y es mas fácil de recordar, esto es el lenguaje ensamblador.
Humanizando el lenguaje... un poco
Así que inicialmente se hicieron programas en opcode que al 'ensamblarlos' generaban un archivo binario con códigos de maquina. Ensamblador es entonces un lenguaje de 2da generación.
Después vinieron los lenguajes de 3ra generación: Cobol y Fortran por ejemplo, que con una instrucción podían representar varias instrucciones de Ensamblador, sin embargo los programas siguieron creciendo y hacer software se hizo difícil, así que se genero la necesidad de tener lenguajes que permitieran reusar más código y que fueran más fáciles de entender, que estuvieran mejor estructurados.
Fortran
Cobol
Así nació el lenguaje C, luego de que Ritchie se diera cuenta de la gran cantidad de instrucciones repetitivas y de la enorme complejidad del software, decidió crear un lenguaje donde cada palabra representara varias instrucciones y estas además pudieran ser agrupadas de manera lógica(funciones) en componentes reutilizables.
También pensó en que todas estas virtudes no deberían ser una limitante para manejar instrucciones de maquina a bajo nivel así que incluyo los apuntadores para acceso directo a memoria y le dio al lenguaje la capacidad de incluir fragmentos de ensamblador cuando fuera necesario,así creo los while, los if y los for del lenguaje C, las funciones. etc.
C es uno de los lenguajes de 3ra generación, de hecho el lenguaje más popular de esa generación que incluso hoy día con nuevas generaciones y formas de hacer las cosas sigue vigente aunque ha cedido mucho terreno (casi todo) a C++.
Solo que el software siguió haciendose exponencialmente más complejo
Desde 3ra generación en adelante hay algunas variantes adicionales pero este es el resumen.
En los lenguajes 4ta generación tenemos lenguajes aún más orientados a objetos, con otras características que permiten que el desarrollador se preocupe más en el 'Qué debo hacer?' que en el 'Cómo se hace?' , por ello tenemos lenguajes con memoria administrada como Java, C# y Visual Basic entre otros que abstraen gran parte de las complejidades de la máquina en pro de enfocarse en el resultado.
Finalmente los lenguajes de 5ta generación, enfocados en gran parte a la inteligencia artificial pero no únicamente a ello, ya que también se ha abierto espacio para los lenguajes híbridos, como es el caso de C# que hoy día es POO pero también tiene sentencias dinámicas funcionales que le dan un comportamiento muy similar a los lenguajes de 5ta generación.
F# es un lenguaje de 5ta generación así como Lisp y Prolog estos últimos con un intenso uso en temas de inteligencia artificial.
No hay paradoja
Con esto queda resuelta la paradoja de Se necesitan programas para hacer programas.
Los primeros programas creados se hicieron directamente en lenguaje de máquina, y según el software se fue haciendo más complejo se generó la necesidad de tener programas que permitieran escribir de forma más natural, inicialmente ensamblador donde cada instrucción del lenguaje equivalía a una instrucción de la máquina, y luego con lenguajes de nivel superior donde una instrucción correspondía a muchas instrucciones de la maquina.
Esa tarea de traducir de un lenguaje más 'natural' al lenguaje de máquina se hace por medio de programas llamados compiladores, los cuales no solo traducen sino que analizan el conjunto del programa escrito para escribir la misma versión del programa en lenguaje de máquina con tan pocas instrucciones como sea posible.
Como se darán cuenta no todo tiempo pasado fue mejor, cosas tan habituales el día de hoy como procesar el evento clic de un botón pueden tener tras de sí miles de instrucciones ya en el lenguaje de máquina, instrucción es que antes debían escribir los desarrolladores una y otra vez.
Por suerte los ingenieros y desarrolladores hemos sido muy activos y aunque el resto de la industria humana se ha dedicado a mejorar a costa de procesos más y más complejos hemos sabido jugar nuestras fichas.
Hemos mejorado nuestras herramientas con nuestros propios programas y hoy día hacemos en un clic lo que antes nos tomaba semanas, o incluso meses.