到2018年c#还是解释型语言吗

谁学逆向工程 2018-07-05 12:45:37
我记得以前好像看过说微软要把C#改成编译型的,要能在X86执行的语言。现在实现了吗。

我现在把一个C#程序拖到OD中去看到的是是汇编代码,这个时候已经是虚拟机翻译之后的结果了吧?

c#和VC的EXE在PE结构方面有什么区别吗

既然ILSpy能查看C#的源码,那是不是说明C#的PE文件中按原样或者说按文本方式保存了源码
...全文
1164 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
维秀斯丢丢 2018-07-11
  • 打赏
  • 举报
回复
至于如何反编译的,建议了解下元数据。
  • 打赏
  • 举报
回复
编译为本地代码还是编译为虚拟机代码,没有什么高下之分。虚拟机不但可以提高方便于各种硬件移植,对于许多类型的应用也可以使得目标程序跑的比本地代码的程序更快。
  • 打赏
  • 举报
回复
编译或者解释只是程序执行的实现方式,所以任何语言都可以编译执行或者解释执行,传统意义上,只有生成硬件可直接执行代码才叫做编译型语言,其余都是解释型。但是在编译和解释之间是有中间地带的,有若干过渡层次,先编译为中间代码(虚拟机代码),再解释执行中间代码,或者运行时二次编译为原生代码再执行(JIT技术),这种到底算是编译型还是解释型,一直是有争议的。
具体到java bytecode或者.net IL代码为什么那么容易被反编译,是因为它们的执行机构虽然叫做虚拟机,但是这个虚拟机并不等同于硬件实现的处理器,为了加快执行速度,其指令功能比真正的CPU指令强很多,是一种宏指令,另外由于反射的需要,程序的符号信息没有丢失,所以能够近乎完美地实现反编译,大体上java和.net虚拟机代码所处的层次和FoxPro、VB5之前的伪编译代码类似。
wanghui0380 2018-07-09
  • 打赏
  • 举报
回复
就像上面说的,你一直在偷换概念。上来说“本地化”,别人说本地化,你来说“逆向代码”

好吧我们也说逆向代码,典型如delphi,一份Pascal代码,你可以本地成dephi的exe跑在window上,也可以本地成Kylix的exe跑linux上,这是本地化的典型。

但是如果你拿“逆向代码”说事,那么请问delphi的exe逆向成”伪delphi代码“有可能吧!

同样c/c++在IDA里逆向成"伪C代码"级别一样是可能的把!

机器语言--到汇编--到伪XX级别代码,其实都是有可能的,不然就没你们这些号称”逆向代码“的人存在了。逆向代码存在的基础就是编译器编译出的东西有特征,存在返回伪XX的基础。

所以请你先定义好你要讨论的东西,你到底是要表达”编译型与解释型“ 还是要讨论”本地化编译与虚拟机的区别“,还是要讨论”手写源代码与机器逆向伪代码“
wanghui0380 2018-07-09
  • 打赏
  • 举报
回复
引用 10 楼 xiaoyuanyuan2009 的回复:
ILSpy 是怎么得到高级语言源码的


呵呵,那C的源代码用静态工具弄不出来?你自己都说自己是“逆向工程”,那么IDA可以反出C源码你要怎么说??
dede可以反出delphi的你又要怎么说?
  • 打赏
  • 举报
回复
引用 20 楼 sp1234 的回复:
编译为本地代码还是编译为虚拟机代码,没有什么高下之分。虚拟机不但可以提高方便于各种硬件移植,对于许多类型的应用也可以使得目标程序跑的比本地代码的程序更快。


少部分,不是许多。即便JIT编译后的代码,也不是100%原生代码,JIT编译的基本单位是方法(函数),不是整个程序,整个程序还是要在虚拟机控制下运行,即便你提前用ngen.exe生成了原生映像也一样,除非用.net native编译器生成真正的原生代码应用才可以脱离.net运行环境(但是依赖UWP runtime)。
xuzuning 2018-07-07
  • 打赏
  • 举报
回复
一般地说,从源代码运行的是解释型,从中间代码运行的是编译型
虚拟机是相对 CPU 而言的,不要刻意区别两者的差异
谁学逆向工程 2018-07-07
  • 打赏
  • 举报
回复
ILSpy 是怎么得到高级语言源码的
threenewbee 2018-07-07
  • 打赏
  • 举报
回复
C#从来都不是解释型语言
stevenjin 2018-07-07
  • 打赏
  • 举报
回复
整成解释型是不太可能的
谁学逆向工程 2018-07-07
  • 打赏
  • 举报
回复
引用 9 楼 sp1234 的回复:



引用 6 楼 guwei4037 的回复:


引用 5 楼 hanjun0612 的回复:

ILSpy 是怎么得到高级语言源码的
谁学逆向工程 2018-07-07
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
一般地说,从源代码运行的是解释型,从中间代码运行的是编译型
虚拟机是相对 CPU 而言的,不要刻意区别两者的差异

ILSpy 是怎么得到高级语言源码的
  • 打赏
  • 举报
回复
引用 楼主 xiaoyuanyuan2009 的回复:
这个时候已经是虚拟机翻译之后的结果了吧?


虚拟机就是用来执行代码的。虚拟机不是用来翻译的。
全栈极简 2018-07-05
  • 打赏
  • 举报
回复
c/c++ 编译型,Java/C# 编译/解释型,JavaScript/Python 解释型
  • 打赏
  • 举报
回复
引用 楼主 xiaoyuanyuan2009 的回复:
我现在把一个C#程序拖到OD中去看到的是是汇编代码,这个时候已经是虚拟机翻译之后的结果了吧?


怎么可能一个静态发布文件是“虚拟机翻译之后的结果”?!

这就是 c# 编译之后的代码。
全栈极简 2018-07-05
  • 打赏
  • 举报
回复
Java先把java源文件编译成class字节码,然后通过jvm解释执行class字节码文件,所以java既是编译型语言,又是解释型语言。C#跟Java一样,也是虚拟机语言,所以它们必然既是编译型又是解释型。
正怒月神 2018-07-05
  • 打赏
  • 举报
回复
其实本来已经不太考虑这种问题了。
因为一种语言会存在即是编译性,又有解释型。
两者只会越来越笼统。
而且解释型语言只会越来越快,必定会超过编译性语言。
原因在于,编译性语言没办法利用机器的硬件条件。
正怒月神 2018-07-05
  • 打赏
  • 举报
回复
"C#是编译语言而Java是解释性的,"之类的声明只是商业技巧
  • 打赏
  • 举报
回复
javascrpt是解释性
C#从出生就是编译性,编译成IL
wanghui0380 2018-07-05
  • 打赏
  • 举报
回复
嗯,好吧。汇编也是解释的,因为他的中间体是机器指令

我们只承认打孔机是编译的
加载更多回复(1)

7,765

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧