はじめに
今年2020年に、Qiitaでどんなプログラミング言語の記事が書かれたか、興味本位で調べてみました。
せっかく調べたので、集計結果を紹介したいと思います。
その前に、TIOBE INDEXについて
TIOBE INDEXは、プログラミング言語の人気度を独自の集計法で、毎月発表しているサイトです。
あくまで一つの目安と思っていますが、ついつい見ています。
ちなみに、TIOBE INDEXでのD言語は、20位台を行ったり来たりです。
一時的に、2020年1月前後の数か月は10位台に入っていました。![]()

ただ、2020年12月時点では20位台に戻ったという状況です。


TIOBE INDEXは、その時々の人気度を集計する仕組みだからか、毎月順位が大きく変動します。
よくよく考えると、数百種類あるといわれるプログラミング言語の中で、D言語が20位台とは結構な上位ですよね。
本当のところはどうなんだろう?
また、日本と海外とでは、人気度は違うのかなと思いました。
そんなこんなで、自分でも何か調べられないかと思い、この記事に至りました。
集計方法とソースコード
TIOBE INDEXで集計しているプログラミング言語とQiita Advent Calendar 2020にエントリーされたプログラミング言語を参考にQiitaでの記事数を取得する処理をD言語で書きました。
プログラミング言語ではないと思われるものは、対象外にしました。
検索条件のtag:にプログラミング言語が含まれるもの、さらにcreated:>2020-01を加えることで、今年の記事数に絞りました。
集計結果が0件となったものは、出力対象外にしました。
import std.algorithm.sorting;
import std.conv;
import std.net.curl;
import std.stdio;
import std.string;
import std.uri;
void main()
{
string[] language = [
"ABAP", "ABC", "ActionScript", "Ada", "Apex",
"Applescript", "Assembly/アセンブラ/アセンブリ/アセンブリ言語", "AutoLISP", "Awk",
"Bash/Shell", "Befunge", "C", "C#", "C++", "CL",
"Clojure", "COBOL", "CoffeeScript", "Common-lisp/Lisp", "Crystal",
"Dart", "Delphi/ObjectPascal/Pascal", "Deno", "Dlang/D言語", "Elixir",
"Elm", "Erlang", "F#", "Factor", "Forth",
"Fortran", "Go", "GoogleAppsScript", "Groovy", "Hack/Hacklang/HHVM",
"Haskell", "IchigoJam", "Icon", "Idris", "Io",
"J", "Java", "JavaScript", "Julia", "Kotlin",
"LabVIEW", "Logo", "Lua", "MATLAB/Simulink", "Mind",
"ML", "MQL4", "NATURAL", "Neon", "Nim",
"ObjectiveC/Objective-C", "OCaml", "OpenCL", "Oz", "Perl",
"PHP", "PLSQL", "PowerShell", "Prolog", "Python",
"Q", "R", "REXX", "Ring", "RPG",
"Ruby", "Rust", "SAS", "Scala", "Scheme",
"Scratch", "Smalltalk", "Solidity", "SPARK", "SPSS",
"SQL", "Stan", "Stata", "Svelte", "Swift",
"Tcl", "Transact-SQL", "TypeScript", "Vala/Genie", "VBScript",
"Verilog/SystemVerilog", "VHDL", "VisualBasic/VB/VB.Net", "Vvvv", "Wenyan/文言",
"なでしこ",
];
int[string] counter;
foreach ( s; language ){
int c = getCount(s);
if ( c > 0 ){
counter[s] = c;
}
}
writefln("|プログラミング言語|件数|");
writefln("|:-----------------|---:|");
foreach ( lang; counter.keys.sort!((a, b){return counter[a] > counter[b];}) ){
writefln("|%s|%s|", lang, counter[lang]);
}
}
int getCount(string lang)
{
lang = lang.replace("/", " OR created:>2020-01 tag:");
string sUrl = "https://qiita.com/search?q=created%3A>2020-01+tag%3A" ~ lang.encodeComponent;
auto http = HTTP();
string response = cast(string)get(sUrl, http);
string keyword1 = `<span class="badge">`;
string keyword2 = `</span>`;
int ind1 = indexOf(response, keyword1);
int ind2 = indexOf(response, keyword2, ind1);
return ( response[(ind1 + keyword1.length) .. ind2].to!int );
}
連想配列のソート
D言語は言語仕様として、連想配列が用意されています。
ソースコードqiitacount.dで宣言しているint[string] counterが連想配列です。プログラミング言語(string型)をキーに、記事の件数(int型)を値として、集計結果をセットしています。
連想配列をソートすることができます。
キーの昇順にソートする場合と、値の昇順にソートする場合の例を紹介します。
import std.stdio;
import std.algorithm;
void main()
{
immutable string[string] colors = [
"red" : "akairo",
"pink" : "momoiro",
"yellow" : "kiiro",
"purple" : "murasakiiro",
"blue" : "aoiro"
];
auto keys = colors.keys;
writeln("キー順にソート");
keys.sort!("a < b");
foreach ( key; keys ){
auto value = colors[key];
writefln("%-10s=> %s", key, value);
}
writeln;
writeln("値順にソート");
keys.sort!((a, b){return colors[a] < colors[b];});
foreach ( key; keys ){
auto value = colors[key];
writefln("%-10s=> %s", key, value);
}
}
キー順にソート
blue => aoiro
pink => momoiro
purple => murasakiiro
red => akairo
yellow => kiiro
値順にソート
red => akairo
blue => aoiro
yellow => kiiro
pink => momoiro
purple => murasakiiro
集計結果
qiitacount.dの実行結果(2020/12/26 20:10頃実行)は、Markdownなので、そのまま貼り付けます。2020年はあと数日ありますが、傾向はつかめるかと思います。
私自身、プログラミング言語の種類には詳しくないです。ということもあって、プログラミング言語のタグが複数に分かれているとせっかくの記事が見つけられずにもったいないなと感じました。(VB.Netとか、アセンブラとか。他にも取りこぼしがありそう)
D言語では、dlang、D言語、Dlanguage、D、d_langのタグが使われていましたが、最近の記事はdlang、D言語のいずれかのタグが付いているようです。
改めてQiitaにはいろんな記事が書かれているんだなと、ただただ感心しました。世の中は広いです。
| プログラミング言語 | 件数 |
|---|---|
| Python | 14926 |
| JavaScript | 9475 |
| Ruby | 7398 |
| PHP | 4433 |
| Java | 3562 |
| Swift | 3048 |
| C# | 2429 |
| TypeScript | 2414 |
| Go | 2009 |
| C++ | 1774 |
| Kotlin | 1310 |
| SQL | 1199 |
| Bash/Shell | 956 |
| Rust | 899 |
| GoogleAppsScript | 863 |
| R | 776 |
| C | 634 |
| PowerShell | 626 |
| Dart | 583 |
| Elixir | 408 |
| MATLAB/Simulink | 306 |
| Scala | 276 |
| Julia | 251 |
| Haskell | 193 |
| Perl | 174 |
| Deno | 156 |
| ObjectiveC/Objective-C | 133 |
| VisualBasic/VB/VB.Net | 133 |
| SPARK | 108 |
| Apex | 103 |
| Elm | 95 |
| VBScript | 93 |
| Svelte | 90 |
| Delphi/ObjectPascal/Pascal | 89 |
| Assembly/アセンブラ/アセンブリ/アセンブリ言語 | 85 |
| Fortran | 84 |
| Nim | 75 |
| Common-lisp/Lisp | 74 |
| ABC | 69 |
| Awk | 64 |
| F# | 62 |
| Verilog/SystemVerilog | 61 |
| Solidity | 58 |
| Lua | 56 |
| Scratch | 54 |
| Dlang/D言語 | 54 |
| Applescript | 50 |
| なでしこ | 49 |
| Prolog | 45 |
| SAS | 41 |
| PLSQL | 41 |
| Scheme | 41 |
| SPSS | 39 |
| Erlang | 36 |
| Groovy | 35 |
| OCaml | 33 |
| Mind | 32 |
| Neon | 30 |
| COBOL | 30 |
| Stan | 29 |
| Clojure | 27 |
| ABAP | 26 |
| AutoLISP | 26 |
| VHDL | 23 |
| ML | 22 |
| J | 20 |
| OpenCL | 19 |
| MQL4 | 15 |
| Tcl | 14 |
| Wenyan/文言 | 14 |
| IchigoJam | 13 |
| Hack/Hacklang/HHVM | 12 |
| RPG | 12 |
| Icon | 11 |
| ActionScript | 10 |
| Crystal | 10 |
| CL | 9 |
| Vala/Genie | 9 |
| CoffeeScript | 9 |
| Forth | 8 |
| Smalltalk | 8 |
| Transact-SQL | 5 |
| Befunge | 5 |
| Io | 5 |
| LabVIEW | 4 |
| Idris | 3 |
| Logo | 2 |
| Q | 2 |
| Vvvv | 1 |
| Stata | 1 |