我有一个问题,我很困惑。我理解.NET的方式是这样的:
csc.exe (编译器)-> 如果是这样,为什么构建 .NET 应用程序的输出是 Windows 可执行文件?我认为整个想法是你的源代码编译成 MSIL,它针对本地安装的 CLR。但是,.NET Core 和 .NET 5 都会生成一个 Windows 可执行文件,它运行在操作系统之上,而不是在虚拟机中。
This is unlike Java, which compiles to a .class bytecode file (not an .exe), and those files do run atop a virtual machine (or, later, you can package all the class files into a .jar).
What I'm trying to ask is: Why doesn't the C# compiler generate a specific application file type that runs atop …
我最近开始使用 ASP.NET 和一些 Javascript 进行 Web 开发,但有些事情让我很困惑。
我总是读到 JavaScript 过去是被解释的,直到 JIT 慢慢地把它编译成机器代码(这使得浏览器更快)。
这对我来说毫无意义。如果传统 JavaScript 应用程序一开始就不针对机器/CPU,那么 JavaScript 如何编译为本机机器代码?
我了解 Electron.js 应用程序是否使用 NodeJS 运行时编译为机器代码。我明白了。因为它本身编译为机器代码,并且据我了解,它不在浏览器中运行。
如果传统的 JavaScript 应用程序在浏览器中运行,为什么必须将其编译为机器代码?浏览器负责运行代码,而不是CPU。CPU 本身运行浏览器。实际上,我根本不明白本机操作系统如何影响浏览器中发生的任何事情,反之亦然。似乎也是一个安全问题。
抱歉,如果这是一个愚蠢的问题,但我找不到任何超出“Javascript 使用 JIT”的资源
谢谢你!
劳伦
我对某个主题感到困惑:
当您编译 Java 或 Python 时,您将获得将在相应 VM 上运行的字节码。在上一个问题中,我问过为什么,当您在文本编辑器中打开 .pyc 或 .class 文件时,它显示为乱码而不是可读的字节码(加载、存储操作等)。
现在,我当时得到的答案是基于“这就像说如果你打开一个 .exe 文件并希望看到 x86 程序集”的论点,他们做了类比,我看到的字节码是“程序集”版本的不可读的真正字节码。
如果不是为了一件事,这将是可以的并且是有意义的。您无法将 exe 文件与字节码文件进行比较。一个 exe 文件已经编译成机器码。字节码文件不是。字节码文件被馈送到 VM,然后由 VM 解释它(通常使用 JIT)。
这意味着例如编写 JVM 的人(这只是一个软件本身),需要编写一个字节码解释器。我真的怀疑他们写了一个解释器来处理以下问题:
Java .class 文件:
我可能是错的,也许他们出于某种奇怪的原因编写了一个解释器来处理这种形式的字节码,但这似乎不太可能。但是,如果 JVM 处理字节码的“汇编”版本,那么这意味着循环是
.java -> .class(不可读)-> .class(在进入 JVM 时可读) 中间几乎没有任何意义。
在这一点上,我真的很困惑。
.net ×1
.net-5 ×1
.net-core ×1
cil ×1
compilation ×1
java ×1
javascript ×1
jit ×1
jvm ×1
machine-code ×1