学部レベルの学生に「コンピュータープログラミング入門」というタイトルのコースを教えるつもりです。私は少し混乱しています。計算物理学では、科学者はC / C ++またはPythonまたはFortran、CUDAなどを使用します。何を使うべきですか?私はあなたがあなたの生活の中でいつでも新しいプログラミング言語を学ぶことができることを知っていますが、私はそれらをすべての基本的なプログラミング概念とOOP概念を後で詳しく説明するために賢明な選択です。
学部レベルの学生に「コンピュータープログラミング入門」というタイトルのコースを教えるつもりです。私は少し混乱しています。計算物理学では、科学者はC / C ++またはPythonまたはFortran、CUDAなどを使用します。何を使うべきですか?私はあなたがあなたの生活の中でいつでも新しいプログラミング言語を学ぶことができることを知っていますが、私はそれらをすべての基本的なプログラミング概念とOOP概念を後で詳しく説明するために賢明な選択です。
回答:
まず、あなたの学部生が私たちと同じで、コンピューターについての予備知識がない場合、適切なエディター(MS Word以外)、コマンドラインなどの基本的な使用方法を教えることに時間を費やすことを期待してください。
答えは、コースの焦点をどこに設定するか(または何を教える必要があるか)に多少依存すると思います。例:コンピューターの内部動作はどの程度関連していますか?クラスやその他の高度なOOP構造が必要ですか?効率的なプログラムを作成する方法を彼らに教えたいですか、それとも作業プログラムを作成することに満足していますか?また、おそらく有能な家庭教師が必要になることを忘れないでください。
しかし今、私は言語の長所と短所に何かを知っています。これは主に計算物理学者としての私の経験によるものであり、この一部は特定の分野、ワークグループ、大学などに依存する可能性があることに注意してください。
私は通常、ほとんど最初からNumpyを使用することをお勧めしますが、以下で使用することを想定しています。
利点:
print
、numpyののsavetxt
とloadtxt
、多分sys.argv
。その場で導入でき、プログラミング時間をあまり消費しません。短所:
利点:
短所:
C(クラス、テンプレート)に対するC ++の主な利点は、コースに関連するものではなく、大規模プロジェクトにのみ関連するようになります。したがって、より簡潔であるため、2つのCを選択します。
他の言語に関するコメント:
¹これは少なくとも私たちのグループでは標準的なワークフローです。
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年末までに)公開されます。また、ジュリアのコースの潜在的な教師であるあなたは、あなた自身がその言語をあまり経験していない可能性が高いです。しかし、これらは時間の経過とともに消える種類の問題です。一方、上で述べたジュリアの利点は、言語自体の核心です。
あまり離れていない学部生と言えば、あなたがCS部門で教えていないと仮定すると、学生にC、C ++、Fortran(または神の禁じられたもの)のようなものをコンピュータプログラミングに紹介することは災害になると思いますCUDA)、他の人はおそらく科学コンピューティングの現状であると指摘していますが。
学生に科学コンピューティングを教え、同じコースでプログラミングを紹介することを期待している場合、matlabやpythonのようなインタープリター言語に固執しない限り、1学期でカバーするには多すぎると思います。私の経験では、学部レベルの科学コンピューティングのほとんどのクラスは、これらの2つの方法のいずれかで教えられており、Pythonは毎日生産レベルの言語としてますます便利になっているので、実用的なスキルとしての有用性がまだあります(プログラミングの基礎を教えるだけではありません)。
ちょうど私の2セント。
C、C ++、およびFortran(順不同)は、スーパーコンピューターで大きな問題を解決する場合に計算数学/物理学に使用される3つの主要なプログラミング言語です。CUDAは、高速GPUコンピューティングのために他の言語と組み合わせて使用されるライブラリと見なされていると思います。Matlabとpythonは、出力診断の実行とプロトタイプモデルの作成について学ぶのに最適です。また、学習しやすく、アルゴリズムとプログラミング方法を学習したいコースに適している場合があります。
したがって、あなたのコースが純粋にプログラミングに関するものであれば、C ++を選択します。これが初めてのプログラミングであれば、Pythonを選択します。これらの言語はどちらも、科学計算の世界以外では非常に有用です。コースが物理学に基づいた問題を解決するための学習アルゴリズムに集中している場合、Matlabが間違いなく勝者だと思います。
短い:科学計算はそれ自体が複雑であることを考慮してください。プログラミング言語を本当に使い始めたいですか?
数学では、抽象化を使用して、直観では解決できない問題を解決します。したがって、概念は抽象的である傾向があります。これが、どの概念をカプセル化するかを理解するのが簡単ではない理由です。科学計算では、「動物」や「乗り物」などのクラスの通常の例はあまり役に立ちません。これはオブジェクト指向プログラミングにも当てはまりますが、コンピューターで抽象的な概念を再現することは命令型プログラミングでも簡単ではないと思います。
そのため、ここでは、一方のプログラミングともう一方の科学コンピューティングの2つの異なる取り組みに取り組んでいると考えています。学部レベルでは、学生が異種のバックグラウンドを持っているため、2つの異なることを同時に教えることになります。
あなたの目標が科学計算を教えることなら、それは十分に難しいと思います。プログラミング言語として追加の障壁があると(C ++はトレーニングが必要であることに全員が同意します)、生徒のかなりの部分をやる気にさせるので、Pythonを使用することをお勧めします。
あなたのコースが「SC入門」の場合、私はpythonが最高の結果/努力比を持っていると信じています。
PS:今ではかなり良いコンピューターが手に入りました。学部レベルで効率を探す必要はありません。