一门语言的复杂程度,是由什么来决定的呢?外网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中还有很多其他有趣的例子,我们可以在这里进行讨论。
分享到:
相关推荐
为什么 Xgboost中树的叶节点得分可以用来衡量树的复杂度? - 知乎1
我们在第 12 节《排序(下)》那里讲过,如何利用递推公式,求解归并排序、快速排序的时间复杂度,但是,有些情况,比如快排的平均时间复杂度的分析,用递推公式的话,
Java 大素数 判断 低时间复杂度.
实验室师兄写的代码,使用灰度共生矩阵计算图像的纹理复杂度,然后可以用来衡量嵌入水印的多少。
1,什么是时间复杂度? 一个问题的规模是n,解决这一问题所需算法所需要的时间是n的一个函数T(n),则T(n)称为这一算法的时间复杂度 2,关于时间复杂度: 时间复杂度是一个函数,它定性描述了该算法的运行时间。这是...
二、什么是时间复杂度? 三、计算时间复杂度? 一、得出运行时间的函数 二、对函数进行简化 四、时间复杂度排行 五、不同时间复杂度举例 1、O(1) 2、O(n^2) 3、O(logn) 一、代码消耗的的时间单位分析 1、...
考核重点 基本概念与基础知识 基本算法及其运用 难度不大,但要求基础扎实 算法设计的关键是对于基本算法的理解和灵活使用 ...什么是算法的时间复杂度?如何计算? 什么是算法的空间复杂度?如何计算?
算法 时间复杂度 空间复杂度 经典算法 时间复杂度 空间复杂度 经典算法 时间复杂度 空间复杂度 经典
圈复杂度插件
是Googel黑板报数学之美作者吴军,发表在电子学报上的名为“汉语信息熵和语言模型的复杂度”的文章
2.1.8 冒泡排序算法的时间复杂度是什么?
计算Lempel-Ziv 复杂度,用于计算相对复杂度等
根据sonar分析结果,获取圈复杂度和方法来计算最大平均圈复杂度。
可以方便的计算信号或时间序列的复杂度,用于信号处理,特征提取等方面
数据结构时间复杂度
算法设计目标与时间复杂度与空间复杂度.ppt
复杂度资料整理,复杂度的定义说明和三种计算方式,一些范例
一个算法的复杂度如何判断,各种排序算法的复杂度解析。
软件复杂度概述,包括有关的计算.