漫画:如何给女朋友解释什么是编译与反编译

640?wx_fmt=gif

640?wx_fmt=jpeg

本文经授权转载自漫话编程(ID:mhcoding)

某天下班后,我在家里进行电话面试,问到面试者这样一个问题:"你知道使用哪些办法可以反编译Java代码吗?"。但是面试者回答的并不好,所以我在面试评价中写到:"对编译原理相关知识理解的不透彻"。这时,女朋友看到这句话。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

 

640?wx_fmt=png

计算机语言 

 

计算机语言(Computer Language)指用于人与计算机之间通讯的语言。计算机语言是人与计算机之间传递信息的媒介。

计算机系统最大特征是指令通过一种语言传达给机器。为了使电子计算机进行各种工作,就需要有一套用以编写计算机程序的数字、字符和语法规划,由这些字符和语法规则组成计算机各种指令(或各种语句)。这些就是计算机能接受的语言。

计算机语言包括机器语言、汇编语言和高级语言三种。

 

640?wx_fmt=png

机器语言

 

机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。机器语言具有灵活、直接执行和速度快等特点。但是不同型号的计算机其机器语言是不相通的,按着一种计算机的机器指令编制的程序,不能在另一种计算机上执行。

因为机器语言是使用二进制表示的,所以编出的程序全是些0和1的指令代码。

640?wx_fmt=png

机器语言的优点就是可以直接被计算机识别和执行,比较高效,但是同时也有很多缺点,如:

  • 1、机器只认识0和1,程序员很难记住每个指令转成0和1的组合是什么,需要查大量的表格来确定每个数字表示什么意思

  • 2、因为它的书面形式全是"密"码,所以可读性差,不便于交流与合作。

  • 3、因为它严重地依赖于具体的计算机,所以可移植性差,重用性差。

由于机器语言有这么多的弊端,于是有了汇编语言。

 

640?wx_fmt=png

汇编语言

 

汇编语言使用助记符(Mnemonics)来代替和表示特定低级机器语言的操作。

助记符(mnemonic)是便于人们记忆、并能描述指令功能和指令操作数的符号,助记符是表明指令功能的英语单词或其缩写。如用ADD表示加法、MOV表示传送、SUB表示减法等。

640?wx_fmt=jpeg

但是,汇编语言只是让使用者,即程序员们更加容易记住和使用,计算机并不认识汇编语言,所以,想要让计算机执行汇编代码,需要先将汇编程序将它们转换成可执行的机器语言代码。这一过程被称为汇编过程。

由于汇编更接近机器语言,能够直接对硬件进行操作,生成的程序与其他的语言相比具有更高的运行速度,占用更小的内存,因此在一些对于时效性要求很高的程序、许多大型程序的核心模块以及工业控制方面大量应用。

机器语言和汇编语言,二者是几乎很少或者完全没有做任何语法抽象的,这种语言我们通常称之为低级语言,这种更加接近硬件,而且是不可以在不同硬件间移植的。

但是随着现代软件系统越来越庞大复杂,大量经过了封装的高级语言如C/C++,Pascal/Object Pascal也应运而生。这些新的语言使得程序员在开发过程中能够更简单,更有效率,使软件开发人员得以应付快速的软件开发的要求。

 

640?wx_fmt=png

高级语言

 

高级语言是高度封装了的编程语言,与低级语言相对。

它是以人类的日常语言为基础的一种编程语言,使用一般人易于接受的文字来表示(例如汉字、不规则英文或其他外语),从而使程序编写员编写更容易,亦有较高的可读性,以方便对电脑认知较浅的人亦可以大概明白其内容。

如流行的Java、C、C++、C#、Pascal、Python、Lisp、Prolog、FoxPro、易语言、中文版的C语言习语言等等,这些语言的语法、命令格式都不相同。

同汇编语言一样,高级语言离机器语言更加远了,计算机无法直接诶识别高级语言。所以,想要让计算机执行高级语言,就需要将其转化为机器语言。

640?wx_fmt=jpeg

程序设计语言从机器语言到高级语言的抽象,带来的主要好处主要有以下几个方面:

  • 1、高级语言接近算法语言,易学、易掌握,一般工程技术人员只要几周时间的培训就可以胜任程序员的工作;

  • 2、高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;

  • 3、高级语言远离机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好,重用率高;

  • 4、由于把繁杂琐碎的事务交给了编译程序去做,所以自动化程度高,开发周期短,且程序员得到解脱,可以集中时间和精力去从事对于他们来说更为重要的创造性劳动,以提高程序的质量。

 

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

 

640?wx_fmt=png

编译 

 

上面提到语言有两种,一种低级语言,一种高级语言。可以这样简单的理解:低级语言是计算机认识的语言、高级语言是程序员认识的语言。

那么,怎么把程序员写出来的高级语言转换成计算机认识的低级语言然后让计算机执行呢?

这个过程其实就是编译!编译的主要的目的是将便于人编写、阅读、维护的高级语言所写作的源代码程序,翻译为计算机能解读、运行的低级语言的程序,也就是可执行文件。

Java语言的编译

Java语言作为一种高级语言,想要被执行,就需要通过编译的手段将其转换为机器语言。

Java语言的源文件是一个Java文件,要将一个Java文件,转换为二进制文件一共要经过两个步骤。

640?wx_fmt=jpeg

首先经过前端编译器,将Java文件编译成中间代码,这种中间代码就是Class文件,即字节码文件。

然后,在经过后端编译器,将Class字节码文件,编译成机器语言。

Java的前端编译器主要是JavaC, Eclipse JDT 中的增量式编译器 ECJ 等。

Java的后端编译器主要是各大虚拟机实现的,如HotSpot中的JIT编译器。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

 

640?wx_fmt=png

反编译

 

前面讲过,我们可以通过编译器,把高级语言的源代码编译成低级语言,那么反之,我们亦可以通过低级语言进行反向工程,获取其源代码。这个过程,就叫做反编译。

我们虽然很难将机器语言反编译成源代码,但是,我们还是可以把中间代码进行反编译的。就像我们虽然不能把经过虚拟机编译后的机器语言进行反编译,但是我们把Javac编译得到的class进行反编译还是可行的。

所以,我们说Java的反编译,一般是将Class文件转换成Java文件。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

反编译的作用

首先,反编译对于学习Java来说是一个很好的手段。

因为Java作为一种编程语言,提供了很多语法糖,如泛型、自动装箱与拆箱等,而这些语法糖Java虚拟机是不认识的,所以在Javac编译的时候,就会进行解糖,而得到的class文件中就是解糖后的代码,这时候我们把这种解糖后的class文件进行反编译,就可以得到一份Java文件,从这份Java文件中,我们就可以学习到这些语法糖到底是如何实现的。

其次,有了反编译的工具,我们就可以把别人的代码进行反编译,然后学习别人的代码是怎么实现的。或者可以通过源代码查找Bug,制作外挂等。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

反编译的工具

Java中有很多反编译工具,这里简单介绍几种:

Javap

Javap是JDK自带的一个工具,可以对代码反编译,也可以查看Java编译器生成的字节码。Javap生成的文件并不是Java文件,而是程序员可以看得懂的class字节码文件。

JAD

JAD是一个比较不错的反编译工具,只要下载一个执行工具,就可以实现对class文件的反编译了。

JAD是可以把class文件反编译成Java文件的。

但是,JAD已经很久不更新了,在对Java7生成的字节码进行反编译时,偶尔会出现不支持的问题,在对Java 8的lambda表达式反编译时就彻底失败。

地址:http://www.javadecompilers.com/jad

CFR

JAD很好用,但是很久没更新了,所以只能用一款新的工具替代他,CFR是一个不错的选择,相比JAD来说,他的语法可能会稍微复杂一些,但是好在它可以work。

地址:http://www.benf.org/other/cfr/index.html

JD-GUI

Python 第一地位稳了!微软正式拥抱 Python !

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

 

JD-GUI是一个独立的图形实用程序,显示“.class”文件的Java源代码。您可以使用JD-GUI浏览重建的源代码,以便立即访问方法和字段。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

 

640?wx_fmt=png

如何防止反编译

 

由于我们有工具可以对Class文件进行反编译,所以,对开发人员来说,如何保护Java程序就变成了一个非常重要的挑战。

但是,魔高一尺、道高一丈。当然有对应的技术可以应对反编译。

但是,这里还是要说明一点,和网络安全的防护一样,无论做出多少努力,其实都只是提高攻击者的成本而已。无法彻底防治。

典型的应对策略有以下几种:

  • 隔离Java程序,让用户接触不到你的Class文件

  • 对Class文件进行加密,提到破解难度

  • 代码混淆,将代码转换成功能上等价,但是难于阅读和理解的形式

如阿里巴巴开源的分布式事务中间件的JAR包就通过混淆技术进行了加密,反编译后内容如下:

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

【END】

640?wx_fmt=jpeg

作为码一代,想教码二代却无从下手:

听说少儿编程很火,可它有哪些好处呢?

孩子多大开始学习比较好呢?又该如何学习呢?

最新的编程教育政策又有哪些呢?

下面给大家介绍CSDN新成员:极客宝宝(ID:geek_baby)

戳他了解更多↓↓↓

640?wx_fmt=jpeg

 热 文 推 荐 

快应用 434 天

任正非反对制裁苹果;华为海思或发布麒麟新处理器;字节跳动或造智能手机?| 极客头条

“Go 仅是 Google 的编程语言,而不是程序员的!”

☞比特币冲到9000美元, 你就能找个好工作?

☞1000 万个“AI 名师”:用机器算法“解剖”应试教育

阿里面试,我挂在了第四轮……

☞10个爬虫工程师必备的工具了解一下

☞为什么说深耕AI领域绕不开知识图谱?

☞如何快速深入理解监控知识? | 技术干货

☞大神!这段代码让程序员躺赚200W,源码简单,你怎么看?

640?wx_fmt=gif点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

 

640?wx_fmt=png你点的每个“在看”,我都认真当成了喜欢

极简JAVA学习营第五期

01-19
想学好JAVA必须要报两万的培训班吗? 【课程背景】 JAVA是市场份额最大的编程语言,每天各大招聘网站上都会有数万个JAVA开发工程师的在招岗位,但是JAVA的技术体系庞大复杂,要想扎实掌握JAVA不是一件容易的事,线上学习相比线下两万起的高昂费用便宜了很多,而且具备学习时间灵活的优势,但是线上学习的劣势也很明显,没有线下那种学习氛围,碰到问题没法解决,在家学习很容易偷懒,极简JAVA学习营充分考虑到这些问题,通过每日实战编程练习,分队pk,助教答疑,作业点评,作业讲解,项目答辩等诸多环节充分激发你的学习热情,解决你学习中碰到的问题,让你花十分之一的钱学到JAVA的精髓,开启你的人生逆袭之路。 【专项的贴心服务】 1. 学练结合:定期布置视频任务和编程实战练习:通过每天的视频任务统一大家的进度,以便同学更好的交流,针对每天的任务会有相应的编程实战练习,通过练习内化知识。 2. 分队PK:将就业营的同学分成几队,通过作业统计表统计每队提交作业情况进行PK,激发你的学习动力。 3. 助教讲师答疑:碰到任何问题,发到群里,助教和讲师十分钟内帮你解决问题,扫清学习中的障碍。 4. 助教点评讲解作业:你每天提交作业都会有助教进行点评,让你知道有什么问题怎么解决,每三天一次视频讲解作业,互动解答问题 5. 项目答辩:每个阶段学完会有项目答辩,通过做项目巩固前一阶段的知识点,锻炼编码能力。 【往期训练营学习展示】 【套餐内容简介】 本套课以市场就业和职位需求为核心,从JAVA入门到多领域实战,设计出学习路线,共分为二十大模块,分别是:JAVA面向对象、Object类与常用API、集合框架、IO流、反射注解、多线程与网络编程、Object类与常用API等等。 同时采用理论讲解加实战演练的方式,既能让学员听懂听明白达到理解透彻,又能够在一个个真实实战案例中,让学员掌握真正有用的开发技能,从而进阶 JAVA 工程师! 套餐中一共包含21门JAVA程,助你从零进阶JAVA工程师! 阶段一:JAVA基础 课程1:《极简JAVA学习营开营篇》 课程2:《极简JAVA:JAVA面向对象》 课程3:《极简JAVA:Object类与常用API》 课程4:《极简JAVA:集合框架》 课程5:《极简JAVA:IO流》 课程6:《极简JAVA:反射注解》 课程7:《极简JAVA:多线程与网络编程》 阶段二:数据库入门 课程8:《极简JAVA:MySql数据库》 课程9:《极简JAVA:JDBC与连接池》 阶段三:JAVA WEB 课程10:《极简JAVA:HTML5与CSS3》 课程11:《极简JAVA:极简JAVA十一:Javascript与Jquery》 课程12:《极简JAVA:BootStrap》 课程13:《极简JAVA:JAVA Web》 阶段四:框架实战 课程14:《极简JAVA:Mavean入门》 课程15:《极简JAVA:MyBatis框架》 课程16:《极简JAVA:Spring框架》 课程17:《极简JAVA:Spring Mvc》 课程18:《极简JAVA:Oracle数据库》 课程19:《极简JAVA:Git入门》 课程20:《极简JAVA:Linux入门》 课程21:《极简JAVA:SpringBoot》 【课程特色】 1、易理解:讲师思路清晰、节奏明确、从易到难讲解透彻明白; 2、知识全:知识全面系统,从JAVA入门到实战,由易到难,让你彻底掌握JAVA开发; 3、重实战:涵盖大量实战项目,锻炼你的动手实操能力,面向工作编程; 【面向人群】 1、在校计算机专业或者对软件编程感兴趣的学生; 2、零基础想学JAVA却不知道从何入手 3、囊中羞涩,面对两万起的JAVA培训班不忍直视 4、在职没有每天大块的时间专门学习JAVA 这么细致的服务,这么好的氛围,这样的学习效果,你还等什么?赶紧报名吧,抓紧抢位,本期只招100人,错过只有等时间待定的下一期了
©️2020 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值