爲什麼要學習彙編語言?

一、我學習彙編的緣由

工作兩年後,我爲什麼突然決定要學習彙編呢?在我的一些朋友看來很奇怪,確實,這個選擇在我的技術學習生涯裏,有點突兀。

我在上篇文章 《計算機非科班工作後如何爬出技術的絕望之谷,走向開悟之路》 中聊了下目前學習的瓶頸,決定要學習計算機科班的專業課程,打破認知差距。那麼我應該如何選擇重點課程,設置這些課程的學習順序呢?

其實我最開始是學習了《數據結構算法》和《網絡技術》的,這兩者比較接近應用層,學習起來問題不大。然後我決定重點攻克《操作系統》,但是我發現在學習過程中涉及到許多偏硬件方面的內容,於是我決定先研究下《計算機組成原理》,但是當看到指令集體系結構這裏時,發現有很多指令涉及到寄存器的操作,這些東西都像極了彙編語言,並且我回憶起了Java字節碼指令好像也是類似的東西,這一刻我對彙編的好奇心被激發了。

說實話,彙編語言在我的印象中一直都具有相當的神祕色彩。還記得大學裏學習C語言時,開篇就介紹了編程語言的三個層次:機器語言 - 彙編語言 - 高級語言,然後講彙編語言非常底層,直接和計算機硬件打交道,開發效率低,學習成本高,然後我就再也沒有和彙編語言打過交道了。如果我是C/C++開發者,可能對彙編並不陌生,畢竟都是代碼是要編譯成彙編的,確實有研究的必要。但是Java系語言有虛擬機屏蔽底層細節,且生態太過龐大,我一直沒發現有學習彙編的必要。

但現在,我突然想破除這種神祕感了,我迫切想知道彙編到底是一門怎樣的語言,突如其來的好奇心,同時帶着一絲興奮,我開始了彙編語言的學習。


二、彙編到底有什麼用

上面講了我學習彙編的來龍去脈,總結下原因主要有兩個:
1.學習底層基礎的道路上自然而然地遇到了彙編,並且我相信學習彙編會對我理解底層有一定幫助
2.對技術的好奇心,使我想要撕掉彙編在腦海裏那神祕而朦朧的面紗

這時,如果稍微帶點功利心地問,彙編到底有什麼用呢?
就我自己而言,學習了彙編之後,我覺得它對我的用處主要有這樣幾點:

1.學習過程很美妙,真的,我腦海裏很多之前看過但卻朦朧的技術知識點都變得清晰起來,極大地鼓舞了自己,讓我有更大的信心繼續深入學習組成原理和操作系統了,這是一次破障的旅行、一次精神上的突破。

2.我對編程控制計算機運行有了較爲深刻地理解:
什麼是寄存器?
程序在內存和CPU中是怎麼折騰的?
CPU是如何訪問內存的?
代碼(程序)和數據CPU是如何區分的?如何分段?
什麼是棧?在內存中如何體現?
什麼中斷?什麼是中斷向量表?

對傳說中的馮.諾依曼體系結構也有了相對具體的認識,能在腦海裏建立起有着更多細節的計算機,那些看似抽象的概念逐漸變得清晰。

真的太值了。

如果拋開抽象的認知,從實際應用的角度出發,彙編又有什麼用武之地呢?結合資料我總結了如下幾點:

1.閱讀bootloader代碼:基本上,除了OS的核心部分有彙編代碼以外,boot loader 的一部分一般是由彙編代碼完成,能讀懂這些代碼對體系架構的理解和設備啓動的流程都很有幫助。(Bootloader是嵌入式系統在加電後執行的第一段代碼,在它完成CPU和相關硬件的初始化之後,再將操作系統映像或固化的嵌入式應用程序裝在到內存中然後跳轉到操作系統所在的空間,啓動操作系統運行)

2.分析問題:現在編譯器優化很厲害,生成的代碼和C代碼有時很難又嚴格的對應,所以在單步跟蹤某些問題的時候,需要能夠看懂一些彙編語句來分析程序真正執行的流程

3.性能:在設計及編碼中考慮底層的執行流程,從而能編寫高性能的代碼

4.破解軟件、遊戲外掛、計算機病毒、加密、脫殼、逆向工程等

5.讓你覺得能使用高級語言開發是多麼幸福的一件事 ~

當然,這些彙編應用對於大多數開發者而言都是用不到的,但是,我覺得用不到不代表我們對此一無所知就理所當然!如果你真的對技術有所追求,請相信我,花兩週時間學學它,一定有所值!


三、想成爲技術高手,一定要懂彙編嗎?

劃重點:一定不要神話某些技術!

這裏我就直接引用知乎大神們的回答吧!

陳然 機器學習、數據挖掘、人工智能 話題的優秀回答者

大概在另外一撥人的眼裏,成爲計算機學科的高手應該是把數學學好。你們這羣人都只是低端的碼農,只有把高等數學學好,精通概率、統計、隨機過程、抽象代數,熟練掌握各種建模方法,纔是計算機科學的王道。再結合各種領域知識,年薪百萬輕輕鬆鬆。弄點高級算法幾十億被收購瞬間財富自由。

技術只是技術本身,計算機發展了這麼多年,無數新技術層出不窮。每個人都靠着自己的專長在這個領域發家致富。有的人是因爲懂客戶需求,有的是擅長做設計,有的人擅長把成熟的技術應用到傳統的學科之中。彙編只是這茫茫技術中的一種而已。

本質上來講,高手的本身並不是掌握了什麼技術,而是能夠幫助別人解決問題。一種技術只是解決問題的一種方法,而不是唯一的方法。如果解決這些問題需要精通匯編,那麼你一定需要掌握。如果想解決的問題並不需要了解彙編知識,你大可以不掌握。彙編知識與很多其他知識在知識本身這個層次上並無優異之分,只不過在計算機領域更底層一些。

最後,計算機的基礎知識,比如操作系統、數據庫、計算機網絡、編譯原理,該瞭解的肯定要了解,該入門的要入門。

至於是否要精通,如果你發現在你成長的過程中遇到的瓶頸,是對於底層的瞭解,那你就應該精通。

郭凜 十歲編程,至今二十餘年,小成

一直覺得軟件行業有個很有意思的現象,就是絕大多數人都覺得越是懂底層的人就越是牛逼。

不巧個人十來年前初中時開始用8086/8088彙編寫一些小應用,後來大學到工作零零散散也寫點,談不上什麼高手。但一直感覺彙編說白了就是一堆的MOV/CMP頂着寄存器和內存做各式各樣晦澀的操作,外加INT各類硬件、系統中斷滿天飛,平時開發都是抱着一本手冊四處查各種中斷號及flag,熟練點的同事能背下中斷,再熟練點的能看機器碼如看彙編——一個同事經常自稱“看盡天下A(ASM)片,心中自然無碼(機器碼)”😃。

個人覺得彙編說白了只不過是門語言而已,和c/java/c++本質上沒有區別,只是你使用這門語言必須接觸CPU寄存器、需要更好的關注和規劃內存使用、需要了解各種硬件和系統級API(中斷)、需要寫更多行的代碼、更容易出錯、比高級語言更難寫出優美的程序……這些……在我看來,除了讓開發者更苦逼之外,實在看不出這門語言的好處。性能?現代編譯器下的C語言早已和ASM相差無幾。

如 @張運政 所說,要精通這門語言,確實需要比精通其他語言付出更大的努力,因此精通這門語言的人或許確實厲害,但這並不代表厲害的人一定要精通這門語言——充分不必要。

我更同意 @吳海波 的答案,編程並不只是操作系統和底層——如果只是這樣那軟件行業這幾十年無數大師們的努力等於白費了,編程語言本身、軟件設計、人工智能、軟件工程、互聯網……等等這些都是讓編程變得豐富而有趣的元素。

是否懂底層不重要,在編程的路上堅持對美的追求,纔是通往高手之路。

大神就是大神,他們的認知水平真的高!值得我們學習!

所以,這世界上沒有什麼是必須的,不是說想成爲技術高手就非得去學彙編,非得花大力氣研究它精通它,你只有根據自己的實際情況,綜合權衡。

學還是不學呢?你會如何選擇?反正我學了下,並且不虧 ? ~


參考資料:

https://www.zhihu.com/question/23088538
https://www.zhihu.com/question/20277860/answer/23148163

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章