打算教本科生一门名为“计算机编程入门”的课程。我有点困惑。在计算物理学中,科学家使用C / C ++或Python或Fortran,CUDA等。...现在是时候建立自己的基础了。我应该使用什么?我知道您可以在自己的生活中随时学习新的编程语言,但是对我来说,以后再详细介绍所有基本编程概念和OOP概念是一个明智的选择。
打算教本科生一门名为“计算机编程入门”的课程。我有点困惑。在计算物理学中,科学家使用C / C ++或Python或Fortran,CUDA等。...现在是时候建立自己的基础了。我应该使用什么?我知道您可以在自己的生活中随时学习新的编程语言,但是对我来说,以后再详细介绍所有基本编程概念和OOP概念是一个明智的选择。
Answers:
首先,如果您的本科生和我们一样,并且没有计算机的入门知识,请期望花一些时间教他们如何使用基本知识,例如使用适当的编辑器(即,不是MS Word),命令行等。
我认为答案在某种程度上取决于您将课程重点放在哪里(或您需要教的内容)。例如:计算机内部工作的相关性如何?您是否需要类和其他高级OOP结构?您是否想教他们如何制作高效的程序,或者如果他们根本制作出有效的程序,您会感到高兴吗?同样,不要忘记,您很可能将需要有能力的导师。
但是现在,我已经熟悉了这些语言的优缺点。请注意,这主要是基于我作为计算物理学家的经验,其中一些可能取决于特定领域,工作组,大学等。
我通常建议几乎从一开始就使用Numpy,并且我假设它会在下面使用。
好处:
print
Numpy的savetxt
和loadtxt
,甚至完全覆盖sys.argv
。它可以即时引入,并且不会花费太多编程时间。缺点:
好处:
缺点:
C ++相对于C的主要优点(类,模板)与您的课程无关,而仅与较大的项目相关。因此,我会选择两者中的C,因为它更为简洁。
其他语言的一些评论:
¹这至少是我们小组中的标准工作流程。
在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的好处则是语言本身的核心。
作为一个不太被忽视的本科生,并假设您不在CS系任教,我认为将学生介绍给使用C,C ++或Fortran之类的计算机程序(或天生禁忌)会是一场灾难。 CUDA),尽管其他人指出它们可能是科学计算中的现状。
如果您希望教学生科学计算并将其介绍给同一课程的编程人员,那么我敢打赌,除非您坚持使用像matlab或python这样的解释型语言,否则一个学期的学习内容将太多。根据我的经验,大多数本科生科学计算课程都是以这两种方式之一进行授课,而python每天作为生产级语言变得越来越有用,因此它仍然具有一定的实用性(我的意思是不只是教授编程基础知识。
只是我的两分钱。
简短:考虑到科学计算本身就是复杂的。您是否真的想让编程语言发挥作用?
数学使用抽象来解决直觉无法解决的问题。因此,概念倾向于抽象。这就是为什么理解要封装哪些概念并不容易的原因。在科学计算中,像“动物”,“车辆”这样的类的常用示例几乎没有用。对于面向对象的编程来说确实如此,但是我相信在计算机上重现抽象概念在命令式编程中也不是小事。
这就是为什么我认为在这里我们要进行两种不同的努力:一方面是编程,另一方面是科学计算。在本科阶段,学生来自不同背景,您可能最终会同时教两种不同的事物。
如果您的目标是教授科学计算,我认为这已经足够困难了。编程语言还有一个额外的障碍(我们都同意C ++需要培训)会使很多学生失去动力,这就是为什么我建议使用python的原因。
如果您的课程是“ SC入门”,我相信python具有最佳的结果/努力比率。
PS:现在我们有相当不错的计算机,我们真的不需要在本科阶段寻求效率。