Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

C++ 以外の主要な言語にも組み込みで対応 #116

Closed
5 of 6 tasks
kmyk opened this issue Jan 29, 2020 · 8 comments
Closed
5 of 6 tasks

C++ 以外の主要な言語にも組み込みで対応 #116

kmyk opened this issue Jan 29, 2020 · 8 comments

Comments

@kmyk
Copy link
Member

kmyk commented Jan 29, 2020

設定ファイルでの対応 (#73) はしたけど、設定なしで動く方がうれしいのは明らか。
言語ごとに対応するとメンテがたいへん (例: atcoder-tools) なんだけど、verify helper の場合はユーザのライブラリという形で CI が走るので比較的ましのはず。

(この他の言語であっても需要があり実装してくれる人がいれば issue 立ててください)

@kmyk

This comment has been minimized.

@kmyk
Copy link
Member Author

kmyk commented Jan 29, 2020

list_attributes (設定情報の辞書を返す) だけは設計が自明でないんですが、うまくやってください。
実用的には「コンパイラが clang++ でかつ ulimit に失敗している場合のみ実行をスキップしたい」などの単純な条件分岐を含む設定が可能な仕様にする必要があります。

@key-moon
Copy link
Contributor

多言語対応する場合、language.pyの中に全言語について詰め込むと可読性とか競合とかがあまりうれしくなさそうなので、languageディレクトリを作るなどして基底クラスと/C++クラスのファイルを分離してほしいです。

@kmyk
Copy link
Member Author

kmyk commented Jan 30, 2020

分かる。同じ抽象クラスと継承関係にあるだけの無関係で独立なクラスが1ファイルに入ってるのはよくない。論理的凝集ってやつですね。
しかしいま忙しいのですぐには実装できません。あとでリファクタリングするのでひとまず好きに実装してください 🙇。language ディレクトリを作ってもらってもかまいません。

@kmyk
Copy link
Member Author

kmyk commented Jan 30, 2020

環境を変えて複数回実行するための機能 (たとえば C++ なら g++clang++ の場合を両方試したい) はいまのところ C++ 専用になってしまっていますが、必要な言語があれば修正します

@kmyk
Copy link
Member Author

kmyk commented Jan 30, 2020

つまり現状の設計は「プログラミング言語 (処理系や実行環境のことは考えない)」の概念と「プログラミング言語 + 固定された処理系や実行環境」の概念がごっちゃになってて不適切なのだね

@kmyk
Copy link
Member Author

kmyk commented Apr 7, 2020

言語対応の追加のために何をすればよいか

TL;DR

onlinejudge_verify/languages/ の他のファイルを見て適当にやれ

丁寧な説明

  1. 対応する issue を立てる

  2. デフォルトのコンパイルオプションなどの仕様を決定する

    • 同じ言語の他のユーザが細かい設定なしでそのまま使えるような標準的なものが望ましい。
  3. onlinejudge_verify/languages/ に新しい module を作る

  4. 言語の実行環境に対応するクラス LanguageEnvironment を実装する

  5. 言語 (の仕様) に対応するクラス Language を実装する

    • list_dependencies(): ファイルパスが与えられ、そのファイルが依存しているファイルの一覧を返す。
      • #include とか import みたいなやつを解析します。処理系に付いてるその手の機能を呼び出してください。
      • 実行環境によって依存するファイルが変わる場合は和集合を取るのが理想ですが、最も標準的な環境の依存ファイルだけで妥協してもよい。
    • bundle(): (optional) ファイルパスが与えられ、そのファイルを単一ファイルにまとめて AtCoder とかに提出できるようにする。
      • oj-bundle の中身です。実装が難しいなら raise NotImplementedError でよい
    • list_environments(): 利用可能な実行環境の一覧を返す。
      • たとえば C++ なら基本的に return [CPlusPlusLanguageEnvironment(CXX='g++'), CPlusPlusLanguageEnvironment(CXX='clang++')] みたいになりますが、g++ はインストールされてるけど clang++ はインストールされてないといった場合に注意してください。

    https://github.com/kmyk/online-judge-verify-helper/blob/be46613b9f63857a2c30d7f14ab107eec8b1dc51/onlinejudge_verify/languages/models.py#L19-L36

  6. 作ったクラスが読み込まれるように設定する。次のあたりに追加
    https://github.com/kmyk/online-judge-verify-helper/blob/e0f3c547985e791402a9d951ea56480cc97ea9a2/onlinejudge_verify/languages/__init__.py#L21-L23

  7. examples/ に例をいくつか追加する

  8. .github/workflows/verify.yml に追加する言語の環境設定をする step を追加する

  9. 日本語ドキュメント (https://kmyk.github.io/online-judge-verify-helper/document.ja.html) (ソースコード .verify-helper/docs/static/document.ja.md) に追加する言語の説明や設定方法について追記する

  10. 英語ドキュメント (https://kmyk.github.io/online-judge-verify-helper/document.html) (ソースコード .verify-helper/docs/static/document.md) にも説明を追記する

@kmyk kmyk mentioned this issue Sep 7, 2020
@kmyk
Copy link
Member Author

kmyk commented Feb 22, 2021

もうほぼ全部終わったと思います

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants