粉丝36获赞264

接下来我们再看来看一个问题。呃,我们很多时候都在说以前在接触 c 源, c 加大时候说什么 c 加加是跨平台的, c 源是跨平台的,这个大家应该有听过。那 c c 加加他是怎么跨平台呢? 首先,我为什么突然冒出来要讲 cc 家家跨平台哦,因为抓瓦他是跨平台的。那为了跟抓瓦做一个对比,我先说一下 cc 家家他是怎么实现跨平台的。 那 c 跟 c 加怎么实现跨平台呢?是这样子的。比如说我如果编写了一段 cc 加加的元代码,那我们知道 cc 元的元代码是点 c 文件, c 加加元代码是点 cpp 文件啊。那我编写完这个元代码之后呢?我怎么办到我这个代码就是能够跨平台呢?能 能够我编写代码能够运行的 windows 上面也能够运行,运行的麦克上面也能够运行到这个那个上面呢?就一份代码,怎么跑到这不同的平台呢? 这是可以办到的。那我们的这个 cc 家家他是怎么做的呢?他是这样子。首先,如果我想我想干嘛呢?我想跑到比如说这个麦克系统上怎么做呢? 就利用编译器编译出一个什么呢?麦克欧格式的可知性文件。也就是说我们要搞一个什么变异器呢? 专门针对麦克平台的一个变音器。我们要搞一个真专门针对麦克平台变音器,要说针对麦克这种架构的一个变音器好了,所以的话,呃,我想让我这个代码跑到这个麦克上面,那我就要搞一个专门的变音器,变音出能够跑在麦克系统上的这个文件出来,这个代码出来 可以的话,呃,首先我们要把我们的原文件编映成马克欧格式的文件。马克欧格式就是麦克平台的一个什么可执行文件一个格式啊。这 这个时候的话,我们就可以将这个文件怎么样跑到我们这个麦克系统上面。好,那我这个麦克系统上面呢?一旦我一旦跑到我们麦克系统上面是怎么一回事呢?肯定就是将这个麦克文件里面的什么代码,也就是机器指令。然后呢,直接运行到我们系统上。因为我们知道我们 cpu 呢,就会去解析这些零一零一机器指令吗? 其实那些机器指令已经在这个马克欧格式里面了,只不过一呃,一般来说,我们这个马克欧格式的文件呢,是存在我们的硬盘上,一旦你把它跑起来,我们这个马克欧格式文件里面,机器指令他就会窄进内存。然后呢,在这个系统上跑起来啊,就达到运行的一个目的。那如果我这个代码要想跑的运动时呢?一样的, 你要专门针对 windows 这个系统找一个变音器来编音一下,所以我们得专门找一个变音器编映出 pe 格式的文件。因为 windows 他的可执性文件 是有要求的,必须是 p 一格式的文件。好,那 p 一格式的文件有了之后呢,再将 p 一格式的文件运行到我们的 windows 系统上面。当然 p 一格式的文件里面也包含了零一零一那些什么呢?机器指令。这个时候的话,机器指令就会窄进内存,然后 这个程序就可以跑到 windows 上面了啊,然后连那个也是一样的,你得把你的这个元代码文件通过特定的编音器 编译出 el f 格式的文件。因为 lindx 上面的这个可执性文件格式是 elf 格式的,是有特定要求的。那我们编译出 el f 格式的这个呃 文件之后呢,这个时候我就可以直接运行到我这个 lex 上面。然后呢,将这个机器指令载进内存。这样的话就达到了什么呢?将我们代码跑在这个 lex 上面的一个目的就是这样子。所以可以看得出来, cc 佳佳他是怎么实现跨平台呢?他跨平台其实是使用平台 台相关的变音器生成对应平台的可执行文件。说白了,他的跨平台是怎么样?是要为不同的平台生成什么呢?可执行文件 说你这个大为麦克平台生成可执行文件,你这个你这个代码为 windows 平台生成可执行文件。然后这个为这个另类的平台生成可执行文件。这是 cc 家家跨平台的一个原理 啊。抓瓦,你会发现很多人也说他是跨平台的。那抓瓦是怎么实现跨平台的呢?我们来简单看一下啊。首先抓瓦的原代码文件叫做点抓瓦文件,就是他的这个扩展名叫抓瓦啊。那我们刚刚说了, cc 加加其实是点 c, 点 cpb 啊。那我们编写完一段抓瓦代码之后怎么做呢? 呃,怎么跑到这三个系统上面去呢?首先他也得变异,大家注意了,这一次不太一样,他的变异呢?变异出来东西 叫做字解码文件。呃,文件拓展名呢?文件拓展名呢?是点克拉斯啊。字解码文件。那注意了,这个字解码文件并不是像我们之前看到的那幅图, 我们可以看到之前我们看到这幅图,我们变异完毕。是不是 pe 格式, mac 格式, ef 格式啊?你知道这三个是什么东西吗? 这三个是可执行文件。什么叫可执行文件?他是可以直接执行到这个系统上面,这个系统是可直接加了这个加在这个文件里面机器指令来执行的。这个系统也是一样,可以直接加载这个可执行文件里面机器指令来执行的。说白了,之前编译出来了这些文件里面已经包含了什么零一零一零零这些机器指令的 cpu, 直接读取里面的这个代码就可以了。这是之前的,但是我们主要不一样,怎么不一样呢?注意了,他编译出来这个东西呢,叫做字解码 文件。这个自睫毛文件里面包含的不是机器指定。你说注意一下,比如说自睫毛文件里面东西呢?我们的这个 cpu 他是没办法是直接识别里面的东西的,因为他不是机器指定。那自睫毛文件有什么用呢? 呃,是这样子的,如果我想想把这个编译好,这个字节码文件运行到这三个不同的系统的话,得怎么办呢?得在这个系统上面先安装一个东西,叫做 jvm。 什么是 jvm 呢?抓哇,我去吧,我信。这个是什么东西呢?抓哇。虚拟机 招啊。我去啊,不是招啊。虚拟机这个这个东西叫招啊,虚拟机。说白了,你得干嘛呢?首先你在 windows 上面得安装一个招啊,虚拟机在 mate 上面也得准备一个招。话虚拟机要在 max 上面得也得准备一个招。招话虚拟机,那这个虚拟机不用你搞,他已经开发好了,说 摆了。这个虚拟机呢,已经由招啊官方开发好的,你只要把这个虚拟机安装一下,安装一下就可以了,就这么简单啊。好,那如果你的这个系统上面已经安装虚拟机的,接下来怎么做呢?接下来其实就是 利用这个虚拟机去解析我们这个字节吗?文件。那虚拟机一旦解析完我们这个字节吗?文件之后呢,他就会转成我们这个机器指令,然后这个时候就可以把这程序运行起来了。所以他原理就是这样子。 首先你要想清楚一个点,你这个代码至于要跑起来,肯定要转成机器指令,肯定要转成零一零一零一这种机器指令,因为我们 cpu 只认识机器指令 啊,肯定要转。那究竟怎么转呢?在抓画里面是这样子的,你编译完之后叫字睫毛文件,这个字睫毛文件呢,将来呢,你就交给 j v m 去解析, j v m 会转成对应的集体指令去执行,就这样子。好,那如果我是想把我 这个交化代码跑到 vx, 那也是一样的,跑到雷雷斯也是一样的好。所以交往的跨平台,他是怎么样子,依次变异到处运行。而 cc 加加他的跨平台呢,是要多次变异,针对不同的平台进行变异, 编译出不同的可知性文件,达到跨平台一个目的。那招版呢,我们只需要依次编译,那大家可以对比,看得出来 他是干了件什么事情,他的变异是生成了跟平台无关的。自己买文件,你不觉这个文件跟平台无关吗?一点关系没有。我们只我只需要生成一份。自己买文件。 然后呢?不同平台他安装的虚拟机呢?他就会解析我们这个自己买文件解析,我们就同一个文件就可以了啊,然后再由对应平台来追 bm 解析,自己买 为集体指令,就达到我们这个跨平台的一个目的。那大家对比一下,这样做有什么好处?这样做有啥好处啊?你可以这么理解 这样做有什么好处?你能感受到扎瓦真有炮。平台有什么好处吗?不用开发变异器。好,我直接说啊。呃,是这样子,刚刚有同学说 多一点不用开发变音器,我觉得这个也也也算对啊。那对我们开发者有什么好处呢?我们开发者其实就不用操心变音器的各种东西了,不用去操心了。 那像以前我们在做别的开发的时候,比如说做移动的开发,那我们是要针对什么?呃,按摩六十四架构对吧?还有按摩 v 七架构等等。什么架构?是不是针对不同架构? 还要考虑变异相关的一些东西,但我们这里就不需要了。我们做抓法开发的时候,我不用考虑变异性相关的一些细节,不用去考虑这些细节 啊,我们只需要专心的写好我的专网代码就好了。而且编音器也也有什么呢?也有专网官方提供好了,我们不用想太多,我就把注意力放在这个地方就好了。然后到时候一编一要把这个代码怎么样 跑到各个平台,只要这个平台有安装虚拟机,我就立马就能跑起来。所以你想想,如果我用抓法开发了桌面应用,或开发了一个桌面的一个小游戏,那这个时候我只要把它编一晚,到时候我跑到麦克上,跑到 windows 上,可以,只要我这个麦克跟 vivo 上面有安装虚拟机就可以了啊。 然后很多人都说扎瓦开发效率高,比如说我刚刚说到做后台开发,是不是可以有很多种啊?你可以使用扎瓦,可以使用 psp, 也可以使用赛加,可以使用 go 等等。但是很多 嗯,很多公司呢,现在可能会选择使用这个招吧。为什么他开发效率高啊?如果你使用 c 家家来开发这个服务器,开发后台的话,确实也可以,而且运行的效率肯定比较高,就是。嗯,性能肯定也比较好。但为什么首选还是招啊呢?因为他开发效率比 c 家家高太多了。那为什么他开发效率高呢? 首先他跨平台,当你所顾到我们,我们程序员不用再操心变音器相关的操作了。另外,他有垃圾回收机制,这个很关键。他有垃圾回收机制,他的垃圾回收机制呢,就可以让我们程序员不用手动管理内存了。比如说以前你在做 c 家家开发的时候,你需要经常去干嘛呢? 你要用内存的时候,你要要去申请,而且你用完之后呢,你还得回收,要手动管理内存,就比较恶心啊。所以我们也不用担心内存泄露。甚至我们不用担心循环引用。那在很 很多编程语言呢,它是有内存循环引用这么一个东西的。就是一旦产生的循环引用,就导致内存泄漏,就有些内存就没法没法释放。但是在扎瓦里面,你不用去担心这个问题的, 有些循环引用的问题,他也能帮你解决,也能够自动回收掉那些循环引用的问题。那这个就牵扯到更深层次的问题了。这个牵扯到什么 gprot 对象的一个范畴了。这个以后有机会再说啊。然后他发展也近二十五年了,有非常强大的技术生态圈。 你想想啊,他发展二十五年了,有强大技术上的圈是什么意思呢?他有各种成熟强大的第三方库,甚至一些别人开发的一些辅助工具,就让我们开发效率提高的一些工具。 你遇到的问题基本上别人都遇到过了。就一他已经发展那么多年了吗?而且这个技术社区技术生态圈真的是非常发达,非常强大啊。 相当于是要啥有啥。比如说我在做抓法开发,我想要开发一个什么功能啊,因为发现这功能别人已经写好了,我们直接拿过来,而且是基基本上都是应有尽有,要啥有啥。那刚刚我说的一点,我们抓法甚至可以呃开发一些爬虫应用是吧? 为什么呢?因为已经有人写好一些爬虫相关的一些工具了,我们直接拿过来用就好了,就这么简单啊。就很多这个爬虫相关的操作,我们都不用去,不用去操心。那 爬出来仅仅是一个小例子。其实很多东西都是这样子,基本上你要想有的东西,基本上都已经有了啊,就这么简单。好, 那我说完这么多之后呢?那大家应该有所感受。那我们抓把这个语言呢?确实是比较独特一点,就很跟很多语言都不太一样。那很多语言呢?他都是怎么样子呢?就是我们写完代码,就通过编音器直接编音出可执行文件, 然后再把这可直接用键跑到对应的这个操作系统。但抓了他确实有一点点独特啊。他他比较呃有有特点的那个地方,就是这个,就是这个 jbm, 这个抓虚拟机。


如何在 doctor 中多阶段打包构建部署 java 应用程序?回答,在 doctor 中使用多阶段打包构建部署 java 应用程序的基本思路是,在一个 doctor file 中定义多个阶段, 在每个阶段构建的过程中实现一定程度的文件复制和系统配置,并在最终的镜像中只保留指定阶段构建过程中所产生的结果。这种构建方式可以让我们在构建 doctor 镜像时 只保留应用程序运行所必须的最小文件,并且显著减小镜像的大小,同时也能降低对多阶段构建流程的依赖, 以实现更快的构建速度。下面是在 doctor 中多阶段打包构建部署 java 应用程序的基本步骤。一、编写 doctor file 为多个阶段指定镜像和各 各自的构建环境。二、为原代码构建一个基础阶段的镜像,使用该镜像来复制原代码到 docker 容器中。三、在第一个阶段中编译 java 应用程序, 并将编页后的加尔文件复制到下一个阶段的镜像中。四、在第二个阶段中运行构建好的加瓦应用程序。 五、最后的镜像将只包含运行加管应用程序所必须的最小文件,而忽略了构建过程中的其他中间文件。多阶段打包构建部署技术可以使得构建刀克尔镜像时只有运行必要的步骤并减少镜像的大小, 更好的保证 doctor 容器的安全性和可靠性。