PowerShell是什么类型的语言?

时间:2012-08-09 09:32:54

标签: .net powershell

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

4 个答案:

答案 0 :(得分:23)

首先澄清一些:

这两个类别:编译和解释是指源代码(或脚本)转换为动作的方式。

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

在编译语言中,源代码首先被翻译(或编译)为机器语言(或Java的字节代码或.NET程序集之类的中间语言),当将其转换为动作时跑。对于已编译的程序,您可以将已编译的代码视为解释语言的源代码,并将CPU视为解释器(或Java的JVM和.NET .NET Runtime)。

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

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

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

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

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

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

底线

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

在一个句子中,我会说这是一种具有弱类型系统的解释型动态类型语言。

答案 1 :(得分:6)

PowerShell不是编译语言。它也不直接产生IL。版本1和版本2完全被解释 新版本的PS V3确实在后台生成和缓存表达式作为IL,用于速度和光学化目的,但不会暴露任何已编译的DLL或其他语言可以像常规CLR类型一样调用(尽管其他语言可以托管PowerShell引擎) ,并在其中执行脚本。)

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

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

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

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

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

PowerShell具有许多“功能”特性,Scriptblocks是强大的Lambdas,并且它(因为V2)也具有完全闭包。尽管Lambdas经常被认为是一个困难的概念。它们在powershell中很好地流动,很多人都很难用到编程。实际上在PowerShell中,每个脚本,函数或高级函数都是真正的lamda。 PowerSHell的lamdas与其他lamdas不同,因为它们具有动态范围,也因为它们在管道中执行。以下是使用内置cmdlet的简单示例

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

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

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

那么PowerShell是什么类型的语言?

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

然而令人遗憾的是,PowerShell有许多问题和问题,虽然从初学者到初级阶段的学习曲线并不陡峭,但是进入中级阶段是非常陡峭的。

答案 2 :(得分:2)

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

答案 3 :(得分: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