为什么有些程序员对C,Python和C ++进行不同的分类?-关于等级


16

我正在学习python入门课程,讲师说python是高级语言,而C和C ++是低级语言。只是令人困惑。我认为C,C ++,Python,Java等都是高级语言。

我在C,C ++等上的stackoverflow上阅读问题,它们似乎都将这些语言称为高级语言。在我看来,有些程序员可以互换使用这些术语。


1
像许多事情一样,高级别与低级别是一种简化-对理解很有用,但如果您忘记这是一种简化,则可能会产生误导。正如其他人所说,肯定是相对水平。但这不一定是一条线-您可以抽象出不同的方向(例如,不同的范例)。仅仅因为您远离了机器抽象,并不一定意味着您正朝着适用于您的应用程序的适当抽象迈进。
Steve314

甚至起点也可能有所不同。例如,IMO的lambda演算是一个非常低的抽象级别-在机器中被大量抽象,但这是一个非常简单的抽象,它是功能语言在其上开始构建抽象的起点。在任何情况下,lambda演算都不可能比机器代码更接近于任何特定应用程序的理想抽象。
Steve314

Answers:


31

高级别和低级别是相对术语,因此用法随时间而变化。在70年代,UNIX之所以风靡一时,是因为它表明一个操作系统可以主要用高级语言编写:C。当时,与汇编程序相比,C被认为是高级的。

如今,C被认为是一种低级语言,因为该语言和标准库都没有提供任何面包和黄油数据结构,例如矢量,字典,迭代器等。您可以在C程序中拥有所有这些结构,但最终需要自己编写它们。Python,Java等相对于C是高级的,因为许多标准数据结构是内置在语言中或作为标准库的一部分。开箱即用可以更轻松地进行抽象级别的编程。

从第二个意义上讲,C是低电平:它可以直接操纵计算机硬件(至少在操作系统允许的范围内直接操纵)。Python,Java等最常见的实现至少要从硬件中删除一步,因为它们在VM中运行。如果要使用Python操纵硬件,则通常在C或C ++中编写Python VM的扩展。

C ++是一种奇怪的情况。它提供了大量漂亮的数据结构作为标准库的一部分,但也允许对硬件进行低级操作。


3
IMO确实不是C ++的情况,它只是一种混合级别的语言。您获得的抽象级别取决于您使用的功能。
Steve314

1
@ Steve314:是和否:通常,抽象是伴随信息隐藏而来的,即一种语言或库就像一个提供接口的黑匣子,而且没人想知道黑匣子里面的内容。C ++有点奇怪,因为它提供了更高级别的构造,但是并没有阻止程序员访问它们的表示形式并破坏它们。我知道,C ++是唯一一种不会隔离不同抽象层的语言(但也许还有其他我不知道的语言)。
乔治

1
@Giorgio-C ++允许您隐藏任何实现细节-例如,使其成为类的私有内部的一部分,因此,使用它的唯一正式方法是通过该类的公共接口。当然,您可以打破规则并争先恐后地存储内存-但实际上,您可以使用任何支持实际应用程序开发的语言来做到这一点。
Steve314

@ Giorgio-以Haskell为例。在这种情况下,“不安全”往往表示非参照透明(如unsafePerformIO)。有IORef类型,但是reinterpret_cast我不了解,也没有指针运算。但这并不意味着从人们那里窃取内存是安全的。为了成为一种实用的语言,Haskell必须与实际的操作系统和库进行交互。它具有“外部功能接口”。如果我真的想颠覆它,我所要做的就是使用FFI编写原始的颠覆函数。
Steve314

@Giorgio-当然,我可能很难找到要在内存中破坏的值,但是在C ++中也可以适用,具体取决于我对它们的隐藏程度。例如,我可能使用PIMPL。如果我仅然后提供理解了指向内容的库的目标代码和标头,则可能被颠覆的对象必须对该目标代码进行反向工程,以找出要颠覆的内容和方式。
Steve314

8

从低级语言一直到高级语言,以一种可伸缩的规模来考虑。随着语言从低到高的发展,该语言从与计算机的特定接口提供了越来越多的抽象。

编写低级语言来显式控制计算机-考虑机器代码和汇编代码。

高级语言尝试抽象出所有细节(尤其是内存分配和内存释放)。这个想法是为编程提供一个更“自然”的界面,并希望程序员能够专注于设计和生产。

这些天,C被视为一种低级语言。它仍然具有一些来自机器代码和汇编代码的重要抽象,因此从技术上讲,它们比这些更高。但是,它仍然提供直接的内存寻址,并且不提供垃圾回收。因此,这些是程序员必须设计的细节。

将此与其他语言(例如Python,Ruby或Haskell)进行比较,您会获得更加模糊的界面。这些语言具有大量的代码库,这些代码库抽象了大多数计算机命令。有没有想过当您离开函数的局部范围或删除它时,Python中的变量会发生什么?可能不是吗?那是因为您不必使用高级语言!他们为您照顾内存分配/释放。

高级语言具有功能的优势。它们使我们能够自由(安全地)设计和开发。

在大多数情况下,低级语言具有速度优势。解释高级代码是有代价的。另外,用“计算机速写”编写内容也很酷。

希望这可以帮助


5

高级别与低级别的关系不是黑白的,而是连续的规模。这些术语用于描述编程语言与硬件的距离。级别越高,则越抽象出硬件。

最低级别显然是二进制机器代码-它是OS加载并馈送给CPU的确切表示。汇编是在其之上构建的第一级抽象:代替二进制代码,人们写出代表二进制机器指令的助记符,人类可读的符号代码。这就是人们在UNIX之前用于系统编程的东西。

C是抽象链中的下一个步骤,它将通用模式绑定到流控制结构中,并将特定于机器的指令抽象到与平台无关的语法中,而最后的抽象是使UNIX既革命性又非常成功的主要因素之一,因为这意味着相同的代码可以在任何平台上进行编译而无需任何重大更改。

C ++增加了另一层抽象:它增加了类(将vtable和上下文抽象到OOP语法中)newdelete(将内存分配和变量初始化捆绑到单个结构中),编译时类型检查,模板(类型安全编译时)元编程),以及大量的编译时语法便利,例如名称空间,函数和运算符重载等。

Python向硬件迈出了又一大步。C ++仍使程序员能够完全控制内存分配,并允许直接操作RAM。Python为您处理内存管理。另外,它不是将代码编译为全机指令,而是针对虚拟机运行它。这会带来性能上的损失(有时可能会很沉重,但通常不必担心),但是它也允许在C ++中棘手而在C中难以完成的整洁事情,例如在运行时操作函数和类。时间,在运行时获取任意对象的名称,在运行时按名称实例化类,猴子修补等。

因此,当人们将语言分为“高级”和“低级”两种语言时,他们会在某处画一条任意的线,并且该线并不总是相同的。1970年,这条线位于汇编和C语言之间(决定性的因素是删除特定于平台的机器指令)。在1987年,它可能介于C和C ++之间。今天,它可能在C ++和Java之间(以自动内存管理为决定性因素)。

长话短说:高水平是一个可缩放的尺度,对于您提到的三种语言,它是C <C ++ <Python。


我会说高级与低级不是一个尺度,而是两个独立的尺度。低级与语言与机器行为的关联程度有关,而高级与语言提供抽象的能力有关。C#比C99更高级,但比C标准定义的语言低,这是因为C#的行为是,例如使用“ int”指针在数组2处处理“ short”值。时间在C#中定义,但在C99中未定义。
超级猫

3

“低级”和“高级”语言之间的界线不时变化。
例如:
在UNIX时代,C是一种高级语言。
如今,C没有像当今的高级语言(如Python)那样具有诸如映射类型(字典),迭代器等的结构。因此,路线发生了变化,C现在属于低级别组。

低级语言:
这些语言与机器可以执行的语言“接近”(最低级是:汇编代码!)。
在使用这些语言时,程序员必须考虑最低级别的东西,例如内存管理。在这种意义上,您与硬件非常接近,因此必须直接使用它。

高级语言:
这些语言使您脱离硬件,因为它们自己管理诸如内存之类的事情。当使用这些语言时,内存是一个因素(显然),但是您不能直接使用硬件。而是由语言来管理,使您远离(可能更高)较低的硬件界面。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.