1. 程式人生 > >弱型別、強型別、動態型別、靜態型別語言的區別

弱型別、強型別、動態型別、靜態型別語言的區別


1. 先定義一些基礎概念

Program Errors

  • trapped errors。導致程式終止執行,如除0,Java中陣列越界訪問
  • untrapped errors。 出錯後繼續執行,但可能出現任意行為。如C裡的緩衝區溢位、Jump到錯誤地址

Forbidden Behaviours

語言設計時,可以定義一組forbidden behaviors. 它必須包括所有untrapped errors, 但可能包含trapped errors.


Well behaved、ill behaved

  • well behaved: 如果程式執行不可能出現forbidden behaviors, 則為well behaved
  • ill behaved: 否則為ill behaved...

2. 有了上面的概念,再討論強、弱型別,靜態、動態型別

強、弱型別

  • 強型別strongly typed: 如果一種語言的所有程式都是well behaved——即不可能出現forbidden behaviors,則該語言為strongly typed。
  • 弱型別weakly typed: 否則為weakly typed。比如C語言的緩衝區溢位,屬於trapped errors,即屬於forbidden behaviors..故C是弱型別
前面的人也說了,弱型別語言,型別檢查更不嚴格,如偏向於容忍隱式型別轉換。譬如說C語言的int可以變成double。 這樣的結果是:容易產生forbidden behaviours,所以是弱型別的

動態、靜態型別

  • 靜態型別 statically: 如果在編譯時拒絕ill behaved程式,則是statically typed;
  • 動態型別dynamiclly: 如果在執行時拒絕ill behaviors, 則是dynamiclly typed。
3. 誤區
大家覺得C語言要寫int a, int b之類的,Python不用寫(可以直接寫a, b),所以C是靜態,Python是動態。這麼理解是不夠準確的。譬如Ocaml是靜態型別的,但是也可以不用明確地寫出來。。
Ocaml是靜態隱式型別

靜態型別可以分為兩種:
  • 如果型別是語言語法的一部分,在是explicitly typed顯式型別;
  • 如果型別通過編譯時推導,是implicity typed隱式型別
    , 比如ML和Haskell

4.下面是些例子
無型別: 彙編
弱型別、靜態型別 : C/C++
弱型別、動態型別檢查: Perl/PHP
強型別、靜態型別檢查 :Java/C#
強型別、動態型別檢查 :Python, Scheme
靜態顯式型別 :Java/C
靜態隱式型別 :Ocaml, Haskell

相關推薦

Spring學習總結(二)——靜態代理JDK與CGLIB動態代理AOP+IoC

AOP(Aspect Oriented Programming)意為:面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數語言程式設計的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔

動態網頁和靜態網頁的區別

get 工具 應用 間接 target 得到 代碼 讀取 發出 一、從功能方面來說動態網站與靜態網站的區別 1. 動態網站可以實現靜態網站所實現不了的功能,比方說:聊天室、論壇、音樂播放、瀏覽器、搜索等;而靜態的網站則實現不了。2. 靜態網站,如用Frontpage或Dre

C# 動態方法和靜態方法的區別

內存 法則 靜態 操作類 ret 我們 數據庫操作類 body method C# 動態方法和靜態方法的區別 (轉) 動態方法與靜態方法的區別: 1,使用方法上的區別:動態方法,在使用時需要先創建實例,才能調用實例方法,而靜態方法則不需要,直接使用即可。 示例代碼如下

動態IP和靜態IP的區別如何使用動態IP

動態IP需要在連線網路時自動獲取IP地址以供使用者正常上網,而靜態IP是ISP或網路裝置分配給使用者的IP地址,可以直接連線上網,不需要獲取IP地址,那靜態ip與動態ip的區別在哪裡呢?        動態IP和靜態IP對網速的影響   ISP對每個使用者所提供的網速,並

web---JSP中動態include與靜態include的區別

1. 動態include <jsp:include page="目標jsp"> 它的原理是使用了 request.getRequestDispatcher(目標jsp).include(request,response) 來實現頁面包含,其本質是將 源jsp 和 目標

C++---動態庫與靜態庫的區別

首先介紹一下靜態庫(靜態連結庫)、動態庫(動態連結庫)的概念,首先兩者都是程式碼共享的方式。 靜態庫:在連結步驟中,聯結器將從庫檔案取得所需的程式碼,複製到生成的可執行檔案中,這種庫稱為靜態庫,其特點是可執行檔案中包含了庫程式碼的一份完整拷貝;缺點就是被多次使用就會有多份冗餘拷貝。即靜態庫中的指

動態註冊和靜態註冊的區別

動態註冊的廣播會受Activity的生命週期的影響, 當Activity銷燬的時候,廣播就失效了。   而靜態註冊的廣播,即使Activity銷燬了,仍然可以收到廣播。更牛掰的是即使殺死程序,仍然可以收到廣播。        動態註

關於動態代理和靜態代理的區別

靜態代理:   簡單來說就是:通過真實的實現類A和proxy代理實現同一個介面,然後在proxy代理裡引入A物件的引用。   這樣做的目的,就是為了可以實現一些其他的功能,但是不會讓真實類變得膨脹。   優點:   代理使客戶端不需要知道實現類是什麼,怎麼做的,而客戶端只需知道代理即可(解耦合),對於

動態記憶體與靜態記憶體的區別

來源於https://www.cnblogs.com/davidgu/p/3785722.html 摘錄於此 1. 靜態記憶體 靜態記憶體是指在程式開始執行時由編譯器分配的記憶體,它的分配是在程式開始編譯時完成的,不佔用CPU資源。 程式中的各種變數,在編譯時系統已經為其分配了所需的記憶體

C++ 基礎(六).dll檔案的動態載入和靜態載入的區別:畫圖並舉例說明

一、簡介 本部落格主要介紹.dll檔案的動態載入和靜態載入的區別,畫圖並舉例說明。此外,我的上一篇關於靜態載入的部落格如下: C++ 基礎(五)使用vs2015封裝c++生成.dll檔案、.lib檔案、.h檔案後,給另一個工程使用:使用前,需配置標頭檔案(.h)靜態庫(.lib)和 動態庫(

jsp中動態include與靜態include的區別-面試題

     JSP中動態INCLUDE與靜態INCLUDE的區別 動態INCLUDE用jsp:include動作實現 <jsp:include page="included.jsp" flush="true">它總是會檢查所含檔案中的變化,適合用於包含動態頁面,並

動態庫與靜態庫的區別(linux vs windows)

      方法庫大體上可以分為兩類:靜態庫和動態庫(共享庫)。在windows中靜態庫是以 .lib 為字尾的檔案,動態庫是以 .dll 為字尾的檔案。在linux中靜態庫是以 .a 為字尾的檔案,共

動態SQL與靜態SQL的區別

首先,所謂SQL的動態和靜態,是指SQL語句在何時被編譯和執行,二者都是用在SQL嵌入式程式設計中的,這裡所說的嵌入式是指將SQL語句嵌入在高階語言中,而不是針對於微控制器的那種嵌入式程式設計。在某種高階語言中,如果嵌入了SQL語句,而這個SQL語句的主體結構已經明確,例如在Java的一段程式碼中有一個待執行

動態編譯和靜態編譯的區別

動態編譯的可執行檔案需要附帶一個的動態連結庫。在執行時,需要呼叫其對應動態連結庫中的命令。所以其優點一方面是縮小了執行檔案本身的體積,另一方面是加快了編譯速度,節省了系統資源。缺點一是哪怕是很簡單的程式,只用到了連結庫中的一兩條命令,也需要附帶一個相對龐大的連結庫;二是如果

MySQL儲存過程中使用動態SQL與靜態SQL的區別

儲存過程中使用動態SQL 例項 [sql] view plain copy print? DELIMITER $$ DROP PROCEDURE IF EXISTS `test`.`t1`$$ CREATE /** [DEFINER

動態網頁與靜態網頁的區別

res 字符 pro documents class文件 web資源 fire 接收 dev 動態網頁與靜態網頁的區別 1.靜態網頁 1、在靜態Web程序中,客戶端使用Web瀏覽器(IE、FireFox等)經過網絡(Network)連接到服務器上,使用HTTP協議發起一

程式語言型別型別動態型別靜態型別語言區別

將知識點分門別類可以更好的記憶,程式語言也是,同類型的語言之間也可以相互印證,更全面的理解。 下面轉自知乎。 基礎概念 Program Errorstrapped errors。直譯器或編譯器不能處理的錯誤。導致程式終止執行,如除0,Java中陣列越界訪問untrapped

動態語言靜態語言型別定義語言型別定義語言區別

呵~~(冷笑) 第一次接觸pythod,是一個朋友告知我它是一種弱型別語言,不用規定變數型別,於是”python=弱型別“ 的概念在我腦海紮根,並且深信不疑!! 然後每每和別人談起pythod時,我就會以資深口吻”哦,pythod啊,它是一種弱型別語言“開頭~~

Oralce 儲存過程 cursortype x_cur is ref cursorsys_refcursor 靜態遊標型別 型別動態遊標靜態SQL 動態SQL 結合使用總結

直接上程式碼,使用的開發環境: Oracle Database 11g Release 2(11.2.0.4.0) - Enterprise Edition, PL/SQL Develop 12.0.7,Instantclient_12_2; PL/SQL Develop ->

型別型別動態型別靜態型別語言的區別是什麼?

https://www.zhihu.com/question/19918532 型別系統的一些概念,眾說紛紜,使用上也比較亂。有些東西,甚至不好嚴格定義。以下算學術界的一種相對“嚴格”的說法。 1. 先定義一些基礎概念 Program Errors trapped err