PowerShell是一种强类型语言吗?

时间:2008-09-22 15:43:53

标签: powershell strong-typing

PowerShell肯定属于动态语言类别,但是它会被认为是强类型吗?

7 个答案:

答案 0 :(得分:20)

terminlogy周围存在一定程度的混淆。 This article解释了类型系统的有用分类。

PowerShell是动态的,隐式类型:

> $x=100
> $x=dir

无类型错误 - 变量可以在运行时更改其类型。这类似于PythonPerlJavaScript,但与C++JavaC#等不同。

然而:

> [int]$x = 100
> $x = dir
Cannot convert "scripts-2.5" to "System.Int32".

因此,如果需要,它还支持显式键入变量。但是,类型检查是在运行时而不是编译时完成的,因此它不是静态类型。

我见过有人说PowerShell使用类型推断(因为你不必声明变量的类型),但我认为这是错误的。类型推断是在编译时进行类型检查的系统的一个特性(如C#中的“var”)。 PowerShell仅在运行时检查类型,因此它可以检查实际值而不是推断。

但是,有一些自动类型转换正在进行:

> [int]$a = 1
> [string]$b = $a
> $b
1
> $b.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

所以一些类型会即时转换。大多数定义都会使PowerShell成为弱类型语言。它当然比例如更弱Python(几乎?)从不转换类型。但可能并不像Perl那样弱,几乎可以根据需要转换任何东西。

答案 1 :(得分:5)

如果你需要的话可以。

像这样:

[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] »

使用[type]符号表示您是否关心强类型变量。

修改

正如edg指出的那样,这并不妨碍PowerShell在执行(5 +“5”)时将“5”解释为整数。我挖了一点,据Windows PowerShell in Action的Bruce Payette说,PowerShell实际上是一种“类型混杂的语言”。所以,我想,我的回答是“有点儿。”

答案 2 :(得分:2)

我认为将一个String添加到Int示例中会进一步为讨论工厂提供更多元素。什么被认为是动态型铸造?其中一条评论中有人说在这种情况下:

4 + "4"

"4" 成为Int32 。我根本不相信这种情况。我相信在命令改变为:

的情况下会发生中间步骤
4 + [System.Convert]::ToInt32("4")

请注意,这意味着"4"在整个过程中保持String。为了证明这一点,请考虑以下示例:

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

答案 3 :(得分:1)

从技术上讲,它是一种强类型语言。

您可以拒绝在shell中声明类型,使其行为类似于动态类型脚本语言,但它会将弱类型对象包装在“PsObject”类型的包装中。通过使用“New-Object”语法声明对象,对象是强类型的,而不是包装对象。

$compilerParameters = New-Object System.CodeDom.Compiler.CompilerParameters

答案 4 :(得分:1)

我认为您需要定义“强类型”的含义:

  

在计算机科学和计算机编程中,术语强类型用于描述编程语言指定对涉及具有不同数据类型的值的操作如何可以混合的一个或多个限制的情况。反义词是弱打字。然而,这些术语在短暂的计算历史中被赋予了各种各样的含义,因此通常很难在上下文中了解单个作者在使用它们时的含义。

- Wikipedia

答案 5 :(得分:1)

PowerShell是动态类型的,简单明了。它的创造者Bruce Payette就是这样描述的。

此外,如果有人参加过基础编程语言理论课,他们就会知道这一点。仅仅因为存在类型注释系统并不意味着它是强类型的。甚至类型带注释的变量在演员表中也会动态表现。任何允许您将字符串分配给变量并将其打印出来,然后将数字分配给同一变量并使用它进行计算的语言是动态输入的。

此外,PowerShell是动态范围的(如果有人知道这意味着什么)。

答案 6 :(得分:-1)

我撤回了之前的回答 - 引用如下。我应该说一些更细致入微的东西:

PowerShell具有强大的类型系统,具有强大的类型推断并且是动态类型的。

在我看来,这里有几个问题在起作用,所以要求更好地定义“强类型语言”的含义的答案在他们处理问题时可能更为明智。

由于PowerShell跨越了许多界限,因此PowerShell所在的答案可能存在于包含以下区域的维恩图中:

  • 静态与动态类型检查
  • 强与弱打字
  • 安全与不安全的打字
  • 显式与隐式声明和推理
  • 结构与主格类型系统
  
    

“PowerShell是一种强类型语言。

         

但是,它只要求您声明存在歧义的类型。

         

如果能够推断出类型,则不需要您指定类型。“