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?
fuente
Respuestas:
Los conceptos básicos de la mayoría de los lenguajes de procedimiento son más o menos los mismos.
Ellos ofrecen:
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
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:
Hay dos estilos de representación principales para los idiomas:
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:
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.
fuente
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.
fuente
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.
fuente
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.
fuente
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 ).
fuente
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.
fuente
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.
fuente