こんにちは,bitter_foxです.
RCCでは前期に上回生が,後期には新入生が例会でLTを行なっています.
また,最も良かったLTを決めるLT選挙というものも行なっています.
前期の後半のLT選挙で僕が行なったLT,「Javaで予約語に日本語を使えるようにしてみた(言語処理)」が第二回LT選挙で1位になったのでそのLTをお伝えします.
著作権の都合で画像を差し替えています.
Javaで予約語に日本語を使えるように処理系を弄ってみたという内容です.
僕のLTの一ヶ月ぐらい前に自然言語処理と銘打ってなぜかイ○ムを紹介した子が居たのでそれに合わせに行く感じでイ○ムに乗っけってこの話をしました.
日本語でプログラムを書くことができる言語になでしこやひまわりがありますが,どうしても著名な言語には劣ってしまいます.
僕の大好きな言語であるJavaも日本語をプログラムに用いることができます.
こんなかんじで・・・
public class メイン { public static void main(String[] 引数達) { for (String 引数 : 引数達) { System.out.println(引数); } } }
確かにJavaで日本語を利用することができます.
ですが,利用できる箇所は識別子に限られます.更にCoreAPIが英語なため更に利用できる箇所が限られてしまいます.
そこでpublicやclassといった予約語にも日本語を利用できるようにjavacを弄ってみました.
リポジトリはこちらになります.
diffはこちらになります.
ベースリポジトリはOpenJDKのjdk8-b88です.
ちなみに記号も全角な記号をサポートして全角スペースも半角スペースなどと同様に扱われるように変更しています.
このコンパイラを用いると先のプログラムは次のように書くことができます.
公 クラス メイン { 公 静的 空 main(String[] 引数達) { ファッ (String 引数 : 引数達) { System.out.println(引数); } } }
また,FizzBuzzは次のようになります.
公 クラス Test1 { 公 静的 空 main(String[] 引数) { ファッ (整数 い = 0; い < 100; い++) { もしも (い % 15 == 0) { System.out.println("FizzBuzz"); } 他の もしも (い % 3 == 0) { System.out.println("Fizz"); } 他の もしも (い % 5 == 0) { System.out.println("Buzz"); } 他の { System.out.println(い); } } } }
正気の沙汰ではありません.
軽く実装方法について説明します.
Javaでは予約語によるトークンはトークンと予約語が1対1対応するように宣言されています.
src/share/classes/com/sun/tools/javac/parser/Tokens.java
ABSTRACT("abstract"), ASSERT("assert", Tag.NAMED), BOOLEAN("boolean", Tag.NAMED), BREAK("break"),
ではこれらを日本語に書き換えるだけで実現できてしまうような気がします.そう思ってた時期が僕にもありました.
JDKはlangtoolsをビルドした後に生成されたjavacを用いてライブラリをコンパイルするので,英語の予約語が正しくトーカナイズされずに大量のコンパイルエラーとなってしまいます.そもそもそういう実現方法は後方互換性完全無視なので好ましくありません.
そこで1対n対応に実装を変えて,(STATICを例に説明すると)staticと静的がSTATICというトークンに変更される様にしてあげる必要があります.
そんな感じになるようにちゃちゃっとコードを書くとこんな汚い感じのJavaが出来上がりました.