編集:私の言語では、Javaとは異なり、複数の継承が可能です。
教育、レクリエーション、そして潜在的に有用な目的のために、自分のプログラミング言語の設計と開発を始めました。
最初は、Javaをベースにすることにしました。
これは、すべてのコードがクラスの形式で記述され、そのコードがVMによってロードされるクラスにコンパイルされることを意味していました。
ただし、インターフェースや抽象クラスなどの機能は必要がないため、除外しました。彼らはパラダイムを強制しているようでした、そして私は私の言語がそれをしないようにしたいと思います。ただし、クラスをコンパイルユニットとして保持したかったのは、実装するのが便利で、なじみがあり、アイデアが気に入ったからです。
次に、基本的にモジュールシステムが残っていることに気づきました。クラスは「名前空間」として使用でき、static
ディレクティブを使用して定数と関数を提供するか、インスタンス化する必要があるオブジェクトのテンプレートとして使用できます(他の言語でのクラスの「実際の」目的)。
コンパイル単位としてクラスを持つことの利点と欠点は何ですか?
また、私のデザインに関する一般的なコメントもいただければ幸いです。私の言語に関する有益な投稿はここにあります: http://www.yannbane.com/2012/12/kava.html 。
クラスをコンパイル単位として持つことの利点は何ですか?
言語の複雑さを軽減できます。異なる構成の必要はなく、すべてが同じように扱われます。特定の設計では(そうではないようですが)、静的要素がないこと、およびそれらが遭遇する傾向のある設計の問題(初期化順序の問題、同時実行の制限、ジェネリックス/タイプクラスの扱いにくさ)から利益を得ます。また、サンドボックス化または並列化用の分離されたモジュールインスタンスなど、モジュールの概念のいくつかの利点も得られます。依存関係がいくつかのインターフェースに適合し、モジュール全体の実装に相当するモジュールタイプをインスタンス化してドロップインできます。
とはいえ、このコンセプトには多くの問題がある傾向があります。 「トップレベル」のクラスにはデフォルトのコンストラクターのような特別なルールが必要であるため、実際にはeverythingを同じように扱うことはできません(または、奇妙な問題が発生します)。コンパイル単位のモジュール性も非常に扱いにくくなる傾向があります。それらが単なるクラスであるとき、クラスはどのようにして他の人を参照しますか?これらの依存関係はどのように処理され、クラスを起動するための正しい順序をどのように決定しますか?重複するクラス参照がアプリのさまざまな部分で再利用されることをどのように確認しますか(または、それが必要なセマンティクスである場合、重複するインスタンスをどのように処理しますか)?
調べてみると、依存関係、適切なスコープ、初期化に関する多くの問題に遭遇しました。あなたは「トップレベルのクラス」を特別なものにする問題に遭遇し、それらを機能させるための多くの制限がそれらを単純な名前空間に形作ることになります。
この質問に答える代わりに、レベルを1つ上げて、MIT OpenCourseWare、特に6.035(コンピュータ言語工学)。これは全体の問題点を説明するので、このような質問を再度したくなくなります。
唯一の前提条件はJavaです。
このコースでは、高水準プログラミング言語の実装に関連する問題を分析します。取り上げるトピックには、コンパイラの基本的な概念、関数、構造、理論と実践の相互作用、ソフトウェアの構築におけるツールの使用などがあります。このコースには、コンパイラの設計と実装に関する複数人によるプロジェクトが含まれています。