2008-09-22 40 views
11

PowerShell está definitivamente en la categoría de lenguajes dinámicos, pero ¿se consideraría fuertemente tipado?¿Es PowerShell un lenguaje fuertemente tipado?

+2

El término "fuertemente tipado" no está definido. ¿Podrías por favor definirlo, para que tu pregunta pueda ser respondida objetivamente? De lo contrario, todo el mundo simplemente sustituirá su * propia * definición y terminaremos en un masivo flamefest. –

+0

Quiere decir: ¿está PowerShell * estáticamente * tipado? –

Respuesta

5

Puede ser si lo necesita.

así:

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

utilizar la notación [tipo] para indicar si se preocupan por variables que están siendo fuertemente tipados.

EDITAR:

Como edg señalado, esto no impide que PowerShell de la interpretación de "5" como un entero, al ejecutar (5 + "5"). Cavé un poco más, y de acuerdo con Bruce Payette en Windows PowerShell in Action, PowerShell es en realidad un "lenguaje de promiscuidad de tipo". Entonces, supongo, mi respuesta es "más o menos".

+0

No. Puede agregar una cadena a un número entero y obtener un resultado numérico. Si invierte el orden de suma, obtiene concatenación. –

+0

Creo que esto muestra que * puede * escribirse estáticamente, lo que no significa que deba * escribirse con fuerza. – EBGreen

+0

Entonces, ¿está tipado débil y estáticamente? –

1

Técnicamente es un lenguaje fuertemente tipado.

Puede rechazar la declaración de tipos en el shell, lo que le permite comportarse como un lenguaje de scripting de tipo dinámico, pero envolverá objetos de tipo débil en un contenedor de tipo "PsObject". Al declarar objetos usando la sintaxis "Nuevo-Objeto", los objetos son fuertemente tipados y no envueltos.

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

Me retracto de mi respuesta anterior - citada a continuación. Debería haber dicho algo más matizado como:

PowerShell tiene un sistema de tipo fuerte con inferencia de tipo robusto y está tipeado dinámicamente.

Me parece que hay varios problemas en juego aquí, por lo que las respuestas que piden una mejor definición de lo que significaba un "lenguaje fuertemente tipado" probablemente fueron más acertadas en su enfoque de la pregunta.

Desde PowerShell cruza muchas fronteras, la respuesta a dónde reside PowerShell probablemente existe en un diagrama de Venn que consiste en las siguientes áreas:

  • estático vs tipo dinámico de cheques
  • vs. fuerte débil escribir
  • segura vs inseguro escribir
  • vs explícita declaración implícita e inferencia
  • estructurales frente a los sistemas de tipo nominativo

"PowerShell es un lenguaje fuertemente tipado.

Sin embargo, solo requiere que declare el tipo donde hay ambigüedad.

Si es capaz de inferir un tipo, no es necesario que lo especifique."

1

creo que tendrá que definir lo que entendemos por 'inflexible de tipos':

En informática y la programación informática, la tipificación fuerte término se utiliza para describir aquellas situaciones donde la programación los lenguajes especifican una o más restricciones sobre cómo se pueden mezclar las operaciones que involucran valores con diferentes tipos de datos. El antónimo es una tipificación débil. Sin embargo, estos términos tienen una gran variedad de significados sobre la corta historia de la informática que a menudo es difícil saber , fuera de contexto, lo que significa un escritor individual al usarlos.

- Wikipedia

17

Hay un poco de confusión en torno a la terminlogy. This article explica una taxonomía útil de los sistemas de tipos.

PowerShell es dinámica, con tipo implícito:

> $x=100 
> $x=dir 

No hay errores de tipo - una variable puede cambiar su tipo en tiempo de ejecución. Esto es como Python, Perl, pero diferente de JavaScriptC++, Java, C#, etc.

Sin embargo:

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

Por lo tanto, también es compatible con explícita tipificación de variables si lo desea. Sin embargo, la verificación de tipo se realiza en tiempo de ejecución en lugar de en tiempo de compilación, por lo que no está escrito estáticamente.

He visto a algunos decir que PowerShell usa tipo inferencia (porque no tiene que declarar el tipo de una variable), pero creo que son las palabras equivocadas. La inferencia de tipo es una característica de los sistemas que realiza la verificación de tipos en tiempo de compilación (como "var" en C#). PowerShell solo comprueba tipos en tiempo de ejecución, por lo que puede verificar el valor real en lugar de hacer inferencias.

Sin embargo, hay una cierta cantidad de tipo de conversión automática pasando:

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

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

Así algunos tipos son convertidos sobre la marcha. En la mayoría de las definiciones esto hará que PowerShell sea un lenguaje débilmente tipeado. Ciertamente es más débil que, por ejemplo, Python que (¿casi?) Nunca convierte tipos sobre la marcha. Pero probablemente no esté tan débil como Perl, que convertirá casi todo lo que necesite.

+1

Vale la pena mencionar que * los lenguajes de tipo dinámico * como PowerShell en general empeoran los mensajes de error y mueren en tiempo de ejecución en comparación con algo * estáticamente escrito * como Java. Sin embargo, incluso con el * tipado estático * puede tener la muerte en tiempo de ejecución con excepciones de puntero nulo y tal, solo obtiene mejores mensajes de error y la depuración con * static typed * languages. –

2

Creo que mirar agregar una cadena a un ejemplo Int proporcionaría más grist para el molino de discusión. ¿Qué se considera de tipo dinámico? Alguien en uno de los comentarios dice que en este caso:

+ 4 "4"

El "4" se convierte en un Int32. No creo que ese sea el caso en absoluto.Creo en cambio que un paso intermedio que sucede cuando se cambia el comando a:

4 + [System.Convert] :: ToInt32 ("4")

Tenga en cuenta que esto significa que "4" se mantiene una cadena a través todo el proceso Para demostrar esto, considere este ejemplo:

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 
+0

Buen punto - ¡gracias! –

+0

Sin embargo, puede cambiar el tipo de una variable mediante asignación. Si haces $ foo = "4" y luego $ foo = 8 + $ foo, entonces el tipo de $ foo cambiará de cadena a int. Los valores son inmutables, sin embargo. – JacquesB

1

PowerShell se escribe dinámicamente, simple y llanamente. Es descrito como tal por su creador, Bruce Payette.

Además, si alguien ha tomado una clase básica de lenguaje de programación, sabrá esto. El hecho de que haya un sistema de anotación de tipo no significa que esté fuertemente tipado. Incluso las variables anotadas de tipo se comportan dinámicamente durante un lanzamiento. Cualquier lenguaje que le permita asignar una cadena a una variable e imprimirlo y luego asignar un número a la misma variable y hacer cálculos con ella se tipea dinámicamente.

Además, PowerShell tiene un alcance dinámico (si alguien sabe lo que eso significa).

Cuestiones relacionadas