犬小屋

@justdoo1t の日記です

理情3Sの所感

もう8月も終わりですが、いくつか成績が出てようやく3Sが終わった気持ちになってきたので備忘録として3Sをまとめておきます。理情ってどんなことをやってるのかなと参考になれば幸いです。

全体を通して

新型コロナウィルスの影響ですべての講義がオンラインとなりましたが、情報科学科は学科として先陣を切る思いで(?)4月の初週からオンライン講義を行いました。教員の方々もパソコンに弱いということはなく、滞りなくオンライン授業が行われました。

ほとんどの授業がスライドの画面を配信してそれの説明を行う形で、適宜別資料を写したり、画面に書き込んだりして説明をされていました。スライドは講義資料として配布されており、学生の要望もあってか、セメスターの後半には全ての座学の講義録画がITC-LMSから視聴可能になりました。講義の復習がしやすくとても快適でした。

3Sの時間割は2限に座学、(水曜を除いて)3, 4限に実験・演習という形でした。先輩方から3Sはキツイと聞かされていた通り、課題の量が多く、セメスター始めはその日のうちに課題を終わらせて「意外とホワイト」とか言っていたものの5月末から破滅が始まりました。

破滅が始まってからの生活は週末になるべく多くの課題を終わらせて、平日は翌日提出の課題の発展を眺めたり、週末に終わらせられなかった必須課題を終わらせたりで課題の自転車操業になっていました。翌日提出分の課題を終わらせると達成感から脱力してYouTubeを見ていました。今思うと、これのせいで座学の復習が疎かになっていたのでスケジューリングが下手としか言いようがないですね…。

例年は地下(学生控室)があって、実験や演習を詰まらせたりバグらせたりしたときにそこで学生同士で助け合える(らしい)のですが、今年はそれがなく厳しい戦いとなっていました。しかし、オンライン化への対応とのことで座学の課題が減らされていたようなので、環境が悪かったのか自分が課題をこなすのが下手だったのか不明なままです。

3Sの講義

前提として、理情3Sは必修のみを取る人がほとんどで、自分もそうでした。以下紹介する講義は全て必修の講義です。

月2 オペレーティングシステム

講義名の通りOSにまつわる話を扱いました。具体的には、プロセス管理、スケジューリング、メモリ管理、ファイルシステムやその他OSの提供する機能等の話を扱いました。

講義を聞くのみだと、ぼんやりとした理解しか得られませんでしたが、月3, 4限に行われるシステムプログラミング実験によりよりはっきりとした理解を得ることができました。

月3, 4 システムプログラミング実験

オペレーティングシステムで扱った話を実際の計算機上で扱って理解していこうというコンセプト(のはず)の実験でした。前半と後半で内容が分かれていて、前半は既存のOSのサービスを利用する内容で、後半はベアメタルプログラミングといってOSが乗っていない計算機をちょっと動かす内容でした。

前半のOSのサービスを利用する話では、マルチスレッド、ソケット、自作シェル(プロセスの実行、パイプ処理、ジョブ管理)といった話を扱いました。マルチスレッド回にpthreadを使わないマルチスレッドの実装が発展課題としてありましたが、結局諦めてしまったのでいつかやらないとなあと思っています。

後半のベアメタルプログラミングは、今年内容が刷新され、TAさんが新しく環境を構築してくださり、その上で色々(時間ごとのプロセス切り替え、仮想メモリの実装)やりました。

どの回も、スライドに初めて目を通したときには「何が書いてあるかよくわからない」という状態になるものの、丁寧に読んで自分で適宜調べて実装していき、最終的に課題が提出できる形になると、スライドの内容が「なぜわからなかったのかがわからない」状態になったので、とても良く出来てるカリキュラムだなと感じました。

火2 離散数学

グラフ理論はほどほどに、線形計画法がメインの講義でした。自分は講義だけではあまり理解できず、金3, 4の離散数学演習のおかげでなんとかなっていました。なんとかなってないかも。例年は試験ですが、今年はレポートで評価となりました。

火3, 4 関数・論理型プログラミング実験

7割OCaml関数型言語)で3割Prolog(論理型言語)でした。

2AでSchemeを扱ったおかげか、関数型言語を新しく扱うことに抵抗はありませんでした。最初の数回でOCamlの言語仕様に慣れると(ここにしれっと存在したモナド回がキツかった)、OCamlパートのメイン内容であるOCamlインタプリタ作成回に入っていきました。

2AでもSchemeインタプリタを作ることがありましたが、それよりずっと本格的で型推論を書いたりしました。これらの内容は木2の言語処理系論に対応していました(字句解析と構文解析はocamllexとocamlyaccに丸投げですが)。

Prologパートは初めて扱う論理型言語の特徴や処理系がどういった実装なのかを知っていくことがメインの内容になっていたと思います。発展課題のチューリングマシン作成やProlog処理系作成が楽しかったです。特に後者はOCamlインタプリタ作成の知識が大いに役に立ったのでかなり楽しめました。

最終回(最終課題)は内容が大きく変わってリバーシAIを実装せよというものでした。OCamlHaskellが使用言語として許可されていて、なぜかRustも使用言語として許可されていました。提出された各自のAIで総当たり戦が行われ、学科内での順位がフィードバックコメントで伝えられました。

探索の深さが大事そうだったので、OCamlより高速なRustを使いました。1からRustを学習する羽目になりましたが、そのおかげかそこそこ良い順位を取れました。

水2 情報論理

計数4年の「プログラムの数理」と同一の授業です。

論理と計算可能性の話を扱いました。論理パートは完全性や健全性の話を扱い、計算可能性パートは帰納関数や帰納可算集合ゲーデル不完全性定理のほんの一部を扱いました。座学の講義の中で一番好きな講義でした。

講義資料として提供されている教科書(蓮尾先生著)が非常にわかりやすく丁寧でした。英語ですが。

木2 言語処理系論

字句解析、構文解析、意味解析、中間コード生成といった話を扱いました。2Aの形式言語理論を丁寧にやっていると理解が進みやすいと思います。各解析で用いられるクラスと形式言語理論で扱ったクラスがいい感じに対応していて気持ち良くなれます。

木3, 4 ハードウェア実験

数回ブレッドボードとICを用いたちょっとした論理回路の作成を行い、それ以降はVerilogを用いた回路設計(除算回路や通信回路)を行い、それをFPGA上で動作させました。2Aのハードウェア構成法をぼんやり思い出しながらやりました。

セメスター中盤に学科PCや実験のために必要な物資が大学から各家庭に郵送され、それから開始しました。物資箱を開けたらロジックアナライザFPGAが出てきてワクワクしました。一家に一台FPGA

金2 計算機構成論

コンピュータアーキテクチャについて扱いました。CPUは命令ごとにどう処理する回路を持っているのか、パイプライン処理はどうなっているか、投機実行とはなにか、OoO実行とはなにか、といったCPUの仕組みから高速化の工夫まで、機能の説明だけでなく、どういった実装で実現されているのかまで踏み込んだ説明がされました。

この講義を通じてようやくCPUが魔法の箱ではなく回路の詰まった箱だと感じられるようになった気がします。

最終課題としてSpectre、Meltdownについてのレポートが課されました。数年前に話題になっていた「ハードウェアレベルの脆弱性」がどういったものなのか理解でき、同時にアーキテクチャへの理解も深められる良い題材の最終課題でした。

金3, 4 情報科学演習1

情報論理演習と離散数学演習が交互に行われていました。両方とも事前に問題が公開され、講義時間までに各自で問題を解いて発表者を決め、講義時間に問題を発表するという形式でした。

セメスター初めの余裕があった頃は空いた時間に情報論理演習をできるだけ解いていましたが、破滅と同時にほとんど解かなくなりました。離散数学演習は解けばとくほど評価に加味されるというモチベーションもあり、可能な限り解いていました。

最後に

各座学の理解が深まるような実験・演習が設けられており、とても良いカリキュラムでした。座学だけを取っている他学部他学科の人がどうやって講義内容を理解していくのかを知りたいくらいです。

実験・演習は自分で調べつつ頭を捻ることでなんとか自力で解決できるような内容がほとんどで、難易度の調整が適切でした。おかげで(?)やればなんとかなるだろうという謎の自信はつきました。

3Sが終わった今、まだCPUを作れる気はしていませんが、3Sを通じて得た謎の自信で3Aも苦しみながら生き抜いて行こうと思います。

最後に、新型コロナウィルスというこれまでに対応したことのない状況の中、我々学生たちが学びの機会を損なわないよう可能な限り対処してくださった事務員の方々や教員の方々に感謝申し上げます。ありがとうございました。

早く地下で学科民と交流できる日々を手に入れたいです。