新司机上路,思考一个问题。如果Java直接编译成机器码,这样岂不解决了Java运行缓慢的问题,进而淘汰或者取代C语言。(这里,不是说就此取消Java的JVM解释型运行的机制,我的意思这两种方式并存。)衍生问题:C语言为什么不设计一个C语言虚拟机,这样扩展C语言的跨平台性。
自己思考的角度回答自己的问题,不够全面,希望大家补充,感谢各位大佬!
看到很多别人的回答,有一句话非常惊艳。
通常,没有“必须这么设计”的绝对理由,之所以会是这样,只是因为被设计成这样。
还有一句话,也讲的非常好。
语言本身与是否是解释型或者编译型无关。
从这两个观点,我自己获得了一些看法。理论上,不管是Java还是C,应该都存在解释型以及编译型,肯定会有人这么尝试过,但是因为最终Java与C的不同定位,导致最终这种形态并非主流,随之被淘汰。
好比,你告诉自行车,摩托车能开这么快,你为什么设计成摩托车。自行车拥有轻便的特性,摩托车拥有快速的特性,两者不可兼得。但是,有人为了得到两者的优点,出现了电动自行车,但是于此同时它拥有的两个特性又逊色于前两者。
衍生的思考,之所以Java不设计成直接编译成二进制机器码给发给主机,是因为保持Java的编译二进制字节码再边编译边执行拥有前者不具备的优势,例如,具备一码(字节码)通天下的跨平台性。还有一种提问,为什么一定要边编译边执行,不一次性全编译然后再执行。的确,有人这么做过,