什么是具有动态范围和静态类型的编程语言?

Ade*_*del 6 static scope programming-languages dynamic

我知道语言存在,但我不能把手指放在上面.

动态范围和静态类型?

rua*_*akh 1

我们可以尝试推理这样的语言可能是什么样子。显然,这样的事情(使用类似 C 的语法用于演示目的)是不允许的,或者至少没有明显的含义:

int x_plus_(int y) {
    return x + y;        // requires that x have type int
}

int three_plus_(int y) {
    double x = 3.0;
    return x_plus_(y);   // calls x_plus_ when x has type double
}
Run Code Online (Sandbox Code Playgroud)

那么,如何避免这种情况呢?

我可以立即想到一些方法:

  1. 上面的评论者提到 77 年之前的 Fortran 有这种行为。这是有效的,因为变量的名称决定了它的类型;像上面这样的函数x_plus_是非法的,因为x永远不可能有整数类型。(同样地three_plus_,就这一点而言,因为y会有相同的限制。)整数变量的名称必须以i, j, k, l, m, 或开头n

  2. Perl 使用语法来区分几大类变量,即标量、数组(常规数组)和散列(关联数组)。属于不同类别的变量可以具有完全相同的名称,因为语法区分了所指的变量。例如,表达式foo $foo, $foo[0], $foo{'foo'}涉及函数foo、标量$foo、数组@foo$foo[0]的第一个元素@foo)和散列%foo(对应于键 的$foo{'foo'}值)。现在,要非常清楚的是,Perl 不是静态类型的,因为有许多不同的标量类型,并且这些类型在语法上没有区别。(特别是:所有引用都是标量,甚至是对函数、数组或散列的引用。因此,如果您使用语法取消对数组的引用,Perl 必须在运行时检查该值是否确实是数组引用。 )但是同样的方法也可以用于真正的类型系统,特别是当类型系统非常简单时。使用这种方法,该方法将使用 of类型,并且完全忽略by 声明。(相反,它将使用必须从称为 的任何范围提供的of 类型。)这可能需要上面未包含的一些类型注释,或者它可以使用某种形式的类型推断。%foo'foo'x_plus_xintxthree_plus_xintthree_plus_

  3. 函数的签名可以指示它使用的非局部变量及其预期类型。在上面的示例中,x_plus_将具有签名“采用类型 的一个参数;使用类型 的int调用范围;返回类型的值”。然后,就像调用的函数必须传入 type 的参数一样,它也必须提供一个名为type 的变量- 要么通过声明它本身,要么通过继承类型签名的该部分(因为调用相当于使用of 类型) 并将此要求传播给调用者。使用这种方法,上面的函数将是非法的,因为它会违反它调用的方法的签名- 就像它试图传递 a作为其参数一样。xintintx_plus_intxintx_plus_xintthree_plus_x_plus_double

  4. 以上可能只是“未定义的行为”;编译器不必显式地检测和拒绝它,但规范不会对其处理方式施加任何特定要求。程序员有责任确保他们永远不会调用带有错误类型的非局部变量的函数。

您的教授可能正在考虑#1,因为 77 年之前的 Fortran 是一种具有此属性的真实世界语言。但其他方法值得思考。:-)