做開(kāi)發(fā)時(shí)間越來(lái)越長(zhǎng)崇堵,知道的越多覺(jué)得不知道的更多。有時(shí)會(huì)去想客燕,我們寫(xiě)的代碼是怎么從oc鸳劳,c,c++等等也搓,這樣的高級(jí)語(yǔ)言變成可執(zhí)行文件的赏廓?編譯,運(yùn)行的過(guò)程中究竟發(fā)生了什么傍妒?
帶著這樣的問(wèn)題幔摸,我打算好好靜下心來(lái)閱讀一本書(shū) —— 《程序員的自我修養(yǎng)——鏈接、裝載與庫(kù)》颤练。
自從從事iOS開(kāi)發(fā)至今既忆,其實(shí)絕大部分時(shí)間是做業(yè)務(wù)需求,少部分時(shí)間在思考代碼結(jié)構(gòu)和程序架構(gòu)嗦玖。而對(duì)于底層機(jī)制的探索知之甚少患雇。
有過(guò) OC(或者別的編譯語(yǔ)言)開(kāi)發(fā)經(jīng)驗(yàn)的開(kāi)發(fā)者,必然會(huì)遇到過(guò)方法重復(fù)定義或者是變量重復(fù)定義的問(wèn)題(duplicate symbols for architecture i386)宇挫。
這種錯(cuò)誤說(shuō)的是編譯器認(rèn)為方法和變量被重復(fù)定義了苛吱,而導(dǎo)致這個(gè)錯(cuò)誤的原因可能是因?yàn)閕mport了一個(gè).m文件,而非.h文件器瘪。(真的在一個(gè)類(lèi)中定義了兩個(gè)同名函數(shù)的情況不是沒(méi)有翠储,只是很容易被發(fā)現(xiàn),而包含.m文件導(dǎo)致的報(bào)錯(cuò)橡疼,不容易發(fā)現(xiàn))
那么援所,import了.m文件,為什么會(huì)使得編譯器認(rèn)為重復(fù)定義了函數(shù)和變量呢衰齐?而又為什么import .h文件是對(duì)的呢任斋?這就需要了解編譯器在編譯、鏈接過(guò)程中做了些什么耻涛。也是我去看這本書(shū)的原因废酷。
隨著,看書(shū)和自己編程時(shí)間的慢慢增長(zhǎng)抹缕,我越來(lái)越覺(jué)得澈蟆,所有的編程,鏈接卓研,運(yùn)行趴俘,等等計(jì)算機(jī)中出現(xiàn)的這些專(zhuān)有術(shù)語(yǔ)睹簇,其實(shí)和生活中的種種事物和其運(yùn)行是一樣的。只不過(guò)用在了計(jì)算機(jī)上寥闪,給了他一個(gè)專(zhuān)門(mén)的稱(chēng)謂太惠,本質(zhì)上其實(shí)是邏輯思維。為了做一件事兒疲憋,我需要某某某條件凿渊,有了條件,我還需要組織缚柳,有了組織我要知道改如何組織埃脏,等等。凡此種種秋忙,其實(shí)都是基于邏輯思維 和 邏輯完備而生的彩掐。
我希望能從底層了解代碼,從本源了解世界灰追。