代码之家  ›  专栏  ›  技术社区  ›  Jason Kresowaty

管理语言和运行时的未来保护

  •  2
  • Jason Kresowaty  · 技术社区  · 15 年前

    将来,受管理的运行时是否会提供额外的保护,以防止微妙的数据损坏问题?

    托管的运行时(如Java和.NET CLR)减少或消除了许多类似于C语言的本地语言中常见的内存损坏错误的可能性。尽管如此,令人惊讶的是,他们并没有完全摆脱所有的记忆腐败问题。人们直观地期望一个方法能够验证其输入,没有错误,并且能够可靠地处理异常,它总是将对象从一个有效状态转换为另一个有效状态,但事实并非如此。(更准确地说,使用流行的编程约定并非如此——对象实现者需要竭尽全力避免我描述的问题。)

    考虑以下情况:

    1. 穿线。调用方可能与其他线程共享该对象并对其进行并发调用。如果对象不实现锁定,则字段可能已损坏。(可能——除非通知对象是线程安全的——否则运行时应该在每个方法调用上使用互锁,以便在同一对象上的任何方法在另一线程上同时执行时引发异常。这将是一个保护功能,与其他被广泛接受的托管运行时安全功能一样,它也有一定的成本。)

    2. 重新入院。方法对任意函数(如事件处理程序)进行调用,该函数最终调用对象上的方法,而该对象在该点上设计为不被调用。这甚至比线程安全更为棘手,许多类库都没有做到这一点。(更糟的是,众所周知类库很难记录允许重新进入的内容。)

    对于所有这些情况,可以说彻底的文档是一种解决方案。但是,文档还可以规定如何在非托管语言中分配和解除分配内存。根据经验(例如,内存分配),我们知道文档和语言/运行时强制之间的区别是日夜不停的。

    我们可以从未来的语言和运行时中期望什么来保护我们免受这些问题和其他类似的微妙问题的影响?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Reed Copsey    15 年前

    我认为语言和运行时将继续向前发展,不断从开发人员那里抽象出问题,并使我们的生活更容易和更有效率。

    以你的例子-线程。为了简化我们日常使用的线程模型,在.NET世界中有一些很好的新功能即将面世。 STM.NET 例如,最终可能会使共享状态更安全地处理。这个 parallel extensions 在.NET 4中,与当前技术相比,线程处理非常容易。

        2
  •  1
  •   Jon    15 年前

    我认为事务性内存对于解决其中一些问题是有希望的。我不确定这是否以某种方式回答了你的问题,但这在任何情况下都是一个有趣的话题:

    http://en.wikipedia.org/wiki/Software_transactional_memory

    大约一年前,有一集关于软件工程无线电的话题。

        3
  •  1
  •   Adam Goode    15 年前

    首先,“托管”有点用词不当:像ocaml、haskell和sml这样的语言在完全编译的同时实现了这样的保护和安全性。所有相关的“管理”都是通过静态分析在编译时进行的,这有助于优化和加快速度。

    无论如何,要回答您的问题:如果您查看像Erlang和Haskell这样的语言,那么状态在默认情况下是孤立的和不可变的。对于这种系统,线程和可重入性在默认情况下是安全的,而且由于您必须竭尽全力地打破这些规则,很明显可以看到哪里会出现不安全的代码。

    通过从安全默认值开始,但为高级不安全使用留出空间,您可以获得两个方面的最佳效果。根据您的定义,未来安全的系统也可能遵循其中的一些实践,这似乎是合理的。

        4
  •  0
  •   Brian    15 年前

    我们对未来有什么期待?

    没有什么。线程状态和可重入性不是我看到的工具/运行时解决的问题。相反,我认为未来人们将转向避免使用可变状态编程来绕过这些问题的样式。语言和库可以帮助使这些编程风格更具吸引力,但这些工具并不是解决方案——改变我们编写代码的方式就是解决方案。