PowerShell está definitivamente en la categoría de lenguajes dinámicos, pero ¿se consideraría fuertemente tipado?¿Es PowerShell un lenguaje fuertemente tipado?
Respuesta
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".
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. –
Creo que esto muestra que * puede * escribirse estáticamente, lo que no significa que deba * escribirse con fuerza. – EBGreen
Entonces, ¿está tipado débil y estáticamente? –
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
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."
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.
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.
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. –
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
Buen punto - ¡gracias! –
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
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).
- 1. En .Net/C#, ¿es nulo fuertemente tipado?
- 2. ¿.NET MVC tiene un RedirectToAction fuertemente tipado?
- 3. ¿Qué es un conjunto de datos fuertemente tipado?
- 4. Usando el tipado dinámico en D, un lenguaje estáticamente tipado
- 5. ¿Hay un lenguaje de programación fuertemente tipado que le permita definir nuevos operadores?
- 6. Diseño Objeto fuertemente tipado de XML
- 7. Entity Framework con MVC fuertemente tipado
- 8. actionlink fuertemente tipado con asp.net mvc beta?
- 9. Asp.net WebAPI HttpClient fuertemente tipado PostAync
- 10. ¿El rubí está fuertemente o débilmente tipado?
- 11. ActionLink fuertemente tipado en Asp.Net MVC 2?
- 12. fuertemente tipado C++ 0x comparación de enumeraciones
- 13. ¿Utiliza ItemType para un control de repetidor fuertemente tipado?
- 14. asp.net vistas de mvc y viewdata fuertemente tipado
- 15. Refactorización con lenguaje de tipado dinámico
- 16. Razor no funciona fácilmente con Html.ActionLink fuertemente tipado?
- 17. ¿Dónde debería colocar mi asp.net-mvc fuertemente tipado viewdata?
- 18. ¿Es seguro arrojar valores arbitrarios del tipo subyacente a un tipo de enumeración fuertemente tipado?
- 19. asp.net mvc fuertemente tipado ver modelo con multiselect
- 20. TryUpdateModel contra el parámetro del método fuertemente tipado
- 21. Acceso fuertemente tipado a Amazon S3 utilizando C#
- 22. qué exactamente está fuertemente tipado Ver datos en Asp.Net MVC
- 23. ¿"Tipo seguro" y "fuertemente tipado" significan lo mismo?
- 24. ¿Es posible crear un ASP.NET MVC personalizado fuertemente HTML Helper?
- 25. ¿Cuáles son los beneficios (y desventajas) de un lenguaje débilmente tipado?
- 26. ¿Debo devolver un conjunto de datos fuertemente tipado de un servicio web?
- 27. .NET MVC 4 Modelo de vista fuertemente tipado que contiene Modelo fuertemente tipado con EditorPedido y Vista preliminar de EditorTemplate no vinculante
- 28. ¿Python es un lenguaje débilmente tipado ya que las variables pueden cambiar de tipos?
- 29. Buscando un formato de serialización rápido, compacto, transmisible, multilingüe y fuertemente tipado
- 30. ¿Cómo puedo incluir DBNull como un valor en mi conjunto de datos fuertemente tipado?
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. –
Quiere decir: ¿está PowerShell * estáticamente * tipado? –