C语言作为“低级”语言有多“低”?

时间:2011-02-16 18:00:16

标签: c programming-languages low-level

我们经常听说C是一种低级语言,但它有多低?我所知道的最低级别是使用指针的内存管理。我还有更进一步的发现水平吗? “靠近硬件”是什么意思? “接近硬件”的方式是C?

12 个答案:

答案 0 :(得分:24)

使用标准术语。高级语言和低级语言。

高级语言旨在方便编写语言的人。

低级语言旨在方便运行该语言的计算机。

C只是汇编语言的一步,它实际上是机器代码的人工翻译。它不会低于机器代码,但人们不能很好地读取十六进制,因此汇编被认为是最低级的编程语言。

大多数C操作可以转换为少于10个机器指令。有些可以翻译成单个机器指令(取决于许多情况)。相比之下,许多高级语言可能需要数十到数千台机器指令来实现特定操作。

语言的“级别”主要是抽象概念。除了在尝试理解您是否必须在一个或另一个中编写更多源代码,或者如果您将需要在一种语言中了解更多关于机器的体系结构的上下文中将一种语言与另一种语言进行比较之外,它没有多大用处。到另一个。

答案 1 :(得分:5)

C只不过是围绕ASM的程序包装器。一个好的C程序员,知道该语言背后的原因,应该能够查看代码片段并写出代码编译成的ASM。这些ASM指令可以1:1转换为二进制机器指令。它几乎比程序集高出一步,因此你可以编写C代码来完成计算机能够执行的任何操作,但是,处于如此低的水平,就你必须具体而言它是相对原始的。例如,内存被视为这样,而不是抽象成像“堆”这样的结构。用OO语言创建一个“新”对象就像这么简单;等效的C代码将涉及malloc,用于该对象的所有成员的大小之和,以及指向块中每个对象成员的指针。

答案 2 :(得分:5)

C有时被称为“可移植汇编语言”。基本上你可以在汇编中做任何事情,你可以在C中完成(通过内置于语言中的功能或通过内联汇编)。

答案 3 :(得分:3)

创建硬件(cpu,主板等)的人也提供其机器语言(汇编语言)。这成为最低级别的。然后其他人为C编写了一个编译器,它将C语法转换为该硬件的本机汇编语言(如果我错了,请纠正我)。使用C,您可以使用组件,因此达到最低级别!!

答案 4 :(得分:2)

'low'的定义有点困难,但C支持许多系统调用,gotos,甚至通过扩展组装混合。

答案 5 :(得分:2)

你可以在通用操作系统上管理的内存通常是virtual memory,所以它通常都是欺诈 - 你的C指针不包含物理内存地址,整个层都比这更深。

下面的内容要求你编写MMU,这在C中是不容易的,它通常需要一些非常依赖于架构的程序集,你的代码需要以某种形式的特权运行{{3} (正如OS内核那样)

可能还有其他mode或整个范围的co-processors可能很难直接在C中找到。

答案 6 :(得分:2)

您需要定义低级别的含义才能回答此问题。

C让你可以做一些你可以用装配做的事情,但不是一切。如果你想做一些奇怪/特殊/不寻常的事情,你可能需要使用汇编,虽然对于大多数(/ all?)真正的用途C会更加足够,假设你有一个很好的硬件编译器。


编辑:进一步阐述......

C不会保证它将被编译成汇编指令,只会给出一些关于对象的部分指示将被分配到内存中。

一般情况下如果你需要以特定的方式在内存中有东西,如果你需要运行一个特定的汇编指令序列,你可能不得不使用其他语言(可能直接汇编),否则<强>一般 C会好的。

当然,我们可以找到尽可能多的特殊情况:如果你有一些特殊的装配操作可以让你做一些花哨的高级东西,那么C很可能无法利用这些

C一直被认为会替换 normal 上的程序集(也许我可以说是通用)处理器,它在具有本机功能组件的处理器上不太理想,或者在许多其他情况下。


你不能只说“C级是多少?”,你需要做相反的事情:定义你需要什么样的低级别,然后看看C是否能够做到。< / p>

答案 7 :(得分:1)

register怎么样?局部变量声明中的关键字,要求编译器将其存储在CPU寄存器中 - 尽管它可能会忽略您的建议。

然而,GNU C将此扩展到您可以指定您想要使用的特定寄存器的位置!

register int foo asm ("a5");

答案 8 :(得分:1)

在一些边缘情况下,C掩盖的主要内容是,它在某种程度上模糊了任何东西。我在汇编中写的唯一不能很好地转换为C的东西涉及在任意点跳入代码块,让它从该位置执行,定期检查某个状态条件并在找到需要时存储当前的程序位置在某处并退出。然后下一次,我跳回到与最后退出的代码块相同的位置。合作协程,我想你会打电话给他们。

C解决方案是使用两个独立的线程,通过信号量进行通信。但是线程不是C语言本身的一部分。

答案 9 :(得分:1)

今天的C在很多情况下被用作“可移植的汇编语言”,因为语言的语义几乎只是底层机器架构之上的一个薄薄的单板。

过去,查看C代码行很简单,并且很清楚C代码将生成的实际机器语言是什么。

当完整地与其周围的开发环境一起使用时,可以直接完全控制数据结构的内存布局和整体内存布局。请注意,这种C代码作为一个整体是不可移植的,因为它依赖于C标准允许灵活和基于实现的编译器的实现细节。但在大的情况下,C代码本身可以是最便携的。这种语言的一个方面是导致它在Unix等系统中的流行,它允许大部分操作系统可以跨机器移植,而实现的实现特定方面尽可能少,例如汇编语言。 / p>

今天,通过现代编译器及其优化,C可以减少文字。您在C代码中看到的内容可能无法从字面上翻译成您在程序集中获得的内容,因为编译器进行了实际的优化。

一个简单的人为例子就是:

int func(int a, int b) {
    int c;
    int d;

    d = 10;
    return a * d;
}

在一个简单的编译器中,一个实现可能会在堆栈上分配4个int,为参数分配2个,在工作变量中分配2个。一个明显的优化是根本不分配'c'变量,因为它是未使用的。进一步的优化是忽略'd',并简单地使用常量10.甚至更聪明的编译器也可以很好地看到如何使用这个函数并在调用函数中自动内联它,完全消除了子程序调用。

因此,一方面,您可以看到代码并说“这就是它在装配中的样子”,因此将其视为装配顶部的低级包装器。另一方面,你可以改变现代编译器的优化,使它们不那么直观,从而保持你在代码中表达的语义,如果不是实际完美的实现。

答案 10 :(得分:1)

我所说的低级别是每个人在说C是低级语言时的意思。如果我知道我不必问这个问题。 - ecounysis 27秒前

这不是问题的样子。

如果你想知道的是“低级别”意味着什么,当他们这么说时,wiki会有你想读的文章。

http://en.wikipedia.org/wiki/Low-level_programming_language

http://en.wikipedia.org/wiki/High-level_programming_language

当他们说C是一种低级语言时,他们并没有谈论任何学位。语言是更高级别还是低级别。它们是两种不同的类型或类别。

答案 11 :(得分:-2)

你问这个问题的事实表达了你对这个主题的天真。 这不是那么简单。

最后 - C没有完全灵活的汇编语言,但它很接近。 它缺少诸如Tail Recursion

之类的功能

但是在大​​多数情况下,C会做你可能需要的一切 -