JavaRush /Java Blog /Random-TW /程式語言的級別
Marat Sadykov
等級 41

程式語言的級別

在 Random-TW 群組發布

介紹

有哪些不同的程式語言?其中蘊含著什麼樣的概念?他們是如何發展的?在本文中,我們將根據所謂的級別來了解程式語言的類型 - 從機器程式碼(低級,接近電腦硬體)到 Java 或 C# 等語言(高級)。程式的文字清單在變成一組 0 和 1 的過程中經歷的轉換越少,等級就越低。
程式語言等級 - 1
接下來我們將看看:
  1. 低階語言(機器碼和彙編)
  2. 中級(C、Fortran…)
  3. 高級(C++、Java、Python、Ruby、JavaScript...)
此等級也表徵了未來計畫的清單需要詳細到何種程度才能實施。這個過程對人類來說有多簡單?語言的程度不應被視為其能力的明確指標。程式語言是一種在一個領域有效而在其他領域不太有用的工具。細木工和木匠都用木頭工作。第一個有一個主要工具 - 一套鑿子,第二個 - 一把斧頭。然而,木匠會讓雕花櫃更美觀,木匠會讓房子建得更快。儘管每個人都有能力完成對方的工作,但他們的效率會低得多。計算機中的各種資料表示為零和一的集合。用於其處理的控制命令是包含確定必要資訊的位置和修改方法的指令的相同資料。

機器語言(最低等級)

我們必須從軟體區域到硬體區域進行短暫的存取。讓我們以簡化的形式來看看。 處理器是電腦的主要「大腦」。安裝它的主機板包含用於透過匯流排(用於通訊的資料通道)與其他裝置互動的控制器。
程式語言等級 - 2
有些以高速工作(紅色箭頭):處理器從記憶體中提取命令並操作數據,顯示卡(尤其是在 3D 遊戲中)消耗大量紋理、形狀、像素座標和其他物件以在顯示器螢幕上建立圖像。其他的(由於資訊交換速度的限制)不需要這麼高的指標。各種內部和外部設備在圖中以綠色箭頭連接。

處理器的內部世界

所有處理器命令都來自內存,以二進制形式執行。指令的格式、數量、子集取決於其體系結構。他們中的大多數人彼此不相容並遵循不同的意識形態。而且命令的類型很大程度上取決於處理器工作的模式(8/16/32...位元深度)和資料來源(記憶體、暫存器、堆疊...)。相同的動作可以用不同的指令來表示。處理器具有用於將兩個操作數相加 (ADD X,Y) 以及將 1 與指定操作數相加 (INC X) 的指令。在操作數中新增三元組可以透過 ADD X,3 或呼叫 INC X 三次來完成。而且,對於不同的處理器,無法預測這些方法中哪種在速度或記憶體佔用方面將是最佳的。為了方便起見,二進位資訊以十六進位形式寫入。讓我們考慮一個熟悉的程式的一部分(C語言,其語法類似於Java)
int func() {
    int i = getData("7") ;
    return ++i;
   ...
}
以處理器指令序列的形式實現相同操作的程式碼: ... 48 83 ec 08 bf bc 05 20 00 31 c0 e8 e8 fe ff ff 48 83 c4 08 83 c0 01 ... 這就是英特爾處理器的低階程式語言的實際樣子。使用參數呼叫方法並傳回加一的結果的片段。這是機器語言(代碼),無需轉換,直接傳送到處理器執行。 優點:
  • 我們完全掌握了情況,我們擁有使用處理器和電腦硬體的最廣泛的可能性。
  • 我們可以使用所有組織和優化程式碼的選項。
缺點:
  • 有必要對處理器的功能有廣泛的了解,並在執行程式碼時考慮大量的硬體因素。
  • 創建比給出的範例稍微複雜的程式會導致編寫程式碼和偵錯程式碼所花費的時間急劇增加。
  • 平台依賴性:為一個處理器建立的程式通常無法在其他處理器上運作。對於該處理器,在其其他操作模式下,可能需要進行程式碼編輯。
機器代碼在電腦誕生之初就被廣泛使用;在電腦先驅時代沒有其他程式方法。目前,微電子領域的工程師在開發或低階測試處理器時偶爾會使用它們。

組合語言(低階)

與電腦不同,你和我能更好地感知文本/語義形式的信息,而不是數字形式的信息。您可以輕鬆地在智慧型手機上說出五十個聯絡人姓名,但您不太可能能夠記住他們相應的電話號碼。程式設計也是如此。我們透過三個基本步驟來提升型別階梯:
  • 讓我們將一條符號指令與執行對應操作的一組數位處理器指令相關聯。
  • 讓我們分別重點介紹處理器指令的參數。
  • 讓我們介紹一下命名記憶體區域、變數和各個命令的位置的功能。
讓我們比較一下前面程式的機器碼(中)和組合語言(右)的片段:
2004b0     48 83 ec 08      sub    $0x8,%rsp
2004b4     bf bc 05 20 00   mov    $0x2005bc,%edi
2004b9     31 c0            xor    %eax,%eax
2004bb     e8 e8 fe ff ff   callq  getData
2004c0     48 83 c4 08      add    $0x8,%rsp
2004c4     83 c0 01         add    $0x1,%eax
正如您所看到的,編寫程式的過程已簡化:無需使用參考書來產生數字命令值、計算轉換長度、在記憶體中跨單元分配資料以及其他處理器功能。我們從一組符號命令和執行邏輯所需的參數中描述所需的操作,然後翻譯程式將文字檔案翻譯成處理器可以理解的一組零和一。 優點:
  • 編寫和修改程式碼的過程得到了簡化。
  • 保持對所有硬體資源的控制。
  • 將程式移植到其他平台相對容易,但需要根據硬體相容性進行修改。
缺點:
  • 彙編語言是一種低階程式語言。即使創建一小段程式碼也很困難。另外,還需要考慮到設備的具體操作情況。
  • 平台依賴性。
最流行的 Java 演示範例:
public static void main(String[] args) {
    System.out.println("Hello World!");
}
將如下所示(NASM 語法,使用 Windows API 和 kernel32.lib):
global _main
	extern  _GetStdHandle@4
	extern  _WriteFile@20
	extern  _ExitProcess@4

	section .text
_main:
	; DWORD  bytes;
	mov 	ebp, esp
	sub 	esp, 4

	; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
	push	-11
	call	_GetStdHandle@4
	mov 	ebx, eax

	; WriteFile( hstdOut, message, length(message), &bytes, 0);
    push	0
	lea 	eax, [ebp-4]
	push	eax
	push	(message_end - message)
	push	message
	push	ebx
	call	_WriteFile@20

	; ExitProcess(0)
	push	0
	call	_ExitProcess@4

	; never here
	hlt
message:
	db  	'Hello, World', 10
message_end:
與機器代碼一樣,彙編語言更常被工程師和系統程式設計師使用。它用於編寫作業系統核心中與硬體相關的部分,這些部分對時間要求嚴格或對各種週邊設備驅動程式的實作功能至關重要。但最近他們越來越少使用它,因為它的使用大大降低了程式到其他平台的可移植性。有時他們會使用反彙編過程 - 他們從數位程式碼建立程式的彙編清單來解析執行小片段的邏輯。在極少數情況下,如果原始高級程式碼不可用:分析病毒以對抗病毒或遺失原始程式碼。彙編語言被認為是第一/第二代(我們不會單獨考慮彙編程式出現之前的偽代碼及其與符號命令的區別)。我想強調的是彙編程式在演示場景中的使用:藝術、數學和低階編碼的融合,以程式的形式體現了創作者的藝術理念,在資源有限的情況下生成視訊剪輯。通常,程式和資料檔案的總大小不應超過 256 位元組(4/64 KB 格式也很流行)。以下是 4 KB 程式的範例:

C組/Fortran語言(中級/高級)

隨著電腦技術能力的發展,彙編程式碼的功能量和執行時間已不再令人滿意。編寫、測試和維護程式的成本比其能力的成長速度快一個數量級。有必要降低程式設計師對設備功能知識的要求,為他提供一個工具,使他能夠用接近人類邏輯的語言進行編寫。進入新的程式語言類型層級。提供拆分成各種模組並進一步順序呼叫的能力(過程式設計範式),提供各種類型的資料建構它們的能力等。此外,這些措施還提高了程式碼向其他平台的可移植性,使組織結構更加舒適。團隊合作。最先支援上述所有功能的語言之一是Fortran,它在 1950 年代開發。能夠使用循環、分支、子程式以文字形式建立執行邏輯的描述,並使用陣列進行操作,並以實數、整數和複數的形式呈現數據,這讓工程師和科學家感到高興。在很短的時間內,科學「框架」和圖書館就被創建了。所有這一切都是因為 Fortran 在今天仍然具有相關性,儘管是在一個狹窄的科學環境中,並且正在發展,因為發展的包袱非常大,僅IMSL庫自1970 年以來一直在積極發展(!),你還記得很多類似的相關軟體嗎?-老前輩?這個級別語言發展的另一個分支是C。如果 Fortran 成為科學家的工具,那麼 C 的創建是為了幫助程式設計師創建應用軟體:作業系統、驅動程式等。該語言可讓您手動控制記憶體分配並提供對硬體資源的直接存取。C 程式設計師必須控制低階實體,因此許多人認為 C 是一種高階組合語言,通常被稱為「中級」語言。在將資料類型引入彙編程式、過程化和模組化程式設計的元素之後,C語言仍然是系統程式設計的主要語言之一,這也得益於近年來微電子學的快速發展。各種小工具、控制器、網路和其他設備都需要驅動程式、協作協議的實現以及其他相對底層的軟體來實現與設備的交互。所有上述因素都促進了當今對該語言的需求。物件導向和函數式原則以 C++、C#、Java 的形式進一步發展,借鑒了 C 語法的許多 內容。
  • 簡化程式碼建立流程:引入類型、分割模組、減少程式清單。
  • Прозрачная логика заложенного алгоритма вследствие ухода от машинных codeов к более понятным для человека командам в семантически описательном стиле.
  • Переносимость. Стало достаточно перекомпorровать текст программы для выполнения на другой платформе (возможно, с небольшой модификацией).
  • Скорость откомпorрованных программ.
Минусы:
  • Отсутствие автоматического управления памятью и необходимость постоянного её контроля.
  • Отсутствие реализации концепций an objectно-ориентированного и функционального программирования.

Развитие языков высокого уровня

在軟體創建方面,高階程式語言已經越來越多地開始擺脫機器碼,並實現除過程性程式設計範式之外的各種程式設計範式。其中也包括物件導向原則的實作。C++、Java、Python、JavaScript、Ruby... - 這類語言是當今最受歡迎且需求最大的語言。它們為實現各種軟體提供了更多的機會,並且不可能清楚地確定每個軟體的「專業化」。但應用程式在相關領域的流行是由於與之合作的程式庫/框架,例如: JavaScript - 前端。此語言設計用於客戶端 Web 瀏覽器與使用者和遠端伺服器之間的互動。最受歡迎的函式庫是 Angular、React 和 VUE。目前,它在 Web 和其他伺服器(後端)上的使用相對活躍,Node.js 尤其受歡迎。 Ruby - 後端。它用於在 Web 伺服器上建立腳本(服務文件)。主要框架是Ruby On Rails。 Python是一個科學和工程領域(除了 Web 領域)。它是標準計算和數學包(Mathematica、Octave、MatLab...)的替代品,但具有該語言的常用語義和大量庫。在機器學習系統、統計和人工智慧領域擁有眾多粉絲。常用的函式庫包括 django、numpy、pandas 和 tensorflow。 C++ – C 語言的通用、進化發展。提供函數式和物件導向的程式設計能力,同時又不失去與低階硬體互動的能力。因此,在創建軟體時實現了生產力和靈活性,但價格也相應:由於語言的複雜規範而導致較高的進入門檻,執行程序時需要對資源進行獨立控制。許多單一使用者和系統軟體都是用它編寫的:作業系統模組(Windows、Symbian...)、遊戲、編輯器(Adobe Photoshop、Autodesk Maya...)、資料庫(MSSQL、Oracle...)、播放器( WinAmp...)等。需要注意的是,現代軟體是一個複雜的產品,其開發同時使用多種程式語言,並且很難確定每種語言的參與程度。整體結果。

進一步進展

最近,另一種類型的程式設計越來越流行—函數式(語言層級的進一步發展)。這是另一種計算抽象類型 - 將一組函數作為參數並傳回另一個函數的函數。變數的作用與函數相同(我們熟悉的變數只是常數表達式,類似於Java中類型宣告之前的final)。函數本身在其範圍內是封閉的,其操作的結果僅取決於傳遞的參數。由此得出兩個顯著的特性:
  • 對於測試,我們只需要函數參數(工作結果不依賴外部變數等)。
  • 函數式程式奇蹟般地支援並發:可以在相鄰執行緒中發出順序函數呼叫(因為它們不受外部因素的影響)並且不需要鎖(即不存在同步問題)。鑑於多核心處理器的廣泛採用,這是花時間研究這個主題的良好動機。
然而,入門門檻比 OOP 更高:為了獲得有效的程式碼,需要建立一個程序,以函數的形式描述執行演算法。但對於純函數式風格來說,了解邏輯和範疇論的基礎知識也是很好的。最流行的是 Haskell、Scala、F#。但不要害怕,函數式程式設計的元素已經出現在 Java(以及其他現代第三代語言)中,它們可以與 OOP 結合。您將在 JavaRush 線上實習中更詳細地了解所有這些細節。由於需求較低,邏輯程式設計領域(下一級的語言)尚未找到廣泛的實際應用。建構程式需要離散數學、謂詞邏輯、約束工具和數理邏輯其他分支的基礎知識。最流行的活躍語言是 Prolog。

結論

目前,最常見的語言是OOP。Java自誕生以來,一直位居榜首,通常是流行語言的前三名。除了 OOP 之外,它還包含函數式程式設計的元素,您可以結合不同的程式編寫風格。Java 的應用範圍非常廣泛 - 這些是業務任務、Web 伺服器(後端)的實現、創建 Android 應用程式的主要語言、跨平台程式設計環境和工作場所 (IDE/AWM) 以及建模等等。Java 在企業領域的地位尤其強大——企業軟體領域需要高品質和長壽命的程式碼以及最複雜的業務邏輯的實現。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION