2012-07-04 49 views
5

在大學,我參加了計算機體系結構和彙編語言程序設計必修課程。我發現彙編語言非常耗時且很難掌握。我仍然無法理解彙編語言教授的原因。我問了我的老師的同樣問題,他笑了,說你將來會知道的。但是,我有一種本性,我不能等待那麼長時間的答案,一旦一個問題挑逗我的思想。所以我想問,爲什麼我們仍然需要彙編語言,如果有非常強大,快速和高效的編程語言,並且除此之外,這些語言提供了多種工具來使編程變得簡單。所以爲什麼?如果我們的高級語言提供複雜的工具,爲什麼仍然需要彙編語言?

+4

高級語言知道幾乎一無所知的硬件和往往沒有訪問它的方式。這是組裝來救援的地方。另一個用途是代碼的大小/速度優化。 –

+6

這個問題聽起來好像在http://programmers.stackexchange.com上更適合。總之,因爲所有高級語言都自動編譯爲ASM。這使您無法控制最終結果,而不考慮計算機實際執行的操作。儘管編譯器很好,但他們無法知道所有的小技巧並優化代碼以達到完美。如果您希望獲得最佳性能,您需要完全控制計算機在每個細節中所做的工作,而這是高級語言無法提供的。 – deceze

+0

謝謝Alex和deceze –

回答

5

關鍵任務仍然需要機器碼,例如,

  • 硬件的特定代碼,如設備驅動程序
  • 嵌入式設備,其中,所述代碼的大小是重要
  • 低電平碼在性能是關鍵的 等

通常,彙編語言可以混合到更高級別的語言中,例如C,其中彙編可以內聯添加到C代碼中。

也就是說,即使您將使用高級語言進行編程,掌握底層硬件體系結構仍然是一個好主意,因爲它可以讓您深入瞭解堆棧,堆,指針等是如何工作的。

11

一個相當好的理由是所有的編程語言都是計算機工作原理的抽象。理論上講,對於高級語言來說,抽象意味着程序員不必擔心計算機的細節。

但是abstraction is always leaky,例如,大多數(如果不是全部的話)高級語言不能自動優化CPU緩存(例如緩存一致性和錯誤共享),並且高效的多線程總是很棘手。這意味着如果性能至關重要,程序員可能需要以不同的方式編寫代碼。

獲得性能的最佳方法是瞭解機器如何工作,以便程序員可以進行大型體系結構轉換,而編譯器不能輕鬆完成。例如,確保線程以64字節的倍數處理數據(以減少高速緩存線上的錯誤共享),或者執行結構數組轉換的數組結構。


大會(和C在一定程度上)是學習這些性能細節的一個很好的方式,因爲它使得它很容易理解正是計算機的工作,因爲您可以控制在每一步究竟發生了什麼。

(漏抽象一點也適用於訪問特定/定製的硬件組件。)

+0

非常感謝你的回覆。現在它向我澄清了彙編語言的需要。 –