python中的字节码对象初探

一.代码对象

每个初学python的人都会认为python是一种解释型语言,这个不能说错。但是python并不是真的对执行的python代码的每一行进行解释,虽然我们有一个所谓的“解释器”。实际上对于运行的文件,python会使用虚拟机对运行的文件编译成字节码,然后虚拟机会对产生的字节码进行解释。而编译语言则会编译出适用于x86、ARM等的指令2(作用于真正的机器)的语言。“解释性”语言不是根本就没有编译器,而只编译成一个中间表示,比如字节码。字节码的指令不是作用于任何硬件的,而是虚拟机。

其实更准确的说法应该是“python是一种动态语言”。而这种动态性也是难以优化Python的原因之一:在编译代码对象和生成字节码的时候,你并不知道会有怎样的结果。编译器根本不关心结果如何。由于不用声明类型信息,几乎每个指令都要像INVOKE_ARBITRARY_METHOD一样来执行。尽管“编译”和“解释”的定义在通常情况下是很难区分的,但是对于Python来说却很简单。编译工作就是生成代码对象,包括字节码。而翻译的工作就是翻译字节码,执行指令。Python保持“动态”特性的原因之一就是同样的字节码能够有不同的作用。更普遍的说法就是Python解释器的工作比编译器的多一些。

Read More

python中的字节码对象初探

一、虚拟机执行环境

在上一篇关于字节码对象的文章中,展示了python源码被编译为字节码的结果。得到的PyCodeObject只是静态分析得到的对象。接下来,Python虚拟机会接管该对象并一次读取每一行字节码并在上下文环境中执行字节码序列。我们一直把“名字空间”和“上下文环境”挂在嘴边,这两者却不是完全等价的。名字空间是上下文环境中的关键数据,但却不是全部,在实现一个简单的解释器的练手项目中的解释器基本就是围绕着名字空间完成的。但是我们知道名字空间是动态的叠加的,怎么叠加呢?就是通过维护环境栈帧的链表,因此,所谓上下文环境,最少还需要维护一个指针,指向上一个栈帧。这实际上是在模拟真实机器上的栈帧,在普通的x86机器上,当发生函数调用的时候,系统会在地址空间中创建新的栈帧并保存上一个栈帧的栈指针esp和帧指针ebp,这两个变量用于恢复上下文环境。

Read More

SICP5

生成器迭代器的关系

一、python中的迭代器

首先要区分开迭代器和可迭代对象,前者是指实现了__next__StopIteration迭代器协议的python对象,后者是指可以使用iter得到其迭代器的对象。比如,iter(range(n))可以获得range对象的迭代器,实际上使用iter可以从任何可迭代对象中获得迭代器,迭代器唯一能做的就是next直到StopIteration。所有的迭代器都是可迭代对象,意思是你可以从一个迭代器中得到一个迭代器,因此你可以遍历一个迭代器。通常对迭代器使用iter方法返回的是该迭代器自身。

1
2
3
4
a = [1,2,3]

it1 = iter(a)
it2 = iter(it1)# 其实it1和it2是同一个对象的两个引用

Read More

仓鼠一般搜集到的C++技巧

    1. 通常不应该出现两个头文件循环包含的情况,若两个头文件包含,则说明两个头文件中包含的两个类之间关系高度耦合。即A 需要 B , B 需要 A。依照《重构》中的思想,这种情况属于代码臭味,需要考虑将这两个类中的内容合并为一个类,之后将不存在循环包含的情况。类之间通常是单向依赖关系。
    1. 当前阶段先学会自己写出makefile。
    1. 类的静态成员要在类外进行初始化。
    1. 左值表达式表示对象的身份,右值表达式表示对象的值。返回左值引用的函数,连同赋值、下标、解引用、和前置递增递减运算符都是返回左值表达式的,因此可以将左值引用绑定其上。返回非引用类型的函数、算术运算符、关系运算符、位运算符、以及后置递增递减运算符,都生成右值,我们可以将一个const左值引用或者一个右值引用绑定其上。右值表示一种短暂的临时的引用。
    1. 移动构造函数不创建任何新内存,而是接管旧对象的成员,因此在移动构造函数中需要使得旧对象失去对其成员的所有权。

Read More

2019 投资日记

  1. 美债收益率出现倒挂情况。债券的收益率等于利息除以价格,利息是不变的写死的,而价格是会浮动的。债券收益率这种情况说明市场根本不看好美国未来经济前景,纷纷购买长期债券,导致长期债券价格编号,收率率下降。另外短期债券也被抛售,使得短期债券价格降低,未来收益率变高。历史数据证明这个信号是经济衰退的强有力的信号,但是股票不会短时间立刻反应出来。原因在于银行对于这种情况可能会实行宽松的货币政策,刺激消费。另外对于A股,意味着可能有外资流入中国市场。

Read More

本站总访问量