2011-12-15 31 views
4

我正在研究创建一种编程语言。我想知道的是,在包含引用类构造的语言中,没有新的/ malloc操作符是否可行?也就是说,所有变量都存储在堆栈的某个地方,或者是静态分配的。通用编程语言没有堆是可行的吗?

这个想法是,你会得到更好的类型安全,以及没有垃圾收集器的“免费垃圾收集”。

我不熟悉太多的脚本语言,所以如果已经有这样做,请随时指出。

(动态/未知大小的数据结构,将通过动态列表结构,这将是对堆处理(明显),用户的背后进行处理。)

+1

我不知道你到底在想什么。你提出的语言如何处理,比如说创建一个数组并返回一个引用的函数?如果不在堆栈上,应该在哪里分配数组?另外,如果您仍然将未知大小的对象放入堆中的“动态列表”中,我看不到如何解决垃圾回收的问题。 – sepp2k 2011-12-15 20:43:17

+0

函数不会创建数组并返回引用。数组必须由调用函数创建。另外,动态列表中的对象必须具有已知的大小。 – Dan 2011-12-16 17:39:36

回答

-1

有一个在所有没有要求你绝对必须实现一个堆栈或堆。例如,C也没有指定堆栈。事实上,在许多语言中你甚至不需要关心,你只需指定实现(编译器,解释或其他)来为变量腾出空间,或许需要多长时间。

你的语言的翻译(假设一个)可以做int main(void) { char memory[1048576]; run_script_from_stdin_using(memory); }。你甚至可以调用mmap(2)来获取匿名内存块,并用它来存储变量。对象的存在位置并不重要,并且堆栈/堆是具有可疑含义的术语,因为它们通常是可以互换的。

0

如果您知道在方法终止后不会引用它们,则可以在堆栈上分配对象。这意味着,该对象仅用于该方法(例如,临时对象),或者仅用于由嵌套调用产生的方法。但这是一个严格的限制。虽然有一些动态优化朝着这个方向发展(至少优化了临时对象)。你可能可能有一个静态检查机制来强制执行此限制,或者可能区分具有类型的堆和堆栈对象...

2

Fortran始终相当“通用”语言,但它不支持任何类型的一个动态内存分配开箱即用。

通常的做法是静态分配一个大数组,并在其上模拟您自己的内存管理。

如果一种摆脱GC和手动内存管理的方式正是您所需要的,那么region analysis可以提供帮助,但仅限于少数特定情况。