[音楽再生] スピーカー1:すべての権利、これはCS50である、 これは週4の開始である、 あなたが聞いたことがある可能性があるか 読んで、世界が終わるされています。 インターネットのまわりのすべてに行く 知識と意識されている プログラムのバグ、Aの バッシュと呼ばれるプログラミング言語。 これは素晴らしいブランドされました シェルショック、またはBashのドアなど、 しかし、これらのような記事 珍しくはなかった。 そして実際には、それらの多くは持参 Heartbleedの裏の思い出、 これを使用してに気づいたかもしれません プレスバックこの春、 同様にかなり劇的であった。 今、あなたのそれらのここ 今日、どのようにあなたの多くがある、 あなたは何を理解していない場合でも、 それはすべてのシェルショックのことを聞いた、についてです? すべての権利、そしてどのように多くのあなたの 脆弱なコンピュータを持っている? [OK]を、これまでのところ、はるかに多くの手があるはずです 今のところ、最大の理由のために私たちは見るであろう。 それでは何を見てみましょう メディアで起こっれて し、それを少し説明して ここに私たちのために技術的に。 スピーカー2:セキュリティの専門家が持っている 重大な欠陥は可能性があると警告 数百人に影響を与えることを約あること 世界のWebユーザの数百万。 だから、正確になっていますバグは何ですか シェルショックと呼ば​​れ、それが何をするのでしょうか? さて、シェルショックとも呼ばれている bashのバグ、それが悪用ソフトウェア。 ハッカーは脆弱スキャンするウイルスを使用 LinuxおよびUnixを実行しているシステム 次に、オペレーティングシステムおよびそれらに感染する。 bashはコマンドラインシェルである。 これにより、ユーザーの問題が起動するようにコマンドをすることができます ソフトウェア内のプログラムと機能 テキストで入力して。 これは、典型的には、プログラマが使われている、と より広い世界に開かれてはならない、 シェルショックはそれを変更するかの。 さて、worringly、一部のアナリスト それは大きな脅威である可能性が警告し、 シェルショックは完了できるため、 感染したマシンの制御、 Heartbleedのに対してのみ許可されて ハッカーはコンピューターをスパイする。 それはだ、それほど深刻だ 10点10評価されて 国民による重症度 脆弱性データベース。 すべてのWebサーバーの3分の2がでている 一部のMacコンピュータを含むリスク、。 さて、あなたを確認してください 今、あなたのシステムにパッチを適用。 ウェブサイトの実行をホストしている誰 影響を受けるオペレーティングシステム できるだけ早く行動を取る必要があります。 それはなります余裕が誰 その監視およびウェブアプリケーションへ ファイアウォールは、どんな攻撃に外を見るように。 SPEAKER 3:最悪の事 それが起こる可能性がある その誰かは、そのようなコードを記述します 自動的に移動して、スキャンする インターネットと影響を与える これらのコンピュータのすべて。 そして、彼らはよく、それを行う後は、 彼らは何ができる最悪のこと ちょうどすべて削除され、 またはサイトをシャットダウンします。 だから私たちは被害を見ることができました その観点から、 私たちは、悪意のある人がいるだろう場所 誰がちょうど大混乱を起こすことにした システムをダウンさせたり削除することによって、 ファイル、およびそのようなこと。 スピーカー2:いくつかは、これは1つであると言う 最も困難なの尺度を 年のバグ、そしてそれ 週間かかるかさえも その最終的な影響を判断するために数ヶ月。 スピーカー1:だからすべてのことが真である、 しかし面白いことに、ほとんどすべての、ある あなただけの見た画像の、 多分キーボードを除き、 とは何の関係もない いかなるバグ。 サーバーおよびワイヤーなど、 それは一種の接線方向に関連しただ、 が、コアでそれは実際にはかなりの おなじみの、ここで何が起こっているのか。 実際に、私はに行ってみよう 私たちのCS50アプライアンス。 私が先に行くと最大化してみよう ここでターミナルウィンドウを開きます。 そして、あなたたちは、これを使用している またはその組み込みバージョン、 プログラムを書くためにはgeditの中で、 、などのコマンドを入力し、 これは、実際にあり、有し 週、バッシュ、B-A-S-Hのためにされて。 これは、ボーン·再び、シェル これというのは変わった方法で、 これは持ってのプログラムです 効果的に、プロンプトの点滅、 それは待ってそこに座っ あなたのための入力用。 そして、それは命令だ ラインインタフェース、それを介して あなたたちは、コマンドを実行してきたと 最終的にコンパイルしてから実行している プログラム。 しかし、bashは、プログラミングです 以下の意味での言語。 あなたのようなコマンドがあることを知っている CDおよびlsも打ち鳴らすなど、 しかし、あなたは、独自のコマンドを定義することができます バッシュでそれらを実装することによって。 今、私たちはするつもりはない 非常に詳細に入る プログラミング言語をbashにように、しかし 、その時点で、例えば、知る 呼ばないコマンドがない「ハローが。」 だから、で見つけることができます これらのパッケージのいずれか。 それは私のコンピュータにインストールされてないです。 あなたの管理者にお問い合わせください。 しかし、私はそこにしたい場合は、プログラムすることが バッシュにまたは私のプロンプトで「ハロー」と呼ばれる、 私は実際の構文を使用できます かなりC.のようにそれは、全く同じではありません それはとかなり似ています 機能、いくつかの項目が欠落してもかかわらず。 何も起きていないようにみえ、 今は「こんにちは」と入力すると あなたが実際に書くことができます プログラムではなく、C言語ではなく、Javaで、 ではない、別のプログラミングで 言語が、バッシュ自体に。 今、ここで重要なのは、私が書いたということです 私はこの新しいコマンドを与えたいと思った名前を付け、 括弧でもある 関数で、この象徴。 余談として、あなたも楽しみを行うことができます 物事、そして実際には、でもMac OSでは、 これはターミナルと呼ばれるプログラムです。 それは誰の中に組み込まれています この部屋ではMacを持つコンピュータ、 あなたは、Macで同じようなことを行うことができます OSが、あなたはそれを超えて多くを行くことができます。 そして、これは、小さな接線方向である それは楽しみのようなものだ。 私は今朝思い出した、 これを介して考えると、 私が再生するために使用小さなゲームの CS50の元TFの一つと それによって、彼は離れてから歩くであろう任意の時間を 彼のスクリーンロックを解除して、彼のキーボード、 私は、コマンドを実行するだろう this--ような「挨拶」 そして今、彼は戻って彼に来て、いつでも キーボード私は画面をクリアした後、 そして彼は、座るだろう いくつかの作業をしようと、 彼directory--の内容を一覧表示 [オーディオ再生] -Hello。 こんにちは。 スピーカー1:だから、公平性において、 それは "こんにちは。"実際にはありませんでした これは通常、何かだった that--により類似 [オーディオ再生] -Beep。 スピーカー1:私はwould-- --that そう、彼のコンピュータは、だろう 彼が実際に彼にいつでも誓う 彼のキーボードに座った。 そして、非常に迅速に彼は考え出した 彼の画面をロックせずに放置しない。 しかし、これはソートを示唆している その愚かな楽しみの バッシュのようなもので持つことができます。 しかし、それはもう少しだ それよりも、確かに、深刻な。 実際に、これはの一つである 最も危険と長期的なバグ それは本当に世界的に世界を襲っている。 このバグは、出回っている いくつかの20年、 とするだけでは打たれるだろう その相対的なシンプルさによるモーメント。 だから、これはイメージです。 コマンドであればあなたこと 今は文字通り、マックを所有 あなたのふたが開いているとき、 あなたはその中に入力して試すことができます ターミナルと呼ばれるプログラム。 ターミナルの下にある アプリケーションUtilities-- 一度のため、Windowsユーザは、する必要はありません この特定のthreat--を心配 しかしMacにあなたのそれらを入力することができます この私がここでやるようなウィンドウに、 あなたが入力しなければ このプログラムにその 私は今やるように、ターミナルと呼ばれる、 あなたは言葉を見れば、「脆弱な」 お使いのコンピュータは、 搾取を受けやすい。 今では実際に何を意味するのでしょうか? そして、これは確かにある かなりクレイジーな構文、 しかしそれでは、少なくとも引き出してみましょう 興味深い側面の一部。 だから、見えるいくつかの構文があります 少なくともCから、少し馴染み より一般的にプログラミングする。 私はいくつかの括弧を参照してください。 セミコロン、中括弧、およびそのような、 それは、このことが判明 ここに黄色愚かなこと 本質的機能である それは何もしません。 コロンは何もしないことを意味し、 セミコロンは、何もしない停止を意味します。 したがって、これらの内側 中括弧、事実 Iは等しいがあることを 左、これに署名する 基本的に作成しています コマンド、または変数、 xと呼ばれ、それを割り当てる そこにコードのその黄色の少し。 つまり、エコー "のようなものかもしれない ビープ音」か何かを言うこんにちは」または「 それに似て。 しかし、あなたの目に入った場合に気づく さらに右にさまよい、 よりも、このラインにそれだけではありません そのセミコロンの終了間際。 その後、「脆弱なエコー」と それを超えてでもそれだけではありません。 もう一つのセミコロン、bashの-c:。 だから長い話を短く、 このコード行は、 説得力のための十分な のコンピュータ 何かをするに脆弱 あなたはそれがやりたいことを、 バグはバッシュとなるでありますので、 バッシュは停止するようになっていたにもかかわらず、 コマンドの右のラインを読んで そこに黄色のテキストの後に、 20プラス歳のバグのために、 bashは、実際に読んでいました そのセミコロンを越え、美しい ずっとそれが語られている何をして。 だから、意味するところは何ですか それの究極? 私はちょうど「ハローエコー」と述べ または "、脆弱エコー」 しかし、あなたが何かをやった場合は、 * -rf RMのような、実際には悪質な、 これを使用していないかもしれない これまで入力した、 と率直におそらく あまりにもすぐにすべきで、 あなたが行うことができますので、 それに多くのダメージ。 なぜ? rmが、もちろん、何をしますか? 削除します。 *何を意味する? すべての。 だから、いわゆるだ ワイルドカードなので、その意味 ですべてを削除 現在のディレクトリ。 -rは、再帰的な意味を起こる そのあなたが削除しているものかどう意味 ディレクトリがあり、そこの内側 他のファイルや他のディレクトリで、 再帰的にそこに飛び込む そしてそのすべてを削除します。 そして-fはそれらすべての最悪です。 誰もが-fがここで何を意味するか知っていますか? フォース。 そうであっても、手段を強制 これは悪い考えであれば、 私にプロンプ​​トを表示せずにそれを行う さらに確認のため。 だから、あなたが知っている、私たちは笑う この、しかし率直に言って、おそらく私 この複数回入力 当日、現実理由 それはへの最速の方法ですです ものの全体の束を削除します。 しかし、たとえ私はいくつかの損傷を行っている。 しかし、あなたはコンピュータをだましていた場合は、 いくつかの愚かな変数を定義するに または関数は、xと呼ばれるが、その後、 実行中にコンピュータをだまし それの境界を越えて 関数、そのセミコロンを越えて、 あなたが実際にコンピュータをだましことができ RMのようなものを実行に-rf またはEメールコマンド またはコピーコマンド。 文字通りあなたが何かできること コンピュータ、それはファイルを削除するのかどうか、 、ファイルの作成誰かをスパム、 リモートで一部のサーバーを攻撃し、 あなたはそれを表現することができれば コマンドを使って、あなた それを行うにコンピュータをだましことができます。 今の例は何ですか あなたはこれをどのように行うのでしょうか? さて、コンピュータの多くがあります インターネット走行バッシュ上。 私たちMacユーザーはすべて、それらの間にある。 Linuxサーバーの多くは、間にある それらに加えて、UNIXサーバ。 Windowsが再取得します 比較的オフフック あなたがインストールしている場合を除き 特別なソフトウェア。 今のサーバーの多くは、のために インスタンスは、Webサーバーを実行、 実際、Linuxは、おそらくです 最も人気のあるオペレーティングシステム インターネット上のコンピュータ上で実行するには それは、Webページを提供している。 今、私たちは、後で説明するように 学期、中 あなたがからのリクエストを送信する あなたのbrowser--クローム、 Internet Explorerの、whatever-- リモートサーバへ、 それはたとえていることが判明 あなただけの、www.example.comを入力 お使いのブラウザは、メッセージを送信している それは次のように、もう少し難解だ。 しかし、奇妙な少し何かに気づく。 最初の二行 私は、前に見たことがない 彼らは見ていない 特に脅迫。 しかし、私が盗まれてきたものに気付く ここで3行目。 悪者は、メッセージを送信した場合 自分のコンピュータからこのような 脆弱なMacまたはAに 脆弱なLinuxサーバー、 面白いことに、そのバッシュです そのシンプルで小さなコマンドプロンプト、 遍在であり、多くの場合、ある 本質的に実行するために使用 内容 それが受け取るメッセージ。 そして、その論理によって、次のことができます そのため、Webサーバをだまし、 のようなものを送信することにより、 通常、ユーザーエージェント、 と言うことになっている お使いのブラウザの名前です。 ユーザーエージェントクローム、ユーザエージェントインターネット エクスプローラー、ユーザーエージェントのFirefox、この ちょうどあなたのブラウザのです 自身を識別する方法。 しかし、もし悪いやつが非常に 巧みにはMM-MM、私は言う、 あなたに言うつもりはない 私のブラウザは何をされ、 私の代わりにあなたにこのを送信するつもりです RMとの不可解なそうな事-rf *その中に、あなたは文字通りだますことができます インターネット上の脆弱なWebサーバ で、まさにそれを実行することに そこにすべてのファイルを削除するため。 そして、率直に言って、それはありません それさえも最悪。 あなたが何かを行うことができます。 あなたが始めることができ、分散 サービス拒否攻撃 あなたがこのメッセージを送信した場合 Webサーバの全房 し、それらすべてがために、下降していた Harvard.eduサーバー上のインスタンス、 あなたが強打の並べ替えることができます それらのうち、一体 たネットワークトラフィックによって、 それ以外の場合は、この悪者によってトリガ。 だから、長い話を短く、ほとんど マックを所有しているこの部屋の誰も これに対して脆弱です。 銀の裏地を使用すると、している場合を除きということです あなたのラップトップ上のWebサーバを実行している、 あなたが実際に設定していない限り それは、その中に、SSHのようなものを可能にする あなたが実際に安全です。 それは脆弱ですが、あります 1、あなたのラップトップに取得しようとし、 だから、ちょっと安心することができます。 しかし、Appleはすぐになります このための修正をアップデートする。 リナックスの世界は既にリリースしました FedoraとUbuntuのための修正の数 確かにと他のLinuxのバージョン、および アプライアンス内の更新50を実行した場合、 でも、あまりにもがされることを 更新され、修正しました。 しかし、あまりにもいないことを 本当に脆弱なって、 あなたはしていない限り理由 アプライアンスとティンカー 公にあなたのラップトップを作った ではない、インターネット上でアクセス可能 デフォルトでは、あなたがした 実際にので細かいれて ファイアウォールおよび他の技術。 しかし、それはバグの極端な例だ 私たちは文字通り20のためにのために生きてきたこと 年、誰が誰か知っているかどう すべてのこの時間は、それについて知っていた? 実際に、これはの一つである 根本的な課題 私たちは後半で表示されますことを セキュリティについて学期、 それは、単に現実世界のようなものです 善玉は不利な立場にある。 悪者を防ぐために、する必要が すべてのドアがロックされていることを確認して、 すべてのウィンドウがあること、安全であることを 自宅へのエントリのすべてのポイント 悪者が入らないように安全である。 しかし、どのような悪いやつはする必要がない 実際にあなたの家を危険にさらすために行う そしてあなたから盗む? 彼または彼女はちょうどロック解除ものを見つけなければならない ドア、1壊れた窓、または何か それらの線に沿って、それはだ コンピュータセキュリティにおける同じこと。 私たちは、何百万ものを書くことができます プログラミングコードの行 そして数百または数千を過ごす それが正しい取得しようとしている時間、 しかし、あなただけのものを作る場合は、 正しさの誤り、 あなたは、システム全体を置くことができますし、 確かにこの場合は、全体のインターネット そしてリスクのある世界。 だから、もっと知りたい場合 このことについて、ここでは次のURLを参照してください。 行動の必要はありません 今夜あなたがない限り そのより快適ものの中 独自のWebを実行してきた 場合、あなたがしなければならないサーバ、 実際には、ソフトウェアを更新します。 そして、これはあまりにものタイトルです スピーチ、そして今、紙、 私たちは上のリンクされたこと 今日のためのコースのウェブサイト。 それは仲間のよった ケン·トンプソン、誰が名付け 非常に有名な受諾した コンピュータサイエンスの賞、 そして彼は何年かこのスピーチを行いました 基本的にこの同じトピックで、前に。 皆さんに質問を質問、 本当にすべき 信頼、最終的には、 ソフトウェアあなたが与えられてきた? たとえば、私たちは皆持っている プログラムを書いて、 私たちは、コンパイルしてきた クラングと彼ら。 そして、あなたの知る限り、あなたが書かれている CS50のための任意のプログラムがあります 一種のバックドアは、方法があります 悪い男という、あなたのプログラムを実行している場合には、 お使いのコンピュータを引き継ぐだろうか? おそらくないでしょ? マリオ、そして貪欲、およびクレジット。 これらはすべて非常に小さなプログラムです。 あなたはかなり必要があるだろう 実際にあれば悪い コンピュータ全体が脆弱製 コー​​ドの10または20行を書き込んだ後、 いくつかのまたは少なくとも気付か セキュリティへの影響の。 今、私は、その冗談を言う 私たちは、今日見ることになるだろう そして、今週はそれが実際の 本当に、本当に簡単に 悪いことさえ作る 脆弱な短いプログラム。 しかし、今のところ、少なくとも、実現 質問はここで求められていることを コンパイラでクラングについてです。 なぜクラングを信頼されています 過去二、三週間? 誰が誰をクラングを書いたと言うことだ そこに「IF」条件を持っていませんでした それは基本的にいくつかのゼロを注入し そしてすべてのプログラムへのものは、それがコンパイルされます それは彼または彼女のアクセスをさせたい お使いのコンピュータには、眠っているとき そしてあなたのラップトップのふたが開いている コンピュータが実行されている? 右? 私たちは名誉のシステム権のこの種を持っている 今、私たちは、クラングが合法であることを信頼してある。 アプライアンスが合法であることを信頼しています。 あなたが信頼し、その文字通りすべてのプログラム お使いのMacまたはPC上で信頼できる。 そして、この単純なバグが示唆するように、 それは、悪意ではない場合であっても、 それは絶対にありません ケースである可能性が高い。 だから、地獄のように怖いでなければなりません。 率直に言って、簡単なはありません この他の解決策 社会意識のソートより 複雑化の 私たちは上に構築していることを 当社のコンピュータ·システムの、 とどのようにますます脆弱 私たちは非常によくあることかもしれません。 今ではブレイクアウトと言って。 そうブレイクアウトであるという問題が三セット、および ブレイクアウトは、往年のゲームです あなたが思い出すかもしれないが、 私たちのために問題に3を設定し、 それは私たちが取ることができます 物事は、ノッチをバックアップ 私たちはプログラムを書いている時にするように、 でも、このようなターミナルウィンドウで、 私たちは実際に、最終的には、実行することができます グラフィカルなプログラムはありません 私達が持っていたものとは違って スクラッチ中へのアクセス。 だから、これはスタッフのです ブレイクアウトの実施、 ちょうどこのレンガ破りこれは ゲーム、あなたが戻ってあなたのパドルを移動していることを 行ったり来たり、あなたはボールを打つ トップアップこれらの色のレンガに対して​​。 だから、これは私たちをもたらしている ソートの裏どこへ 私たちは非常に迅速にすることができました スクラッチと、そして今Cは、 私たち自身を実装する グラフィカル·ユーザ·インタフェース。 しかし、それよりもこの 問題のあるセットは、第1を表し、 その中で私たちは与えている あなたのコードの束。 そして実際には、私は、明示的な持参 これに注意、特に理由 これらの少ない快適なために、この この問題は、少なくとも一見、設定 のように感じるように起こっている 私たちはノッチそれを撮影した。 私たちはあなたを与えてくれたので、 検索のいくつかについて およびプロセッサセットの問題をソート 私たちが書いたコードの束、 とコメントのカップル それは、「実行する」と言う どこに空白を埋める必要があります。 だからあまりにも怖くないが、 それが初めての 私たちは、あなたがする必要があるコードを配っている まず、読んで理解し、[に追加 そしてそれを完了。 そしてブレイクアウトで、 私たちは、同じことをやろうとしている あなたに数十行以上を与える 率直に言って、あなたを与える、というのコード のためのフレームワークの多く ゲームが、短い停止 レンガを実装する ボールとパドル、 私たちは、いくつかの他の機能を実装します。 とにもその一見、再び、 特にあまり快適であれば、 特に困難に見えるかもしれませんし、 あなたは非常に多くの新機能があると思う あなたはあなたの心をラップする必要があり 周りに、それは本当だ。 しかし、それはだ、覚えておいてください かなりスクラッチのような。 オッズはあなたのすべてを使用していなかったです スクラッチでのパズルのピース。 オッズあなたがラップする気にしませんでしたされている それらのすべての周りにあなたの心 それは取ったすべてだったので、 理解するためにチラッ、ああ、 それは私が何ができるかだ そのパズルピースを持つ。 そして実際、問題にセット 3スペック、私たちはあなたを指すよ その意志のドキュメントで いくつかの新機能を紹介し、 そして最終的にプログラミング お使い構築します。 条件、ループ、 変数、および関数 と同じになります 私たちは、これまで見てきました。 だから確かに、私たちは何をあげる あなたはそのいくつかのサンプルコードです。 ウィンドウを作成することができます それはこのとは違っていないに見えますが、 そして最終的にそれを回す 非常にこのようなもの。 そうCS50を活用、 営業時間などを議論し、 そしてことに納得してピッチを取る あなたが書かなければならないコードの量 すべてのことあまり、実際にはありません。 最初の課題はただ順応することです 自分たちが書いたいくつかのコードに。 pset3上のご質問、 シェルショック、または別の方法で? 聴衆:それはのように思えた ブレイクアウトを経験して コー​​ドはほとんどであること オブジェクト指向のスタイル、 しかし、私はCはと思った オブジェクト指向プログラム。 スピーカー1:優秀な質問。 だからを通して見るにおける 分配コード、コード 私たちは、pset3のために書いた 慣れているため、それ それはだように見える 少しオブジェクト指向。 短い答えは、それが、である。 それはどのように近似だ 使用して、オブジェクト指向のコードをするかもしれない Cのような言語が、それはある それでも最終的に手続き。 の内部には方法がありません 変数は、あなたが表示されますように。 しかし、それはそれを彷彿とさせる。 そして、私たちは再びその機能が表示されます 私たちは、PHPとJavaScriptを取得するとき 最後の学期に向けて。 しかし、今のところ、と考える 来て何のヒント。 良い質問。 かしこまりました。 だから、どうやってソートしたマージ 左物事前回。 そして、ソートでクールだったマージ それはとても速かったという感覚、 少なくともざっとテストに基づいて 私たちは、バブル、たとえば、より、先週やった ソート、選択ソート、挿入ソート。 そして、何きちんとしたのはあまりにもわずかである どのように簡潔かつきれいに あなたはそれを表現することができます。 そして、私たちはそれが上だったか言っていた マージの実行時間の下限 並べ替え? うん? 聴衆:nのログn? スピーカー1:nは右、nはログインしてください。 nはn個を記録します。 そして、私たちはどのようなものに戻ってくる 本当の意味やそれがどこから来るのか、 これは良かった 時間を実行しているものよりも 私たちは、バブルのために見た 選択と挿入ソート? だからnの二乗。 nの二乗 これよりも大きい、 そしてそれはかなり明白でなけれあっても、 そのログnはnよりも小さい知って、 ますので、n回を行う場合 nよりも小さいもの、 それは、n乗よりも少ないことになるだろう。 それはそこに勘のビットです。 しかし、私たちは、このための代償を払った。 それは速かったが、テーマが始めた 先週が出現するために、このトレードオフがあった。 私はより良いパフォーマンスを得 時間賢いが、何 私は他に費やす必要がなかった 手は、順番にそれを達成するには? 聴衆:メモリ。 スピーカー1:もう一度言って? 聴衆:メモリ。 スピーカー1:メモリ、または スペースより一般的。 そして、それは、スーパーではありませんでした 私達の人間との明白な、 私たちのボランティアことを思い出す フォワードステッピングステッピングた バックアレイがありますかのように しかし、ここで、とあります ここでその二番目の配列 彼らは私たちので、使用することができます それらの人々をマージするどこかが必要でした。 私達はちょうど場所でそれらを交換できませんでした。 だから、ソートレバレッジをマージ より多くのスペースは、これは 私たちはと必要はありませんでした 他のアルゴリズム、 しかし利点は、それははるかに高速であるということです。 そして、率直に言って、現実世界の空間で これらdays-- RAM、ハードディスクspace-- 比較的安価であり、したがってそれはだ 必ずしも悪いことでは。 それでは、少し簡単に見てみましょう より念入りに、私たちがやったことで なぜ私たちはそれがnログnと述べた。 だからここに8の数字があり、 8人のボランティアたちは、最後の時間を過ごしました。 そして、マージ最初 並べ替え何だった行うには私たちに語った? 聴衆:二つに分割。 スピーカー1:もう一度言って? 聴衆:二つに分割。 スピーカー1:二つに分割、右。 これは非常に彷彿とさせる 除算の電話帳、 より一般的に征服する。 そこで、左半分を見た。 そして、私たちは、ソート、言っ一度 要素の左半分、 私たちは次は何を言ったの? 左の左半分をソート 私たちがすることができ半分、、 二つに分割した後、 4二つに焦点を当てています。 どのようにに、今リストをソートするか サイズ2の、黄色、ソートマージご利用ですか? まあそれを半分に分割し、 左半分を並べ替える。 そして、これはどこの事だった 少し愚かな簡単になった。 あなたがのだリストをソートするにはどうすればよい サイズ1、ここでは、この数4のように? これは、ソートいます。 あなたは完了です。 しかし、その後、どのようにリストを並べ替えるか サイズ1は、2位ですか? まあ、同じことが、今何だった 第三およびマージソートの重要なステップ? あなたが左をマージする必要がありました 半分と右半分。 私たちがいることをやったらと、私たちは見えた 4で、2つのを見た。 私たちは、すべての権利を決定した 明らかに二人は、最初に来る 私たちは、その中に2を入れて 4続い場所。 そして今、あなたは巻き戻しの種類があり、 これは特性の一種である マージのようなアルゴリズムの 並べ替え、メモリ内に巻き戻し。 物語の次の行は何でしたか? 私は次は何に焦点を当てすべきですか? 左の右半分 6および8で半分。 だから私はちょうどこのステップスルーしましょう あまりにも多くのポイントをbelaboringせず。 シックスと8、その後6です ソート、8がソートされます。 そのようにそれらを一緒にマージ、 そして今、次の大きな一歩 もちろん、から右半分をソートされている このアルゴリズムの非常に最初のステップ。 そこで、1、3、7、5に焦点を当てる。 次に、左半分に焦点を当てています。 その左半分、右半分 それは、その後、1と3にマージします。 そして、右半分、左半分 それは、それの右半分。 ステップが残っているものそれを今でのマージ、および? 大きな左半分と大きなマージ 右半分は、ので、1つは、そこにダウンした 次いでその後、2つ、3つ、4つ、 次いで5つ、6つ、その後、7つ、8。 だから今、なぜこれが最終的に明らかにされ、 特にnおよび対数の場合より 一般的にはむしろ、あなたをエスケープ 少なくとも最近の記憶では? さて、この事の高さに注目してください。 私たちは、8つの要素を持っていた、と私たち 2で、2で、2でそれを割った。 だから、ベースのログを8の2は私達に3を与える。 そしてその上で、私を信頼している場合 その上で少しかすん。 しかし、8のベース2が3でログインする 私たちは合併の三層をやった。 そして、私たちは合併したとき 要素、どのように多くの要素 私たちはそれらの行のそれぞれで見たのですか? 合計n、右か? 一番上の行をマージするので、 私たちは少しずつそれをやったとしても、 私たちは最終的には一回数に触れた。 そして、2行目の、へ サイズ2のそれらのリストをマージし、 私たちは、かつて各要素に触れなければならなかった。 そして、ここでは本当に 明らかに最後の行の、 私たちは、これらのそれぞれをタッチしていた 一度、一度だけの要素、 そうここに私達のn個のログnが、その後、位置しています。 そして今、物事は少し作る よろしければ、ちょっとのためのより正式な 今、これを分析することであった より高いレベルのようなもので、 そしてどれだけ、決めるしよう あなたが表現について、行くかもしれない このアルゴリズムの実行時間 ちょうどそれを見て、しないことにより、 不自然な例を使用して? さて、あなたはどのくらいの時間だと思います かかる黄色で次のように進み、 N <2リターンたら? それは何の大きなOですか? だから私は、1、ので、1つのステップを見ている 多分二段階場合、それはだから してから返しますが、それはだ 一定の時間、右か? だから私たちはO(1)と述べ、それはだ どのように私はこれを表現します。 Tは、ちょうど時間が実行されている。 nは、入力のサイズです そう、T(n)は、変わった方法 ランニングを言うの サイズnの時、指定された入力 オーダーであることを行っている 一定の時間、O(1)。 しかし、それ以外の場合は、このことについてどのような? どのように表現するだろう この黄色の線の時間を実行している? 何のT? あなたはちょっとここでカンニングすることができ、 周期的に私の質問に答えます。 だから、実行時間内であれば 一般的な私たちは、T(n)は言う。 そして今、あなたはちょっと、ここでパンティングしていて、 と言って、よく、ちょうど左半分を並べ、 し、右半分を並べ替える。 どのように象徴的に表すことができ この黄色の線の運転時間? 何のT? 入力のサイズは何ですか? 2オーバーのn。 なぜ私はちょうどそれを言ってはいけない? そして、これは他のTは(n / 2)、次いで 再び、私は2つのソートの半分をマージした場合、 私はどのように多くの要素をつもりです 総触れる必要はありますか? nは。 だから私は、これを表現することができます だけの種類の空想であると、 一般的に実行している時間など。 T(n)は、T(n / 2)個だけの実行時間である T(π/ 2)、左半分と右半分、プラス プラスおそらくn個のステップではO(n)、、 多分、私は2本の指を使用している場合には、 それは多くの倍の 手順が、それは線形です。 これは、ステップのいくつかの数だ すなわち、n個の係数の 私たちはこのようにこれを表現かもしれません。 そして、これは私たちがパント満載の今である バック私たちの高校の数学の教科書の 私たちは最終的に再発ことをしている この等しいしまう、n回のログインのn あなたが実際に行う場合 数学より正式に。 だから、ちょうど2つの視点です。 の一つの数値 ハードコードされた代表例 8番号などを使用して、 私たちがそこに着いた方法で一般的な外観。 しかし、ここで本当に面白いものだ サイクリングのこの概念は、再び、である。 私は、forループを使用していないよ。 私はこの種の定義よ 自体の面で何か、 これでだけでなく、 数学関数、 だけでなく、この擬似コードの面で。 この擬似コードは再帰的です そのラインの2つの内 本質的に行くためにそれを語っている 小さなを解決するために、それ自体を使用し 小さいサイズの問題、 してから何度も何度も そして、再び私たちはそれを削る時まで このいわゆるベースケースまで。 それでは、実際にはもっと説得力を描きましょう 持ち帰りこのことから、以下のように。 私はgeditのに入り、見てみましょう 今日のソースコードの一部を見て、 ここでは特にこの例。 明らかに追加されますシグマ0、 数字nまで1。 それでは、お馴染みのか見てみましょう ここと不慣れ。 まず、いくつかあり 含まれているため、何も新しいそこに。 プロトタイプ。 私は上の少しかすんだ この数日後に、 私たちは何を言ったの 関数のプロトタイプは? 聴衆:[聞こえない]。 スピーカー1:それは何ですか? 聴衆:私たちはそれを発表する。 スピーカー1:私たちはそれを発表する。 だから、ちょっと、クラングを教えている 実際にこれをまだ実装していない、 しかしどこかにこのファイル内の、おそらく、 何呼び出された関数になるだろう? シグマ。 そして、これは単なる約束であること それはこのように見えるだろう。 それはのように整数を取るために起こっている input--と私はより明確になることができます で、int nは - そしてそれはだと言う int型を返すつもり、 しかしセミコロンは、ミリメートルを意味し、私の周り取得します 少し後にこれを実装する。 ここでも、クラングはダムです。 それだけで何を知っているために起こっている あなたは、上から下にそれを伝える 私たちは、少なくとも与える必要が それは何のヒントが来ています。 それでは、ここでの主を見てみましょう。 それでは、ここで下にスクロールしてみようと やっていることの主な参照してください。 これは、関数の長くないし、 実際には、ここで構築物は、よく知られている。 私は、変数nを宣言し、 私は何度も何度もユーザーをせがむ getIntはを使用して正の整数のために、 そしてこのループのうち唯一の出口 一旦ユーザが遵守している。 、私たちが使ってきたと同時に、DO そのようにしてユーザーをせがむ。 さて、これは面白い。 私はと呼ばれるint型の宣言」の答えを。 " 私はそれを戻り値を代入 呼び出された関数の「シグマ」 私はそれがまだ何を知っているが、しないでください 私は一瞬前にそれを宣言覚えています。 そして私は渡しています ユーザーが入力した値、nは、 そして私は答えを報告している。 さてそれではスクロールバックしましょう ただちょっと。 それでは、このディレクトリに先に行ってみよう、作る σ0、実際にこのプログラムを実行する 何が起こるかを参照してください。 私が先に行くと、実行のであれば このプログラムは、./sigma-0、 と私はポジティブに入力する 2のような整数、シグマ、 ギリシャのシンボルが意味するように、ちょうどある からのすべての数字を追加しよう 最大2つのゼロ。 だから0プラス1プラス2。 だから、これがうまくいけば、私に3を与える必要があります。 つまり、やっているだけです。 そして同様に、私はこれを実行した場合、再び そして私はそれを数3を与え、 のように、それは、3 +2だ 5、プラス1は私に6を与える必要があります。 そして、私は本当にクレイジー取得する場合と 大きな数字で入力を開始、 それは私を与える必要があります どんどん大きく和。 だから、それがすべてです。 だから何シグマは次のようにしますか? まあ、それは非常に簡単です。 それは私たちが実装しているかもしれない方法です この数週間のために。 "int型"は、戻り値の型であることを行っている。 シグマは、名前であり、それはとり 代わりに、nの変数m。 私はトップそれを変更します。 その後、これはただの健全性チェックです。 私たちは、一瞬でその理由が表示されます。 今、私は別の変数を宣言し、 合計は、ゼロに初期化します。 それから私はループでは、これを持っている どうやら明確にするため、繰り返し処理、 i = 1から上のアップ= mに、これは ユーザーがタイプ入力してから、私は何でも このような合計をインクリメントします。 そして、合計を返す。 だから、質問のカップル。 一つは、私はこのことを、私のコメントで主張 無限ループの危険を回避できます。 なぜ負の数を渡すことになる 、潜在的に、無限ループを引き起こす? 聴衆:あなたがmに達することは決してないだろう。 スピーカー1:Mに到達することはありません。 しかし、mが渡され、そうしてみましょうされている 簡単な例を考えてみましょう。 mは、によって渡された場合 負の1としてユーザー。 にかかわらず、メインの。 主から私たちを保護します これも、私はちょうどよ 本当に肛門である シグマも確認します 入力が負にすることはできませんことを。 そのように、mが負の場合、 負の1のようなもの。 何が起こるだろう? まあ、私はしようとしている 1に初期化さ、 そして私はあることを行っている m以下? スタンバイ。 つまり、のがないようにしましょう​​was-- それではこの話をニックスましょう。 私がいるので、その質問をしませんでした 私はをほのめかしていますリスク 私であるために発生するつもりはない 常に、[OK]をthan--大きいことだろう 私はその質問を撤回。 [OK]をクリックします。 それではここでの唯一のこの部分に焦点を当ててみましょう。 なぜ私はいくつかを宣言しなかった ループの外? ライン私がした49に関するお知らせ 私は、ループの中で宣言 しかし、オンライン48、私がした いくつかの外側を宣言した。 うん。 聴衆:[聞こえない]。 スピーカー1:確かに。 だから、何よりもまず、私は確かにない 和を宣言し、初期化したい 内部ゼロに 各反復では、ループ、 これは明らかにそぐわないため 数字を合算する目的。 私は、変化し続けるだろう ゼロに戻る値。 そしてまた、別のより難解なものだ その同じ設計上の決定の理由? うん。 聴衆:[聞こえない]。 スピーカー1:その通りです。 私は外にアクセスしたい あまりにも何行にループの? 53について。 と親指の私たちのルールに基づいて、 講義前のカップルから、 変数がに、本当に、スコープさ それらを包含し、中括弧。 だから私は、内部の和を宣言しない場合は、 これらの外側の中括弧の、 私はライン53でそれを使用することはできません。 私は宣言した場合、別の言い方をすれば ここでの、あるいは内合計 ループのために、私は53にそれにアクセスすることができませんでした。 変数は、効果的に行ってされることになる。 だから、いくつかの理由。 しかし、今の前に戻ってみましょう 何が起こるかを参照してください。 だからシグマに呼び出されます。 それは、1プラス2、または1プラス2を加算 プラス3、その後、値を返し、 答えに格納し、ここでのprintf 私は画面上に見ている理由である。 だから、これは私たちが、反復と呼ぶことにしますものです アプローチ、反復するだけ ループを使用することを意味します。 Forループ、Whileループ、実行(Do)しながら ループが、もう一度何かをやって そして何度も何度も。 しかしシグマはきちんとした関数内の一種である 私は違ったそれを実装できるという。 これについてはどのような、これ ただ、ちょっとクールに 私は本当に取り払うましょう 気晴らしの多くの この機能のため 実際にはかなり簡単です。 レッツ削るそれをただ その4つのコアラインに とすべてを取り除く コメントや中括弧。 これはショッキングの一種である 代替実装。 すべての権利、多分気に吹きません、 それは、すべてが右、ちょっとセクシーだ そんなにより簡潔にこれを見ている。 コー​​ドのわずか4行では、 私が最初にこの健全性チェックを持っている。 mは以下である場合 ゼロ、シグマは意味がありません。 にのみにあることになっている 正の数については、この場合、 私はちょうどに行くよ 任意にゼロを返す 私たちは、少なくとも有するように、 いくつかのいわゆる基本ケース。 しかし、ここの美しさだ。 このアイデアの全体、加算 1からnまでの数字、この場合におけるm、 降圧を渡すの種類によって行うことができる。 さて、mの1の合計は何ですか? さて、あなたは何を知っていますか? これは、mの合計と同じです プラス1〜mのマイナス1の合計。 さてあなたは何を知っていますか? m個のマイナス1シグマは何ですか? さて、あなたはちょっとこれを従っている場合 論理的に、それはmのマイナス1と同じです プラスMマイナス2シグマ。 だから、ちょっとjust--缶 あなただけのなら、これは、ようなものです 友人を困らしよう 彼らはあなたに質問をする、 あなたはこの種の問題で応答し、 あなたはこの種の降圧を渡す維持することができます。 しかし、何がキーなのはあなたが続ければということです 質問はますます小さくなっ 小さい、あなたがしている シグマは何求めていない n個の、シグマは何ですか nは、n個のシグマは何ですか? あなたが何を求めている n個のシグマ、シグマは何ですか nのマイナス1、n個のマイナス2シグマは何ですか? 最終的にはあなたの質問 何になろうとしているのですか? 一つ以上のシグマとは何ですか ゼロ、いくつかの非常に小さな値、 とすぐとして つまり、あなたの友人を得る あなたが求めるつもりはありません 再び同じ質問、 あなただけのああそれがゼロだ、と言うつもりです。 私たちは、この種の再生を行っている 愚かな循環的なゲームの。 だから、再帰はプログラミングの行為である 自分自身を呼び出す関数の。 コンパイルして実行すると、このプログラムは、、です まったく同じように動作するつもりは、 しかし、何のキーだと、その内側にある シグマ呼び出された関数の、 コー​​ド記載の行があります 私たちは、自分自身を呼んでいる これは、通常は悪いだろう。 例えば、どのような最初のI場合 これをコンパイルしたので、作るsigma-- シグマ1 ./sigma-1を作る。 正の整数、お願い、50 1275。 それではこの関数はいるようだ 正しいテストに基づいて、あること。 しかし、私は少し危険なものを手に入れる場合には いわゆる基本ケースを削除し、 ちょうどよく私はちょうど作ってるんだ、と言う それはよりも、このより複雑。 ちょうどシグマを計算してみましょう mは服用してから添加することにより m個のマイナス1シグマでの? さて、ここで何が起こるだろう? それではズームアウトしてみましょう。 それでは、プログラムを再コンパイルしてみましょう、 それを保存し、プログラムを再コンパイルし、 ./sigma-1はズームインしてから準備ができて、 、50は正の整数を入力してください。 どのように多くのあなたのは喜んでいる それを見ることに白状するには? [OK]をクリックします。 だから、これはために発生する可能性が 多くの理由から、 率直に言って、今週私たちはしている あなたにそれらの多くを与えることについての。 しかしこの場合、試して 後方推論する ここで何が起こっている可能性があります? セグメンテーションフォールト、私たちは最後の言った 時間は、メモリのセグメントを意味する。 何かが悪い起こった。 しかし、それは何だったの 機械的にゆがんで行ったこと こちらの私の除去 その、いわゆる基本ケースの、 私はハードコードされた値を返しどこ? あなたは何を間違っていたと思いますか? うん。 聴衆:[聞こえない]。 スピーカー1:ああ。 良い質問。 数の大きそう 私は、合計したことを それを超えていることをとても大きくなった メモリ空間のサイズ。 良いアイデアではなく、根本的に クラッシュを引き起こすだろう。 つまり、整数オーバーフローが発生する可能性があり、 ビットがちょうど裏返し場所 そして、私たちは本当に大きな間違い 負の数などの番号、 それ自体はクラッシュが発生しないこと。 そのための最後に 当日int型は32ビットです。 あなたはするつもりはない 誤って33番目のビットを盗む。 しかし、よく考えて。 うん。 聴衆:[聞こえない]。 スピーカー1:メソッド 実行を停止することはありません、 そして実際、それは再び自分自身を呼び出し そして何度も何度も何度も そして再び、とのいずれも 今までにそれらの機能 彼らの唯一の行のための仕上げ コー​​ドが何度も何度もその人自身を呼び出す そして再び。 そして、実際に何が ここで起こって、今、私たち 種類の絵でこれを描くことができます。 私はに引き継が行こう ちょっと絵。 これはという、絵です 最終的に肉付けします より詳細に、何が起こっているの コンピュータのメモリの内部。 そして、それはその上に判明 この写真の一番下 スタックと呼ば​​れるものです。 これはの塊です メモリ、RAMの塊、 それはただの時間を使われています 関数が呼び出されます。 いつでもあなたは、プログラマ、 関数を呼び出し、 オペレーティングシステム、等 Mac OSでは、Windows、またはLinuxで、 多分、バイトの束をつかむ 数キロバイト、多分数メガバイト メモリを、それらを手 あなたに、そして、その後することができます あなたが使用して関数を実行 どんな変数があなたが必要です。 そして、あなたは、別のを呼び出す場合 関数と別の関数、 あなたは、メモリの別のスライスを取得 およびメモリの別のスライス。 そして実際に、これらの緑のトレイの場合 アネンバーグから、そのメモリを表す ここで最初に何が起こるかだ ファンクション·シグマを呼び出す時。 それはこのようにトレーを置くようなものだ 最初は空のスタック何上。 しかし、そのトレーの場合 いわば、自身を呼び出し、 別のインスタンスを呼び出す シグマの、それはだ オペレーティング·システムを尋ねるように、 ああ、少しより多くのメモリを必要とする、 私にそれを与える。 そして、それは上に上に積まれます。 しかしここで重要なのはということです 第一のトレーは、まだそこにある 彼は、この第2のトレイを起動しているため。 さて一方、シグマ、シグマを呼ぶ それはより多くのメモリを要求するようなものだ。 こっちでの積み上げを取得します。 シグマは、それはまた別のだが、シグマを呼び出す ここでの積み上げれますトレイ。 そして、あなたはこれをやり続ける場合、 最終的に、この種のこのビジュアルにマップ そのグラフに、に何が起こっている トレーのスタックで発生? それは量を超えることが起こっている メモリのコンピュータがあります。 そして、すぐにこの緑色のトレイなど 水平線を越えて スタック上でその単語ヒープ上で、 その私たちは将来的にに戻ってくるだろう、 それが悪いことだ。 ヒープは異なっている メモリのセグメント、 そしてこれらを聞かせている場合 上のトレーの山と山、 あなたが超過するつもりだ メモリの独自のセグメント、 プログラムは、実際にクラッシュしようとしている。 さて余談ですが、このアイデアとして 再帰のため、 明らかに問題が発生する可能性がありますが、 それは必ずしも悪いことではありません。 検討しているので、後に すべての、多分how--と これは、いくつかは慣れが必要 --howするエレガントなまたはどのように単純な シグマの実装があった。 そして、私たちは使用するつもりはない CS50内のすべてのそれほど再帰、 しかしCS51において、本当に任意のクラス あなたがデータ構造を操作する場合、 樹木、または家族の木のように、 それはいくつかの階層があり、 それは超便利、スーパーだ。 さて、余談ですが、あなたがそのように コンピュータ科学者を志望として Googleのいくつかに精通している あなたはGoogleに行けば内側ジョーク、 あなたが何であるかを調べる 、の定義はたとえば、再帰、次のように入力します。 うん。 余談として、私はいくつかをプルアップされています。 これは10分のようだった 先延ばし今朝。 もしあなたもGoogleの「斜めに」予告 あなたの頭を傾けてslightly-- そして、この1は、おそらくです すべての中で最も凶悪な 誰かは次のように過ごしているので その日これを実装 何年かが点灯ago--。 ああ、wait--それはバグです。 だから、のいずれかで実行されている 世界最大のウェブサイト これらの愚かな小さなイースターエッグです。 おそらく彼らは消費する コー​​ドの行数は自明でない ちょうど私達が持つことができるように そのような小さな楽しいこと。 しかし、少なくとも今あなたが得る これらの内部のジョークのいくつか。 それでは、いくつかを見てみましょう 私たちは後半の言ってきた白い嘘、 そして戻って剥離し始める いくつかの層、技術的に あなたが本当に理解しているので、 何が起こっているされています あなたが理解することができます 脅威のいくつかの、 シェルショックのような、その 今になって始めている 皆のの最前線について 少なくともメディアで注目、。 だからここに非常に単純な関数である それは、ボイド、何も返しません。 その名は、スワップです。 それは、2つの変数を取り込み そしてそれは何も返しません。 aとbを取り込む。 だから、簡単なデモ。 当社は、これらを育てた。 私たちは同様に少しかかることがあります ちょっとここで破る そして飲む少し何かを持っている。 誰かが参加する気にしないだろう場合は ここでちょっと私をバックアップします。 どのようにえび茶色のシャツでのあなたは? アップさあ。 ちょうど1今日。 しかし、ありがとうございます。 すべての権利、私たちは持っている 誰がここに来る? あなたの名前は? スピーカー4:ローラ。 スピーカー1:ローラ。 アップさあ。 だからローラ、非常に単純な挑戦今日。 ヨーヨーはじめまして。 かしこまりました。 だから私たちはここと比べていくつかの牛乳を持っている 私たちはここに比べていくつかのオレンジジュースを持っている 私たちいくつかのカップを 今日アネンバーグから借りた。 スピーカー4:借用。 スピーカー1:そして、先に行くつもり そしてあなたにこの半分のガラスを与える。 かしこまりました。 そして、私たちはあなたに半分あげる 牛乳のガラス。 ああ、ちょうどあなたができるように、 このようなものだったか覚えて、 私が持って思い出した このアップ今日について。 わかりました。 あなたが気にしないのであれば、見てみましょう、私たち あなた自身のメガネの上にそれらを置くことができます あなたがしたい場合。 これはローラの目から世界になるでしょう。 かしこまりました。 だからあなたの目標は、2杯を与えられ ここでは、液体、ミルク、オレンジジュース、 2つのコンテンツを交換されるので、 オレンジジュース、ミルクカップに入る そしてミルクに入る オレンジジュースカップ。 スピーカー4:私は別のカップを取得していますか? スピーカー1:でも、私はあなたが尋ねたうれしい それははるかに良い映像だっただろう あなたが持っていたかどうか尋ねていない。 しかし、はい、私たちはあなたにサードを提供することができます もちろん、空のコップ。 かしこまりました。 だから内容を入れ替える。 非常に素晴らしい。 非常に良い。 あなたは著しく、慎重にこれをやっている。 そして、ステップ3。 かしこまりました。 優秀。 大きな拍手 ローラのために良いでしょう。 かしこまりました。 私たちは、少し別れの贈り物を持っている あなたのために、しかし、私はこれらを取りましょう。 どうもありがとうございました。 だから簡単な例は、しかし、 これを行うとすることを実証するために 内容を入れ替えたい 二つの容器の、 またはの変数にそれらを呼ぶことにしましょう​​、 あなたは、いくつかの一時的なストレージが必要 そこらでコンテンツのいずれかをステージに あなたが実際にスワップを行うことができます。 ここでそのように確かに、このソースコードアップ Cは、まさにそれを表している。 オレンジジュースは、Aと牛乳だった場合 、Bだった、と私たちは2を交換したかった あなたは創造的な何かを試みることができる 他に1を注ぐことにより、 それはおそらくないだろう 特によく終わる。 そして、私たちは第三のカップ、呼び出しを使用 それtmpに、慣例により、T-M-P、 との内容を入れ OJはその中で、片方のカップを交換し、 その後にOJを入れる それによってオリジナルのカップ、 まったく同じように、達成する ローラは、スワップをしました。 それでは、正確にそれを行うことができます。 私が先に行くと開いてみましょう だ例アップ 実際にノー」と呼ばれる スワップ、「これではありませんので、 あなたが考えるほど単純に行わ。 したがって、このプログラムの中で、あることに気付く 私はstdio.hに、私たちの古くからの友人を使用しています。 私は試作品を持っている そこスワップアップのため、これ その実装の意味 おそらくダウン下の、 と見てみましょうメイン何この プログラムは、私のために何をするつもりだ。 私は最初のint xが取得する宣言 一方、yは二つ取得int型。 だから、OJとしてそれらを考える それぞれ、牛乳、。 そして私はちょうど持っている printfのxがこれですと言って yはちょうどので、私ができる、これです 視覚的に起こっているのかを見る。 それから私は主張しているのprintf 私は2つを交換していることを、 そして私はプリントアウト 彼らが入れ替わっていると主張している、 そして私は再び、xとyをプリントアウト。 だから、ここでダウンスワップ中です 正確にローラが何をしたか、 そして私たちが見たかを正確に 先ほどの画面。 それでは、先に行くとしましょう 痛んでがっかりする。 何スワップを作るようにし、決してスワップを実行していない、 ここで、出力にズームイン。 xは1で入力し、yはスワップスワッピング、2である。 xは依然として1であり、yはまだ2である。 だからにもかかわらず、率直に言って、これが見える 正確に、より技術的にではあるが、好き ローラが何をしたか、動作していないようでした。 では、なぜそのようになるのですか? まあ、それは時にあることが判明 私たちはこのようなプログラムを書く それは、両方のメイン、ここで強調している、 し、別の機能、スワップのような、 、ここで強調される それは世界呼び出し のような少し何かに見える 少し前これらのトレイ。 メイン1は、呼び出されると、 それは、オペレーティングシステムを尋ねるようなものだ 任意のローカルのためのメモリのビットのために 主が持っているxとyのような変数、 彼らはすぐそこに終わる。 しかし、主な通話は交換し、メインあれば 二つの引数aとbを交換することに渡し、 オレンジジュースと牛乳、それはようではありません オレンジジュースと牛乳を渡す ローラへ。 どんなコンピュータ、それはありませんです。 オレンジジュースのコピーを渡します ローラへのミルクのコピー、その結果 このトレイの中に、最終的に何が 値1および2、またはOJです 牛乳はなく、そのコピーを、 その結果、この時点で 物語の中で、そこに これらのトレイのそれぞれにおけるOJとミルクです。 1と2があります これらのトレイのそれぞれにおいて、 およびスワップ機能は確かに動作しています。 これは、内部​​のそれらを交換することだ 第二一番上のトレイ、 それスワッピングは影響はありません。 そして、ちょうどいくつかに基づいて、 私たちがした基本原則 前の話、そして実際に ほんの数分前に、どのような 変更する理由を説明するかもしれない スワップの内側とb にもかかわらず、xおよびyに影響を及ぼさない 私は、スワップ機能にxとyを可決した。 ここでそのキーワードは何ですか 単純化して説明するかもしれない? 私はここでそれを聞いたと思いますか? 聴衆:リターン。 スピーカー1:戻る? 返さない。 それでは、他のものに行きましょう。 なにそれ? 聴衆:[聞こえない]。 スピーカー1:OK、私たちはできるreturn-- 物語の中でリターンを機能させる、 それでも簡単な説明があります。 聴衆:範囲。 スピーカー1:範囲。 私は、スコープを取るよ。 だからスコープ、場所を覚えて 私たちのx、yは宣言した。 彼らは、内部に宣言されている メインの右ここまで。 aおよびbは、一方で、ある 効果的に宣言された スワップの内側ではなく、かなり 中括弧それでも スワップの一般的な領域にある。 だから確かに、aとb これだけのトレイ内に存在する アネンバーグから、この コー​​ドの第2のチャンク。 だから私たちは確かにコピーを変更しているが、 それは本当にすべてが有用ではありません。 それでは見てみましょう この小さな低いレベル。 私はに戻って行くつもりです ソースディレクトリ、 と私は最初に行くよ ここでのズーム、ちょうど 私はこの中にいることを確認するために、 大きなターミナルウィンドウ、 プログラムは、まだそのように振る舞うだ。 今ではこの仮定 意図的ではありません。 明らかに、私はへのスワップを望んでいた 作業は、ので、それはバグのように感じている。 今、私は追加を開始できた 私のコードへのprintfのたくさんの、 、yはこっちのxの上にプリントアウト ここでは、こっち、こっちB。 しかし、率直に言って、それはおそらく何 あなたは数週間行ってきた 今、業務時間中に 自宅で作業するとき いくつかのバグを見つけようとのpset上。 あなたは既にいない場合しかし、あなたは、表示されます、 その問題は、三つを紹介設定 GDBと呼ばれるコマンドに、 ここで、GDB、GNUデバッガ、 それ自体の全体の束を持ってい 特徴はそれが実際にできます 私たちは状況を理解してみましょう このような、より説得力、 問題を解決し、バグを見つける。 だから私は、これを行うつもりです。 その代わり./noswap、私は代わりによ GDBの./noswapを実行するつもり。 言い換えれば、私は私のを実行するつもりです プログラムではなくbashで、私たちの新しい友人 今日。 私は自分を実行するつもりです 内部のプログラムNOSWAP と呼ばれるこの他のプログラムの デバッガですGDB、その 助けるように設計されていますプログラムです あなたが見つけたバグを取り除く人間。 私がここに実行しヒットのであれば、あります テキストの凶悪な量 あなたは本当に読む必要がないこと。 それは本質的に気晴らしだ これは、プロンプトから 私は、コントロール-Lをヒットするつもりです そこに一番上に立ち上がった。 これは、GDBのプロンプトです。 私は今、このプログラムを実行する場合は、 今日の上のこの小さなチートシートとして スライドは、実行して、最初に、示唆している 私たちがご紹介するためのものというコマンド。 そして私はちょうどタイプするつもりだ GDBの内部で、ここまで実行し、 そして実際、それは私のプログラムを実行しました。 今、いくつかの追加があります このような画面の出力は、 それは、GDBだけであること肛門です そして何が起こっているかを告げて。 あなたは本当に心配する必要はありません 今、これらの詳細についての。 しかし、何がについては本当にクールだ 私がしなければGDBは、これがagain-- コントロール-Lは、私が行かせscreen--クリアする 先とタイプ、それにより「メイン破る " 私は何の設定、Enterキーを押したとき noswap.cでのブレークポイントと呼ばれる、 GDBであるライン16、 実際に私のプログラムを考え出し 私の機能は、実際には、である。 これは、私たちは今のところ無視するよ それは、アドレスです 特にこの関数のメモリ内。 だから今、私が入力したときに実行すると、 ここにクールだ何に気づく。 線Iでの私のプログラムが壊れ で実行を一時停止するGDBを語った。 だから私は今、私のコードを変更する必要はありません、 、いくつかのprintfのを追加し、それを再コンパイルし、再実行 それは、変更、いくつかのprintfのを追加し、 それを保存し、それを再コンパイルし、実行します。 私はちょうど私のプログラムの中を歩くことができます 人間の速さで一歩一歩一歩、 ではないスピードのインテル内部親切で。 だから今この行に気付く ここに表示され、私は戻ってしまったら geditの中で私のプログラムに、 それが実際にあることに注意してください コー​​ドの最初の行。 16行目は、geditの中にあります。 あり16行目は、GDBの中だ、とさえ この黒と白のインターフェースも ほとんどのユーザーとしてではありません 優しい、この手段 そのライン16が実行されていない まだ、それがあることが約だ。 だから、確かに私は印刷と入力した場合 のx、printfの、ちょうど、xが印刷されない 私は、ゼロのそこにいくつかの偽の値を取得 xがまだ初期化されていないので。 あなたのであれば、私は、次を入力しようとして、またはよ すぐ隣のためのN、空想になりたい。 私は、次の入力したときにしかし、今、次のように入力します それは17行に移る気づく。 だから論理的に、私が実行してしまった場合 ライン16と私は今、プリントxを入力し、 私は何が表示されるはず? 一つ。 そして今、これは確かに混乱しています。 $ 2、の変わった方法でよろしければ 後でその値を参照したい場合は、 あなたは「ドル記号2 "を言うことができます これは、後方参照のようなものだ。 しかし、今のところ、それを無視してください。 面白いのは、何である 等号の右側にある。 そして今、私は、次の入力した場合、再び と印刷yは、私は2が表示されるはずです。 私も今印刷することができます のxを再び、と率直に言って、 私はに関して少し混乱取得していた場合 私はどこで、私は、リストのためのリストを入力することができます ちょうど周りにいくつかのコンテキストを参照してください。 ポイントは、私は実際にいる。 そして今、私が入力することができます 次の、そしてそこに、xは1である。 今、私は、次の入力します。 ああ、yは2である。 そして再び、それは混乱して、 GDBの出力理由 私自身の出力と混合されています。 しかし、あなたが心に留めておく場合には、バイ あなたのコードで前後かすめる または側面を、それをレイアウトする おそらくサイドすることで、よ 本当に私はちょうど私がわかり 私のプログラムをステップ実行する。 しかし、文字通り、次に何が起こるかわかります。 ここでは22行です。 私はその上に行ってみよう、それによって先に進む 23に、そして私は今、まだ一つのX印刷する場合。 そして、私は今のyを印刷する場合、まだ1つ。 だから、これは便利な練習ではありません。 それでは、これをやり直してみましょう。 私はまで戻りましょう トップと再度実行タイプ。 そしてそれは、プログラムを言っている それがデバッグされています すでに始まっている、 最初から始めた。 はい、それでは再びこれをやらせる。 そして、この時間は、の次やらせる 次、次、次、次、 今は物事が面白く。 今、私は足を踏み入れるしたい スワップので、私は、次の入力しないでください。 私はそれに気づくようになりましステップを入力し、 noswap.c 33行に私をジャンプした。 私はgeditのに戻った場合は、33行は何ですか? すなわち、まず、実際の スワップの内のコードの行。 どの今私ができるので、いいです 種の周り突くと好奇心を取得 そこに本当に何が起こっているのかに関して。 私はTMPを印刷してみましょう。 おっと。 なぜtmpがいくつかを持っていない クレイジー、偽のごみ値? 聴衆:それは初期化されていません。 SPEAKER 1:それは初期化されていない。 そして実際、あなたがプログラムを実行すると、 あなたは、メモリの全体の束を与えられている オペレーティングシステムによってではなく、あなた すべての値を初期化していないが、 そう何ビットあなたがしている それはだとしても、ここで見て このクレイジーな大きな負 番号は、単に意味 それらはからの名残であることを そのRAMはいくつかの以前の使用状況、 私は持っていないにもかかわらず、 私はまだそれを必要としていました。 だから今、私は先に行くと入力するつもりだ 次の、そして私は今、印刷tmpを入力した場合、 私は何が表示されるはず? どのような値であった、 ただ、最初の引数である xが最初だったように 事が渡されて、 従って、xは、同じであるべき これで印刷tmpが私にものを印刷する必要があります。 だから、何を問題のあるセットに表示されます 3は、GDB上の一種のチュートリアルです、 しかし、これは始まりであることを認識 その実際にするツールを見ての あなたが問題を解決するのに役立つ そんなにより効果的。 私たちは最終的に何をしている 水曜日に何をするつもり 数層をバック剥離を開始されている といくつかの補助輪を外します。 そのことと呼ばれる文字列その 私たちはしばらくの間使ってきた、 私たちは、ゆっくりとそれを奪うようになるだろう あなたからとについて話し始める 何かもっとesoterically はchar *として知られている、 私たちはこの素敵なをやろうとしていると 優しくしてもポインタも、最初は、 彼らが呼ばしているように、いくつかを行うことができます 虐待を受けた場合に、非常に悪い、 から少しクレイメーションを見ることによって、 スタンフォードから私たちの友人ニックParlante 大学、コンピュータ教授 このプレビューをまとめる科学 この水曜日来て何の。 [ビデオ再生] -Hey、Binky。 目を覚ます。 これは、ポインタの楽しみのための時間です。 それは - 何ですか? ポインタについて学ぶ? ああ、グッディ! [END VIDEO再生] スピーカー1:水曜日にあなたをお待ちしております。 次に、お会いしましょう​​。 [ビデオ再生] - そして今、ディープ思考、 祈るファーナムによる。 - なぜ私たちは、Cを学んでいる? どうして+? [笑い] [END VIDEO再生]