java为什么不能直接控制硬件?问题有点深,高手进。
是否能够直接访问硬件接口,关键是语言对应的实现和体系结构,而不是语言本身。
现在硬件提供的高级语言接口以及宿主操作系统(若有的话)基本都是基于C/C++的,而Java的实现一般需要背着一个庞大的运行时环境。如果能用Java实现操作系统或者相关接口,再让硬件厂商支持,那么至少理论上是可能的。当然,现实是不合算。
归结到语言的原因主要有两点:
1.抽象、实现的复杂性和性能问题。Java在这方面的抽象能力实在太弱了点——比如没有指针算术,没有内建显式内存分配和释放,没有能力直接映射确定地址空间的内存,不能直接支持处理机的调用约定等,会导致使用起来的不便。运行时的实现原理和复杂性制约性能的发挥。而C++其实也需要一些运行时来支持异常和RTTI,虽然禁用这些特性,把C++当C用,可以不太受影响。
2.习惯和旧的项目。因为传统,硬件厂商的接口主要是C/汇编,再次才是C++。(这也能说明为什么即便C++能当作C来用,C在这个领域明显更主流。)
ISO C/C++允许没有操作系统支持的独立实现(freestanding implementation)。在这类环境中,硬件提供的接口可以包装为设备的控制寄存器、I/O寄存器等专用存储的状态,映射至volatile限定类型的对象中,使用volatile指针访问(诸如(volatile unsigned int*)0x12345678)。通过读写这些对象,被操作的设备就可以和主存或特定设备内存硬件共享存储的内容或发送/接受控制信息。之后这些保持的这些状态由设备中的控制芯片等按需进行一系列处理(如编解码、计算电机转速之类),最终转换为特定的电平信号,用于控制各种设备中各个部件的行为:接通或关闭电源、接受传感器信号、打开无线电、驱动伺服电路等。
在有操作系统支持的宿主实现(hosted implementation)中,操作系统一般会提供硬件抽象层(HAL)来对上述接口进行若干公共的抽象和封装,并在此基础上提供自身的API供厂商编写驱动程序。这样的好处很明显,能复用某些设备控制程序的底层实现(例如做成动态库)以便于分发和维护,并能一定程度上保证驱动程序之间以及和操作系统其它部分相互隔离(这样驱动程序bug时系统宕机危险比独立实现的可能小一点,当然因为往往特权等级过高还是比一般程序危险)。具体的接口视具体的系统而定,如POSIX系统的ioctl系统调用、Windows DDK提供的NT内核驱动和WDM驱动API等。
一般来说,上面硬件部分、某些最底层的接口和专用的驱动程序是硬件厂商自己做的,HAL、驱动开发框架和某些通用的设备驱动程序是操作系统厂商提供的,这些基本上用的都是C/C++。剩下的逻辑则全部是上层的应用开发者实现的,只要能调用到底层提供的API,不限于C/C++,Java或者C#什么的都没问题。
实际上就是应用程序来控制硬件的, 驱动程序你可以理解为软件与硬件的沟通工具或者说是桥梁,翻译.
驱动程序把软件语言转换成硬件可识别的指令,硬件由收到的指令来做出相应的响应.
java是不能直接控制硬件,java帮助开发者隐藏了硬件,软件的不同导致的兼容性问题,这也导致了开发者无法直接操作硬件。意思就是java寄生在操作系统上,做了一个虚拟机,所有装了java runtime的jvm都是一样的。这个jvm提供的API都是一样,硬件的不同不能在代码上产生改变,所以就是不能直接访问硬件咯。
JVM 运行在操作系统之上,操作系统有直接控制系统的原语,所以 JVM 可以通过系统调用来控制硬件。其他编译型语言直接编译为对应平台的机器码,所以可以说是“直接”控制硬件,但是 Java 没有这种“直接”的效果,不过作为一个图灵完备的语言,它理论上可以做任何事。
JVM是Java虚拟机的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。编译虚拟机的指令集与编译微处理器的指令集非常类似。
汇编大多是指汇编语言,汇编程序。把汇编语言翻译成机器语言的过程称为汇编。在汇编语言中,用助记符代替操作码,用地址符号或标号代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理的系统软件
对比一下你应该能 知道了吧
我是来回答源码的。如图所示,在你安装的java的路径下(jdk/下)有bin,有jre等目录,还有一个src.zip压缩文件,它就是java的源代码了。如果你英文不错,就会发现,API就是翻译的源代码中的注释!
LJD2499649768回答的很好,你的追问台天真了。JVM是C写的,C是汇编写的。汇编可以使用硬件,c通过汇编间接的可以。同理JAVA 跑在JVM上,JVM是有能力控制和使用硬件的,那面理论上JAVA也是可以控制的硬件的。但是为什么不能呢?因为Java语言和JVM是人家开发的,人家没有给你实现控制硬件的功能!因为Java语言和JVM是人家开发的,人家没有给你实现控制硬件的功能!因为Java语言和JVM是人家开发的,人家没有给你实现控制硬件的功能!(我说了三遍) 你用Java是基于人家开发的东西来做东西,人家没给你这个功能,所以你再怎么折腾也不可能通过 JAVA-JVM-硬件这条线来控制硬件,这条路人家给你封死了! 可以通过Java 调用C 来间接的实现~
再多余说一点,为什么JAVA不给硬件权限? 因为JAVA是面对软件开发的语言,人家吧内存分配垃圾回收什么的统统给你写好了,这样让程序员只关注实现自己的业务需求就行,而不需再关注硬件方面的问题。突出了Java的优点:简便、兼容。 大大的简化了开发过程~ 这是Java的核心,人家没有必要开放硬件控制。。。
再补充一下,Java提供了JNI,可以去看一看,能在同一进程中调用其他语言(主要是C和C++),但是会失去一些Java的优点,如用来jni的程序不再通用,换平台后要重新编译。
相关视频
java为什么不能直接控制硬件?问题有点深,高手进。
java是不能直接控制硬件,java帮助开发者隐藏了硬件,软件的不同导致的兼容性问题,这也导致了开发者无法直接操作硬件。意思就是java寄生在操作系统上,做了一个虚拟机,所有装了java runtime的jvm都是一样的。这个jvm提供的API都是一样,硬件的不同不能在代码上产生改变,所以就是不能直接访问硬件咯。
控制面板JAVA能直接运行下载的JAVA程序吗?
控制面板不能直接运行下载的JAVA程序。具体原因如下:功能定位:控制面板是操作系统提供的一个图形界面工具,用于管理系统的各种设置和控制项。它并不具备直接运行Java程序的功能。运行方式:要运行Java程序,通常需要在命令行中键入java命令,并指定Java程序的类名或jar包名。此外,还可以使用集成开发环境如Ec...
java在数据操作的时候怎么控制别的类
无法控制。Java是一种计算机编程语言,java在数据操作的时候是无法控制别的类,java拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
什么语言能直接控制硬件? C\/C++吗?本人做java的。如果要做一个让计算机...
归结到语言的原因主要有两点:1.抽象、实现的复杂性和性能问题。Java在这方面的抽象能力实在太弱了点——比如没有指针算术,没有内建显式内存分配和释放,没有能力直接映射确定地址空间的内存,不能直接支持处理机的调用约定等,会导致使用起来的不便。运行时的实现原理和复杂性制约性能的发挥。而C++其实...
java安装后用不了怎么办
环境变量未配置 原因:Java安装完成后,系统需通过环境变量定位Java运行时环境(JRE)。若未配置,系统无法识别Java命令。解决方法:打开系统环境变量设置(Windows:控制面板→系统→高级系统设置→环境变量;macOS\/Linux:修改~\/.bashrc或~\/.zshrc文件)。在系统变量中找到PATH,追加Java的二进制目录路径(如...