问一个问题,为什么一台linux机器上能够使用不同的语言,包括C,php,lua,python,go,java,shell等?
很简单,大部分都能回答,因为有解释器。解释器是一个程序,可以将对应的脚本解释为目标代码,并且能在当前的硬件环境执行,获得想要的结果。
具体而言
C语言
我们编写一个c程序代码,然后在linux用gcc编译成二进制文件,该二进制文件可以直接运行。
执行方式是:./main
这里不同于php,python等脚本语言,对脚本语言而言,解释器和执行文件是分离的。
脚本语言执行时,比如:shell a.sh,或者php a.php
c语言的编译文件可以直接执行,那么为什么刚刚编译出来的main文件能够执行呢?
一个OS是否能够执行c语言编译文件?取决什么?
可以参考下这篇文章:https://softwareengineering.stackexchange.com/questions/251250/why-do-executables-depend-on-the-os-but-not-on-the-cpu
1,指令集;2,文件格式;系统API;
指令集:因为在同一个系统下编译的,指令集用的同一套;
文件格式:因为是同一个系统下编译的,会编译成linux风格的bin文件,文件格式是能够被linux os识别的,所以这里没有问题;
系统API:简单的C程序,系统API是公用的,能编译出来肯定也是没问题的;
三个要素都满足,os检查文件能被系统识别,并且是个bin可执行文件,就把该文件加载到内存,然后分配系统资源去执行该文件的内容即可。
具体编译出来的一个二进制文件,是如何被系统所调度的?这个细节我们不用太多关注,在真正深入到这个层面的东西是整个工具链来保障的,os和编译工具gcc等。
这里涉及到一个问题:
OS如何能够使用CPU来完成OS的安装和后续启动的?OS是如何能够使用各种系统资源的(包括CPU,声卡,显卡,IO等)?
简单思考下挺有意思的。
脚本语言
脚本语言,一般是先加载解释器,然后加载解释文件的。
比如php a.php,先加载php解释器,然后把a.php加载到内存中的某一段区域,php解释器执行起来后,顺序解释a.php到php字节码,然后再顺序执行该字节码,调用php的某些扩展,或者直接用系统的API来实现执行任务。
所以一个系统,是否能够支持某种语言,以及如何支持该语言,看什么?
系统能否支持C语言?一般都支持
语言解释器是否是C语言写的?一般都是C语言写的
语言解释器启动时间是否很长?一般不会很长,如果很长,需要看业务场景是否允许,不允许需要换其它语言。
结论就是:把语言解释器加入到OS中,系统就能执行脚本程序了。