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

2020-12-23 Nodejs開發

作者: Phodal 來源:phodal

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

作為一個職業的程式設計師,在我們的職業生涯裡,不可避免地要學習一個又一個的程式語言。雖然多數情況下,我們對於使用什麼語言並沒有太多的選擇權。但是,當我們選擇一門語言時,都要考慮一系列的要素,比如:

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

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

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

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

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

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

IDE 通過某種通訊機制,與 Gradle 進行通訊,以執行對應的命令,如 build。Gradle 接收到 IDE 的指令後,解析 build.gradle 相關的內容,尋找是否存在對應的 Task,如這裡的 build。執行 build 時,首先要去解決依賴關係,如從對應的 Maven 倉庫中下載依賴。隨後,真正地執行對應的構建任務,如調用 javac。這個過程看上去非常簡單,但是背後還藏著諸多的細節問題。

構建與依賴管理

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

:compileJava UP-TO-DATE:processResources UP-TO-DATE:classes UP-TO-DATE:run

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

判斷是否存在本地的依賴,如果沒有的話,從遠程獲取。如果有依賴衝突的話,解決這些衝突,或者報錯。獲取依賴後,根據需要對依賴進行處理。如 Android 中的 aar 包的解壓等。結合依賴,對源碼進行編譯將所需要的 Java Resources 從依賴的 Jar 拷貝到指定目錄打包構建後的產物到一個新的 jar 包中這些只是表面上的一些工作。而為了更好地表述這個過程,需要抽象出一個 task 的概念,在這個概念裡,一個 task 有輸入和輸出。如

解析依賴裡。它的輸出是 build.gradle 文件,輸出是處理完的依賴路徑。編譯任務裡。它的輸入是源碼,輸出是 .class 文件。打包任務裡。它的輸入是一堆文件夾或者文件,輸出是一個 .jar 包。……於是,在有了這些基礎之後,為了加快構建,還需要緩存的機制。它對輸入和輸出進行計算,當兩者發生變化的時候,再進行編譯。否則就跳過這個任務。

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

IDE 與構建系統

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

語法高亮子系統關聯與集成跳轉與引用分析智能感知重構快速修復結構化視圖……在這篇文章中,大概再回顧一下它與構建系統之間的關係。IDE 與構建系統一般會存在這種關聯:

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

由構建系統提供構建 API。如 Gradle Tooling API,在那篇《Gradle IDEA 的項目模型》中,我們實際上介紹了由構建系統主動向 IDE 提供模型的方式。由 IDE 構造一遍構建系統。如 IDEA 對於 Node.js 的處理方式。簡單來說,就是複雜的系統應該由構建系統提供機制,而簡單的構建系統則就不會有這樣的問題。

依賴管理的基礎設施

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

源碼包。即將源碼打包,並以特定的格式發布,適用於腳本語言倉庫源。方式類似於源碼包,唯一不同的地方是藉助於版本管理工具,如 Golang。類二進位包。典型的是 Java其它包。如 Maven 可以支持其它自製的包最有意思的是Maven 的機制,我可以自制依賴,並上傳上去。而整個倉庫並不關心這個包的內容,我們只需要依賴於它定義的格式即可。如果我們考慮圍繞語言來設計依賴管理體系,那麼可以考慮的是類似的方式,並藉助於 Git 這樣的版本工具。這樣一來,我們就可以去中心化。

相關焦點

  • 哪種Python IDE最適合你?這裡有一份優缺點列表
    兼容性:Windows、Linux、Mac OS主要插件和功能:簡易導航,實現高性能支持不同包,以自定義編輯器只需一個關鍵詞,即可複製常見代碼段即時項目切換和分割編輯優點:可處理多種標記語言。允許用戶選擇想要進行的項目。具備能夠提供類和函數寬索引的重要工具。提供強大的 API 和組織化的生態系統,以實現高性能。
  • 盤點當下幾款主流的 Python IDE,哪款最適合你?
    允許用戶在編輯器中搜索和替換文件。對於機器學習、人工智慧和大數據,最好的 Python 兼容 IDEPython 是機器學習、人工智慧、大數據等領域中的首選語言之一。這部分將介紹適合這些領域 Python 開發的 IDE。Atom 是一個開源編輯器,可與幾乎所有程式語言兼容,如 PHP、Java。它定期更新、可信賴,且具備通用性。
  • 「編程貓」MCC課程體系——小火箭編程課和探月編程課
    自2015年10月編程貓圖形化編 程平臺上線至今,通過構建科學完備的「工具+課程+平臺」少兒編程教育體系,積累用戶數量達3147萬(截止2019年9月),入駐海內外公立校超 過11500多所,吸納一線教研師資800餘人。自主研發的工具經過數百次迭代,更適合青少年兒童編程學習,並面向全球免費開放。編程貓致力用「好工具、好課程、好老師」培養未來創造者,讓更多的孩子以有趣的方式玩轉少兒編程。
  • 數學與編程的關係?機器人編程和Scratch編程衝突嗎?
    比如4-6歲的孩子,不必刻意學習,家長帶孩子一起玩一些能夠訓練邏輯思維的遊戲,看一些書籍,或者實物類的卡片闖關玩具等;7歲以上的孩子,邏輯思維開始更快的發展,作為家長的我們要開始制定一些編程學習計劃,早期以興趣培養為主,讓孩子喜歡上編程,中期側重訓練孩子的邏輯思維和項目構建能力,進一步還可以學習編程算法,進而過渡到真實語言類編程的學習。
  • 2020年最流行的10種程式語言是什麼?
    新技術和創新技術項目對於組織迅速擴大規模極為寶貴。技術是通過程式語言來實現的,技術領域中有600多種程式語言。程式語言的命令和識別每年都在變化。此外,新的程式語言還具有引人注目的特性和功能。為了促進軟體開發服務和Web應用程式的需求,以下急需提及的十大最受歡迎的程式語言。1.
  • 軟體項目實訓及課程設計指導——如何實現面向服務的系統架構設計
    因此,面向服務的軟體系統體系架構設計方法目前還廣泛地應用於企業內部的ERP(Enterprise Resource Planning,企業資源計劃)、CRM(Customer Relationship Management,客戶關係管理)、SCM(Supply chain Management,供應鏈管理)和HRM(Human Resource Management,人力資源管理)等類型的企業應用系統的開發實現中
  • Arduino可以使用哪些程式語言
    您不必局限於用C編程。將這些替代語言用於測試驅動器。 Arduino IDE是項目背後精神的核心,它是一個UI,它試圖轉變艱巨的學習任務將一種程式語言轉換成任何人都可以刺入的東西。當然,這是一個崇高的原因,但是很可能會出現IDE限制您的創造力的情況。 就像各種各樣的編碼語言一樣,有很多不同的原因您可能想採用其他編程方法。
  • 最適合兒童的程式語言 - Python
    對於開展STEAM教育,Scratch圖形編程是最適合的方式之一。低齡的小朋友在接受和掌握一門語言上難度過大,對數理邏輯也是處於認知階段。所以採用圖形動畫和聲音的互動方式的教授學習效果最為合適。Scratch圖形編程體現在簡單的編程邏輯體驗和入門,針對的一般是小學及以下階段的學生。
  • 2021年程式語言趨勢預測:Python和JavaScript仍火熱,Go不可小覷
    編譯 | 陳大鑫Tensorflow和Pytorch到底該用哪個呢?「import tensorflow as pytorch!」程式語言及框架似乎總是被人拿來比較,這裡我們只談語言。作為開發人員,在當今這個技術更迭飛快的時代要連年吃香並非易事,很多十年開發經驗以上的開發人員不知道經歷了多少語言的變化,今年還在用C語言,下一年就是D了。「PHP是世界上最好的程式語言」已被人忘卻,但「青春飯」和35歲「金龍躍魚門」的傳說確真實發生。
  • 哪些是IT行業有前景的程式語言!
    最近和不少30多歲的程式設計師朋友們聊天,發現大家普遍非常焦慮,對於初學編程的人來說,最大的困難是不知道從何處入手,不知道應該選擇哪門程式語言。接下來小千給大家詳細介紹一下2020年最有前景的程式語言,不論你是剛入門,還是打算再學一門語言提升一下自己,你一定需要了解一下哪些是當前最有前景的程式語言。
  • 2020程式語言排行榜:Rust首次進入人氣排行榜前20名
    人們對使用內存安全Rust進行系統編程以構建主要平臺的興趣日益濃厚,尤其是在微軟(Microsoft),該公司正在Windows和Azure上對其進行探索,其目標是消除用C和C++編寫的代碼中的內存bug。
  • 最受程式設計師歡迎的十大程式語言
    2、C   相關職位:底層軟體開發人員、應用程式開發人員、測試人員   它是最古老的程式語言之一,且仍是頂級的程式語言之一,由於它有良好的可移植性,所以至今仍被Microsoft,Oracle和Apple在內的多個科技巨頭公司沿用,它幾乎可以與所有系統一起使用,非常適合於作業系統和嵌入式系統的開發。
  • 企業合規、內控、風險一體化管理體系的構建
    按2012年頒布的《關於加快構建中央企業內部控制體系有關事項的通知》規定,央企必須每年5月31日前向國資委報送內部控制評價報告,同時抄送派駐本企業監事會。全面風險管理指引文件是國資委企業改革局主導制定的,反映了監管部門對企業建立全面風險管理體系,實現風險管理總體目標的要求。
  • 都說Rust程式語言難學,那我們Ubuntu系統裡安裝下試試
    近日,程式語言Rust的官方在全球做了一個調查,然後發布了 2020 年 Rust 調查報告。這個又引發大家一陣對Rust的討論。這個曾經很小眾的程式語言,發布以後近些年越來越受開發者和企業的認可。因為機智客看科技平臺調查報告得知,擁有系統編程知識(至少具備一定的 C/C++ 經驗)的開發者在使用 Rust 會更得心應手一些。既然Rust這麼有挑戰性,那麼我們就不怕死地試著安裝一下Rust,就在Ubuntu20.04系統中安裝Rust吧,首先要打開終端,照例用命令更新一下。
  • 2021 年,這8種程式語言最流行
    儘管理解諸如變量、數據結構和條件語句等核心編程概念非常重要,但 Ruby 和 Ruby on Rails 的簡單性意味著,一旦你掌握了基礎知識,下一步應該是嘗試構建一個自己的簡單的 Web 應用。 6. 最流行的移動應用和 Web 開發程式語言:JavaScript
  • 沒學過計算機知識的人到底能否自學程式語言
    首先,在當前的大數據、人工智慧時代,更多的學生和職場人都希望通過掌握一門程式語言來擴展自身的能力邊界,而對於沒有任何計算機基礎知識的人來說,在面對程式語言的時候,往往會無從下手,這也是一個比較普遍的問題。
  • 編程體系結構:Spring.Mvc.Boot框架
    基本特性:分層架構、高內聚低耦合、支持AOP編程、事務管理、集成測試、集成各種框架。2、核心組件核心容器:包含Bean的創建、配置、管理等功能。5、IOC與DI思想IOC容器Java系統中對象耦合關係十分複雜,系統的各模塊之間依賴,微服務模塊之間的相互調用請求,都是這個道理。降低系統模塊之間、對象之間、微服務的服務之間耦合度,是軟體工程核心問題之一。
  • 極客晨星:編程要從娃娃抓起,少兒編程要構建起新的思維模式
    如今是人工智慧時代,隨著時代的發展,少兒編程作為市場需求應運而生。極客晨星作為國內知名少兒編程品牌,四年來專注教研,為4-16歲孩子開發了一套獨特有趣的編程課程體系,幫助中國孩子高效學編程,構建新的思維模式。
  • 5 月程式語言排行榜:C 重回第一,今年程式語言名人堂冠軍還會是它...
    這聽起來可能很傻,但有些程式語言確實從這種情況中受益。數據科學領域的例子有Python和R,因為每個人都在尋找病毒的解毒劑。但是,嵌入式軟體軟體如C和C++也越來越受歡迎,因為它們被用在醫療設備的軟體中。另一方面,值得一提的是,Rust現在已經接近前20名(一個月內從27名升至21名)。-保羅詹森執行長蒂奧貝軟體TIOBE編程社區索引是程式語言流行程度的一個指標。
  • 「首席架構師推薦」程式語言InfoQ趨勢報告
    它是運行在Erlang虛擬機上的一種函數式、並發的通用程式語言。我們看到人們對基礎設施或特定於雲的語言、dsl和sdk(如Ballerina和Pulumi)的興趣和創新有所增加。2019年及以後的程式語言趨勢是什麼?本報告旨在幫助技術領導者做出中長期的技術投資決策,並幫助個別開發人員識別流行的程式語言,並選擇將他們寶貴的時間和資源投入到哪些新的程式語言學習和技能開發方面。