python和C的比较
- C是编译型语言,面向过程,经过编译后,生成机器码,然后再运行.执行速度快,不能跨平台,一般用于操作系统,驱动等底层开发.
- python是解释型语言,面向对象,引入了类和对象.执行速度慢,隐藏数据类型(不需要事先定义变量).python通过缩进来表示语句体.结尾没有分号.python也有很多内置函数,不需要写头文件.
程序编译过程步骤
1)预处理
主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下
1、删除所有的#define,展开所有的宏定义。
2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
4、保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。
2)编译
把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应的汇编代码文件。
1、词法分析:利用类似于“有限状态机”的算法,将源代码程序输入到扫描机中,将其中的字符序列分割成一系列的记号。
2、语法分析:语法分析器对由扫描器产生的记号,进行语法分析,产生语法树。由语法分析器输出的语法树是一种以表达式为节点的树。
3、语义分析:语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断,其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义。
3)汇编
将汇编代码转变成机器可以执行的指令(机器码文件)。 汇编器的汇编过程相对于编译器来说更简单,没有复杂的语法,也没有语义,更不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译过来,汇编过程有汇编器as完成。经汇编之后,产生目标文件(与可执行文件格式几乎一样)xxx.o(Windows下)、xxx.obj(Linux下)。
4)链接
将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。链接分为静态链接和动态链接:
1、静态链接:
函数和数据被编译进一个二进制文件。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件。
空间浪费:因为每个可执行程序中对所有需要的目标文件都要有一份副本;
更新困难:每当库函数的代码修改了,这个时候就需要重新进行编译链接形成可执行程序。
但是运行速度快.
2、动态链接:
动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序;
共享库:就是即使需要每个程序都依赖同一个库,但是该库不会像静态链接那样在内存中存在多分,副本,而是这多个程序在执行时共享同一份副本;
更新方便:更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍。
性能损耗:因为把链接推迟到了程序运行时,所以每次执行程序都需要进行链接,所以性能会有一定损失。
gcc编译动态库和静态库
静态库的制作
- 将所有源文件.c生成对应的.o文件
gcc *.c -c -I../include
-I后面添加依赖文件目录
- 将生成的.o文件打包,生成libMytest.a文件
ar rcs libMytest.a *.o
Mytest为静态库名
- 使用静态库
gcc main.c lib/libMytest.a -o main -Iinclude
在编译main.c时使用静态库libMytest.a
-Iinclude为头文件路径
或者
gcc main.c -Iinclude -L lib -l Mytest -o main
动态库的制作
- 生成与位置无关的代码(生成.o文件)
gcc -fPIC -c *.c -I../include
- 将.o打包成共享库 (生成libMytest.so文件)
gcc -shared -o libMytest.so *.o -Iinclude
- 使用动态库
gcc main.c lib/libMytest.so -o main -Iinclude
或者
gcc main.c -Iinclude -L./lib -lMytest -o main
-L./lib 为动态库的路径
-lMytest 告诉编译器要使用test这个库,编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
一条命令完成将*.c编译成一个动态库
gcc *.c -fPIC -shared -o libtest.so
-shared 指定生成动态链接库(共享库)
-fPIC 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的
聚类算法(k-means实现原理),
聚类算法对比(时间复杂度)
推荐算法
深度学习算法