おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

翻訳だけでLogoの日本語化にチャレンジ

えー何この時間 ><;
ということでメールのコピペをちょっと加工して仕上げます。ひどい。

LibreLogo とはなんぞや?

えーと、Logo ってプログラミング言語知ってる? 知らない? 君ちょっとそこ座りなさい。嘘です。
Logo というのはシーモア・パパートという MIT の AI ラボの先生が作った言語で、うんぬんかんぬんといったうんちくは Wikipedia でも見てくださいまし。

面白いのは、私がコミュニティでお手伝いしてます LibreOffice、この機能拡張として、「LibreLogo」というのがあったんですね。これについては このプレゼン資料 (PDF) を見るといいと思います。「もちろん初等教育にも使えるし、パンフレットとかで繰り返し図形を綺麗に描きたいときとかにもオススメ!」ってわけ。

で、教育に使えるってことは売りになるんちゃう? と思った人がいるのかいないのか、いま開発中の LibreOffice 4.0 (2 月にリリース予定) では、なぜか機能拡張ではなく本家に入っちゃいました。なんとまあ。

始まりはおっちょこちょいから

LibreLogo のマニュアル (英語だけどすごく簡単) を見てわかるとおり、Logo は非常に簡単な英語っぽい文法を持ってます。こんな感じ*1

REPEAT 5 [ FORWARD 100 LEFT 5 ]

で、LibreOfficeローカライズの ML 見てたら、あれ、「コマンド訳すときにはマニュアルもちゃんと訳してねー」とかアナウンスが出てる。えっ、コマンド訳していいの?


LibreLogo は LibreOfficeワープロソフト Writer の文書としてコマンドを書いてえいっと実行するとプログラムが動いて、タートルグラフィックスで描かれた図形は LibreOffice の図形オブジェクトになるので加工して切り貼り自由自在というなかなか面白いものなのですが、まあ UI は普通に LibreOffice Writer なわけです。そこにツールバーが一個追加される格好。

んで、そのツールバーの一番右側のボタン、マジックアイコンって呼ばれてるんですが、これをぽちっと押すと、ローカライズされたコマンドを扱えるみたいなんすね。なにそれ楽しそう!

んで作者に聞いたらこれこれこうやると試せるよっていうので試しにFORWARDを「すすむ」って訳して「すすむ 10」って書いてボタンぽちっと押したら、おお、FORWARD 10 になった!

LibreLogo の対象年齢はだいたい10歳ぐらいを想定しているらしいです。ぼくはローマ字を何年生で習うとか当然忘れましたが、まあパソコンいじるってことはローマ字とかアルファベットに抵抗があるわけではないでしょう。でも授業の導入とかで使うなら、日本語でコマンド打てる方がラクだと思ったわけ。

で、最初は日本語で打って、マジックアイコン押して、あーこういう風に書くんだねーって分かったら、子どもは柔軟性が高いからFORWARD とか REPEAT とか使うだろうと。その導入として、どこまで「翻訳だけで」日本語プログラミングっぽいことができるかということに挑戦して見ました。


……が、どうもよくよくドキュメントを読んでみたら、日本語から英語にするんじゃなくて、英語から日本語になるんだって。
私は日本語から英語になると思ってたから、ある意味日本語は入り口にすぎなくて、無理矢理な日本語でもいいや、と思ってたんだけど、どうもそうはいかないみたいなので、これはちゃんと戦略練らないとダメだな、と……。


けど、せっかく訳したので、その訳でどんなふうに描けるようになったかをメールからのコピペで披露したいと思います。
なお時間の都合により制御構造だけです。単純なコマンドは載せてません。

LibreOffice の翻訳は Pootle というシステムでやってて、LibreLogo の翻訳はここで見られるので、暇な、ちがった、興味のある人は覗いてみてくださいな。

グルーピング系

といっても一個しかないです。

PICTURE

PICTURE というのは図形をグルーピングする機能……なんだそうです。

PICTURE [ FORWARD 100 CIRCLE 100 ]

と書くと、「100 前進して 100 のサイズの円を書く」処理がグループ化されます。かなり訳しにくかったので英語以外にふたつ用意しました。

図 [ すすむ 100 円 100 ]
図のグループ  [ すすむ 100 円 100 ]

でもどっちにしても:

PICTURE                    ; start a new line shape
FORWARD 10 PICTURE FORWARD 10   ; two line shapes

この例にはハマらないんだよなあ……(というか、この例の意味がよくわかんない)。

繰り返し

LOGO は繰り返しの構文が分かりやすいのがいいですよね。BREAK とか CONTINUE なんてのは多分 LibreLogo 独自だと思いますけど。

REPEAT

繰り返しの基本形です。引数を省略すると無限ループです。
内部でREPCOUNTという変数を参照できて、これが繰り返しの回数です。

REPEAT 10 [ FORWARD 10 LEFT 45 CIRCLE 10 ]
REPEAT [ POSITION ANY ] ; endless loop
REPEAT 100 [ FORWARD REPCOUNT LEFT 90 ]

これはシンプルにしました。

くりかえす 10 [ すすむ 10 左 45 円 10 ]
くりかえす [ 場所 なんでも ]
くりかえす 100 [ すすむ くりかえした数 ]

ついでにいうと ANY というのは「ランダムな値の組を返す」ダミー変数です。POSITION ANY は Logo のイディオムらしい。これを「なんでも」と訳したのはちょっと苦しくて「どこでも」の方が良かったかなあ。

FOR IN

ほかのプログラミング言語の foreach 的なやつです。

FOR i IN [1, 5, 7, 9, 11] [
  FORWARD i
  LEFT 90
]

文字列も OK です。

FOR i IN “text” [
  LABEL i
  FORWARD 10
]

これはかなり強引です。FOR と IN は別々の単語なので、別々に訳してくっつけたときに意味ができないと行けない。こんな感じにしました。

ひとつずつ i を次から取り出して [1, 5, 7, 9, 11] [
  すすむ i
  左 90
]

うーん、苦しい。

WHILE
WHILE REPCOUNT <= 10 [ FORWARD 50 LEFT 36 ]  ; as REPEAT 10 [ ... ]

かんたんですね。けど翻訳は辛いです。なぜなら日本語の場合は「ナントカの間繰り返す」と、後置で書きたくなるからです。しょうがないのでインチキワード「次」を入れました。

くりかえすのは次の間 くりかえした数 <= 10 [ すすむ 50 左 36 ]

「次の間くりかえす」の方がいいかもしれないな、と思ったり。

BREAK/CONTINUE

C の break/continue そのまんまです。

REPEAT [                   ; endless loop
  POSITION ANY
  IF REPCOUNT = 100 [ BREAK ]  ; equivalent of the REPEAT 100 [ ... ]
]

REPEAT 100 [
  POSITION ANY
  IF REPCOUNT % 2 <> 0 [ CONTINUE ]
  CIRCLE 10     ; draw circles on every 2nd positions
]
くりかえす [
  場所 なんでも
  もし くりかえした数 = 100 [ くりかえしから出る]
]

くりかえす 100 [
  場所 なんでも
  もし くりかえした数 % 2 <> 0 [ はじめにもどる ]
  円 10
]

「はじめにもどる」は処理の先頭にもどりそうなので悩んだんですが、どうせ記号だと割りきりました。

条件分岐

って、IF と論理演算しかないんですけど。

IF

なんか文法が Lisp っぽいのは気のせいです。

IF a < 10 [ PRINT “Small” ]
IF a < 10 [ PRINT “Small” ] [ PRINT “Big” ]

これはシンプルに。

もし a < 10 [ 表示 "小さい" ]
もし a < 10 [ 表示 "小さい" ] [ 表示 "大きい" ]
NOT, AND, OR
IF a < 10 AND NOT a < 5 [ PRINT “5, 6, 7, 8 or 9” ]

NOT がキツイ。たぶんこれ多くの日本語プログラミングの取り組みで同じ悩みがあったと思います。なぜなら NOT は前置ですが日本語の否定は後置だからです。ということで「次」で逃げました。ああ、なんか悔しい……。
あと AND の略語も意外と悩みます。イマイチ気に入りません。
「かつ」って言葉が硬いんでやわらかいことばをいれたいなとおもって「と」を選んだんですが、なんか微妙……。意外と「で」がいいんじゃないかと書いてて思いました。

もし a < 10 と 次が正しくない a < 5 [ 表示 “5, 6, 7, 8 または 9” ]

サブルーチン

サブルーチンといってもスコープもあるし引数も渡せるし戻り地もあるので馬鹿にすんなよな。

TO ... END

関数やサブルーチンを作ります。この一般語彙がパパート先生の意志を感じるけど、正直つらい。

TO triangle
REPEAT [ FORWARD 100 RIGHT 120 ] FILL
END

REPEAT 10 [ triangle PENUP POSITION ANY PENDOWN ]


そもそも「サブルーチン」をなんと呼ぶかなやんで、結局「動き」としました。「処理」だとちょっと固いのがイヤ。でも「動き」もそんなに気に入ってるわけじゃないです。
「あと、おわり」がなんか一般用語すぎて気に入らないんですよね。

動きを作る triangle
くりかえし [ すすむ 100 右 120 ] 塗りつぶす
おわり

くりかえし 10 [ triangle ペンを上げる 場所 なんでも ペンを下ろす ]

いま思ったんですけど、こんなのもいいかもしれないな。

動きの名前 triangle
くりかえし [ すすむ 100 右 120 ] 塗りつぶす
できあがり

でも後ろで出てくるけど、TO ... END の END は "]" で代用できちゃうみたいなんすよね。それだとイマイチかなあ。

OUTPUT

return 文のうち、値を返す方。

TO randomletter
OUTPUT RANDOM “qwertzuiopasdfghjklyxcvbnm”
END

これはもう悩まない。というかつかれてきました。

動きを作る randomletter
値を返す RANDOM “qwertzuiopasdfghjklyxcvbnm”
おわり
STOP

return 文のうち、値を返さない方。STOP といいつつ処理は止まらないのがトリッキー。

TO example number
  IF number < 0 [ STOP ]
  PRINT SQRT number             ; print square root
]

「動き」という言葉が変わったら、こっちも変えないとね。

動きを作る example number
  もし number < 0 [ 動きから出る ]
  表示 平方根 number             ; print square root
]

おわりに

やっぱり文法いじらないで自然に日本語に読めるプログラミング言語を作るのはすごく難しいということがわかりました。
もっと先人の知恵を学ばねばという感じです。

でも、どうも LibreLogo 自体が西欧言語以外をうまく扱えないんじゃないかってことになってて、今回の作業没になる可能性が高いんですよね。
はーあ。

*1:はてなさん、スーパーpre記法のシンタックスハイライトに LOGO はないのね……orz