此为历史版本和 IPFS 入口查阅区,回到作品页
qwerty
IPFS 指纹 这是什么

作品指纹

为什么C++不是一门好的初学者语言

qwerty
·

本文意在论证,C++并不适合于初学者,指出其原因,并以此劝诫计划以C++入门的初学者转向其他编程语言。

首先对于初学者来说,良好的学习反馈是非常必要的。而初学者在使用C++时,却首先需要了解众多关于编译器和操作系统知识,而学习这些知识的目的却仅仅是为了编译一段代码,这对于初学者来说并不是很好的反馈,可以说,这会为初学者带来挫败感。相对的,众多使用REPL的脚本语言,比如python和javascript,可以使初学者获得更及时的反馈。

另一方面,C++目前依然没有足够简单得操作图形界面的方法,而某些脚本语言,尤其是javascript,却提供了极其简单的图形化手段。运行于浏览器的javascript可以直接操作DOM,这是目前最方便快捷的图形界面实现方式,否则electron和react native之流也就不会那么流行了。图形界面在给予初学者反馈,激发初学者灵感方面有很重要的作用,更何况浏览器端的javascript还可以激发初学者对于网络的兴趣。

关于反馈,还有一点问题是,错误和异常机制。作为存在“未定义行为”的语言,C++在发生运行期故障时极难以调试,多数情况下运行期故障并不会导致程序立即退出反而某些情况下程序依然会正常退出,但给出难以理解的结果或副作用。这不仅对于初学者,即使对于有一定经验的开发者来说也非常棘手。

此外,大多数C++编译器汇报编译错误的方式经常存在误导性。大多数编译器,比如gcc,面对绝大多数错误时只会给出语法上的错误信息,而这种信息有时并不与真正的错误相关。REPL能够在一定程度上缓解这个问题,而使用更聪明的编译器并能给出更好的的报错的语言,比如rust,也相比C++更适合初学者。(但并不等于rust适合初学者)。

这是一个方面。另一个方面,初学者应尽快掌握关于编程的“数学上的”“抽象的”的知识和技术,而对于细节性,实现相关的“真实世界”问题,则应该等到有一定经验后再去了解。但C++作为高级语言,却存在着极其严重的来自底层的抽象泄漏,虽说这与C++“系统级语言”的定位相关,但这些抽象泄漏,对于初学者来说是不折不扣的灾难。而同时,繁多的高级特性使得C++又不同于纯C这种单纯的“底层语言”,这些高级特性,以及关于这些特性的最佳实践,就连熟练使用C++的编程人员都不一定能够完全掌握。

虽然这暗示着“纯C比C++更适合初学者”,并且也的确是这样:几乎所有自称是基于C++的入门课程,实际上在至少最初一半的时间内都是纯C课程,但纯C课程很容易将学生淹没于具体的实现细节,从而看不到在代码之上的数学,而对初学者来说,这些数学和操作经验同样重要,甚至比操作经验更重要。而这种只注重操作经验而忽视了内涵的教学方法,显然是大量浪费了初学者的时间。


根据我的经验来看,目前来说,相对适合纯萌新的主流编程语言主要有python,javascript/typescript或者ruby这一类脚本语言,但不包括lua,因为lua自始至终都是作为嵌入式语言*的。对于有一定统计学基础的人来说,R和matlab是最适合入门的语言,python也是不错的选择,但我更推荐julia。而haskell这类语言会非常适合数学家的胃口,虽然说还有更硬核的选择,但显然那些并不是面对初学者的。而对于power user来说,C,nim,lua,java,csharp,go,rust等都可以作为C++在某些方面的替代。不过power user大概也是不介意多了解一些门编程语言的。

*嵌入式语言:此处指被嵌入其他程序中的语言。



P.S.如果读者中有CS专业的初学者/新生,并且将要学习Intro或者DataStruct&Alg课程的话,如果有得选,请一定避开in C++课程。

P.S.上一条PS大概才是本文重点。

P.S.虽然我想吐槽那些教新生C++的大学课程很久了,但选择在这个时候发表其实还是因为不想让版面上除了香港就没有任何别的东西。

CC BY-NC-ND 2.0 授权