はじめに
はじめにスタンスの表明として,最新の技術は静観しているだけなので細かい部分は知らないです.他人事で申し訳ないですが.あと,風邪引いて鼻水で頭が詰まってぐにんぐにんになりながら書いてます.眠れなくて眠れなくて暇なので…….文章の体裁についてはご容赦ください.
Delphiとは,かなり昔に作られたGUI開発プラットフォームです.DelphiはPascalをベースにしています.Pascalとは教育向けのプログラミング言語です.その教育向けプログラミング言語でGUI開発ができるので,当時はかなり先進的で便利なプラットフォームでした.
DelphiはWindows3.1向けに開発されました.もちろん,GUI開発向けのプラットフォームです.Windowsの(Appleを真似たと噂の)先進的なGUIを開発をドラッグ&ドロップで済ませられるわけです.しかも,教育向けのPascalで開発ができるため,導入コストもそんなに高くない.プログラマのためのワガママワクワクセットだったわけですね.
そんな中で,気がついたらFlutterというフレームワークがクロスプラットフォームを置き換えようとしています.機能的に正直なところGTK以下なのではと思わなくもないですが,モバイルもターゲットに入っている時点で色々と話が変わってきます.
そのような背景がある中で,どうやって昨今の技術がDelphiに追いついてきたのか,歴史などの観点から説明しようと思います.
Delphiの簡単な解説
Delphiはボーランド社が開発しましたが,それまではボーランドもTurbo Pascalを開発していました.ボーランドは1983年から1992年までTurbo Pascalの開発を続けて,それから95年までDelphiの開発に注いでいたわけです.時間的にどれだけ本気なのか伺えます.
ボーランドはC++のコンパイラなども作りながら細々とDelphiを作っていましたが,現在はエンバカデロ・テクノロジーズになっています.だいたい2008年頃に買収されて名前を変えています.
DelphiはPascalベースなので基本的な文法はPascalです.プロトタイプ宣言がうざい,という見方もありますが,ぶっちゃけdocstringを真面目に書いたら決まった位置にプロトタイプ宣言があるのはある種の安心感があります.型もありますし.
//fpc 3.0.0
program HelloWorld;
procedure NumberOfHello(N: Integer);
var
V: Integer; // カウンタ
begin
V := Abs(N); // マイナス対策
repeat
writeln('Hello!');
V := V - 1;
until V = 0;
end;
begin
NumberOfHello(3);
end.
一応,関数と手続きが厳密に区別されています.C言語やC++などではvoidを返す関数は手続き的な関数です.Pascalでは何も返さない関数は手続きとして流すべきという思想になっています.これは,FORTRANなどの言語にも見られる特徴ですね.
Delphiを使えばクロス開発できる!
プログラマは常にクロス開発で頭を抱えていました.そのため,AndroidやiOSでもC++で一応は開発できるので,コアシステムを自作してAndroidとiOSで個別の機能を分離して,なるべく同じように動かせれば作れなくはないんです.でも,それってどう考えてもつらい.
モバイル開発のクロス開発で一番早かったのはUnityでした.2010年にUnity 3が発表されて3.5になるとモバイル開発ができるようになったわけです.すごいですね.2012年というと,まだガラケーがまだ強い時代だったと考えると,結構Unityってすごいんです.
その裏で誰もが手を拱いているわけではありません.マイクロソフトも.Net戦略を頑張ってやってXamarinとか頑張ってました.幸い,オープンソースのMonoが頑張ったおかげでどのプラットフォームでも.Netが動くようになりましたが,どの端末でも同じように表示するのが難しい.
Unity以外にはQtも覇権を握っていました.PySideがLGPLになった上に所詮はPythonなので速度面で優位性が出ません.QtはC++でも開発ができるので速度面でPascalより優位性がありました.しかし,Qtは逆に複雑になってしまって歴戦のプログラマでなければプログラムを書けなくなってしまいました.
一方で,DelphiはWindowsに寄り添う形で成長を続けていました.それこそ,.Net戦略に揉まれながら今日まで生き残ってきたわけです.Delphiが本気を出すのは2011年にリリースされたDelphi XE2からです.Unityより1歩遅いですが,Mac OSXがIntel x86に対応してからMacでの開発が可能になりました.もちろん,iOSにも対応しています.また,当時はモバイル端末にRDBMSを積めない問題がありましたが,Oracleに対抗するためにInterBaseの開発を続けていたので,ちょうどそこで需要が生まれたわけです.
なんでこんなにDelphiは長生きなの? と思うかもしれません.運もあるかもしれませんが,今まで誠実にコツコツと積み上げてきたのがうまくいった,というのが一番だと思います.
Javascriptが化けて出てきた
Javascriptと言えばブラウザ用についたおまけのプログラミング言語です.ハイパーなテキストをマークアップする言語に味をつけるために開発されたのがJavascriptです.ブラウザ戦争が集結せずにとりあえずInternet Explorerが一人で負けたのを皮切りに,GoogleとMozillaが頑張ってお互い同じようにマークアップされた内容をレンダリングするブラウザを作ってきました.
その裏側ではバックエンド戦争が起こっていました.PHPなのか,Rubyなのか,Pythonはありなのか.それぞれ,様々なフレームワークが開発されしのぎを削り合ってきました.ところが,あるとき誰かが気づいてしまったのです.Javascriptってクソだな.
ある人はJavascriptに互換性を持たせようとW3Cに訴えかけたり,ある人はJavascriptがクソなのは変えようのない事実だからJavascriptのトランスパイラを作ろうとしたり,Javascriptって何でもできるね(ニッコリ)と考える人が出てきたり,色々と大変だったのです.
バックエンド戦争の名残がいわゆるNode.jsというバベルの塔です.Node.jsが便利になったということで様々なパッケージやフレームワークが開発されます.特に,バックエンドでもJavascriptが動かせるという強みを活かしたり,画面遷移のためにGETリクエストを発行するのは無駄だからSingle Page Applicationにしてしまおう,という動きもありました.
恐らく,プログラミング言語に長く携わっている人ほど,Javascriptがここまで化けるとは思わなかったと思います.
Dartという穴馬
DartはGoogleが開発したプログラミング言語です.Javascriptがクソなのはその頃から言われていたので,ウェブブラウザ用の言語としてDartはそれを置き換えたい,という気持ちで開発されたらしいです.
Dartと似た言語に,RustやGoなどがあります.RustはMozillaが2009年からサポートしています.GoはDartより少し早く開発されています.最近のモダンなプログラミング言語といえばこのあたりになると思います.
Rustは学習するのが難しい,Goはオブジェクト指向の一部を切り捨てています.Dartが優位性を発揮したのはFlutterの開発です.Flutterとは,クロスプラットフォーム向けのアプリケーションエンジンです.エンジン自体はC++で書かれていますが,Dartもサポートしています.
Dartと組み合わせれば,モバイル開発からフロントエンドのトランスパイルまでできる,という恐ろしい戦力でDartは仕掛けてきました.Dartは既存のWebとモバイルを統合する戦略に打って出てきたわけです.
これまで競合していたのは,React NativeやVue Nativeなど,所詮はJavascriptで構築したバベルの塔で,トランスパイラの環境構築が結構面倒くさくて使用言語で喧嘩になるレベルです.Electronに至ってはモバイルではなくChromiumが動くOSに限定されています.そして後ろから追い立てるように,SwiftUIもいい感じにくすぶっています.そこへ,急にFlutterという穴馬がやってきたわけです.
Delphi vs Dart
Delphiの優位性はInterBaseが使えることです.SQLiteよりも高速で容量の小さいRDBMSです.SQLiteはバイナリにすると軽く500kBぐらい行くのでキャッシュに乗り切りません.InterBaseはOracleと真っ向勝負するつもりで開発を続けています.ちなみに,InterBaseの人気度は下から数えたほうが早いです.しかし,1986年から開発を続けてM1エイブラムス戦車に搭載される程度には使えるRDBMSなのです.
一方で,Dartの優位性は少ないです.かろうじてFlutterであれば,あらゆるプラットフォームに対してマテリアルデザインが使えるぐらいです.速度を出したいのであれば,C++とFlutterの組み合わせが入ってきます.速度に関してもPascalとDartはそんなに差はありません.
どこでDelphiを払拭して頂点に立つのか,Dartを見ていると非常に楽しみではあります.
Dartでできること
Dartは一応,ブラウザ内臓のスクリプト言語の置き換えを目指していますが,一応Javascriptのトランスパイルに対応しています.なので,Dartで開発したものをNode.jsパッケージとしてデプロイすることも可能なのです.
そして,Flutterとの連携が強いです.今の所,すべてがウィジェットという単位になっている,ということになっています.あらゆるものを自作せよ,というスタイルは嫌いではないです.スクロールバーできたやったー!という気持ちは大事です.Windows APIやってない人だと,可視部分だけスクロールする機能をつけるのがどれだけ難しいのか考えたことないと思います.仕方ない.
そういうわけで,私はDartやっちまったな!という気持ちが高まっているわけです.幸い,パフォーマンス的にもPascalと同じぐらいで,C++の倍遅い程度のオーバーヘッドです.Pythonなどになるとそれが10倍ぐらいまで開くので,ここの恩恵は本当に大きいと思います.さらに,Javascriptよりも倍ぐらいは早いです.
FORTRAN……
ここ20年でオブジェクト指向とか色々頑張ってますが,全く変わっていません.未だに.f90
の拡張子が使われていて悲しい…….
それでも,シミュレーション分野ではゴリゴリ使われ続けている言語です.Dartを使うと1週間かかる解析が3週間に伸びると考えると恐ろしいです.しかも,普通に数GB単位のデータを食わせることがあるので,メモリの確保などが安定的な言語でないと困ります.
シンプルな言語実装と引き換えに,様々な制約が付くのはありだと思うのですが,世間一般ではあまり受け入れられないようです.個人的にはFORTRANはクソ速くて感動するのでぜひ皆さんに覚えてもらいたいです.
おわりに
このエントリをまとめると,ブラウザ戦争からバックエンド戦争,フロントエンド戦争を俯瞰し,新たにクロスプラットフォーム戦争が起こりかけている予感がしています.オランダ・ベルギー・ルクセンブルクが突然ネオベネルクスとして三国統一を果たした感じですね.予想もしなかったところから突然たけのこが生えてきた感じです.
静観決め込んで何言ってんだこいつとは思いますが,Dartは将来的に安定しそうだなとは思います.咳が止まらなくてめっちゃ汗かいてるんですが,それと連動して空気清浄機がめっちゃ動いてるのヤバい.インフルじゃないって言ったよね検査キット君?