你執行的是哪個 JRE? 中有提到一段: JDK中多數工具程式,本身就是用Java寫的。

很有趣不是嗎?Java原始碼需要編譯器編譯為.class檔,而這邊卻跟你說Java編譯器是Java寫的?這不是雞生蛋還是蛋生雞的問題嗎?是先有Java編譯器,還是先用Java寫個編譯器?

答案是先有原生編譯器,一開始編譯器是可能使用C寫的,而後用Java程式碼寫個編譯器,用原生編譯器來編譯Java寫的編譯器,然後就有了Java版的編譯器。事實上,JDK多數的工具程式,都是使用Java語言所撰寫的。

但以Windows為例,你在JDK的bin目錄中,所看到的不是.exe的原生可執行檔嗎?其實那些都是假貨,或正確的來說,那些都是方便你不用輸入一長串指令,以作業系統原生執行檔包裹的包裹器(Wrapper)。真正的編譯器等工具程式,其實是位於JDK目錄底下lib目錄中的tools.jar。

舉個例子來說,如果你的PATH是指向JDK的bin目錄,當你鍵入javac指令時,一開始是由作業系統依PATH找到javac可執行檔,而後該可執行檔依所包裹的真正指令與引數,呼叫、載入、執行tools.jar中對應的.class檔案。

你可以將tools.jar更名為任意名稱,例如tools_back.jar,而再度執行javac指令時,會出現以下的錯誤訊息:

真正Java編譯器的程式進入點,其實是在com.sun.tools.javac.Main這個類別。執行javac時,其實javac可執行檔所包裹的指令,相當於:
java -cp "C:\Program Files\Java\jdk1.6.0_13\lib\tools.jar" com.sun.tools.javac.Main

你可以將方才更名的檔案復原為tools.jar,自行執行以下的指令,就會看到直接鍵入javac時的結果:

Java本身的目標之一是跨平台,其許多工具程式本身就實現了這個理念,也因為許多工具程式本身是Java所撰寫,因此JDK本身必須附帶Private JRE,如此即使在沒有另行安裝Public JRE的情況下,也可以執行JDK相關工具程式。

java-鸡生蛋?蛋生鸡?相关推荐

  1. 关于程序语言的蛋生鸡 鸡生蛋问题

    今天看到酷壳上提到了程序语言的自举策略: 但是,这是一个"鸡生蛋,还是蛋生鸡"的问题,如果你需要用X语言来写一个X语言编译器的语言,你可以这样干: 用Y语言来实现X的语言解释器或编 ...

  2. devc 无法编译循环语句_鸡生蛋还是蛋生鸡?详解第一个编译器是怎么来的~

    详解编译器自举原理 不知道你有没有想过,某种编程语言的第一个编译器是怎么来的呢?这不就是"鸡生蛋,蛋生鸡"的问题吗? 先说最后的结论:任何一种语言的第一个编译器肯定是使用其他语言写 ...

  3. 先有对象还是先有函数,鸡生蛋、蛋生鸡的问题。有关js里内置对象Function和Object的思考

    js里创建的函数本身作为一个实例对象都是由内置对象Function作为构造函数创造出来的,所谓var f = funciton(a){b}即等同于f = new Function(a,b). 同时js ...

  4. IT外企那点儿事(14): 好领导和好员工,坏领导和坏员工,鸡生蛋还是蛋生鸡?

    领导和员工,似乎天然成为互相博弈的矛盾体,他们只要单独坐在一起,比如面试,或者是One on One,都时而擦出火药味,在表面的和谐谈话气氛下,心里充满的对对方的不满和不屑,而在工作外,我们常常听到这 ...

  5. UML:类图复习-鸡生蛋,蛋生鸡

    这是前一阵<高级软件工程>课堂上,老师随堂出的一道讨论题,随手贴在这里: ps: 今天是520,正好聊一些OoXx,关于爱的扯淡话题:) 题目:"鸡生蛋,蛋孵鸡",世间 ...

  6. 面向对象(基础题目:鸡生蛋)

    package com.svse.seven1;public class Demo03 {public static void main(String[] args) {// 分析鸡下蛋的过程,设计相 ...

  7. 管蛋还是管鸡?管鸡还是管鸡生蛋的能力?

    管蛋还是管鸡?管鸡还是管鸡生蛋的能力? 这后面其实还有说法,就是如何管一群鸡下蛋?这是根本!企业无不如此! 最近和同事们在深入讨论这个问题,基本上在原则上已经达成了一致,就是管理重点或者说是管理的主线 ...

  8. 软件随想录(local.joelonsoftware.com/wiki)-2000年05月24日 策略书之二:鸡生蛋蛋生鸡问题 - Strategy Letter II: Chicken-and-Eg

    2000年05月24日 策略书之二:鸡生蛋蛋生鸡问题 - Strategy Letter II: Chicken-and-Egg Problems The Joel on Software Trans ...

  9. java应届生如何找工作?

    在找工作前,你需要了解下大多数应届生的java水平. 1 虽然学了一大堆数据结构,算法,网络和操作系统等方面的技能,但不知道怎么用在项目里,或者根本不知道这些技能大多数是用不到项目里的. 2 java ...

  10. java应届生实习期满,转正的感想

    java应届生实习期满,转正的感想 为什么不喜欢hibernate,个人觉得hibernate是那种重量型的数据访问框架,不太适合轻量级开发,与其说mybatis的配置文件繁琐,但是你集成通用mapp ...

最新文章

  1. 因果图法的介绍与示例分析【转载】
  2. thinkphp 5 stdClass Call to undefined
  3. Java基础之字符串String:
  4. Mybatis源码研究6:元数据(metadata)
  5. Table accessed during One order advanced search
  6. xcode工程命令行生成ipa安装包
  7. 手把手教你用.NET Core写爬虫
  8. 使用SuperMap对接天地图
  9. c#读取dwg零件表_C# 读取CAD文件缩略图(DWG文件)
  10. SteinerTree模板
  11. python基础运用_python基础----python的使用(三)
  12. Python语言为什么被称为高级程序设计语言?
  13. kc705进行DDR3扩容
  14. web16(ColorBox插件编写)
  15. 如何才能够主动学习,给你 2 点建议!
  16. 【前端大屏可视化项目适配方案】
  17. java摇号_java语言实现一个摇号系统,但是可以内部设定中奖名单这个怎么实现?...
  18. WEKA进行Apriori、FP-Tree、K-means算法测试
  19. mysql 提交事务_MySQL事务提交过程
  20. 实验室安全事故读后感

热门文章

  1. 鸿蒙推送在哪下载,鸿蒙2.0,你收到推送了么?告诉你实际体验!
  2. python爬取天气存入excel_Python接口读取json天气预报数据自动写入到Excel表格
  3. 重庆邮电学院计算机学院彭凯,感知重邮丨重庆邮电大学计算机学院稳固学科建设核心 提升人才培养质量...
  4. 关注融入到我们生活当中方方面面的人工智能
  5. magento2 简单使用
  6. 考研初试 宾馆预订 小秘诀
  7. border-collapse的使用,属性值collapse可以使边框合并,默认值sparate边框分开
  8. 第6代无线技术802.11ax详解
  9. 前端基础,html,css,浏览器基础知识
  10. 【perl】文件测试符