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
Python语言、编译解释、动态库静态库、编译过程、头文件的更多相关文章
- Linux 下动态库 / 静态库(依赖)
一. 依赖动态库的动态库 libfun.so依赖动态库libtest.so(libfun.so动态库里的函数intnothing()调用了libtest.so里的intmytest()函数),而mai ...
- linux下编译qt5.6.0静态库——configure配置
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- c/c++:动态库 静态库 linux/windows 例子 (转)
作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...
- linux下编译qt5.6.0静态库——configure配置(超详细,有每一个模块的说明)(乌合之众)
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- C++基础知识之动态库静态库
一. 静态库与动态库 库(library),一般是一种可执行的二进制格式,被操作系统载入内存执行. 我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库 静态库和动态库区别: ...
- Ubuntu16.04下编译OpenCV2.4.13静态库(.a文件)
Ubuntu16.04下编译OpenCV2.4.13静态库(.a文件) https://blog.csdn.net/woainishifu/article/details/79712110 我们在做项 ...
- Linux 动态库 静态库
什么是库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和Linux的本质不同,因此二者库的二进制是不兼容的.Linux操作系统支持的库函数分为静态库和动态库 ...
- CMake 添加头文件目录,链接动态、静态库(添加子文件夹)
CMake支持大写.小写.混合大小写的命令. 当编译一个需要第三方库的项目时,需要知道: 去哪找头文件(.h),-I(GCC) INCLUDE_DIRECTORIES() 去哪找库文件(.so/.dl ...
- linux下编译qt5.6.0静态库(使用./configure --help来看看都有哪些参数。超详细,有每一个模块的说明。如果改变了安装的目录,需要到安装目录下的bin目录下创建文件qt.conf)(乌合之众)good
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- linux 动态库 静态库 函数覆盖
本文讨论了linux动态库 静态库中函数的覆盖问题. 测试目的: 同名函数,分别打成动态库libdync_lib.so与静态库libstatic_lib.a,并把libstatic_lib.a打到另 ...
随机推荐
- jQuery选择器整理
最使用近工作中常用到jQuery,在过滤器的使用方面生疏,所以本文整理了些有关知识点,以便于自己查找方便,或为朋友们提供方便! 一.基本选择器 $("#test") 选取id为te ...
- DAY7-面向对象之绑定方法与非绑定方法
一.类中定义的函数分成两大类 一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1. 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 类.boud_met ...
- hadoop再次集群搭建(4)-Cloudera Manager Installation
决定选择 Cloudera Manager 进行安装,阅读官方文档,掌握大概脉络. Cloudera Manager在集群已经实现ssh免秘钥登录,能够访问网络资源和本地资源的情 ...
- struts-hibernate整合(1)配置环境
①加载jar包 创建类库: 在myeclipse中点击windows---Preference---Java---Build Path---User Libraries---new 输入创建类库名字s ...
- opencv生成灰度图并保存
#include <opencv2/opencv.hpp>#include <iostream> using namespace cv;using namespace std; ...
- Python 使用其他邮件服务商的 SMTP 访问(QQ、网易、163、Google等)发送邮件
163邮箱SMTP授权 使用Python SMTP发送邮件 # -*- coding:utf-8 -*- from __future__ import print_function __author_ ...
- p2501 [HAOI2006]数字序列
传送门 分析 https://www.luogu.org/blog/FlierKing/solution-p2501 对于第二问的感性理解就是有上下两条线,一些点在上面的线的上面或者下面的线的下面,然 ...
- p2234&bzoj1588 营业额统计
传送门 题目 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额 ...
- 开发一个属于自己的第一个Composer/Packagist包
Composer 给我们带来了诸多的好处: 模块化,降低代码重用成本 统一的第三方代码组织方式 更科学的版本更新 初始化项目,生成composer.json文件 初始实例项目代码目录结构: 现在要在项 ...
- springcloud安全控制token的创建与解析
import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorith ...