2006年10月14日

IPAフォントの0x5cをバックスラッシュに

TrueTypeフォントの0x5cを円記号からバックスラッシュに書き換える方法を紹介。IPAフォントに直接適用できるパッチと、TrueTypeフォント一般(ただし*.ttfのみ)を書き換えるスクリプトを提供。

試しにGNOMEを導入したのでGNOME Terminalを使い始めた。 ところがその中でIPAフォントを使ってみたら、0x5cが 円記号で表示されるのが気になって仕方がない。

そこで0x5cのグリフがバックスラッシュになるよう、fontforgeで編集した。

続きを読む

2006年10月05日

語呂合わせ

原口證さんという方が10万桁もの円周率の暗唱に成功とのニュース。

日本語には語呂合わせというものがあるので、一見無意味な数字の並びを暗唱するのに大きな助けになる。円周率の語呂合わせとしては次のものやこれに類似したものがおそらく最もよく知られていよう。

産医師異国に向かう3.14159265
産後厄無く358979
産婦御社(みやしろ)に3238462
虫さんさん闇に鳴く643383279

しかし英語では日本語のようにはいかない。ではどうするのかというと、単語の文字数を数字に当てはめるのだそうだ。多数作られているが、例えばこういうものがある。

How I want a drink, alcoholic of course, after the heavy lectures involving quantum mechanics!

1単語1数字というのも効率が悪そうだが、それぞれの単語から数字を出すのも大変そうだ。それに対して日本語は有り難い。尤も、同じ数字に対する候補が多いので考え出しやすいという一面はありそうだから、悪いことばかりではない。

英語での語呂合わせ的な記憶法の中で一般的なのは、何かの並びを憶えるためにそれぞれの頭文字が同じ単語で文を作るものらしい。例えば、太陽系の惑星の場合は

My Very Educated Mother Just Showed Us Nine Planets

などがあるそうだ(惑星の英語名は水星から順に、Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto — Plutoは最近格下げされたが)。

WikipediaのEnglish mnemonicsの項では他にも色々なものが紹介されていて面白い。計算機関係ではOSI参照モデル(Physical layer, Data link layer, Network layer, Transport layer, Session layer, Presentation layer, Application layer)の憶え方というのもある。一例を挙げると

Please Do Not Tell Sales People Anything

または上位層から逆順に

All People Say They Never Download Porn

もう傑作である。

このページと、同じくWikipediaの日本語の語呂合わせの項を比較すると違いが際立つ。英語では様々な対象に対して憶え方が作られているのに対し、日本語では数字の語呂合わせには熱心だが、それ以外の対象にはあまり積極的に行われないように思える。その理由をあれこれ考えてみると面白いが、一つには、憶え方を工夫する必要などなさそうなPCMCIAについてまで作られているのを見ると、日本語の駄洒落に似た言葉遊びを楽しむ面も大きいのかも知れない。

2006年06月21日

JavaScript

今更の感も強いが、これまで見様見真似でしか書いたことのなかったJavaScriptを勉強した。

教科書はO'reillyの JavaScript: The Definitive Guide, 4th Edition, David Flanagan。 日本語訳は第3版がJavaScript第3版として出ているが、第4版は出ていないようだ。

web上のJavaScriptの紹介にはHTML上の効果としての使い方しか載せていないもの、入門と銘打っていても言語の表層的なシンタックスしか解説していないものがほとんどで、言語として理解しようとすると物足りない。

一方、この本では前半分を使って言語としてのJavaScriptを丁寧に説明している。特に他のプログラミング言語の知識がある人には非常にわかりやすく、面白い。後半はJavaScriptの主な用途であるウェブブラウザでHTMLと組み合わせての使用のため、そこで登場するJavaScriptオブジェクトを説明するとともに、合わせて必要となるHTMLフォームやCSS、クッキー等の知識も要領よく解説している。

言語としてのJavaScriptは結構面白く、一読してもっと早くこの本を読んでおけばよかったと感じた。ただ、多くの項目でブラウザやJavaScriptのバージョンによって色々事情が異なるらしく、互換性についての記述が細かい。そのため言語を使おうとする側としては面倒な感を受けるが、多様なブラウザが使われている現状では致し方ないだろう。もっとも、記述があることは解説書としてそういった差異を丁寧にフォローしていると言える。

そのJavaScriptという言語であるが、JavaScriptは演算子や制御構文といった基本的なシンタックスはCやJavaに似ている。コメントの構文もC/Java譲り。 しかし、似ているのはそれだけ。言語としてはむしろScheme等に近く、そこにプロトタイプベースのオブジェクトを持ち込んだ感じである。

まず、変数には型がない。値は数値(整数と浮動小数点数の区別はなく、64bit浮動小数点数で全てまかなう)、ブーリアン、文字列、そしてオブジェクトのみ。文字列はimmutable。これらの間で必要に応じて暗黙の型変換があり、便利でもあるが嫌らしいような気もする。

クロージャがある(クロージャはオブジェクトの特殊なサブタイプとして扱われる)。 関数定義はクロージャの変数への束縛にすぎない。次の2つはほぼ同義。

function foo(x) { return x }
var foo = function(x) { return x }

括弧をつけてfoo(1)とすれば関数適用だが、fooと名前だけ書くと変数として参照する。

クロージャであるから当然次のようなコードも可能。

function make_counter() {
  var x=0
  return function() { return x++; }
}
var c = make_counter()
alert(c()) // 0を表示
alert(c()) // 1を表示

以上に加えて、オブジェクトがある。JavaScriptでいうところのオブジェクトは畢竟、文字列をキーとする連想配列だ。オブジェクトの要素をプロパティといい、通常obj.propとして参照するが、obj["prop"]としても参照できる。連想配列なので、他の言語のハッシュテーブルにも似た

var p = { x: 10, y: 20 }

というリテラル表現でも書けてしまう。

オブジェクトのメソッドは、単にプロパティにクロージャが代入されているものだ。

obj.method = function () { ... }

後ろに関数適用の括弧をつけてobj.method()とすればメソッド呼び出しとなる。 ただし、JavaScriptの関数ではthisという暗黙的に用意される参照があり、obj.method()という形式で呼ぶとその関数の中でthisがレシーバobjを指す。ちなみに通常の関数呼び出しでもthisはあり、グローバル環境の実行コンテクストを指す。

オブジェクトの作成はnew演算子をつけて関数を呼ぶことで行う。new Constructor()とすると、新しい空のオブジェクトが作成され、関数Constructorが呼ばれる。関数Constructorの中ではそれをthisとして参照できる。オブジェクトを作るための関数(これをコンストラクタと呼ぶ)は、この新しいオブジェクトに必要なプロパティやメソッドを与えることでオブジェクトを「作る」。例えばこんな具合。

function Point(x,y) { this.x = x; this.y = y }
var p = new Point(10,20)

JavaScriptにはクラスという概念はないが、あるコンストラクタが作成するオブジェクトに共通のプロパティを集めたオブジェクト(これをプロトタイプと呼ぶ)を持てる。オブジェクトは、プロトタイプが持つプロパティを自分自身が備えているかのように振舞う。

function Circle(r) { this.r = r }
    // コンストラクタのprototypeプロパティがプロトタイプを指す。
    // デフォルトではプロトタイプは空のオブジェクト。
    // そこにメソッドを追加する。
Circle.prototype.area = function() { return 3.141592 * this.r * this.r }
var c = new Circle(5)
alert(c.area()) // 78.5398と表示

他にもあるが、JavaScriptはどういう言語かというと概略こんな感じの言語である。

追記。JavaScript: The Definitive Guideは2006年8月に5th editionが出版される予定らしい。5年振りの改訂で、XMLやAjax関連の記述も加筆されるようだ。

2005年11月27日

MinCaml読解ノート改訂

MinCaml 0.0.9に合わせて改訂した。加えてレジスタ割り当ての項を大きく書き直したが、わかりやすくなったのかどうか。不勉強ながらレジスタ割り当ての様子についても理解したと思うところを筆を加えたが、こちらは正直言って自信がいまひとつである。

2005年11月10日

MinCaml 0.0.9

久しぶりにチェックすると版が進んでいた。以前読んだ時からの変化を確認するためにダウンロードし、まずはregAlloc.mlを読む。

読みながら頭の中を整理し直していると、ToSpillによる処理の後戻りをなくしても同じ実現できることに気がついた(レジスタ割り当てを行うregAlloc.mlは、レジスタが溢れる度に溢れた変数の定義時点まで立ち戻って処理をやり直すという大変面倒な作りになっている)。

実際にコードを変更して目論見通りの動作を確認。 付属のテストプログラムで確認したところ、オリジナルと同等のコードを生成した(実は一点だけわずかに良くなった)。SPARCを触れる環境にないため確認は生成したコードのdiffによっている。

後程、詳細を記事にする予定。合わせてレジスタ割り当ての解説の項をわかりやすく書き直す。

2005年06月02日

MinCaml

MinCamlコンパイラを読み終えた。

このコンパイラはOCamlで書かれたMinCamlというML系のサブセットの言語のコンパイラで、SPARCアセンブリを生成する。 「速攻MinCamlコンパイラ概説」というパート毎にソースコードと短い解説が合わせて読めるwebページが作られており、これを案内として読んでいった。

MinCamlコンパイラはコンパイルという仕事を変換の連続と定義している。コンパイラの構成はパートごとに綺麗に分かれていて、それぞれのパートも小さい。 MinCamlの言語としての仕様は教育目的に非常に割り切った仕様であり、これはコンパイラのソースコードを簡潔で理解しやすい大きさに保つ為と思われる。同時に、読む側から見ると色々と手を出してみたくなる点が多いのが心憎い(表面的な仕様拡充以外にも手を出せる余地は最適化やレジスタ割り付けなど色々ある)。OSにおけるMinixのような位置付けのコンパイラ版と言えるかも知れない。

読んでみると、各パートが小さいので十分わかりやすい。しかし後のパートにいくと多少ややこしいものもあったように思う。特にレジスタ割り当ては私には厄介だった。

2005年05月12日

OCaml超入門

以前から興味のあったocamlを学ぶため、手始めにOCaml超入門を読んでみた。
ML系は関数型言語ながら、手続き型言語のような順序評価や値を変更できる変数がある。
モナドと付き合わなければならなさそうなHaskellよりはとっつきやすい。
CやC++で書かれたライブラリを利用する拡張モジュールも書きやすいのではないかと予想する。

CamlでないMLは「初級ML講座」を読んでかじったことがあったのだが、そのときの記憶はすっかり忘れていた。
予約語や文法はCamlとMLでは大筋では似ているのだが、異なる部分も随分あるようだ。
当面はより詳しい解説に当たるとともに、なるべく早く拡張モジュールを一つ書いてみたい。