スクリプト言語の手始めに、まずは有名どころ(Python と Ruby)から目を付けました。どちらも甲乙つけ難かったため、両方使ってみることにしました。
開発環境は Python が JetBrain の PyCharm、Ruby が同じく JetBrain の RubyMine です。これらは有償ですが、30日間の無料評価期間がありますので、触ってみたいだけなら十分に楽しめるはずです。
スクラッチから書く用事が今のところないので、先日 JavaScript で書いた N クイーン問題のソルバ(2013年 5月 13日の日記参照)の移植にトライしようと思います。手始めに無駄な処理を削って、5倍くらい速くした JavaScript 版を準備しました。
この JavaScript 版 N クイーンを Python と Ruby と、ついでに Java への移植、それに加えて並列処理ができるように改造する、というところまで実践しました。アルゴリズム自体は JavaScript 版と同等とします。
実際に書いてみると、Python は初心者に優しい作りになっているように思います。特に公式のチュートリアルが非常に丁寧かつ、まとまっていてありがたいです。教育用の名は伊達じゃありません。
さらに Python はおかしな書き方をしないように、様々な考慮がなされています。その一つが、言語策定者自らによるコーディングルール(PEP 8 - Style Guide for Python Code※)です。チェックツールまでも用意されていて、PEP 8 に違反している個所を注意してくれます。
(※)ありがたいことに 和訳を公開されている方がいらっしゃいます。
Ruby は好きな書き方ができてしまいますが、変な書き方を発見すると RubyMine さんが警告してくれるので、それに従っています。ただ、RubyMine さんはやたらと if 文を後置(Modifier?)したがるのが困りものです。
慣れの問題だとは思いますが、処理→条件の順で書かれると、条件判定→処理という実際の手続きと逆になってしまって、理解が遠のく感じがします。英語だと文章の順に近くなるから嬉しいのかなあ。
あと、Ruby とはあまり関係ないけれど、躓いてしばらく悩んだ点を書いておきます。
自作のクラスなどを書いた .rb ファイルを require するときは、2点注意が必要です。1個目は require './hoge.rb' のように ./ を付けること、2個目は RubyMine の実行設定で Working directory を設定しておくことです。
パスに ./ を付ける理由は Ruby 1.9 から require の探索対象パスが変わって、カレントディレクトリが対象外になったから、だそうです。RubyMine の設定を変える理由は、Working directory のデフォルト値が「空」になっていて require の探索が迷子になってしまうからです。
せっかく作ったので、各言語のソルバに N クイーン(N = 15)を解かせて、速度を測ってみました。オマケで測った割に、予想以上の差が出てちょっとびっくりです。
環境について付記しておきます。CPU は Intel Core i5 2450M/2.50GHz、OS は Windows 8 Pro 64ビット版です。
こういう単純な計算の場合、Java はケタ違いに速いです。並列化の効果も出ます(※)。当初から C 言語と比較しては遅い遅いと文句言う人達と、ガチンコ勝負してきた成果でしょうか。
JavaScript はブラウザによって 2〜3倍の差が出ましたが、一番速かった IE 10 の結果を載せました。スクリプト言語では速い方?
Python も Ruby も桁違いにゆっくりです。スレッドは備えているものの、スレッドを使って並列化しても実際には 1スレッド分の速度しか出ません。どうも CPython や CRuby はネイティブスレッドを使わないようです。
(※)Core i5 は 2コア 4スレッドなので、性能が 4倍か 3倍くらいになることが期待値だったのですが、なぜか性能は 2倍にしかなりません。謎ですね…。
次に挑戦するなら、JavaVM 上で動作するスクリプト言語が良いだろうと思っています。開発環境(IntelliJ IDEA)から使える言語から選ぶなら、Groovy か Scala か Kotlin かな…?どれも良さげです。
今までは Java 開発には Eclipse を使っていたのですが、最近は IntelliJ IDEA を試しています。ここに PyCharm と RubyMine が加わったおかげで、開発環境が JetBrain 一色に染まってしまいました。
ただ IntelliJ も PyCharm も RubyMine も、今のところ開発環境の能力を活用できている気が微塵もしないのが残念なところです。もうしばらく使ってみないとねー。
コメント欄にて他のインタプリタ実装もあるよ、と教えていただいたので、早速試してみました。
今回試したのは Jython と JRuby です。開発環境が認識するかどうか不安だったのですが、PyCharm も RubyMine もいとも簡単に認識してくれました。これは便利。JetBrain さんに感謝だ。
Visual Studio も持っていたので、ついでに C++ 版も作りました。Windows/POSIX スレッド、時刻取得辺りは、超てきとー実装なので、参考にしないでください。
つまるところ、今回追加したのは下記の 3つです。
結果はこんな感じです。上から速い順に並んでいます。Java って速いね。
併せて 7月2日の方も結果一覧を更新しています。
測定に使用したソースコードとプロジェクト設定ファイルは下記に置いています。Web インタフェースからアーカイブが取れます。ページ右上の zip とか bz2 というリンクからどうぞ。
もし Git が使える環境なら git clone https://〜 でもコピー可能です(2019年 3月 12日、GitHub に移しました)。コミットの push はできないので、お気づきの点はコメントかなんかで教えてください。
いずれも Apache License, version 2.0 です。といっても、流用することはないでしょうけど…。
N クイーン C++ 版
N クイーン Java 版
N クイーン Python 版
N クイーン Ruby 版
N クイーン JavaScript 版(リポジトリは作っていないです)
開発環境やインタプリタはググればすぐ見つかりますので、各自拾ってくださいませ。
家サーバの Debian アップグレードに伴い、PHP のバージョンも 5.4.4 になったため、ついに PukiWiki が動かなくなりました。Google 先生に聞いてみると、同じ問題にハマった人たちがパッチを公開してくれているため、もう少し延命できそうです。
PukiWiki は PHP という言語で書かれていますが、PHP は 1年くらいでガンガン仕様変更してくるため、最新バージョンに食いついていかないといけないようです。
ところが PukiWiki は最終版 1.4.7_notb のリリースが 2007 年(!)と古く、開発版も 1.4.8 から進んでいる様子がありません。もはや公式リリースでの対応は望めないでしょう。PukiWiki 便利で好きだったんですが、残念ですね…。
実はこのサイトの日記システムも PHP で書かれていて、最終更新が 2008 年頃と古いのですが、PHP 5.4 で動作させても見た目は特に問題ありませんでした。
とはいえ PukiWiki のこともあったので、念のため Apache のエラーログを眺めていたら、閲覧の度にめちゃくちゃエラー出ているじゃないですか。ホゲェー。
すぐに直したいところですが、いかんせんシステムの構造が思い出せません。しかも日記システムを書いた後は PHP を一切使わなくなったため、PHP の文法すら理解が怪しい状態です。こ、これはちょっとヤバいかも。
日記という息の長そうなシステムなのに、当時流行っていたという理由で PHP 言語を選択したのは軽率だったよ…うん。
反省はさておいて、土日になんとかしましょう。なんとかなるさ…きっとね。
例のパナソニックのテレビ、電波産業会(ARIB)の運用規定に違反って書いてるニュースもあった…。
ARIB のどこに違反してるのか気になってきたので、ちょっと見てみた。たぶん ARIB TR-B14「地上デジタルテレビジョン放送運用規定」だなあ。
産経曰く「ガイドラインは「テレビ起動時、テレビ映像を画面全体に表示するのが望ましい」と明記」とのことだが、ARIB のどの運用規定に「明記」されてるんだろう?
ARIB TR-B14 地上デジタルテレビジョン放送運用規定「9.3 放送番組及びコンテンツ一意性の確保」のこと言ってるのかな?
第 2 項に「テレビ放送画面とインターネットのブラウザ画面が一体であるかのように視聴者に誤解させるような機能」はダメ、と書いているけど、起動時とか全画面とか、そんな記述はない。
それとも他に項目があるのかな?うーん??
(技術系?の話は Facebook から転記しておくことにした)
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2021.
Powered by PHP 5.2.17.
using GD bundled (2.0.34 compatible)(png support.)