問題タブ [compiler-construction]
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/C++ での PHP の isset() の対応物
PHP には非常に優れた関数 isset($variableName) があります。$variableName がプログラムで既に定義されているかどうかを確認します。
C/C++ 用の同様の機能 (ある種のシンボル テーブル ルックアップ) を作成できますか?
compiler-construction - マシンワードプリミティブの非倍数は良い考えですか?
動的言語(一般的なスクリプト言語と同様)があり、そのためのコンパイラーを作成したいとします。タイプタグのようなもののためにマシンワードのいくつかのビットを予約するのは良い考えですか?特にマイクロコントローラーや同様のデバイスの場合、それは良い考えですか?
タイプ情報のストレージの削減、メモリ管理の多少の容易さ(gcの場合もある)、デバッグの容易さなど、いくつかの利点が考えられます。しかし、これらは、一般的な算術演算または完全な単語を必要とする他の演算のオーバーヘッドを正当化するでしょうか?パフォーマンスのオーバーヘッドがはるかに大きいため、バイトコードVMはこの点ではるかに悪化することに注意してください。だからそれを提案しないでください;)
とにかく、マイクロコントローラクラスのハードウェア用に数値の強いコードを書く人がいるようなものではありませんが、それでも...
c++ - 最新のコンパイラは x * 2 操作を x << 1 に最適化しますか?
C++ コンパイラは、2 倍の演算x*2
をビットシフト演算に最適化しx<<1
ますか?
そう信じたいです。
java - コンパイラが埋め込まれたJavaエディタが必要で、Linuxで動作し、大量のRAMを必要としませんでした
Linux用のコンパイラを備えたJavaIDEが必要であり、大量のRAMを必要としません。私は256MBのRAMを持っているので、オプションが制限されています
c++ - コンパイル時にソース ファイルのベース名を取得する
私は GCC を使用しています。__FILE__ は、現在のソース ファイルの完全なパスと名前を返します: /path/to/file.cpp
. file.cpp
コンパイル時にファイルの名前だけを (パスなしで) 取得する方法はありますか? これをポータブルな方法で行うことは可能ですか?テンプレート メタ プログラミングを文字列に適用できますか?
これをエラー ログ マクロで使用しています。ソースのフルパスが実行可能ファイルに入るのを本当に望んでいません。
c++ - Cコンパイラはスタック変数を再配置できますか?
私は過去に組み込みシステムのプロジェクトに取り組み、スタック変数の宣言の順序を再配置して、結果の実行可能ファイルのサイズを小さくしました。たとえば、次のような場合:
これを次のように並べ替えます。
アラインメントの問題により、最初のものでは 12 バイトのスタック スペースが使用され、2 番目のものでは 8 バイトしか使用されませんでした。
これは C コンパイラの標準的な動作ですか、それとも私たちが使用していたコンパイラの欠点ですか?
必要に応じて、コンパイラはスタック変数を並べ替えて、実行可能サイズを小さくすることができるようにすべきだと私には思えます。C標準のいくつかの側面がこれを妨げていることが示唆されていますが、どちらにしても信頼できるソースを見つけることができませんでした.
おまけの質問ですが、これは C++ コンパイラにも当てはまりますか?
編集
答えが「はい」の場合、C/C++ コンパイラはスタック変数を再配置できます。確実にこれを行うコンパイラの例を挙げていただけますか? これを裏付けるコンパイラのドキュメントまたは同様のものを見たいと思います。
再編集
助けてくれてありがとう。ドキュメントについては、2003 年の GCC サミット議事録で発表された Naveen Sharma と Sanjiv Kumar Gupta による論文Optimal Stack Slot Assignment in GCC (pdf)を見つけることができました。
ここで問題となっているプロジェクトは、ARM 開発に ADS コンパイラを使用していました。そのコンパイラのドキュメントには、ARM-Thumb アーキテクチャがローカル スタック フレームでアドレスを計算する方法により、私が示したような宣言の順序付けによってパフォーマンスとスタック サイズが向上することが記載されています。そのコンパイラは、これを利用するためにローカルを自動的に再配置しませんでした。ここにリンクされている論文によると、2003年現在、GCCはスタックフレームを再配置してARM-Thumbプロセッサの参照の局所性を改善していませんが、可能であることを暗示しています.
これが GCC で実装されたことを明確に示すものは何も見つかりませんが、この論文は、あなたがすべて正しいという証拠として数えられると思います。再度、感謝します。
compiler-construction - コードを追加し、swf サイズが ... 小さくなりましたか?
... 私はいくつかの理論に取り組んでいますが、他の意見を聞くことに興味があります。
これは、3 つの異なるマシン (2 つの Windows ともう 1 つの Linux) で確認されています。使用されるコンパイラは、flexbuild (おそらく mxmlc) と ant with mxmlc です。
小さなスタンドアロンの単一 .as ファイル プロジェクトにコードを追加したところ、コンパイルされた swf ファイルのサイズは、Linux ボックスで 32k から 12k に 20k 減少しました。Windows ボックスでは、27k から 8.5k までわずかに異なります。
カスタム ツールを使用して、両方のバージョンがネイティブの swf 圧縮を使用していること、大規模な追加のメタデータがないことを確認しました。Ant ビルド スクリプトへの唯一の変更は、swc ファイルをビルドに追加することです。
コードの削除なし(インポートの削除なし、変数の削除なし、nada)、追加のみで非常にシンプル、ステージにいくつかのコンポーネントが追加され、有効になり、いくつかの小さな関数などが変更され、ループが変更されず、明らかなことは何もありませんコードが少なくなります。
ソース管理を使用して古いバージョンをビルドすると、依然としてファイルが大きくなるため、ライブラリまたはコンパイラの変更ではないようです。
どのコードも Flex コンポーネントを使用しておらず、単純な「flash.etc...」タイプのインポートのみです。
誰もこのような行動を見たことがありますか?これは何が原因だと思いますか?
java - javac エラー「コードが大きすぎます」?
単体テストを実行するたびに読み取りたくないファイルのバイト データとして、非常に大きなバイト配列 (8000 バイト以上) を静的に定義した単体テストがあります。
これは Eclipse 内で正常にコンパイルされますが、Ant スクリプトを介してコンパイルすると、次のエラーが発生します。
これを回避できる理由と方法はありますか?
回答: Shimi の回答でうまくいきました。バイト配列を別のクラスに移動したところ、正常にコンパイルされました。ありがとう!
java - Java の Scanner クラスと正規表現を使用して入力をトークン化するにはどうすればよいですか?
私自身の目的のためだけに、通常の文法を定義し、それに基づいて入力をトークン化できるトークナイザーを Java で構築しようとしています。StringTokenizer クラスは非推奨であり、何をしたいのかを示唆する関数が Scanner にいくつか見つかりましたが、まだ運がありません。これについて良い方法を知っている人はいますか?
c++ - どの標準C++クラスをC++で再実装できませんか?
私はC++0xの計画を検討していてstd::initializer_list
、ユーザークラスに初期化子リストを実装することに気づきました。このクラスは、それ自体を使用せずに、または「コンパイラの魔法」を使用せずにC++で実装することはできませんでした。initializer_list
可能であれば、実装に使用した手法を使用して独自のクラスに初期化子リストを実装できるため、必要ありません。
他にどのようなクラスが機能するために何らかの形の「コンパイラマジック」を必要としますか?サードパーティライブラリで実装できなかった標準ライブラリのクラスはどれですか?
編集:多分実装される代わりに、私はインスタンス化されたと言うべきです。このクラスが言語機能と直接リンクしているという事実はさらに重要です(初期化子リストはinitializer_list
)なしでは使用できません。
C#と比較すると、私が疑問に思っていることが明らかになるかもしれません。IEnumerableとIDisposableは、実際には言語機能にハードコードされています。Stroustrupはすべてをライブラリに実装可能にしようとしたので、私は常にC++にはこれがないと思っていました。それで、言語機能に密接に結びついている他のクラス/タイプはありますか?