24

我最近一直在使用很多 PowerShell(我主要是系统管理员),我想知道它是什么类型的语言。我认为它是一种解释性语言,但我听过很多其他名称来描述语言:强类型与弱类型、动态、静态。PowerShell 属于什么?

4

4 回答 4

37

首先澄清几点:

两个类别:编译和解释是指源代码(或脚本)被翻译成动作的方式。

在解释语言中,命令被解释器直接解释为动作。

在编译语言中,源代码首先被翻译(或编译)成机器语言(或中间语言,如 Java 的字节码或 .NET 的程序集),在运行时将转化为动作。在编译程序的情况下,您可以将编译后的代码视为解释语言的源代码,并将 CPU 视为解释器(或 Java 中的 JVM 和 .NET 的 .NET 运行时)。

静态和动态类型语言的概念是指该语言的变量。

静态类型语言(如 C 系列或 Java)将在其源代码中定义变量的类型,并且该变量的使用将由该类型派生(通常由编码器)。

动态类型语言(如 Scheme 或 VBScript)变量的类型将由其用法定义。在某些情况下,编码人员根本无法为变量定义类型(例如在 Scheme 或 Bash 脚本中),而在其他情况下,这只是可选的(例如 VBScript)。

第三个概念对是强类型语言与弱类型语言。这些概念指的是强加于语言中变量类型之间关系的规则(最常见的是与强制转换有关)。类型系统“强度”的问题不像其他问题那样布尔,因此大多数语言介于强类型系统和周类型系统之间。

在松散(弱)类型的语言中,编译器和运行时将允许您将一种类型的变量视为另一种类型,并且这种情况的行为通常是特定于语言的(在某些情况下甚至是特定于实现的) . 例如,您可以将一个数字与一个字符串相加,这将被视为有效代码。

在具有强类型系统的语言中,编译器和运行时将要求您执行特定操作,以便在不同类型的变量之间执行操作。最常见的例子是强制转换(比如将 int 强制转换为 float)。

底线

要定义 PowerShell,它是一种解释型语言,但对于 .NET,这是一个灰色地带。在 PowerShell 中定义变量不包括定义它们的类型,因此它显然是一种动态类型语言,并且可以无缝地组合变量(如@halr9000 所述),这表明了一个松散的类型系统。

一句话,我会说它是一种具有弱类型系统的解释型动态类型语言。

于 2012-08-09T10:22:47.620 回答
8

PowerShell 不是编译语言。它也不会直接产生 IL。版本 1 和版本 2 完全解释了 PS V3 的新版本确实在后台生成和缓存表达式作为 IL 以提高速度和优化目的,但没有公开任何编译的 DLL 或其他语言可以像常规 CLR 类型一样调用的内容(虽然其他语言可以托管 PowerShell 引擎,并在其中执行脚本。)

所以把它想象成一种恰好生活在 Dotnet 生态系统中的解释语言,它允许它实例化 DOTNET 对象并与之交互,从而使它看起来像一种“DOTNET 语言”。PowerShell 拥有自己的扩展类型系统 (ETS),使其更具动态性。您可以使用所需的任何属性动态创建对象,或者获取现有的 dotnet 对象并向其中添加内容。

PowerShell 是一种动态语言。使用动态范围。它是一种以管道为中心的语言,通过管道传递丰富的对象(与 unix 中的二进制/文本管道相反)

PowerShell 在哲学和实现方面是一种以命令(动词和名词)为中心的语言,虽然它是一种丰富的对象语言,但我不会说它是面向对象的。您可以与对象交互并创建它们,但目标是生成基于任务的命令

PowerShell 存在于不同的环境中。它是一个逐行 REPL 命令行解释器,但它也是一个完整的脚本引擎,可以嵌入到其他应用程序中。

PowerShell 具有变量的动态而不是词法范围。

PowerShell 有许多“功能性”特性,其中 Scriptblocks 是健壮的 Lambda,而且它(从 V2 开始)还具有完全闭包。尽管 Lambdas 通常被认为是一个困难的概念。它们在 powershell 中运行良好,被许多难以编程的人使用。事实上,在 PowerShell 中,每个脚本、函数或高级函数都是一个 lamda。PowerSHell 的 lamda 与其他 lamda 不同,因为它们具有动态范围,还因为它们在管道中执行。这是一个使用内置 cmdlet 的简单示例

get-process | where { $_.MainWindowTitle -like '*stack*' } | select processname

在这里,您将 lamda 传递给 cmdlet where ,并且对于通过管道的每个项目都会对其进行评估,其结果将返回到管道中,然后由 select 命令处理。

PowerShell(自 V2 起)是一种分布式语言,具有完整的远程处理堆栈,允许您同时从一台计算机连接到多台计算机、执行带 throlling 的命令以及处理多个流上的结果(结果、错误、警告等)因为它们发生在每台计算机上。

那么PowerShell是一种什么样的语言呢?

它是一种以命令为中心的语言,主要针对系统管理和自动化,但也是一种基于对象管道的丰富语言,存在于 dotnet 生态系统中。它是一种动态范围的动态语言,具有函数式语言特性和特性组合,我相信它使它成为一种全新的创新语言

然而遗憾的是,PowerShell 有很多陷阱和问题,虽然从初学者到初级的学习曲线并不陡峭,但进入中级却非常陡峭。

于 2012-08-09T23:54:13.877 回答
5

PowerShell 使用所谓的动态类型脚本语言。它可以实现复杂的操作,支持变量、函数、循环、分支、结构化错误/异常处理,并且与.NET集成。动态类型语言是在运行时而不是在编译时完成类型检查并且其变量没有类型但可以引用任何类型的值。动态类型语言的示例包括 PHP、JavaScript、MATLAB、Ruby、Python 等。

于 2012-08-09T10:00:45.847 回答
0

也许,即使术语脚本语言用于定义 PowerShell,也有一种推断/首选语言(来源:http: //msdn.microsoft.com/en-us/library/dd901838%28v=vs.85%29。 aspx ): C#。原因:MSDN 提供的 cmdlet 的 PowerShell 示例前面有一个制表符 C# 表示法。这适合:C# 是 .NET 运行时在第一次运行时编译的解释语言(称为通用中间语言 (CIL))。此外,C# 是一种面向对象的编程 (OOP) 语言,PowerShell 与 Active Directory 中的对象进行交互。另请参阅 http 链接blogs.technet.com/b/stefan_gossner/archive/2010/05/07/using-csharp-c-code-in-powershell-scripts.aspx。但是,这并不意味着您只能在 PowerShell 中使用 C#:请参阅http://msdn.microsoft.com/en-us/library/system.management.automation.powershell%28v=vs.85%29.aspx

于 2015-01-05T17:00:51.510 回答