一文理解靜態語言、動態語言、解釋型語言、編譯型語言、強類型語言、弱類型語言

引言

想必在面試過程當中,你們都會被問起,xxx語言,是強類型仍是弱類型?是靜態語言仍是動態語言?是編譯型語言仍是解釋型語言?我猜絕大多數同窗,都是經過死記硬背來回答這道題的。其實,要理解這些概念並不困難,對於熟悉的語言,結合平時工做中的經驗,就能很快的肯定語言分類。廢話很少說,且聽我一一道來。php

寫在前邊

若是筆者的理解與釋義有錯誤或者誤解的地方,請各位在評論中指出,筆者必定及時更正。python

ps:沒有找到特別好的定義來源,因此一部分定義引自百度百科,一部分定義取自網絡釋義,筆者加入了必定的我的理解,各位看官參考就好。golang

編譯型語言和解釋型語言

定義

編譯型語言面試

編譯型語言首先是將源代碼編譯生成機器指令,再由機器運行機器碼(二進制)。swift

解釋型語言bash

解釋型語言的源代碼不是直接翻譯成機器指令,而是先翻譯成中間代碼,再由解釋器對中間代碼進行解釋運行。網絡

解析

從程序的運行本質上來說,不管是編譯型語言仍是解釋型語言,都會通過以下過程函數

源代碼->中間代碼->機器碼->運行獲得結果
複製代碼

而編譯型語言和解釋型語言二者的區別,只是在於這些過程發生的時機不一樣。性能

對於編譯型語言來講,在真正運行前,就已經翻譯出了底層平臺能夠運行的機器碼,真正運行時,只須要把翻譯產物交給底層平臺運行便可,很是直觀。這樣帶來的缺點很明顯,每更換一個平臺,每次代碼邏輯的修改,就須要從新編譯一份機器碼,未免顯得過於繁瑣。但同時帶來的優勢也不容忽視,機器碼的執行效率很是高,能夠極大地提升程序的運行速度。典型的有C、golang等。ui

對於解釋型語言來講,在真正運行前,最多隻會進行到生成中間代碼這一步,甚至可能連中間代碼也不會生成,只有在真正運行時,纔會去翻譯成機器碼,交給底層平臺執行,從而獲得結果。不難看出,解釋型語言能夠省略複雜的步驟,只須要將源代碼交給代碼的執行引擎,全部的修改均可以實時地獲得反饋,能夠極大的提升開發效率,可是相對的,因爲每一次執行都須要通過翻譯的過程,因此程序的執行性能會損失很多。典型的有PHP、js、python等。

舉一個以前某個大神總結的通俗易懂的例子:

  • 編譯型語言就像作一桌子菜而後再吃。
  • 解釋型語言就像吃火鍋,原料準備好後,邊作邊吃。

已經作好的一桌子菜,能夠很快地食用,可是想再作加工的話就比較困難了。火鍋吃起來就隨意得多,想吃什麼菜,想用什麼鍋底,想蘸什麼料,能夠隨時調整,可是相應的,須要等待更長的時間。

強類型語言和弱類型語言

定義

強類型語言

強類型語言也稱爲強類型定義語言。是一種老是強制類型定義的語言,要求變量的使用要嚴格符合定義,全部變量都必須先定義後使用。

弱類型語言

弱類型語言也稱爲弱類型定義語言。與強類型定義相反。

解析

強類型,簡單來講就是,一個已經被指定了數據類型的變量,除非是通過強制類型轉換,不然沒法被賦值爲其餘類型的數據。弱類型則相反,變量會自適應地去匹配數據類型,某種程度上來講能夠不關心變量的數據類型。

強弱類型與下一節的內容放在一塊兒,對比說明效果會更好,因此這裏再也不作過多贅述.

動態類型語言和靜態類型語言

其實目前咱們平常所說的動態語言、靜態語言,全稱應該是動態類型語言、靜態類型語言,只不過在知識傳遞的過程當中,叫法出現了一些誤差,致使叫法變得不嚴謹,各位必定要注意,這裏若是在面試過程當中能夠進行說明,相信會給面試官留下一個很好的印象。實際上,動態語言、靜態語言是有其自己的定義的,咱們稍後作出說明。

定義

動態類型語言

動態類型語言是指在運行期間纔去作數據類型檢查的語言,把類型綁定延後到了運行階段。

靜態類型語言

靜態類型語言的數據類型是在編譯期間肯定的,或者說運行以前肯定的,編寫代碼的時候要明確肯定變量的數據類型。

解析

定義其實已經解釋得比較清楚了,用一句話總結一下

Static typing when possible, dynamic typing when needed。
複製代碼

這裏想結合強弱類型說明一下,不少同窗會很天然地認爲強類型語言即爲靜態類型語言,反過來,弱類型語言即爲動態類型語言,其實這個理解是錯誤的,直接上圖:

四種類型對比
從圖中能夠很明顯地看出,強類型、弱類型、動態類型、靜態類型之間,並無直接的關聯關係,具體語言要根據特性具體分析。

其實還有一種誤區,關於編譯型語言、解釋型語言、靜態語言、動態語言,部分同窗會認爲編譯型語言都是靜態語言,解釋型語言都是動態語言。簡單舉幾個例子,swift是編譯型、動態類型、強類型語言,C#是解釋型、靜態類型、強類型語言。

因此不難看出,數據類型間並無什麼絕對的關聯關係,這裏你們須要注意。

動態語言和靜態語言

定義

動態語言

程序在運行時能夠改變其結構:新的函數能夠被引進,已有的函數能夠被刪除等,在結構上的變化。

靜態語言

與動態語言相對,在程序運行時,結構不能發生改變。

解析

這裏舉幾個例子就能夠理解了,主要是幫助你們區分動態語言、動態類型語言、靜態語言、靜態類型語言之間的區別。

PHP

<?php
    $a = new A;
    $a->test = function() {};
    $a->test();
複製代碼

JS

person = new Person();

person.hello = function(){
  alert('hello world');
}
person.hello();

//刪除方法
delete person.hello;
person.hello();
複製代碼

動態語言、靜態語言,指的是代碼結構,動態類型語言、靜態類型語言,指的是數據類型。

相關文章
相關標籤/搜索