百科问答小站 logo
百科问答小站 font logo



为什么汇编语言的功能在高级语言中一部分成为了关键字,一部分封装成了函数? 第1页

  

user avatar   s.invalid 网友的相关建议: 
      

这个问题下的回答啊……


简单说:设计高级语言的人才不理你汇编呢。

他关注的是他自己的抽象,至于硬件是X86/X86_64还是ARM/RISC,关我屁事。


就好像设计CPU的只管我的CPU图灵完备、同时执行目标任务(标量、浮点)时性能达标——你管我把这玩意儿设计成复杂指令集、精简指令集还是超标量或者超长指令字呢。


这就叫“一层有一层的抽象”——只要我的抽象能用、好用,随便你上层下层怎么折腾。


举例来说,C语言的抽象是什么?

抽象的是:一颗支持顺序、分支(if/else/switch)、循环(for、while)的cpu,和一片平坦连续的内存,所组成的图灵机。


类似的,Java抽象的是什么?

一颗提供类似C的支持、但禁止裸内存访问的图灵机。

这个图灵机除了C所支持(但不包括内存访问)的东西外,还提供了面向对象(class)以及内存自动回收等支持。


再比如,Haskell抽象的是什么?

抽象的是一台支持lambda演算的机器——注意,虽然已经证明了lambda演算和图灵机等价,但它却不是图灵机哦。


这就是它们的核心抽象。


总之,一切高级语言,它都是类似“读写头+纸带”的、最简图灵机抽象的类似物。它压根不需要考虑某种特殊的CPU搞出了什么支持、更不关心能不能充分利用它——只要核心抽象有了,剩下都是编译器的工作。


比如说,现代CPU都有SSE/AVX指令支持,这些SIMD指令怎么办?

答案是凉拌。没有哪种语言从一开始的抽象就加入这些玩意儿。


但这东西真的能提速啊?

简单。

谁想用这种加速,自己想办法——或者内嵌汇编,或者寻找别人搞出来的现成的库。比如openMP。

甚至于,现代语言很容易扩充语法。这段程序能并行?加一行@开头的指示就行了。


总之,除非真的通盘考虑过,否则不要瞎支持什么底层细节,更不要直接在高级语言抽象里把具体的CPU扯进来。


举例来说,你可以支持“并行编程”,但却绝不能支持SSE/MMX。因为这些玩意儿其它CPU上面可能没有、或者虽然有但却是另外一套不兼容的体系。

因此,你要把这些东西笼而统之的叫做“并行编程”,然后自顾自的设计自己的并行编程语法——把你的这套语法翻译成具体的指令是编译器的事,语言设计层面不要管它。


类似的,回到问题:


这些东西,没有任何编程语言会直接支持。它们只会以官方库或者第三方库的形式支持。


这是因为,无论在图灵机抽象、x86抽象、arm抽象或者别的什么抽象里,它们都不是计算机的一部分。


那它们是什么?

它们是外设。

什么是外设?

外设是通过总线、串口、usb、网口、dvi、hdmi、dp等等通讯接口、和运行程序的那颗主CPU通讯的、受主CPU控制的下位机。


没错。下位机。另一台计算机。


鼠标里面有一颗386甚至486级别以上的CPU;键盘里面也有一颗比当年的红白机更强大的CPU;蓝牙芯片,对,就你蓝牙耳机里面那个大米粒大小的芯片,那也是一颗主频66MHZ以上的强大CPU。

硬盘主控芯片是一颗CPU,DMA控制器也是一颗CPU;声卡里面有CPU,网卡里面也有CPU——显卡?显卡更不用说了……


所以,无论你要外设做什么、或者想从外设取得什么,你都要和这些CPU通讯。

当然,其中键盘、鼠标、显示器几乎每台机器都有,所以和它的通讯是标准化的。比如文本模式下,你从标准输入(stdin)读取、或者写入标准输出(stdout)即可——但根本上,x86平台上,你是通过out/in指令,通过外设专用总线直接对它下发了指令字。


事实上,很多外设都有自己的标准化的控制协议。比如打印机可以通过并口、USB口或者蓝牙通讯,和它接上头后,你可以用一套AT指令控制它的一举一动。

同样的,由于打印机用的太多太方便了,所以很多程序库内置了打印机支持——把你想打印的图片/文本丢给它就行了,你不需要懂AT指令。


换句话说,抽象这些外设的任务就交给了各种各样的库——这种东西当然不应该放到语言抽象里,对吧。


总之,一旦理解了这些东西、又明白了外设控制/通讯常用的手法(比如轮询和中断有什么区别、DMA是什么等等)以及外设的工作原理(以及大致的控制手法/思路),那么再看相应的库,自然掌上观纹一样清晰了。




  

相关话题

  如何评价C# 6的新特性? 
  Windows 7用的时间久了变慢怎么办? 
  汉语编程是不是动了谁的奶酪,为什么招黑? 
  如何看待 Deepin 操作系统创始人王勇离职? 
  俄罗斯为什么不怕美国在操作系统、芯片等领域的「制裁」? 
  64位操作系统,进行64位数运算,比32位操作系统快吗? 
  想做一个网站,如何跳过学代码编程,就直接把网站建? 
  为什么手机上wifi都用sdio接口,不用usb接口? 
  OSDI 2018有哪些让人眼前一亮的文章? 
  golang 为什么没有三元运算符? 

前一个讨论
再过数百万年,假设人类还存在的话,目前不同种族的人类会不会进化成不同生物?
下一个讨论
中国有哪些比较出名的C#大佬。?





© 2024-05-31 - tinynew.org. All Rights Reserved.
© 2024-05-31 - tinynew.org. 保留所有权利