Voy a enseñar a los estudiantes de pregrado un curso titulado Introducción a la programación de computadoras. Estoy un poco confundido En Física Computacional, los científicos usan C / C ++ o Python o Fortran, CUDA, etc. ... este es el momento de construir su base. ¿Qué debo usar? Sé que puedes aprender un nuevo lenguaje de programación en cualquier momento de tu vida, pero es una elección más sabia para mí elaborarlos todos los conceptos básicos de programación y los conceptos de OOP más adelante.
python
c++
computational-physics
languages
Afnan Bashir
fuente
fuente
Respuestas:
Primero, si sus estudiantes universitarios son como los nuestros y no tuvieron una introducción previa a las computadoras, esperen pasar algún tiempo enseñándoles cómo usar cosas básicas como usar un editor adecuado (es decir, no MS Word), la línea de comandos, etc.
Creo que la respuesta depende en cierta medida de dónde establezca el enfoque de su curso (o de lo que debe enseñar). Por ejemplo: ¿Cuán relevantes son los funcionamientos internos de la computadora? ¿Necesita clases y otras estructuras avanzadas de OOP? ¿Quieres enseñarles cómo producir programas eficientes o estás contento si producen programas de trabajo? Además, no olvide que probablemente necesitará tutores capaces.
Pero ahora estoy familiarizado con las ventajas y desventajas de los idiomas. Tenga en cuenta que esto se debe principalmente a mi experiencia como físico computacional y algo de esto puede depender del campo particular, grupo de trabajo, universidad, etc.
Pitón
En general, recomiendo usar Numpy desde casi el principio y supongo que se usará a continuación.
Ventajas:
print
Numpy'ssavetxt
yloadtxt
, y tal vezsys.argv
. Se puede introducir sobre la marcha y no consume mucho tiempo de programación.Desventajas
C / C ++
Ventajas:
Desventajas
Las principales ventajas de C ++ sobre C (clases, plantillas) no deberían ser relevantes para su curso y solo se están volviendo relevantes para proyectos más grandes. Por lo tanto, elegiría C de los dos, ya que es más conciso.
Otros
Algunos comentarios sobre los otros idiomas:
¹ Cuál es el flujo de trabajo estándar al menos en nuestro grupo.
fuente
En 2014, habría dicho Python. En 2017, creo sinceramente que el idioma para enseñar a los estudiantes universitarios es Julia.
La enseñanza siempre se trata de una compensación. Por un lado, desea elegir algo que sea lo suficientemente simple como para que sea fácil de entender. Pero en segundo lugar, desea enseñar algo que tenga poder de permanencia, es decir, algo que pueda crecer con usted. Los lenguajes dinámicos comunes (Python / MATLAB / R) caen fácilmente en la categoría 1 debido a su código repetitivo inexistente y la facilidad de abrir un intérprete y escupir código, mientras que C / C ++ / Fortran entran en la segunda categoría como Los idiomas con los que se escribió el software central de alto rendimiento del mundo de hoy.
Pero hay problemas con el uso de un lenguaje que no captura completamente la otra categoría. Cuando se usa un lenguaje como Python, abstrae muy bien cosas como los tipos y el desbordamiento de enteros. Esto es bueno para enseñar la computación del primer semestre, pero como quieres profundizar cada vez más en cómo funcionan realmente las cosas, el lenguaje de Python está demasiado alejado del metal subyacente como para ser una buena herramienta de enseñanza. Pero C / C ++ / Fortran (o Java ... aprendí Java primero ...) todos tienen un costo de inicio tan grande que lo más difícil de aprender es cómo configurar y
main
compilar los encabezados , lo que distrae de aprender realmente a programar .Entra Julia. Cuando usa Julia por primera vez, puede abstraer la idea completa de los tipos y usarla como MATLAB o Python. Pero como quieres aprender más, hay un "agujero de conejo" de profundidad en el idioma. Dado que es realmente una capa de abstracción basada en un sistema de tipos + despacho múltiple sobre LLVM, es esencialmente "una manera fácil de escribir código compilado estáticamente" (y las funciones de tipo estable pueden compilarse estáticamente). Lo que esto significa es que los detalles de C / C ++ también son accesibles. Puede aprender a escribir bucles y funciones simples sin código repetitivo, y luego profundizar en los punteros de función. Las funciones de metaprogramación de Julia le permiten acceder directamente al AST, y hay macros que muestran cada parte de la cadena de compilación. Además, como Lisp, es susceptible de estilos de programación funcionales. Y tiene muchas capacidades de computación paralela. Ideas como la escritura paramétrica y la estabilidad de tipo son bastante únicas y profundas en Julia.
Si desea estudiar los lenguajes de programación ellos mismos, puede aprender los pasos de cómo funciona la compilación utilizando
@code_lowered
para ver qué es la reducción, ver el AST escrito con@code_typed
, ver LLVM IR con@code_llvm
, y finalmente el código de ensamblado nativo con@code_native
. Esto puede usarse para mostrar cuál es el costo de las variables dinámicas y exactamente cómo funciona el "boxeo variable", y esta publicación de blog muestra cómo estas herramientas de introspección pueden usarse para enseñar cómo las optimizaciones del compilador pueden / no pueden ocurrir.No solo hay que explorar ideas de ingeniería informática y de informática, sino también ideas matemáticas ricas. Dado que las bibliotecas principales de Julia están escritas teniendo en cuenta la tipificación genérica, es trivial crear operadores libres de matrices y usar IterativeSolvers.jl para realizar GMRES usándolos. Puede usar herramientas de introspección
@which
para mostrarle exactamente cómo se implementó cualquier cosa. Por ejemplo, ¿cómo\
funciona?Eso me lleva directamente a la definición de \ . Se implementa en Julia, por lo que alguien que conoce a Julia puede aprender el algoritmo y cómo funciona mediante la identificación de subtipos de matriz y especializándose cuando sea posible (recurriendo a la eliminación gaussiana). Dado que el código de Julia tiene licencia MIT (y casi todos los paquetes tienen licencia MIT), los estudiantes pueden usar estas ideas en su propio código (con atribución) (cuando el código tiene licencia GPL, como es el caso con la mayoría de los paquetes MATLAB y R, ¡deben tener cuidado con los problemas de licencia!).
Dado que el núcleo del lenguaje está construido con una comunidad de código abierto muy activa, también hay un rico recurso en la historia del desarrollo del lenguaje: sus problemas de Github . ¿Comprender preguntas de lenguaje como lo que realmente es una transposición matricial? puede ser muy esclarecedor para comprender estos objetos matemáticos con mayor detalle.
Pero por último, al final, quieres enseñar a tus alumnos cómo crear. Lamentablemente, aprender Python o R no significa necesariamente que tenga lo que se necesita para "desarrollar Python / R", ya que la mayoría de los paquetes ampliamente utilizados y bien optimizados tienen una cantidad sustancial de código C / C ++ / Fortran en orden para obtener rendimiento Por lo tanto, para que estos estudiantes puedan contribuir a los ecosistemas científicos de estos idiomas, eventualmente tendrán que aprender otro idioma en algún momento. Si bien eso no es del todo horrible, es subóptimo ahora que Julia existe. Dado que el tipo de letra estable Julia puede alcanzar la velocidad de C / Fortran, la mayoría de los paquetes en el ecosistema de Julia son códigos puros de Julia. Aprender a Julia significa que uno ha aprendido a desarrollar a Julia. Y dado que Base Julia también es principalmente código de Julia (solo algunas primitivas y el analizador no lo es),
Dicho esto, hay algunas desventajas en la elección de Julia. Por un lado, es mucho más nuevo que estos otros idiomas y, por lo tanto, es un poco más escaso en recursos. Tendrá que encontrar muchas herramientas de enseñanza por su cuenta, o extraer recursos de la web que figuran en el sitio web de Julia . Además, los detalles del idioma no están del todo definidos, aunque 1.0 saldrá pronto (a fines de 2017). Y también es muy probable que usted, el potencial maestro de un curso en Julia, no tenga mucha experiencia con el idioma. Sin embargo, estos son los tipos de problemas que desaparecen con el tiempo, mientras que los beneficios de Julia que mencioné anteriormente son mucho más importantes para los propios idiomas.
fuente
Hablando como un estudiante universitario no muy lejano, y suponiendo que no estás enseñando en el departamento de CS, creo que sería un desastre introducir a los estudiantes en la programación de computadoras con algo como C, C ++ o Fortran (o Dios no lo quiera) CUDA), a pesar de que otros han señalado que probablemente son el status quo en la informática científica.
Si espera enseñar a los estudiantes computación científica y presentarles la programación en el mismo curso, apuesto a que es demasiado para cubrir en un semestre a menos que se apegue a un lenguaje interpretado como matlab o python. En mi experiencia, la mayoría de las clases de computación científica en el nivel de pregrado se imparten en uno de esos dos de cualquier manera, y Python se está volviendo cada vez más útil como lenguaje de nivel de producción todos los días, por lo que todavía tiene alguna utilidad como habilidad práctica ( más allá de solo enseñar conceptos básicos de programación, quiero decir).
Solo mis dos centavos.
fuente
C, C ++ y Fortran (enumerados sin ningún orden en particular) son los tres lenguajes de programación principales utilizados para las matemáticas / física computacional si desea resolver grandes problemas en supercomputadoras. Creo que CUDA se considera una biblioteca que se usa junto con otros idiomas para la computación acelerada por GPU. Matlab y Python son excelentes para aprender a ejecutar diagnósticos de salida y crear modelos prototipo. También son más fáciles de aprender y pueden ser mejores para un curso en el que desea ver algoritmos y versos que aprenden a programar.
Por lo tanto, si su curso es puramente sobre programación, elegiría C ++ o, si esta es la primera vez que los estudiantes programan, Python. Ambos lenguajes tienen una gran utilidad fuera del mundo de la informática científica. Si el curso se centra en el aprendizaje de algoritmos para resolver problemas basados en la física, entonces creo que Matlab es, sin duda, el ganador.
fuente
en resumen: tenga en cuenta que la informática científica es complicada en sí misma. ¿Realmente quieres que el lenguaje de programación entre en juego?
Las matemáticas usan la abstracción para resolver problemas que no pueden resolverse por intuición. Por lo tanto, los conceptos tienden a ser abstractos. Por eso no es trivial entender qué conceptos encapsular. En informática científica, los ejemplos habituales para clases como "Animal" "Vehículo" son bastante inútiles. Esto es cierto para la programación orientada a objetos, pero creo que reproducir conceptos abstractos en una computadora tampoco es trivial en la programación imperativa.
Es por eso que creo que aquí estamos tratando con dos esfuerzos diferentes: programación, por un lado, y computación científica por el otro. A nivel de pregrado, donde los estudiantes provienen de entornos heterogéneos, puede terminar enseñando dos cosas diferentes al mismo tiempo.
Si su objetivo es enseñar informática científica, creo que es bastante difícil. Tener una barrera adicional ya que el lenguaje de programación (todos estamos de acuerdo en que C ++ requiere capacitación) desmotivaría a una buena parte de los estudiantes, por eso sugiero ir con Python.
Si su curso es "Introducción a SC", creo que Python tiene la mejor relación resultado / esfuerzo.
PD: ahora tenemos computadoras bastante buenas, realmente no necesitamos buscar eficiencia a nivel de pregrado.
fuente