我想开始阅读Python源代码。
我的经验,
我非常了解Python和Java。我知道其他各种水平的语言,但是C / C + /都不是很好。我在大学里学习过C,但是从来没有对它进行过专业编程。
我阅读此代码的原因。
- 了解python的工作原理。
- 更好地学习C。
1对我来说比2更重要。
我该怎么办?
我想开始阅读Python源代码。
我的经验,
我非常了解Python和Java。我知道其他各种水平的语言,但是C / C + /都不是很好。我在大学里学习过C,但是从来没有对它进行过专业编程。
我阅读此代码的原因。
1对我来说比2更重要。
我该怎么办?
Answers:
首先了解Python C API。它是一个庞大而丰富的API,Python源代码自然会在各处使用它。在您必须了解Py_INCREF等的含义之前,您不会对Python源代码有太多了解。
我在Pycon上做了一个演讲,解释了API:您可能会发现有用的通过Python C扩展进行的旋风游览。C扩展使用与Python代码本身相同的API。
首先,如果您对1最感兴趣,那么我将从阅读各种模块的Python源代码开始(而不是直接跳转到C)。每当我发现自己阅读某些模块的源代码时,就总是学到关于Python编程的新知识。
其次,如果您想更好地学习C,我个人会建议完全不同的东西:在其中编程。仅仅静态地阅读源代码并不能使您更好地理解C(至少,这是一种有限的方法;它可能会使您变得更好一些,但阅读源可以让您受益匪浅)。
在使用C编写了至少一个中等大小的项目之后,我将开始研究Python源代码。那确实是更好地了解C的唯一方法,而且我真的认为,不了解C的情况下阅读Python的C源代码不会使您走得太远。
一个C项目的想法
实际上,这是一个C项目的想法:用C编写Python解释器。显然,它甚至还差一点就完成,这是一个相当艰巨的项目,但是如果您只专注于语言的某些部分,我认为这是一个好主意。
它不仅将帮助你学习C,它会帮助你好多了,甚至理解的Python之前查看源:你必须有一个更深的了解很多在Python中的东西,你就会明白在设计权衡Python的工作方式等
然后,当您最终阅读Python的代码时,您不仅会理解为什么某些事情会以这种方式起作用,而且您可能会学到很多非常酷的C技术来解决您遇到的问题。
1)首先确保您可以构建自己的Python并将其运行到调试器中。因此,您不仅可以添加打印表达式,还可以断点并遵循代码流。如果您拥有可让您跟踪函数调用的工具,那就太好了,您将需要它。
2)从实现数据类型的文件开始。它们非常容易理解,您在阅读代码时可以提高C语言的技能。
3)制作UML图-Argo UML或MS Visio等简单的绘图帮助工具可以在这里为您提供帮助。写下代码流。
4)阅读python的启动代码。查看什么以及如何初始化基本基础结构。
6)是100%理解Python的一面-甚至更难的实现细节,什么是AST,什么是绑定方法和未绑定方法以及如何实现它们。当您想到一个模型时,如何编写python解释器,则可以转到最后的主步骤。
7)使用提供的快速调试器C API编写调试器扩展。这可以帮助您提高C语言技能。
8)采取最后的掌握步骤,并深入了解解释器代码的核心。对于一个熟练的C程序员来说,这甚至很难阅读和理解。了解表达式的求值方式和方法查找的缓存方式,框架的作用域规则设置等。这既困难又复杂-就复杂性和代码行而言。
9)启动Adobe Photoshop并创建一个外观漂亮的“ Python大师”文凭,并将其放在您的办公室墙上。
从Python网站下载源代码。假设您将源代码解压缩到名为Python-3.1.1的目录中。我建议您在Python源代码中提供两个起点,以帮助您探索Python的工作原理:
检查Python虚拟机如何执行从插入器生成的字节码。Python VM位于名为Python-3.1.1 / Python / ceval.c的文件中。VM的核心是一个eval循环,该循环从ceval.c中的函数PyEval_EvalFrameEx开始。通读源代码和内联注释。我相信你会喜欢的。
另一个选择是查看如何实现内置的python数据类型(如列表,字典和集合)。例如,实例集是在Python-3.1.1 / Objects / setobject.c中实现的。对象目录也包含其他数据类型的实现。