Вопрос:

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

powershell strong-typing

7397 просмотра

7 ответа

1851 Репутация автора

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

Автор: Chris Sutton Источник Размещён: 22.09.2008 03:43

Ответы (7)


5 плюса

9083 Репутация автора

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

Вот так:

[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 на самом деле является «беспорядочным языком». Так что, я думаю, мой ответ "вроде".

Автор: David Mohundro Размещён: 22.09.2008 03:48

1 плюс

19133 Репутация автора

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

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

$compilerParameters = New-Object System.CodeDom.Compiler.CompilerParameters
Автор: Guy Starbuck Размещён: 22.09.2008 03:48

-1 плюса

3375 Репутация автора

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

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

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

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

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

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

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

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

Автор: Timothy Lee Russell Размещён: 22.09.2008 04:03

1 плюс

26046 Репутация автора

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

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

- Википедия

Автор: EBGreen Размещён: 22.09.2008 04:06

19 плюса

34708 Репутация автора

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

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, который будет преобразовывать практически все, что нужно.

Автор: JacquesB Размещён: 22.09.2008 04:14

2 плюса

26046 Репутация автора

Я думаю, что рассмотрение вопроса о добавлении строки String в 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
Автор: EBGreen Размещён: 22.09.2008 04:27

1 плюс

11 Репутация автора

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

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

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

Автор: The Old Hag Размещён: 14.04.2010 10:52
Вопросы из категории :
32x32