La Red de Conocimientos Pedagógicos - Conocimientos matemáticos - En "Software Story", se dice que Lisp es una gran mejora con respecto a FORTRAN. Disculpe, ¿en qué es Lisp superior a FORTRAN?

En "Software Story", se dice que Lisp es una gran mejora con respecto a FORTRAN. Disculpe, ¿en qué es Lisp superior a FORTRAN?

1.

Si ordenamos los lenguajes de programación populares en este orden: Java, Perl, Python, Ruby. Descubrirá que los idiomas clasificados más adelante se parecen más a Lisp. Python imita a Lisp e incluso imita características que muchos piratas informáticos de Lisp consideran errores de diseño. En cuanto a Ruby, si volvieras a 1975 y afirmaras que era un dialecto Lisp, nadie se opondría. El desarrollo actual de los lenguajes de programación acaba de alcanzar el nivel del lenguaje Lisp en 1958.

2.

En 1958, John McCarthy diseñó el lenguaje Lisp. Creo que los últimos lenguajes de programación apenas están haciendo realidad lo que él imaginó en 1958.

¿Cómo es esto posible? ¿No cambia cada día el desarrollo de la tecnología informática? ¿Cómo podría la tecnología de 1958 superar el nivel actual?

Déjame decirte por qué.

Esto se debe a que John McCarthy no tenía la intención original de diseñar Lisp como un lenguaje de programación, al menos no en el sentido actual de la palabra. Su intención original era simplemente hacer un cálculo teórico y definir una máquina de Turing de una manera más concisa.

Entonces, ¿por qué los lenguajes de programación de la década de 1950 no están obsoletos ahora? En pocas palabras, porque este lenguaje no es una tecnología por naturaleza, sino matemáticas. Las matemáticas nunca pasan de moda. No deberías asociar Lisp con el hardware de los años 50, sino más bien con el algoritmo Quicksort. Este algoritmo fue propuesto en 1960 y sigue siendo el método de clasificación universal más rápido.

3.

El lenguaje Fortran también apareció en la década de 1950 y se ha utilizado hasta el día de hoy. Representa una dirección completamente diferente en el diseño del lenguaje. Lisp evolucionó involuntariamente de pura teoría a un lenguaje de programación, mientras que Fortran fue diseñado como un lenguaje de programación desde el principio. Sin embargo, hoy pensamos en Lisp como un lenguaje de alto nivel y Fortran como un lenguaje de nivel bastante bajo.

En 1956, cuando nació Fortran, se llamó Fortran I, que era muy diferente del lenguaje Fortran actual. Fortran I es en realidad lenguaje ensamblador más matemáticas. En algunos aspectos, no es tan poderoso como el lenguaje ensamblador actual. Por ejemplo, no admite subrutinas, sólo estructuras de salto de rama.

Lisp y Fortran representan las dos direcciones principales en el desarrollo de lenguajes de programación. La base del primero son las matemáticas y la del segundo es la arquitectura de hardware. Desde entonces, estas dos direcciones se han ido acercando. Lisp era poderoso cuando se diseñó por primera vez y durante las siguientes dos décadas mejoró en velocidad. Esos llamados lenguajes convencionales tomaron una velocidad de ejecución más rápida como punto de partida para el diseño y luego pasaron más de cuarenta años volviéndose más poderosos paso a paso.

Hasta el día de hoy, los lenguajes convencionales más avanzados apenas se están acercando al nivel de Lisp. Aunque está muy cerca, todavía no es tan poderoso como Lisp.

4.

Cuando nació el lenguaje Lisp, contenía 9 ideas nuevas. Algunos de ellos los damos por sentados hoy, otros acaban de aparecer en otros lenguajes de alto nivel y dos son exclusivos de Lisp hasta ahora. Según el grado de aceptación por parte del público, estas 9 ideas están en orden:

1. Estructura condicional (es decir, estructura "si-entonces-si no"). Ahora todo el mundo da por sentado esto, pero Fortran I no tiene esta estructura. Sólo tiene la estructura goto basada en las instrucciones subyacentes de la máquina.

2. La función también es un tipo de datos. En el lenguaje Lisp, las funciones, como los números enteros o las cadenas, también son un tipo de datos.

Tiene su propia representación literal, que puede almacenarse en una variable o pasarse como parámetro. Tiene todas las funciones que debería tener un tipo de datos.

3. Recursividad. Lisp fue el primer lenguaje de alto nivel que admitió funciones recursivas.

4. Tipo dinámico de variables. En el lenguaje Lisp, todas las variables son en realidad punteros. Los valores señalados tienen tipos, pero las variables en sí no. Copiar variables equivale a copiar punteros, no los datos a los que apuntan.

5. Mecanismo de recogida de basura.

6. Los programas se componen de expresiones. Un programa Lisp es una colección de bloques de expresiones, cada uno de los cuales devuelve un valor. Esto contrasta con Fortran y la mayoría de los lenguajes posteriores, donde los programas se componen de expresiones y declaraciones.

La distinción entre expresiones y declaraciones es natural en Fortran I porque no admite el anidamiento de declaraciones. Por lo tanto, si necesita calcular un valor matemáticamente, solo puede usar una expresión para devolver el valor y no hay otras construcciones de sintaxis disponibles, porque de lo contrario no podrá manejar el valor.

Más tarde, nuevos lenguajes de programación soportaron la estructura de bloques (block), y por supuesto esta restricción ya no existía. Pero ya era demasiado tarde; la distinción entre expresiones y declaraciones estaba profundamente arraigada. Se extendió desde Fortran hasta Algol, y luego a las lenguas sucesoras de ambos.

7. Tipo de símbolo. Un símbolo es en realidad un puntero a una cadena almacenada en una tabla hash. Por lo tanto, para comparar si dos símbolos son iguales, sólo necesitas comprobar si sus punteros son iguales, sin compararlos carácter por carácter.

8. El código utiliza una notación de árbol (notación) compuesta de símbolos y constantes.

9. El idioma completo está disponible en todo momento. Lisp realmente no distingue entre tiempo de lectura, tiempo de compilación y tiempo de ejecución. Puede compilar o ejecutar código en tiempo de lectura; puede leer o ejecutar código en tiempo de compilación; también puede leer o compilar código en tiempo de ejecución;

La ejecución de código durante el período de lectura permite a los usuarios reprogramar la sintaxis de Lisp; la ejecución de código durante la compilación es la base para las macros de Lisp; la compilación de código durante el tiempo de ejecución permite que Lisp se utilice en programas como Emacs, sirve como un lenguaje de extensión; el código se lee en tiempo de ejecución, lo que permite que los programas se comuniquen mediante expresiones S. La reciente aparición del formato XML ha permitido reinventar este concepto.

5.

Cuando apareció por primera vez el lenguaje Lisp, sus ideas eran muy diferentes a las de otros lenguajes de programación. Las ideas de diseño de este último estuvieron determinadas principalmente por el hardware de finales de los años cincuenta. A medida que pasa el tiempo, los lenguajes de programación populares continúan actualizándose y las ideas de diseño de lenguajes se acercan gradualmente a Lisp.

Las ideas 1 a 5 han sido ampliamente aceptadas. La idea 6 ha comenzado a aparecer en los lenguajes de programación convencionales. La idea 7 se ha implementado en el lenguaje Python, pero parece no haber una sintaxis dedicada.

El pensamiento 8 es probablemente el punto más interesante. Esta y la idea 9 pasaron a formar parte del lenguaje Lisp sólo por accidente, ya que no formaban parte de la concepción original de John McCarthy y fueron añadidas por su alumno Steve Russell. Desde entonces, han hecho que Lisp parezca extraño, pero también se han convertido en la característica más singular del lenguaje. La forma extraña de Lisp no se debe a que su sintaxis sea extraña, sino a que no tiene ninguna sintaxis y el programa se expresa directamente en forma de árbol de análisis. En otros lenguajes, esta forma simplemente se genera detrás de escena mediante análisis, pero Lisp la usa directamente como forma de expresión. Consta de listas, que son las estructuras de datos básicas de Lisp.

Expresar un lenguaje utilizando sus propias estructuras de datos resulta ser una característica muy poderosa. Las ideas 8 y 9 significan que puedes escribir un programa que puedas programar tú mismo. Esto puede parecer extraño, pero es muy común en Lisp. La forma más común es utilizar macros.

El término "macro" en Lisp tiene un significado diferente al de otros idiomas. Las macros Lisp lo abarcan todo. Pueden ser una forma abreviada de una expresión o un compilador para un nuevo lenguaje. Si desea comprender verdaderamente el lenguaje Lisp o desea ampliar sus horizontes de programación, debe aprender macros.

Hasta donde yo sé, las macros (como se definen en el lenguaje Lisp) siguen siendo exclusivas de Lisp. Una razón es que para poder usar macros, probablemente tengas que hacer que tu lenguaje parezca tan extraño como Lisp. Otra posible razón es que si desea agregar esta arma definitiva a su idioma, ya no puede afirmar haber inventado un nuevo idioma, solo un nuevo dialecto de Lisp.

Lo digo en broma, pero es lo que hay. Si crea un nuevo lenguaje con funciones como car, cdr, cons, quote, cond, atom y eq, y una forma de expresar funciones como listas, entonces, basándose en ellas, puede derivar completamente todas las demás partes del Lenguaje ceceo. De hecho, el lenguaje Lisp se define de esta manera, y John McCarthy diseñó el lenguaje de esta manera para hacer posible este tipo de derivación.

6.

Incluso si Lisp representa una dirección en la que los principales lenguajes de programación actuales se están acercando, ¿significa esto que deberías programar con él?

¿Cuánto se pierde por utilizar un lenguaje menos potente? ¿No es a veces una buena decisión no utilizar la tecnología más puntera? Mucha gente usa lenguajes de programación convencionales. ¿No demuestra esto en sí que esos lenguajes tienen mérito?

Por otro lado, para muchos proyectos no importa qué lenguaje de programación elijas. De todos modos, diferentes lenguajes pueden hacer el trabajo. En términos generales, cuanto más exigentes sean las condiciones del proyecto, más potente podrá desempeñar un lenguaje de programación. Sin embargo, innumerables proyectos no se ven limitados en absoluto por las duras condiciones. Para la mayoría de las tareas de programación, es posible que solo necesite escribir algunos programas pequeños y luego usar un lenguaje adhesivo para conectar estos pequeños programas. Puede escribir estos pequeños programas en un lenguaje de programación con el que esté familiarizado o en un lenguaje que tenga la biblioteca de funciones más poderosa para un proyecto específico. Si sólo necesita transferir datos entre aplicaciones de Windows, aún puede lograr el objetivo utilizando Visual Basic.

Entonces, ¿cuáles son las ventajas de la programación Lisp?

7.

Cuanto más potente sea la capacidad de programación del lenguaje, más corto será el programa escrito (por supuesto, no se refiere al número de caracteres, sino a unidades gramaticales independientes). ).

La cantidad de código es importante porque el tiempo que lleva desarrollar un programa depende principalmente de la longitud del programa. Si el código escrito en un idioma es tres veces más largo que en otro idioma para el mismo software, esto significa que llevará tres veces más tiempo desarrollarlo. E incluso si contrata a más personas, no ayudará a reducir el tiempo de desarrollo, porque cuando el tamaño del equipo excede un cierto umbral, agregar más personas solo será una pérdida neta. Fred Brooks describió este fenómeno en su famoso libro The Mythical Man-Month, y lo que vi y oí confirmó su afirmación.

¿Qué tan corto se puede hacer el programa si se usa Lisp? Tomando la comparación de Lisp y C como ejemplo, la mayoría de las afirmaciones que escucho son que el código C es de 7 a 10 veces más largo que Lisp. Pero recientemente, hubo un artículo en la revista New Architect que presentaba a ITA Software Company. Decía que "una línea de código Lisp equivale a 20 líneas de código C, porque este artículo cita las palabras del presidente de ITA". El número proviene de la práctica de programación de ITA.

Si este es el caso, entonces podemos creer en esta afirmación. El software de ITA no solo usa el lenguaje Lisp, sino que también usa mucho C y C, así que esta es su experiencia.

Según el número anterior, si compite con ITA y utiliza el lenguaje C para desarrollar software, entonces la velocidad de desarrollo de ITA será 20 veces más rápida que la suya. Si le lleva un año implementar una función, le llevará menos de tres semanas. Por otro lado, si una nueva característica tarda tres meses en desarrollarse, a usted le llevará cinco años desarrollarla.

¿Lo sabías? La comparación anterior sólo considera el mejor de los casos. Cuando comparamos sólo la cantidad de código, la implicación es que el mismo software se puede desarrollar utilizando un lenguaje menos potente. Pero, de hecho, existen límites a lo que los programadores pueden hacer usando un determinado lenguaje. Si desea utilizar un lenguaje de bajo nivel para resolver un problema difícil, se enfrentará a diversas situaciones que son extremadamente complejas e incluso difíciles de resolver con claridad.

Entonces, cuando digo que suponiendo que compitas con ITA, lo que te tomó cinco años crear, ITA lo completó en solo tres meses con la ayuda del lenguaje Lisp, todavía me refiero a cinco años cuando todo. transcurrió sin contratiempos, no se cometieron errores y ningún problema fue demasiado grande. De hecho, según la situación real de la mayoría de las empresas, un proyecto previsto para completarse en cinco años probablemente nunca se completará.

Admito que el ejemplo anterior es demasiado extremo. ITA parece tener un grupo de hackers muy inteligentes y C es un lenguaje de muy bajo nivel. Sin embargo, en un mercado altamente competitivo, incluso si la velocidad de desarrollo difiere sólo dos o tres veces, es suficiente para quedarse siempre atrás.