Re: [閒聊] 是否有 Ruby 語法的檢查器?
我回文好了... 三行實在講不了什麼 @@"
※ 引述《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
→
11/22 14:14, , 1F
11/22 14:14, 1F
→
11/22 14:15, , 2F
11/22 14:15, 2F
→
11/22 14:27, , 3F
11/22 14:27, 3F
→
11/22 14:37, , 4F
11/22 14:37, 4F
推
11/22 15:32, , 5F
11/22 15:32, 5F
→
11/22 15:33, , 6F
11/22 15:33, 6F
→
11/22 15:34, , 7F
11/22 15:34, 7F
推
11/22 15:36, , 8F
11/22 15:36, 8F
→
11/22 15:37, , 9F
11/22 15:37, 9F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 5 篇):
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章