PowerShell is definitely in the category of dynamic languages, but would it be considered strongly typed?
7 回答
围绕术语存在一定程度的混淆。本文解释了一种有用的类型系统分类法。
PowerShell 是动态的、隐式类型的:
> $x=100
> $x=dir
没有类型错误 - 变量可以在运行时更改其类型。这类似于Python、Perl、JavaScript但不同于C++、Java、C#等。
然而:
> [int]$x = 100
> $x = dir
Cannot convert "scripts-2.5" to "System.Int32".
因此,如果您愿意,它还支持显式键入变量。但是,类型检查是在运行时而不是编译时完成的,所以它不是静态类型的。
我看到有人说 PowerShell 使用类型推断(因为您不必声明变量的类型),但我认为这是错误的说法。类型推断是在编译时进行类型检查的系统的一项功能(如var
C# 中的“”)。PowerShell 仅在运行时检查类型,因此它可以检查实际值而不是进行推理。
但是,有一些自动类型转换正在进行:
> [int]$a = 1
> [string]$b = $a
> $b
1
> $b.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
所以有些类型是即时转换的。根据大多数定义,这将使 PowerShell 成为一种弱类型语言。它肯定比 Python 更弱,后者(几乎?)从不即时转换类型。但可能不像 Perl 那样弱,它可以根据需要转换几乎任何东西。
It can be if you need it to be.
Like so:
[1] » [int]$x = 5
[2] » $x
5
[3] » $x = 'haha'
Cannot convert value "haha" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:3
+ $x <<<< = 'haha'
[4] »
Use the [type] notation to indicate if you care about variables being strongly typed.
EDIT:
As edg pointed out, this doesn't prevent PowerShell from interpreting "5" as an integer, when executing (5 + "5"). I dug a little more, and according to Bruce Payette in Windows PowerShell in Action, PowerShell is actually a "type-promiscuous language." So, I guess, my answer is "sort of."
Technically it is a strongly typed language.
You can decline to declare types in the shell, allowing it to behave like a dynamic typed scripting language, but it will wrap weakly-typed objects in a wrapper of type "PsObject". By declaring objects using the "New-Object" syntax, objects are strongly typed and not wrappered.
$compilerParameters = New-Object System.CodeDom.Compiler.CompilerParameters
我认为您需要定义“强类型”的含义:
在计算机科学和计算机编程中,术语强类型用于描述编程语言对涉及具有不同数据类型的值的操作如何混合的一种或多种限制的情况。反义词是弱类型。然而,在计算的短暂历史中,这些术语被赋予了如此广泛的含义,以至于通常很难脱离上下文了解单个作者在使用它们时的含义。
——维基百科
我认为进一步研究将字符串添加到 Int 示例将为讨论工厂提供更多信息。什么被认为是动态类型转换?有人在其中一条评论中说,在这种情况下:
4 + "4"
"4"
变成Int32 。我根本不相信情况是这样的。相反,我相信中间步骤发生在命令更改为:
4 + [System.Convert]::ToInt32("4")
请注意,这意味着"4"
在整个过程中保持一个字符串。为了证明这一点,请考虑以下示例:
19# $foo = "4"
20# $foo.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
21# 4 + $foo
8
22# $foo.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PowerShell 是动态类型的,简单明了。它的创建者布鲁斯·帕耶特这样描述它。
此外,如果有人上过基本的编程语言理论课,他们就会知道这一点。仅仅因为有一个类型注释系统并不意味着它是强类型的。甚至类型注释的变量在强制转换期间也会动态地表现。任何允许您将字符串分配给变量并将其打印出来然后将数字分配给同一变量并使用它进行计算的语言都是动态类型的。
此外,PowerShell 是动态范围的(如果这里有人知道这意味着什么)。
我收回我之前的回答——引用如下。我应该说一些更细微的东西,比如:
PowerShell 具有强大的类型系统和强大的类型推断,并且是动态类型的。
在我看来,这里有几个问题在起作用,因此要求更好地定义“强类型语言”的含义的答案在他们解决问题的方法上可能更明智。
由于 PowerShell 跨越了许多边界,因此关于 PowerShell 所在位置的答案可能存在于由以下区域组成的维恩图中:
- 静态与动态类型检查
- 强类型与弱类型
- 安全与不安全打字
- 显式与隐式声明和推理
- 结构与主格类型系统
“PowerShell 是一种强类型语言。
但是,它只需要您声明存在歧义的类型。
如果它能够推断出一个类型,它就不需要你指定它。”