>> [Zenelejátszás]
>> SPEAKER 1: Rendben, ez CS50, és ez a négy hét elején,
és lehet, hogy hallott vagy olvasni, a világ már véget.
Megy az egész internet vetették tudás és tudatosság
A hiba a programban, a programozási nyelv nevű Bash.
Ezt csodálatosan márkás mint Shellshock, vagy a Bash ajtó,
de olyan tárgyak, mint ezek a nem volt ritka.
És valóban, sokan hozzák vissza emlékeit Heartbleed,
amit lehet, hogy észrevette a nyomja vissza a múlt tavasszal, ami
hasonlóképpen meglehetősen drámai.
Most azoknak az itt ma, hányan vannak,
akkor is, ha nem érti, mi ez az egész a, hallott Shellshock?
Jól van, és hányan rendelkezik számítógéppel, amelyek leginkább kiszolgáltatottak?
OK, nem kell sokkal, sokkal több kéz fel most okokból fogjuk látni.
>> Vessünk egy pillantást, mi van folyik a médiában
majd magyarázni, hogy egy kicsit itt nekünk technikailag.
>> Hangszóró 2: biztonsági szakértők arra figyelmeztetett, hogy egy komoly hibája lehetett
körülbelül hatással száz milliói a világ internetes felhasználók.
Szóval, mi is pontosan a hiba, hogy a már szinkronizált Shellshock, és mit csinál?
Nos, Shellshock is ismert, mint a Bash bug, a szoftver kihasználja.
Hackerek használja a vírus átkutat sebezhető rendszerek Linux és Unix
operációs rendszerek, majd megfertőzni azokat.
Bash egy parancssori shell.
Így a felhasználók a kérdést parancsokat, hogy indítson programok és szolgáltatások belül szoftver
beírásával szöveg.
Ez tipikusan a programozók, és nem lehet nyitott a világ felé,
bár Shellshock megváltoztatja ezt.
>> Nos, worringly, egyes elemzők figyelmeztetnek, hogy lehet egy nagyobb fenyegetés,
mert Shellshock lehetővé teszi a teljes irányítást a fertőzött gép,
míg Heartbleed csak akkor engedélyezett hackerek, hogy kémkedjen a számítógépen.
Ez annyira komoly, hogy már értékelte a 10-ből 10
A súlyosság a Nemzeti Sebezhetőség adatbázis.
2/3 az összes web szerverek a kockázat, beleértve néhány Mac számítógépeken.
Nos, győződjön meg róla, folt a rendszer most.
Bárki, aki egy olyan honlap futó az érintett operációs rendszerek
lépéseket kell tennie a lehető leghamarabb.
Aki megengedheti magának, meg kell nézni azok ellenőrzése és a webes alkalmazások
tűzfalak, hogy néz ki az esetleges támadásokat.
SPEAKER 3: A legrosszabb , ami történhet,
hogy valaki írni a kódot, hogy az automatikusan megy és szkennelés
az internet és az intézkedés befolyásolná az összes ilyen számítógépek.
És ha mégis, nos, A legrosszabb dolog, amit tehet
csak töröl mindent, vagy kapcsolja ki a helyszínek le.
Így láttuk kár abból a szempontból,
ahol mi lett volna a támadók aki csak úgy, hogy súlyos károkat okoznak
azáltal, hogy a rendszer le vagy törlése kép, és hasonló dolgok.
Hangszóró 2: Néhányan azt mondják, ez az egyik a leginkább nehezen mérhető
hibák években, és azt eltarthat hetekig vagy akár
hónap határozza meg a végső hatást.
>> SPEAKER 1: Tehát minden, ami igaz, de a furcsa dolog az, hogy szinte minden
A képek imént látott, kivéve talán a billentyűzet,
semmi köze a hiba nélkül.
Szerverek és vezetékek, és így tovább, Ez egyfajta érintőlegesen kapcsolódó,
de a lényege ez valóban nagyon ismerős, mi folyik itt.
Sőt, hadd menjen be a CS50 készülék.
Hadd menjek előre, és maximalizálja a a terminál ablak itt.
És ti is ezzel, vagy a beágyazott verzió cikkére,
A gedit hogy programokat írni, parancsokat, és így tovább,
és ez valójában, és volt, hogy a hét, Bash, B-A-S-H.
Ez a Bourne-again shell, ami csak egy divatos szóval,
ez egy olyan program, amely a villogó azonnali, hatékony,
hogy ül ott vár bemeneti neked.
És ez a parancs vonal felület, amelyen keresztül
srácok már futó parancsok és végül összeállítása, majd a futás
programokat.
>> De Bash is programozás nyelv a következő értelemben.
Tudod, hogy vannak olyan parancsok, mint a cd és ls, valamint csengés és társai
de akkor meg a saját parancsok által hajtja végre azokat Bash.
Most már nem fog menni nagy részletességgel
mivel a bash a programozási nyelv, de Tudod, például, hogy abban a pillanatban,
nincs parancs a "helló".
Így megtalálható egy ilyen csomag.
Ez nincs telepítve a számítógépre.
Kérdezze meg a rendszergazda.
De ha azt akarom, hogy legyen a programban az úgynevezett "hello" a Bash vagy az én azonnali,
Én ténylegesen használni szintaxist ez elég, mint C. Ez nem teljesen ugyanaz,
de úgy néz ki, nagyon hasonlít a funkció, bár hiányzik néhány részletet.
Semmi sem történik, de most, ha én írja: "Helló,"
akkor valóban levelet program nem a C, nem Java,
nem egy másik programozás nyelv, de a Bash is.
>> Most a legfontosabb az, hogy én írtam a nevet akartam adni az új parancs,
és a zárójel is szimbolikus mivel ez a funkció.
Mellesleg, akkor is csinálni szórakozás dolgok, sőt, még a Mac OS,
ez a program neve Terminal.
Jön épített senki számítógép, amely a Mac ebben a szobában,
és meg tudod csinálni hasonló dolgokat Mac Operációs rendszer, de lehet menni még túl.
És ez egy kicsit érintőleges, de ez a fajta szórakozás.
Eszembe jutott ma reggel, amikor gondolta ezt végig,
Egy kis játék, én is játszani az egyik CS50 egykori TF
amellyel bármikor ő sétára a billentyűzet a képernyő kinyitotta,
Szeretnék végre egy parancsot mint Ez-- "köszönni."
És most minden alkalommal, amikor jött vissza a billentyűzet, miután elhagyta a képernyőt
és ő ül le, próbálja meg egy kis munka,
lista tartalmát a directory--
>> [AUDIO LEJÁTSZÁS]
>> Hello.
Helló.
>> SPEAKER 1: Szóval, a tisztesség, hogy valójában nem a "hello".
Ez általában valami inkább hasonlít hogy--
[AUDIO LEJÁTSZÁS]
-Beep.
SPEAKER 1: --that I would-- így a számítógép is
esküszik rá minden alkalommal, amikor valójában leült a billentyűzet.
És nagyon hamar rájött, hogy ne hagyja a képernyő nyitva.
De ez azt sugallja, hogy a fajta Az ostoba móka, amit
lehet valami, mint a Bash.
De ez egy kicsit komoly, az biztos, mint az.
És valóban, ez az egyik a legveszélyesebb és tartós hiba
hogy valóban elérje a világ globálisan.
Ez a hiba már körülbelül közel 20 éve,
és akkor kell találni csak egy pillanatról a viszonylagos egyszerűség.
>> Tehát ez egy képviselő parancsot, hogy ha
maga a Mac, a szó szoros értelmében most ha van a fedél nyitva van,
akkor írd be, hogy nevű programot Terminal.
Terminál alatt Alkalmazások Utilities--
egyszer, a Windows felhasználóknak nem kell aggódni az adott threat--
de azoknak, a Mac beírhatja ez egy ablak, mint én itt csinálni,
és ha típus hogy ebbe a programba
az úgynevezett terminál, mint én megteszem most, ha úgy látja, a "sebezhető"
a számítógép téve a kizsákmányolás.
>> Most, mit jelent valójában?
És ez kétségkívül néhány nagyon őrült szintaxis,
de most legalább dolgozzon ki néhány érdekes eleme.
Szóval van valami szintaxist úgy néz ki, egy kicsit ismerős, legalábbis a C
és programozása általában.
Látok néhány zárójel, pontosvesszővel kapcsos zárójelek, és az ilyen,
de kiderül, hogy ez a hülye dolog itt sárga
lényegében egy funkció hogy nem csinál semmit.
A vastagbél eszköz nem tesz semmit, és a pontosvessző azt jelenti, abbahagyni semmit.
Tehát belül ilyen kapcsos zárójelek, a tény
hogy van egy azonos alá a bal, ez
lényegében létrehozása a parancs, vagy a változó,
hívott x, rendeli, hogy a sárga kis kód is.
Ez lehet valami, mint a "visszhang hello "vagy" mondjuk beep "vagy valami
hasonló ehhez.
De figyeljük meg, ha a szemed vándorol tovább jobbra,
van még, hogy ezt a vonalat, mint a csak a végén, hogy a pontosvessző.
"Echo sebezhető", majd azon túl, hogy van még.
Egy másik pontosvessző, bash C :.
>> Tehát hosszú történet rövid, ebben a sorban a kód
elegendő kényszerítő a számítógép, hogy a
veszélyeztetett csinál valamit hogy akarod csinálni,
mert van egy hiba a Bash, ahol noha Bash kellett volna, hogy hagyja abba
olvasás vonalak parancs jog után ott a sárga szöveg,
egy 20 plusz éves bug, Bash ténylegesen olvas
azon túl, hogy pontosvessző és szép sok mit csinál azt mondta.
>> Szóval mi a következménye Az, hogy végül?
Csak azt mondtam, "echo hello" vagy "echo sebezhető"
de mi van, ha nem valami valójában rosszindulatú, mint rm -rf *
ami lehet, hogy nem valaha is gépelt korábban,
és őszintén szólva valószínűleg ne túl hamar,
mert meg tudod csinálni a Sok kárt vele.
Miért?
RM mit csinál, persze?
Eltávolítja.
* Mit jelent?
All.
Tehát ez egy úgynevezett wild card, tehát ez azt jelenti,
töröl mindent az aktuális könyvtárban.
-r történik jelent rekurzív, ami azt jelenti, ha az, amit te törlése
egy könyvtár, és azon belül van az egyéb fájlok és más könyvtárak,
rekurzív belevetik magukat ott és törli az összes, hogy.
És f a legrosszabb mind közül.
Bárki, aki tudja, mit jelent itt-f?
Force.
Tehát erőt jelenti, még ha ez egy rossz ötlet,
csináld figyelmeztetés nélkül nekem további megerősítést.
Szóval, tudod, mi nevetni ezt, de őszintén szólva, én valószínűleg
írja ezt többször egy nap, mert a valóságban
az, hogy ez a leggyorsabb módja annak, törölni egy csomó dolgot.
De még tettem némi kárt.
>> De ha úgy döntesz, hogy trükk a számítógép a meghatározó valami hülye változó
vagy funkció az úgynevezett x, de aztán megtévesztett a számítógépet végrehajtó
határain túlra, hogy a funkció, túl pontosvessző,
akkor valóban becsapni a számítógép a végrehajtó valami hasonló rm -rf
vagy az e-mail parancs vagy a Másolás parancsot.
Bármi szó, amit tehetünk a számítógép, legyen szó fájlok törlése,
fájlok létrehozását, spam valaki, támadó néhány szervert távolról,
ha ki tudja fejezni azt a parancs
lehet becsapni a számítógépet csinálja.
>> Most mi egy példa arra, hogyan lehet ezt csinálni?
Nos, van egy csomó számítógép az interneten futó Bash.
Mindannyian a Mac felhasználók között.
Sok Linux szerverek között őket is, és a Unix szerverek.
A Windows újra lesz viszonylag ki a horgot
hacsak nem telepítette speciális szoftver.
Most egy csomó szerver, a például webszerverek működtetését,
és valójában a Linux talán a legnépszerűbb operációs rendszer
futtatni a számítógépen az interneten amelyek a weboldalak kiszolgálását.
Most, meglátjuk később a félév, amikor
küld kérésére Ön browser-- Chrome,
Internet Explorer, whatever-- egy távoli szerverre,
kiderül, hogy annak ellenére, hogy csak gépelt www.example.com,
a böngésző küld egy üzenetet ez egy kicsit bonyolult, mint ez.
>> De figyeljük meg egy kis valami furcsa.
Az első két sor Még soha nem láttam korábban,
de nem néz különösen fenyegető.
De észre amit lopott A harmadik sor itt.
Ha rossz ember volt, hogy küldjön egy üzenetet mint ez a saját számítógépén
a sebezhető Mac vagy a sebezhető Linux szerver,
A vicces az, hogy Bash, az egyszerű kis parancssor,
mindenütt jelen van, és gyakran Használt lényegében végre
tartalmának üzenetet kap.
És, hogy a logika, akkor trükk a webszerver, ezért,
küldött valami hasonló User-Agent, ami általában
kellene mondani a neve a böngésző.
User-Agent Chrome, User-Agent Internet Explorer, User-Agent Firefox, ez
csak a böngésző azonosításának módját is.
De ha rossz ember nagyon ügyesen mondja, mm-mm, vagyok
Nem akartam mondani, hogy mi a böngésző,
Én inkább fogja küldeni ezt rejtélyes külsejű dolog egy rm -rf
* Benne, akkor a szó szoros értelmében becsapni a sebezhető webszerver az interneten
a végrehajtó pontosan, hogy ott törlése az összes fájlt.
És őszintén szólva, ez nem még a legrosszabb.
Meg tudod csinálni semmit.
Lehet kezdeni a megosztott DoS támadást
ha ezt az üzenetet küldte, hogy egész csokor webszerverek
és aztán őket leszáll, a Például a Harvard.edu szerver,
és rendezheti a bumm a fene ki őket
olyan hálózati forgalom volt egyébként váltja a rossz fiú.
>> Szóval, hosszú történet rövid, szinte ebben a teremben mindenki, akinek van egy Mac
ki van téve ennek.
Az érem másik oldala az, hogy ha az ember fut egy webszerver a laptop,
és hacsak nem tényleg beállítva azt, hogy valami hasonló SSH bele,
te tényleg biztonságban.
Ez sebezhető, de nem egyik próbál bejutni a laptop,
így egyfajta megnyugodhat.
Azonban az Apple hamarosan frissítjük javítja ezt.
A világ a Linux már megjelent Számos javítás a Fedora és az Ubuntu
és más Linux rendszerekkel, sőt ha fut frissítést 50 a készülék,
még ez is lesz frissített és javított.
De ez is nem tényleg sebezhető,
mert ha neked van tinkered a készülék
és tette a laptop nyilvánosan elérhető az interneten, ami nem
alapértelmezés szerint neked van ténylegesen jó, mert
A tűzfal és más technikák.
>> De ez egy szélsőséges példa a hiba hogy már élt a szó szoros értelmében 20
évben, és ki tudja, ha valaki Ennyi idő is tudott róla?
És valóban, ez az egyik az alapvető kihívások
hogy majd később látni a félév a biztonság,
az, hogy csakúgy, mint a valós világban, A jó fiúk vannak a hátrányt.
Annak érdekében, hogy a rossz fiúk ki, meg kell győződjön meg arról, hogy minden ajtó zárva van,
hogy minden ablak biztonságos, hogy minden belépési pont egy hazai
biztonságos, hogy a rossz fiúk ki.
De mit jelent a rosszfiú kell tenni, hogy valóban veszélyeztetik a hazai
és ellopják tőled?
Ő csak meg kell találni egy nyitott ajtó, egy törött ablak, vagy valami
Ezen a vonalon, és ez a Ugyanez a számítógép biztonságát.
Mi lehet írni millió sornyi programkód
és költeni több száz vagy több ezer óra próbál meg helyes,
de ha csinál csak egy hiba korrektség,
akkor lehet, hogy a teljes rendszert, és Ebben az esetben valóban, az egész internet
és a világ veszélyeztetett.
>> Tehát, ha szeretne többet erről, megy ez a URL itt.
Nincs szükség intézkedésre ma este, ha te vagy
körében sokkal kényelmesebb, hogy már fut a saját web
kiszolgálóval, amely esetben ki kell, sőt, frissítse a szoftvert.
>> És ez is a címe a beszéd, és most a papír,
hogy már össze kell kapcsolni a Természetesen honlapján ma.
Ez volt az a fickó nevű Ken Thompson, aki
volt elfogadva egy nagyon híres díjat számítástechnika,
és ő adta ezt a beszédet néhány évvel ezelőtt, lényegében ugyanezen témában.
Kérdezi emberek a kérdés, Ha tényleg
bizalom, végső soron, a szoftver, amit kapott?
Például, mindannyiunknak Készítettem programok
és mi már összeállítása őket csenget.
És a tudás, írtál bármely programokat CS50, ahol van
a hátsó ajtón a fajta, van rá mód, hogy rossz ember, ha fut a program
átvehetné a számítógép?
Valószínűleg nem, ugye?
Mario és a kapzsi, és a hitel.
Ezek mind nagyon kis programok.
Azt, hogy elég rossz, ha tényleg
tette az egész számítógép sebezhető megírása után 10, illetve 20 sornyi kódot,
vagy legalább néhány tudatában a biztonsági következmények.
Most azt mondom, hogy tréfásan, de fogunk látni ma
és ezen a héten, hogy ez valójában nagyon, nagyon egyszerű
hogy rossz, és még a rövid programok sebezhető.
>> De most legalább rájönnek hogy a kérdés arra kérik itt
szól csenget a fordító.
Miért mi lett bízva csenget Az elmúlt két-három hét alatt?
Ki kell mondani, hogy aki írta csenget nem volt "ha" feltétel ott
hogy lényegében beadott néhány nullát és azok a minden programot állítja össze
hogy engedné őt hozzáférés a számítógépet, ha alszol
és a laptop fedele nyitva és a számítógép fut?
Nem igaz?
Van ez a fajta becsület rendszer jobb Most hol vagyunk benne, hogy csenget legális.
Te benne, hogy a készülék nem legális.
Te benne, hogy szó szerint minden programot a Mac vagy PC megbízható.
És ez az egyszerű hiba arra utal, akkor is, ha ez nem rosszindulatú,
ez egyáltalán nem valószínű, hogy ez a helyzet.
>> Szóval kell félni, mint a pokol.
Őszintén szólva, nincs egyszerű más megoldás erre
mint egyfajta társadalmi tudatosság A növekvő komplexitása
hogy mi építünk tetejére A számítógépes rendszerek,
és hogyan egyre inkább sebezhető talán nagyon is.
>> Most azt mondta, Breakout.
Tehát Breakout probléma meg három, és Breakout egy játék a tavalyi
hogy lehet felidézni, de számunkra a probléma meg három,
ez lehetővé teszi számunkra, hogy a dolgokat egy fokkal
hogy amikor írunk programokat, még egy terminál ablakban, mint ez,
mi is valójában futni, végül, grafikus programok nem
eltérően volt hozzáférést a Scratch.
Tehát ez a személyzet végrehajtása Breakout,
amely éppen ez a tégla-törés játék, hogy mozog a lapát vissza
oda, és nyomja meg a labdát azok ellen, akik színes téglák felfelé tetején.
Szóval ez így nekünk fajta vissza oda, ahol
tudtuk, hogy nagyon gyorsan A Scratch, és most a C,
végrehajtási saját grafikus felhasználói felületek.
>> De több mint, hogy ez a probléma halmaz jelenti az első
amelyben adsz Ön egy csomó kódot.
És valóban, hozom explicit figyelmet erre, különösen azért, mert
a kevésbé kényelmes, ez probléma állítva, legalábbis első pillantásra,
fog érezni, mint vettünk fel egy fokkal.
Mert már kaptál, néhány a keresési
és válogatás problémák a Pset, egy csomó kódot, amit írt,
és egy pár hozzászólás hogy azt mondják: "csinálni"
ahol van, hogy töltse ki az üres.
Így nem túl ijesztő, de ez az első alkalom,
mi átadta Önnek kódot, hogy meg kell először olvasni, megérteni, majd adja hozzá a
és töltse ki.
>> Majd Breakout, fogjuk, hogy tegyék ugyanezt,
így néhány tucat sor A kód, amely, őszintén szólva, hogy az Ön
sok a keret a játék, de megállni
végrehajtásának téglák és a labdát, és a lapát,
de mi végre néhány egyéb jellemzőit.
És még az első pillantásra, ismét, különösen, ha kevésbé kényelmes,
tűnhet, különösen ijesztő és Szerinted van olyan sok új funkciót
meg kell, hogy lezárja a fejedben körül, és ez igaz.
De ne felejtsük el, ez a nagyon tetszik Scratch.
Valószínűleg te nem használja fel a puzzle-darabokat a Scratch.
Valószínűleg te nem érdekel, hogy csomagolja az elme körül mindet
mert minden elég volt a gyors pillantást, hogy megértsük, ó,
ez az, amit én tehetek azzal a puzzle-darabot.
És valóban, a probléma be 3 spec, akkor pont akkor
A dokumentáció, amely be, hogy néhány új funkció,
és végül a programozási felépíti használja.
Feltételek, hurkok, változók és függvények
azonos lesz amit láttunk eddig.
>> Tehát valóban, mi adunk meg egy kis minta kód
hozhat létre egy ablak úgy néz ki, nem ellentétben ezt,
és végül kapcsolja be valami ehhez foghatót.
Így kihasználják a CS50, megvitassák munkaidőben és több,
és hogy a kényelem az a tény, hogy az összeg a kódot kell írni
valójában nem olyan sok.
Az első kihívás csak hozzászokik magát, hogy egy kódot, amit írt.
>> Bármilyen kérdése van pset3, Shellshock, vagy más módon?
>> Közönség: Úgy tűnt, megy keresztül a Breakout
hogy a kód szinte egy objektum-orientált stílus,
de azt hittem C volt objektum-orientált program.
SPEAKER 1: Egy kiváló kérdés.
Így néz át a elosztás, a kód
írtunk a pset3, azok számára ismerős, azt
úgy néz ki, mintha egy kis objektum-orientált.
A rövid válasz az, hogy van.
Ez egy közelítése, hogyan talán nem objektum-orientált kódot
egy nyelvet, mint a C, de ez még végül eljárási.
Nincsenek módszerek belsejében A változók, mint látni fogod.
De emlékeztet, hogy a.
És látni fogjuk, hogy a szolgáltatás újra amikor eljutunk PHP és JavaScript
a vége felé a félév.
De most, úgy mondanám, hogy egy csipetnyi mi jön.
Jó kérdés.
Rendben.
Tehát egyesülésről fajta volt, hogyan bal dolgok utoljára.
És egyesítése fajta volt hideg a értelemben, hogy ez így sokkal gyorsabb,
legalább alapuló felületes vizsgálatok mi a múlt héten, mint, mondjuk, buborék
sort, kiválasztás sort, beillesztés sort.
És mi volt szép is csak hogyan tömören és tisztán
ki tudja fejezni azt.
És mit mondunk, hogy egy felső kötött a menetideje merge
rendezni?
Igen?
>> Közönség: n log n?
>> SPEAKER 1: n log n, jobbra. n log n.
És mi jön vissza, hogy mi valójában azt jelenti, vagy ha ez jön,
de ez a jobb volt mint amit futási idő
hogy láttuk a buborék kiválasztás és beillesztés sort?
Így n négyzeten. n kockás nagyobb, mint ez,
és akkor is, ha ez nem teljesen nyilvánvaló, tudják, hogy log n n-nél kisebb,
így ha n-szer valami kisebb, mint n,
ez lesz kevesebb, mint n négyzeten.
Ez egy kicsit az intuíció is.
De nagy árat fizetett ezért.
Ez gyorsabb volt, de a téma indult kialakulni a múlt héten volt ez a kompromisszum.
Van jobb teljesítmény idő bölcs, de mi
tehettem volna költeni a többi kéz, annak érdekében, hogy ezt?
>> Közönség: Memory.
SPEAKER 1: Mondd még egyszer?
Közönség: Memory.
SPEAKER 1: memória, vagy hely általában.
És ez nem volt szuper nyilvánvaló a mi emberek,
de emlékeztetnek arra, hogy önkénteseink is előrelépett, és megerősítsék
vissza, mintha ott egy tömb itt, és mintha ott
egy második tömb, hogy itt tudták használni, mert
Szükséges valahol egyesíteni azokat az embereket.
Mi nem csak cserélni őket a helyére.
Tehát merge sort tőkeáttétel több hely, ami
nem volt szükség a a másik algoritmusok
de a fejjel, hogy ez sokkal gyorsabb.
És őszintén szólva, a való világban tér ezeket days-- RAM, merevlemez space--
viszonylag olcsó, és így ez nem feltétlenül rossz dolog.
>> Szóval vessünk egy gyors pillantást, egy kis több módszeresen, a mit tettünk
és ezért azt mondta, hogy n log n.
Tehát itt van a nyolc számot és a nyolc önkéntesek volt utoljára.
És az első dolog, ami egyesítése Sort azt mondta, hogy nem volt?
Közönség: Ossza két.
SPEAKER 1: Mondd még egyszer?
Közönség: Ossza két.
SPEAKER 1: Ossza két, jobb.
Ez nagyon emlékeztet a telefonkönyv, a megosztottság
és uralkodj általában.
Így megnéztük a bal felét.
Aztán egyszer azt mondta, sort a bal fele a elemek,
mit is következő mondjuk?
Rendezni a bal fele a bal fél, amely lehetővé tette, hogy,
Miután elosztjuk két, középpontjában négy és kettő.
>> Hogyan rendezheti a listát most, sárga, méret két, a Merge Sort?
Jól osszuk félbe, és rendezni a bal felét.
És ez volt az, ahol a dolgok Egy kicsit hülye röviden.
Hogyan rendezheti a lista, amelyet a méret egy, mint ez a szám a négy itt?
Ez rendezve.
Kész.
>> De akkor hogyan lehet rendezni a listát méret az egyik, amikor ez a szám két?
Nos, ugyanaz a dolog, de most mi volt a harmadik és legfontosabb lépés a Merge Sort?
Meg kellett egyesíteni a bal fele és a jobb fele.
És amint ezt tettük, néztünk négy, néztük két.
Úgy döntöttünk, minden rendben, nyilvánvalóan két előbb,
így még két saját helyen, ezt követi a négy.
És most meg kell, hogy milyen vissza, és ez a fajta jellemző
Egy algoritmus mint Merge Sort, visszatekerés a memóriában.
Mi volt a következő sorban a történet?
Mit kell összpontosítva a következő lépés?
A jobb felét a bal fél, azaz hat és nyolc.
>> Engedjék meg, hogy át lehet lépni ezt nélkül belaboring a pont túl sok.
Hat és nyolc, majd hat a válogatni, nyolc van rendezve.
Egyesíti őket össze, mint az, és most a következő nagy lépés
, persze, rendezni a jobb fele Az első lépés az algoritmus.
Így összpontosítani egy, három, hét, öt.
Ezután elsősorban a bal felét.
A bal fele, hogy a jobb fele hogy, majd egyesíti az első és a harmadik.
Majd a jobb oldalán, majd a bal fele belőle, majd a jobb felét.
Merge azt, és most mi is lépést?
Egyesíti a nagy bal felét és a nagy jobb oldalán, tehát az egyik megy le oda,
majd kettő, majd három, majd négy, majd öt, majd hat, majd hét, majd nyolc.
>> Így most miért van ez a végül felfedi, különösen akkor, ha n és a logaritmus több
általában inkább menekülni meg, legalábbis az utóbbi memória?
Nos, észre magassága ezt a dolgot.
Volt nyolc elem, és mi osztva azt a két, két, két.
Tehát log alap két nyolc ad nekünk három.
És hidd el nekem az, hogy ha egy kis ködös rajta.
De log alap két nyolc három, így tettünk három réteg összevonása.
És amikor egyesült elemek, hány elem
nem nézzük az egyes azokat a sorokat?
Összesen n, igaz?
Mert egyesíteni a felső sorban, még akkor is, tette darabonként,
mi végül megérintette minden számot egyszer.
És a második sorban, a egyesíti ezeket a listákat a méret két,
kellett megérinteni minden elem egyszerre.
És akkor itt tényleg egyértelműen az utolsó sorban,
kellett megérinteni minden egyes ilyen elemek egyszer, de csak egyszer,
így itt fekszik, akkor a n log n.
>> És most csak azért, hogy a dolgok egy kicsit formálisabb egy pillanatra, ha
volt, hogy most elemezni ezt egy fajta magasabb szintű
és próbálja eldönteni, hogyan is Lehet, hogy megy a kifejező
a futási idő az algoritmus csak néztem, és nem
segítségével kitalált példa?
Nos, mennyi időt mondana a lépés, mint ez a sárga venne,
ha n <2 visszatérés?
Ez egy nagy Ó, mi?
Szóval látni egy, így egy lépésben Talán két lépést, mert ha
majd vissza, de ez állandó, igaz?
Így az O (1), és ez hogyan fogom kifejezni ezt.
T, hogy csak működési idő.
n jelentése a méret a bemenet, így T (n), csak egy divatos
mondván a futó idő adott input n méretű
lesz a rendelés állandó idő, az O (1).
>> De egyébként, mi a helyzet ezzel?
Hogyan fejezné a futási ideje ez a sárga vonal?
T, mi?
Ön milyen csal itt választ a kérdésemre ciklikusan.
Tehát, ha a futó idő Általánosságban azt mondjuk a T (n).
És most milyen ladikozás itt mondván, jól, csak rendezni a bal fele,
majd rendezni a jobb felét.
Hogyan lehet, hogy mi jelképesen képviselt a futási idő ennek a sárga vonal?
T, mi?
Mi ez a méret a bemenet?
több mint két n.
Miért nem azt mondja?
És akkor ez egy másik T (n / 2), majd újra, ha összeolvad két rendezett felét,
hány elemet fogom hogy kell megérinteni összesen?
n.
Így tudom kifejezni ezt, csak azért, hogy legyen kedves a képzelet,
mivel a futási idő általában.
T (n) csak a futási ideje T (n / 2), , valamint a T (n / 2), a bal fele és jobb felét,
plusz O (n), ami valószínűleg az n lépéseket, de talán, ha én vagyok a két ujját,
ez kétszer annyi lépések, de ez egyenes.
Ez valami lépések száma ez a tényező az N,
így talán kifejezni ezt, mint ez.
És ez az, ahol most mi punt a Vissza a mi középiskolai matematika tankönyv
vagyunk, hogy a kiújulás végül végül egyenlő ezt n-szer log n,
ha ténylegesen ki A matek még hivatalosan.
>> Szóval ez csak két szempontból.
Egy számszerűen a kódolt reprezentatív példa
a nyolc számot, és egy általános nézd meg, hogyan került oda.
De ami igazán érdekes itt az, hogy megint ez a fogalom a kerékpározás.
Én nem használ hurkok.
Én vagyok a fajta meghatározó valami szempontjából is,
nem csak ezzel matematikai függvény,
hanem a jelen pszeudo kódot.
Ez a pszeudo kód rekurzív az, hogy két vonalai
lényegében azt mondja, hogy menjen használja arra, hogy megoldja a kisebb
probléma a kisebb méretű, majd újra és újra
és újra, amíg mi Whittle azt le, hogy ez az úgynevezett bázis esetében.
>> Úgyhogy tulajdonképpen felhívni a vonzóbb elvitelre e a következő.
Hadd menjek be gedit, és hogy egy nézd meg néhány mai forráskód,
különösen ez a példa itt.
Sigma 0, ami látszólag hozzáteszi a számokat egytől n.
Tehát lássuk, milyen ismerős és ismeretlen itt.
Először is van egy pár magában foglalja, tehát semmi új nincs.
Prototype.
Én egy kicsit homályosak ez után néhány nap,
de mit mondunk a prototípus egy függvény?
KÖZÖNSÉG: [nem hallható].
SPEAKER 1: Mi az?
Közönség: Azt jelenti be.
SPEAKER 1: Azt jelenti be.
Így tanítasz csenget, hé, nem ténylegesen végrehajtó ezt még,
de valahol ezt a fájlt, valószínűleg, meg fog olyan függvény is, mi?
Sigma.
És ez csak egy ígéret, hogy a hogy fog kinézni, mint ez.
Ez fog tartani egy egész szám input-- és én is inkább kifejezett
és azt mondják, int n --and ez fog visszatérni egy int,
de pontosvessző eszköz, mm, hozok körül megvalósítása ez egy kicsit később.
Ismét csenget néma.
Ez csak akkor fog tudni, hogy mi mondani, hogy felülről lefelé,
így szükséges, hogy legalább ad ez egy tipp, hogy mi jön.
>> Most nézzük meg legfontosabb itt.
Hadd lépjünk le itt és mi fő csinál.
Ez nem olyan hosszú egy függvény, és valójában a konstrukció itt ismerős.
Kijelentem, változó n, majd a Én ellep a felhasználó újra és újra
egy pozitív egész szám segítségével getInt, és csak kilépés ebből a hurok
ha a felhasználó nem teljesíti.
Do While, általunk használt ellep a felhasználó ilyen módon.
Most ez érdekes.
Kijelentem, egy int a "válasz".
Én rendelni azt a visszatérési érték A funkció a "szigma".
Nem tudom, hogy ez mit jelent még, de Emlékszem, kijelentve, hogy egy perce.
És akkor én halad a értéket, amit a felhasználó beírt, n,
és aztán bejelenteni a válasz.
Hát hadd lépjünk vissza egy pillanatra.
Menjünk előre ebbe a könyvtárba, hogy szigma 0, és valóban futtatni ezt a programot
és meglátjuk, mi történik.
Ha megyek előre, és fuss ez a program, ./sigma-0,
és írjon be egy pozitív egész, mint két, Sigma,
mivel a görög szimbólum azt jelenti, csak majd összeadjuk a számokat
nulla legfeljebb két.
Így 0 plusz 1 plusz 2.
Így ez remélhetőleg adjon nekem 3.
Ez minden csinál.
És hasonlóan, ha én vezetem ezt újra és adok neki a hármas számú,
ez 3 plusz 2, annak érdekében, hogy ez 5 plusz 1 adj 6.
És akkor, ha igazán őrült és kezdjen el írni a nagyobb számban,
meg kell adni nekem nagyobb és nagyobb összegeket.
Szóval ez az egész.
>> Szóval mit szigma néz ki?
Hát, ez elég egyszerű.
Ez hogyan lehet, hogy végre ez az elmúlt pár hétben.
"Int" lesz a visszatérési típus.
Sigma a neve, és tart változó m helyett n.
Majd változtatni, hogy akár felső.
Akkor ez csak egy józan eszét csekket.
Meglátjuk, hogy miért egy pillanat.
Most kijelentem másik változó, Összességében inicializálja nullára.
Aztán van ez a for ciklus ciklussal, látszólag a világosság,
az i = 1, akár egy = m, ami amit a felhasználó beírt, aztán
növelni az összeget, mint ez.
Majd vissza az összeget.
>> Tehát egy pár kérdést.
Az egyik, hogy azt állítják, az én megjegyzést, hogy ez a elkerüli kockázata végtelen ciklusba kerül.
Miért halad a negatív szám indukál, potenciálisan végtelen ciklusba?
>> Közönség: Soha nem éri m.
>> SPEAKER 1: Soha ne nyúljon m.
De m telt el, úgyhogy fontolja meg egy egyszerű példát.
Ha m telt el a felhasználót negatív.
Függetlenül attól, hogy fő.
Főbb megvéd bennünket ez is, úgyhogy csak
hogy igazán anális Sigma is győződjön meg róla,
hogy a bemenet nem lehet negatív.
Tehát, ha m negatív, olyasmi, mint negatív.
Mi fog történni?
Nos, én fog hogy elinduljon egy,
és aztán lesz kevesebb vagy egyenlő, mint m?
>> Készenlét.
Hogy was-- ne, hadd nix ezt a történetet.
Én nem kértem ezt a kérdést, mert annak kockázata, hogy én vagyok utalva
nem fog megtörténni, mert én is mindig lesz nagyobb mint-- rendben,
Én visszahúzódik a kérdést.
OK.
Nézzük csak a hangsúly ezen a részén van.
Miért Kijelentem néhány kívül a hurok?
Notice on line 49 én már kijelentette i belsejében a hurok,
de az online 48 én már kijelentette, némi külső.
Igen.
KÖZÖNSÉG: [nem hallható].
SPEAKER 1: Persze.
Így elsősorban én biztosan nem akar nyilatkozni és inicializálása összeg
nullára belsejében a hurok minden ismétlés,
mert ez egyértelműen legyőzze a célja, összegezve a számokat.
Én folyamatosan változik az értéket vissza nullára.
És azt is, mi a másik, misztikus oka az, hogy ugyanaz a design döntés?
Igen.
>> KÖZÖNSÉG: [nem hallható].
SPEAKER 1: Pontosan.
Azt akarom elérni, hogy külső A hurok is, hogy mi a vonal?
53.
És ennek alapján a szabály egy pár előadás ezelőtt,
változó hatókörű, valóban, hogy a kapcsos zárójelek, amelyek kiterjednek rájuk.
Tehát, ha én nem nyilvánítja összeget belül Ezeknek a külső kapcsos zárójelek,
Nem tudom használni a sorban 53.
Másképpen fogalmazva, ha én kijelentette, összeg itt, vagy akár a
A hurok, nem tudtam elérni azt a 53.
A változó hatékonyan elment.
Tehát egy pár oka van.
De most menjünk vissza és meglátjuk, mi történik.
Tehát szigma hívódik.
Hozzáteszi up 1 és 2, vagy 1 plusz 2 plusz 3, majd visszatér az érték,
tárolja a válasz, és printf itt Ezért látok a képernyőn.
Szóval, ez az, amit majd hívni egy iteratív megközelítés, ahol ismétlés csak
alkalmazását jelenti a hurok.
Egy ciklusban, a While ciklus, a Do While hurok, csak csinál valamit megint
és újra és újra.
>> De Sigma egyfajta ügyes funkció hogy én is végre másképp.
Mi a helyzet ezzel, ami csak azért, hogy ilyen jó,
hadd igazán megszabadulni egy csomó figyelemelterelés
mivel ez a funkció tényleg nagyon egyszerű.
Nézzük Whittle le csak a négy fő vonal
és megszabadulni az összes megjegyzések és kapcsos zárójeleket.
Ez egyfajta észbontó alternatív megvalósítás.
Rendben, lehet, hogy nem észbontó, de ez a fajta szexisebb, rendben,
nézd meg ezt, sokkal több tömören.
Mindössze négy sornyi kódot, Én először ezt a józanság csekket.
Ha m értéke kisebb, vagy egyenlő, mint nulla, sigma nincs értelme.
Ez csak kéne lennie Ebben az esetben a pozitív számok,
úgyhogy csak fog vissza nulla önkényesen
így legalább van néhány úgynevezett alap eset.
>> De itt van a szépség.
A teljes egészében ezt az ötletet, hozzátéve, a számok 1-től n, m, vagy ebben az esetben,
lehet tenni ilyen halad a bak.
Nos, mi az az összeg, 1 m?
Nos, tudod mit?
Ez ugyanaz, mint az összege m plusz az összeg 1-től m-mínusz 1.
Hát tudod mit?
Mi szigma m mínusz 1?
Nos, ha ilyen követi ezt a logikus, hogy ez ugyanaz, mint m mínusz 1
plusz szigma m mínusz 2.
Így egyfajta csak-- ez olyan, mint, ha csak
próbál bosszantani egy barátnak és felteszek egy kérdést,
Ön milyen válaszolni egy kérdést, akkor milyen tartani halad a bak.
De mi a kulcs az, hogy ha folyamatosan így a szóban forgó kisebb és kisebb
és kisebb, akkor Nem kérdezi, mi a szigma
n, mi szigma a n, mi szigma n?
Azt kérdezi, mi van szigma n, mi szigma
n mínusz 1, mi a szigma n mínusz 2?
Végül a kérdés fog válni, mi?
Mi az egy vagy szigma nulla, néhány nagyon kis értékű,
és amint kap arra, hogy a barátja,
akkor nem fogja kérni ugyanazt a kérdést újra,
csak most fogja mondani, Ó, ez nulla.
Végeztünk játszani ezt a fajta A hülye ciklikus játék.
>> Így rekurzió az a cselekmény, a programozás A funkció nevezte magát.
Ez a program, amikor összeállítják és fut, a fog viselkedni, pontosan ugyanúgy,
de mi a legfontosabb az, hogy a belső A funkció az úgynevezett szigma,
van egy sor kód, amelyben magunkat hívjuk,
ami általában rossz.
Például, mi van, ha én először össze ez, úgyhogy győződjön meg sigma--
hogy sigma 1 ./sigma-1.
Pozitív egész szám, kérem, 50 1275.
Tehát mi a funkció úgy tűnik, hogy lehet, amely egy teszt, korrekt.
De mi van, ha én egy kicsit veszélyes és törölje az úgynevezett alapeset,
és csak azt mondják, jól vagyok, csak így ez sokkal bonyolultabb, mint amilyen valójában.
Nézzük csak kiszámítani a szigma azáltal, hogy m, majd hozzáadjuk
Sigma m mínusz egy?
Nos, mi fog itt történni?
Nézzük kicsinyítés.
Nézzük újrafordítani a program menteni, újrafordítani a programot,
majd a kész ./sigma-1-nagyítás, be pozitív egész kérem, 50.
Hányan vagytok hajlandóak a fess fel, hogy lássam, hogy?
>> OK.
Így ez megtörténhet több okból,
és őszintén szólva ezen a héten vagyunk arról, hogy még több belőlük.
De ebben az esetben próbálja érvelni visszafelé
mi történhetett volna itt?
Szegmentációs hiba, azt mondta a múlt idő, utal egy szegmens a memória.
Valami rossz történt.
De mi volt az mechanikusan hogy elromlott
itt, mert az én eltávolítás Az, hogy az úgynevezett alapeset,
ahol vissza a kódolt érték?
Mit gondolsz, mi?
Igen.
>> KÖZÖNSÉG: [nem hallható].
SPEAKER 1: Ah.
Jó kérdés.
Tehát a méret a szám hogy én összegzés
annyira nagy, hogy meghaladta a méret a memóriát.
Jó ötlet, de nem alapvetően fog okozni a balesetet.
Hogy okozhat integer túlcsordulás, ahol a bitek éppen átfordítja
és akkor félre egy igazán nagy szám, mint egy negatív szám,
de ez önmagában még nem okoz balesetet.
Mivel a végén a nap egy int még 32 bites.
Ugye nem fog véletlenül ellopni a 33. bit.
De egy jó gondolat.
Igen.
>> KÖZÖNSÉG: [nem hallható].
1 hangszóró: A módszer Soha nem leáll,
sőt nevezi magát újra és újra és újra és újra
és újra, és egyik ezeket a funkciókat valaha
befejezni mert egyetlen vonal kódot kéri themself újra és újra
és újra.
És ami igazán történik itt, és most
akkor milyen felhívni ezt képileg.
Hadd menjek át, hogy a kép egy pillanatra.
Ez a kép, hogy a végül lyokra
részletesebben, hogy mi folyik itt belsejében a számítógép memóriáját.
És kiderül, hogy a az alsó kép
az úgynevezett a verem.
Ez a darab memória, egy darab RAM,
ez csak használt bármikor metódusokat hívjuk.
Minden alkalommal, amikor egy programozó, hívja a funkció,
az operációs rendszer, mint például a Mac OS, Windows, vagy Linux,
megragad egy csomó bájt, talán egy néhány kilobyte, talán néhány megabájt
memória, átadja őket neked, majd lehetővé teszi,
fut a funkciót bármit változó van szükség.
És ha majd a hívás egy másik funkció és a másik funkció,
kapsz egy szelet memória és egy másik szelet memória.
>> És valóban, ha ezek a zöld tálca az Annenberg kijelenti, hogy a memória,
Ez történik az első alkalommal, amikor hívást funkció szigma.
Ez olyan, mintha egy tálca, mint ez A mi kezdetben egy üres verem.
De ha azt a tálcát hívja magát, hogy úgy mondjam,
hívás egy másik példányát Sigma, ez
mint kér az operációs rendszer, Ó, kell még egy kis memóriát,
így rám.
És akkor nem lesz rakott a tetején.
De ami legfontosabb az, hogy Az első tálca még mindig ott van,
mert hivatkozni ez a második tálcát.
Most Eközben sigma hívja sigma, ez olyan, mint kér több memóriát.
Gets halmoztak fel ide.
sigma sigma hívja, hogy egy másik tálca, hogy lesz halmoztak fel itt.
És ha folyamatosan ezt, végül, milyen térkép ez a vizuális
az, hogy a chart, mi fog történik a köteg tálcák?
Ez lesz haladhatja meg A memória a számítógép.
És amint ezt a zöld tálca meghaladja a vízszintes vonal
felett verem felett, hogy szó halom, amely akkor jön vissza, hogy a jövőben,
ez egy rossz dolog.
A kupac egy másik szegmense memória,
és ha hagyja, hogy ezek tálcák halom és bolyhos,
fogsz haladja meg a a saját szegmensében a memória,
és a program valóban le fog zuhanni.
>> Most, mint egy félre, ez a gondolat rekurzió, ezért
egyértelműen problémákhoz vezethet, de Ez nem feltétlenül rossz dolog.
Mert követően mérlegeli, minden, hogy-- és talán
ez némi megszokni hogy hogyan viselkedni elegáns vagy mennyire egyszerű
hogy a végrehajtás szigma volt.
És nem fogjuk használni rekurzió, hogy sok minden a CS50,
de CS51, és tényleg minden osztályban ahol manipulálni adatstruktúrák
mint a fák, vagy a családi fák, amelyek bizonyos hierarchia,
ez szuper, szuper hasznos.
Most, mint egy félre, így A feltörekvő számítógépes szakemberek
tisztában vannak néhány Google belső viccek, ha megy a Google
és felnézel, mi a meghatározása, mondjuk, rekurzió adja.
Aha.
Mellesleg, húztam fel egy pár.
Ez olyan volt, mint 10 perc halogatás ma reggel.
Ha Ön is a Google "ferdén" közlemény döntve a fejét slightly--
és akkor ez talán legkegyetlenebb az összes
mert valaki töltött mint a nap végrehajtja ezt
néhány évvel ago-- gyerünk.
Ó, várj, ez a hiba.
>> Tehát futó egyik világ legnagyobb honlapok
ezek a buta kis húsvéti tojás.
Valószínűleg fogyasztanak nemtriviális több sornyi kódot
csak azért, hogy mi lehet kis vicces dolgokat.
De legalább most már kap néhány ilyen belső vicceket.
>> Most vessünk egy pillantást néhány a White Lies óta azt mondjuk az utóbbi időben,
és elkezd húzza vissza egyes rétegek technikailag
így igazán értem mi folyik
és meg tudja érteni néhány, a fenyegetések,
mint Shellshock, hogy most kezdett válni
az élen mindenki figyelem, legalábbis a médiában.
Tehát itt van egy nagyon egyszerű függvény hogy vissza semmi, semmis.
A neve csere.
Tart a két változó és visszatér semmi.
Vesz a és b.
Tehát egy gyors bemutató.
Hoztunk ezeket.
Akár azt is, hogy egy kis szünet itt egy pillanatra
és van egy kis valamit inni.
Ha valaki nem bánja csatlakozás engem itt egy pillanatra.
Mi lenne, ha a gesztenyebarna ing?
Gyere fel.
Csak az egyik ma.
Köszönöm, bár.
Rendben, és mi jön ki ide?
Mi a neve?
>> Hangszóró 4: Laura.
>> SPEAKER 1: Laura.
Gyere fel.
Szóval Laura, nagyon egyszerű feladat ma.
Örülök, hogy megismerhetem yo.
Rendben.
Tehát van egy kis tejet ide és van néhány narancslé ide
és néhány csésze, amit kölcsönzött Annenberg ma.
>> Hangszóró 4: kölcsönözte.
SPEAKER 1 És megyek előre és kapsz egy fél pohár ezt.
Rendben.
És kapsz fél egy pohár tej.
Ja, és csak így emlékszem, milyen volt, mint,
Eszembe jutott, hogy ezt, és ma.
Oké.
Ha nem bánja, lássuk, mi tegye át őket a saját szemüveg
, ha akarod.
Ez lesz a világ a Laura szeme.
Rendben.
Tehát a cél, mivel két csésze folyékony itt, tej és narancslé,
A csere a két tartalmát, hogy a narancslé bemegy a tej pohár
és a tej megy A narancslé kupát.
>> Hangszóró 4: Kapok egy csésze?
SPEAKER 1: Nagyon örülök, hogy megkérdezted, bár lett volna sokkal jobb felvételeket
ha nem kérdezte.
De igen, tudunk ajánlani egy harmadik csésze ez természetesen üres.
Rendben.
Így cserélni a tartalmát is.
Nagyon szép.
Nagyon jó.
Te ezt rendkívül óvatosan.
És lépés.
Rendben.
Kiváló.
Egy nagy tapsot jó lenne Laura.
Rendben.
Van egy kis búcsú ajándék az Ön számára, de engedjék meg, hogy ezeket.
Köszönöm szépen.
Tehát egy egyszerű példa, mégis, annak bizonyítására, hogy ha nem
szeretné cserélni a tartalom két tartályból,
vagy nevezzük őket változók kell egy kis átmeneti tárolás
a színpadon az egyik tartalmát úgy , amit ténylegesen a csere.
Szóval valóban, ez a forráskód fel itt C reprezentatív, hogy pontosan.
Ha a narancslé volt, és a tej volt b, és szerettük volna, hogy a csere a két,
akkor próbálj ki valami kreatív öntésével egyik a másik,
de ez valószínűleg nem vége különösen jól.
És így egy harmadik csésze, hívás azt tmp, T-M-P megállapodás szerint,
és tedd a tartalmát HL abban, akkor csere egy csésze,
aztán a HL a eredeti cup, ezáltal
elérése, pontosan úgy, ahogy Laura volt, a csere.
>> Tehát lássuk, hogy pontosan.
Hadd menjek előre, és nyissa meg fel egy példát, ami
tulajdonképpen az úgynevezett "nem csere ", mert ez nem
egyszerűen tenni, mint gondolnád.
Tehát ebben a programban, észreveheti, hogy Én vagyok a stdio.h, régi barátunk.
Nekem van a prototípus A csere ott, ami
azt jelenti, annak végrehajtása a talán lent,
és lássuk, mi a fő programot fog tenni nekem.
Először Kijelentem int x lesz egy, és int y lesz kettő.
Így gondolom, ezek a HL és tej volt.
És akkor én csak egy printf mondván x ez
és y ez, csak azért, hogy vizuálisan látni, mi folyik itt.
Aztán már printf állítva hogy én vagyok kicserélni a két,
és aztán nyomtassa ki a azt állítják, hogy ők cserélték,
és nyomtassa ki x és y újra.
Tehát itt a swap pontosan mit Laura volt,
és pontosan mit láttunk A képernyő egy perce.
>> Szóval, menjünk előre, és nagyon csalódott.
Félreértés ne csere, és fuss nincs csere, nagyítás a kimeneti itt.
Adja meg a x 1, y 2, csere cserélték.
x értéke mindig 1, és y értéke 2 is.
Így, bár, őszintén szólva, ez úgy néz ki, Pontosan úgy, mint, bár technikailag,
amit Laura volt, nem úgy tűnik, hogy működik.
Akkor miért van ez?
Nos, kiderült, hogy amikor írunk egy programot, mint ez
amely a két legfontosabb, kiemelt itt, majd egy másik funkció, mint a csere,
emeltük, amely azt kéri, a világ
úgy néz ki, egy kis valami hasonló Ezek a tálcák egy perce.
Amikor legfontosabb először lesz úgynevezett, ez olyan, mintha azt kérdezi operációs rendszer
egy kis memória minden helyi változók, mint x és y, hogy a Main,
és a végén ott.
De ha a fő hívások cserélni, és a főbb átadja a swap két érv, a és b,
narancslé és a tej, ez nem olyan, mint átadta a narancslé és a tej
Laura.
Mi a számítógépeden, ez halad példányban a narancslé
és másolatait a tejet Laura, hogy a Mi végül belsejében ezt a tálcát
az érték egy és kettő, vagy HL és a tej, de ezek másolatait,
annak érdekében, hogy ezen a ponton a történet, ott
a HL és a tej minden ilyen tálcákat.
Van egy és két minden ilyen tálcák,
és a csere funkció valóban működik.
Ez swapping őket belülről A második legmagasabb tálca,
de hogy csere nem befolyásolja.
És ennek alapján csak néhány alapelv mi már
beszélt korábban, és valóban csak néhány perccel ezelőtt, mi
megmagyarázza, hogy miért változik a és b belsejében csere
nincs hatással az x és y, bár Átmentem x és y, hogy a swap funkció.
Mi az a kulcsszó, hogy itt Lehet, leegyszerűsítve magyarázni?
Azt hiszem, hallottam itt?
Közönség: Return.
SPEAKER 1: vissza?
Nem tér vissza.
Menjünk egy másik.
Mi ez?
>> KÖZÖNSÉG: [nem hallható].
>> SPEAKER 1: OK, így return-- tudtuk hogy visszatérés a munka a történet,
de van egy még egyszerűbb magyarázat.
Közönség: Scope.
SPEAKER 1: Scope.
Elviszem hatálya alá.
Tehát hatály, emlékszem, hol az x és y kijelentette.
Ők nyilvánították belül fő egészen itt.
a és b, eközben vannak hatékonyan nyilvánította
belsejében csere, nem egészen A kapcsos zárójelek, de még mindig
az általános terület csere.
És így valóban, a és b csak létezik ebben a tálca
a Annenberg, ez második kódrészletet.
Szóval valóban változik a másolás, de ez nem is annyira hasznos.
>> Szóval vessünk egy pillantást ez egy kicsit alacsonyabb szinten.
Én megyek vissza A Source Directory,
és én fogok először nagyítás itt, és csak
megerősíteni, hogy én vagyok ebben nagyobb terminál ablak,
A program még mindig úgy viselkedik, mint az.
Tegyük fel, hogy ez a nem szándékos.
Nyilvánvaló akartam swap munka, ezért úgy érzi, mint egy bogár.
Most kezdhetnénk hozzáadása Sok printf által a kódomat,
kinyomtatni x ide, y felett itt egy ide, b ide.
De őszintén szólva, ez valószínűleg mi csináltál egy pár hétig
most, munkaidőn és otthon, amikor dolgozik
A psets próbálnak találni hibákat.
De látni fogod, ha még nem tetted meg, hogy a probléma meg három bemutatja
a parancs nevű GDB, ahol GDB, GNU debugger,
maga is egy csomó funkciók, amelyek valójában
értsük helyzetekben mint ez, de feltűnően,
megoldani a problémákat, és megtalálni a hibákat.
Így fogom csinálni.
Ahelyett ./noswap vagyok helyette fog futni GDB ./noswap.
Más szóval, megyek futtatni a a program nem a Bash, új barátunk
ma.
Fogom futtatni a programot noswap belül
Ennek más a program neve GDB, ami egy debugger, amely
egy olyan program, ami célja, hogy a Ti emberek megtalálja és eltávolítja a hibákat.
Szóval, ha megüt Fuss itt van egy szörnyű mennyiségű szöveget
hogy valóban nem kell olvasni.
Ez lényegében egy figyelemelterelés A gyors, ami
Megyek a control-L felkelni a tetején ott.
Ez a GDB gyors.
Ha azt akarom futtatni ezt a programot most, mivel ez a kis puskát a mai
dia sugallja, Run az első azt parancsolja, hogy mi jelentett bevezetni.
És én csak megyek, hogy írja fuss ide belsejében GDB,
és valóban futott a programom.
Most van egy kis további kimenete a képernyő, mint ez,
de ez GDB csak, hogy anális és mondja el, mi folyik itt.
Nem igazán kell aggódnia ezekről részleteket most.
De ami igazán jó a GDB, ha én ezt again--
Vezérlés-L törli a screen-- hadd menjen előre, és írja be a "szünet fő", ily módon,
amikor elütöttem az Enter, amelyben mi hívott egy töréspontot a noswap.c,
A 16. sorban, ott, ahol GDB kitalálta a program valóban
az, hogy én a funkció valójában.
Ez most nem foglalkozunk most de ez a cím
emlékére kifejezetten ezt a funkciót.
Így most, amikor a RUN, észre, mi jó itt.
Az a program bontja a vonalat I mondta GDB szünet végrehajtást.
Szóval nem kell most változtatni a kódot, adjunk hozzá néhány printf által, újrafordítani, hajtsa végre ismét a
meg, a változás, adjunk hozzá egy kevés printf által, menteni, fordítani, futtatni.
Én is csak séta a programom lépésről lépésről lépésre az emberi sebességgel,
nem Intel-belül ilyen sebesség.
>> Így most észre ezt a sort itt jelenik meg, és ha visszamegyek
az én program gedit, észre, hogy ez valójában
Az első sor kódot.
Van vonal 16 gedit.
Van vonal 16 belül GDB, és még bár ez a fekete-fehér felület
közel sem olyan felhasználói barátságos, ez azt jelenti,
hogy a vonal 16 nem hajtották végre még, de hamarosan lesz.
Tehát, ha valóban azt írja print x, nem printf, csak print x,
Én egy kis hamis értéket ott nulla, mert x nem helyeztük üzembe még.
Úgyhogy gépelni a következő, vagy, ha azt szeretnék, hogy divatos, csak n a következő.
De mikor írja be a következő, most észre mozog, hogy a 17. sorban.
Tehát logikus, ha már végre vonal 16 és most írja print x,
mit kell látni?
Egy.
>> És most ez kétségkívül zavaró.
2 $ csak egy divatos módon, ha akar utalni, hogy érték később,
lehet mondani, hogy "dollár jel kettő."
Olyan, mint egy visszautalást.
De most, ne törődj vele.
Az az érdekes, hogy mi van a jobb oldalon az egyenlőségjel.
És most, ha azt írja a következő újra és a nyomtatási y, én meg a 2.
Én is már nyomtatni x megint, és őszintén szólva,
ha kapok egy kicsit zavaros, hogy ahol én vagyok, én írja lista lista
és csak látni néhány háttér körül az pont én vagyok valóban az.
És most írja következő, és x 1 lehet.
Most típus mellett.
Oh, y 2.
És ismét, ez zavaró, mert GDB kimenete
van tárolva a saját termelés.
De ha folyamatosan szem előtt tartva, a nézett oda-vissza a kódot
vagy a tojásrakás ki oldalra mellett talán, akkor
látni, hogy tényleg én vagyok átlépett a programom.
>> De figyeljük meg, mi történik a következő, a szó szoros értelmében.
Itt a 22. sorban.
Hadd menjek át, és ezzel mozog 23, és ha nyomtatni x most még egy.
És ha nyomtatni y most még egy.
Tehát ez nem egy hasznos gyakorlat.
Szóval újra ezt.
Hadd menjek vissza a felső és típus fut újra.
És mondja a program ez hibakeresést
elkezdődött már, indult az elején.
Igen, csináljuk meg újra.
És ezúttal csináljuk a következő, next, next, next, next,
de most a dolgok érdekessé.
Most azt akarom, hogy belépjünk csere, így nem írja a következő.
I típusú lépés, és most vette észre ugrott, hogy noswap.c 33. sor.
Ha visszamegyek a gedit, mi a 33. sor?
Ez az első tényleges kódsor belsejében csere.
Ami szép és jó, mert most már tudom fajta piszkálni körül, és kap kíváncsi
arról, hogy mi folyik igazán ott.
Hadd nyomtatni tmp.
Hűha.
Miért tmp néhány őrült, hamis szemét érték?
Közönség: Ez nem helyeztük üzembe.
SPEAKER 1: Ez nem helyeztük üzembe.
És valóban, ha egy olyan programot futtat, te adni egy csomó memória
az operációs rendszer, de a nem adja meg olyan értékeket,
így bármit bit te látva itt, bár ez
ezt az őrült nagy negatív számot, csak azt jelenti,
hogy ezek a maradványok néhány korábbi használatát, hogy RAM,
bár én még nem magamat kell még.
Úgyhogy most megyek előre és típusa következő, és ha most írja print tmp,
mit kell látni?
Bármi legyen is az értéke volt, az az első érv, csak
mint x volt az első dolog, hogy telt el,
így a és x meg kell egyeznie, így nyomtatni tmp kell nyomtatni egyet.
>> Tehát mit fog látni a probléma meg három egy tutorial a fajta a GDB,
de észre, hogy ez a kezdete Egy pillantást egy eszköz, amely valóban
segít megoldani a problémákat így sokkal hatékonyabban.
Mi vagyunk végül fog tenni szerdán
A kezd húzza vissza egy pár réteg és távolítsa el néhány képzés kerekek.
Ez a dolog az úgynevezett karakterlánc, mi már használják egy ideje,
fogunk lassan elvenni meg, és elkezd beszélni
valami ezoterikus néven char *
de fogunk tenni ezt a szép és először csak enyhén, bár mutatók,
ahogy ők hívják, tehetünk néhány nagyon rossz dolog, ha visszaélnek,
nézi egy kis claymation a barátunk Nick Parlante Stanford
Egyetem professzora, számítógép tudósok, akik össze előnézet
A mi várható szerdán.
>> [Videolejátszás]
Hé, Muci.
Kelj fel.
Itt az ideje a mutató móka.
>> Mi az?
Tudjon meg többet a mutatók?
Oh, nagyszerű!
[END Videolejátszás]
SPEAKER 1: Hogy várja szerdán.
Majd akkor találkozunk.
[Videolejátszás]
-És Most, mély gondolatokat, által Daven Farnham.
>> Miért vagyunk tanulni C?
Miért nem A +?
>> [Nevetés]
>> [END Videolejátszás]