¿Cómo evolucionan los lenguajes de programación para que sean más potentes y creen un software más sofisticado?

Se llama capas de abstracción.

Lo que pasa con las computadoras es que las computadoras son bastante estúpidas. Hay que contarles todo. Toda la CPU sabe que tiene algunos registros internos que pueden almacenar algunos datos, varios circuitos que modifican los valores de los registros y varios pines de E / S que pueden enviar datos dentro y fuera de la CPU. Asi que,

Por ejemplo, si quieres hacer 2 +3, debes decirle a la CPU
a) Poner 2 en el Registro 1
b) Poner 3 en el Registro 2
c) Active el circuito que agrega el registro 1 y el registro 2 juntos y coloca el resultado en el registro 1
d) Tome el contenido del registro 1 y envíelo a los pines de salida

Como puede ver, algo trivial necesita tantos pasos. Y todo lo que hace es agregar cosas. No lo muestro. No lo leo desde el disco. Nada. Solo sumando 2 números. Es un idiota. Para que lo imprima en la pantalla, deberá indicarle que envíe comandos al controlador de pantalla para imprimir el número, y el controlador de pantalla es un idiota aún más grande

En resumen, la computadora es un tonto, los humanos no lo son. Los humanos piensan en capas superiores de abstracción. Cuando piensa en sumar 2 números, no piensa en poner el resultado donde lo necesita. Solo hazlo. Puedes verlo literalmente cuando la gente dice “¿Por qué la computadora no hace lo que quiero que haga?” Es porque el Humano está pensando en un nivel de abstracción más alto que la computadora. El Humano piensa que la computadora debería hacer las cosas correctamente porque el humano lo hace sin pensar, y espera que la computadora no sea una tonta

Entonces, el mayor desafío en la programación es “¿Cómo hacer que la computadora no sea una tonta?” Entonces, cuando comenzó la programación, lo que los programadores harían es entender lo que quieren que haga la computadora, descifrar las instrucciones que la computadora debe hacer para hacer lo que tiene que hacer y poner esas instrucciones. Esto se llamaba lenguaje ensamblador y el código que se escribía se llamaba código máquina. La gente solía hacerlo, y fue un proceso muy tedioso y propenso a errores, principalmente porque esperabas que los programadores pensaran como la computadora, y ese tipo de pensamiento puede ser mentalmente agotador. Otro problema era que no podía tomar el código de máquina escrito para un tipo de CPU y usarlo en otra CPU. Porque los comandos reales para hacer lo mismo diferían de CPU a CPU

Entonces, alguien miró lo que estaba sucediendo y dijo “Oye, cuando la computadora necesita sumar 2 números, necesita hacer el mismo tipo de instrucciones cada vez. Entonces, ¿por qué no podemos escribir un programa de computadora que pueda generar una computadora? programas. Básicamente, podemos tener un archivo de texto que tiene una instrucción Print 2 + 3 y un programa de computadora puede leer esa línea y generar el código de máquina para sumar 2 y 3 e imprimirlo. Normalmente, escribimos 10 líneas de código de máquina. Ahora podemos escribir 1 línea de código que se compila en 10 líneas de código de máquina “. Sea testigo del nacimiento de los compiladores. Básicamente, a los programadores se les ocurrió su propio idioma para instruir a la computadora, y el compilador convertiría el programa del lenguaje del programador al lenguaje de la máquina, ahorrando mucho tiempo a las personas. Esto dio como resultado lenguajes de procedimiento como BASIC, C, FORTRAN y COBOL. Lo más importante que hicieron fue llevar la programación a una capa superior de abstracción. Escribe un programa como un conjunto de instrucciones que se convierten en código de máquina. Otra ventaja de esto es que puede hacer que el mismo programa se convierta en diferentes códigos de máquina para diferentes CPU

Ahora, esto fue bastante bueno, excepto que escribir procedimentalmente no es realmente un buen reflejo de cómo piensan los humanos. Los humanos tienden a pensar en términos de cosas que hacen cosas a otras cosas (eso suena un poco sucio) Tomemos un ejemplo. Ves a un chico bebiendo una coca cola de la lata, lo ves como una cosa separada de la lata, que está separada de la coca dentro de ella. Además, el acto de beber puede ser el mismo sin importar qué tipo de lata sea. Pero beber de una taza de té es algo así como beber de una coca cola, excepto que no lo es. Además, si la taza de té contiene coca cola, entonces el resultado final es el mismo. El problema es que, si considera los términos de los procedimientos de escritura, es mucho más fácil escribir un procedimiento para beber coca cola de una lata , que es diferente de un chico que bebe té de una taza de té que es diferente de un chico que toma coca de una taza de té . No se puede describir a un chico separado de la coca o la lata. Podrías, pero terminas atando tu cerebro en nudos. Fue entonces cuando a alguien se le ocurrió la idea de componer un lenguaje de programación orientado a objetos , que es lo que dio lenguajes como C ++, Java. En OOP, usted describe objetos y lo que los objetos le hacen a otros objetos (sí, bebé). Tienes una clase llamada Guy y una clase llamada Can. Y pones todas las instrucciones para el chico que bebe de una lata en un método llamado DrinkFromCan. Has contenido muy bien todo lo que el chico puede hacer en un método ordenado. Una vez más, ha aumentado la capa de abstracción con la que el programador tiene que lidiar desde las instrucciones hasta los objetos. El programador puede comenzar a pensar en términos de objetos y describirlos al compilador en un lenguaje OOP. Y el compilador convierte esas descripciones en código de máquina.

Esto nuevamente es bastante bueno … excepto que todavía no está allí. Hemos encontrado una manera de describir sustantivos y verbos asociados con sustantivos … excepto que los verbos han pasado a un segundo plano. Esto funciona cuando los sustantivos son importantes, como en los bancos. Tu cuenta bancaria es importante. El dinero en la cuenta es importante. Claro, lo que puede hacer con el dinero es importante, pero no tan importante como el dinero en sí. Dicho de otra manera, la forma en que funciona la POO es un espejo de cómo las personas piensan acerca de las cosas en general. Cuando vayas a un banquero y le preguntes cómo funcionan los bancos, él / ella lo describirá en términos que tengan sentido orientado a objetos. Excepto cuando entras en el ámbito del modelado matemático y científico. Muchas veces, cómo haces algo es más importante que lo que haces (ahora eso sonaba muy sucio). Al igual que cómo empalma una curva es independiente de lo que es la curva. Esto dio lugar a lenguajes funcionales . En lenguajes funcionales, usted describe lo que funciona el programa en términos de funciones y cómo afecta el estado en el que actúa. Has tomado el concepto de OOP y lo has puesto del revés. Describe una función llamada Drink que transfiere el contenido de un Drinkee al Drinker. El tipo puede ser el Bebedero y el Can Drinkee. O la taza de té podría ser Drinkee. ¿A quien le importa? No es la función de bebida

Estoy seguro de que me he perdido algo y estoy siendo criticado por ello. 1000 disculpas por perder tu paradigma favorito. Sé que me he perdido los lenguajes declarativos como SQL que simplemente permiten al “programador” decirle al programa lo que necesita, y la computadora descubre los pasos exactos