今年もあっという間に12月となり、1年を総括したニュースを見かけるようになりました。今回は、2022年に飛躍した3つの言語を取り上げて比較してみましょう。各言語で簡単なバブルソートを実装してみて比較してみたいと思います。
2022年に飛躍したプログラミング言語は?
先日、2022年にGitHub上で最も使用されたプログラミング言語と使用率が元も増加したプログラミング言語のトップ10がそれぞれ発表されました。
この記事によると、2022年に最も利用されたのは、JavaScriptでした。2位がPython、3位がJava、4位がTypeScript、5位がC#、6位がC++、7位がPHP、8位がシェルスクリプト、9位がC言語、10位がRustでした。
そして、使用率が最も増加した言語は、1位がクラウドやネットワークの設定言語のHCL(成長率56.1%)、2位がRust(成長率50.5%)、3位がTypeScript(37.8%)、4位がLua(34.2%)、5位がGo(28.3%)、6位がシェルスクリプト、7位がMakefile、8位がC言語、9位がKotlin、10位がPythonという順位でした。
2022年3大飛躍言語でバブルソートを書いてみよう
そこで、今回は上記の結果を踏まえて筆者が2022年に最も飛躍したと感じる言語、Rust、TypeScript、Luaについて比較してみましょう。特に今回は「配列変数をどのように扱うのか」という点に注目しつつ、各言語でバブルソートを書いて比較してみましょう。
なお、バブルソートとは、隣り合う要素の大小を比較して、並び替えを行うソートアルゴリズムです。整列までの速度は遅いのですが、単純で実装が容易なのが特徴です。
Rustでバブルソート
プログラミング言語『Rust』は近年大きな注目を集めているプログラミング言語です。「効率的で信頼できるソフトウェアを誰もがつくれる言語」というキャッチコピーのもと開発されています。
OSやブラウザなど基盤システムで長年使われてきたC言語を置き換えることを目標にしており、実行速度を犠牲にすることなく、安全なメモリ管理など優れたアイデアが実現された言語です。技術者コミュニティサイトStack Overflowでは、2016年から6年にわたりずっと「最も愛されているプログラミング言語」で一位を獲得しています。
Rustでバブルソートを書くと次のようになります。以下のプログラムを「bsort.rs」という名前で保存します。
fn main() {
// 配列を定義 --- (*1)
let mut data = [5, 18, 3, 19, 9, 20, 15, 1, 12, 2];
// バブルソートを呼び出す --- (*2)
bubble_sort(&mut data);
// 結果を表示 --- (*3)
println!("{:?}", data);
}
// バブルソートを実装したもの --- (*4)
fn bubble_sort(arr: &mut [isize]) {
for i in 0..arr.len() {
for j in 0..arr.len() - i - 1 {
if arr[j] > arr[j + 1] {
arr.swap(j, j + 1);
}
}
}
}
プログラムをコンパイルして、実行しましょう。Rustをインストールした環境で、ターミナル(WindowsならPowerShell、macOSならターミナル.app)を開いて、以下のコマンドを実行しましょう。
$ rustc bsort.rs&& ./bsort
[1, 2, 3, 5, 9, 12, 15, 18, 19, 20]
プログラムを簡単に見てみましょう。(*1)では配列を定義し、(*2)では定義した配列を指定してバブルソート関数を呼び出し、(*3)でソート結果を表示します。
Rustはデータ型がしっかりしている静的型付き言語です。しかし、型推論の機能があるので、毎回データ型を記述する必要がなく、気軽にプログラムを記述できるのが良いところです。
TypeScriptでバブルソート
『TypeScript』は、マイクロソフトが開発し公開しているプログラミング言語です。JavaScriptを拡張して、大規模開発で役立つように、クラス定義や静的型付けを追加したものです。
TypeScriptのプログラムは、JavaScriptに変換して実行されます。JavaScriptに変換されるため、Webブラウザ上で動くのは当然のこと、Node.jsなどJavaScriptの実行エンジン上で動かすことができます。JavaScriptを使った大規模開発では、型の曖昧さによる実行時のエラーが問題になることが多かったのですが、TypeScriptを使う事でプログラムの実行前に明らかなバグを検出できるメリットがあります。
筆者自身も今年5月に、日本語プログラミング言語「なでしこ3」を全面的にJavaScriptからTypeScriptに書き換えました。これによりコードの堅牢性が高まっただけでなく、静的型導入により、開発時にエディタのコード補完が快適に使えるので移行のメリットを感じています。
それでは、TypeScriptでバブルソートのプログラムを見てみましょう。以下のプログラムを「bsort.ts」という名前で保存します。
// Arrayを定義 --- (*1)
const data = [5, 18, 3, 19, 9, 20, 15, 1, 12, 2];
// バブルソートを呼び出す --- (*2)
bubbleSort(data);
// 結果を表示 --- (*3)
console.log(data)
// バブルソートを行う関数 --- (*4)
function bubbleSort(arr: number[]): number[] {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length - i -1; j++) {
if (arr[j] > arr[j + 1]) {
const tmp = arr[j]; // 要素を入れ替え --- (*5)
arr[j] = arr[j + 1];
arr[j + 1] = tmp
}
}
}
return arr;
}
TypeScriptを実行する方法はいろいろありますが、TypeScriptのプログラムを直接実行できるBunを使ってみましょう。『Bun』は開発者が約10億円を調達したことでも話題になった高速なJavaScript/TypeScriptの実行環境です。
Bunをインストールした環境で、以下のコマンドを実行します。
$ bun run bsort.ts
[ 1, 2, 3, 5, 9, 12, 15, 18, 19, 20 ]
簡単にプログラムを確認してみます。(*1)で配列オブジェクトのArrayを定義します。(*2)ではバブルソートの関数を呼び出します。そして、(*3)でソート結果を表示します。(*4)以降でバブルソートを行う関数を定義します。(*5)では配列の要素arr[j]とarr[j+1]を入れ替えます。
JavaScriptのスーパーセットだけあって、JavaScriptのコードとほとんど代わりありません。ここでは(*4)の関数の引数と戻り値の型だけを数値配列(number[])であることを明示しました。
Luaでバブルソート
『Lua』は様々な環境に手軽に組み込んで使えるプログラミング言語です。1993年に開発されたこの言語がユニークな点は、別のアプリに組込んで使うことを想定していることです。C/C++やRustやGoなどのプログラミング言語の中に、手軽にLuaのプログラムを組み込んで使えるよう工夫されています。