2017年7月29日 星期六

[C#] strongly typed, weakly typed (loosely typed)


  • 程式語言區別
  • 程式語言區別描述
    • 動態/靜態類型語言 (Static typing when possible, dynamic typing when needed)
      • 型態系統 (type system): 程序專門處理數據的系統,語言可分:
        1. 動態類型系統 (Dynamically Typed Systems)
          • Python, Ruby, ECMAScript(JavaScript)
        2. 靜態類型系統 (Statically Typed Systems)
          • C, C++, C#
          • 更進一步分為:
            1. 包含宣告型態 (manifest type),每個變量和函數型態都須清楚宣告
            2. type-inferred语言
              • MUMPS, ML
    • 四種類型語言分類及區別
      • 動態類型 (Dynamically Typed Language)
        • 運行期間才檢查數據類型(動態類型語言編譯時),永遠不用給任何邊量指定數據類型。第一次賦值給變量時,內部將數據類型記錄下來
        • Python, Ruby, PHP, ECMAScript(JavaScript)
        • Python 和 Ruby 是典型動態類型語言,其他像各種腳本語言如VBScript 也使屬於此類型
        • 優點:方便閱讀,不需要寫非常多的類型相關代碼
        • 缺點:不方便調試,命型沒規範時會照成閱讀問題,不利於理解 ... 等等
      • 靜態類型 (Statically Typed Language)
        • 編譯期間會檢查數據類型(撰寫程序時需聲明所有變量的數據類型),所有變數需聲明數據類型,且固定(int, float, double... 等)
        • C, C++ 為靜態類型語言的典型代表,其他還有 C#, JAVA ... 等等
        • 優點:結構非常有規範,便於調試,方便類型安全
        • 缺點:因此需要寫更多類型相關代碼,不便於閱讀、不清晰明瞭
      • 顯性類型 (Explicitly type conversion,類型安全)
        • 確實地告訴編譯器,這類型在做什麼
        • 一個變量指定某個數據類型,如果不經過強制轉換,它永遠就是這個數據類型
        • 必需進行變量/對象類型聲明的語言,一般情況下需要編譯執行
        • 舉例:若定義一個整數類型的變量 A,不進行轉換,A 將不能當作字串類型處理
        • C, C++, C#, JAVA, Python, Ruby
      • 隱性類型 (Implicitly type conversion,類型不安全)
        • 不希望編譯器來幫做轉型動作,或是為了解決某些困難,想要卸除編譯器安全限制,就可以使用顯性轉型來達到目的
        • 它與顯性轉型別相反,一個變量可以賦與不同的數據類型值
        • 舉例:如字串'12'和整數 3 進行連接得到字串 '123',結果可為整數 '123',而不需要轉換
        • PHP, ECMAScript(JavaScript), ... 
        • 注意:
          • “顯性轉型”在速度上可能略遜於“隱性轉型”
          • “顯性轉型”的嚴謹性能夠有效避免許多錯誤
    • 總結關於
      • “是否為動態語言”與“安全性”之間是全沒有關係
    • 舉例安全
      • Python 是動態語言,是顯性轉型 (類型安全)
      • JavaScript 是動態語言,是隱性轉型 (類型不安全)
      • JAVA 是靜態語言,是顯性轉型 (類型安全)
    • Code
    
    // Object  弱型別
    // 隱性轉型就是無法區分為型態的型別
    var obj = "Lyndon";
    
    // String 強型別
    // 能夠明確定義出型別的就是顯性轉型
    // 在編譯(complier)時就可以找出錯誤
    String sStr = "Lyndon"; 
    

  • 編譯與運行角度 (與上敘述語法角度區別有所不同)
    • 類型系統的觀念,眾說紛紜,使用上也比較混亂。有些東西,勝治不好嚴格定義。以下算是學術界另一種相對 “嚴格”的定義。
    • 定義基礎概念
      • Program Errors
        1. trapped errors
          • 導致程序終止執行 (如:除以 0,C#/Java 中數組越界訪問越界)
        2. untrapped errors
          • 出錯後繼續執行,但可能出現任意行為 (如:C 緩衝區溢出、Jump 到錯誤地址)
      • Forbidden Behaviors
        1. 語言設計時,可以定義一組 forbidden behaviors,它必須包括所有 untrapped errors,但可能包含 trapped errors。
      • Well behaved / ill behaved
        1. well behaved 
          • 如果程序執行不可能出現 forbidden behaviors,則為 well behaved 
        2. ill behaved:否則為 ill behaved
    • 有了上面概念,再討論“強弱型別” 與 “靜態動態類型”
      • 動態類型 (Dynamically Typed Language)
        • 如果運行時拒絕 ill behaviors,則是 dynamically typed
      • 靜態類型 (Statically Typed Language)
        • 如果編譯時拒絕 ill behaved,則是 statically typed
      • 強型類型 (Strongly typed)
        • 如果語言所有程序都是 well behaved,即不可能出現 forbidden behaviors,則該語言為 strongly typed
      • 弱型類型 (Weakly typed)
        • 否則為 weakly typed (如:C 語言的緩衝區溢出,屬於 untrapped errors,屬於 forbidden behaviors,因此 C 為弱類型)
      • 前面說明,弱型別語言,類型檢查更不嚴格
        • 偏向容忍隱式類型轉換(如:C 語言 int 可以換成 double。這樣結果是容易產生 forbidden behaviours,所以是弱型別)
    • 誤區
      • C 語言撰寫 int a,int b 之類,Python 不用寫 (可以直接撰寫 a,b),所以C 是靜態,Python 是動態。這麼理解是不夠準確 (如:OCaml 是靜態隱式類型,但可以不用明確撰寫出來)
      • 靜態類型可以分兩種:
        1. 如果類型是語言語法一部分,是顯示類型 (explicitly typed)
        2. 如果類型通過編譯時推導,是隱式類型 (implicitly typed)  (如:ML和Haskell)
    • 例子

      • 無類型:匯編 
      • 弱類型、靜態類型:C/C++ 
      • 弱类型、動態類型檢查:Perl/PHP 
      • 強型別、靜態類型檢查:Java/C# 
      • 強型別、動態類型檢查:Python,Scheme 
      • 靜態顯示類型 :Java/C 
      • 靜態隱式類型 :OCaml,Haskell
    • 補充
      • 紅色區域外:well behaved (type soundness) 
      • 紅色區域內:ill behaved 
      • 如果所有程序都是灰的:strongly typed 
      • 否則如果存在紅色的程序:weakly typed 
      • 編譯時排除紅色程序:statically typed 
      • 運行時排除紅色程序:dynamically typed 
      • 所有程序都在黃框以為:type safe 

  • 結論
    • 問題來了,前者認為 C 是強型別,後者認為 C 是弱型別,衝突了
    • “強弱型別” 有兩種截然不同分類觀點:
      • 從數據類型轉換和語法角度
      • 編譯和運行中操作不同角度
  • Ref:
    • http://ot-note.logdown.com/posts/173174/note-cpp-named-type-convertion
    • http://www.jianshu.com/p/336f19772046
    • https://www.zhihu.com/question/19918532
    • https://www.zhihu.com/question/19918532/answer/23217475
    • http://linianhui.cnblogs.com/p/plp_04_datatypes.html
    • https://stackoverflow.com/questions/17202208/typed-vs-strongly-typed-in-c-sharp https://dotblogs.com.tw/justforgood/2015/04/09/151000
    • http://javapig.pixnet.net/blog/post/48216506-c%23--%E4%BD%95%E8%AC%82%E5%BC%B7%E5%9E%8B%E5%88%A5
    • http://a7419.pixnet.net/blog/post/88870641-c%23%E5%9E%8B%E5%88%A5%E8%BD%89%E6%8F%9B

沒有留言:

張貼留言