(C是基于棧的無法在沒有配置棧環(huán)境的操作系統(tǒng)Boot階段運行)不支持操作寄存器只能通過內(nèi)聯(lián)匯編的方式進行 https://m.toutiao.com/is/idYJhU7D/ 評論6: 知道寄存器的地址,然后指針指向該地址,,修改指針的內(nèi)容即修改寄存器的內(nèi)容,。 C 是一門非常非常垃圾的語言。C 號稱最接近底層的高級語言,,很多時候都是在和計算機底層打交道,。 但是 C 原生并不支持操作寄存器,只能通過內(nèi)聯(lián)匯編的方式進行,。 而且 C 雖然是發(fā)明出來用于開發(fā)操作系統(tǒng)的,但是 C 是基于棧的,,這意味著 C 程序無法在沒有棧配置的環(huán)境運行,,而操作系統(tǒng)的 Boot 階段恰恰是沒有棧的,。 還有,C 語言的原生數(shù)據(jù)類型除了 char 是一個字節(jié)以外其他的都是不統(tǒng)一大小的,。 這些缺陷造成的問題就是 C 是最適合嵌入式和操作系統(tǒng)開發(fā)的語言,,但是卻在這幾個個方面卻并不方便于嵌入式和操作系統(tǒng)開發(fā)。 所以不考慮代碼效果,,即無論是運行出錯還是怎樣,僅僅是功能上,, C 語言的缺陷也是相當大的,。 為了解決這些問題,C23 標準通過了多項提議(事實上早該通過了,,為了兼容早期代碼才拖延到現(xiàn)在),,包括但不限于 asm 成為關鍵字、_BitInt 關鍵字,、支持二進制字面量分段,、#embed 宏等,目的就是方便嵌入式和操作系統(tǒng)的開發(fā)(終于意識到 C 自己的風口在哪里了),。 另一方面,,C 的語言前端設計得也不夠強大。 C 語言類型系統(tǒng)不夠完備,,不支持有關類型的判斷,,這使得很多設計模式不能在 C 中方便地應用。 而且 C 語言的預處理功能設計得很弱,,只能做一些文本替換和基本的宏判斷,。而且標準委員會在預處理這塊比較保守,除了 C23終于添加了 C++ 的很多預處理命令外,,基本沒什么額外設計(#embed 算是個例外),。 所以,就有人開發(fā)了一門叫做 zig 的語言用以代替 C 語言,。zig 提出了一種稱之為 comptime 的概念,。被標識為 comptime 的程序會在編譯期執(zhí)行,并把運行結果放到調(diào)用的位置,。comptime 極大地擴展了語言的預處理功能,,算得上是非常精妙的設計了。 所以,,C 不是沒人噴,,只是別人噴的時候你沒看到罷了。 別人都是一封封郵件發(fā)往標準委員會,或者直接設計一門新的語言,,而不是跑到某些地方發(fā)牢騷(雖然這的確有助于發(fā)泄情緒),。 不過這些噴 C 語言的人都是非常厲害的人物,干的都是改變碼農(nóng)界的大事,,而普通人能做到精通 C 就已經(jīng)很厲害了,,至于噴就別想了,根本噴不到點子上,。 評論:C語言就是一個從匯編到高級語言的跨越,,是一個劃時代的成果。但經(jīng)過40多年的應用,,加上后向兼容的需求,,使其設計暴露出很多現(xiàn)代高級語言所缺乏的新能力,C++和Go lang就是最好的繼承者,! 評論2: 他可能是指Linux或Windows下的C語言,。其實能不能操作寄存器,不在語言本身,,而在于編譯器,。單片機的C編譯器都是直接操作寄存器的。之所以在操作系統(tǒng)下不允許直接操作寄存器,,應該是為安全考量,。 C語言是不可替代的,因為Linux內(nèi)核發(fā)展到今天,,已經(jīng)龐大到無法用其它語言來改寫,。 真的不能,除非內(nèi)嵌進去asm語句,。 評論4 C本來就是為了擺脫操作寄存器這些底層操作而抽象到內(nèi)存地址這一層面的,。要精確到寄存器級別只有匯編。而且桌面端本來就不是C的強項,。你不能用一個全能的心態(tài)去要求一個??啤V皇荂是一個最接近全能的開發(fā)語言而已,。 評論5: 用了20年C,,最不爽的是C沒有this指針,其他沒有感覺明顯缺陷,。 所謂Boot沒有棧,,這都不是問題,絕大部分CPU的啟動代碼,,都與硬件相關,,初始需要少部分機器碼或者匯編碼是難免的,。 類型判斷確實是個硬傷,所以設計模式不是C的強項,,可是使用C的通常并不需要太多語言技巧,,語言的簡練有時不是看寫的代碼量,而是看編譯后的代碼量,。 評論6 學好了c的精髓再來寫文章。 CPU內(nèi)部寄存器,,除了asm,,那個高級語言能直接操作? 外部寄存器,無論什么soc, 單片機也好,,安卓也好,。都是以存儲器地址映射來操作的。 計算機語言沒有高低之分,,只有需求區(qū)分,。好的程序員并不是那種語言掌握的好,而是實現(xiàn)功能邏輯好與壞,。 評論6: 知道寄存器的地址,,然后指針指向該地址,修改指針的內(nèi)容即修改寄存器的內(nèi)容,。 |
|