¿Cómo las personas que conocen 5 o más lenguajes de programación recuerdan la sintaxis y la semántica de todos esos lenguajes diferentes?

Me considero fluido en C, C ++ (es decir, C con STL), Java, Python, PHP y JavaScript. La advertencia de todo esto es que todos están más o menos basados ​​en C (PHP es el más extraño, ya que es un matrimonio concertado entre PERL y C), por lo que gran parte de la sintaxis básica y la semántica son en realidad bastante similar, como Ira mencionó en su respuesta.

Para mí, el paradigma siempre ha sido la práctica: cuanto más codifico en un idioma, más recuerdo cómo usarlo (siendo Java la única excepción, llegaré a eso en un momento). Después de trabajar en un idioma por algún tiempo, desarrollo una especie de mentalidad cuando trabajo en ese idioma, de modo que cuando cambio de idioma, solo tengo que cambiar mi mentalidad. Adquirí más o menos esta técnica como resultado de tener que comunicarme entre programas escritos en varios idiomas (por ejemplo, JavaScript enviando consultas AJAX a un backend PHP, que llama a un programa C para consolidar algunos datos, y Python para analizar eso en algo más significativo). ), así que definitivamente hubo momentos en los que cambié de idioma con mucha frecuencia.

Además, cada lenguaje tiene su propia API, desde decente (PHP) a excelente (Python) e increíblemente detallado (Java): C está en algún lugar entre PHP y Python, C ++ está en algún lugar entre Python y Java. También puedes encontrar trucos y técnicas de forma externa para cada idioma cuando te topas con una pared figurativa.

En algún momento, usted desarrolla su propio estilo en cada uno de estos idiomas y, eventualmente, incluso su propia biblioteca (probablemente informal) de funciones, subrutinas, objetos y trucos que usa una y otra vez. Por ejemplo, mi código PHP a menudo hace uso de la función prt (), que creé para eliminar caracteres de espacios en blanco extraños en el HTML de salida.

Finalmente, con respecto a la semántica específicamente: cuando aprendes un idioma, aprendes más o menos la idea básica detrás de ese lenguaje, y se te enseña a seguir su semántica muy de cerca (ya sea en un curso real o emulando un código de ejemplo). Después de un tiempo, este tipo de desvanecimiento desaparece, y te quedan las ideas centrales para esas semánticas, que son mucho más fáciles de recordar que la semántica en sí. Es como memorizar una fórmula (por ejemplo, la fórmula cuadrática) en lugar de memorizar todos los valores que satisfacen esa fórmula (por ejemplo, todas las raíces de un polinomio cuadrático).


Anteriormente, mencioné que Java era una excepción, y he aquí por qué (es algo raro): en la escuela secundaria, nuestro lenguaje de programación introductorio era Java (era mi segundo idioma después de JavaScript), pero después de mi primer año, nunca utilicé Java. , y en su lugar usó C, PHP y JavaScript (los dos últimos por razones bastante obvias). Sin embargo, aún competíamos en algunas competiciones de CS que requerían el uso de Java, por lo que a fines de febrero / principios de marzo, los que íbamos a estas competiciones nos juntaríamos y pasaríamos aproximadamente una semana para revisar Java. Esto me llevó a olvidar un montón de Java después de no usarlo por un tiempo, pero también poder recogerlo muy rápido después; Es probable que esto también sea cierto para otros idiomas, pero realmente no he descartado ningún idioma durante 9 meses más que en Java.

La semántica es más fácil (especialmente para los lenguajes diseñados desde el principio con una semántica formal en mente (SML, Twelf), o aquellos donde una semántica está fuertemente implícita (O’Caml, Haskell, Racket) o aquellos donde alguien escribió una semántica formal por correo -hoc (Featherweight Java, Peter Sewell et al. trabajan en el modelo de memoria C ++)). Idiomas que son … ejem … especiales (M4, Perl, bash) Siempre termino mirando los documentos o ejemplos. Para los idiomas con muchas interacciones de características de mayúsculas y minúsculas (C ++), hay un tiempo de inicio de unos pocos días a una semana antes de que todo vuelva a mí si no lo he tocado en un tiempo, pero en general puedo seguir adelante. relativamente rapido

La sintaxis es más difícil, especialmente cuando se cambia entre lenguajes estrechamente relacionados. La memoria muscular tarda un poco en volver a entrenar. (O’Caml – Haskell es complicado. SML – O’Caml mucho más: mi pesadilla es en vivo: traducir algo que acabo de leer en línea de un idioma a otro en una pizarra. El resultado es casi seguro que está malformado sintácticamente en Ambos idiomas.)

Las bibliotecas son el tercer componente. En su mayor parte, recuerdo el tipo de cosas (es decir, muy ampliamente) que las bibliotecas estándar preferidas de un idioma proporcionan y luego google los detalles si los necesito. Por lo general, toma una semana de uso exclusivo o más tiempo si cambio de idioma estrechamente relacionado antes de que ya no tenga que buscar cosas estúpidas. Los detalles de cosas oscuras que realmente nunca retengo a largo plazo: no parece dar resultados.

Finalmente los modismos. Esto toma para siempre, comparativamente. El primer mes de regreso a Java después de Haskell es increíblemente frustrante: si sigo la corriente y no me vigilo, construyo cosas por encapsulación en lugar de subtitular, por ejemplo. Es un desastre.

(Otro ejemplo divertido de modismos: cuando cambié de Haskell a Racket para un proyecto, pasé la mitad del día construyendo una mónada de estado puramente funcional (con macros de “do-notation”) porque trabajar con el estado mutable nativo me parecía mal , aunque una parte perfectamente natural de Racket. Pero sentí que cualquier cosa que escribiera con estado mutable estaba garantizada para que se convirtiera en una pesadilla sin fin de compartir involuntariamente y tener efectos secundarios que goteaban (esto, por supuesto, no sucede tan a menudo como uno esperaría porque es persistente las estructuras de datos y el viaje en el tiempo son raros en un lenguaje imperativo como Racket) Deseché todo una vez que estuve en funcionamiento, obviamente.)

Conozco cuatro idiomas y podría encontrar mi camino alrededor del quinto. No hay ningún punto que abarrote un montón de sintaxis en tu cabeza. La mayoría de los lenguajes de programación son similares en términos de flujo. Lo que quiero decir con flujo es simplemente un algoritmo para resolver problemas. La forma en que resolvería un problema en python es similar a la manera en que resolvería ese mismo problema en Ruby. Lo único que difiere es la sintaxis que siempre puedo encontrar con Google.

Entender sus paradigmas también ayuda mucho. Sé que Java es OOP puro, aunque afirma haber incluido la programación funcional en la versión 8. Oh, sé Python, PHP, JavaScript son imprescindibles y sé que C es imperativo pero también un monstruo. La mayoría de todos estos idiomas hacen lo mismo con una sintaxis diferente. Los lenguajes funcionales como Haskell o Clojure tendrían una sintaxis totalmente diferente y diferentes formas de resolver los ptonlems en comparación con los mencionados anteriormente.

No hay necesidad de abarrotar sintaxis, si practicas y utilizas los idiomas muy bien, se mantendrán y cuando olvidas una o dos cosas, Google siempre está ahí.

La respuesta para mí es que estos idiomas son en su mayoría los mismos.

Vienen en un número modesto de paradigmas (procedimental, oop, funcional, lógica, restricción, …) y cada idioma en un paradigma tiende a tener los mismos conceptos básicos (cada lenguaje oop tiene clases, herencia, métodos y sobrecarga).

Una vez que tiene un control general, generalmente se queda atascado en la sintaxis y las características oscuras, y para eso tiene manuales de referencia.

Para obtener más detalles sobre qué idiomas tienen en común, vea la respuesta de mi Programador a una pregunta relacionada, StackExchange: ¿Son todos los idiomas básicamente iguales?

Cuando nos fijamos únicamente en la sintaxis y la semántica, los lenguajes de programación imitan a los lenguajes humanos en que son simplemente una forma de comunicarse.

Al igual que recuerda la sintaxis y la semántica de varios idiomas.

Ayuda que la semántica de varios idiomas dentro del mismo paradigma sea similar; así que uno tendría que recordar la semántica específica del paradigma. La sintaxis sigue casi trivialmente: uno tendría que buscar una guía o una hoja de trucos o Internet n veces, y la vez más la primera vez, casi recordaría las cosas básicas.

Sería bueno recordar que la vida real no es una prueba de libro cerrado, y existe una técnica simple que la gente usa y que la universidad no le enseña tradicionalmente: se conoce como RTFM | Wikiwand.

Todas las buenas respuestas. No puedo recordar la sintaxis y traigo la semántica de varios idiomas a los demás.

Funciones abstractas de complejidad.
Las clases son una forma de organizar un conjunto de funciones.

Debido a que tengo que buscar casi todas las líneas de código para la sintaxis, tiendo a escribir bibliotecas donde nunca vuelvo a ver el código. Intento hacer que las bibliotecas sean legibles, incluso para personas no técnicas. Para mi beneficio, porque leo cuál es el propósito, pero también para cualquiera que necesite revisar mi código.

Bueno, no lo sabemos. Lo bueno de ser programador es que una vez que conoces un idioma, prácticamente puedes adivinar la sintaxis y la semántica de otros (como cuando aprendes idiomas naturales). En cualquier caso, hay muchos libros o sitios web de referencia para programadores con los que siempre puede consultar.

Para mí, mucha práctica es lo que me ayudó a retener mi conocimiento de los detalles de sintaxis. Dividir los idiomas en algunas categorías ayuda, por ejemplo, los lenguajes de programación funcionales no siempre requieren especificar el tipo de las variables. Muchos lenguajes también tienen una sintaxis similar (java PHP, c / C ++ / object-c, JavaScript / python), por lo que generalmente es más fácil mantenerlo organizado mentalmente. En su mayor parte, tener un buen editor ayuda mucho. Solo desearía que hubiera una mejor manera de organizar mentalmente las funciones en varios idiomas, a veces aún mezclo funciones en JavaScript y PHP y generalmente hago una búsqueda rápida en la web para asegurarme de tener la firma del método correcto.

Solo para agregar a todas las buenas respuestas –

Mucho depende de la frecuencia con la que lo uses.

Escribo C ++ diariamente durante algunos años, paré completamente durante un año el año pasado y comencé a usarlo nuevamente. Me sorprendió que casi no hubiera óxido. Pude recogerlo a mi nivel original casi al instante.

Por otro lado, he aprendido Python 3 veces ahora. Cada vez que lo aprendía, lo usaba por unas horas y me detenía. Unos meses más tarde, cuando necesito volver a usarlo, tendría que aprenderlo de nuevo y no recordar nada de antes.

Encuentro que cuando empiezo a olvidar un idioma, la biblioteca estándar siempre es la primera en irse. Por ejemplo, utilicé Java durante aproximadamente 2 años, 10 años atrás, y ahora, aunque todavía recuerdo mucha sintaxis, no recuerdo casi nada sobre la biblioteca estándar (en C ++ tengo una gran parte de la biblioteca estándar memorizada – No intencionalmente, solo por el uso repetido).

La semántica es mucho más fácil de retener si los ha comprendido y usado varias veces.
Recordar la sintaxis no es tan fácil. Me he dado cuenta de que recuerdo las diferencias de sintaxis siempre y cuando continúe usando todos los idiomas con regularidad. Una interrupción en la codificación diaria es suficiente para desordenar todo en la mente.

Estoy bastante seguro de que es solo un reconocimiento de patrones. Cuando cambio de idioma o sistema, los patrones que funcionan en ese idioma son los que se hacen evidentes sin mucho esfuerzo consciente de mi parte. Me imagino que es como ser fluido en un lenguaje natural. Al principio, parece desalentador recordar conjugaciones, tiempos verbales y expresiones idiomáticas; pero después de un tiempo, el cerebro aprende a limitar sus elecciones a aquellas que tienen sentido. Como si un teclado de piano tuviera 88 teclas, pero cuando aplicas una escala, solo presionas las teclas que pertenecen a esa escala.