简短的回答:不,因为图灵等效。
长答案:这个家伙真是个巨魔。虽然类型系统确实“将您限制为一个子集”,但根据定义,该子集之外的内容是无效的。
您可以使用任何图灵完备的编程语言(这是为通用编程设计的语言,再加上其他很多都不具备的功能)可以做的一切;要清除的门槛非常低,并且有几个示例说明系统正在成为图灵-您可以使用其他任何图灵完备的编程语言来完成此操作。这称为“图灵等效”,仅表示其确切含义。重要的是,这并不意味着您可以用另一种语言轻松完成另一件事-有人认为,这首先就是创建新编程语言的全部意义:为您提供一种更好的方式来完成某些任务现有语言无法吸收的东西。
例如,可以通过将所有变量,参数和返回值声明为基本Object
类型,然后使用反射来访问其中的特定数据,从而在静态OO类型系统的顶部上模拟动态类型系统。您会发现,使用动态语言几乎无法执行任何操作,而使用静态语言则无法执行任何操作。但是,这样做当然会很麻烦。
引号中的家伙是正确的,静态类型限制了您可以执行的操作,但这是一个重要功能,而不是问题。道路上的线路限制了您在汽车上的工作能力,但是您发现它们对我们有限制还是有用?(我知道我不想在繁忙,复杂的道路上开车,那里没有任何东西告诉汽车沿相反的方向行驶并保持在一边,而不会越过我的驾驶位置!)通过制定规则来清楚地描述出什么被认为是无效行为,并确保不会发生这种情况,您可以大大减少发生令人讨厌的崩溃的机会。
另外,他在误导对方。这并不是说“您要编写的所有有趣程序都将作为类型来工作”,而是“您要编写的所有有趣程序都将需要类型”。一旦达到某种程度的复杂性,就很难在没有类型系统来保持一致的情况下维护代码库,这有两个原因。
首先,因为没有类型注释的代码很难阅读。考虑以下Python:
def sendData(self, value):
self.connection.send(serialize(value.someProperty))
您希望连接另一端的系统收到的数据看起来像什么?而且,如果收到的东西看起来完全不对,您如何确定发生了什么?
一切都取决于的结构value.someProperty
。但是它看起来像什么?好问题!叫sendData()
什么 它过去了什么?该变量是什么样的?它从哪里来的?如果它不是本地的,则必须追溯整个历史,value
以跟踪正在发生的事情。也许您正在传递也具有someProperty
属性的其他东西,但是它没有按照您的想象做?
现在,让我们用类型注释来查看它,就像您在Boo语言中可能会看到的那样,它使用非常相似的语法,但是是静态类型的:
def SendData(value as MyDataType):
self.Connection.Send(Serialize(value.SomeProperty))
如果出了什么问题,突然之间您的调试工作就容易了一个数量级:查找MyDataType
!的定义。另外,由于传递了一些不兼容的类型而该属性也具有相同名称的属性而导致不良行为的可能性突然变为零,这是因为类型系统不会让您犯该错误。
第二个原因建立在第一个原因上:在一个大型而复杂的项目中,您很可能拥有多个贡献者。(如果不是,您将花费很长的时间自己构建它,这基本上是同一回事。如果您不相信我,请尝试阅读3年前编写的代码!)这意味着您不知道那是什么遍历编写代码时几乎编写任何给定部分的人的头,因为您不在那儿,或者不记得它是很久以前的代码了。具有类型声明确实可以帮助您了解代码的意图!
在报价中,喜欢引用的人经常将静态类型的好处误解为“帮助编译器”或“所有关于效率”,在这个世界中,几乎无限的硬件资源与过去的每一年越来越不相关。但是,正如我所展示的,尽管这些好处确实存在,但主要的好处在于人为因素,尤其是代码的可读性和可维护性。(不过,提高效率肯定是一个不错的奖励!)