小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

lua-checker

 quasiceo 2016-07-14

lua-checker[譯]

轉(zhuǎn)載請注明出處。

 

https://code.google.com/p/lua-checker/

簡介
Lua Checker是一個用來分析lua源代碼的一般錯誤的程序,很想C語言的"lint"。以下的問題已經(jīng)被定義:
  • 使用未聲明的變量
  • 變量的多重聲明
  • 嘗試改變常量
  • 其他計劃查看“future”板塊
Lua Checker是谷歌Street View團(tuán)隊用來驗證Lua腳本而編寫的。Lua Checker是在Lua 5.0標(biāo)準(zhǔn)允許的。
Lua Checker包含一個bison兼容的解析器(詳見lua.y)。
背景
諸如C/C++和Java都是強(qiáng)類型的。這意味著每一個變量只有一種類型(比如數(shù)組、字符串或者對象),當(dāng)變量被錯誤使用的時候,編譯器會給出錯誤信息。所以很多問題都能盡早被發(fā)現(xiàn)。
相反地,Lua腳本語言是動態(tài)類型的,只有一種簡單的類型模型(a simple type model)。變量可被指派為任意類型。這使得腳本語言的開發(fā)在某種程度上更加簡單,但是它也意味著在一些大型程序中,很多一般的錯誤只有在程序運(yùn)行的時候才能被發(fā)現(xiàn)。舉例:
  • 引用一個未聲明的變量會返回 nil 。這和引用一個已經(jīng)聲明為 nil 的變量沒有差別。因此,在lua腳本語言中,拼寫錯誤不會被發(fā)現(xiàn)并且會導(dǎo)致不好的(misbehavior)程序。
  • Tables(Lua主要的數(shù)據(jù)結(jié)構(gòu))沒有類型(原文:Tables and not typed),所以可以包含任意鍵(key)。當(dāng)tables被用于類似C的數(shù)據(jù)結(jié)構(gòu),拼寫的錯誤將會導(dǎo)致不良的程序。
  • 函數(shù)參數(shù)以及返回值也都是無類型的,有著類似的問題。
事實上,超過1000行的Lua程序tend to累積這些問題,從而使得調(diào)試變得困難。一種標(biāo)準(zhǔn)的用來處理未定義的全局變量的Lua慣例是在全局變量的table安裝一個特殊的'get-value'句柄,可以警告未定的全局變量。這是有局限性的,因為仍舊只有在程序運(yùn)行的時候才能發(fā)現(xiàn)缺陷。
Lua Checker正式用來解決這些問題的。它在程序運(yùn)行前執(zhí)行靜態(tài)分析,并且可以發(fā)現(xiàn)問題并給出警告信息。
用法
為了幫助Lua Checker做這些工作,Lua源碼必須被寫得更加嚴(yán)謹(jǐn)。
    1、所有的全局變量在使用前必須聲明,如下:
       
       但是不能像這樣,即使作用是相同的:
        
     2、通過_G table進(jìn)入的全局變量可以被檢查機(jī)制忽略,所以盡量不要這樣做。
     3、通過dofile被包含進(jìn)的源文件也會被掃描,只要dofile用一個單獨(dú)的字符串參數(shù)被調(diào)用在outer scope:
            
      4、變量可以被聲明為常量,只要添加了以下代碼:
            
            --@標(biāo)記代表著特殊的lua checker關(guān)鍵字將會在同一行出現(xiàn)。const 關(guān)鍵字意味著之前的變量被聲明為一個常量。之后任何對這個常量其他的操作
            都被認(rèn)為是錯誤的。注意特殊的關(guān)機(jī)子能夠跟隨lua注釋,如下:
           
 命令行參數(shù)   
    CHECK_LUA.SH是用來調(diào)用lua_checker的。它是笨拙的并且將被更好的代替。
    lua_checker 程序像這樣被調(diào)用:
     
    可用的flags參數(shù)是
  •   -no_reuse_varnames:   在局部作用域內(nèi)(inner scopes)變量名不能重用、這比很多強(qiáng)類型的語言更加嚴(yán)格,但是這可能捕獲更多的錯誤。
  •   -const_functions:所有的函數(shù)變量都是常量,一下都是錯誤的:
 
實現(xiàn)(Implementation)
Lua Checker的有趣部分被應(yīng)用在bison解析器中。兩個分開的部分被使用,那在兩個分開的程序中執(zhí)行:
  1. lua_simplifier將lua源代碼重寫為一種相對簡單的格式。簡化的代碼有很多語法糖擴(kuò)展并且更少的句法歧義(大多數(shù)是通過在每句后加分號)。lua.y 有更詳細(xì)的描述。簡化的關(guān)鍵是為了真正的分析變得更簡單。
  2. lua_checker 對已經(jīng)簡化的代碼進(jìn)行分析
 
遠(yuǎn)景(Future)
產(chǎn)品特色:
  • 允許將tables指派為一種類型,就像C數(shù)據(jù)結(jié)構(gòu)。當(dāng)意外的table字段進(jìn)入的時候給出警告。
  • 允許函數(shù)指派參數(shù)并且返回值類型。當(dāng)參數(shù)和返回值類型不匹配的時候提出警告。
  • 檢測從未被指派的變量。
  • 檢測意外的變量類型改變(比如從number到table)。
  • 在局部作用與內(nèi)定義新的全局函數(shù)時提出警告。
  • 在函數(shù)中使用ellipses但是沒有使用ellipses參數(shù),提出警告
  • Allow user-defined Lua extensions (e.g. global functions defined by the embedded Lua environment). 
  • 檢測‘require’的模塊

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多