Deep Researchを使って、プログラミング言語について比較してもらった
はじめに
Deep ResearchはOpenAI社が2025年2月2日(米国時間)にリリースした、AIエージェントです(Googleも同名のサービスをリリースしていることに注意してください)。最新モデルのo3をベースに、ウェブ検索機能や画像解析機能などを統合したものです。名前の通り、なにかのトピックについて「深く調べる」のに非常に便利なツールで、まだリリースしてから10日程ですが、試した人からの感想は概ね好意的なものです。
2025年2月13日(木)現在、Deep ResearchはChatGPT Pro(月額200ドル)でしか利用できませんが、近い内にChatGPT Plus(月額20ドル)や無料ChatGPTでも利用可能になるとOpenAIのサム・アルトマンCEOが予告しています。
そんな Deep Researchを使って、今回はプログラミング言語について調査してもらいました。
プロンプト
とりあえず、以下のようなプロンプトをまずは投げてみました。
「詳細なリサーチ」をオンにするとDeep Researchが使えます。
返答
通常のモデルだと、ここで何がしかの回答を返してきますが、Deep Researchは一味違います。
このように、どのような観点で比較(調査)して欲しいか逆に聞いてきます。ひょっとしたら、最初から厳密に条件を指定した場合は違うかもしれませんが、これまで試した限り、ほぼ100%、このように「何を調べたいか」を聞き返してきます。
しかし、考えてみれば当たり前のことです。AIにとってみれば相手の背景情報を何も知らないわけで、どういう観点で知りたいかがわからなければ調べようがないでしょう。人間相手であれば、会話の「文脈」があるので、ある程度そこから「相手が知りたいこと」を補えますが、現状のAIには「まだ」無理なことです。
文脈を補う
今回は
- パフォーマンス
- 構文の複雑さ
- 学習コスト
- エコシステム
- 特徴的な機能
について重点的に調べて欲しかったので、次のようにリクエストしました。ついでに、回答が「プログラミング言語をある程度理解している人向け」になるように文言を付け加えました。
調査開始
すると、以下のようなメッセージが出て調査が始まります。
プログレスバーが100%になったら調査完了です。調査する対象にもよりますが、10分以上かかることもおおいので、AIの作業が完了するのをぼーっと待ちます。
少し話は変わって、20世紀後半のこと。まだパーソナルコンピュータがなかった時代は、コンピュータにジョブを投入した後は終わるまで数時間以上待つのが普通だったそうで、そういう時代の思い出話を年嵩の先生からしばしば聞くものですが「AIの作業が終わるのを人間が待つ」のはひょっとしたらそういう感覚に近いのかもしれません。
調査中
Deep Researchが調べ物をしている間、以下のように「どのような過程で」調べ物をしているのかを見ることができます。
(実際の思考過程そのままではないにせよ)「AIはこう考えている」というのがわかるのは親しみが湧きます。
調査完了
待つこと十数分。調査が完了すると以下のように調査結果を出力してくれます。
全てを掲載すると分量が多くなりすぎるので、ここではScalaについての調査結果の中から
- パフォーマンス
- 構文の複雑さ
- 特徴的な機能
についての調査結果を整形したものを掲載します。全文についてはこちらから見られますので、興味があればご覧ください。
パフォーマンス
- 実行速度: コンパイル型(JVM上で動作)。ScalaはJavaと同じJVMバイトコードにコンパイルされるため、性能はJavaと同等です。JITの恩恵も受けられます。一方、Scalaの高度な抽象(関数型・コレクション操作など)が過剰に使われると、実行時にオーバーヘッドを生む可能性があります。しかし通常はJVM最適化が効き、問題ない性能が得られます。
- メモリ管理: 自動ガーベジコレクション(JVMに依存)。Javaと同じくJVMのGCを使用し、Scala独自のメモリ管理機構はありません。関数型のライブラリ等で一時オブジェクトが大量に生成されても、GCが自動で回収します。
- コンパイル/インタプリタ: コンパイル型(JVMバイトコード)。Scalaコンパイラがソースをバイトコード化し、JVMがそれをJIT実行します。ScalaはREPLも提供しますが、基本的には静的型付けのコンパイル言語です。
コメント
筆者はScala/JVMについてある程度知っていますが、この調査結果には唸らされました。特に
- 性能はJavaと同等
- Scalaの高度な機能が使われると、オーバーヘッドを生む可能性がある
- とはいえ、通常は問題ない性能が得られる
ということをきっちり抑えているのはポイントが高いです。その他の項目についても「コンパイル型」「コンパイル言語」という文言を除けば文句なしです。
構文の複雑さ
- シンプルさ: Scalaの構文は高度に抽象的で学習には時間がかかります。Javaに似た部分もありますが、関数型言語の要素(ラムダ式、パターンマッチ、for内包表記など) が深く組み込まれているため、多機能です。コードを非常に短く書ける一方で、その省略された意図を理解するにはScala固有の文法知識が必要になります。
- 一貫性: オブジェクトと関数の融合が一貫しており、式指向のデザインです。全てが式で値を返し、ifも値を返すなど、関数型寄りの一貫性があります。ただ、Javaとの相互運用やJVM上という制約からくる妥協点もあり、暗黙の型変換やコンパニオンオブジェクトなど、ユニークな概念が盛り込まれています。
- 可読性: 慣れれば強力ですが、初学者にとっては可読性が低く映ることが多いです。非常に凝縮したコードが書け、例えば
list.map(_.foo).filter(_ > 0)
のようにドットチェーンで処理を繋げます。これは慣れないと暗号的ですが、理解すれば「リストの各要素にfooを適用し、0より大きいものを抽出」と明確です。Scalaは複雑性ゆえに敬遠されることもあるので、チーム全員がScalaに習熟している場合は高い生産性と可読性が得られますが、そうでなければ学習コストが邪魔して読みにくく感じるでしょう。 - 補足: Scala 3(Dotty)では構文簡素化が進んでおり、以前より読みやすくなっています。
コメント
個人的には色々言いたいことがありますが、一般的なScalaへの認識としては「そうだろうな」という感じの「無難な」まとめです。ただ「一貫性」については「よくわかっている」と言えそうです(式指向のデザインや、JVM上という制約からくる妥協点など)。
「補足」については、Scala 3は読みやすさはともかく「構文は簡素化されていない」ので、構文解析を専門とする人間としては今ひとつでしょうか。
特徴的な機能
- メモリ管理の仕組み: JVM上で動くため、Java同様GCです。Scala自身は特別なメモリ管理機構を持ちません。関数型スタイルでイミュータブルオブジェクトが多用されると一時オブジェクトも増えますが、JVMの最適化やescape analysisでStackに割り当てられる場合もあります。FPによるメモリ負荷をどう抑えるかはScalaライブラリ実装者の腕の見せ所です。
- 並行処理: Scalaの目玉はAkka(アクターモデル)による並行・分散処理です。言語組み込みではないですが、Akkaを使うことでErlangのようなアクターベースの並行性が得られます。Scala標準ではFuture/Promiseも整備され、ノンブロッキングI/Oやコンカレンシーを扱えます。Scala 3でエフェクトシステムが入る予定はありませんが、ライブラリレベルでZIOやCats EffectといったIOモナドを用いた高度な非同期処理管理が行われています。並行分散システム開発でScalaが選ばれるのは、これらの強力なフレームワークのおかげです。
- 型システム: 静的型付け & オブジェクト関数混合。Scalaの型システムは非常に強力で、オブジェクト指向と高階関数の両方をサポートします。パラメトリック多相、アドホック多相(implicitによる型クラス的仕組み)、共変・反変指定、パターンマッチでの型安全な分解など、学術的アイデアも多く含みます。Scala 3ではUnion/Intersection型、マクロ、型レベル演算なども整理され、非常に表現力豊かな型システムです。
- 安全性: 型安全ではありますが、JVMゆえにNullが存在し、ScalaでもOptionを使わないとNullPointerExceptionのリスクはあります。とはいえ、Scalaではなるべくnullを避け、Optionで扱うのが慣習です。また、不可変データ構造を多用し副作用を制限することで、バグを減らすFP的アプローチを推進しています。とはいえ、万能ではなく、実行時例外(Match errorなど)は起こりえます。コンパイルできても安心とは限らない点で、Rustほどの安全性は提供しません。
- ユニークな言語特性: マルチパラダイムの極致とも言え、多相的で高度な抽象を構築できます。implicit機能による暗黙の型変換や引数、これを利用した型クラス実装はScalaならではです。その結果、DSLの内部実装やライブラリでのシンタックス拡張などが巧みに行えます。例えば、型クラスCatsを用いて、まるでHaskellのような関数合成がScalaでできたりします。
またパターンマッチはHaskell由来の強力な機能で、任意のオブジェクトを分解できます。case classでパターンマッチを容易化し、不変データ構造との組み合わせでエレガントなドメインモデリングが可能です。for内包表記もあり、コレクション操作を直観的に記述できます。Javaとの親和性も維持しつつ、このような高い抽象度を持つ点がScalaのユニークさです。
コメント
こちらについては「さすが」と唸らされるほどの内容にはなっていませんでしたが、一通りよく調べたというのが正直なところでしょうか。とはいえ、FPによるメモリ負荷をどう抑えるかはScalaライブラリ実装者の腕の見せ所です
という文言や、型システムのところでのアドホック多相(implicitによる型クラス的仕組み)
という言及は「なかなか」と言えます。
おわりに
今回は、世間で話題のDeep Researchを使って筆者の得意分野であるプログラミング言語について調査してもらいました。言及しきれなかった項目も含めて、その分野にある程度精通していないとでてこない文言も多数あり、調査に使うために十分な性能を持っているといえる結果になりました。
ただ、Deep Researchも万能ではありません。o3が元来持っている知識と検索して得られた知識をかけあわせた結果以上のものは(原理的に)出ないので、Webに広く出回っている情報に誤りや偏見がある場合、それに引きずられる傾向も見られます。通常のGoogle検索でも同じと言ってしまえばそれまでですが、Deep Researchの結果に疑問を持った場合、一次情報に当たるのも重要です。
Discussion