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?
@which rand(10,10)\rand(10)
#\(A::AbstractArray{T,2} where T, B::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T) in Base.LinAlg at linalg\generic.jl:805
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.