成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

編程語言的支撐體系:構建系統、IDE 和依賴管理

開發 前端
年關(annual review)將近,這一段時間,我在梳理 2020 年做的一些事情,并試著制定下一年的計劃。

 [[357633]]

年關(annual review)將近,這一段時間,我在梳理 2020 年做的一些事情,并試著制定下一年的計劃。過程中,我發現我做的一些事情,或是工作相關,或是興趣上的探索,還都可以繼續總結出一些文章。在工作上,很多一部分做的事情就是編程語言的支撐體系。外加業余時間里,和同事一起花了一些時間在研究編程語言。在這幾部分的結合之下,我對于整個體系的端到端實現有一個整體的認識。

作為一個職業的程序員,在我們的職業生涯里,不可避免地要學習一個又一個的編程語言。雖然多數情況下,我們對于使用什么語言并沒有太多的選擇權。但是,當我們選擇一門語言時,都要考慮一系列的要素,比如:

  1. 構建系統
  2. IDE/Editor 支撐
  3. 依賴管理
  4. ……

PS:當然了,對于那些使用 C/C++ 的人來說,這些可能都是例外:他/她覺得自己不需要這些工具,需要的時候可以自己創造一個。所以,這些語言在很長的一段時間里,都缺乏良好的依賴管理工具。

故事開始之前,讓我們讓 Android 使用的開發和構建來講述這個過程。

從 Android 應用的開發與構建說起

在移動端開發上,雖比不上這個行業的諸多大佬,但我也算是頗有經驗的。而恰好一年中有一半的時間,都在相關的項目上。所以,我從宏觀上了解了整體的體系。

當我們開始一個新的移動應用時,會從 IDE 里通過模板創造一個嶄新的應用,又或者是從某個地方(如 GitHub)尋找合適的模板。而后,為驗證模板的有效性,我們通過執行 Gradle 的相關命令,完成一個應用的過程,運行這個 Demo。(PS:這一點與我們使用 Java 開發應用時,并沒有太大區別)。

這個過程中,發生了這么一些事情:

  1. IDE 通過某種通訊機制,與 Gradle 進行通訊,以執行對應的命令,如 build。
  2. Gradle 接收到 IDE 的指令后,解析 build.gradle 相關的內容,尋找是否存在對應的 Task,如這里的 build。
  3. 執行 build 時,首先要去解決依賴關系,如從對應的 Maven 倉庫中下載依賴。
  4. 隨后,真正地執行對應的構建任務,如調用 javac。

這個過程看上去非常簡單,但是背后還藏著諸多的細節問題。

構建與依賴管理

當我用 CLOC 工具統計了一下 Gradle 工具的源碼時,我才發現這個工具并不簡單。而進一步地,在半深入源碼之后,我發現構建系統還是頗為復雜的。一個簡單的 Java 應用就分為這么一些步驟:

  1. :compileJava UP-TO-DATE 
  2. :processResources UP-TO-DATE 
  3. :classes UP-TO-DATE 
  4. :run 

而當我們有依賴的時候,需要添加上 classpath,即將依賴添加到編譯的路徑中。而對于一些非 .jar 類型的依賴而言,如 .war,構建工具還要支持對他們的解析。因此,整體的過程就是:

  1. 判斷是否存在本地的依賴,如果沒有的話,從遠程獲取。如果有依賴沖突的話,解決這些沖突,或者報錯。
  2. 獲取依賴后,根據需要對依賴進行處理。如 Android 中的 aar 包的解壓等。
  3. 結合依賴,對源碼進行編譯
  4. 將所需要的 Java Resources 從依賴的 Jar 拷貝到指定目錄
  5. 打包構建后的產物到一個新的 jar 包中

這些只是表面上的一些工作。而為了更好地表述這個過程,需要抽象出一個 task 的概念,在這個概念里,一個 task 有輸入和輸出。如

  1. 解析依賴里。它的輸出是 build.gradle 文件,輸出是處理完的依賴路徑。
  2. 編譯任務里。它的輸入是源碼,輸出是 .class 文件。
  3. 打包任務里。它的輸入是一堆文件夾或者文件,輸出是一個 .jar 包。
  4. ……

于是,在有了這些基礎之后,為了加快構建,還需要緩存的機制。它對輸入和輸出進行計算,當兩者發生變化的時候,再進行編譯。否則就跳過這個任務。

而這些只是核心功能,在非核心的功能區里,還有諸如于 SDK 版本、多輸入多輸出的變體等等。

IDE 與構建系統

在那篇《編程語言的 IDE 支持》中,我們已經介紹了編程語言所需要的 IDE 功能,諸如于:

  1. 語法高亮
  2. 子系統關聯與集成
  3. 跳轉與引用分析
  4. 智能感知
  5. 重構
  6. 快速修復
  7. 結構化視圖
  8. ……

在這篇文章中,大概再回顧一下它與構建系統之間的關系。IDE 與構建系統一般會存在這種關聯:

  1. 解析構建系統中的任務。如 Gradle 提供的 task,又或者是 package.json 中的 scripts,并將它們顯式地展示出來,如 IDEA 中的 line marker,又或者是獨立的 Gradle pannel。
  2. 執行構建任務。即在 IDE 中的 UI 與構建命令相綁定,典型的如 IDEA 中的 Android 應用的構建。
  3. 動態修改構建系統(可選)。如 IDEA 中的更新依賴版本,它依賴于解析構建系統的 DSL,并更新對應的 DSL。

對應的有兩種機制可以與構建系統通訊:

  1. 由構建系統提供構建 API。如 Gradle Tooling API,在那篇《Gradle IDEA 的項目模型》中,我們實際上介紹了由構建系統主動向 IDE 提供模型的方式。
  2. 由 IDE 構造一遍構建系統。如 IDEA 對于 Node.js 的處理方式。

簡單來說,就是復雜的系統應該由構建系統提供機制,而簡單的構建系統則就不會有這樣的問題。

依賴管理的基礎設施

不同語言對于依賴的管理機制都有所不同,但是它們的原理都是相似的:

  1. 源碼包。即將源碼打包,并以特定的格式發布,適用于腳本語言
  2. 倉庫源。方式類似于源碼包,唯一不同的地方是借助于版本管理工具,如 Golang。
  3. 類二進制包。典型的是 Java
  4. 其它包。如 Maven 可以支持其它自制的包

最有意思的是Maven 的機制,我可以自制依賴,并上傳上去。而整個倉庫并不關心這個包的內容,我們只需要依賴于它定義的格式即可。如果我們考慮圍繞語言來設計依賴管理體系,那么可以考慮的是類似的方式,并借助于 Git 這樣的版本工具。這樣一來,我們就可以去中心化。

本文轉載自微信公眾號「 phodal」,可以通過以下二維碼關注。轉載本文請聯系 phodal公眾號。

 

責任編輯:武曉燕 來源: phodal
相關推薦

2017-03-07 10:46:00

2016-03-21 17:53:43

道普網

2023-06-29 18:12:12

2020-10-13 06:34:15

編程語言IDE

2016-04-01 10:47:27

浪潮

2018-08-31 19:36:03

2009-07-01 11:55:00

國家部委IT運維管理體系

2023-11-06 12:07:10

生成式人工智能生成式 AI

2017-12-12 17:53:59

數字化轉型CIO

2014-08-05 14:38:59

移動互聯網

2012-11-20 10:20:57

Go

2023-10-17 19:37:34

昇騰

2017-03-21 12:45:36

5GMEC網絡

2015-09-15 13:52:33

2021-03-09 10:06:34

大數據畫像數據采集

2024-02-23 09:00:00

編程語言編譯器工具

2017-08-23 11:51:42

優锘眼鏡猴

2024-07-04 12:10:50

2023-10-07 15:49:09

RustIDE工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区免费 | 国产乱码精品1区2区3区 | 久久久网 | 在线观看黄色电影 | 中文字幕亚洲精品 | 91国产视频在线观看 | 欧美日韩亚洲视频 | 亚洲国产一区二区视频 | 亚洲精品久久久久中文字幕欢迎你 | 国产69精品久久久久777 | 日韩成人一区 | 亚洲人的av | 国产精品观看 | 国产精品久久久久久久久久妞妞 | 午夜精品一区二区三区在线观看 | 欧美精品福利视频 | 天天看天天摸天天操 | 99精品久久99久久久久 | 另类在线 | 一二三在线视频 | 视频1区| 成人精品一区二区 | 国产成人福利视频在线观看 | 国产黄色在线观看 | 成人免费淫片aa视频免费 | 久久久久亚洲 | 一区二区三区不卡视频 | 在线国产视频 | 韩国理论电影在线 | 亚洲精品久久久一区二区三区 | 国产视频2021 | 91网站在线播放 | 国产精品三级 | 九九精品在线 | 国产精品资源在线观看 | 成人综合在线视频 | 国产精品久久久久久久久久久免费看 | 精品中文字幕一区 | 欧美亚洲高清 | www国产亚洲精品 | 久久黄色网 |