課題で使えるプログラミング言語の一覧
課題は言語を決めて出します。言語によって、エディターの見た目と、作ったものの実行方法が決まります。全部で21種類あり、どれもインストールは不要です。
プログラムとして書くもの
Python、Java、Go、C、C++、C#、Haskell、OCaml、R、Ruby、PHP、Rust、Kotlin、Prolog、Node(JavaScript)、Node(TypeScript)、Bash です。いずれもエディター、「実行」ボタン、出力欄があり、実際にコンパイル、またはインタープリターで実行されます。コンパイルが通らないJava の課題では、コンパイラーのエラーメッセージがそのまま表示されます。
どの言語でも、非表示のテストを付けて「テスト」タブで扱え、プログラムが読み込むデータファイルも付けられます。テストのフレームワークは言語ごとに決まっていて、Python は pytest、Java は JUnit 5、Go は go test、2つの Node は Node のテストランナーです。Bash のテストは、エラーなく終了すれば合格になるスクリプトです。C と C++ のテストは名前が test_ で始まる関数で、正常に終われば合格、クラッシュするか assert が失敗すれば不合格です。C# のテストは名前が Test で始まる public static メソッドで、例外を投げなければ合格です。Haskell のテストは名前が test_ で始まり、型が IO () または Bool のトップレベル定義で、アクションが終了するか値が True なら合格です。OCaml のテストは名前が test_ で始まる unit 関数、R のテストは名前が test_ で始まる引数なしの関数で、どちらも正常に終われば合格、R では stopifnot() で不合格にします。Ruby のテストは名前が test_ で始まるトップレベルのメソッド、PHP は名前が test_ で始まる関数、Kotlin は同じ名前のトップレベル関数で、いずれも引数なしで、正常に終われば合格です。Rust のテストは #[test] を付けた関数で、Rust 標準のテストハーネスが実行します。Prolog のテストは引数のない test_ 述語で、ゴールが成功すれば合格です。どれも、エラーを発生させるか例外を投げると不合格になります。
Python、Node、Go、Java、HTML・CSS・JavaScript の静的サイトで作った Web アプリは、公開 GitHub リポジトリから専用のアドレスにデプロイすることもできます。これについてはこのマニュアルに専用のページがあります。

プログラム言語どうしの違い
パッケージは、ファイルツリーの最上位にあり「パッケージ」の印が付いた、プロジェクトのパッケージファイルから取り込みます。Python は requirements.txt か pyproject.toml、Java は pom.xml、Go は go.mod、Node と Node(TypeScript)は package.json で、バージョンは範囲ではなく正確に指定します。パッケージは別のコンテナーで取得され、読み取り専用で実行に渡され、実行そのものにはネットワークがありません。新しい課題には、置き換えて使える小さな例が最初から入っています。生徒には常にこのファイルが見え、課題が許可している場合だけ変更できます。Bash、SQL、C、C++、C#、Haskell、OCaml、R、Ruby、PHP、Rust、Kotlin、Prolog には、パッケージマネージャーが接続できるネットワークがないためパッケージファイルがありません。
すでに持っているパッケージファイルを使うには、ツリーの最上位にアップロードするか、そこにその名前のファイルを作成します。普通のファイルではなく、課題のパッケージリストになります。パッケージリストは課題ごとに1つなので、Python の課題を requirements.txt から pyproject.toml に切り替えるときは、ファイルの名前を変更します。Java の pom.xml からは、プロパティ、依存関係の管理、親、インポートした BOM、スコープが読み取られます。test スコープのパッケージはテストのときだけ使われ、接続できるのは Maven Central だけです。pom.xml に対応する前に作った Java の課題は以前の dependencies.xml のままで、そのまま動きます。切り替えるには、pom の内容を貼り付けるか、名前を pom.xml に変更します。パッケージファイルには、それぞれに書けるものとパッケージのインストール方法を説明した専用のページがこのマニュアルにあります。
エディターの賢さは言語ごとに違うので、選ぶ前に知っておくと安心です。Python では、コードを読むだけで(実行はせずに)赤い波線によるエラー表示、補完、ホバーヘルプ、関数のシグネチャが使えます。JavaScript と TypeScript(Node)は入力中に構文エラーに下線が付きますが、TypeScript の型エラーは「実行」を押したときに出ます。判断するのがコンパイラーだからです。Java、Go、C、C++、C#、OCaml、R、Ruby、PHP、Rust、Kotlin、Bash は構文の色分けだけで、それ以上の機能はありません。Haskell と Prolog はエディターに専用のモードがないため、プレーンテキストで表示されます。
教員からよく聞かれる点です。Java の public クラスは常に Main で、初期コードにも表示されます。Go のファイルはすべて package main です。Bash は本物の bash なので、配列や [[ ]] が使えます。標準入力はコードの下の入力欄で、端末がないと read -p は何も表示しないため、Bash の初期コードは先に自分でプロンプトを出力します。C と C++ は警告を有効にして C17、C++20 としてコンパイルされ、警告は表示されますが実行を止めることはありません。C# のプログラムは Main メソッドでも、トップレベルステートメントでも書けます。テストはプログラムの末尾につなげられ、実行のためにプログラムが読み込まれるので、初期コードはファイルの終わりを考慮して入力を読みます。OCaml には main のガードがないため、トップレベルの let () = はテストのときにも実行されます。R のプログラムは、初期コードのように if (sys.nframe() == 0) main() で main を守ります。これはテストがファイルを読み込むときは偽になります。R のスクリプトでは readline() は標準入力を読まないので、readLines(file("stdin")) を使います。Haskell のテストファイルには独自の import を書けます。Ruby と PHP は初期コードのように if __FILE__ == $0 や realpath の比較で、Prolog は :- initialization(main, main) でmain を守るため、テスト中には実行されません。ループで止まった Rust のテストは、実行全体の制限時間でのみ止まります。C#、Haskell、OCaml、R、Ruby、PHP、Rust、Kotlin、Prolog はすべてのマシンではなく専用の1台で実行されるため、そのマシンが止まっているときは実行が始まらずその旨が表示されます。少し待って再試行してください。
ファイルを書き出すプログラム(レポートやグラフなど)では、実行が終わるとすぐ、出力の下にそのファイルがダウンロードできる形で表示されます。全部で最大5ファイルです。テキストは1ファイル 64 KB まで、PNG、JPEG、WebP の画像は 1 MB までで、画像は出力の下に表示もされるため、matplotlib で描いたグラフがそのまま現れます。書き出されたものは名前ではなく中身で判断され、SVG は画像として表示されません。対象外になったものは理由とともに一覧になります。リンクは30分間有効で、必ずダウンロードされ、タブで開かれることはありません。
1つのファイルに収まらないもの
Web ページは HTML、CSS、JavaScript の3つのペインとライブプレビューです。SQL の課題はクエリと、それを実行するデータベースの2つのタブです。本物のシェルを使わせるには、コンテナーラボか VM ラボを出題します。
教員が設定する内容も生徒が行う作業もそれぞれ異なるため、どれもこのマニュアルに専用のページがあります。
コードではないもの
記述式の課題、クイズ、2種類の図です。どれもプログラムと同じ方法で出し、採点の方法が異なります。
よくある質問
- 1つのモジュールで複数の言語を混在させられますか?
- はい。モジュールには、どの言語の課題でも自由に入れられます。
- Python のバージョンは?
- Python 3.13 です。エディター上に表示されるので、尋ねる必要はありません。
- 生徒はパッケージをインストールできますか?
- パッケージファイルがある課題ならどれでも、許可していればインストールできます。Bash、C、C++、C#、Haskell、OCaml、R、Ruby、PHP、Rust、Kotlin、Prolog 以外のプログラム言語がこれにあたります。生徒には一覧が常に見え、変更できるかどうかは課題が決めます。