本文转载自公众号“读芯术”(ID:AI_Discovery)。
许多高级开发人员表示,他们发现使用动态类型的语言令人头疼。下面的响应收集了大部分拍手。
“对不起,什么?动态类型的语言比静态类型的语言容易出错吗?抱歉,但是不是我21年的软件开发生涯。”
—拉斯姆斯·舒尔茨(Rasmus Schultz) |
遵循此答案,我决定汇总使高级开发人员避开动态键入语言的主要原因,并在此处列出这些理由以消除误解。
为了更好地解决此问题,由于Python的迅猛发展,我们将以Python作为动态类型语言的示例。
动态类型
在这种情况下键入与击键无关。这个词是从数据类型派生的。
在编程方面,许多类型的类(例如强类型和鸭子类型)都可以发挥作用。但是,我们将自己限制为最常见的几个:
- 动态类型
- 静态类型
动态类型是在运行时标记类型错误的情况。也就是说,也不必像Python,Ruby和JavaScript那样显式声明数据类型。
与动态类型相反,静态类型是在编译期间报告类型错误和显式声明数据类型的报告。C,C ++和Java就是这种情况。
一般来说,关于Python和编程语言的有趣之处在于,它们的某些优点还是缺点。
动态类型设置为通过隐式数据类型声明删除一些代码行来简化编码过程。但是,此功能有很大的陷阱。
为了让您当场,请考虑以下Python代码示例:
- max_number = 12
- my_list = []
- for i in range(1, 5):
- max_numbre = 2 * (max_number * i)
- my_list.append(max_number)
- print(my_list)
输出:
- [12, 12, 12, 12]
在上面的示例中,我们要对变量max_number执行计算并将结果存储在列表中。但是,我们可以看到这一切都没有发生,并且结果是错误的。这是因为在for循环中,我们拼错了max_number,导致创建了另一个名为max_numbre的变量。
任何人都可能犯此类错误,尤其是在工作压力很大的人身上。
现在说您正在编写大量代码。您将需要更加注意下一步您的手指应点击哪些键。否则,跟踪代码中的错误可能会成为噩梦,从而导致可维护性问题。
但是,在像C ++这样的静态类型语言中,必须在使用前声明变量。而且您一定要进行执行前分析,以确保您的变量类型协调一致。由于可以更好地控制变量,因此最终可以提高安全性。
静态类型的重要性的一个例子是2009年与三名Twitter开发人员的对话,讨论了公司为何决定合并静态类型的语言Scala。
全局解释锁
高级开发人员会对性能感到惊讶的一件事是性能。
与初级人员不同,初级人员需要处理几行代码,维护和编写健壮的生产代码(通常为数百行或数千行代码),是由经验丰富的开发人员承担的。因此,拥有高效的编程语言可能会变得毫无疑问。
就是说,由于全局解释器锁(GIL)禁止充分利用计算机的资源,因此它是编程语言(如Python和MRI Ruby)的性能瓶颈。GIL损害的资源是CPU线程。
不过,不使用GIL的编程语言会充分利用CPU的功能。因此已知它们支持并行计算。
并行计算无非就是让所有线程同时运行。由于需要处理的天文数据数量众多,因此这种类型的计算现在比以往任何时候都更加重要。
下图是一个并行计算的示例:
> Example of all CPU threads running. Diagram created by the author in diagram.net
可以合理地假设,在相同的CPU时钟速度下,计算机拥有的线程越多,程序运行速度就越快。
但是,GIL的出现终结了并行计算。
GIL是一种锁,一次仅允许一个线程使用GIL。线程的选择遵循排队方式。这意味着,当具有最高优先级的线程正在使用GIL时,其他线程将处于等待状态,直到释放GIL。
最重要的是,用户无法控制线程选择。相反,操作系统是负责线程优先级排序的操作系统。
下图最好地说明了发生的方式:
> GIL effects on the threads. Diagram created by the author in diagram.net
为了解决此问题,许多程序员,或者至少是聪明的程序员,尝试使用例如Python的多线程模块在线程之间手动拆分进程,以期获得更好的性能。他们最终最终会获得更差的性能。
尽管结果似乎很奇怪,但它是计算机科学,而不是计算机推测。如果您对问题进行更深入的研究,那么一切都应该放到位。
尽管Python的核心开发团队完全意识到了这个问题,但很难摆脱GIL,因为它是Python许多细节的骨干,例如内存管理和C扩展(仅举几例)。
Python的正式作者Guido van Rossum表示,他对Python是否会支持并行计算并不充满信心,因为这最终是该语言的设计方式。
但是,诸如C ++之类的静态类型语言不受GIL的限制。这使得它们在比较中效率很高。
空格敏感性
使用一种会因空格错位和缺失而标记错误的编程语言,可能并不是每个人的功劳。这些空格是空格,制表符,换行,返回或换页。例如,与C不同,Python确实对空格敏感。
我们将通过以下C和Python代码之间的比较来证明这一点。
Python版本:
- i = 50
- if i % 2 == 0:
- print("inside if statement") print("i is even")
输出:
- print("inside if statement") print("i is even")
- ^
- SyntaxError: invalid syntax
C版:
- #include<stdio.h>int main(void)
- {int i = 50;if (i % 2 == 0)
- {printf("inside if statement\n");printf("i is even\n");}}
输出:
- ~/ $ ./test1
- inside if statement
- i is even
与抵制混乱的代码结构并最终得到正确输出的C版本不同,Python生成的语法错误最初是由语句放置错误引起的。因此,有人会说Python不如C ++或原始C健壮。
具有讽刺意味的是,尽管许多专业程序员认为空白敏感性很烦人,但许多Pythonista人士认为处理空白问题比最后进行列追逐要好。
最后,在处理大型代码块时,空格敏感性问题令人讨厌。但是,如果在团队中灌输良好的编码习惯,则可以轻松解决空白敏感性问题。
向后兼容
不支持向后兼容性意味着旧版本的Python代码在新版本下可能无法工作。换句话说,绝对需要查找新版本中发生的语法更改,并相应地重写其代码。
当向后兼容性成为一个严重问题时,一个很好的例子是第一次从Python 2过渡到3。
Python核心开发团队认为,人们将Python 2代码转换为Python 3不会有问题。但是他们错了。
Python的作者本人在讲话时承认了这一点:
“我们低估了多少人已经编写了大量的Python代码,然后基本上忘记了它是如何工作的。因此,他们不是很擅长升级它。我们意识到那里存在问题。” |
关于该问题的裁决是延长了Python 2.7的寿命。
总结
编程语言一直是热门话题,因此不能将其视为对与错。至少有一些原因使他们偏爱另一种语言。
通常,每种通用编程语言都适合特定的人群。Python的官方作者说:
“学习使用Python编程比学习使用Java或Swift编程容易得多。对于学习计算机科学的专业软件开发人员来说,Java和Swift是很棒的编程语言。然后开始为一家软件开发公司工作。但是Python可以教给初中的孩子。” |
除此之外,最理想的情况是拥有一种可以结合C ++和Python优点的编程语言。
原文链接:
https://medium.com/better-programming/why-some-senior-developers-dont-like-python-974c5361fff2