私たちは、あらゆるところにある情報機器やソフトウェアの恩恵を受けて暮らしています。これらを駆動するためのプログラムの作成には、これまでは専門的な修練を積んだ人による手作業が必要でしたが、近年は大規模言語モデル(LLMs)に基づく自動プログラミングによって一変しつつあります。ここ数年は、以前とは全く異なる規模と速度で、ソフトウェア開発が自動化てきています。
この変化は、変化の劇的さを除けば、本研究室としてはある程度予想していたことでした。本研究室では以前から、具体的なプログラム文面の作成(=コーディング)の大部分は、仕様を満たす論理構造の特定(=プログラミング)とは独立であり、本質的には自動化できるはずだという観点から研究を進めていました。
LLMsの発展によって、プログラミングの研究は不要になったのでしょうか? 私はそうは考えていません。よく見ると、まだまだ不十分なところはあります。
- 軽量自動プログラミング:LLMsによる自動プログラミングは強力ですが、比較的大きな計算資源を要求します。一方で、たとえばMicrosoft ExcelのFlashFillのように、小さなプログラムを軽量に生成したい場面はあります。
- 古典的自動プログラミングの拡張:コンパイラによる最適化や機械語生成など、以前から自動化されていた部分はかなりあります。このような古典的自動プログラミングは、LLMsよる自動プログラミングに比べ、信頼性高く効率的に安定動作します。古典的自動プログラミング技術を伸張させることで、プログラミングの効率を高めるだけでなく、LLMsをより「難しい」部分に集中させることができます。
- プログラムの検証:LLMsは大量のプログラムを生成しますが、そのプログラムがプログラマの意図通りであるかの確認は(プログラム生成に比べると)明らかに苦手です。LLMsによる自動プログラミングを安定的に動作させるためには、プログラムの正しさや性質を検証する技術が不可欠です
- 現代のためのプログラミング言語の設計:これまでのプログラミング言語は、人間が書くことを前提に設計されてきました。しかし、自動プログラミングを前提にすれば、異なるデザインが適している可能性があります。たとえば、古典的自動プログラミングや自動検証を前提とすれば、そのようなシステムに向けた付加情報を多く含めるのが良いかもしれません(このような付加情報は、人間にとっては煩雑であるため、これまでは比較的毛嫌いされてきました)。また逆に、LLMsのコンテキストを無駄に消費しないよう、短く書ける言語が望ましいかもしれません(このような言語も、人間にとって読みにくくなりやすいため、これまでは比較的毛嫌いされてきました)。
以上の状況をふまえつつ、本研究室では、プログラミングの基礎理論、およびその応用について研究しています。
本研究室が特に得意とするアプローチは以下のものです。
-
プログラム変換・プログラム自動合成:本研究室の得意分野は「プログラム変換」、つまりプログラムを大きく作り替えることです。これは、うまく使えば、プログラムを劇的に高速化したり、ごく単純なプログラムから複雑なプログラムを生成したり、といったことができます。また、関連する技術として、プログラム未満の情報(たとえば入出力のテストケース)をプログラムに変換する「プログラム自動合成」にも取り組んでいます。
-
宣言的プログラミング:
プログラムの変換や自動合成のためには、処理手順ではなく目的や意図を記述するのが適しています。この記述は、宣言的なプログラムだと見なすことができます。本研究室では宣言的プログラミングの技法 (例えば高階関数や型システム) のプログラム変換・合成への活用や、プログラム変換・合成に適した宣言的言語の設計などを研究しています。
-
プログラム導出・プログラム運算:
プログラムの変換や自動合成、自動検証ができるなら、それに適したプログラミング技法があるはずです。実は、自動プログラミングツールや自動プログラム検証器とのインタラクティブなやりとりを通じてプログラムを作成する技法は、プログラミングの自動化が現実的になるよりも遙かに昔から研究されています。本研究室では特に、 プログラム導出・プログラム運算と呼ばれる技法を背景に研究を行っています。これは、ごく大雑把に言えば、方程式を式変型を繰り返して解くように、プログラムの変換・合成を繰り返してプログラムを構成する技法です。
参考:
森畑による講演動画 (2022年)
森畑による古い講演動画 (2013年)
よくある質問
高いプログラミングスキルが必要ですか?
プログラミングの研究をする以上、現状を知るという意味で、プログラミング言語等についての知識は、あればそれに越したことはありません。しかし、
高いプログラミングスキルや個々のプログラミング言語についての詳しい知識などは必須ではありません。むしろ、本研究室には、
現状のプログラミング・プログラミング言語に疑問・不満のある人が向いています。現状のプログラミングに不満のない人、自由にプログラミングができている人はあまり向いていないかもしれません。
プログラミングスキルが身につきますか?
もちろん、本研究室での研究はあなたのプログラミングスキルを(何かしらの意味で)高めると思います。しかし、本研究室の目標は
あなたのプログラミング技術を高めることではないことは意識しておいてください。むしろ、
プログラミング技術が低くてもプログラムを作れるようになる・プログラミングのメリットを享受できるようになるような状況を目指しています。
ソフトウェア開発の研究もしていますか?
本研究室の中心的なテーマは「プログラミング」です。つまり、 (往々にして巨大な) ソフトウェアの開発というプロジェクト全体や、それに関する人間行動についての研究よりは、ソフトウェアを構成する (往々にしてそれほど大きくない) 各プログラム断片の、それ自体が(人間とは無関係に)もつ性質等をおもに探求しています。連携して研究を行っている
中丸智貴先生の研究テーマも参考にしてください。
プログラミングのためのツール、たとえば統合開発環境などは研究していますか?
ターゲットには入りますが、以下の点には注意してください。本研究室の主な研究テーマはプログラミング (所望の機能を実現する計算構造を特定すること) です。しかし、多くの既存のツールはコーディング (プログラムを特定のプログラミング言語のテキストとして書き下すこと) の補助を行っています。ツールの研究をしたい場合は、「プログラミング」との関連をよく考えてください。
数学は使いますか?
プログラミングに関する技術をソリッドに組み立てるためには、最終的には数学が必要になります。どの程度の数学が必要かは研究テーマやアプローチによりますが、数学アレルギーの人にはあまりお勧めできません。逆に、数学は好きだが純粋数学よりも数学の応用を探求したい、という人は楽しめる可能性があります。
所属学生の研究成果
査読付き出版
国内学会発表
- J. Lin, A. Morihata:Recursive function synthesis based on structural relationships. PPL 2026(2026年3月)
- W. Zhuang, A. Morihata:Accelerating Data-Intensive Search via a Staged DSL for Effect Handlers. PPL 2026 ポスター発表(2026年3月)
- 中道, 中丸, 森畑:プログラム断片の結合を構文検査するfluent APIのLR文法からの生成. PPL 2025. (2025年3月)
- 坂本, 中丸, 森畑:.gitignoreファイルの実態調査および冗長性の解消手法の提案. PPL 2025 ポスター発表. (2025年3月)
- 中道, 中丸, 森畑:Fluent API におけるプログラム断片のより柔軟な結合, 日本ソフトウェア科学会第41回大会. 学生奨励賞・優秀発表賞受賞. (2024年9月)
- J. Lin, A. Morihata:Synthesizing accumulative functions via program transformation. PPL 2024. (2024年3月)
- 中道, 中丸, 森畑:演算子オーバーロードを利用したfluent APIとその型付け. PPL 2024 ポスター発表. (2024年3月)
- 岩田, 森畑, 中丸:プログラマーがコード補完を中断する理由の調査 . PPL 2024 ポスター発表. (2024年3月)
- J. Lin, A. Morihata:Automatically fixing data races in CUDA programs by building thread-local cache. 情報処理学会 第145回プログラミング研究会. (2023年8月)
- J. Lin, A. Morihata:Automatically fixing data races in CUDA programs by building memory copies. PPL 2023 ポスター発表. (2023年3月)
修士論文
- 中道晃平:Fluent API におけるプログラム断片の結合と構文検査 (2024年度, 広域科学専攻奨励賞受賞)
- 庄偉毅:Automatically Generate Patches to Repair Ownership Type Errors in Rust Programs (2023年度, 広域科学専攻奨励賞受賞)
- 林俊宇:Automatically fix data races in CUDA by building memory copies (2022年度)
- 陶立強:Priority-based Inlining Analysis Order in LLVM (2021年度)
- 原雅典:ビュー更新問題に対するプログラム自動合成の利用:入出力例プログラミングに基づく更新の制御 (2021年度)
- 黒田航希:Pythonインタプリタからコンパイラへのステージングによる変換 (2020年度)
- 松田知樹:配列集約処理における実行時情報を用いた自動漸増化 (2020年度)
卒業論文
- 坂本洸亮:.gitignoreファイルの実態調査および冗長性の解消手法の提案 (2024年度)
- 岩田風多:プログラマーがコード補完を中断する理由の調査 (2023年度)
- 長谷川慧:意味的スケジューラを用いた関係的検証ツールの性能調査 (2023年度)
- 澁谷彰比呂:再帰的ニューラルエンコーディングによるコードベクター化を用いた初学者プログラミング課題提出物の分類 (2022年度)
- 中道晃平:区分関数を効率的に扱うプログラミング言語の開発 (2022年度)
- 奥山裕也:単調性判定による貪欲法・動的計画法の自動導出 (2016年度, 一高賞受賞)
研究テーマ例とそれに関連する文献
以下に研究テーマ例を挙げますが、これらに限らず、プログラミング・プログラミング言語にまつわる研究テーマであれば広く扱っています。
プログラムの自動並列化
マルチコア・マルチCPUのコンピュータを活用するためには並列プログラムが不可欠ですが、性能の良い並列プログラムの作成は素人には困難です。本研究室では、並列性を意識せず記述したプログラムを並列プログラムへ変換する「並列化」による解決を試みています。並列化が容易なプログラムや並列化技法を特徴付ける理論の研究から、実際に自動手並列化を行うシステムの開発まで、理論と実践の両面から取り組んでいます。
アルゴリズム類型の自動導出
プログラムの自動合成・検証、およびプログラミング言語の設計
プログラム変換をうまく活用するためには様々な関連技術が必要になります。変換前のプログラムには含まれないプログラム断片を得るにはプログラム自動合成が求められます。プログラム変換の前提条件等の確認にはプログラム検証が必要です。自動合成や検証をうまく動作させるためには、それに適したプログラミング言語が望まれます。これら関連技術についても、本研究室では幅広く取り組んでいます。
プログラム運算
プログラムの変換や自動合成、自動検証ができるなら、それに適したプログラミング技法があるはずです。
プログラム運算は、方程式を式変型を繰り返して解くように、プログラムの変換・合成を繰り返してプログラムを構成する技法です。ここでは、プログラム変換が方程式における式変型の方針 (例えばどの変数を消去するとか、因数分解をするとか) 、プログラム合成が変型後の係数等の計算に対応します。これを用いることで、プログラム運算はプログラミングの汎用的な方法 (方程式で言えば「ガウスの消去法 (掃き出し法) 」のようなもの) を与えます。
本研究室は、プログラム運算の方法論を背景とすることで、世界を牽引する研究を行っています。
研究室に参加したい方へ
関連研究室・研究者
Akimasa Morihata, 2026