LabVIEW 是編譯型語言還是解釋型語言

原作者:阮奇桢
轉載自:
http://ruanqizhen.spaces.live.com/blog/cns!5852D4F797C53FB6!1470.entry
(本文已經獲得阮奇桢先生授權轉載)

LabVIEW 和常用的 VC++、VB 一樣,是編譯型語言。LabVIEW 的語法定義比較嚴格,在程式運行之前會檢查所有語句的語法,一旦查出有差錯,程式會報錯,不能運行。在LabVIEW是否是編譯型語言的問題上容易引起混淆的原因,一是用戶看不到編譯時生成的目標檔(在 LabVIEW 的環境中,可以直接運行一個 VI,並不生成任何其他可執行檔);二是 LabVIEW 沒有編譯這個按鈕。此外,VI 運行前似乎也沒有佔用編譯時間。

我們可以把 LabVIEW 和 C 語言的存儲與編譯方法作一比較:C 語言的原文件存儲在 .c 文件中。需要編譯時,要顯式地告知編譯器進行編譯。在耗費一段編譯時間後,可以看到編譯後生成的含有可執行二進位碼的 .obj 文件。而LabVIEW 的原代碼是存儲在 .vi 文件中的。一個 .c 檔中通常保存了多個函數,一個由幾十個函數構成的 C 語言工程,也許只由兩三個 .c 檔組成。而通常情況下,一個 .vi 檔只存儲一個 VI,即相當於 C 語言中的一個函數。所以,一個小型 LabVIEW 工程也可能由幾十個 .vi 檔組成。但在某些情況下,一個 .vi 檔也可能包含了某些子 VI(子函數),即這些子函數沒有他們自己的 .vi 文件。這樣的子 VI 被稱為實例 VI(Instance VI)。LabVIEW 7版本中出現的、目前很常用的 Express VI就是這種 Instance VI。他們都是被存儲在調用他們的 VI 中的。

.c 檔只保存程式的原代碼;而 .vi 檔不僅保存了 LabVIEW 程式的原代碼,也保存了程式編譯之後生成的目標代碼。在 LabVIEW 的工程中看不到類似 .obj 這樣的檔,就是因為編譯後的代碼也已經被保存在了 .vi 中的緣故。

LabVIEW 在運行VI 之前無需編譯,是因為 LabVIEW 在把 VI 裝入記憶體的時候、以及在編輯 VI 的同時進行了編譯。

當把一個 VI 裝入記憶體時,LabVIEW 先要判斷一下這個 VI 是否需要被編譯。一般情況下,VI是不需要編譯的。但是在兩種情況下需要重新編譯。第一種,是在高版本 LabVIEW 中打開一個用低版本LabVIEW 保存的 VI;第二種,是在不同的作業系統下裝入和打開了同一個 VI。比如,要在 LabVIEW 8.0 中打開一個原來用 LabVIEW 7.0 編寫保存的 VI,則被裝入的 VI 需要被重新編譯,因為不同版本的 LabVIEW 生成的目標代碼會稍有不同。如果你的工程包含有上百個 VI,在新版本的 LabVIEW 中打開頂層 VI,就會明顯地察覺到編譯所佔用的時間。第二種情況的例子是,在 Linux 中打開一個原來是在 Windows XP 下編寫保存的 VI,LabVIEW 也需要重新編譯。LabVIEW 為不同作業系統生成的目標代碼也是不同的。在以上兩種情況下,打開一個 VI 後,會發現 VI 視窗的標題欄中的標題後面出現一個星號,這表示需要重新保存 VI。此時,雖然 VI 中的程式原代碼沒有改變,但是編譯生成的目標代碼已經變了,所以需要重新保存。在LabVIEW 安裝了升級補丁之後(比如8.01),程式會提示你是否需要把 LabVIEW 自帶的 VI 全部批量編譯(mass compile)。如果你選擇“是”,則可能需要佔用幾個小時的時間才能完成編譯。

LabVIEW 在你編輯程式原代碼的同時,就會對它進行編譯。LabVIEW 只編譯你當前正在編輯的這個 VI,它的子 VI 已經保存有已編譯好的目標代碼,所以不需要重新編譯了。因為每個 .vi 只相當於一個函數,代碼量不會很大,編譯速度就相當快,用戶基本上是察覺不到的。 你在編寫一個LabVIEW程式時,假如你把兩個類型不同的接線端聯在一起,會看到程式的運行按鈕立即斷裂,它表示程式已經編譯了,並且編譯後的代碼不可執行。程式編寫完畢,所有 VI也都已是被編譯好了,程式直接運行即可。

有時會出現這種情況:打開一個 VI,VI 左上方運行按鈕上的箭頭是斷裂的,表示 VI 不能運行。但是點擊斷裂的箭頭,在錯誤列表裏卻沒有列出任何錯誤資訊。此時箭頭斷裂是由於 VI 保存的編譯後的代碼不能執行引起的。例如在上一次打開這個 VI 時,有一個被此VI 調用的 DLL 檔沒有找到,編譯後的代碼自然不能執行。而後關閉 VI 再把缺失的 DLL 文件放回去。下次打開始 VI 時,理論上 VI 應當可以運行了,但是這時 LabVIEW 沒有重新編譯這個 VI,VI 中保存的是上一次不可執行的代碼,所以運行按鈕的箭頭仍然斷裂。而程式原代碼沒有任何錯誤,所以錯誤列表中什麼都看不到。修復箭頭狀態的方法是按住 Ctrl + Shift 鍵,再用滑鼠左鍵點擊運行按鈕(斷裂的箭頭)。在 LabVIEW 中按住 Ctrl + Shift 鍵 + 滑鼠左鍵點擊運行按鈕表示編譯,但不運行,這相當於其他語言的 Compile 按鈕。