掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
年關(guān)(annual review)將近,這一段時(shí)間,我在梳理 2020 年做的一些事情,并試著制定下一年的計(jì)劃。過程中,我發(fā)現(xiàn)我做的一些事情,或是工作相關(guān),或是興趣上的探索,還都可以繼續(xù)總結(jié)出一些文章。在工作上,很多一部分做的事情就是編程語言的支撐體系。外加業(yè)余時(shí)間里,和同事一起花了一些時(shí)間在研究編程語言。在這幾部分的結(jié)合之下,我對(duì)于整個(gè)體系的端到端實(shí)現(xiàn)有一個(gè)整體的認(rèn)識(shí)。

創(chuàng)新互聯(lián)專業(yè)IDC數(shù)據(jù)服務(wù)器托管提供商,專業(yè)提供成都服務(wù)器托管,服務(wù)器租用,服務(wù)器托管,服務(wù)器托管,成都多線服務(wù)器托管等服務(wù)器托管服務(wù)。
作為一個(gè)職業(yè)的程序員,在我們的職業(yè)生涯里,不可避免地要學(xué)習(xí)一個(gè)又一個(gè)的編程語言。雖然多數(shù)情況下,我們對(duì)于使用什么語言并沒有太多的選擇權(quán)。但是,當(dāng)我們選擇一門語言時(shí),都要考慮一系列的要素,比如:
PS:當(dāng)然了,對(duì)于那些使用 C/C++ 的人來說,這些可能都是例外:他/她覺得自己不需要這些工具,需要的時(shí)候可以自己創(chuàng)造一個(gè)。所以,這些語言在很長(zhǎng)的一段時(shí)間里,都缺乏良好的依賴管理工具。
故事開始之前,讓我們讓 Android 使用的開發(fā)和構(gòu)建來講述這個(gè)過程。
從 Android 應(yīng)用的開發(fā)與構(gòu)建說起
在移動(dòng)端開發(fā)上,雖比不上這個(gè)行業(yè)的諸多大佬,但我也算是頗有經(jīng)驗(yàn)的。而恰好一年中有一半的時(shí)間,都在相關(guān)的項(xiàng)目上。所以,我從宏觀上了解了整體的體系。
當(dāng)我們開始一個(gè)新的移動(dòng)應(yīng)用時(shí),會(huì)從 IDE 里通過模板創(chuàng)造一個(gè)嶄新的應(yīng)用,又或者是從某個(gè)地方(如 GitHub)尋找合適的模板。而后,為驗(yàn)證模板的有效性,我們通過執(zhí)行 Gradle 的相關(guān)命令,完成一個(gè)應(yīng)用的過程,運(yùn)行這個(gè) Demo。(PS:這一點(diǎn)與我們使用 Java 開發(fā)應(yīng)用時(shí),并沒有太大區(qū)別)。
這個(gè)過程中,發(fā)生了這么一些事情:
這個(gè)過程看上去非常簡(jiǎn)單,但是背后還藏著諸多的細(xì)節(jié)問題。
構(gòu)建與依賴管理
當(dāng)我用 CLOC 工具統(tǒng)計(jì)了一下 Gradle 工具的源碼時(shí),我才發(fā)現(xiàn)這個(gè)工具并不簡(jiǎn)單。而進(jìn)一步地,在半深入源碼之后,我發(fā)現(xiàn)構(gòu)建系統(tǒng)還是頗為復(fù)雜的。一個(gè)簡(jiǎn)單的 Java 應(yīng)用就分為這么一些步驟:
- :compileJava UP-TO-DATE
- :processResources UP-TO-DATE
- :classes UP-TO-DATE
- :run
而當(dāng)我們有依賴的時(shí)候,需要添加上 classpath,即將依賴添加到編譯的路徑中。而對(duì)于一些非 .jar 類型的依賴而言,如 .war,構(gòu)建工具還要支持對(duì)他們的解析。因此,整體的過程就是:
這些只是表面上的一些工作。而為了更好地表述這個(gè)過程,需要抽象出一個(gè) task 的概念,在這個(gè)概念里,一個(gè) task 有輸入和輸出。如
于是,在有了這些基礎(chǔ)之后,為了加快構(gòu)建,還需要緩存的機(jī)制。它對(duì)輸入和輸出進(jìn)行計(jì)算,當(dāng)兩者發(fā)生變化的時(shí)候,再進(jìn)行編譯。否則就跳過這個(gè)任務(wù)。
而這些只是核心功能,在非核心的功能區(qū)里,還有諸如于 SDK 版本、多輸入多輸出的變體等等。
IDE 與構(gòu)建系統(tǒng)
在那篇《編程語言的 IDE 支持》中,我們已經(jīng)介紹了編程語言所需要的 IDE 功能,諸如于:
在這篇文章中,大概再回顧一下它與構(gòu)建系統(tǒng)之間的關(guān)系。IDE 與構(gòu)建系統(tǒng)一般會(huì)存在這種關(guān)聯(lián):
對(duì)應(yīng)的有兩種機(jī)制可以與構(gòu)建系統(tǒng)通訊:
簡(jiǎn)單來說,就是復(fù)雜的系統(tǒng)應(yīng)該由構(gòu)建系統(tǒng)提供機(jī)制,而簡(jiǎn)單的構(gòu)建系統(tǒng)則就不會(huì)有這樣的問題。
依賴管理的基礎(chǔ)設(shè)施
不同語言對(duì)于依賴的管理機(jī)制都有所不同,但是它們的原理都是相似的:
最有意思的是Maven 的機(jī)制,我可以自制依賴,并上傳上去。而整個(gè)倉庫并不關(guān)心這個(gè)包的內(nèi)容,我們只需要依賴于它定義的格式即可。如果我們考慮圍繞語言來設(shè)計(jì)依賴管理體系,那么可以考慮的是類似的方式,并借助于 Git 這樣的版本工具。這樣一來,我們就可以去中心化。
本文轉(zhuǎn)載自微信公眾號(hào)「 phodal」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系 phodal公眾號(hào)。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流