Подтвердить что ты не робот

Является ли PowerShell строго типизированным языком?

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

4b9b3361

Ответ 1

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

PowerShell динамически, неявный:

> $x=100
> $x=dir

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

Однако:

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

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

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

Однако происходит некоторое количество автоматического преобразования типов:

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

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

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

Ответ 2

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

Так же:

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

ИЗМЕНИТЬ

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

Ответ 3

Я думаю, что просмотр добавления строки к примеру 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

Ответ 4

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

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

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

Ответ 5

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

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

- Wikipedia

Ответ 6

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

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

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

Ответ 7

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

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

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

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

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

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

     

Однако для этого требуется только объявление типа, в котором существует двусмысленность.

     

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