Яку мову я повинен використовувати під час викладання студентського курсу комп’ютерного програмування?


22

Збирається викладати студентів бакалаврату курсу під назвою Вступ до комп'ютерного програмування. Я трохи розгубився. У галузі обчислювальної фізики вчені використовують C / C ++ або Python або Fortran, CUDA тощо .... Це час для створення їх бази. Що я повинен використовувати? Я знаю, що ви можете вивчити нову мову програмування в будь-який час свого життя, але це для мене розумніший вибір для розробки всіх основних концепцій програмування та концепцій OOP згодом.


9
@ k20: Я сподіваюся, що ваша пропозиція була чіткою; інакше це було б серйозним порушенням академічної етики.
Крістіан Класон

6
@ k20: Все це поза темою, але вибір програмного забезпечення, заснованого на відкатах (будь-якого виду) для викладача, а не на змісті, який слід викладати, безумовно, неетичний. (Тільки для того, щоб було зрозуміло, це "замах", на який я заперечую.) Як правило, це робиться, щоб компанії робили доступне програмне забезпечення за значно меншими витратами (або безкоштовно).
Крістіан Класон

3
@ k20: Також майте на увазі, що мотивація компанії програмного забезпечення не зовсім альтруїстична: Ваші студенти можуть отримати програмне забезпечення зараз безкоштовно, але ймовірно, що їм доведеться купувати програмне забезпечення через деякий час у своєму житті (або вивчати нове програмне забезпечення).
Wrzlprmft

3
@ k20 Matlab і Mathematica насправді не дуже використовуються для серйозних наукових обчислень. Вони є більш дослідницьким інструментом для випробування ідей. Якщо мета курсу - викладання основних алгоритмів, то вони можуть бути підходящими (особливо Matlab), але якщо це загальне програмування, то ви хочете перейти з більш загальною мовою програмування, як Python of C ++.
Труман Елліс

2
MATLAB має дизайн (якби я не був дипломатичним, я б сказав, що його помилка :)), який вимагає того, що в інших мовах є поганими звичаями. Багато інших речей просто відрізняються від усього іншого, тому «вийти на вулицю» може бути складно. Математика має, на мою думку, гарний дизайн, але вона нічим не схожа на будь-яку іншу мову (крім, можливо, Лісп, але вона не використовується в науці), тому те, що ви навчились, здебільшого марно вивчати іншу мову. ОТО, перейти на C <-> Python набагато простіше.
Давідм

Відповіді:


32

По-перше, якщо ваші магістранти подібні до наших і не мали попереднього ознайомлення з комп’ютерами, сподівайтеся, що витратите деякий час на навчання, як використовувати основні речі, як-от використання правильного редактора (тобто, не MS Word), командного рядка тощо.

Я думаю, що відповідь дещо залежить від того, де ви задаєте фокус свого курсу (або що вам потрібно викладати). Наприклад: Наскільки релевантні внутрішні роботи комп’ютера? Вам потрібні заняття та інші передові структури OOP? Ви хочете навчити їх створювати ефективні програми чи раді вам, якщо вони взагалі виробляють робочі програми? Також не забувайте, що вам, швидше за все, знадобляться здібні репетитори.

Але зараз я знаю щось із переваг та недоліків мов. Зауважте, що це, головним чином, з мого досвіду як обчислювального фізика, і щось із цього може залежати від конкретної галузі, робочої групи, університету тощо.

Пітон

Я, як правило, рекомендую використовувати 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 77). Також набагато складніше буде знайти підручники, допомогу в Інтернеті тощо.
  • Matlab / Mathematica: Усі проблеми власного програмного забезпечення. Зокрема, врахуйте, що ваші студенти можуть співпрацювати з людьми, які не мають доступу до цього програмного забезпечення та пов'язаних з цим проблем.
  • Куда: Це актуально лише для певних проблем, якщо важлива робота. Крім того, зрештою, що я знаю, ви не хочете вчитися програмуванню таким чином.

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


Дуже точна відповідь
Афнан Башир

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

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

@meawoppl: "Навчання нижчих курсів c ++ або Fortran призведе до втрати часу на боротьбу з компілятором, ніж час, отриманий у кодовій швидкості." якщо вправи спеціально не зроблені таким чином, щоб їх не було), але швидкість коду програм, які вони будуть писати для реального життя чи подібні. І є деякі речі, які просто неможливо зробити ефективно лише в Python.
Wrzlprmft

1
Я б сказав, що CUDA не викликає сумнівів для загального курсу, оскільки для цього потрібне обладнання, яке не у всіх. А якщо у вас тільки ноутбук без нього, майже неможливо встановити його.
Давідм

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


Цікаво, що якщо використовувати мало вживану мову має сенс, оскільки знання синтаксису, ймовірно, втратяться, і це не є гарантією того, що учні вивчать кілька мов. Можливо, в такій точці зору пітон все-таки хороший.
Xavier Combelle

1
Ось чому я б не говорив раніше про Джулію, але тепер, коли це досить часто, ви також можете використовувати її.
Кріс Раккаукас

Я думаю, що Юлія все ще занадто нова. У галузі, як очікується, студенти будуть знати Python, C ++, (ew) MATLAB та R. Я думаю, що краще вивчити другу чи третю мову, як збагачуючий досвід. Студенти навряд чи найближчим часом знову використовуватимуть Юлію.
Mateen Ulhaq

2
Студенти повинні засвоїти передавальні навички, а не шаблон для копіювання та вставки. У цьому сенсі Python / MATLAB / R абстрагується занадто далеко від комп’ютера, щоб стати хорошим інструментом навчання поза найпростішим програмуванням, але C ++ занадто низький рівень, щоб бути хорошим інструментом навчання. Звичайно, якщо ви будете мати мову збоку, як у курсі чисельного аналізу, зробіть те, що ви будете використовувати, оскільки курс не стосується програмування. Але якщо мова йде про концепції програмування, Джулія - ​​це майже єдина проста мова, яка насправді має більшість концепцій у своєму дизайні.
Кріс Ракаукас

2

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

Якщо ви розраховуєте навчити студентів наукових обчислень та впроваджувати їх до програмування тим же курсом, я б став би, що це занадто багато, щоб охопити в семестрі, якщо ви не дотримуєтесь інтерпретованої мови, як матлаб або пітон. З мого досвіду, більшість класів з наукових обчислень на бакалаврському рівні викладаються в одному з цих двох як завгодно, і пітон з кожним днем ​​стає все більш корисним як мова виробничого рівня, тому він все ще має корисність як практичний навик ( я маю на увазі не просто викладання основ програмування).

Всього два мої центи.


4
Катастрофа - це занадто сильне слово, яке можна використовувати для опису учнів C, C ++ або Fortran. Будь-яка з цих мов (C, C ++, Fortran або Python) може бути чудовою для викладання програм програмування та наукових обчислень залежно від того, як це робити.
Білл Барт

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

0

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

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


0

коротко: врахуйте, що наукові обчислення складні самі по собі. Ви дійсно хочете, щоб мова програмування почала грати?

Математика використовує абстракцію для вирішення завдань, які не можна вирішити інтуїцією. Тому поняття мають тенденцію бути абстрактними. Ось чому не тривіально зрозуміти, які поняття інкапсулювати. У науковому обчисленні звичні приклади для занять на кшталт "Тварина" "Транспортний засіб" досить марні. Це стосується об'єктно-орієнтованого програмування, але я вважаю, що відтворення абстрактних понять на комп’ютері не є тривіальним і в імперативному програмуванні.

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

Якщо ваша мета - викладання наукових обчислень, я думаю, що це досить складно. Наявність додаткового бар'єру як мови програмування (ми всі згодні з тим, що для C ++ потрібна підготовка) могло б демотивувати хороший шматок студентів, саме тому я пропоную піти з python.

Якщо ваш курс "Вступ до SC", я вважаю, що найкраще співвідношення результат / зусилля має пітон.

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


Щодо вашого ПС: Чому результативність не має значення лише для студентів? Окрім того, що для студентів, які мають важливе значення, легко уявляти завдання, це не ті завдання, за якими вони навчаються, а реальне життя. Також швидкість комп'ютера, можливо, стала вищою, але так ми очікуємо.
Wrzlprmft

Вибачте, я був занадто гострим. Дозвольте перефразовувати це в тому, що "студенти можуть запускати задовільні великі програми з інтерпретованою мовою, перш ніж зануритися в оптимізацію коду, а потім перейти до компільованої мови".
Нікола Кавалліні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.