在教计算机编程本科课程时,我应该使用哪种语言?


22

打算教本科生一门名为“计算机编程入门”的课程。我有点困惑。在计算物理学中,科学家使用C / C ++或Python或Fortran,CUDA等。...现在是时候建立自己的基础了。我应该使用什么?我知道您可以在自己的生活中随时学习新的编程语言,但是对我来说,以后再详细介绍所有基本编程概念和OOP概念是一个明智的选择。


9
@ k20:我希望你的建议是tongue舌的;否则将严重违反学术道德。
克里斯蒂安·克拉森2014年

6
@ k20:所有这些都是不合时宜的,但是基于对教师的回扣(任何形式)而不是根据要教授的内容选择软件绝对是不道德的。(只是说清楚一点,这就是我反对的“拖尾”。)通常要做的是,公司以大大降低的成本(或免费)提供可用的软件。
克里斯蒂安·克拉森2014年

3
@ k20:此外,请记住,软件公司的动机并不完全是无私的:您的学生现在可以免费获得该软件,但是他们很可能在以后的生活中必须购买该软件(或学习新的软件)。软件)。
Wrzlprmft 2014年

3
@ k20 Matlab和Mathematica并未真正用于严肃的科学计算。它们是尝试想法的更多探索工具。如果本课程的目的是讲授基本算法,则可能适合(特别是Matlab),但是如果是通用编程,则您希望使用更通用的编程语言,例如C ++ Python。
杜鲁门·埃利斯

2
MATLAB的设计(如果我不是外交官,我会说有缺陷:))需要其他语言中的不好的做法。许多其他事物与其他事物完全不同,因此“走出去”可能很困难。在我看来,Mathematica具有漂亮的设计,但是它与任何其他语言都没有相似之处(也许除了Lisp之外,但它不在科学中使用),因此您学到的知识对学习另一种语言几乎毫无用处。OTOH,使用C <-> Python要容易得多。
Davidmh 2014年

Answers:


32

首先,如果您的本科生和我们一样,并且没有计算机的入门知识,请期望花一些时间教他们如何使用基本知识,例如使用适当的编辑器(即,不是MS Word),命令行等。

我认为答案在某种程度上取决于您将课程重点放在哪里(或您需要教的内容)。例如:计算机内部工作的相关性如何?您是否需要类和其他高级OOP结构?您是否想教他们如何制作高效的程序,或者如果他们根本制作出有效的程序,您会感到高兴吗?同样,不要忘记,您很可能将需要有能力的导师。

但是现在,我已经熟悉了这些语言的优缺点。请注意,这主要是基于我作为计算物理学家的经验,其中一些可能取决于特定领域,工作组,大学等。

蟒蛇

我通常建议几乎从一开始就使用Numpy,并且我假设它会在下面使用。

好处:

  • 这很容易学习,因此阅读其他人的代码(例如您的示例代码,还有学生的辅导老师代码)也很容易。
  • 输入和输出(不应该是课程的重点)可以由printNumpy的savetxtloadtxt,甚至完全覆盖sys.argv。它可以即时引入,并且不会花费太多编程时间。
  • 您不需要处理或只需要很少处理诸如数字表示,内存管理,数据类型之类的细节。因此,编程速度很快,您可以专注于实际算法。
  • 它不是编译语言。这有两个优点:学生不需要处理编译器,学生可以直接在控制台中测试内容,而无需编译,重新启动和重新运行程序。相关地,调试更容易。
  • 几乎所有内容都有易于使用的库。
  • 您无需学习其他脚本语言,例如Shell脚本,Make,Gnuplot等,所有这些都可以通过Python完成。
  • 有很多很好的教程(免费)。

缺点:

  • 它没有被编译。因此,在某些与计算物理学有关的情况下,Python程序可能比编译程序慢得多。但是,在其他情况下,库(尤其是Numpy)可以产生可比的性能。使用Python获得良好性能的另一种方法是用另一种语言(如C¹)编写相关的代码段。显然,您需要为此学习这种语言,但是可以稍后再做,而您学习Python的时间也不会浪费。
  • 教数字表示,内存管理,数据类型及其陷阱之类的细节比较困难,因为它们有些模糊。

C / C ++

好处:

  • 它是经过编译的,因此更容易产生有效的代码。
  • 您直接处理数字表示,内存管理和数据类型,因此讲授这些方法更直观-您的学生将更接近计算机中的实际情况。
  • 基本上所有的库都有,但是理解和使用库需要一些工作。
  • C / C ++中有相当数量的现有代码,因此,如果学生想使用该代码,则需要学习该语言。
  • 如果您已经了解C / C ++,则可以非常快速地学习Python(例如)。

缺点:

  • 它已编译,您的学生必须处理编译器,预处理器,标头等。即使在学期末,您会惊讶于有多少学生在这一步失败了。
  • 它也太慢学习,并且需要更长的时间来生成工作代码。
  • 在教学和编程中,处理诸如输入和输出之类的边际事物都需要花费一些时间。在C ++中,输入和输出还有额外的语法。
  • 编译器和操作系统的依存关系。
  • 您必须处理C / C ++的混乱。
  • 由于具有大量的语法功能,因此读取他人的代码(尤其是C ++)可能非常困难。

C ++相对于C的主要优点(类,模板)与您的课程无关,而仅与较大的项目相关。因此,我会选择两者中的C,因为它更为简洁。

其他

其他语言的一些评论:

  • Fortran:许多组织仍在使用它,并且有很多旧代码,但是您无法绕过旧标准及其巨大的局限性和陷阱(很多人仍在使用Fortran77。)而且,要在互联网上找到教程,帮助等会更加困难。
  • Matlab / Mathematica:专有软件的所有问题。尤其要考虑到您的学生很可能与无法使用该软件以及随之而来的问题的人们进行合作。
  • Cuda:如果性能很重要,这仅与某些问题有关。而且,毕竟我知道,您也不想以这种方式学习编程。

¹这至少是我们小组中的标准工作流程。


非常准确的答案
阿夫南·巴希尔

1
我还想说Python的一项未提及的好处是,有许多科学发行版(Anaconda / Enthought / PythonXY / SAGE)确实使将每个人都放在同一计算页面上的过程变得非常顺利。而且,甚至更酷的是基于Web的方法(Wakari和SAGE),它们通过浏览器(即安装了0的软件)提供所有功能。教学本科生c ++或Fortran将导致与编译器争夺时间的浪费比在代码速度上获得的时间更多。
meawoppl 2014年

python中有一个惊人的生态系统,可用于计算物理。Numpy,scipy提供基本的基础架构,mayavi,tvtk用于可视化。Python在科学计算社区中已经相当成熟。我确实在生产中使用C ++,但是无论使用什么痛苦。
赛文卡2014年

@meawoppl:“教学本科生c ++或Fortran将会比使用代码速度获得更多的时间浪费在编译器上。” –重要的不是课程练习的代码速度(无论哪种方式,程序都会非常快,除非专门进行了练习,否则就不会这么做),而是针对现实生活或类似生活编写的程序的代码速度。而且有些东西仅靠Python无法有效完成。
Wrzlprmft 2014年

1
我想说CUDA对于通用课程来说是不可能的,因为它需要的并不是所有人都拥有的硬件。而且,如果只有一台没有它的笔记本电脑,几乎没有办法安装它。
Davidmh 2014年

22

在2014年,我会说Python。在2017年,我全心全意地相信教给大学生的语言是朱莉娅。

教学总是要权衡。一方面,您想选择足够简单且易于掌握的内容。但是,第二,您想教一些具有持久力的东西,即可以与您一起成长的东西。常见的动态语言(Python / MATLAB / R)由于不存在样板代码且易于打开解释器和吐出代码而容易陷入第一类,而C / C ++ / Fortran则属于第二类当今世界上高性能的核心软件所使用的语言。

但是,使用一种无​​法完全捕捉另一种类别的语言存在一些问题。当使用Python之类的语言时,它很好地抽象了类型和整数溢出之类的东西。这对于上学期的第一学期课程的教学是很好的,但是当您想深入研究事物的实际运行方式时,Python的语言与底层金属之间的距离太远了,无法成为一种好的教学工具。但是C / C ++ / Fortran(或Java ...我首先学习过Java ...)都具有很高的启动成本,因此最难学习的就是如何设置标头并进行main编译,这分散了实际学习程序的注意力。

输入朱莉娅。首次使用Julia时,您可以抽象出类型的整个概念,并像MATLAB或Python一样使用它。但是,当您想了解更多信息时,该语言就存在一个“兔子洞”。由于它实际上是基于类型系统+ LLVM上的多个调度的抽象层,因此它实质上是“一种编写静态编译代码的简便方法”(并且类型稳定的函数实际上可以静态编译)。这意味着C / C ++的详细信息也可以访问。您可以学习如何在不使用样板代码的情况下编写简单的循环和函数,然后深入研究函数指针。Julia的元编程功能使您可以直接访问AST,并且其中的宏显示了编译链的每个部分。另外,作为Lisp,它适用于函数式编程样式。而且它具有很多并行计算功能。在Julia中,诸如参数化类型和类型稳定性之类的想法是相当独特且深刻的。

如果您想自己学习编程语言,则可以通过@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中实现的,因此知道Julia的人便可以通过识别矩阵子类型并在可能的情况下进行专门化(回溯至高斯消去)来学习算法及其工作方式。由于Julia的代码是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年底),但语言细节还不太确定。而且,您(可能是Julia的一门课程的潜在老师)可能自己也没有太多的语言经验。但是,这些问题会随着时间的流逝而消失,而我上面提到的Julia的好处则是语言本身的核心。


不知道使用一点用过的语言是否有意义,因为语法知识可能会丢失,并且不能保证学生将学习几种语言。也许从这样的角度来看,python仍然是一个不错的选择。
Xavier Combelle'7

1
这就是为什么我以前不会说Julia的原因,但是既然它很普遍了,您不妨使用它。
克里斯·拉卡卡斯

我认为朱莉娅还太新。在行业中,应该期望学生了解Python,C ++,(ew)MATLAB和R。我认为,作为第二语言或第三语言来学习,作为一种丰富的体验会更好。学生不太可能在不久的将来再次使用Julia。
Mateen Ulhaq '17

2
学生应该学习可转移的技能,而不是复制和粘贴的模板。从这个意义上讲,Python / MATLAB / R距离计算机太远了,不能作为最简单的编程工具之外的一个好的教学工具,但是C ++太低了,不能成为一个好的教学工具。当然,如果您打算像在数值分析课程中那样使用某种语言,请执行您将要使用的操作,因为该课程与编程无关。但是,如果是关于编程概念的,Julia几乎是唯一在设计中实际上包含大多数概念的简单语言。
克里斯·拉卡卡斯

2

作为一个不太被忽视的本科生,并假设您不在CS系任教,我认为将学生介绍给使用C,C ++或Fortran之类的计算机程序(或天生禁忌)会是一场灾难。 CUDA),尽管其他人指出它们可能是科学计算中的现状。

如果您希望教学生科学计算并将其介绍给同一课程的编程人员,那么我敢打赌,除非您坚持使用像matlab或python这样的解释型语言,否则一个学期的学习内容将太多。根据我的经验,大多数本科生科学计算课程都是以这两种方式之一进行授课,而python每天作为生产级语言变得越来越有用,因此它仍然具有一定的实用性(我的意思是不只是教授编程基础知识。

只是我的两分钱。


4
灾难这个词太强了,无法用来形容教授C,C ++或Fortran的学生。这些语言(C,C ++,Fortran或Python)中的任何一种都可以根据您的编程方式来教授编程和科学计算。
比尔·巴特

1
根据我在CS部门(C ++)上的一门课程以及天文学家(Fortran 77)的一门课程的经验,与python相比,对于全新的程序员(segfaults与exception),C / C ++ / Fortran没有提供足够的帮助。使用C / C ++ / Fortran可能意味着学习如何使用调试器(或使用IDE),而python可以自己使用。
James Tocknell 2014年

0

如果您想解决超级计算机上的大问题,则C,C ++和Fortran(未按特定顺序列出)是用于计算数学/物理的三种主要编程语言。我认为CUDA被认为是与其他语言一起用于加速GPU计算的库。Matlab和python对于运行输出诊断和创建原型模型非常有用。它们也更容易学习,对于您想了解算法而不是学习如何编程的课程来说可能会更好。

因此,如果您的课程纯粹是关于编程的,那么我会选择C ++,或者,如果这是学生第一次编程,则选择Python。这两种语言在科学计算领域之外都具有很高的实用性。如果本课程的重点是学习解决基于物理问题的算法,那么我认为Matlab无疑是赢家。


0

简短:考虑到科学计算本身就是复杂的。您是否真的想让编程语言发挥作用?

数学使用抽象来解决直觉无法解决的问题。因此,概念倾向于抽象。这就是为什么理解要封装哪些概念并不容易的原因。在科学计算中,像“动物”,“车辆”这样的类的常用示例几乎没有用。对于面向对象的编程来说确实如此,但是我相信在计算机上重现抽象概念在命令式编程中也不是小事。

这就是为什么我认为在这里我们要进行两种不同的努力:一方面是编程,另一方面是科学计算。在本科阶段,学生来自不同背景,您可能最终会同时教两种不同的事物。

如果您的目标是教授科学计算,我认为这已经足够困难了。编程语言还有一个额外的障碍(我们都同意C ++需要培训)会使很多学生失去动力,这就是为什么我建议使用python的原因。

如果您的课程是“ SC入门”,我相信python具有最佳的结果/努力比率。

PS:现在我们有相当不错的计算机,我们真的不需要在本科阶段寻求效率。


关于您的PS:为什么成绩只对大学生不重要?对于表现很重要的大学生来说,很容易构思任务,除了学习生活中的任务不是真正学习的任务,而是现实生活中的任务。此外,计算机的速度可能已经提高,但我们的期望也是如此。
Wrzlprmft

对不起,我太敏锐了。我用“在研究代码优化然后再使用编译语言之前,学生可以使用解释语言运行令人满意的大型应用程序”来重述一下。
Nicola Cavallini 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.