旧语言(如Fortran(Fortran-90之前的版本)、cobol或pascal)中是否有指针使用?如果没有,那这些语言是如何实现指针在今天高级语言中所使用的功能的呢?
而且由于Java中不存在指针,是否有其他方式来复制指针所完成的工作呢?
旧语言(如Fortran(Fortran-90之前的版本)、cobol或pascal)中是否有指针使用?如果没有,那这些语言是如何实现指针在今天高级语言中所使用的功能的呢?
而且由于Java中不存在指针,是否有其他方式来复制指针所完成的工作呢?
Algol 68有类似于C/C++指针的引用。
Pascal有指针,但不能对其进行算术运算。
PL/I有指针。
在FORTRAN和COBOL中,你大多数情况下都没有像语言中写的动态分配这样的东西。我曾经在FORTRAN中编写过一些使用数组的链表代码,其中数组索引作为“下一个”项的链接(即x[1]是数据项,x[2]是其链接到下一个数据项,x[3]是另一个数据项,依此类推)。称之为“笨拙”几乎是过于慷慨了。
x[1]
是一个数据项,x[x[1]]
是下一个项,x[x[x[1]]]
是第三个项。我认为这就是FAT文件系统查找簇链的方式。 - Ben VoigtBCPL中有构造 a*[b]
(在我们的实现中可以简化为 a!b
,这是一个运行在3B2 UNIX系统上的6809嵌入式系统编译器),它相当于C语言中的 a[b]
。当然,BCPL只有单词的概念,没有C语言中更多的结构等功能。
a!b
是从单词地址偏移的单词偏移量,但我们使用的实现还提供了选项,可以从单词地址的字节偏移 a!%b
和从字节地址的字节偏移 a%%b
。
v*[42]
访问向量的元素。 - Christopha!b
在我们的实现中也必须是一个扩展(就像 !%
和 %%
一样)。因为那是我唯一使用过的 BCPL,所以我认为它是基本语言的一部分。已调整答案以反映这一点。 - paxdiablo假设C代码有以下结构体:
struct datastruct { int ival; float fval; } data[100];
Fortran映射使用了一个公共块(我不确定格式是否正确,我的Fortran 66已经非常陈旧):
COMMON /DATASTRUCT/ IVAL(100), FVAL(100)
C中的一个函数只需要接收一个指向结构体的指针,无需知道该结构体是来自数组还是malloc'ed或其他什么:
float func(struct datastruct *sp) { return sp->ival * sp->fval; }
当映射到Fortran 66时,“结构体”都只是包含在公共块中的数组索引:
FUNCTION FUNC(INDEX)
COMMON /DATASTRUCT/ IVAL(100), FVAL(100)
RETURN IVAL(INDEX) * FVAL(INDEX)
虽然不像指针那样优雅,但在当年的CDC 7600上完成了工作。
Lisp是一种在1950年代发明的语言,具有指针。实际上,在Lisp中,指针是数据管理的核心。"Lisp"是"List Processor"的缩写,而列表是(也是)Lisp中的链接列表。这可能是最早使用指针作为构建块的语言之一。
在大多数Lisp方言中,列表元素由两个项目组成。一个是原始数据元素,如数字,或指向此元素的最年长子项的指针。第二个元素是指向此元素的下一个兄弟的指针。可以从这些元素构建任意复杂度的树形或图形结构。
Lisp的第一个实现都具有自动垃圾收集功能。
p^
,你可以通过数组和索引完成所有操作。无法抵制,所以进行编辑:正如所有真正的程序员所知道的那样,唯一有用的数据结构是数组。字符串、列表、结构体、集合——这些都是数组的特例,可以同样轻松地进行处理,而不会在编程语言中引入各种复杂性。高级数据类型最糟糕的事情就是你必须声明它们。 - bestsss