精华内容
下载资源
问答
  • Java代码如何翻译成机器语言

    千次阅读 2020-03-21 15:04:54
    机器语言和汇编语言,直接由计算机指令编写程序。 2、高级语言 C、C++、Java、Phtyon等,用语句编写程序,语句是计算机指令的抽象表示 高级语言转为低级语言的过程就是编译。编译由编译器完成。 将便于...

    编程语言分为低级语言和高级语言,一种可以直接被计算机识别并执行,一种需要被编译成低级语言才可以被计算机识别并执行。

     

    1、低级语言

     

    机器语言和汇编语言,直接由计算机指令编写程序。

     

    2、高级语言

     

    C、C++、Java、Phtyon等,用语句编写程序,语句是计算机指令的抽象表示。

    高级语言转为低级语言的过程就是编译。编译由编译器完成。

     

    将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻译为计算机能解读、运行的低阶机器语言的程序的过程就是编译。负责这一过程的处理的工具叫做编译器。

     

    反编译的过程与编译刚好相反,就是将已编译好的编程语言还原到未编译的状态,也就是找出程序语言的源代码。是将机器看得懂的语言转换成程序员可以看得懂语言。

     

    Java语言中的反编译一般指将class文件转换成java文件。

     

    javap并没有将字节码反编译成java文件,而是生成了一种我们可以看得懂字节码。其实javap生成的文件仍然是字节码,只是程序员可以稍微看得懂一些。

     

    字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令。这个过程是Java虚拟机(JVM)做的,这个过程也叫编译,是更深层次的编译。

     

    Java中的前端编译

     

    词法分析

    词法分析阶段是编译过程的第一个阶段。这个阶段的任务是从左到右一个字符一个字符地读入源程序,将字符序列转换为标记(token)序列的过程。这里的标记是一个字符串,是构成源代码的最小单位。在这个过程中,词法分析器还会对标记进行分类。

     

    词法分析器通常不会关心标记之间的关系(属于语法分析的范畴),举例来说:词法分析器能够将括号识别为标记,但并不保证括号是否匹配。

     

    语法分析

    语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述。

     

    语义分析

    语义分析是编译过程的一个逻辑阶段, 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。

     

    语义分析的一个重要部分就是类型检查。比如很多语言要求数组下标必须为整数,如果使用浮点数作为下标,编译器就必须报错。再比如,很多语言允许某些类型转换,称为自动类型转换。

     

    中间代码生成

    在源程序的语法分析和语义分析完成之后,很多编译器生成一个明确的低级的或类机器语言的中间表示。该中间表示有两个重要的性质: 1.易于生成; 2.能够轻松地翻译为目标机器上的语言。

     

    在Java中,javac执行的结果就是得到一个字节码,而这个字节码其实就是一种中间代码。

     

    PS:著名的解语法糖操作,也是在javac中完成的。

     

    Java中的后端编译

    通常通过 javac 将程序源代码编译,转换成 java 字节码,JVM 通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。很显然,经过解释执行,其执行速度必然会比可执行的二进制字节码程序慢很多。这就是传统的JVM的解释器(Interpreter)的功能。为了解决这种效率问题,引入了 JIT (即时编译)技术。

     

    JAVA程序还是通过解释器进行解释执行,当JVM发现某个方法或代码块运行特别频繁的时候,就会认为这是“热点代码”(Hot Spot Code)。然后JIT会把部分“热点代码”翻译成本地机器相关的机器码,并进行优化,然后再把翻译后的机器码缓存起来,以备下次使用。

     

    HotSpot虚拟机中内置了两个JIT编译器:Client Complier和Server Complier,分别用在客户端和服务端,目前主流的HotSpot虚拟机中默认是采用解释器与其中一个编译器直接配合的方式工作。

     

    当 JVM 执行代码时,它并不立即开始编译代码。首先,如果这段代码本身在将来只会被执行一次,那么从本质上看,编译就是在浪费精力。因为将代码翻译成 java 字节码相对于编译这段代码并执行代码来说,要快很多。第二个原因是最优化,当 JVM 执行某一方法或遍历循环的次数越多,就会更加了解代码结构,那么 JVM 在编译代码的时候就做出相应的优化。

     

    热点检测

    目前主要的热点代码识别方式是热点探测(Hot Spot Detection),有以下两种:

     

    1、基于采样的方式探测(Sample Based Hot Spot Detection) :周期性检测各个线程的栈顶,发现某个方法经常出现在栈顶,就认为是热点方法。好处就是简单,缺点就是无法精确确认一个方法的热度。容易受线程阻塞或别的原因干扰热点探测。

     

    2、基于计数器的热点探测(Counter Based Hot Spot Detection)。采用这种方法的虚拟机会为每个方法,甚至是代码块建立计数器,统计方法的执行次数,某个方法超过阀值就认为是热点方法,触发JIT编译。

     

    在HotSpot虚拟机中使用的是第二种——基于计数器的热点探测方法,因此它为每个方法准备了两个计数器:方法调用计数器和回边计数器。

     

    方法计数器。顾名思义,就是记录一个方法被调用次数的计数器。

     

    回边计数器。是记录方法中的for或者while的运行次数的计数器。

     

    编译优化

    JIT除了具有缓存的功能外,还会对代码做各种优化。

    逃逸分析、 锁消除、 锁膨胀、 方法内联、 空值检查消除、 类型检测消除、 公共子表达式消除。

     

    展开全文
  • 编译器是如何编写

    2019-10-03 06:00:57
    在学编译原理的时候,就有一个想法,现在的编译器是如何编写的。如果说是用纯粹的机器代码编写,这显然是不可能的,因为编译器是个非常复杂且庞大的软件工程,用纯机器代码编写所花费的时间这显然是不能接受的。有人...

     

    在学编译原理的时候,就有一个想法,现在的编译器是如何编写的。如果说是用纯粹的机器代码编写,这显然是不可能的,因为编译器是个非常复杂且庞大的软件工程,用纯机器代码编写所花费的时间这显然是不能接受的。有人就会说,用高级语言编写编译器呗,那么问题就来了,高级语言是不能被计算机直接识别的,所以这种说法也显然是不正确的。机器语言的开发效率太低,高级语言又无法被计算机直接识别,所以我个人就想,会不会是采用一种折中的办法,即编译器最核心的部分用机器语言编写,剩下其他的部分用高级语言编写。后来查看一下其他资料,发现果然是这样。这种情况被称为自编译。

     

    大致过程如下:

    设有自编译语言L,可以通过自展的方法为机器A生成该语言的编译程序L.Ao。首先,将语言L划分为核心部分和扩充部分,其核心部分为L1,其扩充部分分别为L2、L3、…、Ln,即L=L1+L2+L3+…+Ln。先用A机的机器语言或汇编语言编写核心语言L1的编译程序L1.Ao,然后用语言L1编写语言(L1+L2)的编译程序(L1+L2).L1。由于(L1+L2)语言仅是在核心语言L1的基础上稍加扩充,所以,其编译程序一般能够用核心语言编写出来。利用语言的自编译性,语言(L1+L2)的编译程序(L1+L2).L1经L1.Ao编译以后,则可生成(L1+L2).Ao。然后用语言(L1+L2)编写语言(L1+L2+L3)的编译程序(L1+L2+L3).(L1+L2),该编译程序经(L1+L2).Ao编译以后,生成语言(L1+L2+L3)的编译程序(L1+L2+L3).Ao,……,如此重复下去,其过程就像滚雪球一样直到生成整个语言L的编译程序L.Ao为止。由于开始通过低级语言建立的编译程序可做得比较小而简单,因而可以在较少的人力和时间的情况下建立起来,以后都是用高级语言本身来编写较大语言的编译程序。由于有用高级语言进行程序设计的优点,所以这样做的结果是比用低级语言直接一次生成一个完整的编译程序要快,而且在程序的可靠性方面也更能得到保证。 
     
    通过这种方式大大提高了编译器的开发效率

    转载于:https://www.cnblogs.com/mlgjb/p/8044585.html

    展开全文
  • 汇编语言和机器语言 我们不需要完全了解掌握机器语言、汇编语言来进行编程(这是计算机生产厂家要做的事)。我们所要知道的是如何看懂汇编语言就行了。我们所编写的高级语言,被翻译成汇编语言时,编译器会自动进行...

    汇编语言和机器语言

    我们不需要完全了解掌握机器语言、汇编语言来进行编程(这是计算机生产厂家要做的事)。我们所要知道的是如何看懂汇编语言就行了。我们所编写的高级语言,被翻译成汇编语言时,编译器会自动进行一些优化处理。

    机器语言

    计算机是不能直接识别我们所编写的C程序或者Java程序的。它只能识别机器语言,而机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指指令系统令的集合。
    但要用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义。手编程序时,程序员得自己处理每条指令和每一数据的存储分配和输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。这个工作十分繁琐且困难。编写程序花费的时间往往是实际运行时间的几十倍或几百倍;并且编出的程序只是0和1的指令代码,直观性差,还容易出错。
    这时候我们就需要用到汇编语言了:

    汇编语言

    汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上,汇编指令是机器指令便于记忆的书写格式

    计算机是只认识机器指令的,这时候我们就需要编译器将汇编语言转换成机器指令的工具。

    程序员->(输入)汇编指令->编译器->(转化)机器码->计算机

    汇编语言是直接面向处理器(Processor)的程序设计语言。
    处理器是在汇编指令的控制下工作的,处理器可以识别每一条指令为机器指令。
    汇编语言另一个特点是是它所操作的对象不是具体的数据而是寄存器或者存储器。(汇编语言直接和寄存器和存储器打交道),这也是汇编语言比其他语言执行速度要快的原因(相应的也比其他语言更复杂)。
    汇编语言指令是机器指令的一种符号表示,而不同类型的CPU 有不同的机器指令系统,也就有不同的汇编语言。因此汇编语言程序与机器有着密切的关系。也正因如此,汇编语言的通用性和可移植性要比高级语言程序低。

    总结对机器有相关性、高速度&效率、(相对于高级语言)编写和调试复杂

    高级语言

    高级语言并不是指一种语言,而是包括很多编程语言,比如Java、C、C++、C#、python等等,是高度封装的编程语言。

    展开全文
  • uwu采用以机器代码编写的代码,格式为u和w。 你是0 w是1 要编译该编译器,您将需要D语言编译器,然后在此目录中运行dub 。 对于律师 这个项目是个玩笑,要获得适当的许可证,请参阅LICENSE-human-read.md ...
  • 编程卓越之道(第二卷): 运用底层语言思想编写高级语言代码 本书是《编程卓越之道》系列书的第二卷,将探讨怎样用高级语言(而非汇编语言)编程得到高效率机器代码。在书中,您可以学到如何分析编译器的输出,以便...
  • 它提供了一种正式的语言编写数学定义,可执行算法和定理,以及用于半交互式开发机器检查的证明的环境。 安装 下载适用于Windows和macOS的的预构建软件包; 阅读有关如何使用Cop安装Coq的; 或参考文件以获取从源...
  • 在使用基本的一些shell命令时,机器需要与人进行互动来确定命令的执行。...如何编写可以自动与shell交互的命令行,而不再需要人工介入呢?expect于此横空出世。 “Expect是一个免费的编程工具语言...

     在使用基本的一些shell命令时,机器需要与人进行互动来确定命令的执行。比如 cp test.txt boo/test.txt,会询问是否覆盖?ssh远程登陆时,需要输入人工密码后,才可以继续执行ssh命令等等。如何编写可以自动与shell交互的命令行,而不再需要人工介入呢?expect于此横空出世。

            “Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年 开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools)。使用它系统管理员 的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。”

     

            下面我们安装下expect,并做简单的测试,确保正确使用expect脚本。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。

     

    expect下载地址

    http://download.chinaunix.net/download/0003000/2845.shtml

    tcl下载地址

    http://download.chinaunix.net/download/0001000/22.shtml

    1。先安装tcl

      进入tcl解压目录,然后进入unix目录

      #./configure

      #make

      #make install

    2.后安装expect

      进入expect解压目录

      #./configure --with-tclinclude=/usr/src/tcl8.4.19/generic/ --with-tclconfig=/usr/local/lib/

      #make

      #make install

    完成,测试

      #expect

      expect1.1> 

      expect1.1>

    一切OK,安装成功。

     

            编写一个测试脚本,测试expect按正常运行。touch test.exp,文件以exp结尾或tcl结尾,都可以执行。注【spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命 令的。

    ###author:usgrouping@weixin

    #!/usr/local/bin/expect

    set timeout 30

    set password zhishi2016&*!db1

    spawn ssh -l root 118.76.22.83 -p 14010

    expect "*assword:" { send "$password\n"}

    expect "*#"

    send "echo success,we get into the remote directory!\r"

    expect "100%"

    expect eof

    interact

     

    保存后,运行expect test.exp,成功后输出:success,we get into the remote directory!

     

    expect先介绍到这里,深入了解可翻阅网络相关资料。

     

    上篇《利用jenkins实现自动构建、部署,提升团队开发效率》,自动构建后部署到应用服务器,是结合shell脚本完成的部署升级。环境是jenkins部署在内网,脚本执行也是内网。下篇内容将利用jenkins+shell+expect脚本的方式来部署线上环境,敬请关注......

     

     

    【一位十年码农的碎碎念,扫码关注获取更多精彩内容】

     

    创文章,转载请注明出处,更多文章请关注公众号。

    转载于:https://www.cnblogs.com/growithus/p/11012235.html

    展开全文
  • 了解编译器为常见控制结构生成的典型机器指令,以便在编写高级语言程序时选用恰当的语句;掌握编译器将各种常量和变量类型转换成机器数据的方法,以便于使用这些数据写出又快又短的程序。 书中的理论超出了特定的...
  • 因此无论你用什么语言编写程序,最终都会被转换成1和0。。。但中间需要被转换的次数,以及转换的复杂度,却并不相同。 越低级,代表离机器码越近,中间转换的步骤也就越简洁,相应的,CPU运算起来就越快。。。也就是...
  • 5. 高级语言机器编译

    2018-08-10 17:03:22
    1.高级语言一般有哪些基本构成要素? 常量、变量(存储单元)、保留字、表达式...高级语言到汇编语言到机器语言如何转化的?  汇编语言(assembly language):利用助记符号编写程序的语言。 汇编程序(assemb...
  • 编程语言的学习,其目的是通过计算机语言,将现实生活中的问题,借助机器来解决,在这个过程中,语言编写其实就是一种“人机交互”的过程。编程人员首先要注意的就是慢慢培养自己的计算机思维(其实学习任何东西,...
  • 本文介绍了如何利用 MindsDB 机器学习平台编写 SQL 语句实现预测模型,可以看出这种方式非常简单易用。MindsDB 还提供了一个图形用户界面 Scout,意味着可以直接在页面点击完成模型的训练和预测。 除了使用 SQL 语句...
  • python编写函数 数据科学和机器学习的伟大现代斗争之一是“ Python vs. R”。 毫无疑问,近年来两者都已经取得了巨大的发展,成为数据科学,预测分析和机器学习的顶级编程语言。 实际上,根据IEEE最近的一篇文章,...
  • 研究人员不断推动机器智能的提升,教机器如何看,听,读,写和听——这些曾经是我们人类专属领域的技能。 机器学习的首选语言是Python,最受欢迎的库是Google的TensorFlow。几乎所有的代码示例都是用Python编写的,...
  • Python和R是数据中心工程师最流行的编程语言之一。...在本文中,我将展示如何使用Web API将机器学习模型集成到.NET编写的应用程序中。 开始:Flask 我们可以使用Flask作为共享和主持我们的机器学习预测的一种方式
  • 它不是可以直接转换为源代码或机器代码的最终设计。 它是用于了解如何解决可以在许多不同情况下使用的问题的描述或模板。 设计模式是形式化的最佳实践,程序员可以在设计应用程序或系统时用来解决常见问题。 设计...
  • 研究人员不断推动机器智能的提升,教机器如何听说读写——这些曾经是我们人类专属的技能。机器学习的首选语言是Python,最受欢迎的库是Google的TensorFlow。几乎所有的代码示例都是用Python编写的,并且依赖于...
  • 凭借Python编程语言的知识,你可以从事人工智能,机器学习和数据科学等创新领域的工作。但是,要实现这一目标,你首先需要引起面试官的注意。 简历呈现出人事对你的第一印象。简历的撰写方式将决定您是否有机会在...
  • 这绝对是最激动人心的时刻。... 而且,事实证明,机器学习(以及人工智能,自然语言处理和代码生成技术)将帮助机器编写自己的大多数代码-但是,在此之前,我们还有二十多年的时间。 还请参见: Googl...
  • 大家都知道计算机只能处理和识别二进制指令,而我们利用各种高级编程语言编写的程序,要经过一些列的处理步骤,最终转变为汇编指令,再最后转变为机器指令。 以上这些转变是如何发生的就属于大名鼎鼎的...
  • 本技巧将向您讲述如何编写可通过代理访问因特网上的Web服务器的Java应用程序。在Java应用程序中加入代理支持只需额外编写几行代码,且不依赖任何安全性“漏洞”。 几乎所有的公司都十分关注保护自己的内部网络,以防...
  • 计算机的指令即cpu能理解的操作,也就是我们所说的机器语言。不同的cpu能理解的语言不一样,如intel的cpu,苹果使用的ARM的cpu。不同的语言即不同的计算机指令集。 高级语言,汇编语言,计算机指令的关系 一条高级...
  • 汇编语言对于机器来说固然是效率很高的,但是我们编写起来其实并没有那么方便,因为他的思路还是更近机器,所以在汇编语言编写当中,C语言也可以被使用进来,帮助大家更快更好的完成工作。 栈在汇编语言中的设置...
  • 在上一篇文章中,我们讨论了无论代码是用什么语言编写的,它最终都毫无例外地运行在机器代码中。那么Java语言中发生了什么,从源代码到机器代码?这就是我们今天要讨论的。 如下图所示,编译器可以分为前端编译器、...
  • 先用机器语言写出汇编器,然后就可以用汇编语言编程了,然后再用汇编语言编写汇编器。 再用汇编语言写出 C 编译器,然后就可以用 C 语言编程了,然后再用 C 语言来写 C 编译器。 有了 C 编译器与 C 语言,就可以在这...
  • 计算机是如何解读高级语言

    千次阅读 2016-02-27 21:02:40
    大家都知道,C语言是一种应用非常广泛的高级语言,而且标准的C语言...然后我们把它反编译成汇编语言,因为汇编语言是最接近机器语言的,如图: 接下来我们通过这段汇编语言来分析这段C语言是怎么运行的: g: 1 push
  • 我们这里要开始用汇编语言编写可执行文件了,例如 exe 格式的可执行文件 一、一个程序从写出到执行的过程 第一步:编写汇编源程序。 第二步:对源程序进行编译连接。源程序编译产生目标文件,目标文件连接...
  • 没学过java的时候用Spark可能一开始就会直接用Python对接,因为如果是创建scala语言的话,会存在很多问题,包括生成scala类或者object,以及最终在idea里面编译成jar包,因为需求紧急,所以就直接用Python来写了,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 798
精华内容 319
关键字:

机器语言如何编写