周末的時間,我們在GitHub用什么語言編程?
村上春樹(日本后現代主義作家)有一本書,《當我跑步時,我談些什么》,Felipe 這篇文章的統計數據和這本書有點類似,周末的時間我們會使用什么語言進行編程,看了他的文章,我們會知道在辦公室里使用的語言,不過是謀生工具而已,私底下大家并不喜歡它們。
下面這張表格的內容是 2016 年度排名前 20 位的周末編程語言,根據 GitHub(全球領先的軟件開發平臺)、GHTorrent(監控著 GitHub 上的每一次更改,并將每一次更改的更新內容,以 JSON 字符串形式存儲在 MongoDB 數據庫)、BigQuery(谷歌的數據倉庫)等三個平臺數據作為分析數據源。
從上面這張表格我們可以看到,排名前二十位的分別是:
- Rust
- Glsl(以C語言為基礎的高階著色語言,它是由 OpenGL ARB 建立)
- D(類似于C語法的靜態類型編程語言)
- Haskell(函數型編程語言)
- Common Lisp(Lisp 語言的分支)
- Kicad(開源的電路自動設計語言)
- Emacs Lisp(Lisp 語言的分支)
- Lua(輕量級的可擴展腳本語言)
- Scheme(函數式編程語言,是 Lisp 的兩種主要方言之一,另一種為 Common Lisp)
- Julia(針對數值計算的高性能動態編程語言)
- Elm(編譯為 JavaScript 的函數型語言)
- Eagle
- Racket(LISP 家族中的一員)
- Dart(分布式編程語言,谷歌的很多應用程序都依賴于這個語言)
- Nsis(全稱 Nullsoft Scriptable Install System)
- Clojure(Lisp 語言的一種,可以運行在 Java 虛擬機上)
- Kotlin(針對 JVM、安卓和瀏覽器設計的一種靜態類型語言)
- Elixir(運行在 Erlang VM,低延時語言)
- F#(微軟發展的為 .NET 語言提供運行環境的程序設計語言,屬于函數型語言)
- Ocaml
這個排名很清晰地告訴我們,2016 年屬于 Functional Languages(函數型語言),以及 3D 世界的腳本語言。另外學習 Java 的朋友可以發現,Java 沒有入選,但是很多函數型語言可以基于 JVM 運行,這給了我們一個提示,即未來 JVM 將會包容更多的語言,而不僅僅是 Java 語言本身。
再來看看后 20 位語言,你會發現很多我們日常謀生的語言都在這里呢,包括:
- Nginx(高性能的 HTTP 和反向代理服務器,也是 IMAP/POP3/SMTP 服務器)
- Matlab(美國 MathWorks 公司出品的商業數學軟件,用于算法開發、數據可視化、數據分析以及數值計算的高級技術計算語言和交互式環境)
- Processing(具有革命前瞻性的新興計算機語言,是 Java 語言的延伸,并支持許多現有的 Java 語言架構,不過在語法(syntax)上簡易許多,并具有許多貼心及人性化的設計)
- Vue(前端開發庫,通過簡潔的 API 提供高效的數據綁定和靈活的組件系統)
- Fortran(世界上最早出現的計算機高級程序設計語言,廣泛應用于科學和工程計算領域)
- Visual Basic(這是我上大學時候最常用的語言,一種高級語言,具備可操作的 GUI 界面)
- Objective-C++(主要使用于 Mac OS X 和 GNUstep 這兩個使用 OpenStep 標準的系統)
- Plsql(是一種程序語言,叫做過程化 SQL 語言(Procedural Language/SQL))
- Plpgsql
- Web Ontology Language(W3C 推薦的語義互聯網中本體描述語言的標準)
- Smarty(使用 PHP 寫出來的模板引擎,是目前業界最著名的 PHP 模板引擎之一)
- Groovy(基于 JVM(Java 虛擬機)的敏捷開發語言,它結合了 Python、Ruby 和 Smalltalk 的許多強大的特性,Groovy 代碼能夠與 Java 代碼很好地結合,也能用于擴展現有代碼)
- Batchfile
- Objective-C
- Powershell(命令行外殼程序和腳本環境,使命令行用戶和腳本編寫者可以利用 .Net Framework 的強大功能)
- Xslt(擴展樣式表轉換語言的外語縮寫,這是一種對 XML(標準通用標記語言的子集)文檔進行轉化的語言,XSLT 中的T代表英語中的“轉換”(Transformation))
- Cucumber(能夠理解用普通語言描述的測試用例的支持行為驅動開發(BDD)的自動化測試工具,用 Ruby 編寫,支持 Java 和·Net 等多種開發語言)
- Hcl
- Puppet(Linux、Unix、Windows 平臺的集中配置管理系統,使用自有的 Puppet 描述語言,可管理配置文件、用戶、cron 任務、軟件包、系統服務等)
- Gcc Machine Description(GNU 編譯器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada 和 Go 語言的前端,也包括了這些語言的庫(如 libstdc++、libgcj 等等))。
讓我們看看這些 2016 年流行的周末“Happy Hour”語言的變化趨勢,如圖所示:
我們解釋一下上面這張圖所表達的含義:
- Rust 語言過去只在工作日使用,最近 6 年呈現爆發性增長,成為一門“周末”語言;
- 越是流行,越是會成為一門“周末”語言;
- Puppet 語言周末大家用得很少,一直都很少;
- Ruby 正在逐漸和日常工作脫離,轉而進入編程愛好者的周末樂園;
- R語言看得出來前兩年(2014、2015)很火,但是 2016 年又回歸到了中等熱度;
- Haskell、Clojure,誰讓人工智能這么火呢,這兩門語言自然在周末也得多練習;
- Arduino 語言正在逐漸火起來;
- Python 和C,這幾年還是有很多開發人員在使用,保持著持續流行狀態。
那么其他語言是如何按照流行程度排序的?請看下面這張圖:
作者列舉了一些來自 reddit 和 HN 的問題,并作出回復。
/u/techmidrop 說:“我媽媽說了,我只能在星期天的下午 4 點到 6 點使用 Rust”。
很多人和你一樣!Rust 這幾年來都位居周末語言榜首。但是回到 2010 年,它也是工作日語言之一。
/u/mooglinux 說:“我現在需要 GitHub 出一份報告,報告中需要說明哪些語言分別在周末、工作日被提交的次數最多”。
放心,會有的。
/u/MasterRaceLordGaben 說:“誰在周末玩 Assembly?”
也許是學生做家庭作業?Assembly 這門語言在這里其實不是很知名,也許是有人在 Stack
Overflow 里搜索問題答案,其實并不是真的想寫代碼。
作者使用 BigQuery 快速地分析了這些數據集,只用了 5 分鐘時間。
對 2016 年流行語言進行排名,代碼如下:
#standardSQL SELECT lang , ROUND(weekend/weekday,2) ratio , weekday, weekend , repos[OFFSET (0)].value sample_repo, repos[OFFSET (1)].value sample_repo_2 FROM ( SELECT lang, month , MAX(IF(weekday,c,null)) weekday, MAX(IF(NOT weekday,c,null)) weekend , ANY_VALUE (repos) repos FROM ( SELECT language lang, TIMESTAMP_TRUNC (created_at, YEAR) month , EXTRACT (DAYOFWEEK FROM a.created_at) BETWEEN 2 AND 6 weekday , COUNT(DISTINCT committer_id) c , APPROX_TOP_COUNT (repo, 3) repos FROM `ghtorrent-bq.ght_2017_01_19.commits` a JOIN `fh-bigquery.github_extracts.ght_project_languages` b ON a.project_id=b.project_id WHERE b.percent>0.25 AND EXTRACT (YEAR FROM a.created_at) BETWEEN 2016 AND 2016 GROUP BY 1,2,3 HAVING c>100 ) GROUP BY 1,2 ) WHERE (weekend+weekday)>1450 ORDER BY ratio DESC
對 2010-2016 年的數據畫圖,代碼如下:
#standardSQL SELECT * FROM ( SELECT *, 40-rn inv_rank, ROW_NUMBER () OVER(PARTITION BY month ORDER BY ratio) weekend_rank, MAX(month) OVER(PARTITION BY lang) max_month FROM ( SELECT lang, month , ROUND(weekend/weekday,2) ratio , weekday, weekend, weekday+weekend total , repos[OFFSET (0)].value sample_repo , ROW_NUMBER () OVER(PARTITION BY month ORDER BY weekday+weekend DESC) rn FROM ( SELECT lang, month , MAX(IF(weekday,c,null)) weekday, MAX(IF(NOT weekday,c,null)) weekend , ANY_VALUE (repos) repos FROM ( SELECT language lang, TIMESTAMP_TRUNC (created_at, YEAR) month , EXTRACT (DAYOFWEEK FROM a.created_at) BETWEEN 2 AND 6 weekday , COUNT(DISTINCT committer_id) c , APPROX_TOP_COUNT (repo, 3) repos FROM `ghtorrent-bq.ght_2017_01_19.commits` a JOIN `fh-bigquery.github_extracts.ght_project_languages` b ON a.project_id=b.project_id WHERE b.percent>0.25 AND language IN UNNEST (SPLIT ('rust,haskell,c,clojure,arduino,ruby,python,go,r,puppet,xml')) AND EXTRACT (YEAR FROM a.created_at) BETWEEN 2010 AND 2016 GROUP BY 1,2,3 ) GROUP BY 1,2 ) ) WHERE rn<=40 ) ORDER BY 2,3 DESC
外部查詢語句:
SELECT lang , EXTRACT (DAYOFWEEK FROM date) BETWEEN 2 AND 6 weekday , COUNT(DISTINCT email) c , APPROX_TOP_COUNT (repo, 3) repos FROM ( SELECT author.email, LOWER(REGEXP_EXTRACT (diff.new_path, r'\.([^\./\(~_ \- #]*)$')) lang, author.date, repo_name[OFFSET (0)] repo FROM `bigquery-public-data.github_repos.commits`, UNNEST (difference) diff WHERE EXTRACT (YEAR FROM author.date)=2016 ) WHERE lang IS NOT null AND LENGTH (lang)<8 AND REGEXP_CONTAINS (lang, '[a-zA-Z]') GROUP BY 1,2 HAVING c>100 ORDER BY c DESC
如何衡量數據:
SELECT lang , MAX(IF(weekday,c,null)) weekday, MAX(IF(NOT weekday,c,null)) weekend , ANY_VALUE (repos) repos FROM ( SELECT JSON_EXTRACT_SCALAR (payload, '$.pull_request.head.repo.language') lang , EXTRACT (DAYOFWEEK FROM created_at) BETWEEN 2 AND 6 weekday , APPROX_TOP_COUNT (repo.name, 3) repos , COUNT(DISTINCT actor.id) c FROM `githubarchive.year.2016` WHERE type='PullRequestEvent' GROUP BY 1,2 ) GROUP BY 1
備注:這個帖子中,作者主要使用了最新的 GHTorrent import on BigQuery,也許這些資料對讀者也有用,GitHub Archive、GitHub repos on BigQuery、Stack Overflow on BigQuery。
原文地址:The top weekend programming languages — based on GitHub’s activity
40: https://medium.com/google-cloud/github-on-bigquery-analyze-all-the-code-b3576fd2b150#.4wpjnqty9http://ghtorrent.org/gcloud.html
來自: InfoQ