問題タブ [compile-time]

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.

0 投票する
3 に答える
653 参照

oop - 型キャストのない言語

私の質問は、タイトルが言っていることのほとんどです:明示的な型キャストを許可しないプログラミング言語を持つことは可能ですか?

Base言いたいことを明確にするために、親クラスと子クラスを持つ C# のような言語で作業していると仮定しますDerived。明らかに、そのようなコードは安全です:

継承階層が上がるので安心ですが、

降りるのは安全ではないため、安全は保証されません。

ただし、安全性に関係なく、このようなダウンキャストは多くの言語 (Java や C# など) で有効です。コードはコンパイルされ、型が正しくない場合は実行時に失敗します。したがって、技術的には、コードは依然として安全ですが、コンパイル時チェックではなく実行時チェックを介して行われます (ちなみに、私は実行時チェックのファンではありません)。

個人的には、少なくとも理論的な観点から、せいぜい信頼できるコードの観点から、コンパイル時の完全な型安全性が非常に重要であると考えています。コンパイル時の型安全性の結果として、キャストは不要になります (これは素晴らしいことだと思います。とにかく醜いからです)。キャストのような動作は、暗黙的な変換演算子またはコンストラクターによって実装できます。

だから私は疑問に思っています.現在、キャストが時代遅れであるほど厳密なタイプの安全性をコンパイル時に提供するオブジェクト指向言語はありますか? つまり、安全でない変換操作は一切許可されていませんか? それとも、これがうまくいかない理由がありますか?

ご意見ありがとうございます。

編集

例によって明確にすることができれば、これが私がダウンキャストをとても嫌う大きな理由です。

私が次のものを持っているとしましょう(大まかにC#のコレクションに基づいています):

ここで、誰かが次のようなコードを書くことにしたとします。

最後の行でキャストが必要であることに注意してください。しかし、それは有効ですか?一般的ではありません。List<T>.Filter確かに、 の実装が別の を返すことは理にかなっていますList<T>が、これは保証されていません ( の任意のサブタイプである可能性がありますIEnumerable<T>)。ある時点でこれが実行されたとしても、後のバージョンでこれが変更される可能性があり、コードがいかに脆弱であるかが明らかになります。

ダウンキャストが必要だと私が考えることができるほとんどすべての状況は、この例のようなものになります。メソッドにはクラスまたはインターフェイスの戻り値の型がありますが、実装の詳細がいくつかわかっているため、結果をダウンキャストすることに自信があります。しかし、OOP は実装の詳細からの抽象化を実際に促進するため、これは反 OOP です。では、純粋な OOP 言語であっても、なぜそれを行うのでしょうか?

0 投票する
1 に答える
3087 参照

c++ - コンパイル時の C++ 型 ID

コンパイル時に派生型に基づいてクラスのハッシュを生成したいと考えています。今日、私はそれを次のように生成します:

しかし、これは(かなり不必要に)ランタイム初期化コードを生成します( hash(..) 関数は std::type_info::name() に基づいて単純なハッシュを行います)

アイデア?

0 投票する
2 に答える
196 参照

serialization - c++0xで「重複のないシリアル化」は可能ですか?

C++ でのコード生成の大きな用途の 1 つは、メッセージのシリアル化をサポートすることです。通常、同じステップでメッセージのコンテンツとレイアウトの指定をサポートし、通信ストリームとの間でシリアル化できるオブジェクトを提供できるそのメッセージ タイプのコードを生成します。これまでは、通常、次のようなコードが生成されていました。

この種の設計を使用する際の問題は、優れたアーキテクチャの重要なルールに違反することです。つまり、設計の意図を 2 回指定する必要はありません。重複したコードやその他の一般的な開発の重複など、意図の重複により、コード内の 1 つの場所が他の場所と発散する余地が生じ、エラーが発生します。

上記では、複製はメンバーのリストです。潜在的なエラーには、メンバーをクラスに追加したが、それをシリアライゼーション リストに追加するのを忘れている、メンバーを 2 回シリアライズしている (メンバー宣言と同じ順序を使用していない、または同様のメンバーのスペル ミスが原因である可能性があります) などがあります。 、またはメンバーではないものをシリアル化します (名前の検索で、検索規則に一致するオブジェクトとは異なるスコープで何かが見つからない限り、コンパイラ エラーが発生する可能性があります)。この種の間違いは、すべてのヒープ割り当てを (スマート ポインターを使用する代わりに) 削除と一致させたり、(RAII ctor//dtor メカニズムを使用して) ファイルを閉じて開いたりすることをもはや試みないのと同じ理由です。

したがって、一般的に、これはコード生成で処理できるものの 1 つです。ファイル MyMessage.cg を作成して、レイアウトとメンバーの両方を 1 つのステップで指定することができます。

コード生成ユーティリティを介して実行され、コードが生成されます。

外部コード生成なしで c++0x でこれを行うことがまだ可能かどうか疑問に思っていました。クラスを一度シリアライズ可能として指定できるようにする新しい言語メカニズムはありますか?そのメンバーの名前とレイアウトは、シリアライズ中にメッセージをレイアウトするために使用されますか?

明確にするために言うと、c++0x より前の言語でも、この種の動作に近づくことができるブースト タプルとフュージョンのトリックがあることを私は知っています。ただし、これらの使用法は、メンバー名によるアクセスではなくタプルへのインデックス付けに基づいているため、メッセージにアクセスするコード内の他の場所も並べ替える必要があるため、レイアウトを変更することはすべて脆弱です。メッセージを使用するコード内の場所でレイアウト仕様を複製する必要がないように、ある種のメンバー名によるアクセスが必要です。

また、これを次のレベルに引き上げて、一部のメンバーをいつシリアライズしてはならないかを指定するように依頼するとよいかもしれません。組み込みのシリアライゼーションを提供する他の言語は、多くの場合、これを行うための何らかの属性を提供します。自然に見えるかもしれません。ただし、メッセージの有効期間は、他のデータの有効期間とは別に、通信レイヤーとの間のトランスポートにあるため、すべてがシリアル化されていないシリアル化可能なオブジェクトを持つのは悪い設計だと個人的には思います。また、そのメンバーのように純粋にシリアライズ可能なオブジェクトを持つこともできます。そのため、そのような機能は、言語がまだ提供していないものではありません。

これは可能ですか?それとも、標準化委員会はこの種の内省機能を除外したのでしょうか? 上記のコード gen ファイルのようにする必要はありません。コンパイル時にレイアウトとメンバーを 1 つのステップで指定する簡単な方法を使用すれば、この一般的な問題を解決できます。

0 投票する
3 に答える
884 参照

android - Android-コンパイル時に大きなファイルを保存する

この美しく複雑すぎるフレームワークで、このような単純なことをどの程度正確に行うのでしょうか。

はい、Android用のデータストレージに関するドキュメントを約54.5回読みました。しかし、コンパイル時に外部ストレージにファイルを配置する方法がドキュメントに記載されている場所は見つかりません。

これが私がやりたいことです:私は私のアプリケーションにいくつかの(大きな)(10-20mb)オーディオファイルを含めたいです。当然、大きすぎるので、これらを内部ストレージに保存したくありません。したがって、それらをres / rawに配置することはできません(私が正しく理解していれば、res / rawにあるものは電話の内部ストレージに配置されますよね?)

ドキュメントには、「コンパイル時に静的ファイルを保存する場合は、res/rawを使用する」とのみ記載されています。今、Androidがそれらのファイルをすべてそれ自体で外部ストレージに配置するのに十分賢いなら、私は永遠に素晴らしいです..しかし、どういうわけか私はそれを疑っています。すべての助けに感謝します:)(私が態度を持っているように思われる場合は申し訳ありませんが、私はとても単純なことにあまりにも多くの時間を費やしました)

再度、感謝します :)

更新:インストール時にファイルを含めるのではなく、アプリケーションからファイルをダウンロードすることになりました。助けてくれてありがとう!

URLを介してダウンロードしようとしたときに問題が発生し、それを機能させるために多くの時間を費やしました。結局、問題は、Androidマニフェストファイルで正しいアクセス許可を宣言していなかったことが原因でした。したがって、アプリにダウンロードすることを検討している人は、Androidマニフェストでアクセス許可を設定することを忘れないでください。必要なアクセス許可は次のとおりです。

これらをタグの先頭の上に配置します

0 投票する
2 に答える
355 参照

python - Python と比較した場合、scala の遅いコンパイルは Web サイトプロジェクトで使用することに対する要因ですか?

私のウェブサイト プロジェクトでは、現在、python または scala の使用に関して競合が発生しています。scala に反対する議論の 1 つは、Python がコンパイルさえしないのに対し、コンパイル時間が遅いことでした。この質問の回答によると、 IntelliJ IDEA が Scala をコンパイルするのに時間がかかるのはなぜですか?

私の質問は、ウェブサイトについてです。考慮すべきより重要なことは何ですか。言語のコンパイル時間が遅い、または言語の実行が遅い。scala の遅いコンパイル時間は影響要因ですか? 私の知る限り、scala のコンパイル済みコードは、解釈された Python コードよりも高速に実行されます。

注 - 言語がスケーリングしないのは正しいことですが、アーキテクチャとコードはスケーリングしますが、高速に実行される言語を使用しても害はありません。

0 投票する
2 に答える
908 参照

scala - クラスを取得コンパイル時に?

Java では、次のように記述できます。

私は Scala をいじっていて、もう少し欲しい: 次のように、コンパイル時にメソッド (およびそのジェネリック型) を取得したい:

あるいは:

Scalaでこのようなことをする方法はありますか?

0 投票する
2 に答える
557 参照

visual-studio-2010 - コンパイル時に GAC からフォルダーへの参照パスを変更する

いくつかのサードパーティ ライブラリに依存するプロジェクトがあります。これらのアセンブリは GAC に登録されます。これまでのところ、すべてが正常に機能しています。ただし、ビルド サーバーでプロジェクトをビルドする場合、サード パーティのアセンブリは GAC にはありませんが、ビルド サーバーが使用する SVN リポジトリにもある追加のフォルダー ( externalと呼ばれる) にあります。

MSBuild がこれらのアセンブリを見つけられないため、ビルドは失敗します。ビルドサーバー上の MSBuild に、GAC の代わりにこのフォルダーのアセンブリを使用するように指示する方法はありますか?

0 投票する
1 に答える
175 参照

reflection - Dでコンパイル時に構造体またはクラス内の名前と型をどのように列挙しますか?

コンパイル時に構造体またはクラス内の名前と型をどのように列挙しますか?

つまり、次のことを行います。

ありがとう、

クリス。

0 投票する
1 に答える
1344 参照

c++ - C++タイプの特性の概要

<type_traits>標準(GCC-4.6.1)とBoost独自で利用可能なすべてのタイプ特性のリストをまとめた人はい<boost/type_traits.hpp>ますか?

0 投票する
1 に答える
840 参照

c# - WAPのProfileCommonは実行時に機能しますが、コンパイル時には機能しません

Webアプリケーションプロジェクトがあり、web.configにプロファイルプロパティを実装しています。ProfileCommonグーグルで検索したオブジェクトにアクセスできないことがわかったとき、いくつかの回避策を見つけました。

等々。ProfileCommonしかし、実行時にオブジェクトがあるとは誰も言いませんでした。これが私の例です:

この行はうまくコンパイルされて機能しますが、ハードコードされたプロパティ名があります。

しかし、この行はコンパイルされず、エラーが発生します。タイプまたは名前空間の名前'ProfileCommon'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)):

しかし、実行時にVisual Studio Watchウィンドウで行を実行しようとしましたが、機能しました。イベントはキャストなしのタイプProfileBase.Create(userCurrent.UserName)を表示しました。ProfileCommonIntellisenseは機能しませんでしたが、オブジェクトを検査でき、両方のプロファイルプロパティが定義されていることがわかりました。

カスタムクラス以外の唯一の方法である場合は、ハードコードされたプロファイルプロパティ名を使用してもかまいませんが、クラスがコンパイル時ではなく実行時に使用できるProfileCommon理由を説明したいと思います。ProfileCommon