問題タブ [static-typing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ はどの程度静的型付け言語ですか?
以前は、この質問に対する答えは「100%」だと思っていましたが、最近、再考する価値のある例を指摘されました。自動保存期間を持つオブジェクトとして宣言された C 配列を考えてみましょう。
ここで、 の型foo
は明らかにint[42]
です。代わりに、次のケースを検討してください。
ここで、 の型はfoo
ですが、コンパイル時に式によって作成されたオブジェクトint*
の型をどのように判断できますか? (強調は、式によって返されるポインターについて話しているのではなく、式によって作成された配列オブジェクトについて話しているという事実を強調することを目的としています)。new
new
new
new
これは、C++11 標準のパラグラフ 5.3.4/1 が式の結果について指定しているものです。
[...] new-expressionによって作成されたエンティティには、動的ストレージ期間 (3.7.4) があります。[ 注: そのようなエンティティの有効期間は、必ずしもそれが作成されたスコープに制限されるわけではありません。—終わりの注] エンティティが非配列オブジェクトの場合、new-expressionは作成されたオブジェクトへのポインターを返します。配列の場合、new-expression は配列の最初の要素へのポインターを返します。
私は以前、C++ ではすべてのオブジェクトの型がコンパイル時に決定されると考えていましたが、上記の例はその信念を反証しているようです。また、パラグラフ 1.8/1:
[...] オブジェクトのプロパティは、オブジェクトの作成時に決定されます。オブジェクトには名前を付けることができます (条項 3)。オブジェクトには、その寿命 (3.8) に影響を与える保存期間 (3.7) があります。オブジェクトには型 (3.9) があります。[...]
だから私の質問は:
- 最後に引用した段落の「プロパティ」は何を意味していますか? 明らかに、オブジェクトの名前は、「オブジェクトが作成されたときに」決定されるものとしてカウントすることはできません-ここで「作成された」が私が考えているものとは異なることを意味しない限り。
- 実行時にのみタイプが決定されるオブジェクトの例は他にありますか?
- C++ が静的に型付けされた言語であると言うのは、どの程度正しいのでしょうか? というか、この点で C++ を分類する最も適切な方法は何ですか?
誰かが上記の点の少なくとも 1 つについて詳しく説明できれば素晴らしいことです。
編集:
標準は、new
式が実際に配列 objectを作成することを明確にしているようです。パラグラフ 5.3.4/5 による ( Xeo 提供):
割り当てられたオブジェクトが配列の場合(つまり、noptr-new-declarator構文が使用されるか、new-type-idまたは type-idが配列型を示す)、new-expression は最初の要素へのポインターを生成します ( any) の配列。[注: と の両方が type
new int
を持ち、 の型は--end note ] noptr-new-declarator のattribute - specifier-seqは、関連付けられた配列 type に属します。new int[10]
int*
new int[i][10]
int (*)[10]
c# - メソッドから匿名型を受け取り、コンパイル時にそのメンバーを知る
C# の匿名型について多くの質問があることは承知していますが、どれも答えてくれません。また、メソッドの結果をオブジェクトに代入するか、Jon Skeet によるこの記事dynamic
のようにキャストすることで、匿名型を返すことができることも知っていますが、どちらの場合も、匿名オブジェクトのメンバーを知る必要があるため、なぜ次のようなことを可能にするキーワードのような名前を付けることはできませんか。anonymous
そして、次のように使用します。
しかし、静的型付けはありますか? つまり、匿名オブジェクト メソッドの戻り値のメンバーをコンパイラが静的に認識できないのはなぜF
でしょうか。
strong-typing - STRONG タイピングと STATIC タイピングの違い
静的型付けと動的型付けの違い、強い型付けと弱い型付けの違いは知っているのですが、強い型付けと静的な型付けの違いについて質問されました!
しかし、私が知っているように、強力で静的な型付けは、そもそもさまざまなトピックについて話します! だから私はこの質問に答える方法を知りません, 誰かが彼らが何を意味するか知っていますか?
scala - scala の cloneable-like trait の正しい型指定
問題は についてAnyRef.clone()
ではなく、同様のセマンティックを持つケースについてです。
それ自体のコピーを作成する可能性のあるクラスのインターフェイスを定義したいと思います。
はクラス タイプと を拡張するクラスで異なるため、パス依存this.type
は機能しません。次に、子孫は clone メソッドをオーバーライドして、独自の型に一致させる必要があります。this.type
Test
Test
Cloneable トレイトの型要件をどのように定義すればよいですか?
私は scala コレクションをのぞき見しましたが、ここでヒントを見つけました:TestLike
型制限を処理する trait と、Test
対応する trait を具体化するクラスを定義します。
不必要な不器用さはできれば避けたい
提案された自己反復パターンを試す:
エラーで失敗しました:
反復テンプレートの別の問題: 時期尚早のファイナライズ
の問題は、クラスに存在しないメソッドをSubStore
無視する型システムにありますが、を介した子孫です。しかし、型パラメーターとそのすべての子孫を持つファイナライズインターフェイスには、適切なメソッド制限がありませんclone()
SubStore
SubStore
Cloneable
Store
Store
Cloneable
Store
clone()
compiler-construction - Lisp はどのようにして動的かつコンパイル済みであることができますか?
さて、最初にこれを邪魔にならないようにします:私は次の答えを読みました:
しかし、私はその答えを本当に理解していません。
Python のような言語では、式:
実際にはコンパイルできません。「コンパイラ」に関しては、a と b の型を知ることができず (型は実行時にしかわからないため)、したがってそれらを追加する方法もわかりません。
これが、Python のような言語を型宣言なしではコンパイルできない理由ですよね? 宣言を使用すると、コンパイラは、たとえば a と b が整数であることを認識しているため、それらを追加する方法とそれをネイティブ コードに変換する方法を認識しています。
では、次のようにします。
仕事?
コンパイル済みは、ネイティブの事前コンパイルとして定義されています。
編集
実際には、この質問は、型宣言のない動的言語をコンパイルできるかどうかに関するものです。
編集2
多くの調査 (つまり、熱心なウィキペディアの閲覧) の結果、次のことを理解していると思います。
- 動的型付き言語は、実行時に型がチェックされる言語です
- 静的型付き言語は、プログラムのコンパイル時に型がチェックされる言語です
- 型宣言により、コンパイラは常に API 呼び出しを行う代わりに、よりネイティブな「関数」を使用できるため、コードをより効率的にすることができます (そのため、Cython コードに型宣言を追加して高速化することができますが、 C コードで Python ライブラリを呼び出すことができるため)
- Lisp にはデータ型はありません。したがって、チェックする型はありません (型はデータそのものです)
- Obj-C には静的宣言と動的宣言の両方があります。前者はコンパイル時に型チェックされ、後者は実行時に型チェックされます
上記の点で間違っている場合は修正してください。
python - Python のオプションの静的型付けの状態?
私はしばらくの間 Typscript をいじっていましたが、Web 開発のニーズに合わせて nodejs が CPython の現在の実装よりも高速であるという事実にバンドルされていると言わざるを得ません。
実際、デスクトップ用であっても、いくつかの基本的なアプリを作成しました。Typescript について私が気に入っているのは、オプションの静的型があるという事実です。これにより、多くの場合、コーディングがはるかに簡単になります。また、すぐにコーディングしてプロトタイプを実行したい場合には、インテリセンスが優れていることは言うまでもありません。開発プロセスで遭遇するバグも少なくなりました。
しかし、ここに問題があります。私は Python を使って 1 年になりますが、この言語が大好きで、構文に慣れているだけです。しかし、オプションの静的型付けが Python にとって素晴らしい利点になり得ることがますますわかります。そこで、少し調査を行いました。まず、静的型付けの現在の状況を理解しようとすることから始めました。他の人と同じように、検索エンジンを使用して調べました。
これらは、私が読んだ情報源の一部です。
ここで実装を見ると(上記のリンクからの抜粋):
さて、これは Typescript での実装と非常によく似ています。しかし日付を見ると2004年までさかのぼります。
次に、BDFL の Guido が作成したスライドをもう一度見てみました。
繰り返しますが、同じレトリックが見られます。ただし、これに関する新しい情報を見つけることができませんでした。
また、静的型の強制に関するこの SO の回答も見てみました。
では、Python でオプションの静的型付けを追加する状況や状態はどうですか? それとも、Typescript のようなものを発明する必要がありますが、Python 3 用ですか?
私自身の非常に限られた経験では、複雑なクラスを作成したり大規模なプロジェクトを作成したりするときに Typescript や C# のようなものがうまく機能することを確認したため、オプションの静的型付けは重要であると考えています。コードをより速く、エラーなしで書くのを助ける方法。私はここにいるほとんどの開発者ほど上手ではないと確信していますが、それが私の見解です。だからこそ、この質問は重要だと思います。つまり、Python が提供する美しい構文を備えた C# のような言語のオプションの型付けがあれば、Python はおそらく止められないでしょう (イェイ!)。
私はこれについていくつかの調査を行いましたが、実質的なものは何も得られなかったので、SOの素晴らしく賢明なメンバーの何人かがこの問題に光を当てることを望んでいました.
java - null をオプトインのみにする
nullが嫌いだったとしましょう。@Nullable のように、オプトアウトしても十分ではないことにしましょう。オプトインしたいとしましょう。オブジェクトに明示的に @Nullable アノテーションが付けられていない場合、null は許可されません。
例:
もう一つの例:
これについてどうすればいいですか?ある種の javac プラグインを作成しますか? おそらくプリコンパイラパス?たぶん、これを行うフレームワークがそこにありますか?それとも、javac のソース コードを変更できますか?
ありがとう!