軟件編程與硬件編程的區別?

東西先生的話


1、可用的資源不同

  在電腦/服務器上運行的程序,架構設計對系統性能的影響,往往大於細節優化,因此,軟件工程師更在乎設計高效、易於維護的架構。在使用系統資源上,通常以GB來討論數據庫/硬盤的存儲空間,以至少10MB或100MB為單位來討論程序的內存使用。腳本語言的使用,有助於讓程序框架更清晰、更容易維護。

  對於硬件工程師,這簡直就是天方夜譚。為了節約硬件成本,工程師總是努力在儘量小的硬件上實現功能。

  例如通常的家用路由器,可能總共只有16MB的“硬盤”,16MB的內存。因此,腳本語言不再適用,一般都是純C實現。內存的使用只能以10kB單位計算,代碼空間以100kB單位計算。對於在單片機上編程的工程師,條件更加苛刻。代碼空間通常是10kB單位計算的,而內存使用需要精確到kB,甚至精確到字節。這讓硬件工程師經常需要進行非常細節和底層的優化。

  如何在如此微小的系統上實現功能,是硬件工程師的挑戰,所謂“戴著鐐銬跳舞”。然而,這也成為一些硬件工程師職業發展的瓶頸:因為系統小,通常是一個人完成,對於代碼的質量和維護性的要求放鬆了,個人編程能力不容易進步。

  2、對於穩定性的認識不同

  軟件工程師對於“穩定性”的理解,在於容錯,即如何快速從系統失效中恢復過來,通過技術讓系統整體的downtime降低直到0。同時,通過高效的框架,使得系統即使在高速的開發和演進過程中,也能保持可用性不損失。

  硬件工程師對於“穩定性”的理解,是絕對的穩定性。不是從失效中恢復,而是根本不允許失效。因為任何“失效”,都會嚴重影響設備的可用性,甚至出事故。想象一下,你正在刷微信時閃退了,無非重新打開就行;如果你的微波爐“死機”了,不停加熱,那是什麼體驗?

  軟件工程師一般覺得連續工作幾天一個月的程序,已經非常穩定了;硬件工程師的目標通常是幾年不死機,甚至只要硬件芯片不掛掉,程序就不能掛。

  3、迭代速度不同

  軟件中的敏捷開發思想,通常要求以周為單位迭代新版本。bug可以按照重要程序排次序,做到後面若干版本的開發計劃中去;而新引入的feature也可能有bug,但先投放市場看用戶反饋,比解決bug更加重要。

  在硬件中,敏捷開發是行不通的。任何bug,都必須全部消滅掉,產品才能投入市場。對於傳統的硬件產品,其固件無法更新,已經生產出來的產品,就再也沒有機會修bug了。

  最近,“互聯網硬件”也逐漸引入可更新的固件。但這並沒有降低對可靠性的要求,因為更新新固件,必須保證原固件還在穩定運行。比如,我們目前支持在用戶完全不知情情況下更新固件,因為測試要求很苛刻,更新的頻率最快也是一個月一次。

  4、目標不同

  軟件工程師:寫可維護、可擴展的代碼

  硬件工程師:用最少資源穩定的實現功能

  5、(1)通用應用軟件:

  主要關心邏輯和抽象,關心代碼量大了之後複雜度可控。

  硬件資源較多,硬件性能差別較大,不需要針對特定資源設計。

  邏輯分層較多,來源於抽象的性能損耗可以接受。甚至於現在很多主流語言構建在虛擬機和解釋器上。

  非實時。

  不需要了解底層硬件原理。

  (2)嵌入式軟件:

  時序可控。大部分場景要求實時,因為要滿足硬件時序。非搶佔的任務調度和中斷隊列都會引入定時的偏差。

  資源開銷可控。因為嵌入式硬件環境大多隻有有限的 RAM 和 Flash 資源。

  針對特定硬件環境設計。

  所有代碼上的抽象和優化都必須是零損耗或者損耗可控(可以參考 rust 語言)。比較典型的是 GC 會引入嚴重的時序和資源不可控,所以系統語言很少使用。

  (3)數字電路設計:

  數字電路設計不是編程,不是編程,不是編程。是腦海中先有電路,再用語言描述出來。

  時序要求更嚴,需要考慮建立時間和保持時間,及隨之而來的亞穩態。

  Coding style 會明顯的影響電路性能。邏輯都一樣,但是 DFF 的位置不一樣,就可能導致時序不滿足。

  並行化。執行順序不再是 CPU 的順序執行,而是多個並行的流水線。比如快速傅立葉 FFT。比如路由器的 CAM,單次動作完成整表查表。


可樂土豆


非常感謝在這裡能為你解答這個問題,讓我帶領你們一起走進這個問題,現在讓我們一起探討一下。

一般的軟件編程,不論編程的語言為何,都屬於高級語言開發,不涉及或只有一點涉及硬件和底層。這樣,高級語言的開發者對於底層硬件就有了一種神秘感和陌生感,在我的理解中,硬件編程和軟件編程有著本質的不同,唯一相同的是語言的關鍵詞都是英語或英語簡寫。

一般軟件編程是基於操作系統之上的應用層開發,只關心功能和性能等等。而硬件編程則傾向於使用具體的硬件提供的接口,端口和硬件基礎底層功能。軟件編寫的程序最終轉化為機器語言,並在硬件上執行。硬件編寫的程序最終轉化為電路,以實體的形式被製造出來。也就是說,軟件設計的是0/1的二進制碼,硬件設計的是實際的電路。

彙編語言是比高級語言更加底層的語言,直接和硬件打交道。比如,各種硬件設備的驅動程序就可以全部用匯編語言來寫。各位不知在學校學過“微機原理和接口技術”這門課沒有,如果沒有,那就與硬件失之交臂了,如果學過,那麼,底層開發操作起來就會相對得心應手一點。接口技術描繪的大部分都是硬件的接口和編程方法,按照最近的接口技術的教材和書籍來看,書中介紹的知識還只是8086處理器時代,稍微提一下80X86和Pentium。但是這是一個很好基礎,瞭解了所有關於8086的知識,就能很好的理解微型計算機的起源和發展脈絡。

在以上的分享關於這個問題的解答都是個人的意見與建議,我希望我分享的這個問題的解答能夠幫助到大家。

在這裡同時也希望大家能夠喜歡我的分享,大家如果有更好的關於這個問題的解答,還望分享評論出來共同討論這話題。

我最後在這裡,祝大家每天開開心心工作快快樂樂生活,健康生活每一天,家和萬事興,年年發大財,生意興隆,謝謝!



程序員貓哥


針對這個問題我發表下自己的見解,首先本質的區別就是需要的深度和高度,也就是軟件基本都在頂層,而硬件在底層。

第一:硬件編程是發生在計算機內部的,一個硬件工程師要會電路設計,和硬件編碼。計算機本身就是0和1的結合體,在硬件編程中,大多都類似與彙編語言,也就是直接和計算機打交道的語言,在計算機硬件中還有一個叫邏輯器的組建,一般計算機的0和1也是在邏輯器中工作的,代表斷路和通路。

第二:軟件是編程是高級需要編程了,從本質上講也是對硬件的編程,一般當我們通過高級編譯工具將代碼寫完後工具會自動轉換為機器識別碼,這些機器所能識別的也就是存放在寄存器中的一大堆的00001111100等代碼,然後計算機開始進行編碼,譯碼等操作後將其送到邏輯器,然後由邏輯器進行各種信號通知和控制,從而達到代碼控制計算機的過程,當然整個過程中涉及到的計算非常複雜,包括將代碼轉換為字節碼的過程設計到很多運算,學過彙編需要的也就大概清楚什麼是機器需要了。

結語:總體來說軟件編程的技術難度是小於硬件編程的,因為軟件編程基本都是通過各種工具簡化了計算機底層編譯邏輯,中間發生的複雜轉換一般在編寫代碼是是感覺不到的,所以對於這方面知識點有很多,這裡只是大概的總結!


竹韻編程


硬件編程,主要的是面向硬件底層的編程,使用的大多數是C/C++,或者是彙編語言。比如開發驅動程序,或者是嵌入式。硬件編程就是直接操作硬件的過程,非常的底層,也非常的深奧,一般人要弄懂這個是比較困難的。


軟件編程,則更多的是軟件應用層面的編程。基於硬件驅動的編程,再形象點就是硬件編程已經把操作硬件的接口都做好了,也寫好了相應的文檔,而軟件編程就是怎麼調用這些接口的一個過程。軟件編程的語言就豐富很多了,不僅僅侷限於C/C++


科技i關注


軟件需要依託硬件去實現邏輯控制,純硬件是不需要編程的,畫板搭電路就好了


分享到:


相關文章: