阅读更多

6顶
0踩

编程语言
静态类型语言中,在声明变量时已经指定了数据类型和表示方法。动态类型语言是在运行期间检查数据的类型,不得不保持描述变量值的实际类型标记,程序在每次操作变量时,需要执行数据依赖分支。

间接分支(Indirect branch)数据局部性(data locality)对于运行时的性能是致命的。

这就是动态语言的JIT编译器基准测试要强调near-C的内循环速度,以及避免大的数据结构和数据处理问题的原因。

我也希望像Python这样的动态类型语言可以变快。我试过用Python来进行传统的服务器编程——“系统语言”领域——但是效果真的不好,我现在考虑用Java重写一个服务器。

因此,我花时间思考如何真正静态地编译Python。毕竟,那是我梦寐以求的编程语言!但当我思考如何将动态类型代码与静态编译Python结合起来时,我遇到了数据变慢的问题:

在动态语言中,通常所有数组中的元素(或其他数据结构)类型各不相同,所以有不同的表示值。因此,这些值都必须被单独存放为堆,而不是顺序地存为数组。这意味着如果对不相邻的内存执行数据依赖分支,则对缓存有更高的要求。

也有一些聪明的技巧,使用变量中的特殊bit,将一些原生类型(像整型)打包成一个类型,类似于指针,但这要求寄存器在操作过程中进行跟踪,会增加开销。

还有一些方法,比如使用JIT编译热路径(hot path)时,如果你直接插入没有标类型的值,而不是在堆里分别标记类型, 那么与JIT编译过的代码的互操作性会降低,如果其他代码改变了数组中的一个值的类型,就会出现非常严重的后果。

我一直在思考,在Python语言中,什么是静态的,什么不是。通过SSTA(统计静态分析)和逃逸分析可以判断,大量正常的程序是静态的。Paul Biggar给了我信心证实我的猜测是正确的,我的Python代码90%都是静态的。

有人会问,那另外的10%呢?通常情况下,我可以让所有的都是静态的,或者想象它被参数类型的限制范围特殊化了。除了Python语言的标准模式,其他模式都由Web服务器分配给基于HTTP方法(如果收到GET请求就称为“get”方法)的Web处理器,这也需要程序员依照switch语句(如elifs的长链)来进行修改。

Robert Harper对“从单一类型静态语言方面,动态语言是如何实现的”这个问题作出了很好的解释,下面这句话是我希望他能进一步进行解释的:
引用
我深知“编译器可以优化它”,至少在某些情况下。

我确信他说的“某些情况”是指遇到non-escaping的情况,因为和后面的执行代码进行交互时,你应该要能够确定escape的类型。

一些动态调用是无污染的——编译器可以从代码检查中发现一些变量(或方法)是动态的,但动态的代码不表示其他变量也是动态的,因为不同类型的变量、方法、成员的存在或缺失都被限制成了可识别的类型(或null)。

但通常编译器是无法从代码检查中发现这些情况的,如果无法追踪到执行的情况,就无法知道代码如何依赖以及如何改变其他静态变量的值。因此,工作中断,所有变量再次变为动态的。

我一直在努力寻找把Monkey Patch(不改变初始源代码来扩展和修改动态语言运行代码的方法)、Set(属性或索引器元素赋值的“访问器”方法)、SetAttr(SetAttr 语句可以为一个文件设置属性信息)等解决办法移植到我虚构的Python编译器里,因为类型标记严重地降低了运行性能。

快速的数据结构对于内存访问模式和缓存位置是非常重要的,还可以减少分支和对这些分支的标记工作。

Jonathan Shapiro的文章Programming Language Challenges in Systems Codes非常棒,我很赞同文中的观点。

英文原文:Why Dynamic Programming Languages Are Slow
6
0
评论 共 1 条 请登录后发表评论
1 楼 fjjiaboming 2012-03-23 19:23
好!
好!

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 为什么Python相较于其它主流语言运行要慢?

    Python现在越来越火,已经迅速扩张到了包括DevOps、数据科学、Web开发、信息安全等各个领域...并没有一个放之四海而皆准的标准,因为具体结果很大程度上取决于运行的程序类型,而语言基准测试Computer Language Ben...

  • 为什么Python这么慢?

    Python语言近年来人气爆棚。它广泛应用于网络开发运营,数据科学,网络开发,以及网络安全问题中。 然而,Python在速度上完全没有优势可言。 在速度上,Java如何同C,C++,C#或者Python相比较?答案几乎完全取决于...

  • [GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及

    作为网络安全初学者,会遇到采用Go语言开发的恶意样本。因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识;另一方面是分享与读者,希望大家一起进步。这系列文章入门部分将参考“尚硅谷...

  • 经典面试题:Python 为什么 这么慢?

    来源:大数据文摘编译:jojo、Hope、张秋玥、CoolBoyPython语言近年来人气爆棚。它广泛应用于网络开发运营,数据科学,网络开发,以及网络安全问题中。然而,Python在速度...

  • 强类型和弱类型的语言有什么区别

    强类型语言  强类型语言也称为强类型定义语言。是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。  java、.NET、C++等都是强制类型定义的。也就是说,一旦一个变量被...

  • Java--强类型语言 & 弱类型语言 & 数据类型

    1. 强类型语言 & 弱类型语言 Java是一种强类型语言,每个变量都必须声明其类型。 1.1 强类型语言 强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型...

  • 为什么是 Dart ?

    为什么选择Dart语言,这是很多人的疑问,让我们先来看看,最近Dart 编程语言的发展情况: 2022年2月TIOBE编程语言排行榜: 很遗憾,Dart在前20名之外,但好消息是它还处于前30名之内! 在这个排行榜中,值得我们...

  • 编译型语言和解释型语言【附 动(静)态语言 、动(静)态类型语言、强(弱)类型语言】

    解释型语言与编译型语言的了解和思考

  • 强类型语言与弱类型语言

    Perl and PHP 是动态语言,但也是弱类型语言。 强类型语言在没有强制类型转化前,不允许两种不同类型的变量相互操作。Java、C# 和 Python 等都是强类型语言。 使用哪种语言还是要按需而定。编写简单小应用,...

  • 当下最实用计算机编程语言,目前最流行的计算机编程语言是什么?

    在过去的几十年间,大量的程序设计语言被发明、被取代、被修改或组合在一起。尽管人们多次试图创造一种通用的程序设计语言,却没有一次尝试是成功的。之所以有那么多种不同的编程语言存在的原因是,编写程序的初衷...

  • 学妹深夜语音:那么多编程语言,我该选什么?

    我们时常听别人说,Java最流行,php是最好的语言,入门应该从C开始,满满的小纠结,这么大一堆语言无从入手,初期选择的时候难以决定,到底那个工资高,那个比较好找工作,那个比较好学等等问题困扰在选择期的小白...

  • 为什么Elasticsearch查询变得这么慢了?

    0、引言 Elasticsearch社区中经常看到慢查询问题:“你能帮我看看...每当我们得到这些类型的问题时,我们首先要深入研究两个主要方面: 配置维度 - 查看当前系统资源和默认Elasticsearch选项。 开发维度 ...

  • 动态语言、静态语言、脚本语言、解释型语言、编译型语言

    动态语言是在运行时才确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。 例如PHP、ASP、Python、SQL、JavaScript、Unix Shell等等。 动态语言的优势:思维不受束缚,可以...

  • 为什么Java永远比C++慢?

    为什么Java永远比C++慢?  耍过Java程序,或者用Java码过程序的人都晓得,Java要比用C++写成的原生程序要慢。这是咱用Java时已经承认的事实。   不过,很多人想要说服我们说这只不过是暂时的,他们说Java从

  • 马上就2023年了,Go语言成了吗?

    从求职市场的大环境看,海内外大厂都有Go的开发缺口,单拿鹅厂来说,2021年Go语言首次超过C++,成为鹅厂最热门...对于动态语言开发来说,它拥有比静态语言更大的灵活性和表达能力,开发难度低,但运行速度也相对较低。

  • 强类型语言和弱类型语言

    我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器...

  • Java语言的动态性-invokedynamic

    JVM字节码指令集一直比较稳定,一直到JAVA7中才增加了一个invokedynamic指令,这是JAVA为了实现『动态类型语言』支持而做的一种改进。但是在JAVA7中并没有提供直接生成invokedynamic指令的方法,需要借助ASM这种底层...

  • 函数式编程与面向对象编程[2]: 静态类型语言的表达力 静态类型语言与动态类型语言...

    函数式编程与面向对象编程[2]: 静态类型语言的表达力 静态类型语言与动态类型语言 之剑 2016.5.3 21:43:20 像Java或者C#这样强类型的准静态语言在实现复杂的业务逻辑、开发大型商业系统、以及那些生命周期很长的...

  • 为什么 C++ 比 Python 快?从编译器和解释器的角度分析差异

    本文从 C++ 和 Python 的运行过程入手,从编译器和解释器的差异分析了为什么 C++ 会比 Python 的运行速度快。在现代的企业场景中,追求极致代码运算效率的场景通常还是使用的 C++,比如服务器端编程、游戏编程等。.....

  • 动态语言会淘汰静态语言吗?

    上一篇博客动态语言会导致开发质量下降吗?...进一步,这里我简单的说一下,我所认识到的,静态语言相对的优越性,和存在意义。这里首先我表达一下我一贯的观点:计算机不会魔法。具体来说两方面,一是离机器

Global site tag (gtag.js) - Google Analytics