计算机执行程序代码的过程分析

计算机语言的分类:

计算机语言的分类,大体上可以分为机器语言,汇编语言,高级语言三大类。

机器语言:

计算机能够直接执行的是机器语言,由二进制代码来组成,可以直接对硬件进行操作,对于人来说,非常不容易编写。

汇编语言:

汇编语言的是指和机器语言是相同的,都是直接对硬件进行操作,采用的是英文缩写的标示符。同样需要我们将每一步的具体操作都要用语言写出来,比较复杂(相对于高级语言,但是肯定比机器语言好多啦)。

高级语言:

高级语言是将很多机器的指令合并,去掉了很多细节,大大简化了程序,对于程序员的要求也低了很多。现在常用的C,C++,JAVA等等语言,都属于高级语言。但是高级语言不能直接对硬件进行操作。

再来看一下几个概念。

编译,汇编过程,解释,脚本,解释型语言,编译型语言。

由于计算机智能读懂机器语言,所以汇编语言和高级语言必须经过一些列的处理来转化为机器语言才可以。

对于汇编语言,这个转化过程,就是通过汇编程序,把汇编语言转化为机器语言,这个过程,成为汇编过程。

对于高级语言,就是通过编译过程,使之转化为机器语言。(编译过程中其实也是经历了先编译成汇编语言,再通过汇编程序转化为机器语言的过程)一般通过编译器来执行。

编译器的翻译过程,其实是分为编译和解释两种的

编译就是对于高级语言,一次性转化为可执行的机器语言,然后执行(执行的时候就没有编译器什么事儿啦);

而解释,相当于是一边转化,一边运行的,中间不生成可执行的文件,而每一次运行,都需要重新解释一遍。不像编译可以一次编译,后面无论执行多少次都不用再重来了(代码不变的话)。

从字面上理解,通过编译来执行的语言是编译型语言,通过解释来运行的是解释行语言。解释型语言有自己的解释器。

java语言我们在上面没有说,应该它不是标准的编译型也不是标准的解释型。

java也需要编译,但是它是编译成java字节码文件,相当于可以直接运行在javaVm(虚拟机)上的机器代码。然后再对这个字节码文件通过解释的形式来运行,即对于字节码,通过解释器,编译一句,运行一句。

JAVA的解释器,就相当一个JAVAVM.JAVA语言的这种特性,也形成了它跨平台的优点,JAVA字节码使得“写一次,到处运行”。只要装有JAVA虚拟机的平台上,都可以运行。其实这一点,我以前不太理解,因为其他编译型语言也可以编译一次,运行多次。而且不像JAVA这么麻烦,还要运行在JAVA虚拟机上。现在想来,正是这种麻烦造就了跨平台的特点,因为其他语言直接编译成的二进制机器码,不一定能够适应所有的平台。而只要能够安装JAVA虚拟机的平台,都可以运行JAVA字节码。(web程序中,可以运行JAVA的浏览器也算是一种JAVAVm实例)。

一句话来说,其他语言是直接运行在硬件平台上的,而JAVA是运行在硬件平台上的纯软件平台上的。

c ,c++的程序编译过程:

为了说明程序的编译过程,我们用经典的hello world程序作为例子:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    printf("hello world!!!\n");
    return 0;
}

在linux系统中,我们用GCC编译器将源程序文件helloworld.c编译成可执行目标文件helloworld。

[email protected]:~/test_code$ gcc helloworld.c -o hello
[email protected]:~/test_code$ ./hello
hello world!!!

这个过程经过四个阶段,分别是预处理阶段,编译阶段,汇编阶段和链接阶段。执行这个四个阶段的程序分别是预处理器,编译器,汇编器和链接器,一起构成了编译系统。

•预处理阶段:预处理器(cpp)根据‘#’包含的头文件,将头文件的内容加进源程序中。得到新的程序文件文本,以“.i”为文件扩展名。比如说helloworld程序包含stdio.h头文件, 这个阶段将这个头文件的内容插进源程序中
•编译阶段:编译器(ccl)将文本文件hello.i翻译成汇编程序hello.S。也就是将高级语言翻译成汇编代码,低级的机器语言指令。
•汇编阶段:汇编器(as)将汇编程序hello.S翻译成机器指令,将这些指令打包成可重定位目标程序的格式,并把结果保存在hello.o文件中,hello.o是个二进制文件。
•链接阶段:链接器(ld)将会把一个工程中所有的.o文件链接合并成一个可执行目标文件,可以被加载在内存中,由系统运行。

以上就是c,c++程序编译过程;

系统硬件组成:

 

系统硬件组成:

程序具有访问局部区域里的数据和代码的趋势。通过将可能经常访问的数据保存在高速缓存中的方法,大部分的存储器操作都将在快速的高速缓存中完成,程序性能大大提升。

操作系统管理硬件:

在处理器中,指令集结构是对实际处理器硬件的抽象,在操作系统中,文件是对I/O的抽象,虚拟存储器是对程序存储器的抽象,进程是对

一个正在运行的程序的抽象,虚拟机则是对整个计算机(包括操作系统,处理器和程序)的抽象

•堆: 堆可以运行的时候动态地扩展和收缩,比如调用malloc或free函数的时候。

•共享库:大约在地址中间,用来存放像C标准库或数学库这样共享的代码和数据区域。

•栈: 位于用户虚拟地址空间顶部的是栈,编译器同它来实现函数调用。和堆一样,在程序运行期间可以动态地扩展和收缩。每调用函数,栈增长,函数返回,栈收缩。

•内核虚拟存储器: 位于用户虚拟地址空间顶部的是栈,编译器同它来实现函数调用。和堆一样,在程序运行期间可以动态地扩展和收缩。每调用函数,栈增长,函数返回,栈收缩。

时间: 2024-08-24 13:21:03

计算机执行程序代码的过程分析的相关文章

c#实现每隔规定时间自动执行程序代码

c#实现每隔规定时间自动执行程序代码 在一般的项目中我们很少用到c#实现每隔规定时间自动执行程序代码,但是如果你经历的项目多,或者应用程序做的比较多的话,c#实现每隔规定时间自动执行程序代码就用的比较多.像玩网游做挂机定时发布广告这样的项目中就用到了c#实现每隔规定时间自动执行程序代码. 25亿企业网站管理系统在多年运营seo方面,就用到了自动执行代码,现在给大家讲解一下c#实现每隔规定时间自动执行程序代码. 在实践应用中我们可以用三种方法来实现. //方法一:调用Thread线程执行方法,在执

文章阅读:计算机体系-计算机将代码编译和持续运行过程中需要考虑的问题,以及具体的实现原理讲解

文章太棒,我无法理解和评价,备份一下. 1.编程漫游 - Mr.Riddler's Puzzle http://blog.mrriddler.com/2016/12/15/%E7%BC%96%E7%A8%8B%E6%BC%AB%E6%B8%B8/ 注:讲了什么是函数,什么是数据.太抽象了,不过看了之后有很深的感触,还有不懂的感触. 2.计算机体系-编译体系漫游 - Mr.Riddler's Puzzle http://blog.mrriddler.com/2017/02/10/%E8%AE%A1

常用于显示计算机/编程代码标签

<code>Computer code</code> <kbd>Keyboard input</kbd> <tt>Teletype text</tt> <samp>Sample text</samp> <var>Computer variable</var>

计算机的指令执行过程分析

取数指令的执行: 存数指令的执行:

通过反汇编C代码分析计算机函数调用机制和栈帧结构

备注:秋风 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 C程序代码(简单的函数调用和返回): 将C源码编译成汇编代码: 有效的汇编代码内容: 通过仔细分析汇编代码的工作过程中堆栈的变化情况,可以描绘出函数调用过程中使用的栈帧结构如下: 总结: 计算机在工作时使用程序栈来支持函数或过程调用,机器用栈传递参数.存储返回信息.保存寄存器值用于以后恢复,和存储本地变量.栈向低地址方向

深入理解计算机系统读书笔记一 ---&gt; 计算机基础漫游

一.程序编译的不同阶段. 通常我们是以高级程序开发易于阅读的代码,我们通过语法规则推断代码的具体含义.但是计算机执行代码的时候就需要把代码解析成既定的可执行问题,计算机是如何处理的呢?这里以C语言hello.c文件为例来说明中间过程. #include <stdio.h> int main() { printf("hello world!\n"); } 先上张图. C语言源程序----预处理解析头文件和函数  --- 编译器解析成汇编语言 ---   翻译机器语言指令,打包

Java面试题及答案(基础题122道,代码题19道)

转载自:http://www.blogjava.net/fanyingjie/archive/2007/06/27/126467.aspx JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象.2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的

计算机系统概述一

一.信息就是位+上下文 1. 代码源程序是由一个0和1组成的位序列,8个位被组成1组,称为字节.每个字节表示程序中的一个字符,在ASCII中即是用一个唯一的单字节大小的数字表示一个字符.源程序以字节序列的方式存储在文件中. 2. 系统中所有的 信息都是有一串位表示,而区分这些数据对象的唯一方式就是读到数据时候的上下文. 二.程序执行的过程(以C语言为例) 由于机器只能读懂 二进制文件,而程序员写代码基本都用高级语言,因此想让计算机执行程序就必须把 程序转换为二进制文件(也叫可执行目标程序),这个

测试的艺术:代码检查、走查与评审

软件开发人员通常不会考虑的一种测试形式-人工测试. 大多数人都以为,因为程序是为了供机器执行而编写的,那么也该由机器来对程序进行测试.这种想法是有问题的.人工测试方法在暴露错误方面是很有成效的.实际上,大多数的软件项目都应使用到一下的人工测试方法: 1. 利用错误列表进行代码检查 2. 小组代码走查 3. 桌面检查 4. 同行评审 代码检查: 所谓代码检查是以组为单位阅读代码,它是一系列规程和错误检查技术的集合. 一个代码检查小组通常由四人组成: 协调人:以为称职的程序员 该程序的编码人员 该程