У 2014 році я сказав би Python. У 2017 році я від усієї думки вважаю, що мовою викладання магістрантів є Юлія.
Викладання завжди стосується компромісу. З одного боку, ви хочете вибрати щось досить просто, щоб його було легко зрозуміти. Але по-друге, ви хочете навчити чогось, що має стійку силу, тобто щось, що може зростати разом з вами. Загальні динамічні мови (Python / MATLAB / R) всі легко потрапляють у категорію 1 завдяки їх неіснуючому кодовій коробці та простоті відкриття інтерпретатора та виплескування коду, тоді як C / C ++ / Fortran потрапляють у другу категорію як мови, якими написано основне високоефективне програмне забезпечення сучасного світу.
Але є проблеми з використанням мови, яка не повністю охоплює іншу категорію. Під час використання такої мови, як Python, вона добре абстрагує такі речі, як типи та цілі переповнення. Це приємно для викладання обчислень у першому семестрі, але, оскільки ви хочете заглиблюватися все глибше і глибше, як все реально працює, мова Python занадто далеко абстрагується від основного металу, щоб стати гарним інструментом навчання. Але C / C ++ / Fortran (або Java ... Я навчився Java спочатку ...) мають настільки велику вартість запуску, що найскладніше навчитися - це як налаштувати заголовки та main
компілювати, що відволікає від фактичного навчання програмі .
Введіть Джулію. Коли ви вперше використовуєте Julia, ви можете абстрагувати всю ідею типів і використовувати її так само, як MATLAB або Python. Але як ви хочете дізнатися більше, до мови є "кроляча нора" глибини. Оскільки це дійсно шар абстракції, заснований на типовій системі + багаторазова відправка по LLVM, це по суті "простий спосіб запису статично складеного коду" (а стабільні за типом функції фактично можуть бути статично скомпільовані). Це означає, що деталі C / C ++ також доступні. Ви можете навчитися писати прості петлі та функції без кодового коду, а потім викопати покажчики функцій. Функції метапрограмування Юлії дозволяють вам безпосередньо отримати доступ до AST, і є макроси, які показують кожну частину ланцюжка компіляції. Також, як Lisp, піддається функціональним стилям програмування. І у нього багато можливостей паралельних обчислень. Такі ідеї, як параметричне введення та стабільність типу, є досить унікальними та глибокими в Джулії.
Якщо ви хочете самі вивчати мови програмування, ви можете вивчити кроки, як працює компіляція, використовуючи, @code_lowered
щоб побачити, що таке зниження, побачити набраний AST з @code_typed
, див. ІК LLVM І @code_llvm
, і нарешті, власний код складання @code_native
. Це можна використовувати, щоб показати, яка вартість динамічних змінних, і як саме працює "змінна бокса", і в цій публікації в блозі показано, як ці інструменти самоаналізу можна використовувати, щоб навчити, як оптимізація компілятора може / не може відбуватися.
Існують не лише ідеї інформатики та інженерії програмного забезпечення для вивчення, але й багаті математичні ідеї. Оскільки основні бібліотеки Джулії написані з загальним набором тексту, тривіально створювати оператори без матриць і використовувати IterativeSolvers.jl для виконання GMRES з їх використанням. Ви можете використовувати засоби самовизначення, якби точно @which
показати вам, як все було реалізовано. Наприклад, як \
працює?
@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
Це вказує мені прямо на визначення \ . Він реалізований у Джулії, тож хтось, хто знає Юлію, може потім вивчити алгоритм та як він працює за допомогою визначення матричних підтипів та спеціалізації, коли це можливо (повернення до ліквідації Гаусса). Оскільки код Джулії має ліцензію MIT (і майже всі пакунки мають ліцензію MIT), студенти можуть безкоштовно використовувати ці ідеї у власному коді (з атрибуцією) (коли код має ліцензію GPL, як це стосується більшості пакетів MATLAB та R, їм потрібно бути обережними щодо питань ліцензування!).
Оскільки мовне ядро побудоване з дуже активною спільнотою з відкритим кодом, є також багатий ресурс з історії розвитку мови: його випуски Github . Розуміння мовних питань на кшталт того, що насправді переносить матрицю? може бути дуже просвітницьким для більш детального розуміння цих математичних об'єктів.
Але нарешті, врешті-решт, ви хочете навчити своїх учнів створювати. На жаль, вивчення Python або R не обов'язково означає, що у вас є те, що потрібно для "розробки Python / R", оскільки більшість широко використовуваних і добре оптимізованих пакетів мають значну кількість C / C ++ / Fortran коду в них для того, щоб для отримання продуктивності. Таким чином, щоб ці студенти змогли внести свій внесок у наукові екосистеми цих мов, з часом вони повинні будуть вивчити іншу мову. Хоча це не зовсім жахливо, але тепер, коли існує Джулія, це недостатньо оптимально. Оскільки стабільна до типу Julia здатна досягти швидкості C / Fortran, більшість пакетів в екосистемі Julia є чистим кодом Julia. Навчитися Юлії означає, що навчився розвивати Джулію. А оскільки Base Julia також є здебільшого кодом Julia (лише декілька примітивів і аналізатор не є),
Однак, у виборі Юлії є деякі недоліки. Для одного він набагато новіший, ніж ці інші мови, і тому трохи менше дефіциту ресурсів. Вам доведеться самостійно придумати чимало навчальних засобів або витягнути ресурси з Інтернету, які перелічені на веб-сайті Джулія . Також мовні деталі не зовсім врегульовані, хоча 1.0 з'являється незабаром (до кінця 2017 року). І також цілком ймовірно, що ви, потенційний викладач курсу Юлії, можливо, не матимете такого досвіду з мовою самостійно. Однак це проблеми, які з часом відходять, тоді як переваги Джулії, про які я згадав вище, є набагато більш явним для самих мов.