我只是想弄清楚什么时候是静态或动态类型的编程语言,或者同时是静态类型和动态类型的语言,还是动态类型和动态类型的语言。
我感到困惑的是,如果已知一种语言是静态类型的,而变量的类型是已知的或在编译时定义的,在Java的情况下,即
//Java illustration of statically typed
int x, y; //explicit type declaration
x = 5, y = 10; //Now we use the variables
//Groovy illustration of statically typed
def x, y //explicit type declaration
x = 1, y = 10 //now we use the variables根据阅读各种在线资源,它说,被认为是静态类型的语言列表不包括Groovy,而是Java和C++。
另外,如果Groovy是一种动态语言( DL - DL的定义是一种在编译时很少或根本不执行检查的语言,则在运行时执行检查)。这是否意味着Groovy也是一种动态类型的语言,因为对于被认为是动态类型的变量来说,“是在运行时而不是编译时知道变量的类型”。
//Illustration of a language being dynamically typed according to DT and DL definition
x = 5 //directly using the variable (exceptable in Python and PHP but not in Java/Groovy)如果这是Groovy中的情况,那么上面关于Groovy静态类型的代码说明与Groovy在运行时完成的检查定义相矛盾。
这是否意味着两种java groovy都不是动态类型语言,因为直接使用变量会在Java和groovy中抛出编译器错误。
如果我错了,请纠正我。请提供您的示例与代码说明。
发布于 2013-01-25 05:17:30
静态和动态类型主要描述变量(以及函数参数和返回值)的类型。在许多静态类型语言中,您必须声明变量的类型,以便编译器知道哪些操作是有效的,以及应该使用哪个重载版本的函数/运算符。一些现代静态类型语言(包括大多数函数式语言)具有类型推断,因此在大多数情况下,您不必声明变量的类型。但是,变量必须仍然具有固定的类型。如果你将不同类型的值赋给同一个变量,编译器要么拒绝编译,要么只允许你执行通用的操作。真正的强类型语言不能有与类型相关的运行时故障。
在动态类型语言中,变量只是一个名称。您可以将任何类型的值分配给任何变量,并且可以通过分配不同类型的值来更改类型。只能在执行语句时检查对变量的函数调用或操作的有效性。(您可以将这看作是将Java中的每个变量声明为Object,并在使用时将它们转换为所需的类型。当然,编译器不会尝试确定强制转换是否成功,而会插入可能导致运行时失败的强制转换检查。)
动态语言通常意味着放松编译器检查的大部分内容(语法可能是提前检查的唯一内容)。这通常意味着在必要之前不会验证变量的存在,甚至函数调用的有效性。他们通常使用动态类型,因为静态类型与松弛相反。
发布于 2013-01-25 04:35:55
注意,在Java中,您必须告诉它变量的完整类型。在您的示例中使用“in”。您可以说“float”或“Map”或“MyClassWithALongName”。
在Groovy中,您只是说'def‘来表示有一个变量,但是您没有告诉它内容类型。
https://stackoverflow.com/questions/14510184
复制相似问题