¿Por qué los antiguos lenguajes de programación continúan siendo revisados?

46

Esta pregunta no es, "¿Por qué la gente todavía usa lenguajes de programación antiguos?" Lo entiendo bastante bien. De hecho, los dos lenguajes de programación que mejor conozco son C y Scheme, que se remontan a los años 70.

Recientemente estaba leyendo sobre los cambios en C99 y C11 versus C89 (que parece ser la versión más utilizada de C en la práctica y la versión que aprendí de K&R). Mirando a su alrededor, parece que cada lenguaje de programación en uso intensivo obtiene una nueva especificación al menos una vez por década más o menos. Incluso Fortran todavía está recibiendo nuevas revisiones, a pesar del hecho de que la mayoría de las personas que lo usan todavía usan FORTRAN 77.

Compare esto con el enfoque del, por ejemplo, el sistema de composición tipográfica TeX. En 1989, con el lanzamiento de TeX 3.0, Donald Knuth declaró que TeX tenía características completas y las versiones futuras contendrían solo correcciones de errores. Incluso más allá de esto, ha declarado que después de su muerte, "todos los errores restantes se convertirán en características" y no se realizarán más actualizaciones. Otros son libres de bifurcar TeX y lo han hecho, pero los sistemas resultantes se renombran para indicar que son diferentes del TeX oficial. Esto no es porque Knuth piense que TeX es perfecto, sino porque comprende el valor de un sistema estable y predecible que hará lo mismo en cincuenta años que lo hace ahora.

¿Por qué la mayoría de los diseñadores de lenguajes de programación no siguen el mismo principio? Por supuesto, cuando un idioma es relativamente nuevo, tiene sentido que atraviese un período de cambio rápido antes de establecerse. Y nadie puede realmente objetar cambios menores que no hacen mucho más que codificar pseudo-estándares existentes o corregir lecturas no deseadas. Pero cuando un idioma todavía parece necesitar mejorar después de diez o veinte años, ¿por qué no simplemente bifurcarlo o comenzar de nuevo, en lugar de intentar cambiar lo que ya está en uso? Si algunas personas realmente quieren hacer programación orientada a objetos en Fortran, ¿por qué no crear "Objectran Fortran" para ese propósito y dejar solo a Fortran?

Supongo que se podría decir que, independientemente de futuras revisiones, C89 ya es un estándar y nada impide que la gente continúe usándolo. Esto es cierto, pero las connotaciones tienen consecuencias. GCC, en modo pedante, advertirá sobre la sintaxis que está en desuso o que tiene un significado sutilmente diferente en C99, lo que significa que los programadores de C89 no pueden ignorar totalmente el nuevo estándar. Por lo tanto, debe haber algún beneficio en C99 que sea suficiente para imponer esta sobrecarga a todos los que usan el lenguaje.

Esta es una pregunta real, no una invitación a discutir. Obviamente tengo una opinión sobre esto, pero en este momento solo estoy tratando de entender por qué esto ya no es solo cómo se hacen las cosas. Supongo que la pregunta es:

¿Cuáles son las ventajas (reales o percibidas) de actualizar un estándar de idioma, en lugar de crear un nuevo idioma basado en el antiguo?


fuente
2
Muchos compiladores pueden invocarse con conmutadores que impondrán estándares más antiguos (por ejemplo, el --std=xconmutador de GCC ), por lo que no es como si la creación de estándares más nuevos resultara en herramientas que desestabilizan el código más antiguo.
Blrfl
2
¿Cómo define "un nuevo lenguaje basado en el antiguo"? Yo diría que Fortran 90 es un "nuevo lenguaje" basado en el antiguo F77. Cambió por completo la forma en que programa: fuente fija frente a fuente libre, memoria dinámica frente a estática, etc. También podría argumentar que Fortran 2003 es un "nuevo lenguaje" basado en F90: agregó programación orientada a objetos al tiempo que conserva la compatibilidad con F90. Suena como la relación entre C ++ y C.
tpg2114
1
Creo que esta pregunta es muy importante y no entiendo por qué algunos quieren cerrarla. Es un fenómeno muy interesante que probablemente tenga alguna explicación. Hace unos (20?) Años estaba leyendo sobre las nuevas funciones de Fortran y me pregunté: si los programadores de Fortran necesitan estas funciones, ¿por qué no cambian simplemente a C? Recientemente tuve una consideración similar con respecto a C ++: si los desarrolladores de C ++ quieren usar lambdas, ¿por qué no cambiar a, por ejemplo, OCaml ( linux-nantes.org/~fmonnier/ocaml/ocaml-wrapping-c.php )? ¿Por qué prefieren crear un nuevo lenguaje y aún llamarlo C ++?
Giorgio
3
@ tpg2114 La diferencia entre (FORTRAN 77: Fortran 90) y (C: C ++) es que se considera que Fortran 90 reemplazó a FORTRAN 77, hasta el punto en que se le dice a la gente: "Si quieres aprender Fortran, aprende Fortran 2003 o al menos 90, porque ese es el estándar ahora ". Nadie diría algo como: "Si quieres aprender C, aprende C ++ porque ese es el nuevo estándar", porque se presentan como dos lenguajes diferentes. Como dije, las connotaciones tienen consecuencias.
66
PORQUE NUNCA MUERE
Adel

Respuestas:

13

Creo que la motivación para que los diseñadores de idiomas revisen los idiomas existentes es introducir innovación mientras se asegura de que su comunidad de desarrolladores objetivo permanezca unida y adopte el nuevo idioma: mover una comunidad existente a una nueva revisión de un idioma existente es más efectivo que crear una nueva comunidad alrededor de un nuevo idioma. Por supuesto, esto obliga a algunos desarrolladores a adoptar el nuevo estándar incluso si estaban de acuerdo con el anterior: en una comunidad a veces tienes que imponer ciertas decisiones a una minoría si quieres mantener a la comunidad unida.

Además, tenga en cuenta que un lenguaje de propósito general trata de servir a tantos programadores como sea posible, y a menudo se aplica en nuevas áreas para las que no fue diseñado. Entonces, en lugar de apuntar a la simplicidad y la estabilidad del diseño, la comunidad puede optar por incorporar nuevas ideas (incluso de otros idiomas) a medida que el idioma se traslada a nuevas áreas de aplicación. En tal escenario, no puede esperar hacerlo bien en el primer intento.

Esto significa que los idiomas pueden sufrir cambios profundos a lo largo de los años y la última revisión puede ser muy diferente de la primera. El nombre del idioma no se mantiene por razones técnicas, sino porque la comunidad de desarrolladores acepta usar un nombre antiguo para un idioma nuevo. Entonces, el nombre del lenguaje de programación identifica la comunidad de sus usuarios en lugar del lenguaje en sí.

En mi opinión, la motivación por la que muchos desarrolladores encuentran esto aceptable (o incluso deseable) es que una transición gradual a un idioma ligeramente diferente es más fácil y menos confusa que un salto a un lenguaje completamente nuevo que les tomaría más tiempo y esfuerzo dominar. Tenga en cuenta que hay varios desarrolladores que tienen uno o dos idiomas favoritos y no están muy interesados ​​en aprender idiomas nuevos (radicalmente diferentes). E incluso para aquellos a quienes les gusta aprender cosas nuevas, aprender un nuevo lenguaje de programación es siempre una actividad difícil y que requiere mucho tiempo.

Además, puede ser preferible ser parte de una comunidad grande y un ecosistema rico que de una comunidad muy pequeña que usa un idioma menos conocido. Entonces, cuando la comunidad decide seguir adelante, muchos miembros deciden seguir para evitar el aislamiento.

Como comentario adicional, creo que el argumento de permitir la evolución mientras se mantiene la compatibilidad con el código heredado es bastante débil: Java puede llamar al código C, Scala puede integrarse fácilmente con el código Java, C # puede integrarse con C ++. Hay muchos ejemplos que muestran que puede interactuar fácilmente con el código heredado escrito en otro idioma sin la necesidad de compatibilidad con el código fuente.

NOTA

De algunas respuestas y comentarios, parece que entiendo que algunos lectores han interpretado la pregunta como "¿Por qué los lenguajes de programación necesitan evolucionar?"

Creo que este no es el punto principal de la pregunta, ya que es obvio que los lenguajes de programación necesitan evolucionar y por qué (nuevos requisitos, nuevas ideas). La pregunta es más bien "¿Por qué esta evolución tiene que ocurrir dentro de un lenguaje de programación en lugar de generar muchos lenguajes nuevos?"

Giorgio
fuente
Esta respuesta tiene más sentido para mí que cualquiera de los que he visto aquí: actualizar un idioma le permite heredar (al menos parte de) la comunidad existente, bibliotecas, etc. Recuerdo haber leído que el mayor problema de Lisp es la gran cantidad de dialectos incompatibles que dificultan el mantenimiento de una comunidad; actualizar un idioma existente podría ser una forma de evitar la fragmentación de otras comunidades de la misma manera.
@SunAvatar: Hasta donde yo sé, Lisp tiene varios dialectos, pero algunos tienen más éxito que otros (Common Lisp, Scheme, Racket, Clojure). Cada vez que comienzas un nuevo idioma, corres el riesgo de que solo una comunidad muy pequeña se reúna a su alrededor. En la comunidad de Lisp, esto parece una práctica común: si alguien tiene una idea nueva, se ramifica y ve qué sucede. Para los creadores de otros idiomas, perder la comunidad no es una opción.
Giorgio
@SunAvatar: No veo heredar bibliotecas existentes como un argumento fuerte. No necesita compatibilidad con el código fuente para eso. Vea, por ejemplo, cómo Clojure y Scala pueden usar código Java.
Giorgio el
1
Los idiomas no mueren, solo los programadores que los usan.
Evan Plaice
@SunAvatar: También hay comunidades que intentan seguir una política diferente: un nombre identifica un idioma, y ​​si una parte de la comunidad crea un dialecto que diverge demasiado, usan un nombre nuevo para evitar confusiones. Ver, por ejemplo, racket-lang.org/new-name.html
Giorgio el
21

La compatibilidad con versiones anteriores es su respuesta. Un lenguaje dado, particularmente uno ampliamente utilizado como C puede tener código que está en funcionamiento, sin modificaciones, durante décadas. Si necesita mantenimiento, es útil tener compiladores que puedan apuntar a ese tipo de plataforma mientras se ejecutan en sistemas modernos para el trabajo de desarrollo. Las estandarizaciones y las actualizaciones de la versión del lenguaje ayudan a mantener actualizadas las prácticas de programación al tiempo que proporcionan una sensación de familiaridad para los programadores veteranos que pueden resistirse a aprender un lenguaje "completamente nuevo".

Tenga en cuenta que muchos de los idiomas actualizados están menos actualizados que "tienen nuevos bits brillantes atornillados". Las bestias de antaño a menudo todavía acechan dentro.

En lo que respecta a Knuth, recuerde que él es un académico y que TeX solo se demuestra correcto, no actualizado.

Ingeniero mundial
fuente
14
El dominio del problema de Tex = formato de texto en papel científico, no ha cambiado mucho. El dominio de los lenguajes de programación = encontrar nuevos usos para las nuevas computadoras, es bastante más expansivo. Es la misma razón por la que el latín no agrega tantas palabras nuevas como el inglés
Martin Beckett, el
No creo que la compatibilidad con versiones anteriores sea una razón válida: Scala se puede integrar fácilmente con el código Java existente, pero no es un superconjunto de Java. Por lo tanto, creo que en general no es necesario que un nuevo idioma sea compatible con uno antiguo a nivel del código fuente. Es suficiente tener un mecanismo bien definido para llamar al código heredado del nuevo código.
Giorgio
@Martin Beckett: "El dominio del problema de Tex = formato de texto en papel científico, no ha cambiado mucho": Creo que te estás perdiendo el punto de la pregunta. El OP no pregunta si debería haber innovación en los lenguajes de programación (nadie puede negar que la innovación es necesaria) sino por qué se revisan los viejos lenguajes en lugar de crear nuevos.
Giorgio
Los sistemas se basan en inversiones de tiempo, dinero y experiencia (experiencia adquirida en un idioma en particular). Los nuevos esfuerzos cuestan mucho más que los esfuerzos de mantenimiento (en las tres categorías). Sin mejoras en el lenguaje y la plataforma en general, el costo de mantenimiento aumenta, y luego el costo de un nuevo sistema es más atractivo y la reubicación genuina de esa aplicación COBOL en una plataforma completamente diferente por octava vez en su vida puede no parecer como una gran oferta más.
JustinC
Si no fuera por los estándares actualizados del lenguaje COBOL y los implementadores de la herramienta COBOL agregando sus propias características únicas en el camino, eso mejoró el lenguaje y mejoró la capacidad de operar en plataformas más amplias, convencionales y modernas; la aplicación no habría sobrevivido 60 años. Si bien los costos relativos ciertamente aumentaron más tarde en su vida, debido a una escasez creciente de experiencia, el esfuerzo en general fue de centavos por dólar en comparación con una reescritura regular cuando surgió el lenguaje del momento.
JustinC
5

Creo que la respuesta obvia es que todavía se están haciendo progresos en el diseño del lenguaje y la arquitectura del sistema, y ​​que a la gente le importan los idiomas más antiguos que quieren aprovechar las nuevas técnicas (núcleos múltiples, mejores hilos o modelos de memoria) que se atornillan en o al horno en el estándar de idioma. También ayuda tener "una forma verdadera" de hacer cosas (por ejemplo, análisis XML, acceso a la base de datos) con las que puede contar para estar allí sin importar en qué compilador o plataforma se encuentre, en lugar de depender de algún tercero biblioteca que puede o no estar instalada (y puede o no ser la versión que necesita, etc.).

TMN
fuente
Entonces, si la razón es "suficiente gente que se preocupa por los idiomas antiguos", ¿diría que su respuesta puede reformularse como "apego sentimental a los idiomas existentes"? No digo eso peyorativamente, solo trato de entender tu respuesta.
Avner Shahar-Kashtan
No, quise decir que los idiomas todavía están en uso activo, y son utilizados por personas que quieren aprovechar las últimas técnicas. No creo que nadie vaya a agregar compatibilidad con subprocesos múltiples a ALGOL porque (AFAIK) no se está utilizando activamente. FORTRAN y COBOL, sin embargo, todavía se utilizan para desarrollar nuevos sistemas, por lo que sus especificaciones de lenguaje se actualizan periódicamente para incorporar nuevas técnicas y tecnologías.
TMN
1

Los conceptos u objetivos fundamentales sobre los que se construye un lenguaje de propósito general no pierden relevancia; sin embargo, cambios menores en el entorno de trabajo o el hardware exigen que se agreguen actualizaciones o pequeñas características a un idioma.

La forma en que los algoritmos se expresan en un idioma no cambiará, a pesar de que puede necesitar un soporte más limpio para los tipos de 64 bits, o un soporte de expresión regular más estándar, o un soporte más robusto para los nuevos tipos de sistemas de archivos.

Hay algunos casos en los que se están agregando 'nuevas' características a los idiomas existentes, pero en muchos casos esos cambios equivalen a simplificaciones de cosas que las personas ya estaban haciendo de la manera difícil. (Consulte C ++ utilizando funciones de orden superior en lugar de punteros y functores de funciones).

Ben
fuente
1
Los cambios que describe en el segundo párrafo son bastante objetables (con lo que quiero decir no solo que no me opongo, sino que nadie puede objetar seriamente). En cuanto a las lambdas, no puedo comentar sobre su utilidad en C ++, pero ¿por qué molestarse en agregarlas si no es para cambiar la forma en que se expresan los algoritmos?
Oh, son increíblemente útiles. No me malinterpretes. Son la adición más importante en C ++ (IMO). Creo que no tenía claro lo que quería decir allí. Por lo general, se elige C ++ para tener acceso directo a la memoria, rendimiento determinista y alto potencial de optimización. Eso no cambia con las adiciones recientes. Simplificamos muchas de las otras tareas de programación en torno a por qué eligió C ++, pero C ++ sigue siendo válido y útil por las mismas razones. El esquema se actualiza con regularidad, pero el código como datos y la lispy-ness no cambian, por lo que elige el esquema por las mismas razones hoy que hace 20 años.
Ben
"En cuanto a las lambdas, no puedo comentar sobre su utilidad en C ++, pero ¿por qué molestarse en agregarlas si no cambia la forma en que se expresan los algoritmos?": Voy más allá: ¿por qué agregarlos a C ++ en lugar de cambiar a un lenguaje que los ha tenido desde el principio?
Giorgio
2
@Giorgio Para tener control de las características de caché y abstracción en el lenguaje. Si ningún idioma existente proporciona ambos, entonces no puede cambiar de idioma sin sacrificar uno. Tienes que modificar un idioma o crear uno nuevo.
mike30
@mike: ¿Qué quieres decir con "características de caché"?
Giorgio el
-2

Esto es un poco como una consideración del lenguaje hablado.

En el pasado, había palabras que no se usaban tan a menudo como ahora (o que se usaban con un significado diferente).

p.ej. bonito: en inglés (muy antiguo) tiene el significado casi inverso al que usamos hoy, especialmente cuando se usa para describir el carácter de alguien.

Malo: no hace mucho tiempo malo solo tenía un significado único, ahora puede significar algo que es "súper asombroso" (se usa de una manera fesica (¡probablemente he echado de menos fesicous deletreado)!

Otra novedad es el teléfono móvil 'Text speak' para idiomas escritos.

Personalmente, no veo por qué un lenguaje de programación no se desarrollará de manera similar, las palabras y las funciones tienen significados / acciones específicos, y es necesario cambiar para incorporar nuevas ideas, nuevas metodologías.

Conozco personas que hablan muchos idiomas diferentes, y a menudo sugieren que después del 3 o 4 se hace más fácil aprender uno nuevo.

No sé si hay programadores que tengan una experiencia similar, no me sorprendería si la hubiera.

Sé que me siento feliz programando en JAVA (tanto como me siento feliz hablando en inglés). Esto no significa que no pueda comunicarme en 'inglés americano' o 'inglés australiano', aunque hay algunas 'trampas' a tener en cuenta. . Al igual que pasar de Java a PHP a Perl, las construcciones son similares, pero hay pequeñas trampas que me atrapan y me hacen golpear mi cabeza contra la pared.

Esto es diferente a pasar de inglés a francés o de Java a SAS. estos son tan diferentes que lleva bastante tiempo llegar a dominarlos.

De todos modos esa es mi opinión sobre esto.

DaveM
fuente
Creo que estás pensando en "gracioso".
uliwitness