問題タブ [low-level]

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 投票する
2 に答える
4655 参照

delphi - 低レベルのキーボードフックの問題:アプリケーションがフォーカスされていないときにキーボードの状態が失われる(Delphi)

既存のアプリケーションと一緒に動作する新しいアプリケーションを開発するように依頼されました。両方のアプリケーションは、バーコードリーダーの入力を待ちます。オペレーターにバーコードを2回スキャンさせたくありません。1回は既存のアプリケーション(16ビット-クリッパー、ソースなし)で、もう1回は新しいアプリケーションです。この問題を解決するために、低レベルのキーボードフック(Delphiで記述)を使用することにしました。2つのアプリケーションがバーコードリーダー入力を必要とし、私のアプリケーションがほとんどの時間焦点を合わせられないので、それは完璧に見えます。

私のアプリケーションがフォーカスされているとき、私の低レベルのキーボードフックはうまく機能しています。たとえば、TEditコントロールを入力してから、バーコードをスキャンした場合:

  • 待機中の文字がTEditコントロール(#02; 90BDIJ#)に表示されます。
  • 低レベルのフックはすべての文字を取得します(#、次に0、次に2など)。

アプリケーションの焦点が合わなくなると、状況はさらに悪化します。メモ帳を開いてからバーコードをスキャンすると、状況はさらに悪化します。

  • 待機中の文字がメモ帳(#02; 90BDIJ#)に表示されます。
  • 低レベルのフックは間違った文字を取得します:"àé;çàbdij"

キーボードの状態が考慮されていないようです。Shiftキー、Ctrlキー、またはAltキーも考慮されていないようです。私のフランス語キーボードでは:

  • '#' = CTRL = ALT + "
  • '0' =SHIFT+à
  • '2' =SHIFT+é
  • ..。

誰かが今この問題を解決する方法はありますか?私はそれを間違った方法で行っていますか(代わりにWindowsメッセージを使用する必要がありますか?)。前もって感謝します。

FWIWこれが私のソースコードです:

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

c - クロスプラットフォームVMのCメモリ管理

Cタイプのサイズについて質問したところ、かなり良い答えが得られましたが、自分の目的に役立つように質問をうまく定式化できない可能性があることに気付きました。

私の経歴は、ソフトウェアエンジニアに移る前はコンピュータエンジニアでした。そのため、コンピュータアーキテクチャが好きで、常にVMの作成を考えています。私は、JavaでVMを作成する興味深いプロジェクトを終えたところです。これは、私が非常に誇りに思っていることです。しかし、現在オープンソース化できない法的な問題がいくつかあり、現在は自由な時間があります。ですから、楽しみと教育のためだけに、Cで別のVMを(より高速に)作成できるかどうかを確認したいと思います。

問題は、私がトリビア以外のCの問題を最後に書いたのは、10年以上前のCプログラムではないということです。私はPascal、Delphi、そして今ではJavaとPHPのプログラマーでした。

私が予見できる多くの障害があり、私は1つに取り組もうとしており、それは既存のライブラリにアクセスしています(Javaでは、リフレクションがこの問題を解決します)。

データのバッファ(スタックと同様)を用意することで、これを解決する予定です。VMのクライアントは、ネイティブ関数へのポインターを指定する前に、これらのスタックにデータを配置するようにプログラムできます。

ネイティブ関数のプッシュ、プル、および呼び出しは、バイトコード(VMが後で作成される方法)によってトリガーできます。

完全を期すために(マシンで試すことができるように)、Stackのコードは次のとおりです。

ネイティブ関数側では、テスト目的で次のものを作成しました。

p>

実行すると、上記のコードは次を返します。

これは私のマシン(Linux x86 32ビットGCC-C99)でうまく機能します。これが他のOS/アーキテクチャでも機能する場合は非常に便利です。しかし、私たちが注意しなければならない少なくとも3つのメモリ関連の問題があります。

1)。データサイズ-同じアーキテクチャで同じコンパイラを使用してVM関数とネイティブ関数の両方をコンパイルする場合、サイズタイプは同じである必要があるようです。

2)。エンディアン-データサイズと同じ。

3)。メモリアライメント-これは構造体にパディングバイトが追加される可能性があるため問題ですが、パラメータスタックを準備するときに同期するのは困難です(ハードコーディング以外にパディングがどのように追加されるかを知る方法はありません)。

私の質問は次のとおりです。

1)。タイプのサイズがわかっている場合、構造体のパディングと正確に同期するようにプッシュおよびプル関数を変更する方法はありますか?(コンパイラがデータサイズやエンディアンの問題のように処理できるように変更します)。

2)。構造を1つずつパックすると(を使用#pragma pack(1)); (2.1)パフォーマンスペナルティは許容されますか?(2.2)プログラムの安定性は危険にさらされますか?

3)。2、4、または8でパディングするのはどうですか?一般的な32ビットまたは64ビットシステムにはどちらが適していますか?

4)。x86上のGCCの場合など、正確なパディングアルゴリズムのドキュメントを教えていただけますか?

5)。より良い方法はありますか?

注:クロスプラットフォームは私の究極の目標ではありませんが、抵抗することはできません。また、それほど醜くないので、パフォーマンスは私の目標ではありません。これらはすべて楽しみと学習のためのものです。

私の英語と非常に長い投稿でごめんなさい。

よろしくお願いします。

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

c - インラインアセンブラ:どのスクラッチレジスタを使用できますか?

インラインアセンブラをCのような言語の関数に挿入する場合、スクラッチに使用できるレジスタについての規則は何ですか?asmブロックに入る前に保存する必要のあるすべてのレジスタの値を保存するのはコンパイラの責任ですか?これらのレジスタの値をどこかに格納し、asmブロックを終了する前にそれらを復元するのはプログラマーの責任ですか?典型的な規則はありますか、それともこれは非常に実装固有ですか?

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

.net - .NET アセンブリの "~" メタデータ ヘッダーの並べ替えられたビット ベクトル フィールドの目的は何ですか?

パーティション II メタデータによると、有効なフィールドは、.NET 実行可能ファイルに存在する CLR メタデータ テーブルを示すビットマスクであると書かれていますが、「並べ替えられた」フィールドが何のためにあるのかはわかりません。 .NET ポータブル実行可能イメージを独自に作成する場合、このフィールドには何を出力する必要がありますか?

0 投票する
5 に答える
2256 参照

winapi - メイン EXE に LowLevelMouseProc と LowLevelKeyboardProc を配置できますか?

フックは別のプロセスのコンテキストで呼び出されるため、グローバル Windows フックは DLL 内にある必要があります。そのため、フック プロシージャのコードをそのプロセスに挿入する必要があります。ただし、制限があります。

SetWindowsHookExDLL を別のプロセスに挿入するために使用できます。32 ビット DLL を 64 ビット プロセスに挿入することはできず、64 ビット DLL を 32 ビット プロセスに挿入することもできません。アプリケーションが他のプロセスでフックを使用する必要がある場合、32 ビット アプリケーションを呼び出し SetWindowsHookExて 32 ビット DLL を 32 ビット プロセスに挿入し、64 ビット アプリケーションを呼び出し SetWindowsHookExて 64 ビット DLL をプロセスに挿入する必要があります。 64 ビット プロセス。32 ビット DLL と 64 ビット DLL は異なる名前にする必要があります。

このため、 and の代わりに低レベルのフック and を使用したいと思いWH_MOUSE_LLます。ドキュメントからわかるようWH_KEYBOARD_LLWH_MOUSEWH_KEYBOARD

このフックは、それをインストールしたスレッドのコンテキストで呼び出されます。呼び出しは、フックをインストールしたスレッドにメッセージを送信することによって行われます。したがって、フックをインストールしたスレッドにはメッセージ ループが必要です。

このことから、これらの特定のフック プロシージャは別の DLL に存在する必要はなく、それらをフックした EXE 内に存在するだけでよいと考えるようになりました。ただし、のドキュメントには次のように記載されています。SetWindowsHookEx

lpfn

[in] フック プロシージャへのポインター。dwThreadIdパラメーターがゼロであるか、別のプロセスによって作成されたスレッドの識別子を指定する場合、パラメーターはlpfnDLL 内のフック プロシージャを指している必要があります。

2 つの低レベルのフックに対する明示的な例外は言及されていません。

別の DLL にフック プロシージャを持たずに、低レベルのフックを使用する .NET アプリケーションをいくつか見てきました。これは、これが受け入れられることを示すもう 1 つのヒントです。ただし、ドキュメントで禁止されているため、自分でこれを行うのは少し怖いです。

DLL を使用せず、これらの低レベルのフック プロシージャを直接 EXE に挿入した場合に問題が発生すると予測する人はいますか?

編集:報奨金については、決定的な「はい、これは大丈夫です...」または「いいえ、これはうまくいかない可能性があるため...」.

0 投票する
6 に答える
10443 参照

performance - What's the most efficient way to compare two blocks of memory in the D language?

I need a comparison function for blocks of memory for doing binary searches on arrays of bytes in the D programming language. It does not need to have any useful semantics. It only needs to be fast and be a valid comparison function (one that produces a total ordering). The blocks of memory to be compared are already known to be the same length.

C's memcmp is actually pretty slow because it tries to preserve useful string comparison semantics, which I don't need. Below is the best I've come up with so far. Does anyone know of anything better, preferably w/o dipping into non-portable CPU-specific instructions?

Edit: I've read up on SSE and I don't want to use it for 3 reasons:

  1. It's not portable.
  2. It requires programming in ASM.
  3. The comparison instructions assume your data is floating points, which might be problematic if some data happens to match the pattern for a NaN.
0 投票する
5 に答える
601 参照

java - 割り当ての待ち時間が長いようですが、なぜですか?

低レイテンシ環境で実行される (Java) アプリケーションがあります。通常、命令は最大 600 マイクロ (+/- 100) で処理されます。当然のことながら、マイクロ秒の空間にさらに移行すると、レイテンシーの変化が見られます。現在、その時間の 2/3 が 2 つのコア ドメイン オブジェクトの割り当てに費やされていることに気付きました。

ベンチマークは、コードの問題のあるセクションを既存の参照から文字通りオブジェクトの構築に分離しました。つまり、基本的に参照のロード (各クラスで最大 15) といくつかのリストが新しく作成されましたが、正確に測定されるものについては以下の注を参照してください。ここ。

それぞれが一貫して約 100 マイクロ秒かかりますが、これは私には説明できません。その理由を突き止めようとしています。簡単なベンチマークでは、同様のサイズの文字列でいっぱいのオブジェクトが新しくなるまでに約 2 ~ 3 マイクロ秒かかることが示唆されています。

ここに 2 つの Q があります

  • この種の行動をどのように調査しますか?
  • 遅い割り当てにはどのような説明がありますか?

関連するハードウェアは、Sun X4600 上の Solaris 10 x86 であり、8* デュアル コア オプテロン @ 3.2GHz であることに注意してください。

私たちが見たものには、

  • PrintTLAB の統計情報を確認すると、低速な割り当てがほとんどないため、競合は発生しないはずです。
  • PrintCompilation は、これらのコードのビットの 1 つが JIT フレンドリーではないことを示唆していますが、Solaris はここでいくつかの異常な動作をしているようです (つまり、最新の Linux に対して、solaris10 と同様のヴィンテージの Linux を現在ベンチに置いていません)。
  • LogCompilation...控えめに言っても解析が少し難しいので、これは進行中の仕事であり、今のところ明らかなことは何もありません
  • JVM バージョン... 6u6 と 6u14 の間で一貫しており、6u18 または最新の 7 はまだ試していません

ありとあらゆる考えに感謝

物事を明確にするための、さまざまな投稿へのコメントの要約

  • 私が測定しているコストは、ビルダー (これらの1 つなど) を介して構築され、そのプライベート コンストラクターが new ArrayList を数回呼び出し、既存のオブジェクトへの参照を設定するオブジェクトを作成する総コストです。測定されたコストには、ビルダーのセットアップとビルダーのドメイン オブジェクトへの変換のコストが含まれます。
  • コンパイル (ホットスポットによる) には大きな影響がありますが、それでも比較的遅いです (この場合のコンパイルでは、100 マイクロ秒から 60 マイクロ秒までかかります)。
  • 私の単純なベンチマークでのコンパイル (ホットスポットによる) は、割り当て時間を ~2micros から ~300ns に短縮します
  • レイテンシーは、若い世代のコレクション アルゴリズム (ParNew または Parallel スカベンジ) によって変化しません。
0 投票する
2 に答える
285 参照

performance - D での低レベル ライブラリの実装に関するアドバイス (C/C++ ではなく)

プロジェクト用の D プログラミング言語の選択についてアドバイスが必要です。このプロジェクトは、多くの連想コンテナなどを含むデータベースに似た低レベルのライブラリです。したがって、効率は私にとって非常に重要です。

C++ や Python などの他の言語との互換性のために、ライブラリに C API を提供する必要があります。また、パフォーマンスを調整するために一部のセクションをプレーン C で記述する必要があることも予想されます。

D はこの仕事に非常に魅力的です。これらの要件を考慮する際に注意すべき落とし穴はありますか? D コンテナーのパフォーマンスは std::(map、vector、unordered_map など) と比較して、手動のパフォーマンス チューニングを考慮してどのようになりますか (たとえば、検索/挿入に std::map::lower_bound を使用するなど) )。

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

algorithm - アセンブリ プログラミングのヘルプが必要 (TASM) - Booth のアルゴリズム

Add、Sub、および論理演算子のみを使用して Booth のアルゴリズムをシミュレートし、16 進数値を返すアルゴリズムを作成しました。私の Tasm コンパイラは、これらのエラーをスローし続けます。コードを変更しようとしても、まだ機能しません。誰かが私を助けてくれませんか。

(29) 行に余分な文字があります
(38) 不正な即値
(44) 不正な即値
(52) 未定義のシンボル: RES2
(126) ポインタ型が必要です

0 投票する
14 に答える
7745 参照

c++ - コードベースを移行する場合、どの次世代低レベル言語が最善の策ですか?

多くの C/C++ を実行している会社があり、15 年前の COBOL 会社のようになってしまうのを避けるために、新しいテクノロジへの移行計画を開始したいとします。

今のところ、C/C++ は問題なく動作し、市場にはそのための開発者がたくさんいます。

しかし、実行中の巨大なコード ベースとデータの機密性を考慮すると、予算と開発チームを過負荷にせずに次のステップに移行するには 5 ~ 10 年かかる可能性があるため、今すぐ検討を開始する必要があります。

Dはかなり成熟し始めており、Goは非常に人気があると約束されています。

あなたは何を選びますか?その理由は何ですか?