Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

入門 シェル実装

16 079 vues

Publié le

開発者にとってシェルが必要不可欠なものであることは論を俟ちませんが、当たり前の存在すぎてこれがどのように実現されているのかを知る機会はあまりないと思います。本トークでは、シェルがどのように実現されているのかを、実際にシェルを実装する過程を通じてお話しします。

※ もともとのトークのタイトルは「入門 シェル」でしたが,わかりやすさのため「入門 シェル実装」にタイトルを変更しています.

Publié dans : Logiciels

入門 シェル実装

  1. 1. 入門 シェル @genya0407
  2. 2. 自己紹介
  3. 3. 自己紹介 ● @genya0407 ● 京都大学 熊野寮 在住 ● CAMPHOR- (元)運営メンバー ○ 4月から東京で就職 ● 最近よく使う言語 ○ Haskell ○ Rust ○ Ruby ● 最近バズったもの ○ 熊野寮でマイニングを禁止した話 ○ ファストフード検索
  4. 4. 本題
  5. 5. Question ● シェルを知っている? ● シェルを日常的に使っている? ● シェルの作り方を知っている?
  6. 6. 本トークの概要 シェルを使っている人に「自分にもシェルが作れそう!」 という気持ちになってほしい ※ UNIX系OSを仮定 ● Mac ● Linux 入門 シェル 入門 シェル実装
  7. 7. ● シェルの復習 ● シェルとOS ● シェルの実装 ● デモ
  8. 8. 本トークにおける「シェル」 ● 文字ベースでOSを操作するアプリケーション ● コマンドを実行できる ● シンプルなコマンドの組み合わせ →複雑な操作を実現
  9. 9. シェルの機能 $ cat members.txt $ cat members.txt | grep genya0407 コマンド実行 パイプ リダイレクト $ gcc hoge.c && ./a.out その他 制御構文,変数など $ ls hoge || mkdir hoge $ if $A == $B; then touch $A fi$ mkdir hoge; cd hoge 本トークで解説 実質プログラミング言語 シェルの ”本質” ではない → 割愛 自作シェルには一部実装 $ ls > files.txt 時間の都合上 割愛
  10. 10. ● シェルの復習 ● シェルとOS ○ プロセス ○ カーネル ○ システムコール ● シェルの実装 ● デモ
  11. 11. シェルとOS ● OS:コンピューターを管理するソフトウェア ● シェルの実装に使うOSの機能を説明 ○ プロセス ○ カーネル ○ システムコール
  12. 12. 「プログラムの動作中のインスタンス」 - Wikipedia プログラム プロセス プロセス シェルも1つのプロセス プロセスには制約がある $ python main.py プロセスが起動
  13. 13. プロセスの制約 ファイルの読み書き ネットワークアクセス 他プロセスとのやりとり プロセスの起動 プロセスは,自分の「外部」にアクセスできない → カーネルにお願いする
  14. 14. カーネル カーネル:  OSの中核にある  「特権」を持つ  プログラム 特権: - ネットワーク - ファイルへのアクセス - プロセスの管理 カーネル プロセス プロセス プロセス プロセス ネットワーク ファイル カーネルにお願いする手段  =システムコール
  15. 15. システムコール カーネル プロセス プロセス プロセス プロセス ネットワーク ファイル システムコール:  プロセスがカーネルに  「お願い」する手段 ● open ● read ● write ● pipe ● fork ● exec ● wait ● select ● mmap ● chdir ● dup ● exit etc... ● ネットワーク ● ファイル ● プロセス間通信
  16. 16. OSの機能のまとめ ● プロセスは「外部」に干渉できない ● カーネルは全ての権限を持つ ● プロセスはシステムコールで外部に干渉する
  17. 17. ● シェルの復習 ● シェルとOS ● シェルの実装 ○ コマンド実行 ○ パイプ ● デモ
  18. 18. シェルの機能 $ cat members.txt $ cat members.txt | grep genya0407 コマンド実行 パイプ リダイレクト $ gcc hoge.c && ./a.out その他 制御構文,環境変数など $ ls hoge || mkdir hoge $ if $A == $B; then touch $A fi$ mkdir hoge; cd hoge 本トークで解説 $ ls > files.txt 割愛
  19. 19. $ cat members.txt $ cat members.txt | grep genya0407 コマンド実行 パイプ
  20. 20. コマンド実行 $ cat members.txt ● 例はcatプログラムを実行 ● シェルの外部にあるプログラムを呼び出す (catはシェルのソースコードに含まれていない) ● シェルもプロセスの1つ ● プロセスの制約: 自分の「外部」にはアクセスできない どうやって外部プログラムを実行する? → forkシステムコール   execシステムコールを使う
  21. 21. fork と exec fork:自分(プロセス)のコピーを作る exec:他のプログラムに「変身」する fork exec forkしたい! execしたい!
  22. 22. コマンド実行の実装 fork forkしてexec exec(“cat”) 終了 次のコマンドを待つ $ cat members.txt シェル cat
  23. 23. 誤ったコマンド実行の実装 forkせずにexec exec(“cat”) 終了 $ cat members.txt シェル cat コマンドを1つ実行するたびにシェルが終了する
  24. 24. コマンド実行のまとめ fork + exec → コマンド実行
  25. 25. $ cat members.txt $ cat members.txt | grep genya0407 コマンド実行 パイプ
  26. 26. パイプ $ cat members.txt | grep genya0407 ● 左のコマンドの出力を,右のコマンドに入力する ● プロセス間での情報のやりとりが必要 どうやって他のプロセスと通信する? → pipe システムコール を使う ● プロセスの制約: 他プロセスに干渉できない
  27. 27. pipe と pipe システムコール pipe pipe pipe ● pipe: OSの機能.プロセス間の通信手段. ● pipeシステムコール: パイプを作成する
  28. 28. パイプの実装 pipeを作ってforkしてexec シェル $ cat members.txt | grep genya0407 pipe fork pipeを閉じる 次のコマンド を待つ exec exec cat grep 終了 終了 fork
  29. 29. 誤ったパイプの実装 forkしてpipe シェル $ cat members.txt | grep genya0407 fork 次のコマンドを待つ pipe pipe 別のパイプになる  →通信できない
  30. 30. パイプのまとめ fork + exec + pipe → パイプ
  31. 31. $ cat members.txt $ cat members.txt | grep genya0407 コマンド実行 パイプ
  32. 32. ● シェルの復習 ● シェルとOS ● シェルの実装 ● デモ
  33. 33. 自作シェルのデモ $ cat members.txt $ cat members.txt | grep genya0407 コマンド実行 パイプ リダイレクト $ gcc hoge.c && ./a.out その他 制御構文,環境変数など $ ls hoge || mkdir hoge $ if $A == $B; then touch $A fi$ mkdir hoge; cd hoge $ ls > files.txt 実装済 未実装 解説済 コマンドのリクエスト?
  34. 34. まとめ
  35. 35. まとめ ● 今回話したこと ○ シェルは文字ベースでOSを操作するアプリケーション ○ シェルを作るにはプロセス,カーネル,システムコールへの理解が必要 ○ シェルは自作可能! ○ “車輪の再開発” は楽しい!! ○ 「ぼくがかんがえたさいきょうのシェル」を作ろう!!! ● 今回話さなかったこと ○ リダイレクト,制御構文,環境変数,ビルトインコマンド ○ パーサーの実装方法 ○ タブ補完の実現方法 ○ 本当にシェルを作りたい人はあとで聞いてください
  36. 36. おわり Thank you ! Any Questions ?
  37. 37. 付録 ● デモで動かしたシェルのソースコード ○ genya0407/hash-demo

×