(C是基于栈的无法在没有配置栈环境的操作系统Boot阶段运行)不支持操作寄存器只能通过内联汇编的方式进行
https://m.toutiao.com/is/idYJhU7D/
评论6:
知道寄存器的地址,然后指针指向该地址,修改指针的内容即修改寄存器的内容。
C 是一门非常非常垃圾的语言。
C 号称最接近底层的高级语言,很多时候都是在和计算机底层打交道。
但是 C 原生并不支持操作寄存器,只能通过内联汇编的方式进行。
而且 C 虽然是发明出来用于开发操作系统的,但是 C 是基于栈的,这意味着 C 程序无法在没有栈配置的环境运行,而操作系统的 Boot 阶段恰恰是没有栈的。
还有,C 语言的原生数据类型除了 char 是一个字节以外其他的都是不统一大小的。
这些缺陷造成的问题就是 C 是最适合嵌入式和操作系统开发的语言,但是却在这几个个方面却并不方便于嵌入式和操作系统开发。
所以不考虑代码效果,即无论是运行出错还是怎样,仅仅是功能上, C 语言的缺陷也是相当大的。
为了解决这些问题,C23 标准通过了多项提议(事实上早该通过了,为了兼容早期代码才拖延到现在),包括但不限于 asm 成为关键字、_BitInt 关键字、支持二进制字面量分段、#embed 宏等,目的就是方便嵌入式和操作系统的开发(终于意识到 C 自己的风口在哪里了)。
另一方面,C 的语言前端设计得也不够强大。
C 语言类型系统不够完备,不支持有关类型的判断,这使得很多设计模式不能在 C 中方便地应用。
而且 C 语言的预处理功能设计得很弱,只能做一些文本替换和基本的宏判断。而且标准委员会在预处理这块比较保守,除了 C23终于添加了 C++ 的很多预处理命令外,基本没什么额外设计(#embed 算是个例外)。
所以,就有人开发了一门叫做 zig 的语言用以代替 C 语言。zig 提出了一种称之为 comptime 的概念。被标识为 comptime 的程序会在编译期执行,并把运行结果放到调用的位置。comptime 极大地扩展了语言的预处理功能,算得上是非常精妙的设计了。
所以,C 不是没人喷,只是别人喷的时候你没看到罢了。
别人都是一封封邮件发往标准委员会,或者直接设计一门新的语言,而不是跑到某些地方发牢骚(虽然这的确有助于发泄情绪)。
不过这些喷 C 语言的人都是非常厉害的人物,干的都是改变码农界的大事,而普通人能做到精通 C 就已经很厉害了,至于喷就别想了,根本喷不到点子上。
评论:C语言就是一个从汇编到高级语言的跨越,是一个划时代的成果。但经过40多年的应用,加上后向兼容的需求,使其设计暴露出很多现代高级语言所缺乏的新能力,C++和Go lang就是最好的继承者!
评论2:
他可能是指Linux或Windows下的C语言。其实能不能操作寄存器,不在语言本身,而在于编译器。单片机的C编译器都是直接操作寄存器的。之所以在操作系统下不允许直接操作寄存器,应该是为安全考量。
C语言是不可替代的,因为Linux内核发展到今天,已经庞大到无法用其它语言来改写。
真的不能,除非内嵌进去asm语句。
评论4
C本来就是为了摆脱操作寄存器这些底层操作而抽象到内存地址这一层面的。要精确到寄存器级别只有汇编。而且桌面端本来就不是C的强项。你不能用一个全能的心态去要求一个专科。只是C是一个最接近全能的开发语言而已。
评论5:
用了20年C,最不爽的是C没有this指针,其他没有感觉明显缺陷。
所谓Boot没有栈,这都不是问题,绝大部分CPU的启动代码,都与硬件相关,初始需要少部分机器码或者汇编码是难免的。
类型判断确实是个硬伤,所以设计模式不是C的强项,可是使用C的通常并不需要太多语言技巧,语言的简练有时不是看写的代码量,而是看编译后的代码量。
评论6
学好了c的精髓再来写文章。
CPU内部寄存器,除了asm,那个高级语言能直接操作?
外部寄存器,无论什么soc, 单片机也好,安卓也好。都是以存储器地址映射来操作的。
计算机语言没有高低之分,只有需求区分。好的程序员并不是那种语言掌握的好,而是实现功能逻辑好与坏。
评论6:
知道寄存器的地址,然后指针指向该地址,修改指针的内容即修改寄存器的内容。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。