程序员想知道代码是怎样跑起来的

article/2025/9/14 14:14:49

某一天,程序员使用Java语言实现累加求和的方法,将文件命名为Sample.java。

public class Sample {public static void main(String[] args) {System.out.println(sum(10));}private static int sum(int n) {int res = 0;for (int i = 1; i < n; i++) {res += i;}return res;}
}

程序员不想直接点击运行,使用javap编译了Sample.java文件,可以看到Sample.java所在的目录下,生成了Sample.class文件。

那要是汇编语言,具体步骤应该是怎样的啊?

不过,什么是汇编语言?汇编语言其实和硬件息息相关,也就是脱离不了实际的硬件环境,无法跨平台运行,因为汇编语言是人们用助记符表述CPU的动作。CPU结构不一样,汇编语言调用的可能也不一样。

那助记符是什么意思呢?汇编语言的每一行,表示对CPU的一个指令,其语法结构是操作码 + 操作数。当然也存在只有操作码,例如ret,表示将处理返回到函数的调用源。

操作码是对CPU的指令,是动词,那操作码是数据,是存储在CPU的寄存器,是宾语。如mov a b; 表示将b的值赋值给a;add a b; 表示a同b的值相加,并将结果赋值给a。

那CPU是不是直接能懂这些助记符吗?当然不能。

我们知道计算上所有的地址和数据都是由0和1组成的,将汇编语言的那些助记符写在文本文件上,进行编译的时候会调用本地计算机上的应用,名为masm.exe,是一个编译器。

将文本文件编译成目标文件,此时的目标文件成了机器语言,可以直接被本地的CPU所理解的,如果将这个目标文件由别的计算机的不同系列CPU理解,那可能是读不懂,就好比如我们看不懂火星文。

那这个目标文件可以被本地CPU可以直接解析运行了吗?可以是可以,但是会直接被报错。

因为我们仅有这一个目标文件,还不知道这个目标文件和系统的库文件哪些有关。所以,需要一个链接器,把相关的目标文件组合成一个可以在特定平台运行的可执行文件,如下图:

汇编语言

库文件名的后缀也是*.O或 *.OBJ。其中, *.ASM *.OBJ和 *.EXE是在dos或windows系统下的文件, *.S和 *.O是在以Linux内核的系统下的文件后缀名,不过Linux内核不靠文件后缀名来判断这是什么文件,一般靠文件属性来判断,可执行文件在Linux内核中没有后缀名,用ls命令显示这个文件是绿色就是可执行文件。

好了,如果是C/C++语言,它的编译过程应该是怎么样子的呢?

C语言编译器过程

预处理 是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i”文件中等待进一步处理;

转换 是把C/C++代码(比如上面的".i"文件)“翻译”成汇编代码;

编译 是将用助记符表示的汇编语言翻译成符合一定格式的机器语言;

链接 是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。

好了,写着写着忘记Java程序的正事了。

大家所说的Java,有两个层面意思,一个是作为编程语言的Java,另一个是作为程序运行环境的Java。这就是Java的特殊所在,特殊就特殊在Java有Java虚拟机。

Java程序也需要编译,但是没有编译成机器语言,而是编译成字节码文件,然后在Java虚拟机用解释的方式执行字节码。

Java虚拟机

编译 是将Java源代码“翻译”为Java虚拟机可执行的字节码文件,保存到硬盘上;

加载 是将生成在内存上的字节码文件的副本,加载到Java虚拟机上;

Java虚拟机 加载后字节码后,执行方式有两种,一种是即时编译器,另一种是字节码解释器,如下图:

Java虚拟机执行引擎

即时编译和解释执行的区别如下:

解释执行:将编译好的字节码一行一行地翻译为机器码执行。编译执行:以方法为单位,将字节码一次性翻译为机器码后执行。

软件 是指Java虚拟机对于系统来说,是一个应用,是用某个高级语言编写的应用。

当然,Java虚拟机对Java程序来说,是一个运行的环境。我们可以对比分析一下,把Java源代码想象成汇编语言源代码,字节码想象成本地CPU可执行的机器语言,Java虚拟机想象成本地CPU

所以这就是为什么说Java是跨平台的,因为Java虚拟机是一个应用嘛。不过,不同的系统,应用也是不同的,所以系统不同,Java虚拟机也是不同的,但是字节码文件可以不变的,可以直接到其它不同系统上的虚拟机解析执行的。

Java虚拟机运行的是字节码,字节码对Java来说是十六进制;本地CPU执行的是机器码(机器语言),机器码对系统来说是二进制。不过,字节码文件放在本地是0和1组成的,只是不能被本地系统解析执行,需要Java虚拟机即时编译或解释执行。

“百闻不如一见”,我们看看*.class用记事本打开会是怎么样的。

记事本

这打开是乱码的啊?这是因为以class为后缀名的字节码文件在Java中保存的是十六进制,那我们要看十六进制如何看呢?

我们可以用Sublime Text 3打开字节码文件,但打开之前Sublime Text 3需要安装HexViewer插件,才可以看十六进制的,具体安装过程可以到网上搜索。打开之后,如下图所示:

Sublime Text 3

可以看到所有的数字都是十六进制的,接下来下一步就加载到Java虚拟机上去了,具体用即时编译的还是解释执行的,或者一起打配合。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️


http://chatgpt.dhexx.cn/article/ZI4k5R7J.shtml

相关文章

从前有一个程序员,成天写代码,后来。。。

之前这里是网易云音乐 的外链&#xff0c;许巍演唱版本的《执着》&#xff0c;我们搞IT 的多少都有些执着&#xff0c;后来网页没有了版权&#xff0c;我只好放上来歌词了。 如果对文章没有太多兴趣&#xff0c;可以只读一遍歌词&#xff0c;或者听一遍歌&#xff0c;哈哈。 每…

开发10年程序员,坐标北京,今天我硬气一回把老板炒了!!!

我的情况 随着越来越多的零基础非专业跳槽人员以及大学计算机专业学生越来越多,导致程序员找工作门槛也越来越高。虽然有着三年的开发经验,也自认为自己能解决很多问题。但是从找工作的这段时间才发现,自己的解决问题的能力是有,但是技术深度不够扎实。 通过对比自己和中…

低代码起势,程序员闷头开发的日子结束了

对于“低代码”的宣传其实已经很久很广泛了&#xff0c;但是争议从来都没有停止。“低代码将会取代程序员”的说法也很荒谬&#xff0c;今天系统整理了低代码&#xff0c;希望能对大家有启示&#xff0c;同时也欢迎各位在评论区指正探讨。 何方神圣&#xff1f; 所谓的低代码开…

程序员的炫技代码写法

程序员的炫技代码写法 程序员&#xff0c;这个职业总是让人感到神秘而又充满魅力。他们手中的代码常常充满了令人惊叹的炫技操作&#xff0c;让人不禁感叹他们的技术能力之高。在这篇博客中&#xff0c;我想和大家分享一些我所知道的程序员的炫技代码写法。 一、代码美感——…

一串代码让你成为机房最靓的仔

1.创建一个记事本文件 2.编辑文件内容 语法格式 color 背景色字体颜色 echo 输出的内容 %0&#xff08;无线循环&#xff09;例如在文件中输入以下内容并保存 color 1a echo 666666 color 2b echo 666666 color 3c echo 666666 color 4d echo 666666 color 5e echo 666666 c…

我爸嘲讽我,写破代码一年才挣十几万,他在工地带50个工人,一个月仅人头费就挣3万多,让我滚回去跟他干工地!...

现在码农的地位有多低&#xff1f; 一位程序员讲述自己被父亲鄙视的经过&#xff1a; 我爸嘲讽我&#xff0c;说我天天写这破代码有啥用&#xff0c;一年就拿十多万死工资。他在工地带 50 个工人&#xff0c;一个人一天抽 20 块钱人头费&#xff0c;一个月都能抽 3 万多&#x…

电视剧中的程序员,是真的敲代码吗?

今天是1024程序员节&#xff0c;今天不聊技术&#xff0c;聊一聊电视剧中出现过的敲代码片段&#xff0c;从咱程序员的视角看看代码是不是真的在写代码哦~ 1. 码不出来&#xff0c;公司要完 从知乎上看到的 用word写代码&#xff1f;放弃吧&#xff0c;写不写得出来&#xff…

给2500万行代码修复bug的程序员都怎么上班?

通常说&#xff0c;一个人造的、很庞大的事物&#xff0c;会给人很厉害的感觉。 比如说摩天大楼⬇️ 或者巨型水坝⬇️ 看着这种东西&#xff0c;世超不禁想到这几个字&#xff1a; “ 人类工程学奇迹 ” 。 但是欣赏归欣赏&#xff0c;这种巨型工程项目如果出了啥子问题&…

感受野与权值共享

什么是全连接&#xff1f; 若有一幅100x100的图像&#xff0c;隐层有100个神经元&#xff0c;每个神经元与每个像素全部连接&#xff0c;则有100*100*100个连接&#xff0c;这就叫做全连接。 什么是局部连接&#xff1f; 若有一幅100x100的图像&#xff0c;隐层有100个神经元…

感受野浅析

感受野的讲解&#xff0c;我在网上查了好多都是错误的&#xff0c;浪费了大量时间&#xff0c;后来总结下来避免大家入坑 一、感受野的概念 感受野&#xff08;Receptive Field&#xff09;的定义&#xff1a;卷积神经网络每一层输出的特征图&#xff08;feature map&#xf…

CNN感受野计算

笔试过程中遇到了感受野计算的问题&#xff0c;赶快把不牢固的知识复习一下。 1 感受野的概念 在卷积神经网络中&#xff0c;感受野的定义是 卷积神经网络每一层输出的特征图&#xff08;feature map&#xff09;上的像素点在原始图像上映射的区域大小。 2 感受野大小的计算…

目标检测和感受野的总结和想法

点击上方“计算机视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 作者丨pprp知乎&#xff08;已授权&#xff09; 来源丨https://zhuanlan.zhihu.com/p/108493730 编辑丨极市平台 导读 经典的目标检测如Faster R-CNN, YOLOv3等都用到了Anchor&#xff0c;本文详细介绍了…

感受野 深度理解

知乎是个好东西&#xff0c;深入理解一些理念&#xff0c;靠博客是不行的。 感受野计算和理解的内容参考自&#xff1a;https://zhuanlan.zhihu.com/p/44106492 / https://zhuanlan.zhihu.com/p/40267131 后两个卷积的内容参考自&#xff1a; https://www.zhihu.com/question…

卷积神经网络感受野的计算

1 到底什么是“感受野”&#xff08;接受野&#xff09;&#xff1f;——Receptive Field “感受野”的概念来源于生物神经科学&#xff0c;比如当我们的“感受器”&#xff0c;比如我们的手受到刺激之后&#xff0c;会将刺激传输至中枢神经&#xff0c;但是并不是一个神经元就…

深度学习-感受野与有效感受野

文章目录 感受野增加感受野有效感受野与反卷积的区别总结 感受野 卷积核的大小(高度和宽度)定义了一个区域的空间范围&#xff0c;改区域可以被卷积核在每个卷积步骤中修改&#xff0c;因而卷积核的大小称为卷积核的“感受野”。 感受野(receptive field, RF)&#xff0c;卷积…

3.3.2 感受野

3.3.2 感受野 1962年Hubel和Wiesel通过对猫视觉皮层细胞的研究&#xff0c;提出了感受野(receptive field)的概念&#xff0c;Fukushima基于感受野概念提出的神经认知机(neocognitron)可以看作是卷积神经网络的第一个实现网络。 3.3.6 卷积网络的感受野Receptive field (RF)以…

目标检测和感受野的总结

目录 1、感受野 2、理论感受野计算 2.1、自上而下感受野计算 2.2、自下而上的计算方法 3、作用 4、关系 5、总结 6、参考文献 经典目标检测和最新目标跟踪都用到了RPN(region proposal network)&#xff0c;锚框(anchor)是RPN的基础&#xff0c;感受野(receptive field…

CNN中的感受野

CNN中有一个概念叫局部感受野&#xff08;local receptive field&#xff09;&#xff0c;那什么是感受野呢&#xff1f;一般的CNN结构都是卷积-池化这样重复下去&#xff0c;比如下表&#xff1a; layers size stride input100*100*1---conv13*31pool12*22conv23*31pool22*2…

详解CNN的感受野

目录 前言 CNN特征图可视化 感受野计算公式 计算Receptive Field Size的小程序 前言 感受野&#xff08;receptive field&#xff0c;RF&#xff09;也许是CNN中最重要的概念之一&#xff0c;从文献上来看&#xff0c;它应当引起足够的重视。目前所有最好的图像识别方法都是…

感受野计算问题

我觉得以下两篇文章&#xff0c;在感受野的含义和计算上&#xff0c;说的是比较好的。 1、深度学习&#xff1a;VGG&#xff08;Vision Geometrical Group&#xff09;论文详细讲解_HanZee的博客-CSDN博客 2、关于感受野的总结 - 知乎 我们知道一个图片经过了一个7 * 7卷积…