¿Son todos los idiomas básicamente iguales?

39

Recientemente, tuve que entender el diseño de un pequeño programa escrito en un idioma que no tenía idea ( ABAP , si debe saberlo). Podría resolverlo sin demasiada dificultad.

Me doy cuenta de que dominar un nuevo idioma es un juego de pelota completamente diferente, pero entender simplemente la intención del código (específicamente el código estándar de producción, que no es necesariamente complejo) en cualquier idioma es sencillo, si ya sabes un par de idiomas (preferiblemente uno de procedimiento / OO y uno funcional).

¿Es esto generalmente cierto? ¿Todos los lenguajes de programación están formados por construcciones similares como bucles, sentencias condicionales y mensajes que pasan entre funciones? ¿Existen lenguajes no esotéricos que un programador típico de Java / Ruby / Haskell no podría entender? ¿Todos los idiomas tienen un origen común?

Anirudh
fuente
44
Te dirigiré a Batir los promedios de Paul Graham. Es posible que desee o no leer todo el contenido, pero para la parte relevante busque el encabezado "The Blub Paradox". Al Sr. Graham no le molesta poner anclas en su muro de texto, así que no puedo vincularlo directamente.
kwatford el
44
Las lenguas no tienen un origen común. Pero todos los idiomas intentan resolver algún problema. Creo que es algo análogo al lenguaje hablado. El propósito es expresarse. No puedo decir que sea sencillo entender idiomas basados ​​en el conocimiento de 1 procedimiento / OO / funcional. No he hecho esto, pero si tuviera que hacer esta pregunta, miraría perl o lisp con muchos corchetes y no podría decir que conocer 1 idioma de todo tipo es suficiente.
shahkalpesh
1
En ese caso: cálculo Lambda. Quizás no sea un lenguaje 'real', pero es la madre de todos los lenguajes de programación en cierto sentido. Una vez tuve que implementar un lenguaje funcional tal que se compilara en expresiones lambda (que luego se interpretaron directamente). Los resultados fueron (para mí, al menos) ilegibles a pesar de preservar todos los identificadores relevantes. Funciones especialmente recursivas utilizando el combinador en Y. La única forma práctica de descubrir qué hicieron algunas de las expresiones de muestra fue evaluarlas manualmente. Cosas simples como el fibonnaci y el tipo de fusión eran ilegibles.
kwatford el
2
Si conoce idiomas funcionales, debe saber que los bucles no son posibles en todos los idiomas.
jalf
Piet es bastante diferente. :)

Respuestas:

88

Los conceptos básicos de la mayoría de los lenguajes de procedimiento son más o menos los mismos.

Ellos ofrecen:

  • Tipos de datos escalares: generalmente booleanos, enteros, flotantes y caracteres.
  • Tipos de datos compuestos: matrices (las cadenas son casos especiales) y estructuras
  • Construcciones de código básico: aritmética sobre escalares, acceso a matriz / estructura, asignaciones
  • Estructuras de control simples: if-then, if-then-else, while, for loops
  • Paquetes de bloques de código: funciones, procedimientos con parámetros.
  • Ámbitos: áreas en las que los identificadores tienen significados específicos

Si entiendes esto, tienes una buena comprensión del 90% de los idiomas del planeta. Lo que hace que estos idiomas sean un poco más difíciles de entender es la increíble variedad de sintaxis extraña que la gente usa para decir las mismas cosas básicas. Algunos usan notación concisa que implica puntuacion impar (APL es un extremo). Algunos usan muchas palabras clave (COBOL es un excelente representante). Eso no importa mucho. Lo que importa es si el lenguaje es lo suficientemente completo por sí solo para realizar tareas complejas sin causar que te arranques el pelo. (Intente codificar algún hackeo de cadenas serio en el script de shell de Windows DOS: es capaz de Turing pero realmente malo en todo).

Oferta de lenguajes de procedimiento más interesantes

  • Ámbitos anidados o léxicos, espacios de nombres
  • Punteros que permiten que una entidad se refiera a otra, con asignación dinámica de almacenamiento
  • Empaquetado de código relacionado: paquetes, objetos con métodos, rasgos
  • Control más sofisticado: recursividad, continuaciones, cierres.
  • Operadores especializados: operaciones de cadenas y matrices, funciones matemáticas

Aunque técnicamente no es una propiedad del idioma, sino una propiedad del ecosistema en el que viven dichos idiomas, son las bibliotecas a las que se puede acceder fácilmente o que se proporcionan con el idioma como parte de la herramienta de desarrollo. Tener una amplia gama de servicios de biblioteca simplifica / acelera las aplicaciones de escritura simplemente porque uno no tiene que reinventar lo que hacen las bibliotecas. Si bien se cree que Java y C # son buenos lenguajes en sí mismos, lo que los hace realmente útiles son las enormes bibliotecas que vienen con ellos y las bibliotecas de extensiones fácilmente obtenibles.

Los lenguajes que son más difíciles de entender son los no procesales:

  • Lenguajes puramente funcionales, sin asignaciones ni efectos secundarios.
  • Lenguajes lógicos, como Prolog, en el que se produce la computación simbólica y la unificación.
  • Lenguajes de coincidencia de patrones, en los que especifica formas que coinciden con el problema y, a menudo, las acciones se desencadenan por una coincidencia
  • Lenguajes de restricción, que le permiten especificar relaciones y resolver ecuaciones automáticamente
  • Lenguajes de descripción de hardware, en los que todo se ejecuta en paralelo
  • Lenguajes específicos de dominio, como SQL, Redes de Petri de colores, etc.

Hay dos estilos de representación principales para los idiomas:

  • Basado en texto, en el que los identificadores nombran entidades y flujos de información están codificados implícitamente en fórmulas que usan los identificadores para nombrar las entidades (Java, APL, ...)
  • Gráfica, en la que las entidades se dibujan como nodos, y las relaciones entre entidades se dibujan como arcos explícitos entre esos nodos (UML, Simulink, LabView)

Los lenguajes gráficos a menudo permiten sublenguajes textuales como anotaciones en nodos y en arcos. Los lenguajes gráficos más extraños permiten recursivamente gráficos (con texto :) en nodos y en arcos. Los lenguajes gráficos realmente extraños permiten que los gráficos de anotación apunten a gráficos anotados.

La mayoría de estos lenguajes se basan en un número muy pequeño de modelos de computación:

  • El cálculo lambda (base para Lisp y todos los lenguajes funcionales)
  • Sistemas de correos (o técnicas de reescritura de cadenas / árboles / gráficos)
  • Máquinas de Turing (modificación de estado y selección de nuevas celdas de memoria)

Dado que la mayoría de la industria se enfoca en los lenguajes de procedimiento y las estructuras de control complejas, está bien servido si aprende bien uno de los lenguajes más interesantes en esta categoría, especialmente si incluye algún tipo de orientación a objetos.

Recomiendo encarecidamente aprender Scheme, en particular de un libro realmente maravilloso: Estructura e interpretación de programas de computadora . Esto describe todos estos conceptos básicos. Si conoce estas cosas, otros idiomas parecerán bastante sencillos, excepto la sintaxis tonta.

Ira Baxter
fuente
3
¡Gran respuesta! Como seguimiento (¿hay alguna forma de hacer una pregunta de seguimiento en SO?), ¿Hay algún idioma que pueda dominar y afirmar que comprende todos los conceptos en el software de programación? ¿Sería Lisp (o un dialecto como Scheme)?
@ Anirudh: No existe un mecanismo formal de seguimiento, pero podría abrir una nueva pregunta. Si contiene una justificación y un enlace a esta pregunta, es posible que ni siquiera se cierre. ;) Para responder a su seguimiento, creo sinceramente que no hay un solo idioma, ya que los paradigmas son demasiado diferentes.
@Anirudh: De acuerdo con John Y, no hay solo uno. Pero si usted es relativamente nuevo en el campo, debe gastar una energía considerable para dominar el paradigma de procedimiento (considero que OO es solo una especialización). No estaría de más mirar otros paradigmas (lógica, restricción, flujo de datos) para tener una idea de cómo funcionan, pero para la mayoría del trabajo industrial del día a día, los lenguajes de procedimiento son prácticamente el rey.
Ira Baxter
1
Al igual que con los idiomas naturales, "más difícil de entender" es subjetivo y depende del primer idioma que aprenda.
NullUserException
1
@NullUserException: esto sugiere que debe elegir su primer idioma con cuidado, para maximizar la facilidad de comprensión de los demás. Ese es el punto de Scheme, y en particular el libro SICP.
Ira Baxter
6

Los lenguajes de descripción de hardware son lenguajes de programación, pero conceptualmente son muy diferentes. Pruebe VHDL o Verilog para el tamaño. Son comunes para la programación de FPGA. (Ok, entonces no son procesadores, pero son dispositivos informáticos de uso general. Y esto debería considerarse hardware válido para temas de informática). Debe hacer explícitamente que las cosas ocurran en serie. Es un modelo completamente diferente. Has pensado en cosas que ocurren en paralelo como la regla, no la excepción. Para bucles en verilog, expanda en hardware paralelo. Por lo tanto, el comportamiento "esperado" podría no ser el esperado.

NoMoreZealots
fuente
Ese es un buen punto. Buscaré en Verilog / VHDL.
Siempre pensé que los lenguajes de programación convencionales eran formas realmente malas de codificar programas que eran naturalmente paralelos, como VHDL. Cuando comienzas como diseñador de hardware, esta parte de todo lo que ocurre de manera serial parece increíblemente torpe. (Estamos enseñando los idiomas de programación equivocados a las personas como su primer idioma: ¡debería ser Verilog!).
Ira Baxter
4

Depende de lo que quieras decir con "básicamente". Todos los idiomas de cualquier flexibilidad son completos de Turing. En ese sentido: sí, todos son básicamente lo mismo.

En un nivel bajo, todos realizan secuencias similares de operaciones y todas las cosas de Windows, Linux y (reciente) OS X se ejecutan en procesadores compatibles con Intel que usan los mismos conjuntos de instrucciones. De esa manera, también son básicamente lo mismo.

Me doy cuenta de que has definido "básicamente" en tu pregunta, pero para responderla realmente, esa definición tendrá que ser mucho más refinada. En muchos sentidos, todos son iguales. En muchos sentidos son distintos. Es demasiado fácil decir "depende". Si toma uno de los extremos, es probable que la pregunta no responda a lo que pretende, por lo que el lugar en el que se dibuja esa línea es crucial para responder a su pregunta tal como lo desea.

Dinah
fuente
3

Yo diría que un lenguaje codifica el significado. Si el significado tiene algún sentido en algún contexto, entonces todos los idiomas que podrían expresar el significado podrían decirse que son equivalentes limitados por el significado y el contexto.

Si limita ese contexto a una máquina estándar de Von Neumann, entonces se podría decir que el significado computacional de cambiar la memoria y la computación en una CPU es el origen, y posiblemente el único significado que todos los idiomas tienen en común. Todas las demás cosas son abstracciones construidas sobre estos.

Preet Sangha
fuente
1
John von Neumann. Y NO se pronuncia como "newman", más como "noyman".
Gracias por la corrección. Sin embargo, sí lo pronuncio.
Preet Sangha
Cuando alguien sugiere una corrección, puede editar su publicación para reflejarla.
Phil Miller
2

Los lenguajes de programación también son herramientas para pensar. Con otra perspectiva de pensamiento, algunos problemas desaparecen o se transforman en un tipo diferente y más manejable (por ejemplo, muchos patrones de diseño de estilo C ++ simplemente desaparecen cuando estás pensando en Lisp (ver, por ejemplo, esta presentación de Peter Norvik ), y Erlang te libera de pensar de alguna concurrencia de bajo nivel o construcciones de computación distribuida y le permite concentrarse en la lógica de la aplicación).

Sin embargo, tenga en cuenta que a veces los "nuevos" paradigmas se pueden aplicar parcialmente a los lenguajes de programación "más antiguos", lo que explica por qué, por ejemplo, tenemos libros que enseñan programación funcional para programadores Java . Pero el soporte e integración nativos de un paradigma más poderoso en el nivel del lenguaje permite una aplicación más natural del paradigma (y consecuentemente hace que sea imposible entender programas en un lenguaje que soporte un paradigma desconocido, como lo sugieren otras respuestas: @Ira Baxter enumera lenguajes no procesales y @kwatford refiriéndose a Paul Graham ).

FooF
fuente
2
+++++++[>+++++++++++<-]>+.<+++++++++++[>+++<-]>.>>+++++++[>++++++<-]>++++.

En el nivel más bajo, cada lenguaje de programación es el "mismo", pero eso no significa que sean iguales en el nivel en el que realmente interactúas. Resumen problemas para ti; eso no significa que resuman los mismos problemas o que resuman cada problema de la misma manera.

asthasr
fuente
1

Los idiomas maduros generalmente tienen algunos objetivos, y hacen compensaciones donde sacrifican una cosa por otra. Se puede usar un lenguaje de propósito general para cualquier cosa, pero ningún idioma puede sobresalir en todas las áreas. Algunos ejemplos:

C intenta ser un lenguaje de programación de sistemas ideal. Con este fin, sacrifica la legibilidad y la seguridad por el control y la velocidad de bajo nivel.

Python pretende ser un lenguaje de script ideal. Con este fin, sacrifica la velocidad y la verificabilidad por la productividad y la portabilidad.

Haskell intenta ser un lenguaje seguro, matemáticamente puro. Con este fin, sacrifica la capacidad de aprendizaje y la convención por la verificabilidad y la fiabilidad.

Estos sacrificios y beneficios hacen una gran diferencia en el idioma. Sí, la mayoría de los lenguajes de programación pueden usarse para cualquier cosa que pueda hacer una computadora, pero ninguno de esos mismos lenguajes debe usarse para todo. Todos los idiomas anteriores son los que elegiría para ciertas tareas, pero no para otras. Si estuviera programando un sistema operativo, elegiría C. Si estuviera escribiendo un backend para un sitio web, usaría Python. Y si estuviera escribiendo un sistema financiero, usaría Haskell.

Al final, su elección como programador es la herramienta adecuada para el trabajo.

Imaginista
fuente