競プロ向けのrustテスト/デバッグ環境を作った
最近競技プログラミングにはまっています。
数年前は「誰も使わないコードのためのコードなんて」と思っていたけど、今はスポーツ感覚で楽しめる心境になりました。
継続的に出ることで、小難しいアルゴリズムをバグなくスピーディーに組む力は上がっているのを感じます。
言語は、簡単な問題ではPython、計算量がありそうな問題ではRustを使っています。
Rustは速度が速いわりに、C++より楽にかけるのがよいです。
トッププログラマ達も使い始めていて、競プロ用言語として有望な気がします。
一方で、以下のようなデメリットもあります。
- -C++のようなよく使われている言語と比べて競プロ用のライブラリがない
このへん(competitive-rust-snippets/src at master · hatoo/competitive-rust-snippets · GitHub)を参考にしたり、自分で蟻本の写経をストックしています。
- 文字列辛い
辛い。&strやStringだけでなく、時にはcharのベクトルを使います。
- GUIデバッガが少ない
検索するとrust-gdbをCUIで使えという文言が多いです。
Visual studio codeにはありました。CLionもできるけど、個人には高い。
前置きが長くなったが、デバッガは自分で作ることにしました。
バックエンドではrust-gdb、フロントエンドはPyQtを使います。
スクリーンショットはこんな感じ。
見た目は普通のデバッガっぽい雰囲気は出てますね。
コンセプトは競プロ(主にatcoder)用のIDEです。
なので、GUIデバッガとしての機能だけでなく、online_judges_toolhttps://github.com/kmyk/online-judge-toolsと連携して競プロ向けの機能をついてます。
- テストケース例をURLからダウンロードして、編集中のプログラムがテストケースをPASSしてるか判定できる。
- テストケースを入力して、デバッガ実行できる。
コンテストにTDDチックに取り組めるので、なかなか、便利です。特に2つめの機能はなかなかないんでないかと思う。
1つめの機能をサポートするライブラリは他に、https://github.com/dj3500/hightailがあります。
将来的には
- 提出機能(テストケースのPASSを確認して)いれました
- 自分でテストケースを足す
みたいなこともしたいですね。
ただし、一週間かかりで勢いで作ったので一部の機能は割りきって削られています。
デバッガとしてはともかく、なかなかエディタとしての使い勝手はatomレベルにはならない(当たり前だけど)ので、
しばらくはatomで編集してテスト及びデバッグ環境として使うことにしました。
感想
- QPlainTextで、軽いエディタは作れることがわかった。
- 開発中はPythonのデバッガから、Rustのデバッガを叩くという貴重な経験(?)をした。
- Rustには補完とジャンプはracer、フォーマットはrustfmtがあり、エディタのバックエンドは充実しており、自作の難易度は下がっている。
- エディタを自作するのは、TOKIOが包丁を買わず自分で打ったのを使うのと似てる。多分。
こういう機能あったらいいんじゃ、というご意見あったら気軽に寄せてください。
PRもお待ちしております(どなたか検索機能ください)。