В 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, и есть макросы, которые показывают каждую часть цепочки компиляции. Также, как Лисп, поддается функциональным стилям программирования. И у этого есть много параллельных вычислительных возможностей. Идеи, такие как параметрическая типизация и стабильность типов, довольно уникальны и глубоки в Юлии.
Если вы хотите изучать сами языки программирования, вы можете узнать, как работает компиляция, используя, @code_lowered
чтобы увидеть, что такое понижение, увидеть типизированный AST с @code_typed
, LLVM IR с @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 (всего несколько примитивов, а синтаксический анализатор - нет),
Тем не менее, есть некоторые недостатки в выборе Юлии. С одной стороны, он намного новее, чем эти другие языки, и поэтому его ресурсы немного меньше. Вы должны будете придумать много учебных инструментов самостоятельно или использовать ресурсы в Интернете, которые перечислены на веб-сайте Julia . Кроме того, языковые детали не совсем исчерпаны, хотя скоро выйдет 1.0 (к концу 2017 года). И вполне вероятно, что вы, потенциальный преподаватель курса в Юлии, возможно, не имели такого большого опыта работы с языком сами. Тем не менее, это те проблемы, которые исчезают со временем, в то время как преимущества Юлии, о которых я говорил выше, гораздо более важны для самих языков.