-
1 # 竹韻程式設計
-
2 # 程式設計師貓哥
非常感謝在這裡能為你解答這個問題,讓我帶領你們一起走進這個問題,現在讓我們一起探討一下。
一般的軟體程式設計,不論程式設計的語言為何,都屬於高階語言開發,不涉及或只有一點涉及硬體和底層。這樣,高階語言的開發者對於底層硬體就有了一種神祕感和陌生感,在我的理解中,硬體程式設計和軟體程式設計有著本質的不同,唯一相同的是語言的關鍵詞都是英語或英語簡寫。
一般軟體程式設計是基於作業系統之上的應用層開發,只關心功能和效能等等。而硬體程式設計則傾向於使用具體的硬體提供的介面,埠和硬體基礎底層功能。軟體編寫的程式最終轉化為機器語言,並在硬體上執行。硬體編寫的程式最終轉化為電路,以實體的形式被製造出來。也就是說,軟體設計的是0/1的二進位制碼,硬體設計的是實際的電路。
組合語言是比高階語言更加底層的語言,直接和硬體打交道。比如,各種硬體裝置的驅動程式就可以全部用匯編語言來寫。各位不知在學校學過“微機原理和介面技術”這門課沒有,如果沒有,那就與硬體失之交臂了,如果學過,那麼,底層開發操作起來就會相對得心應手一點。介面技術描繪的大部分都是硬體的介面和程式設計方法,按照最近的介面技術的教材和書籍來看,書中介紹的知識還只是8086處理器時代,稍微提一下80X86和Pentium。但是這是一個很好基礎,了解了所有關於8086的知識,就能很好的理解微型計算機的起源和發展脈絡。
在以上的分享關於這個問題的解答都是個人的意見與建議,我希望我分享的這個問題的解答能夠幫助到大家。
-
3 # 科技i關注
硬體程式設計,主要的是面向硬體底層的程式設計,使用的大多數是C/C++,或者是組合語言。比如開發驅動程式,或者是嵌入式。硬體程式設計就是直接操作硬體的過程,非常的底層,也非常的深奧,一般人要弄懂這個是比較困難的。
軟體程式設計,則更多的是軟體應用層面的程式設計。基於硬體驅動的程式設計,再形象點就是硬體程式設計已經把操作硬體的介面都做好了,也寫好了相應的文件,而軟體程式設計就是怎麼呼叫這些介面的一個過程。軟體程式設計的語言就豐富很多了,不僅僅侷限於C/C++
-
4 # 可樂土豆
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的結合體,在硬體程式設計中,大多都類似與組合語言,也就是直接和計算機打交道的語言,在計算機硬體中還有一個叫邏輯器的組建,一般計算機的0和1也是在邏輯器中工作的,代表斷路和通路。
第二:軟體是程式設計是高階需要程式設計了,從本質上講也是對硬體的程式設計,一般當我們通過高階編譯工具將程式碼寫完後工具會自動轉換為機器識別碼,這些機器所能識別的也就是存放在暫存器中的一大堆的00001111100等程式碼,然後計算機開始進行編碼,譯碼等操作後將其送到邏輯器,然後由邏輯器進行各種訊號通知和控制,從而達到程式碼控制計算機的過程,當然整個過程中涉及到的計算非常複雜,包括將程式碼轉換為位元組碼的過程設計到很多運算,學過彙編需要的也就大概清楚什麼是機器需要了。
結語:總體來說軟體程式設計的技術難度是小於硬體程式設計的,因為軟體程式設計基本都是通過各種工具簡化了計算機底層編譯邏輯,中間發生的複雜轉換一般在編寫程式碼是是感覺不到的,所以對於這方面知識點有很多,這裡只是大概的總結!