【问题标题】:Why use C++ instead of C# for driver level programming (system level programming) [closed]为什么使用 C++ 而不是 C# 进行驱动程序级编程(系统级编程)[关闭]
【发布时间】:2013-02-27 16:33:43
【问题描述】:

我必须开发一个测试应用程序来测试图形驱动程序的一些功能。 通过利用微软公开的标准,如 DXVAHD.h、DXVA2Api.h (Directshow) 和其他微软 API。 由于与 C++ 相比,C# 中的编码非常容易,为什么我们不能使用 C# 来代替。 是不是因为,我们不能在C#中使用头文件(因为有包的概念)?

在系统级编程方面,谁能告诉我为什么人们更喜欢 C、C++ 而不是 C#。 ?任何链接或学习材料 W.R.T.这些将不胜感激。

提前致谢。

【问题讨论】:

  • 闻起来像题外话。
  • 指针...你通过引用内存而不是复制对象来传递对象
  • 简短回答:C# 被编译为托管字节码,它在运行“虚拟机”的字节码之上运行。驱动程序需要直接在真正的 CPU 上操作东西,并且对他们需要做的事情拥有非托管的内存访问权限。
  • 答案是abstraction。抽象让事情变得更容易做,但同时也让访问更底层的东西变得更加困难。
  • @VladL 2008 年的问题不一定代表当前的审核政策。 SO 的“章程”的一部分与公告板/论坛相反,这就是为什么我觉得天生的主观问题应该更加努力来证明它们的存在。这个真的没有,它的核心是“用于系统级编程的 C++ 与 C#,讨论”。 “系统级编程”一开始是一个模糊的术语,这无济于事,而且这个 OP 并没有真正澄清它。

标签: c# c++ c operating-system


【解决方案1】:

除了某些 API 是 C++ API 之外,没有什么不能在 C# 中执行此操作的真正原因。与某些人在 cmets 中所说的不同,您不是在创建驱动程序,而是在创建(引用)“一个测试应用程序来测试图形驱动程序的某些功能”。 (除了硬件制造商之外,为什么会有人创建驱动程序?)

像 DirectShow 这样的流行 API 具有 C# 绑定。对于那些不这样做的人,您可以通过将 API 包装在 C# 代码引用的 C++/CLI 程序集中轻松创建自己的 API。

【讨论】:

  • 从 C# 应用程序调用 C++ API 没有问题。使用 C# 的真正问题是在 .NET Framework 等运行时环境之上运行的 JIT 编译语言的固有限制。如果它只是一个内部测试应用程序,那可能是无关紧要的。如果您是向大量客户提供此应用程序的驱动程序制造商,您可能需要重新考虑这一点。还记得 ATI 的惨败,他们基于 .NET Framework 编写的显卡配置应用程序需要花费数 分钟 才能打开?超级尴尬。
  • 同样,他/她不是在创建驱动程序,而是测试驱动程序的普通应用程序。 .NET 应用程序绝不需要几分钟即可打开。
  • 他们第一次在冷启动时初始化框架。至少他们在一年前就做到了。硬件略有改进,但软件膨胀往往保持得很好。
  • .NET 的加载时间确实比 C++ 长,但这可能是 0.2 秒。但是,您描述的 ATI 应用程序听起来像是具有繁重的 UI 和许多其他需要初始化的东西的应用程序之一,而且这些应用程序也存在于 C++ 中(想想游戏)。
  • @user1610015 鉴于 ATI 配置应用程序的皮肤被厚重而丑陋,仅它是用 .NET 编写的这一事实可能并不能解释减速的原因。 (有趣的是,MonoDevelop 在我的 macbook 上打开需要不到 10 秒,这肯定是一个非常复杂的应用程序,它加载了与 Gtk 的绑定,它本身不是一个轻量级库。)
【解决方案2】:

当您编写系统软件或驱动程序时,您希望严格控制您的环境:内存使用、时间限制等。

使用 C# 是不可能的。即使您忽略了在虚拟机上运行会引入大量开销的事实,您仍然无法控制内存分配/释放策略,您永远无法确定 GC 线程何时会启动并阻塞您的工作线程等。

除此之外,还有许多您无法在 C# 中执行的低级操作:从读取/写入设备寄存器的值或直接访问内存开始,然后转到更具体的任务。

【讨论】:

  • 为什么人们会投票否决这个答案?我找不到它说的任何不正确的东西。
【解决方案3】:

C 被称为中级语言,因为它实际上是在缩小机器级语言和更传统的高级语言之间的差距。用户可以使用c语言进行系统编程(用于编写操作系统)以及应用程序编程(用于生成菜单驱动的客户计费系统)。所以称为中级语言。

高级 - Java- Ada、Modula-2、Pascal、COBOL、FORTRAN、BASIC

中级 - Java(通过 C 接口)、C++、C、FORTH、宏汇编

低级 - 汇编程序

【讨论】:

  • 如果你写的是 Ada nad Pascal 是高级别的,我会把 Java 和 C# 放在高级别的,因为它比它们高,它使用 JVM nota bene。
  • 当然 Lukaz Niemier ..但我在这里谈论的是哪种语言是中间语言(绑定机器级语言之间的差距)所以 Java 可以处于高级和中级......
  • Ada 或 Pascal 也可以。 Java 只能通过 C 接口,通过 JNI 调用本机函数来做到这一点。 Pascal 可以直接做到这一点,甚至可以与纯 Asm 代码链接。
  • @Nicol Bolas ..我也是 以前从未听说过这个词..但是在阅读它时..我接受它..cprogrammingcodes.blogspot.com/2011/12/… ...
  • @Mohamad 我不确定用略显蹩脚的英语写的随机低内容博客是否是技术术语含义的知名权威。就个人而言,我确实认为 C 是一种低级语言,而汇编是“几乎不是一种编程语言”,因为它在语言结构方面并没有真正提供太多。 (与指令的助记符相反。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2017-10-05
相关资源
最近更新 更多