我的理解是,它意味着一个可能可以编写程序正式证明这一程序编写的,在一个静态语言将是免费的,一定(小)的子集的缺陷。

我的问题如下:

假设我们有两个图灵完整的语言,A和B。一个被推定为'类安全'和'B'是推定不可能的。假设我给出一个程序,我以检查的正确性的任何程序编写A.是什么阻止我翻译的任何程序写入在B一,施加L.如果P意味着从A至B,然后为什么不PL一个有效类型的检查的任何程序写入在B?

我是受过训练的代数和我才刚刚开始研究CS因此可能有一些明显的原因,这并不能工作但我很想知道。这整个'类安全'的事情已经闻到一股鱼腥给我一段时间。

有帮助吗?

解决方案

让你灵-完整的语言,它应该是静态型的,让一个是语言,你从一个当删除的类型检查(但不是那种注释,因为他们也服务于其他目的)。接受程序的一个将是一个子集的接受程序的一个'.因此,在特定的,也将是图灵完成。

给你翻译P从B至(反之亦然)。什么是它应该做的?它可以做两种情况之一:

  1. 首先,它可以翻译的每一个程序y B的程序。在这种情况下,LPy会总是返回的真实程序的一个定义的正确类型。

  2. 第二,P能翻译的每一个程序y B程序的A'。在这种情况下,LPy会回真的,如果Py发生程序的一个假如果没有。

作为第一种情况下不会产生什么有趣的东西,让我们坚持的第二种情况下,这可能是你是什么意思。不能LP定义上的项目B,告诉我们什么有趣的有关方案B?我说没有,因为它不是不变的下一个改变的作为一个是图灵完成,即使在第二种情况下P能选择,以便其形象发生在谎言中A.然后LP会不断正确的。另一方面,P能够选择一些方案是映射到补充的,在一个'.在这种情况下LP会吐出虚假的一些(可能是所有的)的程序。正如你可以看到,你没有得到任何事情,这仅取决于y.

我也可以把它放更多的数学的方式如下:有一个C类的编程语言,其对象编程语言和其态射是笔译员从一种编程语言到另一个。特别是,如果有一个态射P:X->Y,Y至少为表现为X。每个之间的对图灵完整的语言,有的态射两个方向。对每个对象X C(即对于每种编程语言),我们有一个相关的设置,说{X}(糟糕的符号,我知道)的那些部分规定的职能,可以计算的通过程序。每态射P:X->Y然后诱导一个包容{X}->{Y}套。让我们正式转化的所有这些态射P:X->Y诱使的身份{X}->{Y}.我会打电话的所得类别(其是,在数学方面,本地化的C)C'。现在列入A->的一个'是一个态射在C'。然而,这不是保存在构的',即态射了一个'不是一个固定不变的'C'.换句话说:从这个抽象的观点看属性"静态类型的"不可定义和可以任意地连接到一种语言。

让我点更明确的也可以想到的C'作为类别,也就是说,几何形状在三维空间与欧几里德的动议作态射.A'和B,然后两个几何形状和P和Q都是欧氏的运动带来的B',反之亦然。例如,A和B可能是两个领域。现在让我们修正一点上的',其中应站的一个子集的A'。让我们叫这一点"静态型".我们想知道是否一点B的是静态的类型。因此,我们采取这一点y、地通过P到'和测试,它是否是我们的标记点在A'。作为一个可以容易地看到,这取决于所选择的地图P或者,换句话说:明显的一点上的一个领域是不保留的构(这是欧氏的运动,地球自身上)的领域。

其他提示

如果可以翻译的每个的B '为等效A(写在B中的程序)'(其是正确的,如果B”是),那么语言乙享有一样多“类型安全”作为一种语言的(在理论意义上的,当然;-) - 基本上,这将意味着B是这样,你可以做完美的类型推断。但是,这非常有限的动态语言 - 例如,考虑:

if userinput() = 'bah':
    thefun(23)
else:
    thefun('gotcha')

其中thefun(假设)为int参数类型安全,但不适合str参数。现在 - 你怎么摆在首位翻译这个语言A ...

另一种方式,使同一点作为已经是你的问题构成证据的矛盾之一:

  • 一个无法映射到B
  • 类型的安全不是一个词汇财产的一种语言

或两者。我的直觉说,后者可能是坚持一点:这类安全是一个元语言的财产。

有什么“腥”了。 ;)

在集图灵完全语言,其是类型安全相对于任何非平凡的[<强> 1 ]类型系统的Ť严格图灵完成语言的子集。这样,在一般情况下,没有翻译的 P -1 A 的存在;因此,无论是否有任何translator- 型检查工具的 LP -1

一个下意识到这种要求的反应可能是:无意义!这两个的A 的B'EM>是图灵完备的,所以我可以表达的在的任何的可计算函数或者语言!确实,这是正确的 - 你的可以的表达在两种语言的任何可计算函数;然而,很多时候,你也可以表达的相当多的的。具体地可以构造表达式,其指称语义没有明确定义的,例如那些可能愉快地尝试采取的字符串“foo”的和“bar”的算术和(这是<德尔> Chubsdad 亚历泰利的回答)。这些类型的表达式可以是“在”的语言的,但可以简单地不使用的语言表达的 A 的,这是因为指称语义是不确定的,因此不存在显方式将其转化。

这是静态类型的巨大优势之一:如果你的类型系统无法证明,在编译时,上述功能将接收任何参数,但那些其中,算术加法运算的结果是明确定义,它可以作为病类型的被拒绝。

请注意,尽管以上是通常的排序实例给出说明一个静态类型系统的优点,这也许是过于温和。通常,静态类型系统不必限于仅仅执行的参数类型正确性,但确实可以表达的任何其可以在编译时被证明的节目的期望的性质。例如,有可能构造一个内执行一个释放文件系统手柄约束(例如到数据库,文件,网络插座,)类型系统在其被获取的相同的范围。显然,这是在这样的域作为生命支持系统等,其中的可证的作为系统尽可能的多参数的正确性是绝对必要的非常有价值的。如果您满足静态类型系统,你可以得到这些种种证据的自由。

[<强> 1 ]通过非平凡,我的意思是使得并非所有可能的表达式是公键入。

我的理解是,这与编译时间与运行时间去做。在静态类型语言大多数类型检查期间编译时被执行。在动态类型的语言,其大部分类型检查在运行时被执行。

让我回答这个问题的另一种方式圆:

有两种不同类型的“动态”的节目。

一个是“动态类型”,这意味着你有某种外壳,您可以通过键入定义程序转变为外壳,认为它像Python的IDLE外壳。

在其它类型的动态编程的,是一个比较理论之一。动态程序,是一个可以改变自己的来源。它需要内射的某个程度,经常被用来在微控制器更改程序存储器。有时产生查找用于数字运算表被称为动态编程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top