写点什么

周末的时间,我们在 GitHub 用什么语言编程?

  • 2017-04-04
  • 本文字数:4095 字

    阅读完需:约 13 分钟

村上春树(日本后现代主义作家)有一本书,《当我跑步时, 我谈些什么》,Felipe 这篇文章的统计数据和这本书有点类似,周末的时间我们会使用什么语言进行编程,看了他的文章,我们会知道在办公室里使用的语言,不过是谋生工具而已,私底下大家并不喜欢它们。

下面这张表格的内容是 2016 年度排名前 20 位的周末编程语言,根据 GitHub (全球领先的软件开发平台)、 GHTorrent (监控着 GitHub 上的每一次更改,并将每一次更改的更新内容,以 JSON 字符串形式存储在 MongoDB 数据库)、 BigQuery (谷歌的数据仓库)等三个平台数据作为分析数据源。

从上面这张表格我们可以看到,排名前二十位的分别是:

  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 等等))。

让我们看看这些 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#.4wpjnqty9 http://ghtorrent.org/gcloud.html


感谢丁晓昀对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-04-04 19:004044
用户头像

发布了 50 篇内容, 共 27.4 次阅读, 收获喜欢 40 次。

关注

评论

发布
暂无评论
发现更多内容

堡垒机免费版有哪些功能啊?后面需要过等保怎么办?

行云管家

安全运维 运维软件 免费运维

深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick、Transformer Encoder等原理详细讲解

汀丶人工智能

自然语言处理 深度学习 预训练模型 Transformer GPT

基于openfaas托管脚本的实践

百度Geek说

数据库 百度 企业号 5 月 PK 榜

官宣!时序数据库 TDengine 与天翼云完成产品兼容性认证

爱倒腾的程序员

涛思数据 时序数据库 ​TDengine

面试进阶齐飞!Github一天万赞的阿里Java系统性能优化有多牛?

Java你猿哥

Java JVM ssm Java性能优化

深入浅出微服务:40个微服务架构实战案例(Dubbo+Springcloud)

做梦都在改BUG

Java 微服务 Spring Cloud

手机一开,说办就办!指尖上的“数字江西”

OceanBase 数据库

数据库 oceanbase

揭秘百度IM消息中台的全量用户消息推送技术改造实践

JackJiang

消息推送 即时通讯IM im开发

AI 换脸技术:你的照片可能被滥用了!

郑州埃文科技

AI 数据治理

深度解析 slab 内存池回收内存以及销毁全流程

bin的技术小屋

Linux 内存管理 Linux Kenel 内存池 slab

【5.19-5.26】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

7个工程应用中数据库性能优化经验分享

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

Github标星78k,Alibaba最新发布的Spring Boot项目实战文档!太强了

Java你猿哥

Java 面试 Spring Boot ssm Spring MVC

TiDBv6.5离线部署

TiDB 社区干货传送门

6.x 实践

TiDB x Flink 数据集成实践

TiDB 社区干货传送门

实践案例 大数据场景实践 数据中台场景实践 OLAP 场景实践

SpringBoot 实现启动项目后立即执行方法的几种方式

Java你猿哥

源码 jdk Spring Boot ssm

杜绝开源依赖风险,许可证扫描让高效&合规「两不误」

极狐GitLab

DevOps DevSecOps 开源许可证 极狐GitLab 安全合规

阻抗板是否高可靠,华秋有话说

华秋电子

数据可视化:相关类可视化图表大全

2D3D前端可视化开发

数据可视化控件 数据可视化工具 可视化数据 可视化图表 数据可视化设计

微服务是不是金科玉律?基于Spring Cloud如何构建分布式系统?

做梦都在改BUG

Java 架构 微服务 Spring Cloud

阿里全新推出:微服务突击手册,把所有操作都写出来了|超清PDF

Java你猿哥

Java spring Spring Cloud ssm Ribbon

网闸、防火墙、堡垒机三大定义说明

行云管家

防火墙 堡垒机 网闸

属实不赖!Alibaba开源GitHub星标114K微服务架构全彩进阶手册

Java你猿哥

Java 架构 微服务 微服务架构 ssm

Github上星标55.9k的微服务神仙笔记真的太香了

做梦都在改BUG

Java 架构 微服务 Spring Cloud 设计模式

生态伙伴 | 携手深圳科创学院,持续推动项目落地与成长

华秋电子

C4D 常用 14 款插件

Finovy Cloud

C4D 3D软件

3D LED显示屏选购指南

Dylan

3D LED显示屏 避坑指南

软件测试/测试开发丨Web自动化测试中显式等待的高级使用

测试人

程序员 软件测试 自动化测试 测试开发

JVM——解析运行期优化与JIT编译器

Java你猿哥

JVM ssm 虚拟机 编译器 JIT编译器

TiDB x Flink x Iceberg 实时 ODS 实践

TiDB 社区干货传送门

实践案例 大数据场景实践 实时数仓场景实践 数据中台场景实践 OLAP 场景实践

TiDB 使用国内公有云和私有部署的 S3 存储备份指南

TiDB 社区干货传送门

数据库架构设计 6.x 实践

周末的时间,我们在GitHub用什么语言编程?_GitHub_Felipe Hoffa_InfoQ精选文章