私は、目的を最適化するためにオブジェクト指向言語を C に変換する作業を行っていますが、設計上の問題が発生しました。
疑似言語で次のクラスが提供されているコンバーターを検討してください。
class C {
int a;
double b;
int c;
constructor C(int value) {
this.a = value;
this.b = this.a / 10.0;
this.c = 0;
}
void say() {
print(this.b);
}
}
簡単に言うと、このクラスを C で構造体として表現できます (エラー チェックをスキップします)。
typedef struct {
int a;
double b;
int c;
} _class_C;
_class_C* _ctor_C(int value) {
this = malloc(sizeof(_class_C));
this->a = value;
this->b = this->a / 10.0;
this->c = 0;
return this;
}
void _method_C_say(_class_C *this) {
printf("%.2f", this->b);
}
void _dtor_C(_class_C *this) {
free(this);
}
このソリューションは、C コンパイラがバインドされているという約束に苦しんでいます — 構造体のフィールドの追加、削除、または順序の変更をしないでください。そのため、ファクト フィールドa
とc
が使用されていないにもかかわらず、コードが肥大化します。
「順序付けされていないフィールド」の動作を実現するにはどうすればよいですか? static が 1 つしかない場合はC
、次のように記述できます。
int _staticfield_C_a;
double _staticfield_C_b;
int _staticfield_C_c;
void _ctor_C(int value) {
_staticfield_C_a = value;
_staticfield_C_b = _staticfield_C_a / 10.0;
_staticfield_C_c = 0;
}
void _staticmethod_C_say() {
printf("%.2f", _staticfield_C_b);
}
そのため、コンパイラは余分なフィールドまたは未使用のフィールドを単独_staticfield_C_b
で最適化できますが、動的にインスタンス化できる場合はどのソリューションを使用する必要がC
あり、フィールドの順序、メモリレイアウト、およびコードの人間の読みやすさはまったく気にしませんか?
更新:コンパイラにstructsで魔法をかけるように強制しようとしているわけではないことに注意してください。順序付けされていないフィールドを持つ struct のように動作するそれらの代わりが必要です。読みやすさのレベルに関係なく、静的な例で提供したのと同じように.
更新:間違ったパラダイムや言語を選択した場合のように、私の問題はコンバーター自体の設計に関連しているという一般的な意見があります。Converter 自体は Python で書かれており、一般的なオブジェクト指向プログラムのソースを受け取り、それを処理し、同等の C コードを出力してコンパイルするため、クロスランゲージ コンパイラと考えることができます。構造体をどこでどのように使用すべきかを説明してくれたことに満足していますが、この場合、最適化を容易にするために魔法の助けが必要です:)