OOP言語のモジュールシステム


8

シンプルなオブジェクト指向プログラミング言語を設計しています。

これは、Javaと同様に、VMによって静的に型付け、コンパイル、および実行されます。

違いは、OOPをそれほど強調したくないということです。コード自体はほとんどC ++(ファイルスコープで許可されているクラス、関数、変数)に似ています。

必要なものの1つはモジュールシステムです。私は以下を理解しました:

  1. すべてのファイルはモジュールです(一度コンパイルすると)-Pythonのように
  2. プログラマーはimportキーワードを使用してモジュールをインポートする必要があります。これにより、コンパイラーは標準ディレクトリーおよびファイル・ディレクトリーでモジュールを検索します(VMは実行時にもこれを行う必要があります)。

そして今、私はサブモジュールとモジュール階層の概念をどのように導入すればよいのか分かりません。

たとえば、1つのオプションは、ディレクトリ階層に依存することです。これによりimport engine.graphics.renderer、作業ディレクトリ内、および「renderer」というモジュールを持つ「graphics」というディレクトリ内に「engine」というディレクトリが見つかるはずです。

そのようなデザインの欠点は何ですか?何か不足していますか?


1
まあ、それは最初ではないでしょう。RustとOCamlはどちらも、ファイル内のコードをファイルと同じ名前のモジュールの一部として暗黙的に扱います。そこでは十分に機能するようです。
KChaloux 2013年

7
そしてHaskell。とにかくOOPを実行している場合は、Scalaの「モジュールは特別なオブジェクト」を検討することをお勧めします。また、ファーストクラスのモジュールをサポートするつもりですか?もしそうなら、foo.barfoo / bar.fileであるかfoo、メンバーを持つモジュール(これもモジュール)であるかのあいまいさが存在しますbar。考慮すべきSOmething
Daniel

バージョン管理をどのように処理する予定ですか?多くの言語はまったくありませんが、前もってその間違いをしないようにすることもできます。
ドナルフェロー

@DonalFellows詳細に注意してください。バージョンを処理するのは言語の責任ですか?とにかく、@annotationsそのような情報を埋め込むために紹介するつもりでした。
Aber Kled 2013年

@AberKled:私は、問題が言語の「バージョンの処理」に責任を負っているのではないと思います。FredがモジュールXの1つのバージョンを持っている場合、それで動作するモジュールYを書き、JoeがXの異なるバージョンを使用してそれと連動するモジュールZを作成すると、Xの異なるバージョン間で解決できない動作の違いがない場合、どちらも再コンパイルせずにYとZを一緒に使用できるはずです。
スーパーキャット2015年

回答:


2

Pythonのパッケージ/モジュール階層/組織、そして特に歴史的な面で、何年にもわたる主要な追加、最も重要なのは最新のものを見てください。おそらく、ホイールを発明する意味はありません。

私はあなたがあなたの言語にどれだけ行きたいか知りません、例えば

  • モジュールのバイトコードをzipから読み取りますか?
  • 異なるインタープリターバージョンのモジュール/ライブラリをどのように分離しますか?
  • ディストリビューションでそれを無表情にするつもりですか?
  • 言語独自の配布の容易さを忘れないでください(distutils / pypiを考えてください-各プラットフォーム/言語には独自のものがあり、常に良いわけではありません)

おそらく、Javaも興味深い例でしょう。Erlangの方法からも学ぶことができます(例:https : //stackoverflow.com/questions/2968914/code-hot-swapping-in-erlang)。

いつかプログラミング言語が主流になることを計画している場合は、設計上の問題がたくさんあります(上で触れたものもあります)。幸いにも、そこには素晴らしい例があります。

プログラミング言語モジュール/パッケージ/ライブラリシステム設計のいくつかの方向性は、

  • モジュールの作成と使用の両方のための直感的なコード
  • コード内のモジュール/パッケージオブジェクト
  • モジュール/パッケージのイントロスペクション機能
  • モジュール/パッケージのカプセル化(不要な詳細を隠す方法は?)
  • インターフェイス/ヘッダーファイルの使用?
  • 言語独自の配布ユーティリティとシステムレベルのユーティリティの両方が使用できる細粒度ディスパッチシステム( "DLL hell"は避けてください)
  • バイトコンパイルされたモジュールの保管場所
  • 「純粋な」モジュールとモジュール/依存関係の両方のコンパイルを自動化するセットアップシステム
  • モジュール内のコンパイル済みコード、テスト、ドキュメント、アセットの正規の場所

この投稿は読みにくいです(テキストの壁)。より良い形に編集していただけませんか?
gnat

1
いつかプログラミング言語を主流にする予定があるとしたら、設計上の問題がたくさんあります。」私はそうではありません。しかし、問題について教えていただければ幸いです...
Aber Kled

1
@gnat指摘してくれてありがとう。うまくいけば今すぐ。
Roman Susi 2013年

1
@AberKledいくつか追加しようとしました。しかし、答えで述べたように、いくつかの主流言語の開発の歴史を調べてください。純粋主義者やエリート主義者ではなく、プログラミングコミュニティのニーズによって動かされている方がよいので、自分で作る前に間違いから教訓を学んでください。もちろん、言語の主な設計目標を忘れないでください。
Roman Susi 2013年

2

まず、提案したように、名前空間モデルをファイルシステムなどの別の名前空間にマッピングするとします。次に、モジュールが他のモジュールをインポートできると想定しています。つまり、のengine.graphics.rendererような行を含めることができimport circle.arcます。これには2つの問題があります。

  • VMはどこを探しますcircle.arcか?前述のファイルシステムmappimgによると、/etc/mylang/modules/circle/arc /etc/mylang/modulesモジュール構造のルートである)などのディレクトリが必要です。

  • アプリケーションはどのように参照しますかcircle.arcimporting circle.arcまたはengine.graphics.render.circle.arccircle.arcは明らかにのサブモジュールであるためengine.graphics.renderer、1つ目は階層を「台無し」にします(破壊されない場合)。2つ目は/etc/mylang/modules/engine/graphics/renderer/circle/arc、ファイルシステムにがあり、circle.arc同時に2つの場所に配置されることを意味します。

そうは言っても、名前空間アプローチを採用することにした場合、それをファイルシステムにマッピングすることは私には制限が多すぎるようです。モジュールはさまざまな種類の場所(すでに言及したようにzipファイルでさえ、URLでさえ)に常駐できると思います。VMは、名前空間を実際のモジュールの場所にマップする何らかの種類のインデックス(構成ファイルなど)でエントリを検索することから始めます。


1
OPの特定の質問に本当に答えていないので、おそらく反対票を投じています。あなたのコメントがあなたが言いたいことを伝えられないなら、おそらくあなたはオフラインでOPとより幅広い会話をする必要があるでしょう。私たちのチャットルームはこれを行うのに最適な場所です。
maple_shaft

@maple_shaft:どういう意味ですか?「そのようなデザインの欠点は何ですか」という質問ではありませんか?私のポイントがOPが提案するモジュールアーキテクチャの潜在的な欠点であることを十分に明確にしていないのですか?私が反対票を投じられた理由を決して尋ねなかった理由は、私がStackOverflowから来ているためです。そこでは、人々はコメントを残さないでいつもそれを行っています-イライラさせられ、より重要なのは非建設的ですが、私はそれにもかかわらず、説明を求めるの疲れ。
geomagas 2013年

1
あなたは自分が質問に答えるつもりはなく、Rendererモジュールで何をするかについて彼が提供した例についての考えをある程度明確にしていることを認めます。質問は実際にはそれよりも抽象的であり、より広い回答が必要だと思います。私はあなたがあなたの良い点を上げて、あなたが意味していると思うので、あなたの利益のために説明を提供しました、しかし実際それは実際に質問の主要な部分を扱っていません。
maple_shaft

まあ、最初の文が問題だった場合は、とにかく答えの残りの部分と一致しなかったので、それを削除しました。質問はより抽象的なものですが、非常に具体的な方法で表現されているため、そうではないと思います。私が間違っている場合、私はOPが彼が何を暗示したが言葉で述べなかったのかを指定することを期待しています。Downvoterの匿名の動作とは異なり、あなたのコメントが役立つことを意図していたことを知っています。本当です。
geomagas 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.