問題タブ [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.
static-typing - 静的型付けと動的型の定義
次の 2 つの定義のうち、正しいのはどれですか?
- 静的型付け- 型の一致はコンパイル時にチェックされます (したがって、コンパイルされた言語にのみ適用できます)。
- 動的型付け- 型の一致は実行時にチェックされるか、まったくチェックされません。(この用語は、コンパイルされた言語または解釈された言語に適用できます)
- 静的型付け- 型は変数に割り当てられるため、 「x は int 型です」と言えます。
- 動的に型付けされる - 型は値に割り当てられる (存在する場合) ため、 「x は int を保持している」と言えます。
この定義により、静的型付けまたは動的型付けは、コンパイル済み言語またはインタープリター型言語に関連付けられていません。
どちらが正しいですか、それともどちらも正しくありませんか?
ios - #DEFINEステートメントを使用しているときに静的入力機能が失われますか?
定義するときに静的型付け能力を失っているようですが、
これをする、
XcodeはdoSomethingが何であるかを知りませんが、私が何をしているかを知っている限り、コンパイルして正常に実行され、 doSomethingは実際にmyAppDelegateに存在します!
これを克服する方法はありますか?
java - 静的型付けの利点?
静的型付けが最適だと主張しているわけではなく、静的型付けが実際にどのような利点があるのか疑問に思っているだけです。私は彼らが次のように思った:
- より高速なコード
- いくつかのエラーを早期に発見する
私自身の使用 (Java での) を見ると、私は主にコンパイラーのために働いています。型エラーをキャッチするとき、それは通常、コード エラーではなくtypeのエラーです。
場合によっては、型を厳密にするためにコードを調べました。たとえば、インターフェイス I を実装するクラスのセットがあり、それらのクラスのいずれかを保持できるフィールドに型 I が与えられます。しかし、これで終わりになる可能性があります。 -broad: それらのクラスのサブセットのみを保持できるいくつかのフィールドもある場合があるため、そのクラスのサブセットのみによって実装される新しいインターフェイス J を作成することによって型システムを強化することができ、それらのフィールドには型 J が与えられます。より「正しい」、それは信じられないほど退屈で、何かが変わると非常に脆弱です。
したがって、主流のコンパイル済み言語 (Java、C#、C、C++、objective-C) での静的型付けの主な利点はコードの高速化であり、型安全性ははるかに 2 番目です。集積回路検証用の ml 言語など、非常に役立ちます。また、データベースでは静的型付けが重要であると聞いたことがあります。
しかし、私はもう1つの利点があると思います:
- ドキュメンテーション
メソッドを見て、有効な引数が何であるかを知ることができるというドキュメント。また、自動生成されたドキュメントの場合、引数の型は、利用可能なインターフェイスと実装にハイパーリンクされています。これは致命的な利点だとは思いませんが、本当の利点です。
明らかに、python や ruby などは、静的な型付けがなくてもうまく機能します。どんなメリットがあるのだろうと思うのですが、どう思いますか? あなたの経験は何ですか?
type-inference - 静的、構造型、グローバル型推論を備えた命令型言語
Haskellのような言語が静的に型付けされ、型推論を持っていることを私は知っています。しかし、グローバル型推論を備えた非関数型言語はありますか。これは、型推論と構造型を備えたCのようなものに相当します。
c# - ランタイム オーバーヘッドのない静的型チェックを使用した C# のインデックスの Typedef
複雑なインデックス付けで多次元配列を使用するのはかなり一般的なケースです。すべてのインデックスが int であると、列と行 (またはあなたが持っているもの) を簡単に混同することができ、コンパイラが問題を特定する方法がないため、非常に混乱し、エラーが発生しやすくなります。実際には、行と列の 2 種類のインデックスが必要ですが、型レベルでは表現されません。
ここに私が欲しいものの小さなイラストがあります:
要約:
- インデックスが混同されていないか静的にチェックする必要があります (一種の型チェック)
- 重要!int をインデックスを含むカスタム オブジェクトにラップしてからアンラップするのはパフォーマンスに問題があるため、実行時に効率的である必要があります。
- ネイティブの多次元配列でインデックスとして機能するために、暗黙的に int に変換できる必要があります。
これを達成する方法はありますか?typedef
完璧な解決策は、プレーンintにコンパイルするだけのコンパイル時のチェックとして機能するようなものです。
html - TypeScript: 型システムの問題
VisualStudio 2012 で typescript をテストしているだけで、その型システムに問題があります。私の HTML サイトには、ID「mycanvas」のキャンバス タグがあります。このキャンバスに長方形を描こうとしています。これがコードです
残念ながら、VisualStudioはそれを訴えます
プロパティ「getContext」はタイプ「HTMLElement」の値に存在しません
2行目をエラーとしてマークします。これは単なる警告だと思っていましたが、コードはコンパイルされません。VisualStudioはそれを言う
ビルドエラーがありました。最後に成功したビルドを続行して実行しますか?
私はこのエラーがまったく好きではありませんでした。動的メソッド呼び出しがないのはなぜですか? 結局、メソッド getContext はキャンバス要素に確実に存在します。しかし、この問題は簡単に解決できると思いました。キャンバスの型注釈を追加しました。
しかし、型システムはまだ満足していませんでした。これが新しいエラー メッセージです。今回は最初の行にあります。
'HTMLElement' を 'HTMLCanvasElement' に変換できません: タイプ 'HTMLElement' にタイプ 'HTMLCanvasElement' のプロパティ 'toDataURL' がありません
まあ、私は静的型付けに全力を尽くしていますが、これにより言語が使用できなくなります。型システムは私に何をさせたいのですか?
アップデート:
Typescript は実際に動的呼び出しをサポートしておらず、私の問題は型キャストで解決できます。私の質問は基本的に、このTypeScript の複製です: HTMLElement のキャスト
types - 関数のセットとその型付け規則を表す
一連の関数とその型付け規則を表現したいと考えており、データ構造について考えています...たとえば、
いくつかのコメント: 関数とルールの名前は常に一意です。1 つの関数 (例: PLUS) は常に一定数の引数を持ち、それに関連するいくつかの型付け規則を持つことができます。型付け規則には、1 つの名前 (例: PLUS-integer)、1 つの前提、1 つの結論、および 1 つの優先順位があります。同じ前提を共有するが、異なる結論を与える 2 つの型付け規則がある場合があります。この場合、違いを生むのは優先度です。
後で、次のような関数を定義する必要があります。
この目的のために、これらの型を定義する従来の方法があるかどうかはわかりません...現時点では、次のような方法を想像しています。
いくつかの質問:
1)配列と比較してrules
、のリストとして定義するのは良い考えですか...rule
func
2)との関係については、rules
いくつかのオプションがありrules
ますfunc
。func
のレコード フィールドとして作成しrule
ます。と のハッシュ テーブルを作成func
しrules
ます。func
からまでのマップを作成しrules
ます。どっちがいいのかさっぱりわからない…
考慮しなければならないもう 1 つの側面は、このデータベースのイニシエーションです。入力する項目がたくさんあるので、選択したタイプによって、イニシエーションが簡単に入力でき、簡単に見えるようになることを願っています...
誰でも助けてもらえますか?
c++ - これは静的型付けで行うことができますか?
std::vector<?>
このメソッドは、キー ( ) に基づいて( ) を選択しようとしますstd::string
。ここで、?
は または のいずれint
かfloat
です。
クラスの関連メンバーは次のとおりです。
auto nodeMap
(= std::vector<?>
) が初期化されていないため、これはコンパイルされません。しかし、それを初期化するには、コンパイル時にその型を知る必要があります。
私が試みていることは、静的型付けでは実行できないかもしれません。これを達成するC++の方法はありますか?
heap-memory - 動的型バインディングを使用する言語では、すべての変数がヒープに割り当てられていると言えますか?
ストレージバインディングに基づくバインディングプロセスと変数の分類について研究しています。そのため、次の 4 種類の変数に直面しました。
- 静的変数: これらは実行前 (つまり、コンパイル中) にメモリにバインドされ、実行中ずっとバインドされたままです。
- スタック動的変数: これらの変数は、コンパイル時に型に静的にバインドされますが、コードの実行が宣言に到達するまでメモリ位置にバインドされません。
- 明示的なヒープ動的変数: これらの変数は、明示的な実行時のプログラマ指定の命令によって割り当ておよび割り当て解除されます。必要なメモリ セルを提供するために、スタックではなくヒープが使用されます。
- 暗黙的なヒープ動的変数: メモリ セルを含むこれらの変数のすべての属性は、値が割り当てられるときにバインドされます。
私の質問は、タイプ 2 と 4 に関するものです。タイプ ビディングが動的なプログラミング言語 (Php、Ruby、Python など) では、すべての変数がタイプ 4 のように見えます。
本当ですか?ローカル変数を含むすべての変数がヒープに置かれますか? これは実装の問題ですか、それともローカル変数がスタックに置かれ、他の変数がヒープに置かれる動的型バインディングを持つ言語を実装する可能性はありませんか?
java - Java言語を解釈するための良いライブラリはありますか?
多くの場合、クラスを明示的にコンパイルする必要はありません (つまり、単体テストの実行 -必ずしもコンパイルしてパッケージ化する必要はなく、実行可能にしたいだけです) 。
Javaを解釈するためのライブラリがあるかどうか知りたいです。
Scala(静的型付け、jvmで実行)にはインタープリターが組み込まれているため、Javaでも技術的に可能であると理解しています。