抽象的目的

时间:2010-09-21 18:34:33

标签: language-agnostic abstraction

编码抽象的目的是什么:

程序员的效率或程序的效率?

我们的教授说,它仅用于帮助程序员理解和解决问题。更快地修改程序以适应不同的场景。他还认为这会给该计划的表现带来额外负担。我不清楚这意味着什么。

有人可以详细说明吗?

6 个答案:

答案 0 :(得分:7)

我会说他差不多一半。

最大的目的确实是帮助程序员。计算机无关心你的程序是如何抽象的。但是,有一个相关但不同的好处 - 代码重用。这不仅仅是为了提高可读性,抽象是让我们将各种组件插入到由他人编写的程序中的原因。如果所有内容只是在一个代码文件中混合在一起,并且绝对没有抽象,那么即使是中等复杂的东西,也永远无法编写任何内容,因为您每次都要使用裸机。只是在屏幕上写文字可能是为期一周的项目。

关于表现,这是一个值得怀疑的说法。我确信它取决于抽象的类型和深度,但在大多数情况下,我认为系统不会注意到它。特别是现代编译语言,它实际上为你“解开”代码(循环展开和函数内联之类的东西),有时可以使系统更容易。

答案 1 :(得分:2)

你的教授是对的;编码中的抽象存在以使编码更容易,并且它增加了计算机在运行程序时的工作量。但是,诀窍是使计算机工作量的增加(希望非常微小)与程序员效率的提高相形见绌。

例如,在极低级别;面向对象的代码是一种帮助程序员的抽象,但最终在程序中添加了额外的“东西”和额外的函数调用。

答案 2 :(得分:2)

由于抽象实际上是将常用功能部分提取到可重用组件(无论是抽象类,父类,接口等)的过程,我会说它绝对是程序员的效率。

说抽象是以牺牲性能为代价的,但最好是在不稳定的地面上行走。对于大多数现代语言而言,抽象(从而增强了灵活性)可以为应用程序的性能带来一点点成本。

答案 3 :(得分:2)

Tesserex发布的链接中有效地概述了什么抽象。对于你的教授关于为程序增加额外负担的观点,这实际上是相当正确的。但是,现代系统的负担可以忽略不计。根据调用方法时实际发生的事情来考虑它:您调用的每个附加方法都需要向堆栈添加许多其他数据结构,然后处理也放在堆栈上的返回值。例如,调用

c = add(a, b);

看起来像

public int add(int a, int b){
  return a + b;
}

需要将两个整数推入堆栈以获取参数,然后将另一个整数推入堆栈以获取返回值。但是,如果两个值都已存在于寄存器中,则不需要存储器交互 - 这是一个简单的单指令调用。鉴于内存操作比寄存器操作慢得多,您可以看到性能命中的概念来自何处。

最终,你所做的每个方法调用都会增加程序的开销。然而正如@Tesserex指出的那样,在大多数现代计算机系统中都是如此,正如@Andrew Barber指出的那样,这种妥协通常会因程序员效率的提高而相形见绌。

答案 4 :(得分:1)

抽象是一种让程序员更容易使用的工具。抽象可能会也可能不会影响系统的运行时性能。

对于不改变性能的抽象示例,请考虑汇编。与记住字节码和其他指令编码细节相比,像movadd这样的肺炎是一种抽象,使得操作码更容易记忆。但是,考虑到1对1的映射,我建议明确表示这种抽象对最终性能有影响。

答案 5 :(得分:1)

没有一个明确的情况,抽象使程序员的生活更容易,而代价是计算机的更多工作。

虽然更高级别的抽象通常会给执行一个独立的代码单元带来至少少量的开销,但它也是允许程序员在较大的“单元”中考虑问题的原因,这样他就可以更好地完成理解整个问题,避免执行那些离散的代码单元中的鬃毛(或至少一些)。

因此,只要避免增加过多的开销,更高级别的抽象通常会导致执行速度更快的程序。当然,问题在于没有简单或简单的定义过多的开销。这很大程度上源于这样一个事实:可接受的开销量在很大程度上取决于要解决的问题,并且在更高抽象级别上工作的程度允许程序员识别真正不必要的操作并消除它们。