周末的時間,我們在GitHub用什么語言編程?

jopen 7年前發布 | 28K 次閱讀 Github

周末的時間,我們在GitHub用什么語言編程?

村上春樹(日本后現代主義作家)有一本書,《當我跑步時,我談些什么》,Felipe 這篇文章的統計數據和這本書有點類似,周末的時間我們會使用什么語言進行編程,看了他的文章,我們會知道在辦公室里使用的語言,不過是謀生工具而已,私底下大家并不喜歡它們。

下面這張表格的內容是 2016 年度排名前 20 位的周末編程語言,根據 GitHub(全球領先的軟件開發平臺)、GHTorrent(監控著 GitHub 上的每一次更改,并將每一次更改的更新內容,以 JSON 字符串形式存儲在 MongoDB 數據庫)、BigQuery(谷歌的數據倉庫)等三個平臺數據作為分析數據源。

周末的時間,我們在GitHub用什么語言編程?

從上面這張表格我們可以看到,排名前二十位的分別是:

  1. Rust
  2. Glsl(以C語言為基礎的高階著色語言,它是由 OpenGL ARB 建立)
  3. D(類似于C語法的靜態類型編程語言)
  4. Haskell(函數型編程語言)
  5. Common Lisp(Lisp 語言的分支)
  6. Kicad(開源的電路自動設計語言)
  7. Emacs Lisp(Lisp 語言的分支)
  8. Lua(輕量級的可擴展腳本語言)
  9. Scheme(函數式編程語言,是 Lisp 的兩種主要方言之一,另一種為 Common Lisp)
  10. Julia(針對數值計算的高性能動態編程語言)
  11. Elm(編譯為 JavaScript 的函數型語言)
  12. Eagle
  13. Racket(LISP 家族中的一員)
  14. Dart(分布式編程語言,谷歌的很多應用程序都依賴于這個語言)
  15. Nsis(全稱 Nullsoft Scriptable Install System)
  16. Clojure(Lisp 語言的一種,可以運行在 Java 虛擬機上)
  17. Kotlin(針對 JVM、安卓和瀏覽器設計的一種靜態類型語言)
  18. Elixir(運行在 Erlang VM,低延時語言)
  19. F#(微軟發展的為 .NET 語言提供運行環境的程序設計語言,屬于函數型語言)
  20. 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 等等))。

周末的時間,我們在GitHub用什么語言編程?

讓我們看看這些 2016 年流行的周末“Happy Hour”語言的變化趨勢,如圖所示:

周末的時間,我們在GitHub用什么語言編程?

我們解釋一下上面這張圖所表達的含義:

  • Rust 語言過去只在工作日使用,最近 6 年呈現爆發性增長,成為一門“周末”語言;
  • 越是流行,越是會成為一門“周末”語言;
  • Puppet 語言周末大家用得很少,一直都很少;
  • Ruby 正在逐漸和日常工作脫離,轉而進入編程愛好者的周末樂園;
  • R語言看得出來前兩年(2014、2015)很火,但是 2016 年又回歸到了中等熱度;
  • Haskell、Clojure,誰讓人工智能這么火呢,這兩門語言自然在周末也得多練習;
  • Arduino 語言正在逐漸火起來;
  • Python 和C,這幾年還是有很多開發人員在使用,保持著持續流行狀態。

那么其他語言是如何按照流行程度排序的?請看下面這張圖:

周末的時間,我們在GitHub用什么語言編程?

作者列舉了一些來自 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 ArchiveGitHub repos on BigQueryStack Overflow on BigQuery

原文地址:The top weekend programming languages — based on GitHub’s activity

40https://medium.com/google-cloud/github-on-bigquery-analyze-all-the-code-b3576fd2b150#.4wpjnqty9http://ghtorrent.org/gcloud.html

來自: InfoQ

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!