Каким языком является PowerShell?

В последнее время я использую довольно много PowerShell (я в основном системный администратор), и я задавался вопросом, что это за язык. Я думаю, что это интерпретируемый язык, но я слышал много других имен, описывающих языки вообще: Сильный против слабо типизированного, динамического, статического. Что подпадает под PowerShell?

Ответ 1

Сначала несколько пояснений:

Две категории: скомпилированные и интерпретированные относятся к тому, как исходный код (или скрипт) переводится в действия.

На интерпретируемом языке команды интерпретируются интерпретатором напрямую к действиям.

В скомпилированном языке исходный код сначала переводится (или компилируется) на машинный язык (или промежуточный язык, такой как байт-код Java или сборка .NET), который при запуске будет превращен в действия. В случае скомпилированной программы вы можете рассматривать скомпилированный код как исходный код для интерпретируемого языка и рассматривать процессор как интерпретатор (или JVM в случае Java и .NET Runtime для .NET).

Понятия статически и динамически типизированного языка относятся к переменным этого языка.

Статически типизированный язык (например, семейство C или Java) будет определять тип переменной в ее источнике, и использование этой переменной будет производным (обычно кодером) от типа.

В динамически типизированном языке (например, Scheme или VBScript) тип переменной будет определяться ее использованием. В некоторых случаях кодировщик просто не может определить тип переменной (как в скрипте Scheme или Bash), а в других это просто необязательно (например, VBScript).

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

В слабо (слабом) типизированном языке компилятор и среда выполнения позволят вам обрабатывать переменную одного типа так, как если бы она была другого типа, а поведение в такой ситуации обычно зависит от языка (а в некоторых случаях даже от реализации), Например, вы можете сложить число со строкой, и это будет считаться допустимым кодом.

В языке со строгой системой типов компилятор и среда выполнения потребуют от вас выполнения определенных действий для выполнения операций между различными типами переменных. Наиболее распространенным примером для этого является приведение (например, приведение int к float).

Нижняя линия

Для определения PowerShell это интерпретируемый язык, но это серая область, когда дело касается .NET. Определение переменных в PowerShell не включает в себя определение их типа, и поэтому это, очевидно, язык с динамической типизацией, и объединение переменных может быть выполнено без проблем (как отмечено в @halr9000), что указывает на слабую систему типизации.

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

Ответ 2

PowerShell не является скомпилированным языком. Он также не производит IL напрямую. Версия 1 и версия 2 были полностью интерпретированы. Новая версия PS V3 действительно производит и кэширует выражения как IL в фоновом режиме для целей скорости и оптимизации, но не предоставляет никаких скомпилированных DLL или таких, которые другие языки могли бы вызывать как обычные типы CLR ( хотя другие языки МОГУТ разместить PowerShell Engine и выполнить на нем скрипт.)

Так что думайте о нем как о интерпретируемом языке, который, как оказалось, живет в экосистеме Dotnet, что позволяет ему создавать экземпляры и взаимодействовать с объектами DOTNET, что делает его похожим на "язык DOTNET". PowerShell имеет свою собственную систему расширенных типов (ETS), которая делает ее более динамичной. Вы можете создавать объекты на лету с любыми желаемыми свойствами или использовать существующий объект dotnet и добавлять к нему какие-либо элементы.

PowerShell - это динамический язык. С динамическим обзором. Это ориентированный на конвейер язык, который пропускает богатые объекты по конвейеру (в отличие от бинарных/текстовых конвейеров в unix)

PowerShell - это командный (глагол и существительное) ориентированный на философию и реализацию язык, и, хотя это объектный язык RICH, я бы не сказал, что его объект ORIENTATED. Вы можете взаимодействовать с объектами и создавать их, но цель состоит в создании команд на основе задач

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

PowerShell имеет динамическую, а не лексическую область видимости переменных.

PowerShell обладает множеством "функциональных" функций: блоки Scriptblock являются надежными лямбдами, а также (начиная с версии V2) имеют полное закрытие. Несмотря на то, что лямбда часто рассматривается как сложная концепция. они хорошо работают в PowerShell и используются многими людьми, которым трудно программировать. На самом деле в PowerShell каждый скрипт, или функция, или расширенная функция на самом деле являются лямдой. Ламды PowerSHell отличаются от других лямд из-за дианмического объема, а также потому, что они выполняются в конвейере. Вот простой пример использования встроенных командлетов

get-process | where { $_.MainWindowTitle -like '*stack*' } | select processname

Здесь вы передаете lamda командлету, где и для каждого элемента, проходящего через конвейер, он оценивается, а его результаты возвращаются в конвейер, который затем обрабатывается командой select.

PowerShell (начиная с V2) - это распределенный язык с полным стеком удаленного взаимодействия, который позволяет подключаться с одного компьютера ко многим одновременно, выполнять команды с прокруткой и обрабатывать результаты во многих потоках (результаты, ошибки, предупреждения и т.д.) как они происходят на каждом компьютере.

Так что же это за язык PowerShell?

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

К сожалению, в PowerShell есть много проблем и проблем, и хотя кривая обучения не крутая от новичка до элементарной, она очень крута, переходя на промежуточный уровень.

Ответ 3

PowerShell использует так называемый динамически типизированный язык сценариев. Он может реализовывать сложные операции и поддерживает переменные, функции, циклы, ветвление, структурированную обработку ошибок/исключений и интегрируется с .NET. Динамически типизированный язык - это когда проверка типов выполняется во время выполнения, а не во время компиляции, а его переменные не имеют типа, но могут ссылаться на значения любого типа. Примеры динамически типизированных языков включают PHP, JavaScript, MATLAB, Ruby, Python и т.д.

Ответ 4

Возможно, хотя термин термин язык сценариев используется для определения PowerShell, существует язык, предполагаемый/предпочтительный (источник: http://msdn.microsoft.com/en-us/library/dd901838%28v=vs.85%29.aspx): С#. Причина: пример PowerShell командлета, предоставляемого MSDN, предшествует нотации С# на вкладке. Это соответствует: С# - интерпретируемый язык, который .NET runtime компилирует (называемый общим промежуточным языком (CIL)) при первом запуске. Более того, С# является языком объектно-ориентированного программирования (OOP), а PowerShell взаимодействует с объектами в Active Directory. См. Также ссылку http blogs.technet.com/b/stefan_gossner/archive/2010/05/07/using-csharp-c-code-in-powershell-scripts.aspx. Это, однако, не означает, что вы ограничены только С# в PowerShell: см. http://msdn.microsoft.com/en-us/library/system.management.automation.powershell%28v=vs.85%29.aspx