gpt4 book ai didi

memory - 具有手动内存管理功能的解释型语言?

转载 作者:IT王子 更新时间:2023-10-28 23:32:59 27 4
gpt4 key购买 nike

哪些解释型语言无指针语言(IE: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

那么像这个例子这样的语言可能有什么警告(除了内存泄漏)?

最佳答案

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

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

  • 例子:
  • 编程语言 Scheme 具有自动内存管理,它有许多解释实现,但也有一些很好的 native 代码编译器,包括 Larceny、Gambit 和 PLT Scheme(包括解释器和 JIT 编译器进行无缝转换)。
  • Haskell 编程语言具有自动内存管理功能;最著名的两个实现是解释器 HUGS 和编译器 GHC .还有其他几个令人尊敬的实现在编译为 native 代码 (yhc) 和解释 (Helium) 之间平均分配。
  • 编程语言 C 具有手动内存管理功能,虽然世界上到处都是 C 编译器,但我们这些年龄足以记住 1980 年代辉煌的人可能还记得 Saber-C 或 C-terp,这是两个非常有用的 MS-DOS C 解释器。

  • 尽管如此,您的问题背后有一个真实的观察:通常编译具有手动内存管理的语言。为什么?
  • 手动内存管理是一项遗留功能,通常用于与遗留代码兼容。传统语言通常足够成熟,可以使用 native 代码编译器。
  • 许多新语言是由实现定义的。构建解释器比构建编译器更容易。在解释器中实现简单的自动内存管理比在 native 代码编译器中实现高性能自动内存管理更容易。因此,如果语言从它的第一个实现中获得它的定义,自动内存管理与解释相关,因为在解释设置中,实现更容易。
  • 手动内存管理也(有时甚至是合理的)用于提高性能。 Ben Zorn 从 1990 年代开始的出色实验研究表明,自动内存管理与手动内存管理一样快或更快,但需要的内存大约是其两倍。因此,手动内存管理通常用于内存稀缺的非常小的设备,以及内存加倍昂贵的非常大的数据中心。 (它有时也被那些对内存管理不太了解但听说垃圾收集很慢的人使用。他们在 1980 年是对的。)当担心性能时,您通常会找到 native 代码编译器而不是比翻译。

    一些真正有趣的异常(exception)也来自这个原则。例如,FORTH 和最初的 PostScript 实现都被设计为在内存资源稀缺但计算时间不是一个因素的小型嵌入式设备(望远镜和打印机)上运行。这两种语言最初都是使用比 native 代码更紧凑的字节码来实现的,并且都具有手动内存管理功能。所以:具有手动内存管理的解释器。 (更高版本的 PostScript 添加了垃圾回收选项。)

  • 总之:
  • 自动与手动内存管理是语言 .
  • 编译与解释是实现 .
  • 原则上这两个选择可以并且是正交的 ,但出于实用的工程原因 自动内存管理经常与解释相关 .

  • Isn't the major concern about interpreted languages the non-deterministic delays (or space complexity when there isn't enough delay) of garbage collection?



    我不知道对编程语言的解释性实现有一个主要的关注。按照字母顺序,Lua、Perl、PostScript、Python 和 Ruby 都非常成功,而 Icon、Scheme 和 Squeak Smalltalk 则是中等成功。唯一会引起不可预测延迟的领域是硬实时计算,例如控制汽车刹车的 ABS 系统(如果您驾驶的是一辆足够漂亮的汽车)。

    编辑问题后添加的注释:您将“解释”更改为“无指针”。但是你在评论中说你的意思是用 new 询问语言和 delete .任何带有 new 的语言和 delete有指针:根据定义,不管 new返回是一个指针。 (在某些语言中,可能还有其他的指针来源。)所以我认为你的意思是“没有指针算术和没有地址运算符的语言”。

    关于memory - 具有手动内存管理功能的解释型语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2133922/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com