2008-09-22 2 views
11

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

+2

Термин «строго типизированный» не определен. Не могли бы вы определить его, чтобы на ваш вопрос можно было ответить объективно? В противном случае все будут просто заменять свое * собственное * определение, и мы закончим массивный пламенный огонь. – 2008-09-22 19:53:22

+0

Вы имеете в виду: есть PowerShell * статически * напечатан? – 2016-11-01 16:21:41

ответ

5

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

Как так:

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

Используйте [тип] обозначения, чтобы указать, если вы заботитесь о переменных время сильно типизированных.

РЕДАКТИРОВАТЬ:

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

+0

Нет. Вы можете добавить строку к целому числу и получить числовой результат. Если вы измените порядок добавления, вы получите конкатенацию. – 2008-09-22 16:04:36

+0

Я думаю, это показывает, что он * может * быть статически типизированным, что не означает, что он * должен * быть строго типизирован. – EBGreen 2008-09-22 16:17:59

1

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

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

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

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

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

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

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

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

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

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

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

1

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

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

- Wikipedia

17

Существует определенное количество путаницы вокруг terminlogy. This article объясняет полезную таксономию систем типов.

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 a слабо типизированным языком. Это, безусловно, более слабое, чем, например, Python, который (почти?) Никогда не конвертирует типы на лету. Но, вероятно, не в слабом, как Perl, который будет конвертировать почти что угодно по мере необходимости.

2

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^