当前C被认为是一种低级语言,但是在70年代,它被认为是低级语言吗?那么,该术语是否还在使用?
许多流行的高级语言直到80年代中期及以后才出现,所以我很好奇这些年来低级语言的性质是否以及如何发生了变化。
当前C被认为是一种低级语言,但是在70年代,它被认为是低级语言吗?那么,该术语是否还在使用?
许多流行的高级语言直到80年代中期及以后才出现,所以我很好奇这些年来低级语言的性质是否以及如何发生了变化。
Answers:
要回答该问题的历史方面:
Brian Kernighan和C设计师Dennis Ritchie编写的《 C编程语言》(您可能听说过的“ K&R” )中解释了该设计原理。第一版的序言说
C不是一种“非常高级”的语言,也不是一种“大”的语言。
引言说
C是一种相对“低级”的语言... C没有提供直接处理复合对象(例如字符串,集合,列表或数组)的操作。没有可以操作整个数组或字符串的操作...
在文本继续之前,该列表会持续一段时间:
尽管缺少其中某些功能似乎是一个严重的缺陷,但是……将语言缩小到适中的大小确实有好处。
(我只有1988年的第二版,但是下面的注释表明所引用的文本与1978年的第一版相同。)
因此,是的,当时使用的术语是“高电平”和“低电平”,但是C被设计为介于两者之间。可以用C语言编写可跨硬件平台移植的代码,这是当时是否将该语言视为高级语言的主要标准。但是,C缺少一些高级语言所特有的功能,因此这是设计的一种简化决定。
这取决于您对高级和低级语言的定义。在开发C时,任何比汇编语言都高级的语言都被视为高级语言。这是一个需要清除的低门槛。后来,该术语转移到了如今有些人甚至将Java都视为低级语言的地步。
即使在70年代的高级语言环境中,也要指出C是相当低的水平。C语言基本上是B加一个简单的类型系统,并且B只是方便的用于汇编的过程/结构化语法层。由于类型系统是对无类型B语言的改型,因此您仍然可以在某些地方省略类型注释,并且int
将被假定。
C有意识地省去了当时已经建立的昂贵或难以实现的功能,例如
C确实具有一些有趣的功能:
在开发C的时候,其他创新语言,例如COBOL,Lisp,ALGOL(各种方言),PL / I,SNOBL,Simula和Pascal已被发布和/或广泛用于特定的问题领域。但是,这些现有的语言中大多数都是用于大型机编程的,或者是学术研究项目。例如,当ALGOL-60最初被设计为通用编程语言时,实现它所需的技术和计算机科学还不存在。其中一些(某些ALGOL方言,PL / I,Pascal)也旨在用于低级编程,但它们往往具有更复杂的编译器或过于安全(例如,没有无限制的指针)。Pascal特别缺乏对可变长度数组的良好支持。
与那些语言相比,C拒绝了“优雅”且昂贵的功能,以便对低级开发更加实用。C从来不是一个主要的语言设计研究项目。相反,它是在资源有限的PDP-11小型计算机上Unix内核开发的分支。对于其利基市场(使用易于移植的单遍编译器编写Unix的极简主义低级语言),C绝对出色–超过45年后,它仍然是系统编程的通用语言。
%r10
为“静态链指针”,这正是您在说的。对于C来说,这只是另一个调用过多的暂存器,但我想Pascal会使用它。(当此类函数未内联时,GNU C嵌套函数将其用于将指针传递给外部范围(例如,如果创建指向它的函数指针,以便编译器在堆栈上创建机器代码的蹦床):常规的可接受性r10和r11的使用)
a = b;
像在ISO C89中那样编写复制整个结构。因此,在早期的C语言中,用户定义的类型绝对是第二类,只能通过引用作为函数args传递。 C对数组的厌恶,以及 为什么C ++支持在结构中对数组进行成员分配,但通常不支持?
在1970年代初期,使用现代结构有效地使C充满了新鲜的空气,以至于整个UNIX系统可以从汇编语言重写为C,而空间或性能的损失却微不足道。当时,许多当代人将其称为高级语言。
C的作者,主要是Dennis Ritchie,更为谨慎,在《贝尔系统技术期刊》上的文章中说:“ C不是一种非常高级的语言。” 丹尼斯·里奇带着一丝不苟的笑容,想要挑衅,会说这是一种低级的语言。他对C的设计目标中的首要目标是使语言与机器保持紧密联系,同时提供可移植性,即机器独立性。
有关更多信息,请参阅原始的BSTJ文章:
谢谢丹尼斯。愿你安息。
正如我在该网站上的其他地方所写的,当有人将malloc / free内存管理模式称为“低级编程”时,
有趣的是,“低级”的定义如何随时间变化。当我第一次学习编程时,提供标准化堆模型(使简单的分配/释放模式成为可能)的任何语言实际上都被认为是高级的。在低级编程中,您必须自己跟踪内存(不是分配,而是内存位置本身!),或者如果您真的很喜欢,请编写自己的堆分配器。
就上下文而言,这是在90年代初期,即C语言问世之后。
许多答案已经提到早期文章,这些文章都说“ C不是高级语言”之类的东西。
但是我无法抗拒:当时有很多(如果不是全部或全部)HLL-Algol,Algol-60,PL / 1,Pascal-提供了数组边界检查和数字溢出检测。
最后,我检查了缓冲区,整数溢出是许多安全漏洞的根本原因。是的,仍然如此
动态内存管理的情况更为复杂,但是,就安全性而言,C风格的malloc / free仍然是一大步。
因此,如果您对HLL的定义包括“自动防止许多低级错误”,那么,如果没有发生C和UNIX,网络安全的遗憾状态将大为不同,可能更好。
popcnt
。
考虑早于C(1972)的旧语言和高级语言:
Fortran-1957年(不比C高很多)
Lisp-1958年
Cobol-1959年
Fortran IV-1961年(级别不比C高很多)
PL / 1-1964年
APL-1966
再加上类似RPG(1959)的中级语言,主要是一种编程语言,以取代基于插件的单位记录系统。
从这个角度来看,C似乎是一种非常底层的语言,仅比当时大型机上使用的宏汇编程序高一点。在IBM大型机的情况下,汇编程序宏用于诸如BDAM(基本磁盘访问方法)之类的数据库访问,因为当时数据库接口尚未移植到Cobol,这导致了汇编和混合的遗留问题。今天,IBM大型机上仍在使用Cobol程序。
您问题的答案取决于它询问的是哪种C语言。
Dennis Ritchie的1974 C参考手册中描述的语言是一种低级语言,它为高级语言提供了一些编程上的便利。从该语言衍生的方言同样倾向于是低级编程语言。
但是,当1989/1990 C标准发布时,它并没有描述在编程实际机器时很流行的低级语言,而是描述了一种高级语言,该语言可以是-但不是必须的- -以较低级别的术语实现。
正如C标准的作者所指出的,使该语言有用的原因之一是,许多实现都可以被视为高级汇编器。由于C还被用作其他高级语言的替代,并且由于许多应用程序不需要执行高级语言无法完成的功能,因此该标准的作者允许实现以任意方式运行如果程序尝试使用低级构造。因此,C标准描述的语言从来都不是低级编程语言。
要了解这种区别,请考虑Ritchie的Language和C89如何查看代码片段:
struct foo { int x,y; float z; } *p;
...
p[3].y+=1;
在“ char”为8位,“ int”为16位big-endian,“ float”为32位且结构上没有特殊填充或对齐要求的平台上,因此“ struct foo”的大小为8个字节。
在Ritchie的语言中,最后一条语句的行为将采用存储在“ p”中的地址,向其添加3 * 8 + 2 [即26]个字节,然后从该地址处的字节中获取16位值,然后再取下一个,在该值上加一个,然后将该16位值写回相同的两个字节。该行为将被定义为对地址p处的第26和27个字节进行操作,而不考虑存储在此处的对象的种类。
在C标准定义的语言中,如果* p标识“ struct foo []”的元素,然后至少还有三个该类型的完整元素,则最后一条语句将为的成员y添加一个* p之后的第三个元素。在任何其他情况下,行为都不会由标准定义。
Ritchie的语言是一种低级编程语言,因为尽管它允许程序员在方便时使用数组和结构之类的抽象,但它根据对象在内存中的底层布局定义了行为。相比之下,C89和更高版本标准描述的语言以更高级别的抽象来定义事物,并且仅定义与此一致的代码的行为。适用于低级编程的高质量实现在比标准所要求的更多的情况下将发挥更大的作用,但是没有“官方”文档指定实现必须适合这种目的的措施。
因此,由丹尼斯·里奇(Dennis Ritchie)发明的C语言是一种低级语言,因此被认为是这种语言。但是,在缺乏实施提供的超出标准职责范围的保证的情况下,C标准委员会发明的语言从来都不是低级语言。