作为一个学习计算机语言的学习者来说,怎么样学习计算机语言以及理解计算机世界,对于一个初学者来说都是那么新颖,可是怎么样才能学会呢?看到网络上,大量文章对不同语言进行比较,感觉非得找出最好的语言似的,可是无论怎么比较,各种语言都是并存的,因为世界是多元的,不同语言也是存在的,存在就是道理,不同语言有不同的应用,如果语言不能给予对现实世界应用,那么语言就是乏乏无力的,语言是一种沟通工具,计算机是人类与机器之间沟通的工具。
python源代码满满的C语言代码,我们来看看python源代码,让我们看看,C语言是如何神奇的构建python这种语言的,C语言是一种过程式语言,它是怎样构建出一种对象式的语言。
机器<-->人,人的思维是千变万化,天马行空的,而机器是通电的,目前就是0和1组成的电信号,如何把人与机器连接起来,机器1001001010101010<-->汇编(或者说是指令集)<->C<->python.
现在我们就进入python源代码来看看C语言
有些人喜欢从最初的版本来剖析,我就比较随性了,就从容易找到的版本Python-2.7.9开始吧,反正万变不离其宗,本质无处不在。
python是面向对象的,所以抓住object这个点是没错的,好,我们就入include这个文件夹,看看,c语言对头文件的定义,首先打开object.h这个文件
#ifndef Py_OBJECT_H
#define Py_OBJECT_H
在定义头文件声明中,这是很平常可以看到的格式,思维方式:如果没有定义Py_OBJECT_H,就声明Py_OBJECT_H,这样就声明了Py_OBJECT_H这个变量,很幸运的,我们可以学到#ifndef 和#define是怎么表达我们的思维的。
我们经常遇到的是我们学习了一种语言了之后,看了整本书,发现大脑还是空空如也,不知道该怎么样去利用这种语言去表达自己的思维。是的,我也是一样的,所以看人家去操纵语言去描述现实的。在这里,我们可以看到他们是操纵计算机的基本原理中的知识。
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
这里涉及到一种结构体,关于结构体在这里不谈,直接看后面
#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS)
#define Py_TRACE_REFS
#endif
#if defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG)
#define Py_REF_DEBUG
#endif
我们看看&& !这两个操作符是在这里起了什么作用?这是定义了DEBUG,TRACE_REFS,REF_DEBUG,这是什么逻辑呢?定义了DEBUG,然后就定义跟踪引用,然后在调用引用的DEBUG,很好&&表示是“和”的情况,而!代表“非”的情况,这是顺序控制,表达了一种过程。如果定义了debug,但没定义trace跟踪引用,那么定义定义它,如果定义声明了跟踪引用,在没定义引用DEBUG的情况下,就定义引用DEBUG。很好,这个思维逻辑很严谨。那么怎么跟踪呢?首先跟踪我们是要能前进步伐或后退步伐的,所以这里我们需要用到C的指针,一个程序它是要从最开始的初始化开始的,所以要涉及到位置的考虑,那么位置在什么地方呢?那么我们可以看做是分段函数,而这个函数是二元函数(位置,第几步),第一个函数是位置为(0,0),第二个函数(X,Y)
#ifdef Py_TRACE_REFS
#define _PyObject_HEAD_EXTRA \
struct _object *_ob_next; \
struct _object *_ob_prev;
#define _PyObject_EXTRA_INIT 0, 0,
#else
#define _PyObject_HEAD_EXTRA
#define _PyObject_EXTRA_INIT
#endif
在HEAD_EXTRA里定义指针的两个操作,下一步(*_ob_next)或前一步(*_ob_prev),而_EXTRA_INIT里定义了初始地址0。当然如果涉及到的是内存里面的位置,在某本剖析PYTHON的书籍里面说的是很本质的内容,可是看着头疼,而且画了很多图来表示,来表述怎么找到地址,然后怎么运行?在这里,你就这么理解就可以了,当做看网页里面的前进后退。