プログラムの勉強を始めると、色んな壁にぶち当たります。
一昔前までは、プログラミングといえばC、VB、Javaの様にコードを記述して、ビルド(コンパイル)することで実行用のファイルが生成するっていうパターンが多かったですが、最近はコードを書いて拡張子付けてそのまま実行すれば動く言語もとても増えました。
今回は、そういった実行環境の違いによって生じるエラーやバグを理解する為の部分にフォーカスしたお話をしてみます。
Windowsなどの、OSが直接的に命令文を解釈して処理を実行できるファイルは限られています。Windowsでいえば「exe」ですね。
タスクマネージャーを開いて「プロセス」タブを開くと、実行中の「exe」ファイルがズラッとでてきます。「exe」は、Windows OS向けに直接解釈できる様に最適化して「コンパイル」されたファイルなので、OSは実行ファイルとしてそれらのファイルを直接処理します。
対して、vbscriptや、javascript、OfficeVBAやpythonなんかもそーですが、コードを書いて独自の拡張子で保存して実行すれば処理を実行できるという言語があります。
これらの言語では、その拡張子のファイルを実行しても、そのファイル名のプロセスが立ち上がる訳ではありません。例えば、Msgboxだけを表示する「sample.vbs」を実行すると「wscript.exe」というプロセスが立ち上がります。独自の拡張子に対して別の実行用のプログラムが紐づけられており、そのプログラムがスクリプトコードを解釈して動作してくれる訳です。
例えば...
vbs → wscript.exe
.hta → mshta.exe
VBA → 対象Office(Excel.exe、Access.exeなど)
ですから、OS側で規定の拡張子として事前に設定してくれているプログラム以外の実行環境を作ろうと思ったら、自分で実行用のプログラムと独自拡張子を紐づける作業をしなければなりません。こーゆーのを「環境変数を設定」とか「PATHを通す」とかって言ったります。
もちろん、各言語には一定の規格があり、それに基づいて「同じ様な」振る舞いをする様に実行用のプログラムを開発している訳ですが、それでも大人の事情で僅かづつ動作に違いが出てくる訳です。
スクリプトを直訳すると、「台本」になる訳ですが、文字通り同じコードでも演者によって若干表現が変わってくる訳ですね。。。
だから、例えば…
- このサイトは、Firefox推奨です。とか、
- このコードやpython3.x系で、python2.7.x系では動きません。とか、
- ブラウザ上のスクリプトでは、「WScript.Sleep」が使えない。とか、
- .vbsを実行する時は、setIntervalが使えない。とか、
こーゆー事態に直面する訳です。
ある程度は、外部のライブラリを引き込む様な記述で対処したり別の方法を見つけたりすることができる訳ですが、実行用のプログラム側からしてみれば、想定していなかったコードが混入してくる訳ですから、とにかく解釈できませんみたいなエラーが出ます。
例:vbsでsetInterval使おうとしてみた。
エラー: 型が一致しません。 : 'setInterval'
コード: 800A000D
ソース: Microsoft VBScript 実行時エラー
例:ブラウザだけど、WScript.Sleep使おうとしてしまった。
エラー: オブジェクトがありません。: 'WScript'
こーゆー轍をたくさん踏んで、少しづつ実行環境のこと理解して、エンジニアって成長していくんですよね。
最初にクラスの話をして、実行環境の話をしたので、次は参照設定のことに触れてみようかな。