首頁>技術>

程式設計,以及為什麼他們提倡像C ++這樣的靜態語言

> Photo by Alex Kotliarskyi on Unsplash

事實並非所有人都同意。

許多高階開發人員表示,他們發現使用動態型別的語言令人頭疼。下面的響應收集了大部分拍手。

“對不起,什麼?動態型別的語言比靜態型別的語言容易出錯嗎?抱歉,但是不是我21年的軟體開發生涯。”—拉斯姆斯·舒爾茨(Rasmus Schultz)

遵循此答案,我決定彙總使高階開發人員避開動態鍵入語言的主要原因,並在此處列出這些理由以消除誤解。

為了更好地解決此問題,由於Python的迅猛發展,我們將以Python作為動態型別語言的示例。

動態型別

在這種情況下鍵入與擊鍵無關。這個詞是從資料型別派生的。

在程式設計方面,許多型別的類(例如強型別和鴨子型別)都可以發揮作用。但是,我們將自己限制為最常見的幾個:

動態型別靜態型別

動態型別是在執行時標記型別錯誤的情況。也就是說,也不必像Python,Ruby和JavaScript那樣顯式宣告資料型別。

與動態型別相反,靜態型別是在編譯期間報告型別錯誤和顯式宣告資料型別的報告。C,C ++和Java就是這種情況。

一般來說,關於Python和程式語言的有趣之處在於,它們的某些優點還是缺點。

為了讓您當場,請考慮以下Python程式碼示例:

max_number = 12my_list = []for i in range(1, 5):	max_numbre = 2 * (max_number * i)	my_list.append(max_number)print(my_list)

輸出:

[12, 12, 12, 12]

在上面的示例中,我們要對變數max_number執行計算並將結果儲存在列表中。但是,我們可以看到這一切都沒有發生,並且結果是錯誤的。這是因為在for迴圈中,我們拼錯了max_number,導致建立了另一個名為max_numbre的變數。

任何人都可能犯此類錯誤,尤其是在工作壓力很大的人身上。

但是,在像C ++這樣的靜態型別語言中,必須在使用前宣告變數。而且您一定要進行執行前分析,以確保您的變數型別協調一致。由於可以更好地控制變數,因此最終可以提高安全性。

全域性解釋鎖

高階開發人員會對效能感到驚訝的一件事是效能。

與初級人員不同,初級人員需要處理幾行程式碼,維護和編寫健壯的生產程式碼(通常為數百行或數千行程式碼),是由經驗豐富的開發人員承擔的。因此,擁有高效的程式語言可能會變得毫無疑問。

就是說,由於全域性直譯器鎖(GIL)禁止充分利用計算機的資源,因此它是程式語言(如Python和MRI Ruby)的效能瓶頸。GIL損害的資源是CPU執行緒。

不過,不使用GIL的程式語言會充分利用CPU的功能。因此已知它們支援平行計算。

平行計算無非就是讓所有執行緒同時執行。由於需要處理的天文資料數量眾多,因此這種型別的計算現在比以往任何時候都更加重要。

下圖是一個平行計算的示例:

> Example of all CPU threads running. Diagram created by the author in diagram.net

可以合理地假設,在相同的CPU時鐘速度下,計算機擁有的執行緒越多,程式執行速度就越快。

但是,GIL的出現終結了平行計算。

GIL是一種鎖,一次僅允許一個執行緒使用GIL。執行緒的選擇遵循排隊方式。這意味著,當具有最高優先順序的執行緒正在使用GIL時,其他執行緒將處於等待狀態,直到釋放GIL。

最重要的是,使用者無法控制執行緒選擇。相反,作業系統是負責執行緒優先順序排序的作業系統。

下圖最好地說明了發生的方式:

> GIL effects on the threads. Diagram created by the author in diagram.net

為了解決此問題,許多程式設計師,或者至少是聰明的程式設計師,嘗試使用例如Python的多執行緒模組線上程之間手動拆分程序,以期獲得更好的效能。他們最終最終會獲得更差的效能。

儘管結果似乎很奇怪,但它是計算機科學,而不是計算機推測。如果您對問題進行更深入的研究,那麼一切都應該放到位。

儘管Python的核心開發團隊完全意識到了這個問題,但很難擺脫GIL,因為它是Python許多細節的骨幹,例如記憶體管理和C擴充套件(僅舉幾例)。

Python的正式作者Guido van Rossum表示,他對Python是否會支援平行計算並不充滿信心,因為這最終是該語言的設計方式。

但是,諸如C ++之類的靜態型別語言不受GIL的限制。這使得它們在比較中效率很高。

空格敏感性

使用一種會因空格錯位和缺失而標記錯誤的程式語言,可能並不是每個人的功勞。這些空格是空格,製表符,換行,返回或換頁。例如,與C不同,Python確實對空格敏感。

我們將透過以下C和Python程式碼之間的比較來證明這一點。

Python版本:

i = 50if i % 2 == 0:    print("inside if statement")  print("i is even")

輸出:

print("inside if statement") print("i is even") ^SyntaxError: invalid syntax

C版:

#include<stdio.h>int main(void){int i = 50;if (i % 2 == 0){printf("inside if statement\n");printf("i is even\n");}}

輸出:

~/ $ ./test1inside if statementi is even

與抵制混亂的程式碼結構並最終得到正確輸出的C版本不同,Python生成的語法錯誤最初是由語句放置錯誤引起的。因此,有人會說Python不如C ++或原始C健壯。

具有諷刺意味的是,儘管許多專業程式設計師認為空白敏感性很煩人,但許多Pythonista人士認為處理空白問題比最後進行列追逐要好。

最後,在處理大型程式碼塊時,空格敏感性問題令人討厭。但是,如果在團隊中灌輸良好的編碼習慣,則可以輕鬆解決空白敏感性問題。

向後相容

不支援向後相容性意味著舊版本的Python程式碼在新版本下可能無法工作。換句話說,絕對需要查詢新版本中發生的語法更改,並相應地重寫其程式碼。

當向後相容性成為一個嚴重問題時,一個很好的例子是第一次從Python 2過渡到3。

Python核心開發團隊認為,人們將Python 2程式碼轉換為Python 3不會有問題。但是他們錯了。

Python的作者本人在講話時承認了這一點:

“我們低估了多少人已經編寫了大量的Python程式碼,然後基本上忘記了它是如何工作的。因此,他們不是很擅長升級它。我們意識到那裡存在問題。”

關於該問題的裁決是延長了Python 2.7的壽命。

總結

程式語言一直是熱門話題,因此不能將其視為對與錯。至少有一些原因使他們偏愛另一種語言。

通常,每種通用程式語言都適合特定的人群。Python的官方作者說:

“學習使用Python程式設計比學習使用Java或Swift程式設計容易得多。對於學習計算機科學的專業軟體開發人員來說,Java和Swift是很棒的程式語言。然後開始為一家軟體開發公司工作。但是Python可以教給初中的孩子。”

除此之外,最理想的情況是擁有一種可以結合C ++和Python優點的程式語言。

5
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Django實戰022:檢視和類檢視的使用方法詳解