iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >互联网中托管程序与非托管程序有什么区别
  • 846
分享到

互联网中托管程序与非托管程序有什么区别

2023-06-17 12:06:56 846人浏览 泡泡鱼
摘要

这篇文章主要为大家展示了“互联网中托管程序与非托管程序有什么区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“互联网中托管程序与非托管程序有什么区别”这篇文章吧。托管代码是一microsoft的

这篇文章主要为大家展示了“互联网中托管程序与非托管程序有什么区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“互联网中托管程序与非托管程序有什么区别”这篇文章吧。

托管代码是一microsoft的中间语言,他主要的作用是在.net FRAMEWORK的CLR执行代码前去编译源代码,也就是说托管代码充当着翻译的作用。

什么是托管代码?

托管代码就是Visual Basic .NET和C#编译器编译出来的代码。编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据。这个程序集是.NET世界中的一个一站式购物(译者注:就是程序集具有自描述性)部署单元。你可以拷贝这个程序集到另一台服务器上部署它--通常来说,这个拷贝的动作就是部署流程中***的一个操作。

托管代码在公共语言运行库(CLR)中运行。这个运行库给你的运行代码提供各种各样的服务,通常来说,他会加载和验证程序集,以此来保证中间语言的正确性。当某些方法被调用的时候,运行库把具体的方法编译成适合本地计算机运行的机械码,然后会把编译好的机械码缓存起来,以备下次调用。(这就是即时编译)

随着程序集的运行,运行库会持续地提供各种服务,例如安全,内存管理,线程管理等等。这个程序被“托管”在运行库中。

Visual Basic .NET和C#只能产生托管代码。如果你用这类语言写程序,那么所产生的代码就是托管代码。如果你愿意,Visual c++ .NET可以生成托管代码。当你创建一个项目的时候,选择名字是以.Managed开头的项目类型。例如.Managed C++ application。

什么是非托管代码?

非托管代码就是在Visual Studio .NET 2002发布之前所创建的代码。例如Visual Basic 6, Visual C++ 6, 最糟糕的是,连那些依然残存在你的硬盘中、拥有超过15年历史的陈旧C编译器所产生的代码都是非托管代码。托管代码直接编译成目标计算机的机械码,这些代码只能运行在编译出它们的计算机上,或者是其它相同处理器或者几乎一样处理器的计算机上。非托管代码不能享受一些运行库所提供的服务,例如安全和内存管理等。如果非托管代码需要进行内存管理等服务,就必须显式地调用操作系统的接口,通常来说,它们会调用windows SDK所提供的api来实现。就最近的情况来看,非托管程序会通过COM接口来获取操作系统服务。

跟Visual Studio平台的其他编程语言不一样,Visual C++可以创建非托管程序。当你创建一个项目,并且选择名字以MFC,ATL或者Win32开头的项目类型,那么这个项目所产生的就是非托管程序。

这样子会导致一些混淆:当你创建一个托管的C++程序,那么构建出来的是一个中间语言程序集和一个扩展名为.exe的可执行文件。当你创建一个MFC程序,构建出来是一个Windows原生代码的可执行文件,这个文件的扩展名也是.exe。这两个文件的内部结构是完全不一样的。你可以用中间语言反汇编器(ildasm)来查看程序集的内部以及中间语言的元数据。如果尝试用中间语言反汇编器来查看一个非托管可执行文件,那么改反汇编器会告诉你这个可执行文件没有包含一个合法的CLR头,所以不能被反编译。可见,这两个文件虽然有相同的扩展名,但是它们是完全不一样的。

原生代码又是什么呢?

原生代码这个短语可以用在两个不同的上下文中。很多人会把原生代码跟非托管代码看作是同一个意思:用较老的工具构建的代码,故意采用Visual C++并使直接运行在计算机上,而且不运托管在运行库中。这可以是一个完整的程序,或者是一个COM组件,又或者是一个可以被托管代码利用COM Intero或者平台调用(PInvoke)所调用的DLL文件,COM Intero或者平台调用(PInvoke)可以帮助你在迁移到新的技术平台下依然能重用老代码的两个强大工具。

我更愿意说是非托管代码,因为这强调的是那些不能利用运行库所提供的服务的代码。例如在托管代码中,代码访问安全服务可以防止在另一个服务器上装载的代码运行特定的操作。如果你的代码运行的是非托管代码,那么你没法利用这样的保护服务。

原生代码的另一个意思是描述即时编译器的输出,那些实际上运行在运行库中的机械码。这些代码是托管代码,但是并不是中间语言,而是机械码。所以不要简单地假设原生就是等同于非托管。

托管代码就意味着托管数据?

对于Visual Basic和C#来说,生活是简单的,因为你没有其它选择。当你在那些语言里面声明一个类,那么这个类的实例会在托管堆中被创建,垃圾收集器(GC)会帮我们管理这些对象的回收。但是在Visual C++中,你有另一个选择。即使你正创建一个托管程序,你可以决定哪些类是托管类型,哪些类是非托管类型的。

这就是非托管类型:

class Foo  {  private:  int x;  public:  Foo(): x(0){}  Foo(int xx): x(xx) {}  };

这就是托管类型

__gc class Bar  {  private:  int x;  public:  Bar(): x(0){}  Bar(int xx): x(xx) {}  };

他们***的区别就是类Bar的定义中有__gc关键字。这个关键字会给代码带来巨大的区别。

托管类型是可以被垃圾回收器所回收的。他们必须要用关键字new来创建,永远都不会在栈中出现。所以下面这行代码是合法的:

Foo f;

但是这一行代码就是非法的:

Bar b;

如果我在堆中创建一个Foo对象,那么我必须要负责清理这个对象:

Foo* pf = new Foo(2);  // . . .  delete pf;

C++编译器实际上会用两个堆,一个托管堆和一个非托管堆,然后通过对new操作符的重载来实现对创建不同类型类的实例,分配不同的内存。

如果我在堆里面创建一个Bar实例,那么我可以忽略它。当没有其他代码在使用它的时候,垃圾回收器会自动清理这个类,释放其占用的资源。

对于托管类型会有一些约束:它们不能实现多重继承,或者继承与非托管类型;它们不能用friend关键字来实现私有访问,它们不能实现拷贝构造函数。所以,你有可能不想把你的类声明为托管类型。但是这并不意味着你不想让你的代码成为托管代码。在Visual C++中,你可以选择。

托管和非托管资源,是C#中的事,就不在这讨论了。

托管代码与非托管代码的性能比较

基本上每个人都知道的是,所有.Net语言都将被编译成为一个叫做IL汇编的中间语言。但是计算机是如何执行这个中间代码的,却是很多人不知道,甚至理解错误了的。

JIT是.NET程序运行的重要部件之一,全称是即时编译器。我刚才说的误解,就是很多人(绝对不是少数,问了很多c++程序员,10个有9个这种想法)都以为JIT其实就是跟Java VM差不多的东西,是一个Interpreter,在运行时读取IL汇编代码,然后模拟成x86代码(也就是俗称的虚拟机)。但是事实上,.NET使用的是更为高级的技术。 .Net程序被加载入内存以后,当某段IL代码被***次运行的时候,JIT编译器就会将这段IL代码,全部编译成本地代码,然后再执行。这也就是为什么.NET程序***次运行都启动很慢的原因!

随.NET库,微软还附带了一个工具,可以事先将.NET程序所有的IL代码都编译成本地代码并保存在缓存区中,这样一来,这个程序就跟c++编译的一模一样了,没有任何区别,运行时也可以脱离JIT了(这里不要混淆了,这里不是说可以脱离.NET库,而是说不需要在进行即时编译这个过程了)。所以,请不要将.NET和Java混为一谈,两个的运行效率根本不是一个等级的!

JIT的优化指的是可以针对本地CPU,在编译时进行优化。传统程序在编译时,为了保证兼容性,通常使用最通用的指令集(比如古老的386指令集)来编译。而JIT知道CPU的具体类型,可以充分利用这些附加指令集进行编译,这样的性能提升是很可观的。

以上是“互联网中托管程序与非托管程序有什么区别”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 互联网中托管程序与非托管程序有什么区别

本文链接: https://www.lsjlt.com/news/289139.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 互联网中托管程序与非托管程序有什么区别
    这篇文章主要为大家展示了“互联网中托管程序与非托管程序有什么区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“互联网中托管程序与非托管程序有什么区别”这篇文章吧。托管代码是一microsoft的...
    99+
    2023-06-17
  • 服务器托管与cdn有什么联系
    服务器托管和CDN(内容分发网络)之间有一定的联系,因为它们都涉及到在互联网上存储和传输数据。 服务器托管是指将网站、应用程序或数据...
    99+
    2024-04-24
    服务器
  • C++中怎么通过托管程序实现安全管理
    这期内容当中小编将会给大家带来有关C++中怎么通过托管程序实现安全管理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一般,C++托管程序要保护的有核心算法和敏感数据。保护核心算法:用C++开发组件保护敏感...
    99+
    2023-06-17
  • 服务器托管和租用有什么区别
    本篇内容主要讲解“服务器托管和租用有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“服务器托管和租用有什么区别”吧!服务器托管和租用区别,服务器租用代表是的使用者不需要自己花钱购买主机,仅...
    99+
    2023-06-07
  • 虚拟主机和主机托管有什么区别
    虚拟主机和主机托管的区别有:1.性质不同,主机托管是独享一台服务器,虚拟主机是共享一台服务器;2.操作系统选择不同,虚拟主机只能选择指定的操作系统;3.使用空间不同,虚拟主机空间相对狭小;具体分析如下:性质不同主机托管是用户独享一台服务器,...
    99+
    2024-04-02
  • 阿里云与服务器托管的区别是什么
    简介 在互联网时代,越来越多的企业和个人开始关注云计算和服务器托管技术。阿里云作为国内领先的云计算服务提供商,提供了丰富的云产品和服务。然而,许多人仍然对阿里云与服务器托管之间的区别感到困惑。本文将从以下几个方面来解析阿里云与服务器托管的区...
    99+
    2023-12-26
    阿里 服务器托管 区别
  • 网通服务器托管流程是什么
    1.选择托管方案:根据自己的需求选择适合自己的托管方案。2.预约机房:联系网通机房进行机位预约。3.服务器准备:准备好需要托管的服务...
    99+
    2023-06-13
    网通服务器托管 服务器托管 服务器
  • 网络服务器托管流程是什么
    网络服务器托管流程一般包括以下步骤:1. 选择托管服务商:根据自身需求和预算选择合适的托管服务商。2. 选择服务器规格:根据业务需求...
    99+
    2023-06-11
    网络服务器托管 服务器托管 服务器
  • 美国服务器租用和托管有什么区别
    这篇文章主要介绍“美国服务器租用和托管有什么区别”,在日常操作中,相信很多人在美国服务器租用和托管有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”美国服务器租用和托管有什么区别”的疑惑有所帮助!接下来...
    99+
    2023-06-07
  • 互联网中网闸与防火墙有什么区别
    这篇文章将为大家详细讲解有关互联网中网闸与防火墙有什么区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。网闸与防火墙一样是网络安全边界的安全卫士,其发挥的作用都不可轻视。但它们究竟有哪些不一样?本篇文章重...
    99+
    2023-06-27
  • 美国服务器租用与托管的区别是什么
    美国服务器租用和托管是两种不同的服务模式,它们之间的区别主要体现在以下几个方面: 所有权:在服务器租用模式下,客户通常租用云服务...
    99+
    2024-04-09
    美国服务器 服务器
  • 广东服务器租用与托管的区别是什么
    广东服务器租用与托管的区别主要体现在以下几个方面: 控制权:租用服务器意味着用户有完全的控制权和管理权限,可以自行安装和配置软件,...
    99+
    2024-04-29
    广东服务器 服务器
  • 网站服务器托管dedecms程序怎么进行安全设置
    网站服务器托管dedecms程序安全设置的方法:1、把dedecms版本升级到最新;2、设置data、templets、uploads、a目录为可读写不可执行权限,设置include、member、plus、dede目录为可读可执行不可写入...
    99+
    2024-04-02
  • 小程序与APP有什么区别
    小程序与APP的区别主要有以下几点: 开发成本和周期:小程序相对于APP来说,开发成本较低,周期较短。因为小程序不需要单独下载安...
    99+
    2024-04-17
    小程序
  • 服务端、容器与虚拟机,应用程序托管新时代
    服务端、容器和虚拟机是三种最常见的应用程序托管技术,每种技术都有其自身的优缺点。 服务端 服务端是一种应用程序托管技术,它将应用程序部署在一个单独的物理服务器上。服务端通常用于托管大型、复杂的应用程序,这些应用程序需要对性能和安全性有很...
    99+
    2024-02-22
    应用程序托管 服务端 容器 虚拟机 云计算 微服务
  • 那些改变互联网的PHP程序有什么
    那些改变互联网的PHP程序有什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。从数据库管理到在线购物,从博客到电子邮件,开放源...
    99+
    2024-04-02
  • php程序阻塞与非阻塞的区别有哪些
    本篇内容主要讲解“php程序阻塞与非阻塞的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php程序阻塞与非阻塞的区别有哪些”吧!PHP程序阻塞和非阻塞的区别是:阻塞调用结果返回之前,当...
    99+
    2023-06-29
  • 互联网中有哪些听音乐的小程序
    这篇文章主要为大家展示了“互联网中有哪些听音乐的小程序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“互联网中有哪些听音乐的小程序”这篇文章吧。可以听音乐的小程序:1、听音乐;2、聆听大自然音乐;...
    99+
    2023-06-29
  • IIS7应用程序请求路由(arr反向代理)与托管模块结合
    IIS7应用程序请求路由(ARR)是一种反向代理工具,用于将传入的请求路由到后端的多个服务器上。托管模块是一种在IIS中扩展功能的方...
    99+
    2023-09-26
    IIS7
  • linux中进程与程序的区别有哪些
    这篇文章主要介绍“linux中进程与程序的区别有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux中进程与程序的区别有哪些”文章能帮助大家解决问题。linux中进程与程序的区别:1、程序是...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作