V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
beryl
V2EX  ›  程序员

关于代码编译到最后运行过程

  •  
  •   beryl · 2020-12-17 20:31:19 +08:00 · 1887 次点击
    这是一个创建于 1219 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码编译成了可执行文件,例如.jar, 或者.exe

    那最终是如何运行的呀

    java -jar xxx.jar 是如何启动的进程呢,怎么接收的客户端输入呢,网络请求是怎么进来被处理的?

    这个具体是哪方面知识呀

    16 条回复    2020-12-18 13:04:52 +08:00
    pipasese
        1
    pipasese  
       2020-12-17 20:33:45 +08:00
    计算机组成原理,Java 虚拟机原理
    cmostuor
        2
    cmostuor  
       2020-12-17 21:33:50 +08:00
    说的再多不如自己动手调源码 和 看源代码
    taogen
        3
    taogen  
       2020-12-17 21:43:59 +08:00 via Android
    java -jar xxx.jar:jar 包中指定了 main 函数入口。

    怎么接收网络请求:起了一个进程,监听了指定的端口的网络请求。

    主要知识:操作系统,计算机网络,Java 。
    beryl
        4
    beryl  
    OP
       2020-12-17 22:02:12 +08:00
    @cmostuor 这个只看 java 源码还不够
    VDimos
        5
    VDimos  
       2020-12-17 22:03:45 +08:00 via Android
    程序员的自我修养
    tinyfool
        6
    tinyfool  
       2020-12-17 22:05:52 +08:00
    你这个问题说起来就复杂了,首先 exe 和 jar 就是两件事情,一个是操作系统里面的可执行文件,里面是 intel cpu 的二进制代码,一个是虚拟机代码,是 jvm 的虚拟机二进制代码。

    exe 跑在操作系统下,cpu 里。jar 跑在 java 虚拟机里。要弄明白这个你首先要明白操作系统和虚拟机的区别。

    提到进程,又是一个操作系统概念。进程是一个操作系统的可执行单元。java 虚拟机在操作系统里面也是一个进程。而 java -jar xxx.jar 就是启动一个 java 虚拟机,在里面加载了你的 jar 。

    网络请求就涉及到 socket,这是一个网络层的概念…

    你这个有点千头万绪啊……多看书吧
    cmostuor
        7
    cmostuor  
       2020-12-17 22:11:49 +08:00
    @beryl 我没说只让你看 java 的源码呀 我这话就跟你妈催你读书一样 读啥书是你的事 想知道 exe 咋样执行去看微软给大学提供的 wrk 或 最近泄露的完整 xp 的代码 由于 win 系统是向后兼容的看完也很容易理解 winxp 以后的系统 jar 咋样执行去看 jvm 的代码
    misaka19000
        8
    misaka19000  
       2020-12-17 22:15:50 +08:00
    你这个问题比较复杂,需要学习好多东西才能详细的理解

    可以先看一下我这两篇文章做一下初步的了解:
    https://www.nosuchfield.com/2018/11/23/Program-compilation-linking-loading-and-running/
    https://www.nosuchfield.com/2018/08/01/TCP-Flow-Control-And-Linux-Socket-Buffer/
    missdeer
        9
    missdeer  
       2020-12-17 22:15:54 +08:00
    https://book.douban.com/subject/26365491/ 《程序是怎样跑起来的》
    beryl
        10
    beryl  
    OP
       2020-12-17 22:21:47 +08:00
    agagega
        11
    agagega  
       2020-12-17 22:47:49 +08:00 via iPhone
    jar 跟 exe 是完全不同的两种原理。
    java 不太懂; exe 的话,你打开的时候会有一个装载的过程,是操作系统完成的(类 Unix 上是 exec 这个系统调用),在命令行上启动程序的话,在调用 exec 之前还会存在一个 fork 的操作。(从 C 语言的角度看 fork 的逻辑非常匪夷所思,但从汇编的角度就会很自然了)然后就是一系列操作系统和系统库完成的脏活累活

    大概原理不算复杂,但细节特别多,不是专门搞这个的话,建议点到为止。有本书叫《程序员的自我修养》写得很好,就是比较旧了,新的也可以参考《深入理解计算机系统》第三版
    js8510
        12
    js8510  
       2020-12-18 08:34:15 +08:00
    气死大学老师系列。主要气死的是 操作系统 任课老师
    beryl
        13
    beryl  
    OP
       2020-12-18 10:23:45 +08:00
    @js8510 是的,最近在重新补这大学课程,当时上这个课的时候,拿到了大厂实习,就逃课出来了。
    so...
    mitsuizzz
        14
    mitsuizzz  
       2020-12-18 11:47:32 +08:00
    @beryl 凡尔赛。。。
    beryl
        15
    beryl  
    OP
       2020-12-18 12:52:35 +08:00
    @mitsuizzz 为啥?
    haosamax
        16
    haosamax  
       2020-12-18 13:04:52 +08:00 via iPhone
    为什么你们可以毫不费力的凡尔赛
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   901 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:53 · PVG 04:53 · LAX 13:53 · JFK 16:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.