阿里一面

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編譯動態庫和靜態庫

靜態庫的製作

  1. 將所有源文件.c生成對應的.o文件
gcc *.c -c -I../include
-I後面添加依賴文件目錄
  1. 將生成的.o文件打包,生成libMytest.a文件
ar rcs libMytest.a *.o
Mytest爲靜態庫名
  1. 使用靜態庫
gcc main.c lib/libMytest.a -o main -Iinclude
在編譯main.c時使用靜態庫libMytest.a
-Iinclude爲頭文件路徑
或者
gcc main.c -Iinclude -L lib -l Mytest -o main

動態庫的製作

  1. 生成與位置無關的代碼(生成.o文件)
gcc -fPIC -c *.c -I../include
  1. 將.o打包成共享庫 (生成libMytest.so文件)
gcc -shared -o libMytest.so *.o -Iinclude
  1. 使用動態庫
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實現原理),
聚類算法對比(時間複雜度)
推薦算法
深度學習算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章