¿Por qué hay tantos lenguajes de programación?

130

Soy bastante fluido en C / C ++, y puedo manejar los diversos lenguajes de scripting (awk / sed / perl). Empecé a usar Python mucho más porque combina algunos de los aspectos ingeniosos de C ++ con las capacidades de scripting de awk / sed / perl.

Pero, ¿por qué hay tantos lenguajes de programación diferentes? Supongo que todos estos idiomas pueden hacer las mismas cosas, entonces, ¿por qué no limitarse a un solo idioma y usarlo para programar computadoras? En particular, ¿hay alguna razón por la que deba conocer un lenguaje funcional como programador de computadoras?

Algunas lecturas relacionadas:

Suresh
fuente
2
También hay una diferencia entre OO y no OO. Además, algunos idiomas vienen con paquetes agradables: R, Maple, Matlab, Mathematica que a menudo carecen de otros idiomas.
Artem Kaznatcheev
44
Ya pregunte en Programadores programmers.stackexchange.com/q/7551/45322
alain.janinm
2
Para implementar algoritmos paralelos, la programación funcional es mejor, en general, cuando tiene objetos mutables, es mejor usar el paradigma OO, de lo contrario (si desea tratar con objetos inmutables ) es mejor cambiarlo a modelo funcional. Este escenario existe ampliamente en el procesamiento paralelo. También algunos de los excelentes patrones OO, como la interfaz fluida y el encadenamiento de métodos , funcionan como paradigma funcional.
44
¿Por qué hay tantos autos? ¿Por qué hay tantos aviones? ¡Y qué hay de los BARCOS! ¡En serio! ¡Bajas al océano y hay, como, todos los TIPOS de las cosas malditas! ¿Cuál es el punto de todos esos diferentes tipos de cosas?!?!? ¡Es ineficiente! ¡Es un desperdicio! ¿Y cuál es el punto de todas esas opciones diferentes?!?!? Geez - sabio gente! ¡Nadie podría necesitar nada más que un Yugo, un F-150 y un transatlántico! Oh, sí, aviones: los MD-80 funcionarán bien para casi todo. Ahí. Ahora que eso es todo está arreglado ... :-)
Bob Jarvis

Respuestas:

116

Los lenguajes de programación evolucionan y se mejoran con el tiempo (innovación).

Las personas toman ideas de diferentes idiomas y las combinan en nuevos idiomas. Algunas características se mejoran (mecanismos de herencia, sistemas de tipos), algunas se agregan (recolección de basura, manejo de excepciones), algunas se eliminan ( gotodeclaraciones, manipulaciones de puntero de bajo nivel).

Los programadores comienzan a usar un lenguaje de una manera particular que no es compatible con ninguna construcción de lenguaje. Los diseñadores de idiomas identifican tales patrones de uso e introducen nuevas abstracciones / construcciones de lenguaje para soportar tales patrones de uso. No hubo procedimientos en lenguaje ensamblador. Sin clases en C. Sin manejo de excepciones en (++) C ++. No hay una forma segura de cargar nuevos módulos en los primeros idiomas (fácil en Java). Sin hilos integrados (fácil de usar en Java).

Los investigadores piensan en formas alternativas de expresar cálculos. Esto condujo a Lisp y a la rama funcional del lenguaje del árbol del lenguaje, Prolog y la rama de programación lógica, Erlang y otros modelos de programación basados ​​en actores, entre otros.

Con el tiempo, los diseñadores / investigadores del lenguaje llegan a comprender mejor todas estas construcciones, y cómo interactúan, y diseñan lenguajes para incluir muchas de las construcciones populares, todas diseñadas para trabajar juntas sin problemas. Esto da como resultado lenguajes maravillosos como Scala, que tiene objetos y clases (expresados ​​usando rasgos en lugar de herencia simple o múltiple), características de programación funcional, tipos de datos algebraicos integrados muy bien con el sistema de clases y la coincidencia de patrones, y concurrencia basada en actores.

Los investigadores que creen en los sistemas de tipo estático se esfuerzan por mejorar su expresividad, permitiendo cosas como las clases genéricas escritas en Java (y todas las cosas maravillosas en Haskell), para que un programador obtenga más garantías antes de ejecutar un programa de que las cosas no van a ir mal. Los sistemas de tipo estático a menudo imponen una gran carga sobre el programador (tecleando los tipos), por lo que se han realizado investigaciones para aliviar esa carga. Los lenguajes como Haskell y ML permiten al programador omitir todas las anotaciones de tipo (a menos que estén haciendo algo complicado). Scala permite al programador omitir los tipos dentro del cuerpo de métodos, para simplificar el trabajo del programador. El compilador infiere todos los tipos faltantes e informa al programador de posibles errores.

Finalmente, algunos idiomas están diseñados para admitir dominios particulares. Los ejemplos incluyen SQL, R, Makefiles, el lenguaje de entrada Graphviz, Mathmatica, LaTeX. Integrar las funcionalidades de estos lenguajes en lenguajes de propósito general (directamente) sería bastante engorroso. Estos lenguajes se basan en abstracciones específicas de su dominio particular.

Sin la evolución en el diseño del lenguaje de programación, todos seguiríamos usando lenguaje ensamblador o C ++.

En cuanto a conocer un lenguaje de programación funcional : los lenguajes funcionales le permiten expresar cálculos de manera diferente, a menudo de manera más concisa que el uso de otros lenguajes de programación. Considere la diferencia entre C ++ y Python y multiplíquelo por 4. Más en serio, como ya se mencionó en otra respuesta, la programación funcional le brinda una forma diferente de pensar sobre los problemas. Esto se aplica a todos los demás paradigmas; algunos se adaptan mejor a algunos problemas y otros no. Esta es la razón por la cual los lenguajes de paradigmas múltiples se están volviendo más populares: puede usar construcciones de un paradigma diferente si lo necesita, sin cambiar el idioma y, más desafiante, puede mezclar paradigmas dentro de una sola pieza de software.

Dave Clarke
fuente
1
Completamente de acuerdo. Estoy interesado en saber dónde estarán los lenguajes de paradigmas múltiples (por ejemplo, Scala) en un par de años. Si permiten una integración DSL fácil, en realidad podríamos ver una disminución gradual en los números de idiomas.
Raphael
2
Respuesta muy detallada! Podríamos reconocer que la mayoría de los lenguajes de programación pueden ser equivalentes a Turing, pero eso no significa que la abstracción que admiten sea adecuada para cada dominio problemático.
CyberFonic
Poner ensamblaje y C ++ en una misma caja me duele el corazón. ¡C ++ ha evolucionado mucho! Especialmente desde C ++ 11 y adelante.
Peregring-lk
66

tldr: No hay lenguaje de bala de plata.

Espero que no me demanden, pero aquí hay una foto de una de las presentaciones de Stanford.

ingrese la descripción de la imagen aquí

Cuando decide elegir un idioma, puede elegir solo 2 de estas 3 características .

Y es por eso que la gente está triste y quiere inventar un superlenguaje que cubra a los 3.

En realidad, hay una gran lista de requisitos (algunos de ellos se pueden ver en otras respuestas) pero solo agregan detalles a las características principales. Además, existen razones históricas y políticas para preferir un idioma sobre otro.

Las combinaciones de tales factores producen un nuevo lenguaje.

( Y he escuchado que todo buen programador debe crear su propio lenguaje nuevo )

Om nom nom
fuente
11
Con el tiempo, el triángulo se está reduciendo, en el sentido de que las esquinas se están acercando ... Espero / sueño.
Dave Clarke
1
Rendimiento y generalidad, se puede comparar más o menos, pero agregaré que la experiencia en un idioma le brinda más productividad que un idioma en sí mismo, no es justo comparar solo la "productividad de los idiomas", porque necesita suponer conocimiento y experiencia todos ellos, una hipótesis muy poco probable.
Hernan_eche
Esta es una declaración interesante y me recuerda el teorema de CAP. ¿Es esto solo una argumentación informal, o se puede probar el triángulo?
evnu
1
@evnu, aquí hay un argumento cuasiformal de una parte: suponiendo que generalidad significa que los programas válidos de cualquier longitud n en el lenguaje L cubren un espacio problemático más grande, cada subespacio de problemas solo está cubierto por algunas fracciones de la longitud n programas. Si los programas de longitud n fuera de su subespacio particular estuvieran dentro de su subespacio, tendría mayores probabilidades de encontrar un programa más corto que resolviera su problema (por lo que presumiblemente sería más productivo), pero el lenguaje sería menos general. - resolvería problemas en otros subespacios menos bien (es decir, con programas más largos).
Jonas Kölker
Este es un buen argumento de que necesita al menos dos lenguajes de programación, así como una gran cantidad de lenguajes específicos de dominio, cubriendo así los tres lados del triángulo. Tenemos muchos, muchos, muchos más que eso. (Y pondría c en el vértice superior del triángulo, pero esa es una queja bastante pequeña.)
Peter Shor
25

El mundo está lleno de cosas que tienen muchas variaciones diferentes: procesadores de texto, automóviles, diseños para el hogar, bebidas, dulces, bolígrafos, palas, etc. Las razones por las que tenemos tantos pueden resumirse en algunos principios:

  • Alguien piensa que puede mejorar los productos existentes.
  • Se requiere un diseño diferente por consideraciones locales (piense: casas sobre pilotes versus casas sobre losas de concreto)
  • Una nueva categoría de producto satisface una necesidad donde antes no existía

Ingrese a cualquier tienda de suministros de oficina y mire la sección "instrumento de escritura": hay cientos de variedades de bolígrafos. Todos hacen aproximadamente lo mismo: entregar tinta a una superficie de escritura. Pero cada bolígrafo que se ve a la venta está allí porque es uno de los tres motivos anteriores.

  • Las plumas estilográficas de cartucho son una mejora en las plumas estilográficas sumergidas, que a su vez son una mejora en las plumas de plumas.
  • La NASA necesitaba un bolígrafo que pudiera escribir en ausencia de gravedad, por lo que se inventó el bolígrafo a presión.
  • La primera pluma en sí misma puede haber sido un palo puntiagudo sumergido en alquitrán o sangre; Antes de eso, la gente raspaba rocas o untaba pigmentos en las paredes con pieles. (Solo una suposición.)

La evolución de los bolígrafos continuará ya que ningún producto se ajusta a las necesidades de cada usuario. Algunas plumas son baratas y desechables, algunas son caras y están construidas con materiales de alta calidad; algunos usan geles, algunos usan tinta, algunos usan pigmentos; algunos tienen tapas desenroscables, algunos no tienen tapas en absoluto; barriles anchos, barriles estrechos, barriles redondos, barriles cuadrados; corto largo; rojo, blanco, negro, azul Etcétera etcétera.

Pero basta de bolígrafos.

Nuestra miríada actual de lenguajes de programación se remonta a los primeros: los códigos de máquina numéricos para las primeras computadoras en la década de 1940. Primitivo, difícil de usar y laborioso para ingresar a la computadora, pero hicieron el trabajo. No pasó mucho tiempo después de que los programadores asignaron palabras mnemotécnicas (como AGREGAR, LLAMAR, CARGAR) a los códigos de máquina, dando origen a la clase de idiomas llamados "lenguajes de ensamblaje".

Las diferentes arquitecturas de procesador requerían diferentes códigos mnemónicos, dependiendo de las características específicas de las máquinas subyacentes. Tener en cuenta estas diferencias significaba inventar diferentes lenguajes de ensamblaje.

(Quizás a estas alturas puedas ver a dónde va esto ...)

Los programadores observaron sus programas de lenguaje ensamblador y vieron patrones: las mismas secuencias de instrucciones se usarían para formar bucles, condicionales, asignación de variables, llamadas a funciones, etc. Así nacieron los lenguajes de programación procesal. Estos idiomas encapsulan grupos de instrucciones bajo términos generales como "if", "while", "let", etc.

De un análisis matemático de la programación de computadoras surgieron los lenguajes funcionales, una forma completamente nueva de ver la computación. No mejor, no peor, solo diferente.

Y luego está orientado a objetos, estáticamente tipado, tipado dinámicamente, enlace tardío, enlace temprano, bajo uso de memoria, alto uso de memoria, paralelizable, idiomas para usos específicos, y así sucesivamente.

En última instancia, tenemos diferentes lenguajes de programación porque queremos diferentes lenguajes de programación. Cada diseñador de idiomas tiene sus propias ideas sobre cómo se verá y funcionará su lenguaje "soñado". La diversidad es algo bueno .

Barry Brown
fuente
No veo ninguna razón convincente dada por qué deberíamos tener varios idiomas además de que la gente quiera por cualquier razón.
Raphael
Eso es exactamente. Los programadores son, por naturaleza, solucionadores de problemas. Para resolver problemas, necesitan herramientas que a menudo toman la forma de lenguajes de programación. Si las herramientas no pueden ayudarlos a resolver su problema de la manera que desean, inventan nuevas herramientas. Piénselo de esta manera: dado que las herramientas son software y el nuevo software está escrito para resolver nuevos problemas, las herramientas mismas pueden ser problemas a resolver. Esos problemas se resuelven haciendo nuevas herramientas.
Barry Brown
Solo una cuestión: la rama funcional de los lenguajes es una muestra de las ideas del matemático sobre cómo expresar lo que hoy llamamos "computación", que comenzó a considerarse unos 50 años antes de las primeras computadoras. No es por nada que LISP (en alguna forma) es el segundo idioma más antiguo que existe, el primero es FORTRAN.
vonbrand
20

Los lenguajes de programación funcional generalmente se basan en el modelo de computación diferente (pero equivalente en potencia): cálculo lambda . Hay algunos lenguajes sin tipo (con mecanografía similar a Python) como LISP, Scheme (utilizado en el libro / curso de Estructura e Interpretación de Programas de Computación ampliamente reconocible ) y lenguajes de tipo estático como Haskell, ML, F #.

SICP es lo que me llevó a la programación funcional, pero otras personas recomiendan este artículo de John Hughes y esta entrevista con él.

Microsoft está impulsando la programación funcional, por ejemplo, que ha incluido F # (su lenguaje funcional para .NET) en VS2010 y 11; También emplean a algunos desarrolladores de Haskell en MSR, IIRC.

Tenga en cuenta que también hay algunos lenguajes de programación funcionales que no son cálculos lambda, como Refal , que se basa en la coincidencia y reescritura de patrones.

Debido a que el nivel de abstracción en los lenguajes funcionales es diferente, su actitud para resolver problemas cambia cuando utiliza técnicas de programación funcional. Algunos dicen que puede hacerte un mejor programador en general.

Daniil
fuente
1
Otra clase interesante de lenguajes son los lenguajes de programación lógica, como Prolog. Solo tuve una experiencia muy limitada con DataLog, ¿tal vez alguien más podría escribir una respuesta sobre eso?
Daniil
2
Estoy de acuerdo en que necesitamos un lenguaje de programación para cada paradigma de programación: imperativo, OO, declarativo, funcional, etc. Pero esto no explica por qué tenemos tantos, por ejemplo, lenguajes OO.
Dai
@Dai, bueno, ¿de verdad? El fundamento teórico no es la única característica de un lenguaje. Por ejemplo, se puede decir que una característica clave de Java o C # es (en comparación con C ++) la máquina virtual, lo que hace que Java sea significativamente diferente.
Daniil
Pero si C # y Java usan el concepto de máquina virtual, ¿por qué no usamos una sintaxis idéntica para ambos lenguajes? Creo que cada diseñador tiene sus ideas fuertes sobre cómo debería ser su lenguaje, y tiene la tendencia de crear su propio estándar.
Dai
@Dai, después de todo, hay muchas diferencias menores entre C # y Java. Además, creo que hubo alguna disputa legal sobre Java VM para Windows o algo por el estilo.
Daniil
19

En particular, ¿hay alguna razón por la que deba conocer un lenguaje funcional como programador de computadoras?

Si. Porque Haskell cambió mi forma de pensar. Podría cambiar tu forma de pensar también.

Historia: Solía ​​pensar que puedo aprender cualquier lenguaje de programación en un día. Un día empecé Haskell. Terminé todo lo que vino antes de las mónadas en medio día. Ahora ha pasado un año desde ese día y todavía estoy irremediablemente atrapado en Monads.

Leer:

  1. Wiki de idiomas y pensamiento

  2. La notación como herramienta para el pensamiento de Kenneth E. Iversion, conferencia del Premio Turing

Pero, ¿por qué hay tantos lenguajes de programación diferentes?

La notación es una herramienta para el pensamiento. Necesitamos diferentes anotaciones a medida para lidiar con diferentes pensamientos cómodamente. Entonces creamos nuevos idiomas.

Además, lee . ;-)

Pratik Deoghare
fuente
55
¡Recurrir es divino!
Pratik Deoghare
44
¿iterar es humano?
Suresh
1
No estoy seguro si ese fue un buen anuncio para Haskell. ;)
Barry Brown
@Pratik Deoghare. Aprender Haskell en un día probablemente no fue una buena idea. Yo diría, lea un buen libro de texto sobre programación funcional, como Bird y Wadler, y tómese su tiempo para hacerlo. Entonces las mónadas podrían no ser tan difíciles.
Uday Reddy
"Terminé todo lo que vino antes de las mónadas en medio día". De Verdad? ¿Aprendiste clases de tipos, functores, ADT, tipos, etc. en medio día? Eso es imposible. LYAH tiene mónadas en el capítulo 12 de 14. RWH no tiene mónadas hasta el capítulo 6, y se introducen muy gradualmente - la definición completa se encuentra en el capítulo 14.
sdcvvc
13

Difícilmente podría haber un programador que en algún momento no se haya sentido frustrado por las limitaciones del lenguaje que estaban usando y decidió rascarse la picazón. Así nace un nuevo lenguaje, o dialecto de uno existente.

Abadi y Cardelli en "A Theory of Objects" desarrollan una familia completa de lenguajes de programación a partir de bases orientadas a objetos. Demuestran que la programación funcional es un caso especial de OO pero no a la inversa.

Inventar algo nuevo es divertido, es por eso que las personas tienen más probabilidades de crear otro idioma que contribuir a mejorar uno existente. Por supuesto, hay custodios de idiomas que no aceptan cambios en su visión. El mejor ejemplo es el abismo entre los partidarios de Common Lisp y Scheme.

CyberFonic
fuente
3
Una teoría de los objetos no presenta una familia completa de lenguajes de programación utilizables. Presenta una base para los lenguajes de programación orientados a objetos, y es extraño, ya que no se basa en clases. No veo la conexión entre "Una teoría de los objetos" y la programación funcional. Los cálculos de objetos no tienen noción de pereza, por ejemplo. También hay investigaciones que codifican conceptos de OO en términos de funciones y registros, por ejemplo, el trabajo de Pierce a finales de los 90.
Dave Clarke
11

¿Por qué hay tantos países en el mundo? ¿No sería más fácil si tuviéramos 5 o 6 superpoderes, o incluso un reino universal de la Tierra? Es fácil argumentar por qué no sería mejor --- para empezar, la competencia en diferentes países puede conducir al progreso, y desde el punto de vista de la democracia, los derechos humanos, etc., muchos países pueden ser mejores que uno: - Pero esto no explica por qué tenemos muchos países. Solo explica por qué muchos países serían mejores .

Del mismo modo, puedes preguntar, ¿por qué tantos lenguajes humanos diferentes? Polaco, árabe, mandarín ... ¿No sería más fácil si hubiera un solo idioma? Podría argumentar de cualquier manera, pero esas serían razones por las cuales sería mejor si la vida fuera de una manera u otra. No explicaría las causas detrás de que haya tantos lenguajes humanos diferentes.

La cuestión es que hay muchas personas en el planeta, y todos estamos haciendo lo nuestro, todos tenemos nuestras opiniones, todos queremos estar a cargo y tener nuestro propio país o lenguaje de programación, y a menudo pensamos que sabemos mejor que otros, o al menos no se molestan en entender lo que otros tienen para ofrecer.

Lea esta publicación de blog muy esclarecedora, ¿Por qué tantos frameworks web de Python? Aparentemente, hay alrededor de 50 marcos web en Python. Esto es simplemente ridículo; no hay absolutamente ninguna razón racional sensata para eso. Pero el autor de la publicación responde: hay tantos frameworks web de Python porque es muy fácil crear uno . No necesita una razón racional para que haya más marcos web de Python o más lenguajes de programación. Las personas seguirán creando nuevas porque no saben lo que ya está disponible, o porque esperan poder ganar dinero, ¡o simplemente porque crear cosas nuevas es divertido!

Permítanme describir un ejemplo personal. Hace unos 10 años estaba escribiendo un código C ++ para una empresa finlandesa. Ya sabes, en Finlandia tienen esos enormes camiones que, bueno, viajan largas distancias y entregan muchas cosas de un lugar a otro. Estoy seguro de que también hay camiones en Estados Unidos. Entonces, un problema típico es asegurarse de que todos los 24 neumáticos estén bien. Por supuesto, existe una tecnología probada en el tiempo: la presión y la temperatura se pueden monitorear, y los cambios drásticos indicarían que algo salió mal. Por supuesto, toda esta tecnología es patentada, patentada, con todas las implicaciones. (Recuerde: ¡se supone que las patentes promueven la innovación!) Por lo tanto, esta empresa finlandesa quería detectar el estado de los neumáticos por ... sonido. La idea era instalar micrófonos para escuchar el sonido proveniente de todos los neumáticos y hacer algún tipo de magia de procesamiento de señal en esos sonidos para ver si uno de los neumáticos tenía algún tipo de problema, y ​​estaba haciendo un prototipo de esta locura (Incluso tenían un laboratorio dedicado para grabar sonidos de muestra; una vez que me enviaron un impresionante video de una ocasión en particular cuando lograron explotar un neumático de muestra después de someterlo a 5 o 10 toneladas de presión y calentarlo a una temperatura ridícula .) Claramente, una vez más, no había una razón racional particular para este desarrollo, excepto que fue divertido y algunas personas querían ganar dinero. Así que también comprenda que hay muchas razones por las cuales alguien comenzaría a desarrollar un nuevo lenguaje de programación. No hay necesidad ni posibilidad de aprenderlos todos. (Incluso tenían un laboratorio dedicado para grabar sonidos de muestra; una vez que me enviaron un impresionante video de una ocasión en particular cuando lograron explotar un neumático de muestra después de someterlo a 5 o 10 toneladas de presión y calentarlo a una temperatura ridícula .) Claramente, una vez más, no había una razón racional particular para este desarrollo, excepto que fue divertido y algunas personas querían ganar dinero. Así que también comprenda que hay muchas razones por las cuales alguien comenzaría a desarrollar un nuevo lenguaje de programación. No hay necesidad ni posibilidad de aprenderlos todos. (Incluso tenían un laboratorio dedicado para grabar sonidos de muestra; una vez que me enviaron un impresionante video de una ocasión en particular cuando lograron explotar un neumático de muestra después de someterlo a 5 o 10 toneladas de presión y calentarlo a una temperatura ridícula .) Claramente, una vez más, no había una razón racional particular para este desarrollo, excepto que fue divertido y algunas personas querían ganar dinero. Así que también comprenda que hay muchas razones por las cuales alguien comenzaría a desarrollar un nuevo lenguaje de programación. No hay necesidad ni posibilidad de aprenderlos todos. una vez que me enviaron un impresionante video de una ocasión en particular cuando lograron explotar un neumático de muestra después de someterlo a 5 o 10 toneladas de presión y calentarlo a una temperatura ridícula.) Claramente, una vez más, no hubo un racional particular razón de este desarrollo, excepto que fue divertido y algunas personas querían ganar dinero. Así que también comprenda que hay muchas razones por las cuales alguien comenzaría a desarrollar un nuevo lenguaje de programación. No hay necesidad ni posibilidad de aprenderlos todos. una vez que me enviaron un impresionante video de una ocasión en particular cuando lograron explotar un neumático de muestra después de someterlo a 5 o 10 toneladas de presión y calentarlo a una temperatura ridícula.) Claramente, una vez más, no hubo un racional particular razón de este desarrollo, excepto que fue divertido y algunas personas querían ganar dinero. Así que también comprenda que hay muchas razones por las cuales alguien comenzaría a desarrollar un nuevo lenguaje de programación. No hay necesidad ni posibilidad de aprenderlos todos.

Por supuesto, todo esto solo se aplica si crees en la evolución. Si crees en alguna forma de diseño inteligente, que Dios también ha creado todos los lenguajes de programación, entonces tendrías que encontrar un propósito detrás de esta multitud. Quizás Dios quería promover la competencia entre diferentes lenguajes de programación para que el arte del desarrollo de software alcanzara su estado más alto posible.

En conclusión, hay muchas personas, muchos países, muchos lenguajes de programación. ¡Esto es solo la naturaleza de la vida! Seamos agradecidos por eso: esto solo significa que el campo de la programación / informática está muy vivo y floreciente.


fuente
respuesta perfecta, no sé por qué no fue aceptado.
Am_I_Helpful
8

¿Por qué hay tantos lenguajes de programación diferentes?

Porque hay que tomar decisiones:

  • Modo de especificación: Imperativo vs. funcional
  • Mecanografía: Mecanografiado estáticamente frente a mecanografiado dinámicamente
  • Orden de evaluación: llamada por valor vs. llamada por nombre
  • Modularidad: basada en clases frente a tipo de datos abstractos
  • Modelo de ejecución: secuencial versus concurrente

Afortunadamente, las dos últimas son dicotomías no esenciales, es decir, uno podría poner ambas opciones en un solo lenguaje de programación. Pero, las tres primeras dicotomías dan lugar a 8 combinaciones. Entonces, incluso en un mundo ideal, habría al menos 8 lenguajes de programación. Cuando profundice, habrá más opciones de diseño con matices dentro de paradigmas particulares. Por ejemplo, si uno decide hacer un lenguaje tipado estáticamente basado en clases, hay diferentes formas de diseñar el sistema de tipos. Todavía no hay una forma canónica de hacerlo. Si uno decide hacer un lenguaje de programación concurrente, hay varias formas de representar la concurrencia: semáforos, regiones críticas condicionales, monitores, transmisión de mensajes (síncrono vs. asíncrono). Dentro del mensaje sincrónico que pasa,

Parte de la investigación que hacemos en la teoría del lenguaje de programación está dedicada a resolver estas dicotomías. Por ejemplo, trabajé para resolver la dicotomía entre la programación imperativa y funcional en un documento llamado " Asignaciones para lenguajes aplicativos " y nuestro método ahora ha sido adoptado por Haskell, convirtiéndolo en un lenguaje funcional e imperativo. Eso no significa que la dicotomía esté completamente resuelta. Un programador de Haskell todavía se enfrenta a la elección de resolver su problema funcional o imperativamente. Luca Cardelli trabajó en la resolución de la dicotomía de escritura estática vs. dinámica. Paul Levy trabajó en la resolución de la dicotomía llamada por valor vs. llamada por nombre . No todos estos resultados aún se han implementado en lenguajes de programación de la vida real.


Si todos estos idiomas pueden hacer lo mismo, ¿por qué no limitarse a un solo idioma y usarlo para programar computadoras?

Porque para un programador en el mundo real, no es suficiente hacer algo. También importa cómo se hace. Cuando se hace correctamente, el dominio del problema se representa fielmente en el programa, se conserva la modularidad del problema y los programas se vuelven fáciles de entender, modificar y mantener. Todas estas cosas afectan el costo del desarrollo y mantenimiento del programa. También afectan la confiabilidad y seguridad del software.

Por ejemplo, muchas personas usan un programa llamado " Quicken " para cuentas financieras. El programa original se desarrolló en alguna versión interna de Visual Basic, y fue bastante bueno. Sin embargo, ha sido difícil extenderlo y mantenerlo. A lo largo de los años, a medida que la compañía intentó ampliarlo para nuevas funciones, el programa se volvió cada vez más problemático con millones de clientes insatisfechos en todas partes. Probablemente se beneficiarán de la reingeniería del software en un lenguaje de programación orientado a objetos fuertemente tipado.


En particular, ¿hay alguna razón por la que deba conocer un lenguaje funcional como programador de computadoras?

Históricamente, Godel, Kleene e Church inventaron la "programación funcional" siguiendo la práctica matemática estándar, y Turing inventó la "programación imperativa" para precisar la noción de computación mecánica. Antes de Turing, no hay evidencia de que las matemáticas hayan analizado ideas de programación imperativas. (Si bien todos los algoritmos matemáticos tradicionales se expresaron en un "estilo imperativo", su contenido esencial seguía siendo funcional). Por lo tanto, la programación imperativa es muy nueva para la civilización humana, y sus matemáticas aún no se comprenden muy bien. La razón número 1 por la que todos deberían conocer algo de programación funcional es entender cómo la programación puede ser matemática. (No estoy admitiendo que la programación imperativa no sea matemática, que es lo que los programadores funcionales te harían creer. Pero estaría de acuerdo en que, con el estado actual del arte, todavía no sabemos cómo hacer matemáticamente una programación imperativa. Muchos de nosotros estamos trabajando precisamente en ese problema).

Uday Reddy
fuente
1

Puedes verlo como evolución.

Al principio, las computadoras se programaban puramente con códigos binarios. Después de eso se introdujeron los mnemotécnicos y se introdujeron los lenguajes de ensamblaje, que dependen principalmente de la CPU utilizada.

Después de que se introdujeron los lenguajes de nivel superior (nivel 3) (Pascal, C, ADA, Cobol), algunos muy genéricos (como C), algunos más adecuados para el manejo de datos (Cobol), algunos para cálculos (Fortran).

Después de eso surgieron los idiomas de cuarto nivel, como los lenguajes lógicos (como Prolog). Los idiomas más genéricos son sucesores de idiomas de tercer nivel; algunos de ellos son Java, C #.

También vemos lenguajes específicos para internet / web, como ASP.NET, PHP.

Y lenguajes para un dominio específico (DSL), que en su mayoría funcionan junto con un lenguaje genérico.

Luego hay idiomas para que los niños aprendan programación, como LOGO.

También idiomas para escribir código rápidamente, como Python, Ruby, etc., idiomas para manejar XML (XSLT).

Y probablemente haya olvidado muchos idiomas e incluso categorías de idiomas.

Michel Keijzers
fuente
1
Tu cronología es confusa. Prolog es de 1972, que es más joven que Ada (1983). No sé qué quieres decir con "sucesores de idiomas de tercer nivel"; pocos idiomas no son descendientes de Fortran, incluidos C y Pascal (que engendró a Ada).
prosfilaes
1
@prosfilaes, muy confundido. FORTRAN fue el primer idioma todavía en uso, luego vino LISP, luego COBOL. Algol se definió para la publicación de algoritmos, no para el uso de máquinas (pero los compiladores de algún tipo llegaron a ser de todos modos), con ofshots Pascal y más tarde C. PL / 1 era una extraña mezcla de FORTRAN y COBOL con estructuras de control Algol-ish.
vonbrand
1

otras respuestas son buenas, agregarán algunos ángulos nuevos. ¡Mientras DC escribe, los lenguajes evolucionan como los lenguajes humanos reales! y toman prestados conceptos y sintaxis el uno del otro nuevamente como lenguajes humanos reales. en otras palabras, también hay un estudio bastante real de la etimología de los lenguajes de computadora.

Esto también significa que ha habido una larga historia y una línea de tiempo que comenzó principalmente alrededor de la década de 1930 con el cálculo lambda .

Existe una fuerte interacción / sinergia / simbiosis entre la teoría y la aplicación con lenguajes de programación. Se inventan nuevas aplicaciones que conducen a nuevas teorías y viceversa. Un lenguaje de programación es, en muchos sentidos, un puente entre la teoría y la aplicación .

Un interesante caso de estudio de la historia es Fortran. no se conoce bien, pero las versiones anteriores de Fortran (principalmente antes de Fortran77) tenían una gramática ambigua . esto significa que el compilador podría legítimamente "interpretar" / compilar legítimamente el compilador de diferentes maneras porque había múltiples "interpretaciones" válidas (este no es el mismo sentido técnico de los lenguajes "interpretados").

así que la teoría sobre las gramáticas formales se estaba desarrollando alrededor de la época en que se inventó Fortran, y fue una pequeña crisis cuando se descubrió el problema de la ambigüedad del lenguaje. La sintaxis de Fortan se reformuló para evitar esta ambigüedad y los lenguajes posteriores tuvieron más sensibilidad a la ambigüedad gramatical en su diseño. OOP es también un ejemplo muy importante / principal de un concepto / avance teórico en lenguajes de programación que "impacta" u "ondula" en muchos lenguajes existentes, transformándolos.

Otros estudios de caso son la invención de nuevas tecnologías. por ejemplo, la invención de la base de datos relacional ha tenido un gran impacto en los lenguajes de computadora, por ejemplo, con SQL e interfaces de lenguaje de computadora (por ejemplo, en Java, "JDBC"). asimismo, la red mundial con un impacto aún más masivo. Parecía haber una explosión de idiomas programada alrededor del boom de las puntocom que coincidió en gran medida con el crecimiento temprano de la WWW y podría compararse con explosiones evolutivas .

También parece haber una larga tendencia al alza en los nuevos lenguajes de programación junto con el enorme poder de procesamiento exponencialmente creciente de la ley Moores, que algunos piensan que puede estar disminuyendo.

Las tendencias actuales de larga data en los lenguajes de programación parecen estar orientadas hacia Big Data y Paralelización, por ejemplo, con MapReduce . También existe un interés actual en los cierres .

Otro aspecto clave de los lenguajes es que representan niveles crecientes de abstracción . se basan en abstracciones de nivel inferior para crear abstracciones de nivel superior (similar a una pirámide). de esta manera, el progreso de la evolución del lenguaje informático es probablemente interminable y podemos estar relativamente seguros de que se seguirán inventando nuevos e importantes en el futuro. Esto es probablemente análogo a un concepto similar en psicología llamado fragmentación : dicho de manera general, construir conceptos mentales de nivel superior a partir de bloques de construcción de nivel inferior.

¡cualquiera que haya estudiado muchos lenguajes de computadora debe admitir que se puede observar una mentalidad de rebaño por la cual algunos aspectos de ellos resultan ser modas sobrevaloradas, es decir, no tan críticas como se recomienda, o incluso desaparecer (en uso) con el tiempo! algunas de las ideas / cambios centrales permanecen pero la (sobre) exageración se desvanece. en este sentido, los lenguajes de programación también están de moda . En mi opinión, dos casos de la última mitad de la década que son realmente útiles pero fueron sobrevalorados:

cada vez más , se puede observar una auto-similitud en muchos idiomas principales, de modo que todos tienden a converger hacia la implementación de muchas características similares a su manera, es decir, como en los cuadros de comparación de productos que "marcan" muchas características en una cuadrícula.

vzn
fuente
vea también patrones de diseño que a menudo cruzan idiomas y se implementan en idiomas. Otro aspecto clave del estudio / funcionalidad del lenguaje son las características implementadas en las bibliotecas
vzn
FORTRAN nunca tuvo una descripción formal, mucho menos la complejidad de la expresión que podría conducir a ambigüedades gramaticales (sí, comencé a programar en una abominación llamada PDQ FORTRAN, y más tarde FORTRAN IV) el lenguaje en el que la ambigüedad (muy vergonzosa) en el La gramática salió a la luz tiene Algol, el primer idioma definido con una gramática.
vonbrand
punto tomado wrt original / principios de FORTRAN pero las versiones posteriores se formalizaron con definiciones gramaticales más rigurosas. Es un estudio de caso que muestra la evolución de un lenguaje junto con la teoría del lenguaje.
vzn
FORTRAN recibió una gramática forzada, pero nunca fue diseñada en torno a una. Algol comenzó esa tendencia, que fue continuada por Pascal, la familia Modula, Oberon, C y su origen, PL / 1, Ada y demás. Dada la tecnología de gramática libre de contexto y la comprensión del análisis, hoy en día definir una gramática y traducirlo en un analizador libre de errores es casi trivial, ningún lenguaje más nuevo lo hace.
vonbrand
Anexo, estudio de caso en idiomas nuevos / emergentes: Google go , node.js , Apple swift
vzn
-3

No lo eran, es solo un truco de marketing: si haces que el lenguaje se parezca un poco a "C", eso reduce la barrera aparente de entrada.

Algunos que no tienen influencia de C: SQL, Pascal, Delphi, FORTRAN, COBOL, Ada, PowerBuilder, HyperTalk, Lisp, Simula, FOCAL, BASIC, PL / I, Algol, Algol-68, SNOBOL, Modula, Visual BASIC, Tutor, logotipo, Forth, DIBOL, Helix, AppleScript, Python, Erlang, Ruby, Pick, inglés, RPG, PL / SQL, ASP, Prolog, SmallTalk, Perl, bash, Wand BASIC, REXX, lenguaje por lotes DOS.

Los que se parecen un poco a C, pero tienen muy poco en común: JavaScript, Java, C #, (posiblemente) Objective-C.

Todo es marketing, Java, C ++ y JavaScript se parece un poco a C, pero difícilmente podría ser más diferente bajo las cubiertas.

charan choudhary
fuente
55
"No eran", ¿qué no eran qué? En cualquier caso, no veo cómo esto responde la pregunta. Es simplemente una lista de idiomas, junto con una afirmación completamente infundada de que el marketing está involucrado de alguna manera.
David Richerby
2
"Algunos que no tienen influencia de C en absoluto: ... Algol, Algol-68, ..." - Es curioso que digas eso, dado que C surgió de Algol. "Si hace que el lenguaje se parezca más o menos a" C ", entonces eso reduce la barrera aparente de entrada" - iirc, esto se ha demostrado que está equivocado. Los estudiantes sin exposición previa a la programación aprenden más rápido con otros idiomas (creo que usaron Haskell en ese estudio).
Raphael