コンピュータプログラミングの学部課程を教えるとき、どの言語を使用すればよいですか?


22

学部レベルの学生に「コンピュータープログラミング入門」というタイトルのコースを教えるつもりです。私は少し混乱しています。計算物理学では、科学者はC / C ++またはPythonまたはFortran、CUDAなどを使用します。何を使うべきですか?私はあなたがあなたの生活の中でいつでも新しいプログラミング言語を学ぶことができることを知っていますが、私はそれらをすべての基本的なプログラミング概念とOOP概念を後で詳しく説明するために賢明な選択です。


9
@ k20:あなたの提案がおしゃべりだったことを願っています。さもなければ、それは学術倫理の重大な違反になるでしょう。
クリスチャンクラソン14年

6
@ k20:これはすべて話題外ですが、教えられる内容ではなく、教師へのキックバック(あらゆる種類の)に基づいてソフトウェアを選択することは間違いなく非倫理的です。(明確にするために、それは私が反対する「盗品」です。)通常行われるのは、企業が大幅に低コストで(または無料で)利用可能なソフトウェアを作成することです。
クリスチャンクラソン14年

3
@ k20:また、ソフトウェア会社の動機は完全に利他的ではないことに注意してください:学生は今すぐ無料でソフトウェアを入手できますが、人生の少し後にソフトウェアを購入しなければならない可能性もありますソフトウェア)。
Wrzlprmft 14年

3
@ k20 MatlabとMathematicaは、本格的な科学計算にはあまり使われていません。アイデアを試すためのより探索的なツールです。コースの目的が基本的なアルゴリズムを教えることである場合、これらは適切な場合があります(特にMatlab)が、一般的なプログラミングの場合は、PythonのC ++などのより一般的なプログラミング言語を使用します。
トルーマンエリス

2
MATLABには、他の言語では悪い習慣であるものを必要とする設計があります(私が外交をしていなかったなら、私は欠陥があると言うでしょう:))。他の多くのものは他のものとはまったく異なるため、「外出」は難しい場合があります。私の意見では、Mathematicaには美しいデザインがありますが、他の言語(Lispを除くが、科学では使用されない可能性があります)に似ているものはないため、学んだことは他の言語を学ぶのにほとんど役に立ちません。OTOH、C <-> Pythonを使用する方がはるかに簡単です。
Davidmh

回答:


32

まず、あなたの学部生が私たちと同じで、コンピューターについての予備知識がない場合、適切なエディター(MS Word以外)、コマンドラインなどの基本的な使用方法を教えることに時間を費やすことを期待してください。

答えは、コースの焦点をどこに設定するか(または何を教える必要があるか)に多少依存すると思います。例:コンピューターの内部動作はどの程度関連していますか?クラスやその他の高度なOOP構造が必要ですか?効率的なプログラムを作成する方法を彼らに教えたいですか、それとも作業プログラムを作成することに満足していますか?また、おそらく有能な家庭教師が必要になることを忘れないでください。

しかし今、私は言語の長所と短所に何かを知っています。これは主に計算物理学者としての私の経験によるものであり、この一部は特定の分野、ワークグループ、大学などに依存する可能性があることに注意してください。

Python

私は通常、ほとんど最初からNumpyを使用することをお勧めしますが、以下で使用することを想定しています。

利点:

  • 学ぶのは簡単なので、他の人のコード(例のコードだけでなく、チューター用の学生のコードも)を読んでいます。
  • 入力と出力(コースの焦点になるべきではない)によって完全に覆うことができprint、numpyののsavetxtloadtxt、多分sys.argv。その場で導入でき、プログラミング時間をあまり消費しません。
  • 数値表現、メモリ管理、データ型などの詳細を処理する必要がないか、ほとんど処理する必要はありません。したがって、プログラムは高速で、実際のアルゴリズムに集中できます。
  • コンパイルされた言語ではありません。これには2つの利点があります。学生はコンパイラを扱う必要がなく、学生はプログラムをコンパイル、再起動、再実行しなくてもコンソールで直接テストできます。これに関連して、デバッグが簡単になりました。
  • ほとんどすべてのための使いやすいライブラリがあります。
  • シェルスクリプト、Make、Gnuplotなどの追加のスクリプト言語を学ぶ必要はありません。これらはすべてPythonから実行できます。
  • 多くの優れたチュートリアルがあります(無料)。

短所:

  • コンパイルされていません。そのため、計算物理学に関連する場合には、Pythonプログラムはコンパイルされたプログラムよりも大幅に遅くなる場合があります。ただし、場合によっては、ライブラリ(特にNumpy)で同等のパフォーマンスが得られます。別の方法として、Pythonで優れたパフォーマンスを得るには、関連するコードスニペットをC¹などの別の言語で記述することです。明らかに、このためにこの言語を学ぶ必要がありますが、これは後で行うことができ、Pythonを学ぶ時間は無駄になりません。
  • 数値表現、メモリ管理、データ型、およびそれらの落とし穴などの詳細を教えるのは、難読化されているため、より困難です。

C / C ++

利点:

  • コンパイルされているため、効率的なコードを簡単に作成できます。
  • 数値表現、メモリ管理、データ型を直接扱っているため、これらを教える方がより直感的です。生徒は実際にコンピュータで起こっていることに近づきます。
  • 基本的にすべてのライブラリがありますが、ライブラリを理解して使用するには多少の作業が必要です。
  • C / C ++にはかなりの量の既存のコードがあるため、このコードを使用したい場合は、学生は言語を学ぶ必要があります。
  • すでにC / C ++を知っている場合は、(たとえば)非常に高速にPythonを学習できます。

短所:

  • コンパイルされ、生徒はコンパイラ、プリプロセッサ、ヘッダーなどを処理する必要があります。学期の終わりでも、このステップでどれだけの学生が失敗するかに驚くでしょう。
  • 学習速度も遅く、作業コードの生成に時間がかかります。
  • 入力や出力などの限界的なものを扱うには、プログラミングと同様に教育にも時間がかかります。C ++には、入力と出力のための特別な構文があります。
  • コンパイラとオペレーティングシステムの依存関係。
  • C / C ++の混乱に対処する必要があります。
  • 特にC ++で他のコードを読み取ることは、膨大な構文機能のために非常に困難です。

C(クラス、テンプレート)に対するC ++の主な利点は、コースに関連するものではなく、大規模プロジェクトにのみ関連するようになります。したがって、より簡潔であるため、2つのCを選択します。

その他

他の言語に関するコメント:

  • Fortran:これはまだ多くのグループで使用されており、多くのレガシーコードがありますが、古い標準とその巨大な制限と落とし穴に対処することはできません(多くの人々がまだFortran 77で作業しています)。また、チュートリアルやインターネット上のヘルプなどを見つけるのがずっと難しくなります。
  • Matlab / Mathematica:プロプライエタリなソフトウェアのすべての問題。特に、あなたの学生は、このソフトウェアとそれに続く問題にアクセスできない人々と協力する可能性が高いことを考慮してください。
  • Cuda:パフォーマンスが重要な場合、これは特定の問題にのみ関係します。また、私が知っているすべての後、あなたはこの方法でプログラミングを学びたくありません。

¹これは少なくとも私たちのグループでは標準的なワークフローです。


非常に正確な答え
アフナンバシール14年

1
また、Pythonの言及されていないボーナスの1つは、同じコンピューティングページで全員を取得するプロセスを本当にスムーズにする多くの科学的分布(Anaconda / Enthought / PythonXY / SAGE)があることです。また、ブラウザを介してすべてを提供するWebベースのアプローチ(WakariおよびSAGE)があります(別名0インストールソフトウェア)。学部生のc ++またはFortranを教えると、コード速度の向上よりもコンパイラーとの戦いの方が多くの時間が失われます。
meawoppl 14年

Pythonには計算物理学のためのすばらしいエコシステムがあります。Numpy、基本的なインフラストラクチャを提供するためのscipy、視覚化のためのmayavi、tvtk。Pythonは科学計算コミュニティでかなり成熟しています。私は本番環境でC ++を使用していますが、使用するのがどんなに苦痛でも関係ありません。
サイベンカット14年

@meawoppl:「学部生のc ++またはFortranを教えると、コード速度で得られる時間よりもコンパイラとの戦いで多くの時間が失われます。」ただし、実際にはそうではないような演習が行われている場合を除きます)。ただし、実生活または同様の目的で作成するプログラムのコード速度です。また、Pythonだけでは効率的に実行できないものもあります。
Wrzlprmft 14年

1
CUDAは、誰もが持っているわけではないハードウェアを必要とするため、汎用コースの対象外です。そして、あなたがそれなしでラップトップしか持っていないなら、あなたがそれをインストールできる方法はほとんどありません。
Davidmh

22

2014年には、Pythonと言いました。2017年、私は大学生に教える言語はジュリアだと心から信じています。

教えることは常にトレードオフです。一方では、把握しやすいほど単純なものを選択する必要があります。しかし、第二に、あなたは永続的な力を持っている何か、すなわちあなたと共に成長できる何かを教えたいです。一般的な動的言語(Python / MATLAB / R)は、存在しないボイラープレートコードとインタープリターを開いてコードを出力するのが簡単なため、すべてカテゴリ1に分類されますが、C / C ++ / Fortranは2番目のカテゴリに分類されます今日の世界の中核となる高性能ソフトウェアが書かれた言語。

ただし、他のカテゴリを完全に把握できない言語を使用すると問題が発生します。Pythonのような言語を使用する場合、型や整数オーバーフローなどをうまく抽象化します。これは、最初の学期のコンピューティングを教えるには便利ですが、実際の仕組みを深く掘り下げたいと思うと、Pythonの言語は、基礎となる金属からあまりにも抽象化されすぎて、優れた教育ツールにはなりません。しかし、C / C ++ / Fortran(またはJava ...私は最初にJavaを学びました...)すべてに非常に大きな起動コストがかかるため、学ぶのが最も難しいのは、ヘッダーをセットアップしてmainコンパイルする方法だけであり、実際にプログラミングを学ぶことを妨げます。

ジュリアに入ります。初めてJuliaを使用するとき、型の概念全体を抽象化し、MATLABまたはPythonのように使用できます。しかし、もっと学びたいと思うと、言語に深さの「ウサギの穴」があります。それは本当に型システム+ LLVMを介した複数のディスパッチに基づく抽象化レイヤーなので、本質的に「静的にコンパイルされたコードを書く簡単な方法」です(そして、型安定関数は実際に静的にコンパイルできます)。これは、C / C ++の詳細にもアクセスできることを意味します。定型コードなしで単純なループと関数を作成し、関数ポインターを掘り下げる方法を学ぶことができます。Juliaのメタプログラミング機能を使用すると、ASTに直接アクセスできます。また、コンパイルチェーンのすべての部分を表示するマクロがあります。また、Lispとして、関数型プログラミングスタイルを受け入れます。また、多くの並列計算機能を備えています。パラメトリックタイピングや型安定性などのアイデアは、ジュリアではかなりユニークで深いものです。

あなたは言語自体のプログラミングを勉強したい場合は、コンパイルが使用してどのように動作するかの手順を学ぶことができ@code_lowered低下が何であるかを見るために、と入力した-ASTを見@code_typedてLLVM IRを参照してください@code_llvm、として最終的にネイティブアセンブリコード@code_native。これを使用して、動的変数のコストと「変数ボクシング」の仕組みを正確に示すことができます。このブログ投稿では、これらのイントロスペクションツールを使用してコンパイラの最適化を行う方法とできない方法を説明します。

探求すべきコンピュータサイエンスとソフトウェアエンジニアリングのアイデアだけでなく、豊富な数学的アイデアもあります。Juliaのメインライブラリはジェネリックタイピングを念頭に置いて記述されているため、マトリックスのない演算子を作成し、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

これは、\の定義をまっすぐに指し示しています。ジュリアで実装されているため、ジュリアを知っている人は、アルゴリズムと、マトリックスサブタイプの識別と可能な場合の特殊化(ガウス消去法に戻る)の仕組みを学習できます。JuliaのコードはMITライセンス(およびほとんどすべてのパッケージはMITライセンス)であるため、学生はこれらのアイデアを独自のコード(帰属あり)で自由に使用できます(ほとんどのMATLABおよびRパッケージのように、コードがGPLライセンスの場合、ライセンスの問題に注意する必要があります!)。

言語コアは非常に活発なオープンソースコミュニティで構築されているため、言語開発の歴史に関する豊富なリソース(Githubの問題)もあります実際に行列転置とは何かのような言語の質問を理解しますか?これらの数学的なオブジェクトをより詳細に理解するために非常に啓発することができます。

しかし最後に、最終的には、作成方法を生徒に教えたいと思います。残念なことに、PythonやRを学ぶことは、「Python / Rを開発する」ために必要なものを必ずしも持っているわけではありません。パフォーマンスを取得します。したがって、これらの学生がこれらの言語の科学的生態系に貢献できるようにするには、いずれかの時点で最終的に別の言語を学習する必要があります。それは完全にひどいものではありませんが、ジュリアが存在するようになった今では最適ではありません。型安定JuliaはC / Fortranの速度を達成できるため、Juliaエコシステムのほとんどのパッケージは純粋なJuliaコードです。ジュリアの学習とは、ジュリアの開発を学んだことを意味します。また、ベースジュリアもほとんどがジュリアコードであるため(いくつかのプリミティブとパーサーはそうではありません)、

とはいえ、ジュリアの選択にはいくつかの欠点があります。1つは、他の言語よりもはるかに新しいため、リソースが少し不足していることです。独自の多くの教育ツールを考案するか、Julia WebサイトにリストされているWeb上のリソースから引き出す必要があります。また、言語の詳細はまだ確定していませんが、1.0はまもなく(2017年末までに)公開されます。また、ジュリアのコースの潜在的な教師であるあなたは、あなた自身がその言語をあまり経験していない可能性が高いです。しかし、これらは時間の経過とともに消える種類の問題です。一方、上で述べたジュリアの利点は、言語自体の核心です。


構文の知識が失われる可能性が高く、学生が複数の言語を学習することを保証するものではないため、使用頻度の低い言語を使用するのが理にかなっていると思います。たぶんそのような観点では、Pythonはまだ良いテイクです。
ザビエルコンベル

1
だから私はジュリアを前に言ったことがなかったのですが、今ではそれを使うのが一般的だと思います。
クリスラッカッカス

ジュリアはまだ新しいと思います。産業界では、学生はPython、C ++、(ew)MATLAB、およびRを知っていることが期待されます。充実した経験として、学ぶための第2または第3言語としては良いと思います。学生が近い将来ジュリアを再び使用する可能性は低いです。
Mateen Ulhaq

2
学生は、コピーして貼り付けるテンプレートではなく、譲渡可能なスキルを学ぶ必要があります。その意味で、Python / MATLAB / Rはコンピューターから離れすぎているため、最も単純なプログラミングを超える優れた教育ツールにはなりませんが、C ++は低すぎるため優れた教育ツールにはなりません。もちろん、数値解析コースのような言語を使用する場合は、コースはプログラミングに関するものではないため、使用するものを実行してください。しかし、プログラミングの概念に関するものである場合、ジュリアはほとんどの概念を実際にその設計に持っている唯一のシンプルな言語です。
クリスラッカッカス

2

あまり離れていない学部生と言えば、あなたがCS部門で教えていないと仮定すると、学生にC、C ++、Fortran(または神の禁じられたもの)のようなものをコンピュータプログラミングに紹介することは災害になると思いますCUDA)、他の人はおそらく科学コンピューティングの現状であると指摘していますが。

学生に科学コンピューティングを教え、同じコースでプログラミング紹介することを期待している場合、matlabやpythonのようなインタープリター言語に固執しない限り、1学期でカバーするには多すぎると思います。私の経験では、学部レベルの科学コンピューティングのほとんどのクラスは、これらの2つの方法のいずれかで教えられており、Pythonは毎日生産レベルの言語としてますます便利になっているので、実用的なスキルとしての有用性がまだあります(プログラミングの基礎を教えるだけではありません)。

ちょうど私の2セント。


4
災害は、生徒にC、C ++、またはFortranを教えるのに使用するには強すぎる言葉です。これらの言語(C、C ++、Fortran、またはPython)のいずれでも、プログラミング方法や科学的コンピューティングの指導に適しています。
ビルバース14年

1
CS部門のクラス(C ++)と天文学者のクラス(Fortran 77)の経験から、C / C ++ / Fortranは完全に新しいプログラマー(セグメンテーション違反と例外)のpythonと比較して十分なヘルプを提供しません。C / C ++ / Fortranの使用は、デバッガー(またはIDEの使用)の使用方法を学習することを意味しますが、Pythonは単独で使用できます。
ジェームズトックネル14年

0

C、C ++、およびFortran(順不同)は、スーパーコンピューターで大きな問題を解決する場合に計算数学/物理学に使用される3つの主要なプログラミング言語です。CUDAは、高速GPUコンピューティングのために他の言語と組み合わせて使用​​されるライブラリと見なされていると思います。Matlabとpythonは、出力診断の実行とプロトタイプモデルの作成について学ぶのに最適です。また、学習しやすく、アルゴリズムとプログラミング方法を学習したいコースに適している場合があります。

したがって、あなたのコースが純粋にプログラミングに関するものであれば、C ++を選択します。これが初めてのプログラミングであれば、Pythonを選択します。これらの言語はどちらも、科学計算の世界以外では非常に有用です。コースが物理学に基づいた問題を解決するための学習アルゴリズムに集中している場合、Matlabが間違いなく勝者だと思います。


0

短い:科学計算はそれ自体が複雑であることを考慮してください。プログラミング言語を本当に使い始めたいですか?

数学では、抽象化を使用して、直観では解決できない問題を解決します。したがって、概念は抽象的である傾向があります。これが、どの概念をカプセル化するかを理解するのが簡単ではない理由です。科学計算では、「動物」や「乗り物」などのクラスの通常の例はあまり役に立ちません。これはオブジェクト指向プログラミングにも当てはまりますが、コンピューターで抽象的な概念を再現することは命令型プログラミングでも簡単ではないと思います。

そのため、ここでは、一方のプログラミングともう一方の科学コンピューティングの2つの異なる取り組みに取り組んでいると考えています。学部レベルでは、学生が異種のバックグラウンドを持っているため、2つの異なることを同時に教えることになります。

あなたの目標が科学計算を教えることなら、それは十分に難しいと思います。プログラミング言語として追加の障壁があると(C ++はトレーニングが必要であることに全員が同意します)、生徒のかなりの部分をやる気にさせるので、Pythonを使用することをお勧めします。

あなたのコースが「SC入門」の場合、私はpythonが最高の結果/努力比を持っていると信じています。

PS:今ではかなり良いコンピューターが手に入りました。学部レベルで効率を探す必要はありません。


PSについて:学部生だけにパフォーマンスが重要でないのはなぜですか?パフォーマンスが重要な学部生のタスクを考えるのは簡単であるという事実は別として、彼らがパフォーマンスを学んでいるタスクではなく、実際の生活です。また、コンピューターの速度は速くなったかもしれませんが、私たちの期待も同じです。
Wrzlprmft 14

すみません、私は鋭すぎました。「学生は、コードの最適化を掘り下げてコンパイル言語に進む前に、インタプリタ言語で満足のいく大きなアプリケーションを実行できる」と言い換えます。
ニコラ・カヴァリーニ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.