Python、编译解释、动态库静态库、编译过程、头文件了解一下

学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库,

什么是编译:

编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了。一把翻译再执行

编译型语言在于速度快。

什么是解释:

解释就是在程序运行时,才把高级程序语言一条一条地翻译成二进制的机器语言。边运行边翻译成二进制机器语言。所以速度没有编译来得快。边执行边翻译

解释型语言的优点在于可以跨平台。

Python语言的优点:

可移植性、可扩展性、可嵌入性

简单、优雅、明确

开发效率高,有强大的第三方库

Python语言的缺点:

速度慢

代码不能加密

多线程不能利用多核(GIL的存在)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

静态库Lib和动态库DLL:

1)首先什么是库:

  库(Lib)是一段编译好了的二进制代码,加上头文件可以供别人使用。编译程序是需要时间的!然后什么是编译呢?

 为什么要用到库:有些情况代码需要提供给别人使用,但是我们不希望别人看到源码。可以以库的形式进行封装,只暴露头文件。而且库文件是已经编译好的二进制文件,编译的时候只需要link一下。

  但是Link的方式有两种:一种是静态link,一种是动态link。

2)静态库Lib:(linux下叫作 .a)

  静态库在编译的时候会被拷贝一份到目标程序里,是目标程序的一部分。

  这样做的好处在于减少目标程序对外部的依赖性。

  坏处是目标程序变得太大了。 

3)动态库DLL:(linux下叫作 .so)

  动态库在编译的时候,并不会被拷贝一份到目标程序中,目标程序存储的是指向动态库的引用。等到目标程序运行的时候,动态库才会真正被加载进来。

  动态库的好处在于,不用拷贝到目标程序中,不影响目标程序的体积。同一份动态库,可以被多个程序使用。所以动态库又叫作共享库。编译时才载入的特性,可以随时对动态库进行替换,更新。不需要重新编译代码。

  动态库的缺点在于:会带来一部分性能损失。也使得目标程序太过于依赖外部环境。一旦环境缺少动态库或者库的版本不正确。就会导致程序无法正常运行。

 

4)总结:

  动态库和静态库都是共享程序代码的一种方式。二者区别在于链接阶段,静态库被复制到程序当中,和程序运行的时候没有关系。而动态库在链接阶段没有被复制到程序中。而是程序在运行的过程中,由系统动态加载到内存中。

  动态库的优点在于还需要一次加载到内存中,不同程序可以共享内存中同一动态库的副本。因此节省了很多内存。

  库是共享程序代码的方式,将特定功能模块化成库的格式,方便分享与使用。

  动态库和静态库都是闭源库,只能拿来满足某种功能的使用。不会透露内部具体的代码信息。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

编译的过程:

  这里以C语言为例,因为Python就是用C语言编写的嘛。Python解释器是用来执行.py文本文件的。

  编译分为4个过程:1)预处理Preprocessing、2)编译Compilation、3)汇编Assemble、4)链接Linking

  1)预处理Preprocessing:

    预处理用于将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。

    预处理之后的程序还是文本,可以用文本编辑器打开。

  2)编译(Compliation):

    这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。

    这个过程.c文件被汇编成.s文件。

  3)汇编(Assemble):

    汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。

    这一步会为每一个源文件产生一个目标文件.obj。

  4)链接(Linking):

    链接过程将多个目标文以及所需的库文件链接成最终的可执行文件(executable file)。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

关于头文件:

  头文件和库其实不太一样。

  其实头文件的主要作用在于多个代码文件全局变量(函数)的重用、防止定义的冲突,对各个被调用函数给出一个描述,其本身不需要包含程序的逻辑实现代码,它只起描述性作用,用户程序只需要按照头文件中的接口声明来调用相关函数或变量,链接器会从库中寻找相应的实际定义代码。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

相关连接:

Python是一门什么样的语言:https://www.cnblogs.com/gaojun2017/p/6274540.html

动态库和静态库详解:https://www.cnblogs.com/striveLD/p/5752010.html

C语言编译过程详解:https://www.cnblogs.com/CarpenterLee/p/5994681.html

Python解释器:http://man.chinaunix.net/develop/python/python2.3tut/tut/node4.html

头文件与库的区别:https://blog.csdn.net/mormont/article/details/53009795

什么是.obj文件:https://www.cnblogs.com/ShadowHanlder/p/4410213.html

原文地址:https://www.cnblogs.com/grooovvve/p/8686118.html

时间: 2024-11-29 12:10:28

Python、编译解释、动态库静态库、编译过程、头文件了解一下的相关文章

linux下编译qt5.6.0静态库——configure配置

 随笔 - 116  文章 - 4  评论 - 7 linux下编译qt5.6.0静态库--configure配置 linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberry选项: Android 选项: 生成makefile 遇到链接检查失败的情况 生成makefile后进行编译 编译时的错误 多重定义'QT_MODBUS()'和'QT_MODBU

Linux 下动态库 / 静态库(依赖)

一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而main.exe又调用了libfun.so的函数int nothing(). 下面两种方式都能工作: 1> 常用的方式 g++ -shared -fPIC -o libtest.so test.cpp g++ -shared -fPIC -o libfun.so function.cpp  -L./ -I

c/c++:动态库 静态库 linux/windows 例子 (转)

作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自我修养——链接.装载与库>. 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每

Linux 动态库 静态库

什么是库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和Linux的本质不同,因此二者库的二进制是不兼容的.Linux操作系统支持的库函数分为静态库和动态库,动态库又称共享库.Linux系统有几个重要的目录存放相应的库函数,如/lib,/usr/lib;头文件放在/usr/include. 什么是静态库 静态库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都被整合进目标代码中,他的优点就显而易见了,即编译后的执

C++基础知识之动态库静态库

一. 静态库与动态库 库(library),一般是一种可执行的二进制格式,被操作系统载入内存执行. 我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库 静态库和动态库区别: 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.因此,使用了静态库的可执行程序存储在磁盘上的空间就比较大. 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在. 静态库和动态库命名规范: linux: 静态库文件名的命名规范是

动态库静态库差异对比

最近在做一个项目需要http接口,由此将框架中依赖libcurl的http单独拿来用 libcurl提供两种库:静态库跟动态库,首先curl目下只提供了libcurl.a,并没有生成libcurl.so,由此开始编译依赖静态的http.sog++ -shared -fPIC -o lib/libhttp.so http_handle.cpp -I./ -I./curl-7.34.0/include -L./ -lcurl ./lib/libhttp.so: undefined reference

Linux GCC编译使用动态、静态链接库 (转)

原文出处:http://blog.csdn.net/a600423444/article/details/7206015 在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.so作后缀的文件. 动态链接库的好处就是节省内存空间. 1.Linux下创建动态链接库 在使用GCC编译程序时,只需加上-shared选项即可,这样生成的执行程序即为动态链接库. 例如有文件:hello.c x.h main.c [plain] view plaincopy 编译:gcc hello.

VS2010编译Qt5.4.0静态库

http://www.kavenblog.com/?p=375 1.Qt的跨平台十分优秀,但是在Windows上是还是会有许多问题,其中之一就是动态链接库的问题,Qt程序的发布必须带一个体积不小的DLL库,这十分不方便.当然,如果是程序员之间会比较方便,如果别人的机子也安装了Qt,并且设置了环境变量,那么也可以不将公共的DLL附在发布的程序中.但是,这样显然还是不方便. 2.静态链接库很好的解决了这一个问题,下面就来详细叙述如何编译Qt5.4.0的静态库. 3.参考链接:http://blog.

VS2013编译Qt5.6.0静态库(乌合之众)

获取qt5.6.0源码包 直接去www.qt.io下载就好了,这里就不详细说了. 这里是我已经编译好的** 链接:http://pan.baidu.com/s/1pLb6wVT 密码: ak7y ** configure配置 1.进入源码目录下的qtbase\mkspecs\win32-msvc2013目录,打开文件qmake.conf文件.添加 QMAKE_CFLAGS_RELEASE = -O2 -MT -Zc:strictStrings QMAKE_CFLAGS_RELEASE_WITH_