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中,系统就能执行脚本程序了。

  • 相关阅读:
    asp.net中3个常用的功能,直接上代码
    看WEB 2.0实战书中的部分技术资料 引用 很随笔,很杂乱
    Building a Web 2.0 Portal with ASP.NET 3.5(DropThings实例教学)
    如何防治猪流感!猪流感!?会像SARS那样爆发吗?我们能作的就是预防。
    招聘!北京 DNN程序员 5K7K
    国外的机器人爱好者使用C#等研发的一种家庭灭火机器人
    OLAP与OLTP的区别 及 什么是数据仓库
    动态绑定数据源的ReportViewer终于搞定了
    牛奶再次出事?!算了,我还是自己榨豆浆吧。中国人喝豆浆!
    c#遍历HashTable
  • 原文地址:https://www.cnblogs.com/helww/p/8676642.html
Copyright © 2011-2022 走看看