Собираюсь преподавать студентам бакалавриата курс под названием «Введение в компьютерное программирование». Я немного смущен. В вычислительной физике ученые используют C / C ++ или Python или Fortran, CUDA и т. Д. ..... пришло время создать свою базу. Что я должен использовать? Я знаю, что вы можете выучить новый язык программирования в любое время в своей жизни, но для меня более разумный выбор, чтобы позже разработать все основные концепции программирования и концепции ООП.
python
c++
computational-physics
languages
Афнан Башир
источник
источник
Ответы:
Во-первых, если ваши магистранты такие же, как наши, и у них не было предварительного знакомства с компьютерами, рассчитывайте потратить некоторое время на обучение их тому, как использовать базовые вещи, такие как использование правильного редактора (т. Е. Не MS Word), командной строки и т. Д.
Я думаю, что ответ в некоторой степени зависит от того, на чем вы сосредоточили свое внимание (или на том, что вы должны преподавать). Например: насколько актуальны внутренние работы компьютера? Вам нужны классы и другие сложные ООП структуры? Вы хотите научить их, как создавать эффективные программы, или вы счастливы, если они вообще создают рабочие программы? Также не забывайте, что вам, скорее всего, понадобятся способные репетиторы.
Но теперь кое-что о преимуществах и недостатках языков, с которыми я знаком. Обратите внимание, что это в основном из моего опыта работы в области вычислительной физики, и некоторые из них могут зависеть от конкретной области, рабочей группы, университета и т. Д.
питон
Я обычно рекомендую использовать Numpy практически с самого начала, и я предполагаю, что он будет использоваться в следующем.
Преимущества:
print
, Numpy - хsavetxt
иloadtxt
, и , возможноsys.argv
. Это может быть введено на лету, и это не съедает много времени программирования.Недостатки:
C / C ++
Преимущества:
Недостатки:
Основные преимущества C ++ над C (классы, шаблоны) не должны быть актуальны для вашего курса и становятся актуальными только для более крупных проектов. Поэтому я бы выбрал C из двух, поскольку он более лаконичен.
другие
Некоторые комментарии на других языках:
¹ Какой стандартный рабочий процесс по крайней мере в нашей группе.
источник
В 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
для самоанализа, например, чтобы показать вам, как что-то было реализовано. Например, как\
работает?Это указывает мне прямо на определение \ . Он реализован в Джулии, поэтому тот, кто знает Джулию, может затем изучить алгоритм и то, как он работает, идентифицируя матричные подтипы и, по возможности, специализируясь (возвращаясь к исключению Гаусса). Поскольку код Джулии лицензирован по 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 года). И вполне вероятно, что вы, потенциальный преподаватель курса в Юлии, возможно, не имели такого большого опыта работы с языком сами. Тем не менее, это те проблемы, которые исчезают со временем, в то время как преимущества Юлии, о которых я говорил выше, гораздо более важны для самих языков.
источник
Говоря как не слишком далекий студент, и предполагая, что вы не преподаете на факультете CS, я думаю, что было бы катастрофой познакомить студентов с компьютерным программированием с чем-то вроде C, C ++ или Fortran (или не дай бог CUDA), хотя другие отметили, что они, вероятно, статус-кво в научных вычислениях.
Если вы рассчитываете научить студентов научным вычислениям и познакомить их с программированием на одном и том же курсе, я бы поспорил, что это слишком много для семестра, если вы не будете придерживаться интерпретируемого языка, такого как matlab или python. По моему опыту, большинство классов по научным вычислениям на уровне бакалавриата преподаются на одном из этих двух способов, как угодно, и Python становится все более и более полезным в качестве языка производственного уровня с каждым днем, поэтому он все еще имеет некоторую полезность в качестве практического навыка ( Я имею в виду не только преподавание основ программирования).
Просто мои два цента.
источник
C, C ++ и Fortran (перечислены в произвольном порядке) - это три основных языка программирования, используемых для вычислительной математики / физики, если вы хотите решать большие проблемы на суперкомпьютерах. Я думаю, что CUDA считается библиотекой, которая используется вместе с другими языками для ускоренных вычислений на GPU. Matlab и python отлично подходят для диагностики выходной диагностики и создания прототипов моделей. Их также легче выучить, и, возможно, они лучше подойдут для курса, в котором вы хотите познакомиться со стихами об алгоритмах, обучающимися программированию.
Таким образом, если ваш курс посвящен исключительно программированию, я бы выбрал C ++ или, если это первое программирование студентов, Python. Оба этих языка очень полезны за пределами мира научных вычислений. Если курс сосредоточен вокруг алгоритмов обучения для решения основанных на физике задач, то я думаю, что Matlab, несомненно, победитель.
источник
Если коротко: учтите, что научные вычисления сами по себе сложны. Вы действительно хотите, чтобы язык программирования вошел в игру?
Математика использует абстракцию для решения проблем, которые не могут быть решены интуицией. Поэтому понятия имеют тенденцию быть абстрактными. Вот почему нетрудно понять, какие концепции следует инкапсулировать. В научных вычислениях обычные примеры для классов типа «Животное» и «Транспортное средство» довольно бесполезны. Это верно для объектно-ориентированного программирования, но я считаю, что воспроизведение абстрактных концепций на компьютере не является тривиальным и в императивном программировании.
Вот почему я считаю, что здесь мы имеем дело с двумя разными усилиями: программированием, с одной стороны, и научными вычислениями, с другой. На уровне бакалавриата, где студенты происходят из разнородного происхождения, вы можете в конечном итоге преподавать две разные вещи одновременно.
Если ваша цель - научить научным вычислениям, я думаю, что это достаточно сложно. Наличие дополнительного барьера в качестве языка программирования (мы все согласны с тем, что C ++ требует обучения) демотивирует значительную часть студентов, поэтому я предлагаю перейти на python.
Если ваш курс "Введение в SC", я считаю, что у python наилучшее соотношение результат / усилие.
PS: теперь у нас довольно хорошие компьютеры, нам не нужно искать эффективность на уровне бакалавриата.
источник