Haskell は表現力が高いプログラミング言語だが、気をつけないと非効率的なコードが生成されてしまうことがある。では、どういうところに気をつければ高速なコードになるのか。少し調べてみた。
この記事に書くのは、あくまで原則とかそういうやつなので、コンパイラーの最適化(正格性解析、インライン化、自動ボックス化解除)によっては、自前で工夫しても意味がない、つまり、コンパイラーに任せた場合と同じ結果になるかもしれない。どういう場合に早くなるかはケースバイケースなのだ。 続きを読む
Haskell は表現力が高いプログラミング言語だが、気をつけないと非効率的なコードが生成されてしまうことがある。では、どういうところに気をつければ高速なコードになるのか。少し調べてみた。
この記事に書くのは、あくまで原則とかそういうやつなので、コンパイラーの最適化(正格性解析、インライン化、自動ボックス化解除)によっては、自前で工夫しても意味がない、つまり、コンパイラーに任せた場合と同じ結果になるかもしれない。どういう場合に早くなるかはケースバイケースなのだ。 続きを読む
Haskell には Num という型クラスがあって、足し算とか掛け算の基本的な演算はここで定義されている。標準ライブラリで定義されているインスタンスとしては、 Int, Integer, Rational, Complex a などがある。
一言で言えば Num クラスは環っぽいものに対応するのだが、いろいろとアレな点がある。これを設計した人は、インスタンスとして整数、有理数、浮動小数点数、複素数くらいしか想定していないのではないか。 続きを読む
その昔、Mac OS X で java
コマンドを起動するとターミナルが UTF-8 であってもメッセージがシフトJISで出力されて文字化けしてしまうという時代があった。
java
コマンドの起動時に -Dfile.encoding=UTF-8
をつければ出力が UTF-8 になるが、毎回指定するのは面倒くさい。
そんな時、人々は JAVA_TOOL_OPTIONS
という環境変数を -Dfile.encoding=UTF-8
に設定したものだ。
そうすれば、確かにメッセージは UTF-8 で出力される。されるのだが…。
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
という余計なメッセージまで出力される。うるさい。
…というのは過去の話で、最近の Java を Mac 環境で使う分には JAVA_TOOL_OPTIONS
を指定しなくても出力が UTF-8 になるので、特に問題はない。(確か、環境変数 LANG
を読むはず)
残念なことだが、2016年にもなって、コマンドライン環境で UTF-8 以外のマルチバイトエンコーディング(シフトJISとか)が広く使われている環境が存在する。そういう環境に UTF-8 なターミナル(MinTTY とか)を用意してやっても、デフォルトでは java
はシフトJISでメッセージを吐いてくる。したがって、そういう環境で java コマンドのメッセージの出力を UTF-8 にしたい場合は、 JAVA_TOOL_OPTIONS
に -Dfile.encoding=UTF-8
を指定する必要がある。
まあ、 UTF-8 以外のマルチバイトエンコーディングが広く使われている環境が存在するのは仕方がない。受け入れるしかない。しかし、Picked up JAVA_TOOL_OPTIONS: が出てくるのはなんとかしたい。
このメッセージの出力を抑制できないならば、せめて「見えないように」する方法があるのではないか。つまり、 Picked up JAVA_TOOL_OPTIONS: が印字された後に、空白文字で上書きする…!
つまり、こうだ:
JAVA_TOOL_OPTIONS=$'\r-Dfile.encoding=UTF-8\r \r'
$'ほにゃらら'
というのは、 bash にエスケープ文字を解釈させる文法だ。この記事に関心を持つような人ならば何をやっているか分かるだろう。
キャリッジリターンとか言ってないで ANSI escape を駆使すれば空行すらなくせるかもしれないが、残念ながらそういうのはキャリッジリターン \r
と違い、オプション解釈の際に空白として読み飛ばされない。
ドヤ顔でキャリッジリターンとか書いてみたものの、実際に使ってみると表示が崩れる場合が散見されるので、常用するのはやめたほうがよさそうである。
総合的に考えると、次のようなシェル関数を書いて対応するのがベストかと思われる。(シェルで単独で java
を叩いた場合は Picked up … が表示されず、間接的に起動された場合は Picked up … が表示される。)あるいは、シェルスクリプトでラップしてやるという手も考えられる。
export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
function java() {
env JAVA_TOOL_OPTIONS="${JAVA_TOOL_OPTIONS/-Dfile.encoding=UTF-8/}" java -Df
ile.encoding=UTF-8 "$@"
}
function javac() {
env JAVA_TOOL_OPTIONS="${JAVA_TOOL_OPTIONS/-Dfile.encoding=UTF-8/}" "${JDK_P
ATH}/javac" -J-Dfile.encoding=UTF-8 "$@"
}
何をやっているかというと、 java
という名前のシェル関数で、「環境変数 JAVA_TOOL_OPTIONS
から “-Dfile.encoding=UTF-8
” という文字列を削除」「java コマンドに -Dfile.encoding=UTF-8
オプションを渡す」ということをやっている。bash 以外のシェルでは違う書き方が必要になるだろう。
余談だが、ドットネット系のプログラムは、コマンドプロンプトで chcp 65001
をすると出力が UTF-8 になるようだ。UTF-8 なターミナルから MSBuild
とか csc
とかを叩くときに覚えておくと良いだろう。(Windows の Java も GetConsoleOutputCP
で出力文字コードを判断してくれれば良かったのだが…)
1年近く前に、複素積分をインタラクティブに行える Web ページ(Web アプリ?)を作ったのだが、ブログでの紹介がまだだった。