zoukankan      html  css  js  c++  java
  • 【程序执行原理】

    问一个问题,为什么一台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中,系统就能执行脚本程序了。

  • 相关阅读:
    C# 代码中调用 Javascript 代码段以提高应用程序的配置灵活性(使用 Javascript .NET 与 Jint)
    非软件行业公司自建软件开发部门能力不强的原因分析
    编程经验点滴----巧妙解决 Oracle NClob 读写问题
    编程经验点滴----在 Oracle 数据库中保存空字符串
    这几天上海移动网络可以直接打开 Google Play 了
    品牌电脑硬盘损坏后,使用MediaCreationTool从微软官方下载正版Windows到USB做安装盘
    编程经验点滴----使用接口表保存可能并发的业务,然后顺序处理
    生产打印系统的一些汇总--商业合同方面
    生产打印系统的一些汇总--概要
    外观模式
  • 原文地址:https://www.cnblogs.com/helww/p/8676642.html
Copyright © 2011-2022 走看看