JavaとかPascalとか.NETとかQtとかwxWidgetsとか

マルチプラットフォームアプリケーションの作りかた(嘘)
5
後藤寿庵 @juangotoh

ところで最近ちょっと仕事で使うCLIP STUDIO PAINTの機能の不満点を自作ソフトで補完するみたいなことをやってるのだけど、それらを公開するときに気になるのが、もとのCLIP STUDIOはMac/Winで使えるソフトなんだよね。僕が作ってるアプリはWindows用

2013-12-06 02:38:51
後藤寿庵 @juangotoh

メジャーグラフィックソフトとかってわりとMac/Win両方に対応してたりするので、それを補うソフトもできれば両対応したいとこなんだけど、やっぱそれって難しいんだよねえ。MacとWindowsじゃ基本API全然違うし

2013-12-06 02:40:40
後藤寿庵 @juangotoh

基礎知識: APIとは、アプリケーションプログラミングインターフェイスの略。要するにファイルを操作したり画面になんか表示したりキーボードやマウスの入力を処理したりという部分はOSが受け持つので、アプリケーションがOSをやりとりする方法を決めている。それがAPI

2013-12-06 02:42:45
後藤寿庵 @juangotoh

ビットマップ画像を作成するためにメモリ上でどういう風に領域を確保して、描画のための線の描き方をどうするか、その太さは、フォントの取り扱いは、そんなんOSごとに全部違う。

2013-12-06 02:44:54
後藤寿庵 @juangotoh

なので、両対応ソフトというのは、プログラムの仕様を決めて、それぞれのOSごとに全く違うプログラムを書くか、もしくはOSのAPIの上にさらに一つ層を重ねて、抽象的な「OSにとらわれないAPI」を作成することになる

2013-12-06 02:46:55
後藤寿庵 @juangotoh

Javaとかは「どのOSでも同じソースコードで同じように動く」ように作られた環境だよね

2013-12-06 02:48:03
後藤寿庵 @juangotoh

Javaの場合、Javaマシンという仮想コンピューターのマシン語を生成し、それを各OSでインタープリタで動かすと言うものだった

2013-12-06 02:49:04
後藤寿庵 @juangotoh

この考え方は、さかのぼればPascalにたどり着く。ALGOLという、元祖構造化言語から派生したPascalは、P-Codeという仮想マシン語にコンパイルして、P-Codeインタープリタ上で動いていた。

2013-12-06 02:51:29
後藤寿庵 @juangotoh

確か初期のPascalは、P-codeと強く結びついてたと思う。8ビットパソコンでももてはやされたけど、実際のところまあ、ベタなBASICよりは速いかもねえ、くらいな感じ?

2013-12-06 02:54:29
後藤寿庵 @juangotoh

Pascalが復活するのはマシンごとのネイティブコードを吐く、TurboPascalとかが出てからではないかなあ

2013-12-06 02:55:27
後藤寿庵 @juangotoh

Javaが登場して、雑誌でがんがん特集組まれてたとき、PascalのP-code思い出して、「ああ、こりゃいずれネイティブコンパイルになる。でなきゃこける」と思った人多いんじゃね?いや僕はそう思ったんだけど、

2013-12-06 02:59:51
後藤寿庵 @juangotoh

雑誌やネットでは「write once, run anywhere!」を賞賛する記事ばかりで。いやあれ出た頃のJava、すげえ重かったじゃん。仮想マシンが起動するのもめっちゃ重かったし。実行ももたもたしてたじゃん。えええ?って思わなかった?

2013-12-06 03:00:49
後藤寿庵 @juangotoh

そのうちJITとか出て実用的な速度出るようになったけど

2013-12-06 03:01:37
後藤寿庵 @juangotoh

そのうちMSがJavaを勝手に高速化します。追加機能つけますとかやりだしてSUNに訴えられるんだよね。なんかしばらく訴訟合戦やってるなーと思ったら。「C#」発表。Javaっぽくてもっと便利な感じのやつ。しかもWindowsに最適化されたやつ。

2013-12-06 03:04:58
後藤寿庵 @juangotoh

.NETフレームワークというAPIと、CILという中間言語へのコンパイル。JavaのバイトコードとAWT,SWINGをWindowsフォームに向いた形に変えたようなあれ。

2013-12-06 03:08:49
後藤寿庵 @juangotoh

まあ、Javaが最終的にJavaバイトコードにコンパイルされるのと同様、.NETはVisualBasicやらC#やらF#(まだ生きてる?)のコードをCILにコンパイルして実行するわけで

2013-12-06 03:10:58
後藤寿庵 @juangotoh

アーキテクチャは大変似ている

2013-12-06 03:11:27
後藤寿庵 @juangotoh

ちなみにVisualBasicはもともとx86のマシン語にネイティブコンパイルされてたので、http://t.co/NraxRyPpClになって中間言語コンパイラになったのは、実行速度の点で不利になってたりする

2013-12-06 03:13:16

なんかtogetterにまとめるときに、VB.NETと書いた部分が「http://t.co/NraxRyPpCl]と置き換えられてしまいました。もとの文章は
「ちなみにVisualBasicはもともとx86のマシン語にネイティブコンパイルされてたので、VB.NETになって中間言語コンパイラになったのは、実行速度の点で不利になってたりする」
です

後藤寿庵 @juangotoh

まあ、プロのプログラマは、http://t.co/NraxRyPpClとか使わない。使うとしたらC#なのである。なぜならVBは所詮素人の言語だからである。C#ならなんかプロっぽい。CとかC++使ってる人が使う「.NETならしょーがねえからこれ使うか」の言語なんである

2013-12-06 03:16:23

これも
「まあ、プロのプログラマは、VB.NETとか使わない。使うとしたらC#なのである。なぜならVBは所詮素人の言語だからである。C#ならなんかプロっぽい。CとかC++使ってる人が使う「.NETならしょーがねえからこれ使うか」の言語なんである

です

後藤寿庵 @juangotoh

ところで.NETとかC#はマイクロソフトの独占技術ではない。要は中間言語のオペコードと、アプリケーションフレームワークなので、第三者が実装するのは別にかまわないのだ。なのでMonoというオープンソースの.NET互換ライブラリがあったりする

2013-12-06 03:19:42
後藤寿庵 @juangotoh

実際にMonoが使われるアプリケーションってあんましなさそうだけど、かの「セカンドライフ」がリンデンスクリプトという仮想世界内の独自言語をMonoで実装し直したりという事実があったりする

2013-12-06 03:21:47
後藤寿庵 @juangotoh

ちなみにリンデンスクリプトというのはCを簡易化した言語で、switch caseもないので、パターン分岐を延々 if else で書かないといけない代物だったので、Monoになると発表されたときに「んじゃC#で書けるのか?」とすげえ盛り上がったのだけど

2013-12-06 03:28:49
後藤寿庵 @juangotoh

「あくまで中間言語エンジンをMonoにするだけで、文法は変わりません」て言われてみんながっかりしたという

2013-12-06 03:30:10