クラスを介してすべてのコードを構造化し、クラス(Javaなど)にコンパイルすることの長所と短所


13

編集:私の言語は、Javaとは異なり、複数の継承を可能にします。

教育、レクリエーション、潜在的に有用な目的のために、独自のプログラミング言語の設計と開発を開始しました。

最初は、Javaをベースにすることにしました。

これは、すべてのコードがクラスの形式で記述され、そのコードがVMによってロードされるクラスにコンパイルされることを暗示しています。

ただし、インターフェイスや抽象クラスなどの機能は必要ないため、除外しました。彼らはパラダイムを実施しているようで、私の言語はそれをしないようにしたいです。クラスをコンパイル単位として保持したかったのは、実装が便利で馴染みがあり、アイデアが気に入ったからです。

それから、クラスをstaticディレクティブを使用して定数と関数を提供する「名前空間」として、またはインスタンス化する必要のあるオブジェクトのテンプレート(「実際の」クラスの目的)として使用できるモジュールシステムが基本的に残っていることに気付きました他の言語で)。

今、私は疑問に思っています:コンパイル単位としてクラスを持つことの利点と欠点は何ですか?

また、私のデザインに関する一般的なコメントは大歓迎です。私の言語に関する有益な投稿は、http//www.yannbane.com/2012/12/kava.htmlにあります


1
クラスに、クラス内のすべての識別子を明確にする名前空間も含まれている場合、完全に独立したコンパイル単位があります。コンパイルによって、またはアセンブリ内のコンパイル済みクラスへの参照によって、他のクラスへのすべての依存関係を満たすことができれば、そのクラスは正常にコンパイルできます。このような原子性には明らかな利点があります。
ロバートハーヴェイ

サイドノート:抽象クラスとインターフェースを削除すると、サブタイプとポリモーフィズムに継承を使用するように強制されます。それはひどいコードを生成することになります。また、複数の継承を追加(および関連する問題を処理)しない限り、非常に制限されます。

1
@delnan:実際には、コンポジションを使用して機能を構築できます。
ロバートハーヴェイ

2
@RobertHarvey多重継承の欠如による制限について話していると思います。はい、十分な構成でそれをエミュレートできますが、私はそれが受け入れられるとはほとんど思いません。たとえば、通常2つのインターフェイスを実装するオブジェクトは、別個の基本クラスのサブクラスで2回実装する必要があります(両方の実装が共通のクラスに委任できますが、それでも余分なコードが大量に発生するため、簡単に変更することはできません)一方のインスタンスを他方のインスタンスに)。

@delnan:サブタイプとポリモーフィズムに継承を使用することの何が問題になっていますか?それが継承の目的です...
メイソンウィーラー

回答:


6

クラスをコンパイル単位として持つことの利点は何ですか?

言語の複雑さを軽減できます。異なる構造の必要はなく、すべてが同じように扱われます。特定の設計では(そうではないようですが)、静的変数とそれらが実行される傾向のある設計の問題(初期化順序の問題、同時実行の制限、ジェネリック/型クラスの扱いにくさ)がないという利点があります。また、サンドボックス化または並列化のための分離されたモジュールインスタンスのようなモジュールコンセプトの利点もいくつかあります。依存関係が何らかのインターフェイスに適合し、実装に見合うモジュール全体をインスタンス化してドロップインできるモジュールタイピング。

とはいえ、このコンセプトには多くの問題がある傾向があります。現実的には、「トップレベル」クラスにはデフォルトコンストラクターのような特別なルールが必要であるため、すべてを同じように扱うことはできません(または、奇妙な問題が発生する可能性があります)。コンパイルユニットのモジュール性も非常に厄介になる傾向があります。クラスが他のクラスである場合、クラスは他のクラスをどのように参照しますか これらの依存関係はどのように扱われ、クラスをスピンアップするための正しい順序をどのように決定しますか?重複するクラス参照がアプリ​​のさまざまな部分で再利用されることをどのように確認しますか(または、必要なセマンティクスである場合、重複するインスタンスをどのように処理しますか)。

調べてみると、依存関係、適切なスコープ、初期化の問題に関する多くの問題に遭遇しました。「トップレベルのクラス」を特別なものにする問題に遭遇し、それらを機能させるための多くの制限があり、それらが単純な名前空間に形作られてしまいます。


トップレベルクラスは1つだけにする予定Objectです。おそらく特別な動作が必要になることは承知していますが、それが孤立したケースである限り、それで問題ありません。ただし、依存関係の問題があるとは思わない。VMの起動時に読み込まれるクラスのセットがあり、それらの一部はネイティブに実装されます(Systemクラス)が、それらはすべてObjectを継承します。すべてがロードされると、KVMはロードするように指示されたクラスをロードし、依存関係を解決します。しかし、私は興味があります、静的問題はどの問題をもたらしますか?
jcora

@yannbane-つまりobject、コンパイル単位の外で必ずしもパブリックではない内部クラスではなく、モジュールのように動作するクラスを意味します。何らかのDLLスタイルの動作が必要な場合は、「依存関係を解決する」が詳細の巨大なスズメバチの巣になります。ymmv。静的として。
テラスティン

そのモジュールのような振る舞いは、静的メソッド/変数を使用することで達成されますよね?インスタンス化できるクラスを作成する代わりに、静的メンバーとメソッドのみを持つクラスを作成するのは悪いですか?その記事を見ましたが、定数静的メンバーにも静的メソッドにも当てはまるとは思いません。たとえば、Mathクラスを作成しても何も問題はありません。クラスは、実際には静的メソッドとと呼ばれる定数static doubleメンバーを持つモジュールですPi
jcora

@yannbane-いいえ、そうでもありません。モジュールは、インスタンス化可能であるため、モジュールです。それ以外の場合は、C ++スタイルの名前空間のみがあります。トップレベルのクラスをC ++スタイルの名前空間に制限すると、実際にはクラスではなくなります。
テラスティン

うーん、私はまだ大丈夫であり、クラスを使用してモジュールを作成することで問題が実際に表示されません。そしてもちろん、モジュールは名前空間、特にPythonモジュールとして機能します。
jcora

4

この質問に答える代わりに、1つ上のレベルに進み、MIT OpenCourseWare、特に6.035(コンピューター言語工学)を勉強することをお勧めします。これで問題全体が説明されるので、このような質問を再度することはありません。

コンピューター言語工学

唯一の前提条件はJavaです。

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-035-computer-language-engineering-spring-2010/lecture-notes/

コースの説明

このコースでは、高レベルのプログラミング言語の実装に関連する問題を分析します。トピックには、基本的な概念、機能、コンパイラの構造、理論と実践の相互作用、ソフトウェアの構築におけるツールの使用が含まれます。このコースには、コンパイラーの設計と実装に関する複数人プロジェクトが含まれています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.