为什么C程序需要反编译器但python程序不?

Ali*_*Ali 3 c python decompiling

如果我编写一个python脚本,任何人都可以简单地将编辑器指向它并阅读它.但对于用C编写的编程,必须使用反编译器和十六进制表等.这是为什么?我的意思是我根本无法打开Safari Web浏览器并查看其代码.

int*_*ted 12

注意:作者否认在这个主题上有深厚的专业知识.一些断言可能不正确.

Python实际上被编译成字节码,这是由python解释器运行的.每当您使用Python模块时,Python都会生成.pyc一个名称与模块对应的文件.这相当于.o编译C文件时生成的文件.

所以,如果你想要拆解某些东西,那么.pyc文件就是:)

Python在编译模块时经历的过程非常类似于gccC编译器使用C源代码执行的过程.主要区别在于它作为文件执行的一部分透明地发生.它也是可选的:当运行非模块,即最终用户脚本时,Python将只解释代码而不是首先编译它.

所以真正的问题是"为什么python程序是作为源而不是编译模块分发的?" 或者换句话说,"为什么C应用程序作为已编译的二进制文件而不是源代码分发?"

过去,C应用程序作为源代码分发是很常见的.这是在操作系统及其各个子实体(即Linux发行版)变得更加成熟之前回来的.一些发行版,例如gentoo,仍然将应用程序作为源代码分发.更加尖端或模糊的应用程序仍然作为其目标所有平台的源代码进行分发.

原因是兼容性和依赖性.你可以在Mac上运行预编译的二进制Safari,或者在Ubuntu Linux上运行Firefox的原因是因为它是专门为该操作系统,架构(例如x86_64)和一组库而构建的.

不幸的是,大型应用程序的编译速度非常慢,每次应用程序更新时都需要至少部分重做.因此二元分布的动机.

那么为什么不创建Python的二进制分发?首先,正如Aaron所提到的,每个新版本的Python字节码都需要重新编译模块.但这类似于重建C应用程序以链接更新版本的动态库 - Python模块在这个意义上类似于C库.

真正的原因是Python编译比C编译快得多.我认为这部分是因为语言的动态特性,也因为它不像编译那样彻底.这有其权衡:特别是,Python应用程序运行速度比C语言对应程序慢得多,因为Python必须将已编译的字节码解释为处理器的指令,而C应用程序已包含此类指令.

总而言之,有一个名为py2exe的程序将采用Python模块和分发并构建预编译的Windows可执行文件,其中包括模块的逻辑及其依赖关系,包括Python本身.我想这一点是为了避免不得不强迫人们在他们的Windows系统上安装Python只是为了运行你的应用程序.在linux下,或者我认为即使是OS/X,Python通常已经安装,因此预编译并不是必需的.Linux系统还有超级花花公子的包管理器,如果它们尚未安装,它们将透明地安装Python等依赖项.


dut*_*utt 10

Python是一种脚本语言,通过interpeter在虚拟机中运行.C是一种编译语言,代码编译成二进制代码,计算机可以在没有Python需要的额外内容的情况下运行.

  • @Ali:没有.没有合理的方法可以做到,不相信. (2认同)

eas*_*sel 5

这是一个很大的话题.你应该看看你当地友好的计算机科学课程,你会在那里找到很多关于这个主题的好东西.

简短的回答是Python是一种"解释"语言,这意味着它需要一个机器语言程序(python解释器)来运行python程序,添加一层间接.C或C++是不同的.它们直接编译为机器代码,直接在您的处理器上运行.

然而,这里还有很多额外的伏都教.从技术上讲,Python被编译为字节码,而现代解释器会进行越来越多的"及时"编译,因此编译代码和解释代码之间的界限总是越来越模糊.