用 Tab 還是 Space?事關程式設計師的信仰之爭。2015 年程式設計師 Uku Pattak 分析了 GitHub 上多種語言的熱門專案(star 數量高)中使用 Tab 和空格的對比情況。2016 年,谷歌程式設計師 Felipe Hoffa 分析了 10 億份程式碼。
分析結果可先看下圖:
40萬個repo, 10億份程式碼檔案, 14TB 程式碼
規則:
- 資料來源:已儲存在 BigQuery 上的 GIthub 文件
- Star 很重要:只選擇了2016年1月到5月之間加星量(star)在前 40 萬個的專案
- 排除小檔案:程式碼檔案至少得有 10 行程式碼,開始的字元是:空格或者製表符
- 去除冗餘:不管它們存在於多少個專案中,相同的程式檔案只算一次
- 一個檔案一票:有些程式碼檔案中混用了製表符和空格。如果該檔案製表符用的多,那它就算製表符一票。反之亦然。
- 只考慮使用廣泛的程式語言:我只選取了有下面這些字尾的檔案:(.java, .h, .js, .c, .php, .html, .cs, .json, .py, .cpp, .xml, .rb, .cc, .go)
資料
實現方法
我使用了已有的 [bigquery-public-data:github_repos.sample_files] 表。這個表列出了排名最前的 40 萬個專案。從中提取了含有被廣泛使用的語言字尾的檔案。
1 2 3 4 5 6 7 8 9 |
SELECT a.id id, size, content, binary, copies, sample_repo_name , sample_path FROM ( SELECT id, FIRST(path) sample_path, FIRST(repo_name) sample_repo_name FROM [bigquery-public-data:github_repos.sample_files] WHERE REGEXP_EXTRACT(path, r'.([^.]*)$') IN ('java','h','js','c','php','html','cs','json','py','cpp','xml','rb','cc','go') GROUP BY id ) a JOIN [bigquery-public-data:github_repos.contents] b ON a.id=b.id |
1 |
864.6s elapsed, 1.60 TB processed |
由於我要聯結分別有 1.97 億行和 0.7 億行的兩個表(一共有 1.6T 資料量),這個過程花費了不少時間。我把結果放在這裡了[fh-bigquery:github_extracts.contents_top_repos_top_langs],你們就不用重新跑這個過程了。
在 [contents] 表格中,包含了去冗餘之後的所有檔案。下面的命令列用來檢查檔案數量和大小。
1 2 |
SELECT SUM(copies) total_files, SUM(copies*size) total_size FROM [fh-bigquery:github_extracts.contents_top_repos_top_langs] |
10 億檔案,14TB程式碼
然後開始按照前面提到的規則排序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
SELECT ext, tabs, spaces, countext, LOG((spaces+1)/(tabs+1)) lratio FROM ( SELECT REGEXP_EXTRACT(sample_path, r'.([^.]*)$') ext, SUM(best='tab') tabs, SUM(best='space') spaces, COUNT(*) countext FROM ( SELECT sample_path, sample_repo_name, IF(SUM(line=' ')>SUM(line='t'), 'space', 'tab') WITHIN RECORD best, COUNT(line) WITHIN RECORD c FROM ( SELECT LEFT(SPLIT(content, 'n'), 1) line, sample_path, sample_repo_name FROM [fh-bigquery:github_extracts.contents_top_repos_top_langs] HAVING REGEXP_MATCH(line, r'[ t]') ) HAVING c>10 # at least 10 lines that start with space or tab ) GROUP BY ext ) ORDER BY countext DESC LIMIT 100 |
1 |
16.0s elapsed, 133 GB processed |
分析 133G 程式碼只有 16 秒?我愛 BigQuery。
最後 Felipe Hoffa 還貼上一個視訊
在熱播劇《矽谷》第三季中,不僅有 Tab 和 Space 之爭,也有 Vim 和 Emacs……結果導致一對程式設計師做不成情侶了
視訊亮點在結尾 :)
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!
任選一種支付方式