Является ли PowerShell строго типизированным языком? - PullRequest
13 голосов
/ 22 сентября 2008

PowerShell определенно относится к категории динамических языков, но будет ли он считаться строго типизированным?

Ответы [ 7 ]

20 голосов
/ 22 сентября 2008

Существует определенная путаница вокруг терминологии. Эта статья объясняет полезную таксономию систем типов.

PowerShell динамически, неявно набирается:

> $x=100
> $x=dir

Нет ошибок типа - переменная может изменить свой тип во время выполнения. Это похоже на Python , Perl , JavaScript , но отличается от C ++ , Java , C # и др.

Тем не менее:

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

Так что он также поддерживает явную типизацию переменных, если хотите. Однако проверка типов выполняется во время выполнения, а не во время компиляции, поэтому она не статически типизирована.

Я видел, как некоторые говорили, что PowerShell использует вывод типа (потому что вам не нужно объявлять тип переменной), но я думаю, что это неправильные слова. Вывод типа - это особенность систем, которые выполняют проверку типов во время компиляции (например, "var" в C #). PowerShell проверяет только типы во время выполнения, поэтому он может проверять фактическое значение, а не делать выводы.

Тем не менее, происходит автоматическое преобразование типов:

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

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

Так некоторые типов конвертируются на лету. По большинству определений это делает PowerShell слабо типизированным языком. Это, конечно, слабее, чем, например, Python, который (почти?) Никогда не конвертирует типы на лету. Но, вероятно, не так слабо, как Perl, который будет преобразовывать почти все, что нужно.

5 голосов
/ 22 сентября 2008

Может быть, если вам нужно.

Вроде так:

[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], чтобы указать, не волнует ли вас строгая типизация переменных.

EDIT

Как указывало edg , это не мешает PowerShell интерпретировать «5» как целое число при выполнении (5 + «5»). Я еще немного покопался, и, по словам Брюса Пайетта в Windows PowerShell в действии , PowerShell на самом деле является «беспорядочным языком». Так что, я думаю, мой ответ "вроде".

2 голосов
/ 22 сентября 2008

Я думаю, что дальнейшее рассмотрение добавления строки в пример Int даст больше смысла для дискуссионной мельницы. Что считается динамическим приведением типов? Кто-то в одном из комментариев сказал, что в этом случае:

4 + "4"

"4" становится Int32 . Я не верю, что это так. Вместо этого я считаю, что промежуточный шаг происходит, когда команда изменяется на:

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

Обратите внимание, что это означает, что "4" остается строкой на протяжении всего процесса. Чтобы продемонстрировать это, рассмотрим этот пример:

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
1 голос
/ 14 апреля 2010

PowerShell имеет динамическую типизацию, простую и понятную. Он описан как таковой его создателем Брюсом Пайеттом.

Кроме того, если бы кто-то взял базовый класс теории языка программирования, он бы это знал. То, что существует система аннотаций типов, не означает, что она строго типизирована. Даже аннотированные переменные типа ведут себя динамически во время приведения. Любой язык, который позволяет вам присвоить строку переменной и распечатать ее, а затем присвоить число той же переменной и выполнить вычисления с ней, динамически типизируется.

Кроме того, PowerShell динамически ограничен (если кто-нибудь здесь знает, что это значит).

1 голос
/ 22 сентября 2008

Я думаю, вам нужно определить, что вы подразумеваете под "сильно типизированным":

В информатике и компьютерном программировании термин строгая типизация используется для описания тех ситуаций, когда языки программирования определяют одно или несколько ограничений на то, как могут быть смешаны операции, связанные со значениями, имеющими разные типы данных. Антоним - слабая типизация. Тем не менее, эти термины получили такое широкое разнообразие значений в течение короткой истории вычислений, что зачастую трудно понять вне контекста, что означает отдельный писатель при их использовании.

Wikipedia

1 голос
/ 22 сентября 2008

Технически это строго типизированный язык.

Вы можете отказаться объявлять типы в оболочке, позволяя ей вести себя как язык сценариев с динамическим типом, но он будет оборачивать объекты со слабым типом в оболочку типа "PsObject". Объявляя объекты с использованием синтаксиса «New-Object», объекты строго типизируются и не переносятся.

$compilerParameters = New-Object System.CodeDom.Compiler.CompilerParameters
0 голосов
/ 22 сентября 2008

Я убираю свой предыдущий ответ - цитируемый ниже. Я должен был сказать что-то более нюансированное, как:

PowerShell имеет строгую систему типов с надежным выводом типов и динамически типизируется.

Мне кажется, что здесь есть несколько проблем, поэтому ответы на вопрос о лучшем определении того, что подразумевается под "языком со строгой типизацией", были, вероятно, более мудрыми в их подходе к вопросу.

Поскольку PowerShell пересекает многие границы, ответ на то, где находится PowerShell, вероятно, существует в диаграмме Венна, состоящей из следующих областей:

  • Статическая и динамическая проверка типов
  • Сильная и слабая типизация
  • Безопасный и небезопасный набор текста
  • Явное и неявное объявление и вывод
  • Структурные и номинативные системы типов

"PowerShell - строго типизированный язык.

Однако требуется только объявить тип, в котором есть неоднозначность.

Если он может вывести тип, он не требует его указания. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...