gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:10:25 26 4
gpt4 key购买 nike

我知道这种语言存在,但我无法理解它。

动态范围

静态类型?

最佳答案

我们可以尝试推理这种语言可能是什么样子。显然这样的事情(使用类似 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
}

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

我可以想到一些方法:
  • 上面的评论者提到 Fortran pre-'77 有这种行为。之所以有效,是因为变量的名称决定了它的类型;类似 x_plus_ 的函数以上是非法的,因为 x永远不可能有整数类型。 (同样,像 three_plus_ 这样的,因为 y 也有同样的限制。)整数变量的名称必须以 i 开头。 , j , k , l , m , 或 n .
  • Perl 使用语法来区分几大类变量,即标量与数组(常规数组)与散列(关联数组)。属于不同类别的变量可以具有完全相同的名称,因为语法会区分其含义。例如,表达式 foo $foo, $foo[0], $foo{'foo'}涉及函数foo ,标量 $foo , 数组 @foo ( $foo[0]@foo 的第一个元素),以及散列 %foo ( $foo{'foo'}%foo 中的值,对应于键 'foo' )。现在,要非常清楚,Perl 不是静态类型的,因为有许多不同的标量类型,而且这些类型在语法上没有区别。 (特别是:所有引用都是标量,甚至是对函数或数组或散列的引用。因此,如果您使用语法取消对数组的引用,Perl 必须在运行时检查该值是否真的是数组引用。 ) 但是同样的方法可以用于真正的类型系统,特别是如果类型系统是一个非常简单的系统。通过这种方法,x_plus_方法将使用 x类型 int ,并且会完全忽略 x声明人 three_plus_ . (相反,它将使用类型为 xint,必须从名为 three_plus_ 的任何范围提供。)这可能需要一些上面未包含的类型注释,或者它可以使用某种形式的类型推断。
  • 函数的签名可以指示它使用的非局部变量及其预期类型。在上面的例子中,x_plus_将具有签名“采用 int 类型的一个参数;使用 x 类型的调用范围 int ;返回 int 类型的值”。然后,就像调用 x_plus_ 的函数一样必须传入 int 类型的参数,它还必须提供一个名为 x 的变量类型 int — 要么声明它本身,要么继承类型签名的那部分(因为调用 x_plus_ 等效于使用 x 类型的 int )并将这个要求传播给它的调用者。通过这种方法,three_plus_上面的函数是非法的,因为它会违反 x_plus_ 的签名它调用的方法——就像它试图传递一个 double 一样作为其论据。
  • 以上可能只是“未定义的行为”;编译器不必明确检测和拒绝它,但规范不会对它必须如何处理它施加任何特定要求。程序员有责任确保他们永远不会调用具有错误类型的非局部变量的函数。

  • 您的教授大概在考虑 #1,因为 77 年前的 Fortran 是具有此属性的实际现实世界语言。但考虑其他方法很有趣。 :-)

    关于dynamic - 什么是具有动态范围和静态类型的编程语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4355972/

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