Какой язык я должен использовать при обучении студентов по компьютерному программированию?


22

Собираюсь преподавать студентам бакалавриата курс под названием «Введение в компьютерное программирование». Я немного смущен. В вычислительной физике ученые используют C / C ++ или Python или Fortran, CUDA и т. Д. ..... пришло время создать свою базу. Что я должен использовать? Я знаю, что вы можете выучить новый язык программирования в любое время в своей жизни, но для меня более разумный выбор, чтобы позже разработать все основные концепции программирования и концепции ООП.


9
@ k20: я надеюсь, что ваше предложение было насмешливым; в противном случае это было бы серьезным нарушением академической этики.
Кристиан Клэйсон

6
@ k20: Все это не по теме, но выбор программного обеспечения на основе откатов (любого рода) для учителя, а не на обучаемом контенте, безусловно, неэтичен. (Просто чтобы прояснить, это «добыча», против которой я возражаю.) Что обычно делается, так это то, что компании предоставляют доступное программное обеспечение по значительно сниженным ценам (или бесплатно).
Кристиан Клэйсон,

3
@ k20: Кроме того, имейте в виду, что мотивация компании-разработчика программного обеспечения не совсем альтруистична: ваши студенты могут получить программное обеспечение бесплатно прямо сейчас, но также вероятно, что им придется купить программное обеспечение через некоторое время в своей жизни (или научиться новому. програмное обеспечение).
Wrzlprmft

3
@ k20 Matlab и Mathematica не особо используются для серьезных научных расчетов. Они являются более исследовательскими инструментами для опробования идей. Если целью курса является обучение базовым алгоритмам, то они могут быть подходящими (особенно Matlab), но если это общее программирование, то вы хотите использовать более общий язык программирования, такой как Python из C ++.
Трумэн Эллис

2
У MATLAB есть дизайн (если бы я не был дипломатичным, я бы сказал, что он некорректен :)), который требует того, что на других языках является плохой практикой. Многие другие вещи просто отличаются от всего остального, поэтому «выйти» может быть сложно. Mathematica имеет, на мой взгляд, красивый дизайн, но он не похож ни на какой другой язык (за исключением, возможно, Lisp, но он не используется в науке), так что то, что вы выучили, в основном бесполезно для изучения другого языка. OTOH, перейти на C <-> Python намного проще.
Davidmh

Ответы:


32

Во-первых, если ваши магистранты такие же, как наши, и у них не было предварительного знакомства с компьютерами, рассчитывайте потратить некоторое время на обучение их тому, как использовать базовые вещи, такие как использование правильного редактора (т. Е. Не MS Word), командной строки и т. Д.

Я думаю, что ответ в некоторой степени зависит от того, на чем вы сосредоточили свое внимание (или на том, что вы должны преподавать). Например: насколько актуальны внутренние работы компьютера? Вам нужны классы и другие сложные ООП структуры? Вы хотите научить их, как создавать эффективные программы, или вы счастливы, если они вообще создают рабочие программы? Также не забывайте, что вам, скорее всего, понадобятся способные репетиторы.

Но теперь кое-что о преимуществах и недостатках языков, с которыми я знаком. Обратите внимание, что это в основном из моего опыта работы в области вычислительной физики, и некоторые из них могут зависеть от конкретной области, рабочей группы, университета и т. Д.

питон

Я обычно рекомендую использовать Numpy практически с самого начала, и я предполагаю, что он будет использоваться в следующем.

Преимущества:

  • Его легко освоить, и он читает код других людей (например, код вашего примера, а также код студентов для преподавателей).
  • Ввод и вывод (который не должен быть в центре внимания курса) могут быть полностью покрыты print, Numpy - х savetxtи loadtxt, и , возможно sys.argv. Это может быть введено на лету, и это не съедает много времени программирования.
  • Вам не нужно иметь дело или нужно только иметь дело с такими деталями, как представление чисел, управление памятью, типы данных. Это позволяет быстро программировать, и вы можете сосредоточиться на реальных алгоритмах.
  • Это не скомпилированный язык. Это имеет два преимущества: студентам не нужно иметь дело с компилятором, и студенты могут тестировать материал непосредственно в консоли без необходимости компиляции, перезапуска и повторного запуска программы. Кроме того, отладка проще.
  • Есть простые в использовании библиотеки практически для всего.
  • Вам не нужно изучать дополнительные языки сценариев, такие как сценарии оболочки, Make, Gnuplot и т. Д. - все это можно сделать из Python.
  • Есть много хороших учебных пособий (бесплатно).

Недостатки:

  • Это не скомпилировано. Поэтому программы на Python могут быть значительно медленнее, чем скомпилированные программы, в некоторых случаях относящиеся к вычислительной физике. В других случаях, однако, библиотеки (особенно Numpy) могут дать сопоставимую производительность. Другой способ добиться хороших результатов с помощью Python - написать соответствующие фрагменты кода на другом языке, например C¹. Очевидно, что для этого вам нужно выучить этот язык, но это можно сделать позже, и ваше время изучения Python не будет потрачено впустую.
  • Труднее обучить таким деталям, как представление чисел, управление памятью, типы данных и их подводные камни, поскольку они несколько запутаны.

C / C ++

Преимущества:

  • Он скомпилирован, и поэтому проще создавать эффективный код.
  • Вы непосредственно имеете дело с представлением чисел, управлением памятью, типами данных, и, таким образом, учить этому интуитивно понятнее - ваши ученики станут ближе к тому, что действительно происходит на их компьютере.
  • Существуют библиотеки для всего, но понимание и использование библиотеки требует некоторой работы.
  • Существует существующий объем кода на C / C ++, и поэтому студентам необходимо изучать язык, если они хотят работать с этим кодом.
  • Если вы уже знаете C / C ++, вы можете изучить Python (например) очень быстро.

Недостатки:

  • Он скомпилирован, и ваши студенты должны иметь дело с компилятором, препроцессором, заголовками и так далее. Вы будете удивлены тем, сколько студентов потерпят неудачу на этом этапе, даже в конце семестра.
  • Это слишком медленное обучение и создание рабочего кода занимает больше времени.
  • Работа с такими мелочами, как ввод и вывод, занимает некоторое время как в обучении, так и в программировании. В C ++ есть дополнительный синтаксис для ввода и вывода.
  • Зависимости компилятора и операционной системы.
  • Вам приходится иметь дело с путаницей в C / C ++.
  • Чтение чужого кода, особенно в C ++, может быть довольно сложным из-за огромного количества синтаксических функций.

Основные преимущества C ++ над C (классы, шаблоны) не должны быть актуальны для вашего курса и становятся актуальными только для более крупных проектов. Поэтому я бы выбрал C из двух, поскольку он более лаконичен.

другие

Некоторые комментарии на других языках:

  • Fortran: Это все еще используется многими группами, и существует много унаследованного кода, но вы не можете обойтись со старыми стандартами, их огромными ограничениями и подводными камнями (многие люди все еще работают с Fortran 77). Также будет намного сложнее найти учебники, помощь в интернете и так далее.
  • Matlab / Mathematica: Все проблемы проприетарного программного обеспечения. В частности, учтите, что ваши ученики могут сотрудничать с людьми, у которых нет доступа к этому программному обеспечению и вытекающим из этого проблемам.
  • Cuda: Это актуально только для определенных проблем, если производительность имеет значение. Кроме того, после всего, что я знаю, вы не хотите изучать программирование таким образом.

¹ Какой стандартный рабочий процесс по крайней мере в нашей группе.


Очень точный ответ
Афнан Башир

1
Я также хотел бы сказать, что одним из не упомянутых бонусов Python является то, что существует ряд научных дистрибутивов (Anaconda / Enthought / PythonXY / SAGE), которые действительно сглаживают процесс привлечения всех на одну вычислительную страницу. Кроме того, даже круче веб-подходы (Wakari и SAGE), которые предоставляют все это с помощью браузера, также известного как установленное программное обеспечение. Обучение старшеклассников c ++ или Fortran приведет к потере времени на борьбу с компилятором больше, чем время, потраченное на скорость кода.
Meawoppl

В Python есть удивительная экосистема для вычислительной физики. Numpy, scipy для обеспечения базовой инфраструктуры, mayavi, tvtk для визуализаций. Python довольно зрел в научном компьютерном сообществе. Я использую C ++ в производстве, но неважно, что это неудобно.
Саи Венкат

@meawoppl: «Обучение старшеклассников c ++ или Fortran приведет к потере времени на борьбу с компилятором больше, чем время, потраченное на скорость кода». - Дело не в скорости кода для упражнений для курса (программы будут очень быстрыми в любом случае, если только упражнения специально не сделаны так, чтобы они не выполнялись), но скорость кода программ, которые они напишут для реальной жизни или аналогичных. И есть некоторые вещи, которые просто невозможно сделать эффективно только в Python.
Wrzlprmft

1
Я бы сказал, что CUDA исключен для курса общего назначения, поскольку он требует аппаратного обеспечения, которое есть не у всех. И если у вас есть только ноутбук без него, вы почти не сможете его установить.
Davidmh

22

В 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 года). И вполне вероятно, что вы, потенциальный преподаватель курса в Юлии, возможно, не имели такого большого опыта работы с языком сами. Тем не менее, это те проблемы, которые исчезают со временем, в то время как преимущества Юлии, о которых я говорил выше, гораздо более важны для самих языков.


Интересно, если использование немного используемого языка имеет смысл, так как знание синтаксиса, скорее всего, будет потеряно, и это не гарантирует, что студенты будут изучать несколько языков. Может быть, с такой точки зрения, Python все еще хороший выбор.
Ксавье Комбель

1
Вот почему я не сказал бы Джулии раньше, но теперь, когда это довольно распространенное явление, вы можете использовать его.
Крис

Я думаю, что Юлия все еще слишком нова. В промышленности ожидается, что студенты будут знать Python, C ++, (ew) MATLAB и R. Я думаю, что лучше изучать второй или третий язык, как обогащающий опыт. Студенты вряд ли снова будут использовать Юлию в ближайшее время.
Матин Улхак

2
Студенты должны изучить передаваемые навыки, а не шаблон для копирования и вставки. В этом смысле Python / MATLAB / R абстрагируется слишком далеко от компьютера, чтобы быть хорошим инструментом обучения, выходящим за рамки простейшего программирования, но C ++ слишком низок, чтобы быть хорошим инструментом обучения. Конечно, если у вас будет сторонний язык, как в курсе численного анализа, делайте то, что вы будете использовать, потому что курс не о программировании. Но если речь идет о концепциях программирования, Джулия в значительной степени является единственным простым языком, который на самом деле имеет большинство концепций в своем дизайне.
Крис

2

Говоря как не слишком далекий студент, и предполагая, что вы не преподаете на факультете CS, я думаю, что было бы катастрофой познакомить студентов с компьютерным программированием с чем-то вроде C, C ++ или Fortran (или не дай бог CUDA), хотя другие отметили, что они, вероятно, статус-кво в научных вычислениях.

Если вы рассчитываете научить студентов научным вычислениям и познакомить их с программированием на одном и том же курсе, я бы поспорил, что это слишком много для семестра, если вы не будете придерживаться интерпретируемого языка, такого как matlab или python. По моему опыту, большинство классов по научным вычислениям на уровне бакалавриата преподаются на одном из этих двух способов, как угодно, и Python становится все более и более полезным в качестве языка производственного уровня с каждым днем, поэтому он все еще имеет некоторую полезность в качестве практического навыка ( Я имею в виду не только преподавание основ программирования).

Просто мои два цента.


4
«Бедствие» - слишком сильное слово, чтобы использовать его для описания обучения студентов C, C ++ или Fortran. Любой из этих языков (C, C ++, Fortran или Python) может подойти для обучения программированию и научным вычислениям в зависимости от того, как вы это делаете.
Билл Барт

1
Исходя из моего опыта работы с классом отдела CS (C ++) и класса для астрономов (Fortran 77), C / C ++ / Fortran не предоставляет достаточной помощи по сравнению с python для совершенно новых программистов (segfaults против исключений). Использование C / C ++ / Fortran подразумевает либо изучение того, как использовать отладчик (или использование IDE), тогда как python может использоваться сам по себе.
Джеймс Токнелл

0

C, C ++ и Fortran (перечислены в произвольном порядке) - это три основных языка программирования, используемых для вычислительной математики / физики, если вы хотите решать большие проблемы на суперкомпьютерах. Я думаю, что CUDA считается библиотекой, которая используется вместе с другими языками для ускоренных вычислений на GPU. Matlab и python отлично подходят для диагностики выходной диагностики и создания прототипов моделей. Их также легче выучить, и, возможно, они лучше подойдут для курса, в котором вы хотите познакомиться со стихами об алгоритмах, обучающимися программированию.

Таким образом, если ваш курс посвящен исключительно программированию, я бы выбрал C ++ или, если это первое программирование студентов, Python. Оба этих языка очень полезны за пределами мира научных вычислений. Если курс сосредоточен вокруг алгоритмов обучения для решения основанных на физике задач, то я думаю, что Matlab, несомненно, победитель.


0

Если коротко: учтите, что научные вычисления сами по себе сложны. Вы действительно хотите, чтобы язык программирования вошел в игру?

Математика использует абстракцию для решения проблем, которые не могут быть решены интуицией. Поэтому понятия имеют тенденцию быть абстрактными. Вот почему нетрудно понять, какие концепции следует инкапсулировать. В научных вычислениях обычные примеры для классов типа «Животное» и «Транспортное средство» довольно бесполезны. Это верно для объектно-ориентированного программирования, но я считаю, что воспроизведение абстрактных концепций на компьютере не является тривиальным и в императивном программировании.

Вот почему я считаю, что здесь мы имеем дело с двумя разными усилиями: программированием, с одной стороны, и научными вычислениями, с другой. На уровне бакалавриата, где студенты происходят из разнородного происхождения, вы можете в конечном итоге преподавать две разные вещи одновременно.

Если ваша цель - научить научным вычислениям, я думаю, что это достаточно сложно. Наличие дополнительного барьера в качестве языка программирования (мы все согласны с тем, что C ++ требует обучения) демотивирует значительную часть студентов, поэтому я предлагаю перейти на python.

Если ваш курс "Введение в SC", я считаю, что у python наилучшее соотношение результат / усилие.

PS: теперь у нас довольно хорошие компьютеры, нам не нужно искать эффективность на уровне бакалавриата.


Относительно вашего PS: Почему производительность не имеет значения только для студентов? Помимо того факта, что легко задавать задачи для студентов, где производительность имеет значение, это не те задачи, которые они изучают производительность, но реальная жизнь. Кроме того, скорость компьютера, возможно, стала выше, но также и наши ожидания.
Wrzlprmft

Извините, я был слишком резок. Позвольте мне перефразировать это следующим образом: «студенты могут запускать удовлетворительные большие приложения с интерпретируемым языком, прежде чем углубляться в оптимизацию кода и затем переходить на скомпилированный язык».
Никола Каваллини
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.