为什么Linux和Windows下的程序不能互通?

在大致了解过一个程序是怎么被CPU执行之后,我就在思考一个问题,既然我们用高级语言写的程序最终都是机器码,而机器码又只和CPU的架构有关,所以按照这个道理,同一台电脑下的不同的系统中的程序应该是可以互通的呀!然而事实却不是这样的,如果真是这样,那Linux再也不会让我劝退了,我也就不会被迫把自己的电脑装回windows了。既然事实与我们所想不一致,那一定在高级语言转换为机器码的过程中遗漏了什么细节。询问ChatGPT(狗头)之后,问题得到了解答。我们先将CPU执行高级语言的过程给稍微细节化,高级语言通过编译,汇编,链接,装载这几个步骤之后,CPU就可以执行这个程序了。我们知道编译的过程是将高级语言转换为汇编语言(不是全部高级语言都有这个过程),汇编的过程就是将汇编语言转换为目标文件(对应CPU指令集架构的目标文件)

这三个过程,因为CPU指令集的限制,所以无论在过程中文件怎么变化,到目标文件的时候,按照理论来说Windows和Linux生成的目标文件应该都是一样的(注意是理论上)。那么可能出问题的地方就只能是后面的两步,链接和装载。先说链接,链接的目的是为了让不同文件中的程序可以被互相调用,可是如果链接的文件是Linux专属或者Windows专属的呢?那么这个程序想要跨平台运行就肯定不可能了。现在我们来谈论装载过程,装载过程是将我们的可执行文件装载到内存中,而这个过程需要装载器,问题就出在装载器上,其实在linux中,目标文件和可执行文件(链接过程之后形成的文件)用到的文件格式都是ELF,而Windows用的文件格式却是PE,所以装载器在Linux和Windows中的实现是不一样的,Linux的装载器只需要解析ELF格式的文件就可以了,而Windows的装载器只需要解析PE的格式就可以了。也正是因为可执行文件的格式不对,装载器就无法正确的将可执行文件装载到内存中,可以这样类比,比如明明是一张图片,而你却用记事本打开,得到的结果只能是乱码。既然得到的是乱码,CPU怎么可能正确的执行程序呢?所以我们又可以解释一个现象了,比如Windows中的WSL了,思考一下为什么WSL可以执行linux的命令,不就是WSL实现了ELF的装载器以及一些Linux下专有的链接库吗?如果熟悉Linux的朋友,就一定听说过Wine,他也是通过实现一个PE的装载器,来达到在Linux中,运行Windows的程序。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
pandaer
作者分享
#AI应用开发 springAI是如何实现mcp的工具调用的,在springai中,工具调用被抽象成了一个toolcallback,无论是我们自己写的工具调用,还是mcp提供的,最终都会变成这个类的实例,然后再大模型返回的结果里,如果有工具调用,就会调用toolcallback的call方法,来执行真正的工具调用
4
#AI应用开发 今天学习了如何利用springAI来开发mcp server以及mcp client。开发mcp client很简单,只需要引入依赖,配置一下就好。开发一个mcp server也是一样 先要引入一个依赖,然后手动注入toolcallbackprovider这个bean就行了。需要利用tool注解来自定义需要对外提供的工具
4
#AI应用开发 今天学习了toolcall,本质还是给大模型提供上下文信息,让其生成调用。在传递给大模型的消息中有一个额外的字段叫做tools,里面定义了工具的声明。在模型的响应中有一个字段叫做tool_calls里面定义了要调用哪些工具。 工具的定义要清晰明了,参数结构尽可能的简单,不要试图在一次请求中拼装复杂的工具链。满足需求的情况下,越简单,越清晰越好
4
#AI应用开发 springAI实现短期记忆(会话内记忆)的实现是基于chatmemory来实现的,chatmemory这个接口专注于我要把那些消息交给大模型,而chatmemoryrepostory 这个接口专注的是会话中产生的消息怎么存? 存哪里? 是数据库还是内存?
4
#AI应用开发 springAI中 目前学习了两套api,一个是chatmodel,一个是chatclient。 chatmodel是封装了大模型提供商的chat请求,让我们可以很方便的调用模型,而不需要手写http请求。他提供了两个方法 一个是call,一个是stream 对应chat请求的两套模式,一个是非流式输出,一个是流式输出。所以这个更像是对大模型的抽象。 chatclient是基于chatmodel的封装,提供了更多的api,方便我们快速搭建相关的功能。 springAI 提供了prompt来抽象给chat的请求内容,不仅仅包含消息列表,还有一些模型配置,但是我感觉prompt这个名字不好,我宁愿叫chatrequest,也不叫prompt,因为一段小文本就是prompt
3
下载 APP