PowerShell は間違いなく動的言語のカテゴリに属しますが、厳密に型指定されていると見なされますか?
7 に答える
用語に関しては、ある程度の混乱があります。この記事では、型システムの有用な分類法について説明します。
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 ほど弱いわけではありません。
必要に応じて可能です。
そのようです:
[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が指摘したように、これは (5 + "5") の実行時に PowerShell が "5" を整数として解釈することを妨げません。もう少し掘り下げてみたところ、Windows PowerShell in Actionの Bruce Payette によると、PowerShell は実際には「型の乱雑な言語」です。ですから、私の答えは「ある程度」です。
「厳密に型指定された」とはどういう意味かを定義する必要があると思います。
コンピューター サイエンスとコンピューター プログラミングでは、厳密な型指定という用語は、異なるデータ型を持つ値を含む操作を混在させる方法について、プログラミング言語が 1 つ以上の制限を指定する状況を表すために使用されます。反意語は弱いタイピングです。ただし、これらの用語には、コンピューティングの短い歴史の中で非常に多様な意味が与えられているため、個々の作成者がそれらを使用するときに何を意味するかを文脈から切り離して知ることはしばしば困難です。
--ウィキペディア
技術的には、強く型付けされた言語です。
シェルで型を宣言することを拒否して、動的な型付きスクリプト言語のように動作させることができますが、型が "PsObject" のラッパーで弱く型付けされたオブジェクトをラップします。「New-Object」構文を使用してオブジェクトを宣言することにより、オブジェクトは厳密に型指定され、ラップされません。
$compilerParameters = New-Object System.CodeDom.Compiler.CompilerParameters
String を Int の例に追加することをさらに検討すると、ディスカッション ミルにより多くの要点が提供されると思います。動的型キャストと見なされるものは何ですか? この場合、コメントの 1 つで誰かが次のように述べています。
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
PowerShell は動的に型付けされ、プレーンでシンプルです。その作成者であるブルース・ペイエットによってそのように説明されています。
さらに、基本的なプログラミング言語の理論クラスを受講したことがある人なら、このことを知っているでしょう。型注釈システムがあるからといって、厳密に型付けされているとは限りません。型注釈付き変数でさえ、キャスト中に動的に動作します。文字列を変数に割り当てて出力し、同じ変数に数値を割り当てて計算できる言語は、動的に型付けされます。
さらに、PowerShell は動的にスコープされます (ここに誰かがその意味を知っている場合)。
以前の回答を撤回します-以下に引用します。私はもっと微妙なことを言うべきだった:
PowerShellには、堅牢な型推論を備えた強い型システムがあり、動的に型付けされます。
ここではいくつかの問題が働いているように思われるので、「強く型付けされた言語」が何を意味するのかをより適切に定義することを求める回答は、おそらく質問へのアプローチにおいてより賢明でした。
PowerShellは多くの境界を越えているため、PowerShellが存在する場所に対する答えは、おそらく次の領域で構成されるベン図に存在します。
- 静的型と動的型のチェック
- 強い型と弱い型
- 安全なタイピングと安全でないタイピング
- 明示的対暗黙的な宣言と推論
- 構造型システムと主格型システム
「PowerShellは強く型付けされた言語です。
ただし、あいまいなタイプを宣言するだけで済みます。
タイプを推測できる場合は、指定する必要はありません。」