Google's Goはタイプセーフな言語ですか?


14

このページhttp://golang.org/doc/go_faq.htmlの書き込み:

Goには静的な型がありますが、言語は典型的なオブジェクト指向言語よりも型を軽く感じさせようとします

だから私の質問は、ジェネリック(C#など)で安全に入力するか、緩やかに入力する(javascriptなど)か、オプション(Vb.Netのオプションstrictなど)で安全に入力することです


@JamesMcNellisは、型が失敗した場合、型キャストを行うためだけに意味があることを意味します(他のアクションは型例外を引き起こすべきではありません)
Pacerier

1
@ davidk01 Javaはコンパイル(1 + "boo")し、Javaはかなり安全です。この式には、言語によってStringオブジェクトに対して+がオーバーロードされ、すべてのプリミティブリテラルをラップされたオブジェクトに型変換してからStringに変換できるため、明確な静的な意味があります。
トリクシーウルフ

回答:


26

タイプセーフは、黒または白のタイプセーフではありません。それはより広範囲であり、一部の言語は他の言語よりもタイプセーフです(逆も同様です)。ただし、C#とJavascriptで考えていることは、静的型付け(型チェックがコンパイル時に行われる)と動的型付け(型チェックが実行時に行われる)である可能性が高いと思います-確かに、それはGo FAQの内容

Google Goは静的に型付けされていますが、いくつかの機能により、動的に型付けされているように見えます(少なくともある程度)。たとえば、クラスをインターフェイスの実装として明示的にマークする必要はありません。クラスのメソッドシグネチャがインターフェイス上のメソッドシグネチャと一致する場合、クラスはそのインターフェイスを自動的に実装します(一種のダックタイピング)。これは、組み込みクラスとサードパーティライブラリのクラスを拡張するのに便利です。サードパーティクラスのメソッドに一致するようにインターフェイスを作成するだけで、自動的に実装されるためです。

型安全性は、実際には型システムの異なる「軸」です。たとえば、Cは型安全ではない静的に型付けされた言語です。ポインタを使用すると、プログラムをクラッシュさせるようなことでも、好きなことをほとんど実行できます。Javascriptは動的に型指定されますが、型セーフでもあります。プログラムをクラッシュさせるような操作は実行できません。C#は主にタイプセーフですが、コードの領域を明示的にマークし、unsafeタイプセーフではなくなったことを行うことができます。

Google Goは、型をいじってプログラムをクラッシュさせることができないという意味でタイプセーフです(ポインターに直接アクセスできません)。


「安全でない」パッケージを使用しない限り、その場合はプログラムを任意の方法でクラッシュできます:)
Eloff 14

あなたはできるタイプと周りの混乱やポインタへのアクセスを持っています。はい、そうすることでプログラムを簡単にクラッシュさせることができます。
18年

4

型が誤って解釈されることは決してないという点で安全に入力されますが、型が間違っているとプログラムがパニックになる可能性があります。


わかりません、型安全でないコードを実際にコンパイルできるということですか?(これは、ダイナミクスを使用しない限りc#では不可能です)
Pacerier

型アサーション、タイプごとに、実行すると、動的な型にメソッドを呼び出すように基本的にある
dan_waterworth

わかりましたので、要するに、C#が許可するような種類の安全性はありませんか?
Pacerier

型のアサーションを行わない場合はそうなります。
dan_waterworth

5
@Pacerier:ダイナミクスなしでC#でタイプミスされた式を実行することは完全に可能です:キャストをどこにでも挿入するだけです(これは基本的に型アサーションです)。
sepp2k

-1

Goのマップタイプはスレッドセーフではなく、静的に入力されます。型の継承、一般的なプログラミング、アサーション、メソッドのオーバーロード、またはポインター算術もありませ

型の安全性とメモリの安全性は長期的な目標であり、ここでは嘘です。

型安全性は、許容できるオーバーヘッドをキロバイトおよびメガバイト単位で示します。GoはMapReduceと「ビッグデータ」、エキソバイト、ペタバイトのデータで設計されており、タイプセーフでパフォーマンスの問題が発生します。

タイプセーフティは、サブタイピングとポリモーフィズム、およびアヒルタイピング(オブジェクトからオブジェクトへのキャスト)で制限される可能性があり、これにより危険が生じ、Goのような言語が大きなメリットをもたらすスペースも生まれます。C ++とJavaはGoに置き換えられていません。これは、分散プログラミングと超並列システムを支援する新しい言語です。

Bruce Eckelの大きな声明-「Goは、C ++が最初に解決することを意図していた問題のクラスにとって、はるかに理にかなっています」は議論の余地があります。C ++は非常に効率的な言語であり、MapReduceのBoost実装は非常に効率的です。

同時実行プリミティブは未来です。型の安全性は常に非常に議論の多いトピックであり、Goは20年以内に、またはAlgol以来この問題に対処した最初の言語かもしれません。


3
悲しいことに、この答えを-1にするためにはもっと評判が必要です。型の安全性はオーバーヘッドではなく、実行時のオーバーヘッドはバイト単位で明確に測定されるわけではなく、Javaの意味でのボクシング/アンボクシングはあります。静的型付けにより、コンパイラは動的型付け言語よりも多くの最適化を行うことができます。Map reduceは、スレッドセーフと同じように、ここにもそこにもありません。
エロフ14

Golangの一般的なパターンとして空のインターフェイスを使用して型をアサートし、言語機能としてジェネリックの実装を回避するというイディオムは、「タイプセーフ」と見なすものではありません。発生します(そして、それは)ダクトタップのロールの問題を解決するために今残っている人のプレートに複雑さを残しますgolangは機能を呼び出します。確かに、過去20年間に設計された言語のようには見えません。なぜなら、型安全性をはるかに優れた方法で扱う言語があるからです。
tsturzl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.