从语言设计的角度看,可以通过重新设计编译器来实现,但从工程实践的角度看是不可行的。
首先,Java语言最大的特点是跨平台的可移植性,一次开发,一次编译,多平台执行。这个特性是通过JVM(Java虚拟机)实现的。如果重写编译器直接编译成C语言这样的可执行程序,它将失去跨平台特性。
其次,Java语言在设计之初就被设计成严重依赖JRE(Java运行时环境)的语言。一些语言设计缺陷必须依靠JVM来解决,比如GC(垃圾收集)。我们知道Java语言没有内存恢复能力,所以我们不得不依赖JVM。在工程实践中,如果软件不能进行内存恢复,后果将是灾难性的。
第三,Java语言是面向对象的,不同于同样面向对象的C语言,Java还具有动态特性。
它允许程序动态加载运行过程中所需的类,这在面向对象编程中是C语言无法实现的。在C语言编程过程中,每次向类中添加实例变量或成员函数时,引用该类的所有子类都必须重新编译,否则会导致程序崩溃。Java从以下几个方面采取措施来解决这个问题。java编译器没有将对实例变量和成员函数的引用编译成数值引用,而是将符号引用信息保存在字节码中并传递给解释器,解释器在动态连接类后将符号引用信息转换成数值偏移量。这样,在内存中生成的对象不会在编译期间确定,而是延迟到运行时并由解释器确定。这样,更新类中的变量和方法不会影响现有代码。在解释和执行字节码时,只有在出现新名称时才执行一次符号信息的搜索和转换,然后才能全速执行代码。在运行时确定引用的好处是可以使用更新的类,而不用担心影响原始代码。如果程序连接到网络中另一个系统中的类,则该类的所有者可以自由更新该类,而不会使引用该类的任何程序崩溃。这完全取决于JRE。
以上几点决定了Java不能像C语言那样直接编译成机器代码。当然,还有其他一些因素,但我认为以上几点是最重要的。
预编译,也称为预处理,是在编译之前完成的。它主要处理宏替换、文件包含和条件编译。预编译的结果仍然是C程序,而不是机器语言。编译就是把C程序变成机器语言
如何导出mysql的库里所有表结构? www.2cto.com导出整个数据库结构(不包括数据)/usr/local/MySQL/bin/mysqldump-uroot-D entry>转储.sql导出单个数据表结构(无数据)mysqld
“的”,“地”,“得”三个字怎么使用呢?“Di de”的用法不同于“Di de”。美丽的花朵在微笑,绿草在弯腰,清澈的河流向东流动,蓝天白云在空中漂浮,暖风轻轻吹拂,绿叶摇头晃脑,小鱼在水中游动,红日在天空照耀,左边的大地,地球在右边,站在
matlab中频谱搬移用哪个函数?一般情况下,xa(a>0)表示向右移动单元,xa(a>0)表示向左移动单元二次函数f(x)=ax 2 BX C,新函数g(x)=f(x-k)=a(x-k)2 B(x-k)C=ax 2-2akx AK
电脑的Microsoft是什么意思?这是微软的英文名字。我们使用word2003、media player、ie甚至windows操作系统,这些都是本公司生产的windows是微软的windows操作系统软件产品。我们的大多数电脑都安装了w
天翼网关2.0是“光猫 智能路由器”的集合体,可是信号覆盖还是略弱,有办法解决吗?当你看到问题时,不要说是你。只要你安装的是电信宽带免费、光环光纤猫和无线路由的组合,不要告诉安装人员调整WiFi强度,更不要说隔墙,我的光纤猫就放在大厅里,而
微信小程序怎么添加?如何在移动桌面上添加微信小程序,只需点击应用程序界面右上角的“…”即可找到“发送到桌面”选项。添加后,我们可以通过桌面快捷方式进入applet,无需从微信启动。但是,有时小程序无法添加到桌面。发生什么事?在Android
如何定义input标签中type=可以用css3中新增的选择器“[attribute=value]”来同时选中指定的属性的标签。1、新建html文档,添加5个input标签,其中第一个和最后一个“type”属性的属性值为“text”:2、在
迅雷下载的视频怎么保存到本地?首先,打开手机上的本地文件管理,点击[system folder][Android]文件夹。第二步:点击【数据文件夹】【数据】找到迅雷的数据【迅雷】文件夹。第三:进入thunderbolt数据文件夹,点击文件进
spring property标签中的ref属性和ref标签有什么不同? 如下:spring的配置文件中可能有多个<propertyname=“a”ref=“B”/>,即在当前配置文件中查找bean,即在全局中查找beanref信号
汽车仪表故障灯亮,如何清除?1. 将车辆停放在安全的地方,关闭发动机并拔下蓄电池负极连接线。2. 等待15秒后安装,故障灯亮后消失。不同的汽车仪表板仪表不尽相同,但一般汽车的常规仪表有车速表、转速表、油压表、水温表、燃油表、充电表等。在现代