當前位置:首頁 » 編程軟體 » 動態弱類型編譯為靜態強類型

動態弱類型編譯為靜態強類型

發布時間: 2022-06-30 05:12:57

Ⅰ 類型系統的類型檢查

類型檢查所進行的檢驗處理以及實行類型的約束,可發生在編譯時期(靜態檢查)或運行時期(動態檢查)。靜態類型檢查是在編譯器所進行語義分析中進行的。如果一個語言強制實行類型規則(即通常只允許以不丟失信息為前提的自動類型轉換)就稱此處理為強類型,反之稱為弱類型。 如果一個編程語言的類型檢查,可在不測試運行時期表達式的等價性的情況下進行,該語言即為靜態類型的。一個靜態類型的編程語言,是在運行時期和編譯時期之間的處理階段下重視這些區別的。如果程序的獨立模塊,可進行各自的類型檢查(獨立編譯),而無須所有會在運行時出現的模塊的那些信息,該語言即具有一個編譯時期階段。如果一個編程語言支持運行時期(動態)調度已標記的數據,該語言即為動態類型的。如果一個編程語言破壞了階段的區別,因而類型檢查需要測試運行時期的表達式的等價性,該語言即為依存類型的。
在動態類型中,經常在運行時期進行類型標記的檢查,因為變數所約束的值,可經由運行路徑獲得不同的標記。在靜態類型編程語言中,類型標記使用辨識聯合類型表示。
動態類型經常出現於腳本語言和RAD語言中。動態類型在解譯語言中極為普遍,編譯語言則偏好無須運行時期標記的靜態類型。對於類型和隱式類型語言較完整的列表參見類型和隱式類型語言。
術語推斷類型(鴨子類型,ck typing)指的是動態類型在語言中的應用方式,它會「推斷」一個數值的類型。
某些靜態語言有一個「後門」,在這些編程語言中,能夠編寫一些不被靜態類型所檢查的代碼。例如,Java 和 C-風格的語言有「轉型」可用。在靜態類型的編程語言中,不必然意味著缺乏動態類型機制。例如 Java 使用靜態類型,但某些運算需要支持運行時期的類型測試,這就是動態類型的一種形式。更多靜態和動態類型的討論,請參閱編程語言。 對靜態類型和動態類型兩者之間的權衡也是必要的。
靜態類型在編譯時期時,就能可靠地發現類型錯誤。因此通常能增進最終程序的可靠性。然而,有多少的類型錯誤發生,以及有多少比例的錯誤能被靜態類型所捕捉,仍有爭論。靜態類型的擁護者認為,當程序通過類型檢查時,它才有更高的可靠性。雖然動態類型的擁護者指出,實際流通的軟體證明,兩者在可靠性上並沒有多大差別。可以認為靜態類型的價值,在於增進類型系統的強化。強類型語言(如 ML 和 Haskell)的擁護者提出,幾乎所有的臭蟲都可以看作是類型錯誤,如果編寫者以足夠恰當的方式,或者由編譯器推斷來聲明一個類型。
靜態類型通常可以編譯出速度較快的代碼。當編譯器清楚知道所要使用的數據類型,就可以產生優化過後的機器碼。更進一步,靜態類型語言中的編譯器,可以更輕易地發現較佳捷徑。某些動態語言(如 Common Lisp)允許任意類型的聲明,以便於優化。以上理由使靜態類型更為普及。參閱優化。
相較之下,動態類型允許編譯器和解譯器更快速的運作。因為源代碼在動態類型語言中,變更為減少進行檢查,並減少解析代碼。這也可減少編輯-編譯-測試-除錯的周期。
靜態類型語言缺少類型推斷(如 Java),而需要編寫者聲明所要使用的方法或函數的類型。編譯器將不允許編寫者忽略,這可為程序起附加性說明文件的作用。但靜態類型語言也可以無須類型聲明,所以與其說是靜態類型的代價,倒不如說是類型聲明的報酬。
靜態類型允許構造函數庫,它們的用戶不太可能意外的誤用。這可作為傳達庫開發者意圖的額外機制。
動態類型允許建構一些靜態類型系統所做不出來的東西。例如,eval 函數,它使得運行任意數據作為代碼成為可能(不過其代碼的類型仍是靜態的)。此外,動態類型容納過渡代碼和原型設計,如允許使用字元串代替數據結構。靜態類型語言最近的增強(如 Haskell 一般化代數數據類型)允許 eval 函數以類型安全的方式撰寫。
動態類型使元程序設計更為強大,且更易於使用。例如 C++ 模板的寫法,比起等價的 Ruby 或 python 寫法要來的麻煩。更高度的運行時期構成物,如元類型(metaclass)和內觀(Introspection),對靜態類型語言而言通常更為困難。

Ⅱ c#變數聲明

首先,你得先了解一下動態變數與變數之間的區別!
所謂的變數這里當然可以的——但千萬別加動態二字!
.net是靜態編譯語言,但.net 4.0之後是支持動態的,其實也算是一種運行時綁定!可以換成動態變數嗎?答案是可以的!只要你不怕例外或崩潰!
在C#中變數就是變數,比如 int a = 5; a 就是變數!
var a = 5l;a就是一個long型變數!很多人認為var就是動態變數!其實它是靜態變數!也有人叫推斷變數——這種說法也是相當牽強!沒有推斷變數一說的!var的做用是程序員可以不指明變數,而是由編譯器推斷(嚴格來說其中智能感知就可以推斷出來了!)所以var定義的變數由於編譯器在編譯時直接推斷出變數類型!智能感知推斷出來只是防止你犯錯而已!
所以var在編譯時可能會影響一點性能(很微小,甚至可以忽略),在運行時因為是編譯的IL文件,所以根據變數命名沒有任何區別!
兩種觀點:一種是大量使用var,理由是給了這么一個方便當然要使用了!另一種觀點,少使用var方式,影響代碼可讀性!我個人的觀點是,如果程序員是在源碼上交流(直至看到你的源碼,建議不要過多使用var,影響閱讀性,我當然知道使用var寫起來方便,但你寫的方便是方便了,但你在源碼上讀的就沒有那麼方便了!),如果程序在在模塊上交流,無所謂的,用多一點也沒什麼,反正交流時用不到你的源碼,即使是想看源碼,也可以使用IL反射工具,反射出來的時候就不再是var了,而是直接的類型!
推斷類型只能做一個動詞,做為名詞來說明var定義的變數是不對了!所以不存在推斷類型。
但是確實存在一個叫動態類型的東西!dynamic來聲明的類型!要說C#做為一個靜態編譯,他本身是不支持動態類型的,這個所謂的動態類型其實是躲過了IDE和編譯器的檢查而已!換句話來說,他不再檢查這個類型到底是int還是自定義對象什麼的(多數用在定義類上)。允許其直接使用不再對該對象進行檢查。運行時當然也不檢查,只是按照這種類式的調用而已,如果不存在的話,就會報錯!所以呢靜態編譯其實是在編譯時已經確定了類型,而動態類型(也是後期綁定一種)在編譯時不檢查,在運行時直接使用(有人說是運行時確定類型)!如果說動態變數是運行時確定類型確定是非常有助於理解,但事實上運行時並沒有確定類型,只是直接使用而已!
這里有一個概念還是要澄清,弱變數與強變數!強變數表示變數與類型固定,比如int a;a的變數在幅值或使用時都必須是int類型的!如果 a = "15";鐵定會錯,因為這是強變數,而弱變數則表示聲明一個變數,至於存什麼類型,無所謂!比如js中var a = 5;轉過頭你a = "sdfsd",這沒有任何問題!【註:有時弱變數與強變數被稱為弱類型與強類型】
你可能會說,既然沒有動態不再進行檢查,那麼dynamic聲明的變數是不是可以達到弱變數的行式呢?!不可以!所以他實現的原因並不是將C#變數弱類型的語言!只是不再檢查該變數類型而已,但還是強變數(強類型)的本質!
那麼動態變數的實現的本質是什麼?
假定 dynamic instance = new Person();是聲明了一個動態變數,如果你使用instance.Age變數有沒有問題?你可能會說這沒有問題,只要Person有Age的屬性!是的,然而它沒有——如果你var或Person聲明,你編譯器都通不過(不能編譯),但是如果使用dynamic聲明的話卻是可以通過的!運行時會報錯嗎?會的——空引用錯誤!這樣做豈不是無用?第一,你在實際部署時,後來的Person可能有這個屬性呢?或者說你的instance可能不是一個person,而是一個具體有Age屬性的對象呢?比如Animal與Person都有Age屬性,但你運行時不知道他是Aninal類還是Person類(兩者沒有共同的介面或基類),而這個對象可能是一個程序選擇的結果!這時你就知道動態變數的好處了!所以運行時確定類型的說法就來源於此,因為在編譯之前你都不知道這個變數到底是Aninal還是Person,唯一知道你要引用的類中的Age屬性!只有在運行時才知道這個類到底是哪個!
你可能會注意到了,我說是運行時確定類型有助於理解,但說法不完全正確!為什麼?因為如果這個類沒有名字怎麼辦?.net在lambda表達式或其他類似處理時可以生成一個匿名類——注意,沒有名字的類可以有助於理解,但是他有類名,是由運行時直接動態給的!在編譯時你根本不知道類的名稱!這么說了,其實匿名類的處理才是真正引用動態類的真正用途!
嗯,動態變數說完了,根據匿名類的說法,我們是不是可以說其為動態類?不可以!匿名類與動態類是兩碼事!C#靜態語言,不可能支持動態類!上邊「動態」的是變數!不是類!比如腳本語言js中,你聲明一個person類,然後在運行時可以直接使用person.Age = 15;類聲明時並沒有聲明Age,而這些卻是可以直接使用該屬性,為什麼呢?動態類,比如Python語言就是動態編譯類語言。你可以簡單地聲明一個類,連個屬性沒有,但使用時(運行時)可以增加(也可以減少)其類的任何屬性或方法!這就是動態類——它是反映隨著運行時,類可以有屬性(不是屬性值)和方法等變化!C#並不能!這就是靜態語言與動態語言的區別!
幾個概念下來,動態變數可不能亂說,如果11換成int等變數是沒有問題的,但換成動態變數是有問題的!因為動態變數運行時你根本無法推知其體的類型,運行時若是int類型,不是出錯,但若是不同類型,你這比較運行未必支持!
變數就是變數——它是一個值可變的符號來做為佔位,這個佔位就是變數!
動態變數——那個符號只有運行時才被具體的類(匿名類在運行時有類名的)代替。
強類型/強變數——變數類型一旦聲明,不可再更改其使用類型!
動態類——運行時類的屬性或方法會發生變數(增加類的屬性或方法)

Ⅲ 什麼是強類型和弱類型

靜態類型定義語言

一種在編譯時,數據類型是固定的語言。大多數靜態類型定義語言強制這一點,它要求你在使用所有變數之前要聲明它們的數據類型。Java和C是靜態類型定義語言。

動態類型定義語言

一種在執行期間才去發現數據類型的語言,與靜態類型定義相反。VBScript和Python是動態類型定義的,因為它們是在第一次給一個變數賦值的時候找出它的類型的。

強類型定義語言

一種總是強制類型定義的語言。Java和Python是強制類型定義的。如果你有一個整數,如果不顯示地進行轉換,你不能將其視為一個字元串(在本章後面會有更多如何去做的內容)。

弱類型定義語言

一種類型可以被忽略的語言,與強類型定義相反。VBScript是弱類型定義的。在VBScript中,可以將字元串 '12' 和整數 3 進行連接得到字元串 '123',然後可以把它看成整數 123,而不需要顯示轉換。

Ⅳ 動態編譯和靜態編譯有何主要區別

靜態編譯與動態編譯的區別
1、動態編譯的可執行文件需要附帶一個的動態鏈接庫,在執行時,需要調用其對應動態鏈接庫中的命令。所以其優點一方面是縮小了執行文件本身的體積,另一方面是加快了編譯速度,節省了系統資源。缺點一是哪怕是很簡單的程序,只用到了鏈接庫中的一兩條命令,也需要附帶一個相對龐大的鏈接庫;二是如果其他計算機上沒有安裝對應的運行庫,則用動態編譯的可執行文件就不能運行。
2、靜態編譯就是編譯器在編譯可執行文件的時候,將可執行文件需要調用的對應動態鏈接庫(.so)中的部分提取出來,鏈接到可執行文件中去,使可執行文件在運行的時候不依賴於動態鏈接庫。所以其優缺點與動態編譯的可執行文件正好互補。

Ⅳ 什麼是靜態語言和動態語言,強類型和弱類型分別舉下例子,詳細點

靜態類型: C, Pascal, Ada, C++, Java, C# 動態類型: Lisp, Small Talk, VBScript, Python, Ruby, Lua 強類型: Pascal, Ada, Java, C# 弱類型: C, C++ 無類型: BCPL, Forth 唯字元串型: sh

Ⅵ 靜態類型語言和動態類型語言有什麼區別

這個問題比較大,不太好回答,簡單說下我的理解,想了解更多可移步知乎上對該問題的討論

對於靜態類型語言,變數類型都是在編譯期即確定的,可以進行比較完備的類型檢查,避免運行時的類型錯誤。

對於動態類型語言,變數類型是可以動態改變的,無法在編譯期確定,因此編譯期的類型檢查比較弱,這將導致很多類型錯誤直到運行期才能發現。

Java,C,C++等屬於靜態類型語言;JS,Python等屬於動態類型語言。

動態類型語言特點是靈活,缺點是犧牲了部分性能。

Ⅶ 什麼是動、靜態語言 和 什麼是強、弱類型語言

1 動態語言和靜態語言 通常我們所說的動態語言、靜態語言是指動態類型語言和靜態類型語言。 1 動態類型語言:動態類型語言是指在運行期間才去做數據類型檢查的語言,也就是說,在用動態類型的語言編程時,永遠也不用給任何變數指定數據類型,該語言會在你第一次賦值給變數時,在內部將數據類型記錄下來。Python和Ruby就是一種典型的動態類型語言,其他的各種腳本語言如VBScript也多少屬於動態類型語言。 2 靜態類型語言:靜態類型語言與動態類型語言剛好相反,它的數據類型是在編譯其間檢查的,也就是說在寫程序時要聲明所有變數的數據類型,C/C++是靜態類型語言的典型代表,其他的靜態類型語言還有C#、JAVA等。 對於動態語言與靜態語言的區分,套用一句流行的話就是:Static typing when possible, dynamic typing when needed。 2 強類型定義語言和弱類型定義語言 1 強類型定義語言:強制數據類型定義的語言。也就是說,一旦一個變數被指定了某個數據類型,如果不經過強制轉換,那麼它就永遠是這個數據類型了。 舉個例子:如果你定義了一個整型變數a,那麼程序根本不可能將a當作字元串類型處理。強類型定義語言是類型安全的語言。 2 弱類型定義語言:數據類型可以被忽略的語言。它與強類型定義語言相反, 一個變數可以賦不同數據類型的值。 強類型定義語言在速度上可能略遜色於弱類型定義語言,但是強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。另外,「這門語言是不是動態語言」與「這門語言是否類型安全」之間是完全沒有聯系的!

Ⅷ python是什麼樣的編程語言

編程語言主要從以下幾個角度為進行分類,編譯型和解釋型、靜態語言和動態語言、強類型定義語言和弱類型定義語言,每個分類代表什麼意思呢,我們一起來看一下。

2.1 編譯型與解釋型。

編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;

而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯後的程序運行的快的.

這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言(是二進制的形式)

編譯型

優點:編譯器一般會有預編譯的過程對代碼進行優化。因為編譯只做一次,運行時不需要編譯,所以編譯型語言的程序執行效率高。可以脫離語言環境獨立運行。

缺點:編譯之後如果需要修改就需要整個模塊重新編譯。編譯的時候根據對應的運行環境生成機器碼,不同的操作系統之間移植就會有問題,需要根據運行的操作系統環境編

解釋型

優點:有良好的平台兼容性,在任何環境中都可以運行,前提是安裝了解釋器(虛擬機)。靈活,修改代碼的時候直接修改就可以,可以快速部署,不用停機維護。

缺點:每次運行的時候都要解釋一遍,性能上不如編譯型語言。

2.2動態語言和靜態語言

通常我們所說的動態語言、靜態語言是指動態類型語言和靜態類型語言。

(1)動態類型語言:動態類型語言是指在運行期間才去做數據類型檢查的語言,也就是說,在用動態類型的語言編程時,永遠也不用給任何變數指定數據類型,該語言會在你第一次賦值給變數時,在內部將數據類型記錄下來。Python和Ruby就是一種典型的動態類型語言,其他的各種腳本語言如VBScript也多少屬於動態類型語言。

(2)靜態類型語言:靜態類型語言與動態類型語言剛好相反,它的數據類型是在編譯其間檢查的,也就是說在寫程序時要聲明所有變數的數據類型,C/C++是靜態類型語言的典型代表,其他的靜態類型語言還有C#、JAVA等。

2.3強類型定義語言和弱類型定義語言

(1)強類型定義語言:強制數據類型定義的語言。也就是說,一旦一個變數被指定了某個數據類型,如果不經過強制轉換,那麼它就永遠是這個數據類型了。舉個例子:如果你定義了一個整型變數a,那麼程序根本不可能將a當作字元串類型處理。強類型定義語言是類型安全的語言。

(2)弱類型定義語言:數據類型可以被忽略的語言。它與強類型定義語言相反, 一個變數可以賦不同數據類型的值。

強類型定義語言在速度上可能略遜色於弱類型定義語言,但是強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。另外,"這門語言是不是動態語言」與"這門語言是否類型安全」之間是完全沒有聯系的!

例如:Python是動態語言,是強類型定義語言(類型安全的語言); VBScript是動態語言,是弱類型定義語言(類型不安全的語言); JAVA是靜態語言,是強類型定義語言(類型安全的語言)。

通過上面這些介紹,我們可以得出,python是一門動態解釋性的強類型定義語言。

Ⅸ 什麼是靜態語言和動態語言

基本概念
靜態語言(強類型語言)
靜態語言是在編譯時變數的數據類型即可確定的語言,多數靜態類型語言要求在使用變數之前必須聲明數據類型。
例如:C++、Java、Delphi、C#等。
動態語言(弱類型語言)
動態語言是在運行時確定數據類型的語言。變數使用之前不需要類型聲明,通常變數的類型是被賦值的那個值的類型。
例如PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell等等。
強類型定義語言
強制數據類型定義的語言。也就是說,一旦一個變數被指定了某個數據類型,如果不經過強制轉換,那麼它就永遠是這個數據類型了。舉個例子:如果你定義了一個整型變數a,那麼程序根本不可能將a當作字元串類型處理。強類型定義語言是類型安全的語言。
弱類型定義語言
數據類型可以被忽略的語言。它與強類型定義語言相反, 一個變數可以賦不同數據類型的值。強類型定義語言在速度上可能略遜色於弱類型定義語言,但是強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。
兩者區別
特性
強類型語言是一旦變數的類型被確定,就不能轉化的語言。
弱類型語言則反之,一個變數的類型是由其應用上下文確定的。
靜態語言的優勢
由於類型的強制聲明,使得IDE有很強的代碼感知能力,故,在實現復雜的業務邏輯、開發大型商業系統、以及那些生命周期很長的應用中,依託IDE對系統的開發很有保障;
由於靜態語言相對比較封閉,使得第三方開發包對代碼的侵害性可以降到最低;
動態語言的優勢
思維不受束縛,可以任意發揮,把更多的精力放在產品本身上;
集中思考業務邏輯實現,思考過程即實現過程;

Ⅹ 弱類型、強類型、動態類型、靜態類型語言的區別是什麼

弱類型:
>"1"+2'12'強類型:
>>>"1"+2Traceback(mostrecentcalllast):File"",line1,intype(a)type(a)leta="123"::Int:2:9:Couldn'tmatchexpectedtype`Int'withactualtype`[Char]'Intheexpression:"123"::IntInanequationfor`a':a="123"::Int

熱點內容
java語義分析 發布:2024-05-05 05:32:39 瀏覽:754
我的世界伺服器房型 發布:2024-05-05 05:31:16 瀏覽:701
pythonwhere 發布:2024-05-05 05:30:22 瀏覽:441
免費加密隱身俠 發布:2024-05-05 05:07:54 瀏覽:613
我的世界模組伺服器推薦手機版 發布:2024-05-05 05:02:49 瀏覽:818
pr默認存儲 發布:2024-05-05 04:29:31 瀏覽:553
roblox跑酷腳本怎麼做 發布:2024-05-05 03:57:35 瀏覽:702
捷徑清理緩存 發布:2024-05-05 03:57:35 瀏覽:479
ftputility哪裡下載 發布:2024-05-05 03:47:13 瀏覽:1001
雷凌運動版如何連接安卓手機導航 發布:2024-05-05 03:42:48 瀏覽:268