作者godfat (godfat 真常)
看板Ruby
標題Re: [閒聊] 是否有 Ruby 語法的檢查器?
時間Sat Nov 22 14:05:53 2008
我回文好了... 三行實在講不了什麼 @@"
※ 引述《shelary (喵小咩)》之銘言:
: 標題: [閒聊] 是否有 Ruby 語法的檢查器?
: 時間: Sat Nov 22 13:41:08 2008
: 不知道有沒有什麼套件是可以檢查 Ruby 語法的??
: 例如變數名稱打錯字, 實際執行時會出現 找不到這個變數(=nil)
: 但如果可以事先檢查, 就可以減少很多除錯時浪費的時間了.
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc)
: ◆ From: 59.126.45.78
: 推 godfat:option -c 在 gcc 意思是 compile only, ruby 是 syntax 11/22 13
: → godfat:check. 不過如果是變數打錯字,這不屬於 syntax error, 11/22 13
: → godfat:恐怕還是必須等到執行時才會知道喔,這是沒辦法的 11/22 13
(不好意思 gcc option 說錯了,實際上是:
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
)
如推文所述,ruby -c file.rb 就是只進行 syntax check.
不過像是變數打錯,如把 params 打成 parama, 這不屬於 syntax error,
基本上,這是符合 syntax 的。systax 說的是 term 與 term 之間的關係,
例如:
a = b
a 是合法的 variable name, b 也是合法的 variable name,
所以這句話會翻譯成把 b 這個變數的值 assign 給 a, 整句話是合法的。
但是實際上執行時,會發生:
NameError: undefined local variable or method `b' for main:Object
這個不屬於 syntax error, 如:
SyntaxError.ancestors
=> [SyntaxError, ScriptError, Exception, Object, Kernel]
NameError.ancestors
=> [NameError, StandardError, Exception, Object, Kernel]
前者是靜態的,是 compile time 決定的。你的程式 lexical 結構,
不會因為 runtime 而改變,所以是可以進行 syntax check.
但是後者 NameError 是 runtime 才能決定,如果你在 a = b 之前
就先寫了 b = 1; 則 a = b 並沒有錯。意思就是,compile time 無法
決定哪個 variable 是否存在,因為 ruby 的變數是不用宣告的。
反之在 static typing 的語言,如 C/C++/Java/C# 等等,
因為變數需要宣告,所以 compile 時就能決定。但其實這也不屬於
syntax error, 而是 semantics 上的錯誤,例如 type error:
TypeError.ancestors
=> [TypeError, StandardError, Exception, Object, Kernel]
因為變數在 compile time 不存在,則無法進行 type check,
所以會在 compile time 就有錯誤。
如果你說,那為什麼不能在跑 a = b 時檢查 b 是否存在?
其實在 ruby 裡,那就完全等同於執行一次了。所以這種檢查 = 正式執行。
你需要把所有的 runtime dependency 都讀進記憶體,
這跟完全跑一次的意思其實是一樣的...
所以 ruby 才會有一說是,compile time, link time, runtime 是沒有區分的。
就像你跑 attr_reader, 這種 metaprogramming 的東西,又是在 runtime 進入
compile time, 會在這幾個階段裡面不斷轉換...
而如果是真正的 syntax error, 那光在 require 進來時,就會出錯了。
所以實際上跑 -c 的意義並沒有說很大... 要求 runtime 彈性,
等於犧牲 compile time 時所獲得的資訊。所以這種檢查是沒辦法做的。
事實上這也是在說明一件事,static typing 可以討論的事情是比
dynamic typing 要來得多很多 :s
--
#!/usr/bin/env ruby [露比] /Programming (Kn|N)ight/ 看板《Ruby》
# if a
dog nailed
extra legs that
http://www.ptt.cc/bbs/Ruby/index.html
#
walks like an octopus, and Welcome ~
Ruby@ptt~
#
talks like an octopus, then
◢█◣ http://www.ruby-lang.org/
# we are happy to treat it as
█ http://www.ruby-doc.org/
# if it were
an octopus.
◥ ◤ http://www.rubyforge.org/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18
→ poga:所以我覺得良好的IDE輔助很重要阿... 11/22 14:14
→ poga:NetBean裡頭同名變數會標色,看到打完名稱沒標色就知道有問題 11/22 14:15
→ godfat:之前有用了一下 Aptana, 還是嫌慢... orz NetBean 快嗎? 11/22 14:27
→ poga:6.5純Ruby版的速度我是能接受了,起碼比Eclipse快上好幾倍... 11/22 14:37
推 shelary:另外就是如果中間少打了 END ..常常會找不到是那裡少打了 11/22 15:32
→ shelary:執行時出錯的訊息只會說.rb的最後一行少了END @_@" 11/22 15:33
→ shelary:但是完全沒辦法幫助我去找到到底是那裡少打了 END 11/22 15:34
推 poga:請善用會自己補do-end的各種工具 囧 11/22 15:36
→ poga:沒有工具也要習慣自己檢查括號之類的才對... 11/22 15:37