RubyはオワコンらしいからRubyの代替を考えるよ

オワコンだと言う人がいる[^1]ので、今のうちに代替を探しておくことにする。

[^1]: 私が言っているわけではない。

バージョンを明記しない場合は最新バージョンを使うことを前提とする。また、JavaScriptについては、AltJSが前提のライブラリを使用する場合を除き、AltJSは除外している。JavaScriptの部分はTypeScriptでもCoffeeScriptでも好きなものに置き換えても良いものとする。また、汎用プログラミング言語では無い物は斜体にしてある。

他に候補があれば、コメントで教えて欲しい。詳しくないものも載せているので、間違っているというのがあれば教えて欲しい。

## Rubyでできるもの

Rubyが得意なものというかRubyの用途してよく選ばれるものという感じ。

### ワンライナー

Rubyでは`-e`オプションでスクリプトをコマンドの引数として書ける。また、`-n`や`-p`と言った行毎の処理に適したオプションが用意されており、いわゆるワンライナーが作りやすいように工夫が行われている。

- UNIXコマンドの組合せ
- PowerShell
- Perl 5
- Perl 6

### スクリプトによるテキスト処理

標準入出力だけの処理やファイルのテキスト処理を行う場合でも、複雑になる場合はワンライナーでは厳しくなる。その場合でも本格的なスクリプトを書く必要が出てくる。

たぶん、Rubyが一番得意な分野のはず。標準入出力やファイルの扱いに工夫がされており、強力な正規表現も用意されている。あえてRubyが苦手になりそうな所は大量ファイルに対する並列処理ぐらいだ。それも、ただ時間がかかるだけなので、短い処理時間が求められなければ、特に問題にならない。

- シェル(bash or tcsh, zsh, etc.)
- PowerShell
- Perl 5
- Perl 6
- Python

### CUIアプリケーション

Rubyでは複数のプログラムからなるより複雑なCUIアプリケーションも作れる。有名所ではVagrantやChefがある。利点として、RubyをDSLとして採用しやすいという所がある。

- シェル(bash or tcsh, zsh, etc.)
- PowerShell
- Perl 5
- Perl 6
- Python
- Go
- C
- C++

### DSL

言ってみればアプリケーションの動作を決定づける設定ファイルである。ただ、iniファイルやレジストリ等は単純なキーバリューの紐付けしか出来ない。より複雑で構造化された設定を行えるように汎用言語が使われる事がある。そういったものがDSLである。

Rubyで言えばRakefileやGemfileがあたる。これらはRubyスクリプトそのものであるがアプリの動作を決定する設定ファイルとも言える。

- _YAML_
- _JSON_
- _XML_
- JavaScript
- Lua

### プログラム拡張(アプリ内言語・マクロ)

プログラムの拡張に使う言語。Luaが大流行した時期もあった。Rubyも負けておらず、例えば…たと…え…、ごほん、とにかくRubyでも使える。[^2]

[^2]: 例を募集中。

- PowerShell [.NET処理系]
- Python
- JavaScript
- Lua

### オフィススイート操作

そもそもMS OfficeもLibre Officeもマクロ言語としてRubyをサポートしていない。しかし、Rubyでもwin32oleを使えばMS Officeは操作可能であるため、マクロのような処理が出来ないわけではない。また、Office Open XMLやOpenDocumentを直接読み取りや書き込みできるライブラリも(全てを網羅しているわけではないが)いくつかある。

- PowerShell [Windows]
- VBA
- Python
- JavaScript

### Webアプリ

#### 設置型

CGIやPHPは置くだけで動作する。アプリケーションの利用者から見るとこれほど大きな利点はない。よくわからないコマンドやサービス起動と言った難しいことはやりたくないのだ。

Rubyは昔からCGIとして動作することが出来た。ただ、標準のcgiライブラリのできがいいとは言い難いが、本当に簡易なものであれば、十分とも言える。

- PHP
- Perl 5
- Perl 6
- Python

#### Webサーバー型

Rubyには標準ライブラリとしてwebrickがあるし、pumaをはじめとしたWebサーバーはいくつもある。rackを使えばいろいろな組合せも出来る。でも、大抵は後述のフレームワークを使う。

- JavaScript + http(Node.js標準)
- Go

#### シンフレームワーク

Ruby on Railsの影に隠れてしまっているようだが、Rubyには強力なシンフレームワークSinatraがある。簡易なものであれば十分とも言える。

- JavaScript + Express

#### フルスタックフレームワーク

RubyでWebアプリのフルスタックフレームワークといえばRuby on Rails一択と言ってもいい。RubyはRuby on Railsで一躍有名になったが、Ruby on Rails以前から使っているマニアな人達はいたわけだ。そういった人達にとってRuby on Railsがなくなっても特に変わらないと思う。

- PHP + Laravel
- Python + Django
- Scala + Play
- Elixir + Phoenix

### 組み込み

Rubyには組み込み向けのサブセットであるmrubyがある。

- アセンブリ
- C
- C++
- Arduino

### 2Dゲーム

WindowsのみとなるがDXRubyを使えば簡易な2Dゲームは作れる。また、あるバージョンのRPGツクールはRubyのフレームワークになっている。

- C# + Unity
- Hot Soup Processor
- JavaScript + RPGツクール

### ビジュアルプログラミング

低学年向けのプログラミング教材として注目されているビジュアルプログラミング。もちろんRubyにもSmalrubyというビジュアルプログラミングが用意されている。

- Scratch
- Python + BlockPy

## Rubyでできないことはないもの

Rubyでできないことはないが、あまり得意ではないもの。現在の所、あえて使うべきでは無いだろう。

### デスクトップアプリ

Rubyにも多くのGUIライブラリがある。しかし、標準的なものというものが無く、どれも一長一短である。かつてはTcl/Tkが標準ライブラリとして同梱されていたが、いまではそれすらもなくなってしまった。

- C++ + Qt
- C# + WPF [Windows]
- PowerShell + WPF [Windows]
- C# + Xamarin
- Scala or Kotlin + OpenJFX
- JavaScript + Electron

### 3Dゲーム

OpenGLを駆使すれば出来ないことはないらしい。ただ、応答速度がシビアなゲームは無理。

- C# + Unity
- C++ + Unreal Engine

### 非同期処理

IOが発生する大量の軽量処理を行う場合はシングルスレッドな軽量処理が有利である。Rubyも一応Fiberという軽量スレッドが用意されており、ノンブロッキングIO(標準で非同期IOはない)もあるので、非同期処理と似たようなことは出来るし、そのようなライブラリもある。ただ、Rubyとしては非同期処理は主流では無い。

- PowerShell
- JavaScript
- Go
- Python

### 標準環境での単体実行可能アプリ

OSインストール直後から単体で実行出来るというのは一つの利点となり得る。Windowsではocraという手段もないことはない。なお、Macだと(バージョンは古いが)Rubyが標準ではいる。Linuxはディストリビューションによるが、最小構成ではだいたい入らない。

- C 
- Go

### データサイエンス

データ分析からいわば機械学習やディープラーニングなど流行りのAIに通じるもの。RubyにもSciRubyやNumoといったプロジェクトがあるのだが、ライブラリが十分揃っているとは言い難い。

- Python
- R
- C++

### スマホアプリ

一応RubyMotionと言う手段がある。どこまで出来るのかは不明。

- Kotlin
- Swift
- JavaScript
- C#

## Rubyでできないもの

Rubyではほぼできないもの。頑張ればできるかも知れないが、途中で壁にぶつかる可能性もある。

### Webフロントエンド

Rubyそのものではないが、Rubyとほぼ同じ文法であるOpalというものがある。Opal向けのフレームワークとしてはHyperstack[^3]がある。他にもRubyっぽい文法のCrystalがWebAssemblyに対応しようとしているようだが、ちょっとこっちはよくわからない。

どちらにしても、Rubyそのものがフロントエンドの言語にはなれない。

[^3]: 旧々名React.rb、旧名Hyperloop、また名前変わった。

- Opal + Hyperstack
- JSX(with Flow) or TypeScript or CoffeScript + React
- JavaScript + Vue.js
- TypeScript + Angular
- Elm

### 高速・省メモリアプリ

Rubyは低速だし、メモリ消費量も多い。何度も呼び出され、速度や省メモリが求められるような場合はRubyを選択することはできない。

- C
- C++
- Go
- Rust
- C#
- Kotlin
- Swift
- Crystal

### 汎用ライブラリ

汎用ライブラリとしてはCのインターフェースが提供できることが最低条件である。また、そう言ったライブラリは画像や動画の加工等の非常に重い処理であり、それなりの速度が求められる。場合によっては、メモリ容量も少ない方が良い。

- C
- C++
- Go
- Rust

### VM用ライブラリ

JVMや.NET用のライブラリのことである。同じVMを使用した言語から利用できるようにしなければならない。JRubyやIronRubyを使えばできないことはなさそうだが、現実的ではない。

- JVM
    - Scala
    - Kotlin
- .NET
    - C#
    - F#

### スケールアウト可能な並列処理

処理が軽量であればシングルスレッドな非同期処理で十分だが、一つ一つの処理が重く、また、応答時間が非常にシビアな場合は非同期処理では間に合わなくなってしまう。マルチコアをフルで生かせる並列処理と複数サーバーで分散できるスケーラビリティが必要になってくる。

RubyのスレッドはGVLがあるため、マルチコアの恩恵は限定的である。一応マルチコアにはフォークという手段がないわけではないが、このレベルの処理は速度も求められるため、そもそも追いつかないと思われる。

- Scala
- Kotlin
- Elixir

### OS

OSが無い環境、つまり、C/C++で言いうフリースタンディング環境でも動作できなければOSの基幹部分は作れない。なぜなら、OS自体はOSが無い環境で動作しなければならないからである。mrubyはOS依存では無いが、OSが作れるかは不明。

- アセンブリ
- C
- C++