24

私は最近かなり多くのPowerShellを使用しています(私は主にシステム管理者です)、そしてそれがどのタイプの言語であるかを自分自身に疑問に思いました。インタプリタ言語だと思いますが、強い言語と弱い型、動的、静的など、一般的な言語を説明する他の多くの名前を聞いたことがあります。PowerShellは何に該当しますか?

4

4 に答える 4

37

最初にいくつかの説明:

コンパイル済みと解釈済みの2つのカテゴリは、ソースコード(またはスクリプト)がアクションに変換される方法を指します。

インタプリタ言語では、コマンドはインタプリタによってアクションに直接解釈されます。

コンパイルされた言語では、ソースコードは最初に機械語(またはJavaのバイトコードや.NETのアセンブリなどの中間言語)に変換(またはコンパイル)され、実行時にアクションに変換されます。コンパイルされたプログラムの場合、コンパイルされたコードをインタプリタ言語のソースコードと見なし、CPUをインタプリタ(またはJavaの場合はJVM、.NETの場合は.NETランタイム)と考えることができます。

静的および動的に型付けされた言語の概念は、その言語の変数を参照します。

静的に型付けされた言語(CファミリーやJavaなど)は、そのソースで変数の型を定義し、その変数の使用法は、型から(通常はコーダーによって)導出されます。

動的に型付けされた言語(SchemeやVBScriptなど)の変数の型は、その使用法によって定義されます。コーダーが変数の型を定義できない場合(SchemeやBashスクリプトなど)もあれば、これはオプションである場合もあります(VBScriptなど)。

3番目の概念ペアは強い型と弱い型の言語です。これらの概念は、言語の変数タイプ間の関係に課せられる規則を参照します(最も一般的にはキャストに関連します)。型システムの「強さ」の問題は他の質問ほどブール型ではないため、ほとんどの言語は強力な型システムと週型システムの中間に位置します。

緩く(弱い)型の言語では、コンパイラとランタイムにより、ある型の変数を別の型であるかのように扱うことができ、そのような状況の動作は通常、言語固有(場合によっては実装固有)です。 。たとえば、数値と文字列を合計すると、これは有効なコードと見なされます。

強い型システムの言語では、コンパイラーとランタイムは、異なる型の変数間で操作を実行するために、特定のアクションを実行するように要求します。この最も一般的な例はキャストです(intをfloatにキャストするようなものです)。

結論

PowerShellを定義するために、これはインタプリタ言語ですが、.NETに関してはこれは灰色の領域です。PowerShellで変数を定義することには、型の定義が含まれないため、明らかに動的に型付けされた言語であり、変数の結合はシームレスに実行できます(@ halr9000で説明)。これは、型付けシステムが緩いことを示しています。

一言で言えば、それは弱い型システムを備えた通訳された動的に型付けされた言語だと思います。

于 2012-08-09T10:22:47.620 に答える
8

PowerShellはコンパイルされた言語ではありません。ILを直接生成することもありません。バージョン1とバージョン2は完全に解釈されました新しいバージョンのPSV3は、速度と最適化の目的でバックグラウンドでILとして式を生成およびキャッシュしますが、コンパイルされたDLLや、他の言語が通常のCLRタイプのように呼び出すことができるようなものを公開しません(ただし、他の言語ではPowerShellエンジンをホストし、その中でスクリプトを実行できます。)

したがって、Dotnetエコシステムにたまたま存在する解釈された言語のように考えてください。これにより、DOTNETオブジェクトをインスタンス化して操作できるため、「DOTNET言語」のように見えます。PowerShellには、より動的にする独自の拡張型システム(ETS)があります。必要なプロパティを使用してその場でオブジェクトを作成することも、既存のdotnetオブジェクトを取得してそれに何かを追加することもできます。

PowerShellは動的言語です。動的スコープ付き。これはパイプライン中心の言語であり、パイプラインを介してリッチオブジェクトを渡します(UNIXのバイナリ/テキストパイプラインとは対照的です)

PowerShellは、哲学と実装においてコマンド(動詞と名詞)中心の言語であり、RICHオブジェクト言語ですが、そのオブジェクト指向とは言えません。オブジェクトを操作して作成することはできますが、目標はタスクベースのコマンドを作成することです

PowerShellはさまざまな環境に存在します。これは、行ごとのREPLコマンドラインインタープリターですが、他のアプリケーションに組み込むことができる完全なスクリプトエンジンでもあります。

PowerShellには、変数の字句スコープではなく動的スコープがあります。

PowerShellには多くの「機能的な」機能があり、Scriptblockは堅牢なLambdaであり、(V2以降)完全に閉じられています。ラムダはしばしば難しい概念と見なされていますが。それらはPowerShellでうまく流れ、プログラミングに苦労している多くの人々によって使用されています。実際、PowerShellでは、すべてのスクリプト、関数、または高度な関数は実際には問題です。PowerSHellのラムダは、動的スコープとパイプラインで実行されるため、他のラムダとは異なります。組み込みのコマンドレットを使用した簡単な例を次に示します。

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

ここで、lamdaをコマンドレットに渡します。ここで、パイプラインを通過する各アイテムについて評価され、その結果はパイプラインに戻され、selectコマンドによって処理されます。

PowerShell(V2以降)は分散言語であり、完全なリモートスタックを備えているため、1台のコンピューターから多数のコンピューターに同時に接続し、スロールを使用してコマンドを実行し、多くのストリームで結果(結果、エラー、警告など)を処理できます。各コンピューターで発生しているためです。

では、PowerShellとはどのような言語ですか?

そのコマンド中心の言語は、主にシステム管理と自動化を対象としていますが、ドットネットエコシステムに存在する豊富なオブジェクトパイプラインベースの言語でもあります。関数型言語機能と機能の組み合わせを備えた、動的スコープの動的言語であるため、まったく新しい革新的な言語になると思います。

残念ながら、PowerShellには多くの落とし穴と問題があり、学習曲線は初級から初級まで急ではありませんが、中級までは非常に急です。

于 2012-08-09T23:54:13.877 に答える
5

PowerShellは、動的型付けスクリプト言語と呼ばれるものを使用します。複雑な操作を実装でき、変数、関数、ループ、分岐、構造化されたエラー/例外処理をサポートし、.NETと統合します。動的型付け言語とは、型チェックがコンパイル時ではなく実行時に行われ、その変数に型がないが、任意の型の値を参照できる場合です。動的型付け言語の例には、PHP、JavaScript、MATLAB、Ruby、Pythonなどがあります。

于 2012-08-09T10:00:45.847 に答える
0

おそらく、PowerShellを定義するためにスクリプト言語という用語が使用されていますが、推測される/優先される言語があります(ソース:http://msdn.microsoft.com/en-us/library/dd901838%28v=vs.85%29。 aspx):C#。理由:MSDNが提供するコマンドレットのPowerShellの例の前には、タブC#表記が付いています。これは当てはまります。C#は、.NETランタイムが最初に実行されるときにコンパイルされるインタプリタ言語(共通中間言語(CIL)と呼ばれます)です。さらに、C#はオブジェクト指向プログラミング(OOP)言語であり、PowerShellはActiveDirectory内のオブジェクトと対話します。httpリンクblogs.technet.com/b/stefan_gossner/archive/2010/05/07/using-csharp-c-code-in-powershell-scripts.aspxも参照してください。ただし、これは、PowerShell内のC#のみに制限されていることを意味するものではありません。を参照してください。http://msdn.microsoft.com/en-us/library/system.management.automation.powershell%28v=vs.85%29.aspx

于 2015-01-05T17:00:51.510 に答える