こんにちは、高木です。

昨日Twitterで少し触れたのですが、識別子を母国語(私たちの場合は日本語)で付けることについて今回は書いてみることにします。

日本人のプログラマーなのに、いまだに識別子はすべて英語にしなければならないと思い込んでいる方が多いようです。もちろん、さまざまな事情がありますので、すべて英語で識別子を付けた方がいいこともあるのですが、もう少し柔軟に考えてもいいと思います。

今回は初回ですので、ごく基本的な内容にとどめます。今後、このテーマについてはいろいろ書いていきますので、参考にしていただければ幸いです。

どんな言語で使えるか?

最初に考えないといけないのは、英語以外の言語で識別子を付けられる言語処理系にはどんなものがあるかです。言語処理系が対応していなければ、いくら母国語で識別子を付けることのメリットを強調しても意味がありません。

現在は便利な時代になったもので、主要な言語処理系のほとんどは、英語以外で識別子を付けることができるようになっています。「Unicodeが使えます」のように使える文字が明確になっているものもあれば、PHPのように128から255までのバイトといったルールになっているものもあります。

C言語やC++でも英語以外の識別子を付けることはできます。ただし、GCCだけはつい最近まで「\u6f22\u5b57」のような数値でしか表記することができませんでした。バージョン10.1になって、ようやくUTF-8でそのまま「漢字」と書けるようになりました。世の中にはまだバージョン9.xやもっと古いものも残っていますし、マイコン向けの処理系では英語以外の識別子に対応していないこともまだかなりあると思います。逆にいえば、今、そういった処理系を使う必要がなければ、処理系が対応していないことは、識別子を英語にしなければならない理由にはなりません。

どんな文字が使えるか?

英語以外の識別子が使えるといっても、どんな文字でも使えるわけではありません。使える文字は、プログラミング言語によっても、処理系によっても変わってきます。C言語やC++に関していえば、Visual C++は割と何でもありですが、GCCでは「∠」などの記号は使えませんし、日本語の句読点(「、」や「。」)も使えません(なぜか「?」は使えます)。Clangでは「?」も使えません。絵文字はVisual C++でもGCCでもClangでも使えるようです。

どんな文字を使うべきか?

ここまでは言語処理系の制約についてでしたが、ここからは運用上の方針について考えていくことにします。言語処理系が対応していない文字が使えないのは当然として、言語処理系は対応しているけれども使うべきではない文字にはどんなものがあるでしょうか?

先に確実に使える文字から考えていくことにしましょう。ここで考えるのは日本語だけを対象にします。中国語や韓国語などは、それらを母語とする方々が考える方が妥当でしょうから。

確実に使える文字として真っ先に挙げるのは、英語の識別子でも使っている英数字と下線(アンダースコア)です。次に、日本語を使う上では必須の漢字とひらがな、カタカナです。ギリシャ文字も使ってかまわないと思いますが、英字(ラテン文字)と区別が付きにくい文字、とくにギリシャ文字の大文字の扱いは注意した方がいいでしょうね。ΣやΓなどは問題ないと思います。

それ以外の文字は避けた方がいいでしょう。具体的には、(英語、日本語を問わず)句読点、数学記号や音楽記号などの記号、絵文字がそうです。絵文字に関しては、製品のタイトルなど、仕様上の用語に絵文字が使われている場合に限り、例外的に使ってもよいと思います。

あと、漢字は確実に使える文字としましたが、異体字セレクタが必要な文字や拡張領域を使う文字(要するにサロゲートペアが必要な文字)は避けた方が無難かもしれません。

今後の予定

今回は初回ということもあり、どんな処理系でどんな文字が使えるか、どんな文字を使うべきかについて考えてみました。次回以降は、母国語の識別子を使うメリットやデメリット、運用上の注意点などについて書いていきたいと思います。