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打到另 ...
随机推荐
- SQl Server 函数篇 聚合函数
说一下数据库中的聚合函数 函数使用必须加小括号(), 5种聚合函数: 1.max最大值 select max(price) from car where code='c024' --取这一列中 ...
- 把文档转化为PDF再用PS处理PDF
最近工作中遇到类似下面这样的一个文档. 文档当前设置的是A4 横版打印,可以明显的看到打印的分界线,这样直接打印出来,是没有下面那行“bbbbbbbbbbbbbbbbbb”的,怎么办?可以通过 页面布 ...
- python3-while与if
# Auther: Aaron Fan age_of_oldboy = 56 #定义一个while循环的起始判断值countcount = 0#当count小于3的情况下一直执行while循环whil ...
- 深、浅copy
深.浅copy多用于列表 浅copy:第一层中不变的数据是独立的,可变类型元素指向同一块内存地址 l1 = [1,2,3,["a","b"]] l2 = l1. ...
- 福大软工1816 · 第五次作业 - 结对作业2_EXE图片_备用
1_每日推荐界面.png 2_论文搜索界面.png 2_论文搜索界面_搜索功能.png 3_流行趋势_十大热词排名统计图.png 4_人物界面.png 5_我的收藏界面.png 6_设置界面.png ...
- 缓存淘汰算法之LRU
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. ...
- i++,++i,i+=1,i = i+1在C++中的区别
其实这个问题可以从三个角度去分析:语言规范,编译器实现,CPU支持.首先从语言规范上来讲:前置++和后置++是不等价的,前置++在规范中明确指出 和+=组合操作符是等价的,但和E = E+1;这样的赋 ...
- 未能加载文件或程序集“Interop.SQLDMO”或它的某一个依赖项
程序运行没问题,当您配置好IIS后,打开安装向导时出现以下错误信息: 解决办法为:在IIS应用程序池中“启用32位应用程序”, 1,打开IIS应用程序池,选中相应应用程序池,点击右侧“高级设置” 2, ...
- 基于ef core 2.0的数据库增删改审计系统
1.首先是建审计存储表 CREATE TABLE [dbo].[Audit] ( [Id] [uniqueidentifier] NOT NULL, [EntityName] [nvarchar](1 ...
- .Net Core 使用Session
1. NUGET包引用 icrosoft.AspNetCore.Session 2.Startup中添加一下代码: public void ConfigureServices(IServiceColl ...