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

  • 相关阅读:
    poj 2728 Desert King
    uva 439 Knight Moves
    hdu 1875 畅通工程再续
    scau实验题 8600 骑士周游问题(有障碍物)
    scau实验题 8596 Longest Ordered Subsequence
    poj 1679 The Unique MST
    uva 527 Oil Deposits
    poj 2533 Longest Ordered Subsequence
    .net 程序员 java 开发入门
    Collation conflict occur at operation on User define funtion & table's column
  • 原文地址:https://www.cnblogs.com/helww/p/8676642.html
Copyright © 2011-2022 走看看