JavaとJavaScriptには、Unicode escape sequenceというものがある。どちらも同じ文法で、\uに続いて4文字の16進数文字を指定することで、Unicode Code Pointを指定できる。あたかも、Unicode Code Pointを記述したかのように振る舞う。
ところで、JavaとJavaScriptは、このUnicodeエスケープシーケンスの使い方が異なる。例えば、行終端文字\u000Aを、以下のように書く。
// これは\u000Aコメント
これは、JavaScriptで解釈すると、以下のようになる。
// これは\u000Aコメント
以下は、Javaによる解釈である。
// これは
コメント
Javaでは、Unicodeエスケープシーケンスが、実際に行終端文字として扱われてしまう。したがって、行終端文字以降が一行コメントからはみ出してしまう。
これは、文字列リテラルの中でもそうである。
"これは\u000A文字列リテラル" ;
というコードは、Javaでは
"これは
文字列リテラル" ;
と解釈される。Javaの文字列リテラルは、途中に改行文字を記述してはならないので、これはエラーとなる。Javaで文字列リテラルの中に、リテラルの値として改行文字を入れたい場合は、\nなどと書かなければならない。
Javaは謎すぎる。ますますJavaはクソであるという認識を新たにした。
というわけで、ECMA-262 Edition 5.1を読んでいるが、まず、文法記法の丁寧な定義が書いてある。これはとても親切だ。ただし、丁寧な定義と引き換えに、いろいろと文法記法が複雑になっている。これは、JavaScriptのデファクトスタンダードな文法を、後から追認する形で規格化したので、どうしてもこのような複雑な記法にならざるを得ないのだろう。例えば、改行が意味を持つ文脈など。
次はLexical Conventionsだ。
ドワンゴ広告
この記事は超チューニング祭のために勤務中にECMA-262 Edition 5.1を読んでいて興味深かったので書いた。
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0
No comments:
Post a Comment