一门语言的复杂程度,是由什么来决定的呢?外网Whiley发表了一篇博文《Language
Complexity?》,文中指出,语言形式上的复杂和语言的复杂程度是两回事,手工输入代码量的减少,并不意味着语言的复杂度就会降低。CSDN对此文进行了编译,全文如下:
有些开发语言很复杂,有些则比较简单……对吗?C++与其他任何语言相比就是一个很好的例子。但是,是什么决定了语言的复杂度呢?
我正在读 Bruce Eckel的关于Scala的文章。它确实是一篇很精彩的文章,我很喜欢它。但有件事却困扰着我,下面这段引用可以很好的概括这件事:
通过上面的代码,你可以看出学习Scala比学习Java简单得多。在输出“Hello,
world!”时,不必再写那令人讨厌的Java形式语句,在Scala中,只需一行语句即可:
println("Hello, world!")
|
不管怎样,从这篇文章中,我对Scala并没有获得同样的感觉。它似乎在说明去掉“public static
void”就可以使一门语言变得简单。然而我不认为一门语言复杂与否与形式语句有多大关系。当然,它减少了“用手打字”劳动量,但这和语言复杂度是完全不同的事情。
依我的看法,如果在一门语言背后有一个清晰的思想模型,那么这门语言就会很容易使用。开发者可以利用它来理解某些结构的产生原因及适用于什么时候。请看下面Bruce对Traits的描述:
我们在使用Traits时也容易产生混淆。Trait和接口很像,不同之处在于Trait可以包含方法的定义,创建新类时可以成为该类的一部分。
|
上面描述并不能帮助我理解Traits到底是什么。问题是:我为什么要用它们?什么时候该用它们?什么时候不该用它们?现在,我不想讨论Traits是(或不是)一个复杂的属性。关键点是:上面的解释并不能让我得出“Traits是简单的”的结论,原因就是它并没有让我了解Traits背后的思维模型。
教学生如何编程,是理解那些难懂概念的好办法。为了让学生确实了解某事,你需要创建一个思维模型。例如,在解释参考/指针时,由方框和箭头组成图可以起到很大的作用。不过,在Java中,也确实有很多棘手的问题:
Subtyping。掌握Subtyping什么时候适用什么时候不适用,确实是一个难点。当然,学生起初可以通过记忆来记住子类型关系,你可以这样解释“如果A继承了B,那么A就是B的子类型”等等。但这并不能帮助构建展示子类型及它所起的作用的思维模型。对于基元,我们有一个很好的经验法则:一个数字类型T1转换为另一数字类型T2,其在精度上没有任何损失(当然,并不是总会这样的)。但是,此时的思维模型是什么呢?好,第一个问题就产生了:为什么不同的类型(比如short类型和int类型)会有不同的范围呢?只有已经理解了数字的二进制表示的同学才能理解这个问题。对于对象而言,你可以通过对比静态模型和动态(换言之:运行时)类型开始讲起,大部分时候,这样比较容易理解的。
动态调度。在一个给定的继承层次结构中,理清在特定的环境中调用了哪个方法,对很多人来说都是一种挑战。这一切都是因为对此很难给出一个精准的规则所造成的(换句话说,你最近有读过关于这个主题的《The Java™
Language
Specification》一书吗?)。为了构建一个思维模型,你需要考虑方法签名,静态类型及动态类型等等。在某一点,情况不会太遭。但是,随后考虑到Generics
和Erasure时,思维模型就开始变得越发复杂了。
接口VS抽象类。这又是别外一个经典。至少也有一个简单的经验法则:使用接口和抽象类仅仅是为了代码重用。但是,这背后的思维模型是什么呢?好,学生通常都会以这个问题开始:为什么只能继承一个类呢?下一步,当你解释多继承会带来很多易犯的错误时,事情就会变得难以掌控了。
我确信,在Java中还有很多其他有趣的例子,我们可以在这里进行讨论。
分享到:
相关推荐
脚本语言的灵活性使得程序员能够快速地编写出解决特定问题的代码,而无需关注底层细节,从而减少了开发时间和复杂度。 脚本语言还支持动态类型,这意味着程序员在编写代码时不需要提前声明变量的类型。这种动态性...
它既保持了静态类型语言的高效性能,又通过简化语法和类型推断,极大地减少了编程的复杂度,非常适合现代软件开发的需要。Go语言还特别注重并发编程,提供了易于理解和使用的并发原语,为大规模并发处理提供了一种新...
通过对这些观点的深入探讨,我们可以更好地理解不同编程语言的设计理念及其在实际开发中的应用价值。这些见解不仅对于软件开发者具有重要意义,也为我们预测未来编程语言的发展趋势提供了宝贵的视角。
本文探讨了一个有趣且富有挑战性的议题——计算机程序设计语言的发展趋势及其可能达到的终点,并提出一个引人深思的观点:面向对象编程可能是程序设计语言发展的最终阶段。文章进一步阐述了这一观点背后的逻辑,并...
- 错误观点:认为使用面向对象语言可以直接提高开发效率。 - 解析:虽然面向对象语言提供了许多便利的特性,但真正提高效率的是合理的软件架构设计和高效的开发流程。 4. **误区四:类的定义** - 错误观点:...
《软件开发入门》这篇文章,深入浅出地阐述了软件开发领域的核心观点与实践策略,尤其强调了“踏实”学习的重要性。本文将围绕这一主题,详细解析软件开发中的关键知识点,旨在为初学者提供具有实际操作性的指导。 ...
最后,参加国际编程社区或论坛,如Reddit的r/learnprogramming或Stack Exchange网络,使用英语沟通能让你接触到更多不同的观点和解决方案。 总的来说,编程英语单词是程序员必备的知识,它们构成了编程语言的基础,...
《图灵:关于算法和Python开发的另一种观点》是一本深度探讨算法与Python编程的书籍,旨在提供一个具有调试功能的跨平台开发环境。在这个环境中,开发者可以更加直观地理解和实现算法,同时利用Python的强大功能进行...
本文档主要围绕Java语言中数据结构的基础知识进行了整理,涉及算法的基本概念、特性、设计要求、时间复杂度,以及线性表的顺序存储结构和Java实现。 首先,算法被定义为解决特定问题的一系列操作指令的有限序列。一...
本书会深入剖析这些算法的工作原理,提供详细的实现代码,并分析它们的时间复杂度和空间复杂度,帮助读者理解算法效率的重要性。 此外,书中还会涉及一些高级主题,如动态规划、贪心算法、回溯法等,这些都是解决...
包括数据结构(如二叉树)、算法分析(时间复杂度和空间复杂度)、编程语言(如C语言的switch-case语句)、办公软件的使用(如PowerPoint和Word)、数据库设计(如Access数据库的特性)、网页浏览(如主页按钮的功能...
因此,他决定将注意力转移到硬件上,并试图通过创造一种既能解决软件又能简化硬件问题的语言来改善整体的开发体验。Forth语言的设计哲学强调简洁性和高效性,旨在减少软件与硬件结合时的复杂度。 #### 三、Forth...
软件的规模和复杂度不断提高,抽象程度也日趋加深,从机器语言到汇编语言,再到高级语言,最终发展到开发框架的使用。 接下来,文件强调了软件体系结构定义的重要性。软件体系结构被认为是程序或计算系统的结构,...