什么是“托pipe”的代码?
我已经编写了C / C ++代码近二十年了,我也知道Perl,Python,PHP和一些Java,而且我自学JavaScript。 但是我从来没有做过.NET,VB或C#的东西。 托pipe代码是什么意思?
维基百科将其简单描述为
在虚拟机pipe理下执行的代码
而且它特别指出Java是(通常)托pipe代码,所以
- 为什么这个术语似乎只适用于C#/ .NET?
- 你能把C#编译成包含虚拟机的.exe文件吗,还是你必须把它打包并交给另一个.exe(一个java)?
与此相类似,
- .NET是一种语言还是框架 ,“框架”到底是什么意思?
好的,这不止是一个问题,但是对于一直在这个行业的人来说,我现在感觉N00B-ish …
当您将C#代码编译为.exe时,会将其编译为通用中间语言(CIL)字节码。 无论何时运行CIL可执行文件,它都将在微软公共语言运行时(CLR)虚拟机上执行。 所以不,不可能把你的.NET可执行文件包含在虚拟机中。 您必须在运行程序的任何客户机上安装.NET运行时。
为了回答你的第二个问题,.NET是一个框架,因为它是一组不是语言特定的库,编译器和虚拟机。 所以你可以在C#,VB,C ++和任何其他有.NET编译器的语言上编写.NET框架。
https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages
上面的页面列出了具有.NET版本的语言,以及指向其页面的链接。
我不认为你一个人对于.net是什么感到困惑。 已经有其他的答案,应该有你覆盖,但我会扔掉这些信息的其他人的小知识。
看看.net“真正”只是去c:\ Windows \ Microsoft.Net \框架
在那里你会看到特定于你安装的版本的文件夹。 例如,如果安装了v2.0.xxxxx文件夹,请进入该文件夹。
在那个文件夹是框架。 你将基本上看到一堆的.exe文件和.dll文件。 所有以System。*。dll开头的DLL文件基本上都是.Net框架。
您将在该文件夹中看到的.exe文件是开发人员的工具以及编译器。 你提到了C#。 findcsc.exe文件。 这是你的C#编译器。
build立一个程序非常简单。 把下面的代码放到hello.cs文件中。
using System; class Program { static void Main(string[] args) { Console.WriteLine("hello world"); } }
然后在命令行中键入> csc hello.cs
这会生成一个.exe文件。 运行它,显然会吐出“hello world”。
表示Console.WriteLine()的行正在调用框架。 控制台是一个存在于System命名空间中的对象,WriteLine()是一个静态方法。
这是Console.WriteLine()方法的反汇编代码:
[HostProtection(SecurityAction.LinkDemand, UI=true)] public static void WriteLine(string value) { Out.WriteLine(value); }
当人们说“我应该使用PHP还是.Net?”,或者“我应该使用Python还是.Net”时,你会开始看到这是不是正在讨论的错误。 他们显然是将一种语言与框架进行比较。 C#是一种语言,它只是可用于在.Net平台之上编写代码的许多语言之一。 Console.WriteLine()的相同方法可以从C#,VB.Net,Pascal,C ++,Ruby,Python,F#和任何其他在.Net平台上工作的语言中调用。
我希望有帮助。
-Keith
它主要用于描述.NET,因为这是Microsoftselect将.NET与C / C ++和其他较早的语言区分开来的术语。 微软之所以select它,是因为它不是一个通常与Java相关的术语,因为他们不想强调C#/。NET和Java之间的相似之处(而不是像“虚拟机代码”听起来更像Java)。 基本上,“托pipe代码”的使用是由市场驱动的,而不是技术驱动的术语。
大多数情况下,它指的是所有的内存分配都是为你“pipe理”的。 如果您使用的是托pipe代码,则在完成这些操作时,不必担心释放对象。 简单地让他们超出范围将意味着虚拟机最终将认识到,不再有任何引用他们,垃圾收集他们返回到系统的内存。
另一方面,非托pipe代码将只是“泄漏”,除非在放弃引用之前明确释放指针。
在.NET和Visual C ++下,您可以同时拥有非托pipe和托pipe代码。 这些术语是指分配和pipe理内存的方式。
非托pipe代码将是你习惯的C ++的东西。 dynamic内存分配和显式释放内存。 .NET运行时不会为你pipe理内存,因此“不受pipe理”。
另一方面托pipe代码由运行时pipe理。 您可以根据需要(通过声明variables而不是内存空间)分配内存,运行时垃圾回收器确定何时不再需要它,并将其全部清除。 垃圾收集器也将移动内存来提高效率。 运行时间“pipe理”这一切为你。
正如我上面提到的,可以编写既pipe理又不pipe理的代码。
非网pipe:
class Bar : public Foo { private: int fubar; public: Bar(int i) : fubar(i) {} int * getFubar() { return * fubar; } }
pipe理:
public ref class Bar : public Foo private: int fubar; public: Bar(int i) : fubar(i) {} int ^ getFubar() { return ^ fubar; } }
注意ref? 这几乎指定一个托pipe类。 但是,当你混合两种代码时,会变得非常混乱。 例如,你想要保存一个引用指针,(^)指针的pipe理对象,到你的非托pipe类中的一个图片框控件。 由于垃圾收集器可以移动内存,下一次尝试取消引用图片框时,将无法find它。 运行时不会告诉你的非托pipe代码有关内存的变化。
因此,您需要在内存中locking托pipe对象,以允许您的非托pipe代码跟踪它。 然后有拆箱和各种其他怪癖,让你混合两者。 代码复杂度是巨大的!
正式的,托pipe/非托pipe可能会降低到代码在.NET堆栈上执行的方式。 但是,如果你来自c ++的背景,我希望这会对你更有意义。
托pipe意味着代码不会被编译为本地代码,因此在虚拟机的帮助下运行。 Java编译成称为字节码的中间格式,Java VM知道如何解释和执行。 所有.NET语言都做类似的事情,编译为.NET运行时解释的IL(中间语言)。 这有点令人困惑,因为.NET IL具有.dll和.exe文件结尾。
托pipe一词通常仅适用于.NET,因为Microsoft使用该术语。 Microsoft通常不参考.NETpipe理的执行环境使用术语“虚拟机”。
.NET的“字节码”(IL)与Java字节码有所不同,因为它被明确地devise成在托pipe环境中执行之前被编译成本地代码,而Java被devise为被解释,但是独立于平台的代码很相似。
“.NET Framework”基本上是由微软提供的一大组库,包含数千个可用于开发应用程序的类。
已编译的C#.exe包含与平台无关的代码,可以在任何与.NET兼容的环境(包括Mono)中运行。 但是,运行时通常是与使用它的应用程序分开分发的。
有冒犯的风险,我怀疑pipe理这个词被使用,所以他们可以使用单词unmanaged而不是编译。 尽pipe被pipe理的可能意味着更多,但现实似乎是用来区分大部分刚刚编译的代码(作为replace曾经被解释的代码或pcode)和本地编译代码之间的区别。
或换一种方式,你更喜欢使用哪一种:
a)可能对系统做不可控事情的非托pipe代码。
b)快速,稳定且接近操作系统的本机编译代码。
当然,他们其实是一样的东西。
类似地,.NET是一种语言还是框架,“框架”在这里意味着什么? <<
.NET是微软目前的企业软件平台。 它包括:
•访问Windowsfunction的单个通用界面:
o The .NET Framework Class Library (FCL). o The FCL provides a rich set of high-level functionality for developers.
•用于执行.NET应用程序的单个通用语言和运行库:
o Common Language Runtime (CLR) executes Common Intermediate Language (CIL). o The CLR is God: it runs, controls, and polices everything.
•为开发.NET应用程序select多种语言:
o Every development language is compiled to CIL, which is run by the CLR. o C# and VB are the two main development languages.
我可以回答框架问题。 .NET是一个框架,C#,VB.NET等都是语言。 基本上,.NET提供了一个通用的平台,可以调用任何使用.NET的语言调用的所有系统…. DLL。 所有的.NET语言都被编译成MSIL(微软中间语言,简称IL),然后可以在安装了适当的.NET框架的任何PC上运行。
.NET是一个框架。 它可以使用多种语言(VB.NET,C#,IronPython,Boo等)
.NET总是按照解释执行,并且不能在.exe中包含'VM'。 任何希望运行.NET应用程序的用户都必须安装框架。
.NET是一个框架。 公共语言运行时(CLR)执行编译解决scheme(即,不编译为机器码)时生成的Microsoft中间语言(MSIL)代码。 你不能在exe文件中包含这个API,你也不想这么做。 这里的主要好处是内存pipe理(还有一些其他的安全优势,还有其他一些我不知道的)。
它可以引用由虚拟机执行的任何代码,而不是直接由CPU执行。
我认为这使垃圾收集和数组边界检查等事情。
就我个人而言,我认为“框架”一词有点用词不当。
.NET是一个“平台”,由执行环境(CLR虚拟机)和一组库组成。 这与Java或Perl或Python(其中没有一个被称为“框架”)完全相似。
在大多数情况下,“框架”一词用于像Spring或Struts或QT这样的项目,它们位于一个平台之上(即,不提供自己的执行环境),就像一个库。
但与“库”不同,框架试图重新定义底层平台的基本操作。 (Spring的dependency injection违背了普通Java代码的构造函数调用逻辑,QT的信号插槽实现无视普通的C ++代码。
我知道我只是一个迂腐的混蛋,但对我来说,.NET不是一个框架。 这是一个平台。
托pipe代码–MSIL和IL与托pipe代码是相同的。当我们构build我们的应用程序时,在Bin文件夹中生成.dll或.exe文件。这些文件被称为托pipe代码。随后,这些文件被赋予CLR以生成Native代码将被OS理解。