【问题标题】:Why can/can't we apply OOP concepts as much to Kernel Programming? [closed]为什么我们不能/不能将 OOP 概念尽可能多地应用于内核编程? [关闭]
【发布时间】:2014-02-13 10:23:29
【问题描述】:

关于为什么 OOP 是正确的或者它在哪里工作等等有很多问题,所以这是其中之一,但是我是从内核的角度来问它的,以及为什么它不用作示例。

内核主要是用 C 编写的。它几乎不使用 OOP 。对 OOP 的普遍共识是,它是编程中最好的范例(主要是许多新手),但内核尽管是最具挑战性的编程领域之一,但不使用 OOPS。

所以我想知道 OOP 在哪些情况下有效,为什么它不能用于 Kernel 之类的东西?我试图了解为什么它在某些情况下可以工作的工程方面。你可以说 GUI 编程可能会从 OOP 中受益——据我了解,这样做的原因是你要创建一个特定事物的多个案例,而你可能会操纵它们 - 因此具有相同行为的不同状态是有意义的。

在更高的层次上,OOP 在哪些情况下可以被视为自然选择而不是过度设计?我很乐意就这个问题得到指点,因为这已经在很多地方进行了讨论。

PS:我正在寻找工程方面的。我理解这个问题的范围很广。任何有用的指针都会很好。

一些相关问题:I can't create a clear picture of implementing OOP concepts, though I understand most of the OOP concepts. Why?

【问题讨论】:

  • “OOP 被认为是编程中最好的范例”,这是一个没有上下文的绝对声明。在许多情况下,OOP 不被认为是编程中的最佳范例,例如内核。
  • Sami Laine:我敢打赌,很多人认为 OOP 是解决编程世界中问题的最佳方式 :-) 至少在世界某些地方!你知道写类,你知道继承,你知道什么是抽象类 - 你被视为不同的联盟。
  • docs.oracle.com/javase/tutorial/java/concepts/class.html --> 在现实世界中,您经常会发现许多相同类型的单个对象。可能有成千上万的其他自行车存在,所有相同的品牌和型号 --> 对此我的想法是自行车与编程有什么关系!我通常不会创建 100 件我写的东西。我也不认为创建自行车原型是有帮助的。那么有哪些用例 - 内核或多或少没有遵循这种方法,除了一些可能如下所述的情况。

标签: oop kernel


【解决方案1】:

在 OOP 成为头条新闻之前,大多数 Unix 内核都在为各种子系统使用类似 v-table 的调用调度。例如,看看 VFS 层如何处理不同的文件系统类型。

【讨论】:

  • 你能详细说明一下吗?你的意思是 Unix 需要赶上 OOP 还是你的意思是 OOP 最好用简单的方法解决,只要它抑制多种行为?我的意思是,我个人发现的工程问题通常是我应该考虑什么以及不应该考虑什么 - 所以我试图理解这一点。
  • @Nishant - 不,他是说 Unix 内核使用的代码结构类似于 OO 语言实现 oo 功能的方式,但在 C 中这样做。很多内核在过程代码中模仿 OO 功能。
【解决方案2】:

有面向对象的内核。实际上,至少有两个用 C# 编写的内核(项目分别称为奇异和宇宙)。

虽然从技术上讲这不是性能问题,因为您可以编写非常快速和高效的面向对象代码,但在面向对象语言中编写高效代码通常需要更多的努力(即,oop 语言通常使它非常易于编写效率不高的代码)。更重要的是,oop 的各种特性通常对内核编程并没有太大帮助,因为您必须编写非常低级的代码来摆弄位或专门使用寄存器。

这与人们不使用其他高级语言编写操作系统的原因相同……哎呀。 C 只是一种用于编写内核的非常有效的语言。如果没有 C,可能有人会为了内核开发而发明它。

编辑:

另一个经常选择 C ​​的原因是 C 有一个非常基本的函数调度系统。不同的 OOP 语言以不同的方式实现类和虚拟,因此它们需要“绑定”来定义如何调用这些对象和方法。 C 没有这些,并且有一个非常基本的函数调度方法。 OO 内核意味着用其他语言编写的代码要么必须用相同的语言编写,要么创建复杂的绑定以使其接口。

例如,如果您用 C 编写代码,并且想要在 C# 内核中调用内核函数,那么您现在必须模拟 C# 来进行调用……反之则容易得多。

【讨论】:

  • 但是也可以创建使用寄存器的类。
  • @Gangnus - 是的,这是可能的。就像我说的那样,这样做通常需要付出更多的努力。
  • 谢谢,我只是想确认一下 :-)
  • 所以 Erik ,基本上有两种类型的编程,这意味着另一个开发人员可以重用 - OOP 有意义 - 并且有一种用于逻辑很重要的计算机 - 这种区别真的很微妙 IMO - 我正在尝试更多地理解这一点 - 我很难理解上下文。
  • @Nishant - 没有。只是C是一种更底层的语言。您可以更轻松地在 C 中为汇编级别编写非常具体的代码,而大多数 oo 语言并不太关心代码生成的具体方式。这并不是真正的 oo 与程序性,更重要的是 C 是一种更适合此的语言,因为它具有低级代码生成功能。
【解决方案3】:

OOP 针对程序员进行了优化 - 易于使用和调试。

内核应该针对速度和内存进行优化 - 达到 OOP 永远无法达到的水平。

所以,我们可以在 OOP 中进行低级编程,但这是不好的低级编程。

【讨论】:

  • 你能解释一下你所说的面向程序员的意思吗?您的意思是 OOP 用于“库”代码吗?
  • @Nishant 一个程序有三个目标:程序员、用户和硬件。您无法创建对所有三个都最好的代码,更不用说在有限的时间内了。所以,我们必须做出妥协。由于计算机既快速又便宜,在大多数情况下,程序员现在不会为计算机优化代码。程序员很昂贵,因此该中心一直在转向“更好的编码实践”,这意味着对程序员来说更方便。用户是宝贵的......但可惜,我们几乎忽略了它。
  • 太棒了,所以它是“哲学”而不是“编程”方面?我的意思是你的观点一针见血。计算机不需要 OOP 来实现其目标。所以这个“哲学”方面让我感到困惑。我的意思是根据最终用户我们更改代码不?我的意思是我认为它真的没有那么多讨论的话题。
  • @Nishant 不,这是经济方面。至于用户,他讨论得很多,但盖茨有时说:“用户友好的软件是指盒子上写着‘用户友好’的软件”。对于大多数程序员和管理人员来说也是如此。
  • 一个程序有三个目标:程序员、用户和硬件是非常明智和真实的。我想在这种情况下分析这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2021-01-22
相关资源
最近更新 更多