suin.io

VBAを書いててPHPが懐かしくなった(涙)

suin2009年1月2日

最近、卒論関係でデータ処理をしなきゃならなくて、VBSやVBAを書くことが多くなった。WindowsやOfficeちょっとしたことをやりたいなってときは、Cとかと違ってコンパイルする必要もなく、その場で書いてその場で使える。卒論はつらいが、VBAはとても便利だ。

PHPばかりやってると、VB系のコードを書いたとき、PHPのくせが出てしまう。よくやるミスとしては↓

  • 行末に;を書いてしまう。
  • 関数とかを小文字にしてしまう。
  • 文字列結合は&であることを忘れて、ドットでつなげてしまう。
  • 変数の定義を忘れる。
  • 関数がよくわからないときは、とりあえずPHPにある関数を書いてみるが、当たらない。sleepとか、returnとか。

自分がよく知ってる言語の習慣を、よく知らない言語にそのまま当てはめることを、言語学でトランスファー(転移)というけれど、プログラミング言語でも同じようなことをしている。関数名が偶然同じで、そのまま処理がとおれば正の転移、エラーが出て起こられた負の転移。言語学は自然言語しか扱わないことになってたんだっけな。言語学のふりして人工言語のことをあれこれ言ってはいけないな。

PHPと違う特徴に出会うと、すこし学んだ気がしてくる。

たとえば、VBAでもクラスが作れるが、クラス内のメンバ変数にアクセスするとき、PHPの$this->なるものがないというところ。だから、メソッド内で変数がメンバ変数なのか、それともメソッド内のただの変数だかわからなくなる。そこでハンガリアン記法が有効になる。m_というので、これはメンバ変数ですよ、ということを明らかにする習慣が生まれる。同じようなことを、XOOPS Cubeのコーディング規約でメンバ変数の接頭辞はmとするというのがあるけれど、PHPではあまり意味がないかな。個人的には接頭辞をつけるのは好きなのだけれど。

Class A

'メンバ変数
Private m_B As Integer

' 関数
Public Function GetB()

        GetB = m_B

End Function

' サブルーチン
Public Sub SetB(B As Integer)

        m_B = B

End Sub

VBAだと、関数のほかに、サブルーチンというのが定義できる。関数とサブルーチンってなにが違うの?って感じだが、関数は値を返すが、サブルーチンは値を返さないという違いがある。サブルーチンという概念がPHPでは無い。無いと断言していいのかわからないが、少なくとも、VBAみたいに形態に現れてこない。こういうところも実におもしろい。

自然言語でも、複数形とか名詞の性にうるさい西洋語があったり、敬語にうるさい日本語や韓国語があったりと、言語ごとに関心事がちがうのとおなじで、人工言語でもその言語によって、関心の持ち方が微妙に違う。

PHPみたいに型にうるさくない言語を使っていると、型にうるさい言語で、よくつまづくようになる。文字列と思っていたら、数値だったり。"0"と0の違いはPHPが思ってるほど単純じゃなかったり。

ずっと型を意識していると、PHPでももう少し型について厳しく接してもいいんじゃないかと思うようになってくる。でもやっぱり、PHPのルーズさってどうも嫌いになれない。型が勝手に判断されて、泣きたくなることもあるけど、それでも型を気にしないで書きたいときはそうできるからいいというとこもある。一長一短というところか。

VBAとは話が変わるが、自分には「あこがれの言語」というものがある。自然言語ならロシア語、人工言語ならC#。そして、先日、ついにあのあこがれの言語 C# をちょっと触ってみた。気分転換程度ののりだったので、HelloWorldしてひとりで盛り上がっていた。コンパイル言語はどうしても、そのワンステップのために近づきがたかった。C言語をやろうとして、開発用のソフトが高くて諦めたのは中学生のころだっただろうか。今とそのときじゃ比べものにならないくらいフリーな開発環境が増えた気がする。C#はJava系の影響をうけているから、VBAよりは親近感あるかな。今度ローカルで使うアプリを作るときはC#でやってみよう。C#が一人前に書けるころにはロシア語もぺらぺらになってるかな。

RELATED POSTS