• 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

  • 相关阅读:
    go语言教程零基础入门到精通
    php探针文件内容
    一篇文章揭穿创业公司的套路
    Google资深工程师深度讲解Go语言面向接口(五)
    完全解析<atlalloc.h>
    巧妙的Section — — 剖析ATL OBJECT_MAP的自动建立
    ATL中的各种CriticalSection
    C++中的INL
    如何剖析一个类
    ATL线程模型解析
  • 原文地址:https://www.cnblogs.com/grooovvve/p/8686118.html
Copyright © 2020-2023  润新知