Memory 带手动内存管理的解释语言?

Memory 带手动内存管理的解释语言?,memory,memory-management,programming-languages,interpreter,Memory,Memory Management,Programming Languages,Interpreter,哪些解释语言无指针语言(即:Python、Java、Perl、PHP、Ruby、Javascript等)具有手动内存管理功能?我想不起来有没有听说过 解释语言的主要关注点不是垃圾收集的不确定性延迟(或当没有足够的延迟时的空间复杂性)吗?那么,为什么不直接编写类似Java的东西,而是强制您手动释放内存呢 编辑 我所说的手动内存管理的意思是,该语言将具有对对象的引用,并且您可以使用引用删除该对象 例如: Object a = new Object(); // a is a reference to

哪些解释语言无指针语言(即:Python、Java、Perl、PHP、Ruby、Javascript等)具有手动内存管理功能?我想不起来有没有听说过

解释语言的主要关注点不是垃圾收集的不确定性延迟(或当没有足够的延迟时的空间复杂性)吗?那么,为什么不直接编写类似Java的东西,而是强制您手动释放内存呢

编辑

我所说的手动内存管理的意思是,该语言将具有对对象的引用,并且您可以使用引用删除该对象

例如:

Object a = new Object(); // a is a reference to the object
Object b = a; // b is a reference to the same object
a.method(); // fine
delete b; // delete the object referenced by b
a.method(); // null dereference exception

那么,像本例这样的语言中可能存在哪些警告(内存泄漏除外?

原因是循环引用、空指针异常和多个引用。一个简单的例子:

var a = new Object();
var b = a;
a = null;//or delete a or free a or whatever;
print(b);//what now? is b null? or is b still new Object()?
如果在上面的示例中,
b
现在为空,那么在重新定义变量时会出现一些主要问题。例如,与其将
a
设置为null,不如将其设置为
c
b
也是
c


你可以阅读其他问题,比如

解释的不一定意味着垃圾收集。Perl、Tcl、Python等。我相信它们都使用简单的引用计数,因此内存回收是确定的,尽管一点也不透明(是否在Perl程序上尝试过strace?。

在一些高性能解释语言中,例如,您可以手动处理垃圾收集。请参阅。

具有可通过遗忘释放的堆叠内存区域。

有一些C/C++解释器可用,例如


我没有亲自尝试过,但我认为,由于它声称与已编译的C/C++兼容,它需要“手动”内存管理。

Python的API通常允许打开或关闭延迟垃圾收集- 检查标准库“gc”模块的文档:


但与静态语言相比,这并不是它慢的原因——数据本身的动态性质是造成速度差异的主要原因。

因此,回答这部分问题:

主要的问题不是 口译语言 非确定性延迟(或空间延迟) 不够时的复杂性 垃圾收集的延迟时间?那为什么呢 不只是写一些完全一样的东西 Java,但会强制释放内存 手动

这可能是某些系统的一个问题。对于其他系统来说,这并不是什么问题。运行垃圾回收的软件可以比只调用malloc的系统更快地分配内存。当然,您最终会在GC时间支付时间

以一个基于web的系统为例。您可以在处理请求期间分配所有内存,然后GC可以收集。结果可能不是这样,但你明白了

垃圾收集有很多不同的策略。哪种策略最适合系统将取决于需求。但是,即使你需要绝对决定论,你也可以使用以下方法:

哪些解释语言有手动内存管理?我想不起来有没有听说过

没有解释语言这样的东西。语言既不编译也不解释。一门语言就是这样。语言是一组抽象的数学规则。解释或编译是语言实现的特征,它们与语言无关。每种语言都可以由编译器或解释器实现;大多数现代高性能语言实现实际上都使用这两种语言,并根据在特定上下文中哪种语言更快而在它们之间切换

C是一种编译语言吗?那里有C口译员。Python是一种解释语言吗?当前所有8个Python实现都使用编译器

<> P>因此,由于每种语言都有解释性的实现,C和C++是具有手动内存管理的解释语言的例子。(这不仅仅是一个理论性的分裂竞赛,实际上有C和C++解释器。VxWorks实时操作系统甚至包含内核中的一个权限,NASA曾经使用这个解释器来修复航天器上的一个BUG内核模块。) 另一个例子是从1958年开始的Lisp的第一个版本:它有手动内存管理(基于引用计数),但仅仅几个月后,它就被一个自动内存管理的版本所取代,从那时起它就一直在使用这个版本。尽管同样,任何语言都可以通过编译器或解释器实现,所以我不知道该版本是有解释实现还是有编译实现。(事实上,我不确定它是否得到了实施。)


如果您稍微放松一下您的标准,并意识到内存管理只是一般资源管理的一个特例,那么您将发现几乎所有的语言,不管您想称它们为编译或解释的语言,还是完全其他的语言,都至少对某种资源有某种形式的手动资源管理(文件句柄、数据库连接、网络连接、缓存等)。

问题背后的前提有点狡猾:

  • 内存模型是语言的属性,而不是它的实现

  • 被解释是实现的属性,而不是语言

示例:

  • 编程语言方案具有自动内存管理功能,它有几十种解释实现,但也有一些优秀的本机代码编译器,包括盗窃、Gambit和PLT方案(其中包括进行无缝转换的解释器和JIT编译器)

  • 编程语言Haskell具有自动内存管理功能;两种最著名的