[Musiikki soi] SPEAKER 1: Okei, tämä on CS50, ja tämä on alku viikolla neljä, ja kuten olet ehkä kuullut tai lukea, maailma on päättymässä. Going ympäri internet on ollut tiedon ja tietoisuuden vikojen ohjelma, ohjelmointikieli nimeltään Bash. Tämä on ihanan merkkituotteiden kuten Shellshock, tai Bash oven, mutta artikkeleita, kuten nämä ei ole harvinaista. Ja itse asiassa monet heistä tuovat muistoja Heartbleed, jotka olet ehkä huomannut Paina takaisin viime keväänä, joka oli vastaavasti varsin dramaattinen. Nyt näistä teistä täällä tänään, kuinka moni teistä on, vaikka et ymmärrä mitä on kyse, kuullut Shellshock? Kunnossa, ja kuinka moni teistä joiden tietokoneet ovat haavoittuvia? OK, siellä pitäisi olla paljon, paljon enemmän käsiä juuri nyt, syistä näemme. Katsotaanpa katsomaan mitä jatkunut tiedotusvälineissä ja sitten selittää sitä vähän täällä meille teknisesti. SPEAKER 2: Tietoturva-asiantuntijat ovat varoitti, että vakava virhe saattaa noin vaikuttaa satoja miljoonat maailman web-käyttäjille. Sillä mikä on vika, joka on ollut puhuttu Shellshock, ja mitä se tekee? No, Shellshock tunnetaan myös Bash bugi, ohjelmisto se hyödyntää. Hakkerit käyttävät virus scan haavoittuvia järjestelmät Linuxia ja Unix käyttöjärjestelmiä ja sitten tartuttaa ne. Bash on komentotulkin. Tämän avulla käyttäjät komentoja käynnistää ohjelmia ja ominaisuuksia sisällä ohjelmisto kirjoittamalla tekstiä. Sitä käytetään tyypillisesti ohjelmoijat, ja ei pitäisi olla avoin muulle maailmalle, vaikka Shellshock muuttaa sitä. No, worringly, jotkut analyytikot Varoitan se voisi olla suurempi uhka, koska Shellshock mahdollistaa täydellisen määräysvallan tartunnan kone, katsoo Heartbleed sallittu vain hakkerit vakoilla tietokoneisiin. Se on niin vakava, se on mitoitettu 10 10 vaikeusasteen mukaan kansallinen Haavoittuvuus tietokanta. 2/3 kaikista web-palvelimet ovat riskejä, kuten jotkut Mac-tietokoneissa. No, varmista, että olet paikkaamalla järjestelmät nyt. Kuka tahansa hosting verkkosivuilla käynnissä vaikuttaa käyttöjärjestelmät tulisi toteuttaa toimia niin pian kuin mahdollista. Kuka tahansa voi varaa sen pitäisi näyttää niiden seurantaan ja verkkosovellusten palomuurit varoa mitään hyökkäyksiä. SPEAKER 3: Pahinta mitä voisi tapahtua on että joku olisi kirjoittaa koodia, joka automaattisesti mennä ja skannata Internet ja vaikuttaisi kaikki nämä tietokoneet. Ja kun he tekevät sen hyvin, Pahinta he voisivat tehdä on vain poistaa kaiken, tai sulkea sivustot alas. Jotta voisimme nähdä vahinko tästä näkökulmasta, jos meillä olisi ilkeä ihmisiä joka vain päättää aiheuttaa tuhoa saattamalla järjestelmät alas tai poistamalla tiedostoja, ja tuollaista. SPEAKER 2: Jotkut sanovat tämä on yksi kaikkein vaikea mitata bugeja vuotta, ja se voi kestää viikkoja tai jopa kuukauden määrittää sen lopullista vaikutusta. SPEAKER 1: Joten kaikki tämä on totta, mutta hauska juttu on, lähes kaikki ja kuvakieli juuri nähnyt, paitsi ehkä näppäimistö, ei ole mitään tekemistä sen kanssa, bug mitään. Palvelimet ja johdot ja niin edelleen, Se on tavallaan tangentiaalisesti toisiinsa, mutta ydin on oikeastaan ​​aika tuttu, mitä täällä tapahtuu. Itse haluaisin mennä meidän CS50 laite. Anna minun mennä eteenpäin ja maksimoida pääteikkunassa täällä. Ja te käyttänyt tätä, tai upotettu versio siitä, vuonna gedit voidakseen kirjoittaa ohjelmia, tyypin komentoja, ja niin edelleen, ja tämä on todella, ja on ollut viikkoja, Bash, B-A-S-H. Tämä on Bourne-Again Shell, joka on vain hieno tapa sanoa, Tämä on ohjelma, joka on vilkkuu nopea, tehokas, joka istuu siellä odottamassa panos sinulle. Ja se on käsky linja-liitäntä, jonka kautta te on käynnissä komentoja ja lopulta koota ja sitten käynnissä ohjelmia. Mutta Bash on myös ohjelmointi kieli seuraavassa mielessä. Tiedät, että on olemassa komennot kuten cd ja ls sekä clang ja muut, mutta voit määritellä omia komentoja toteuttamalla ne Bash. Nyt emme aio mennä hyvin yksityiskohtaisesti kuten bash ohjelmointikieli, mutta tietää esimerkiksi, että tällä hetkellä, ei ole mitään komentoa kutsutaan "hei." Niin se löytyy yksi näistä paketeista. Se ei ole asennettu tietokoneeseen. Kysy järjestelmänvalvojalta. Mutta jos haluan siellä olevan ohjelman nimeltään "hei" in Bash tai minun nopea, Voin itse käyttää syntaksia, joka on aivan kuten C. Se ei ole aivan sama, mutta se näyttää melko samanlainen toiminto, vaikkakin puuttuu joitakin yksityiskohtia. Mikään ei tunnu tapahtuvan, mutta nyt jos kirjoitan "hei" voit itse kirjoittaa ohjelma, ei C, ei Java, ei toisessa ohjelmointi kieli, mutta Bash itse. Nyt Tärkeintä tässä on, että kirjoitin name Halusin antaa tämän uuden käskyn, ja suluissa ovat myös symbolinen tämä on tehtävä. Sivuhuomautuksena, voit myös tehdä hauskaa asioita, ja itse asiassa jopa Mac OS, tämä on ohjelma nimeltä Terminal. Se tulee rakennettu kenenkään tietokone, jossa on Mac tässä huoneessa, ja voit tehdä samanlaisia ​​asioita Mac OS, mutta voit mennä enemmän pidemmälle. Ja tämä on hieman sivuavan, mutta se on aika hauskaa. Olin muistutti tänä aamuna, kun ajattelen tätä kautta, on pieni peli Käytin pelata yksi CS50 entinen TF: jolloin aina kun hän kävelisi pois hänen näppäimistö hänen näytön lukitus, Haluaisin suorittaa komennon kuten this-- "tervehtimään." Ja nyt aina kun hän tuli takaisin hänen näppäimistö, kun olen tyhjentänyt näyttö ja hän istui alas, yrittää tehdä töitä, luettelimiseksi hänen directory-- [ÄÄNITOISTOA] Haloo. Hei. SPEAKER 1: Niin, oikeudenmukaisuus, se ei oikeastaan ​​"hei." Se oli yleensä jotain lähempänä that-- [ÄÄNITOISTOA] -Beep. SPEAKER 1: --that I would-- joten hänen tietokone olisi vannon häntä aina kun hän itse istuutui hänen näppäimistö. Ja hyvin nopeasti hän tajunnut ei lähtemään näytön lukitus. Mutta tämä viittaa lajitella tyhmä hauskaa, että olet voi olla jotain kuten Bash. Mutta se on hieman enemmän vakava, olla varma, kuin että. Ja itse asiassa, tämä on yksi vaarallisin ja pitkäaikaisia ​​vikoja joka on todella osuma maailman maailmanlaajuisesti. Tämä vika on ollut noin noin 20 vuotta, ja sinun on löydettävä juuri hetki sen suhteellinen yksinkertaisuus. Joten tämä on edustava käske jos omistaa Mac, kirjaimellisesti juuri nyt kun sinulla on kansi auki, voit kokeilla kirjoittaa tuohon ohjelma nimeltä Terminal. Terminaali on alle Sovellukset Utilities-- kerrankin, Windows-käyttäjät eivät tarvitse huolestua erityisesti threat-- mutta ne teistä Macien voi kirjoittaa tämä tulee ikkuna kuten minä teen täällä, ja jos et kirjoita että tähän ohjelmaan nimeltään Terminal, kuten minä teen nyt, Jos näet sanan "haavoittuvia" tietokone on alttiita hyväksikäytölle. Nyt mitä se oikeastaan ​​tarkoittaa? Ja tämä on totta joitakin melko hullu syntaksin, mutta katsotaan ainakin vetää ulos joitakin mielenkiintoisia näkökohtia. Joten siellä on joitakin syntaksin, joka näyttää vähän tuttu, ainakin C ja ohjelmointi yleisemmin. Näen joitakin suluissa, puolipisteet aaltosulkeita, ja niin, mutta käy ilmi, että tämä tyhmä juttu täällä keltainen on ennen kaikkea osoitus että ei mitään. Paksusuolen keinot tehdä mitään, ja puolipiste tarkoittaa lakata tekemästä mitään. Joten sisälle näistä aaltosulkeita se, että minulla on yhtäläinen allekirjoittaa vasemmalle, tämä on lähinnä luoda komento, tai vaihteleva, nimeltään x, ja osoittaa se että keltainen vähän koodia siellä. Se voisi olla jotain "echo hei "tai" sano piip "tai jotain muistuttaa, että. Mutta huomaa, jos silmäsi vaeltaa edelleen oikealle, siellä on enemmän tätä linjaa kuin vain loppuun, että puolipiste. "Echo haavoittuvia", ja sitten pidemmälle vielä enemmän. Toinen puolipiste, bash -c :. Niin pitkän tarinan lyhyesti, tätä linjaa koodi on riittävä pakottavista tietokoneella, joka on alttiita tehdä jotain että haluat sen tehdä, koska siellä on bugi Bash jolloin vaikka Bash piti lopettaa lukeminen komentolinja oikeus siellä jälkeen keltaista tekstiä, ja 20-plus-vuotias bugi, Bash on itse asiassa ollut käsittelyssä pidemmälle puolipiste ja aika paljon tekee mitä se on kerrottu. Niin mitä vaikutuksia Kyseisen lopulta? Sanoin vain "echo Hello" tai "echo haavoittuvia" mutta mitä jos teit jotain todella ilkeä, kuten rm-rf *, joita ehkä ei koskaan kirjoitettu ennen, ja rehellisesti luultavasti ei tulisi liian pian, koska voit tehdä paljon vahinkoa sen kanssa. Miksi? rm tekee mitä, tietenkin? Poistaa. * Tarkoittaa mitä? Kaikki. Niin se on niin kutsuttu villi kortti, niin se tarkoittaa Poista kaikki hakemistossa. -r sattuu tarkoittaa rekursiivinen, mikä tarkoittaa, että jos mitä olet poistanut on hakemisto, ja sisällä on on muita tiedostoja ja muita hakemistoja, rekursiivisesti sukeltaa sinne ja poistaa kaikki tämä. Ja f on pahin kaikista. Kukaan tiedä, mitä f tarkoittaa täällä? Force. Niin väkisin keinoin, jopa jos tämä on huono idea, tehdä sen kysymättä minut edelleen vahvistusta. Joten, te tiedätte, me naura tämä, mutta suoraan sanottuna, en luultavasti kirjoitan tätä useita kertoja päivä, koska todellisuus on se nopein tapa poistaa koko joukko tavaraa. Mutta vaikka olen tehnyt jonkin verran vahinkoja. Mutta jos olit huijata tietokoneen huomioon määriteltäessä jokin tyhmä muuttuja tai toimintoa kutsutaan x, mutta sitten huijaaminen tietokoneen täytäntöönpanosta rajojen ulkopuolelle, että toiminto, kuin että puolipiste, voit todellakin huijata tietokoneen osaksi täytäntöönpanosta jotain rm-rf tai Sähköposti komento tai Kopioi-komennolla. Jotain kirjaimellisesti voit tehdä tietokone, onko se poistaa tiedostoja, luoda kuvaa, roskapostia joku, hyökkää jotkut palvelin etänä, jos voit ilmaista sen komennolla, voit voi huijata tietokoneen näin. Nyt mitä esimerkki miten voit tehdä tämän? No, siellä on paljon tietokoneita Internetissä käynnissä Bash. Kaikki meistä Mac-käyttäjät ovat joukossa. Monet Linux-palvelimet ovat myös ne, ja Unix-palvelimia. Windows taas saa suhteellisen pälkähästä paitsi jos olet asentanut erityisiä ohjelmistoja. Nyt paljon palvelimia varten Esimerkiksi ajaa web-palvelimia, ja itse asiassa Linux on ehkä Suosituin käyttöjärjestelmä ajaa tietokoneissa internetissä jotka palvelevat avata verkkosivuja. Nyt kun näemme myöhemmin lukukauden, kun voit lähettää pyynnön teidän browser-- Chrome, Internet Explorer, whatever-- etäpalvelimeen, käy ilmi, että vaikka kirjoittamasi www.example.com, selain lähettää viestin että on hieman vaikeaselkoinen, kuten tämä. Mutta huomaa jotain outoa. Ensimmäiset kaksi riviä En ole koskaan ennen nähnyt, mutta ne eivät näytä erityisen uhkaava. Mutta huomaa, mitä olen varastanut Kolmannen rivin täällä. Jos pahis oli lähettää viesti tämän kaltaista hänen tietokoneensa heikkouden Mac tai haavoittuva Linux-palvelin, Hassua on että Bash, että yksinkertainen pikku komentoriville on läsnä kaikkialla ja on usein tottuneempia olennaisesti toteuttaa sisällön viestin, että se vastaanottaa. Ja että logiikka, voit huijata web-palvelin, siis, lähettämällä jotain User-agent, joka yleensä on tarkoitus sanoa nimi selaimen. User-agent Chrome, User-Agent Internet Explorer User-Agent Firefox, tämä on vain selaimen tapa tunnistaa itsensä. Mutta jos pahis hyvin taitavasti sanoo, mm-mm, olen aio kertoa teille mitä minun selain on, Minä sen sijaan aion lähettää sinulle tämän arvoituksellinen näköinen juttu rm-rf * Se, voit kirjaimellisesti huijata haavoittuva web-palvelin Internetissä osaksi täytäntöönpanovaltion tarkalleen, että siellä poistamalla kaikki tiedostot. Ja suoraan sanottuna, se ei ole edes pahin asia. Voit tehdä mitä tahansa. Voisit aloittaa jaettu palvelunestohyökkäyksen hyökkäys jos olet lähettänyt tämän viestin koko risuryppäät web-palvelimia ja sitten oli ne kaikki laskeutua, sillä Esimerkiksi, on Harvard.edu palvelimet, ja voit lajitella Bang pahus ulos niistä jonka verkkoliikennettä, joka oli muuten laukaisi tämä pahis. Niin, pitkä tarina lyhyt, melkein jokainen tässä huoneessa, joka omistaa Mac on altis tämän. Hopeareunus on, että ellet käynnissä web-palvelin kannettavan tietokoneen, ja jos olet itse määrittänyt se antaa jotain SSH siihen, olet itse turvassa. Se on herkkä, mutta ei ole yksi yrittää päästä kannettavan tietokoneen, niin voit tavallaan varma. Apple kuitenkin pian olla päivittää korjaus tähän. Linux-maailmassa on jo julkaissut useita korjauksia Fedora ja Ubuntu ja muita Linux-versioita ja jopa jos suoritat päivityksen 50 laitteeseen, vaikka sekin on päivitetään ja korjataan. Mutta sekin ei ole todella ollut haavoittuva, sillä jos olet tinkered laitteen kanssa ja teki kannettavan tietokoneen julkisesti saatavilla Internetissä, joka ei ole oletuksena, olet oikeastaan ​​ollut hieno, koska sekä palomuuri ja muita tekniikoita. Mutta se on äärimmäinen esimerkki bug että olemme eläneet kirjaimellisesti 20 vuotta, ja kuka tietää, jos joku Koko tämän ajan on tiennyt siitä? Ja itse asiassa, tämä on yksi keskeisistä haasteista että näemme myöhemmin lukukausi turvallisuudesta, on, että aivan kuten oikeassakin maailmassa, hyviä tyyppejä ovat haitta. Pitää roistoja pois, meidän on Varmista, että jokainen ovi on lukittu, että jokainen ikkuna on turvallista, että jokainen piste tullessa kotiin on turvallista pitää roistoja ulos. Mutta mitä pahis on tehdä todella vaarantaa kotiisi ja varastaa sinulta? Hän vain on löytää yksi lukitsematon ovi, yksi rikkoutuneen ikkunan, tai jotain tämänsuuntaista, ja se on Sama tietoturva. Voimme kirjoittaa miljoonia ohjelmakoodirivin ja viettää satoja tai tuhansia tunteja yrittää saada se oikea, mutta jos teet vain yhden virhe oikeellisuutta, voit laittaa koko järjestelmän ja todellakin tässä tapauksessa koko internetin ja maailma vaarassa. Joten jos haluat lisätietoja tästä, siirry osoitteeseen täällä. Ei ole tarvetta toimenpiteisiin tänä iltana ellet joukossa mukavampaa, että on käynnissä oma web palvelimelle, jolloin sinun pitäisi, itse asiassa päivittää ohjelmiston. Myös tämä otsikko puheen, ja nyt paperi, että olemme yhteydessä toisiinsa Kurssin verkkosivuilla tänään. Se oli mies nimeltään Ken Thompson, joka on hyväksyä hyvin kuuluisa palkinto tietotekniikassa, ja hän antoi tälle puheen joitakin vuosia sitten, lähinnä tästä samasta aiheesta. Kysyy ihmiset kysymys, sinun pitäisi todella luottamus, lopulta, ohjelmisto olet saanut? Esimerkiksi meillä kaikilla on kirjoittanut ohjelmia, ja olemme laatineet ne Clang. Ja tietosi, olet kirjoittanut kaikki ohjelmat CS50 missä on takaoven tapaisena, on olemassa tapa että pahis, jos suorittaa ohjelma, voisi ottaa tietokoneesi haltuunsa? Todennäköisesti ei, eikö? Mario, ja ahne, ja Credit. Nämä kaikki ovat melko pieniä ohjelmia. Sinun täytyy olla melko huono jos todella tehty koko tietokoneen haavoittuvia kirjoittamisen jälkeen 10 tai 20 riviä koodia, tai ainakin tietämätön joidenkin turvallisuusvaikutuksista. Nyt sanon, että facetiously, mutta aiomme nähdä tänään ja tällä viikolla se on oikeastaan todella, todella helppoa olla huono ja tehdä jopa lyhytohjelmia haavoittuvia. Mutta nyt ainakin ymmärtää että kysymys onkin täällä on noin kalahtaa ja kääntäjä. Miksi olemme luottanut kalahtaa viimeiset kaksi tai kolme viikkoa? Kuka sanoo, että kuka kirjoitti kalahtaa ei ole "jos" ehto on että pohjimmiltaan pistetään jotkut nollat ja niitä jokaiseen ohjelmaan se kokoaa että antaisi hänelle pääsy tietokoneesi, kun olet unessa ja kannettavan tietokoneen kansi on auki ja tietokone on käynnissä? Oikea? Meillä on tällainen kunnia järjestelmän oikea Nyt jos luotamme siihen, että kalahtaa on legit. Luotat että laite on legit. Luotat että kirjaimellisesti jokainen ohjelma Macin tai PC on luotettava. Ja koska tämä yksinkertainen bugi ehdottaa, vaikka se ei ole ilkeä, se ehdottomasti ei todennäköisesti kyse. Joten kannattaa olla peloissaan kuin helvetti. Rehellisesti, ei ole yksinkertaista Ratkaisu tähän muille kuin eräänlainen yhteiskunnallisen tietoisuuden lisääntyvän monimutkaisuuden että olemme rakentamassa päälle meidän tietokonejärjestelmiä, ja miten yhä haavoittuvampia saatamme hyvinkin olla. Nyt, että sanoi, Breakout. Joten Breakout on ongelma asetettu kolme, ja Breakout on peli menneiden että saatat muistaa, mutta meille ongelma asettaa kolme, se antaa meille mahdollisuuden ottaa asiat varmuuskopioida lovi niin että kun me kirjoitamme ohjelmia, jopa pääteikkunasta näin, Voimme todella ajaa lopulta graafisia ohjelmia ei toisin kuin meillä oli pääsy Scratch. Joten tämä on henkilöstön täytäntöönpano Breakout, joka on juuri tämä tiili-breaking peli, että siirrät meloa takaisin edestakaisin, ja lyöt niitä vastaan ​​värillinen tiilet alkuun asti. Joten tämä tuo meille tavallaan takaisin, jos pystyimme hyvin nopeasti Scratch, ja nyt C, täytäntöön omia graafisia käyttöliittymiä. Mutta enemmän kuin, että tämä Harjoitus on ensimmäinen jossa annamme sinulle kasan koodia. Ja itse asiassa, minä tuon nimenomaisen huomiota tähän, koska etenkin niille vähemmän mukava, tämä Harjoitus, ainakin ensi silmäyksellä, tulee tuntea olemme ottaneet sitä lovi. Koska me olemme antaneet teille, joidenkin haku ja lajittelun ongelmia PSET, nippu koodin että kirjoitimme, ja pari kommenttia jotka sanovat "tehdä" jossa sinun täytyy täyttää tyhjät kohdat. Joten ei liian pelottava, mutta se on ensimmäinen kerta olemme jakamassa sinulle koodin että sinun täytyy ensin lukea, ymmärtää, ja lisätään sitten ja täydentää sitä. Ja sitten Breakout, aiomme tehdä samoin, antaa sinulle muutamia kymmeniä enemmän rivejä koodia, joka suoraan sanoen, antaa sinulle paljon puitteiden peli mutta pysähdy täytäntöönpanon tiilet ja pallo ja mela, mutta me toteuttaa joitakin muita ominaisuuksia. Ja sekin ensi silmäyksellä, jälleen, varsinkin jos vähemmän mukavaksi, voi tuntua erityisen pelottava ja luulet on niin monia uusia toimintoja haluat kääri mieltäsi ympärillä, ja se on totta. Mutta pitää muistaa, se on aivan kuten Scratch. Kertoimet ovat et käyttänyt kaikkia palapelin palat Scratch. Kertoimet ovat sinua ei välittänyt kääri mielesi ympärille ne kaikki koska kaikki kesti oli nopealla silmäyksellä ymmärtää, oh, se mitä voin tehdä kanssa, että palapelin pala. Ja todellakin, ongelma-set 3 spec, me kohta sinua klo ohjeista tulee esitellä sinulle joitakin uusia toimintoja, ja lopulta ohjelmointi rakentaa käytät. Ehtoja, silmukoita, muuttujia ja funktioita on oltava sama kuin mitä olemme nähneet tähän mennessä. Joten todellakin, mitä me annamme sinulla on joitakin mallikoodia voit luoda ikkuna että näyttää ole toisin tätä, ja lopulta muuttaa sen jotain aivan kuten tämä. Niin hyödyntää CS50, keskustella virka ja enemmän, ja lohduttaa se, että määrä koodia sinun tulee kirjoittaa ei oikeastaan ​​ole kovin paljon. Ensimmäinen haaste on vain sopeutua itse koodia olemme kirjoitettu. Kysyttävää pset3, Shellshock, tai muuten? Yleisö: Tuntui menee läpi Breakout että koodi on lähes olio-tyyliin, mutta ajattelin C oli olio-ohjelma. SPEAKER 1: erinomainen kysymys. Joten silmäilyn jakelu-koodi, koodi me kirjoitti pset3, niille tuttu, se näyttää se pikku olio. Lyhyt vastaus on, se on. Se lähentää miten voisi tehdä olio-koodin kieltä kuten C, mutta se on silti lopulta menettelyyn. Ei ole olemassa menetelmiä sisällä muuttujat, kuten näet. Mutta se muistuttaa, että. Ja näemme, että ominaisuus taas uusista PHP ja JavaScript loppua kohti lukukauden. Mutta nyt, ajattele sitä aavistus mitä on tulossa. Hyvä kysymys. Kunnossa. Joten merge sort oli miten me vasen asioita viime kerralla. Ja yhdistää tavallaan oli viileä siinä mielessä, että se oli niin paljon nopeammin, ainakin perustuu pintapuolisen testit teimme viime viikolla, kuin vaikkapa kupla lajitella, valinta lajitella, lisäyslajittelun. Ja mikä oli siisti sekin on vain miten ytimekkäästi ja siististi voit ilmaista se. Ja mitä sanomme se oli ylempi sidottu ajoaika yhdistämisen lajitella? Joo? Yleisö: n log n? SPEAKER 1: n log n, oikea. n log n. Ja tulemme takaisin, mitä se todella tarkoittaa tai jos se on peräisin, mutta tämä oli parempi kuin mitä käyntiaika että näimme kupla valinta ja lisäyslajittelun? Joten n potenssiin. n potenssiin on tätä suurempi, ja vaikka se ei ole aivan selvää, tietää, että log n on pienempi kuin n, joten jos et n kertaa jotain pienempää kuin n, se tulee olemaan pienempi kuin n potenssiin. Se on vähän intuition siellä. Mutta maksoimme hinnan tästä. Se oli nopeampi, mutta teema, joka alkoi ilmaantua viime viikolla oli tämä kompromissi. Sain paremman suorituskyvyn aika viisas, mutta mitä minä viettää toisaalta käsi, jotta saavuttamiseksi? Yleisö: Muisti. SPEAKER 1: Sano uudestaan? Yleisö: Muisti. SPEAKER 1: Muisti, tai tilaa yleisemmin. Ja se ei ollut erittäin ilmeinen meidän ihmisten, mutta muistuttaa, että meidän vapaaehtoisille astuivat esiin ja tehostamalla takaisin ikään kuin siellä array täällä, ja ikään kuin siellä toinen joukko tässä, että he voisivat käyttää, koska me kaivattua jonnekin yhdistää ne ihmiset. Emme voineet vain vaihtaa ne paikoilleen. Joten yhdistää eräänlainen vipuvaikutus on enemmän tilaa, joka emme tarvinneet kanssa muut algoritmit, mutta puoli on, että se on paljon nopeampi. Ja suoraan sanottuna, todellisessa maailmassa tilaa Näiden days-- RAM-muistia, kiintolevyn space-- on suhteellisen halpaa, ja niin se on ei välttämättä huono asia. Joten vilkaista, hieman enemmän suunnitelmallisesti, mitä teimme ja miksi me sanoimme sitä n log n. Joten tässä on kahdeksan numeroa ja kahdeksan vapaaehtoisia meillä oli viime kerralla. Ja ensimmäinen asia, että Merge Järjestä kertoi meille tehdä, oli mikä? Yleisö: Jaetaan se kahteen. SPEAKER 1: Sano uudestaan? Yleisö: Jaetaan se kahteen. SPEAKER 1: Jaetaan se kahteen, oikeassa. Tämä on hyvin mieleen puhelinluettelo, hajoita ja valloittaa yleisemmin. Joten me katsoimme vasen puoli. Ja sitten kun sanoimme, lajitella vasen puoli elementtejä, mitäs me seuraavaksi sanoa? Lajitella vasen puoli vasemmalle puoli, joka antoi meille mahdollisuuden, jälkeen jakamalla kahdella, keskitytään neljään ja kaksi. Miten lajitella listan nyt, keltainen, koosta kaksi käyttäen Merge Sort? No jaa se kahtia, ja lajitella vasen puoli. Ja tämä oli, kun asiat sai vähän tyhmä lyhyesti. Miten lajitella luettelon, joka on annettu koko yksi, kuten tämä numero neljä täällä? Se on järjestetty. Olet valmis. Mutta miten lajitella luettelon Koko Yksi kun on numero kaksi? No, sama juttu, mutta nyt mitä oli Kolmas ja tärkeä askel Merge Järjestä? Sinun piti yhdistää vasemman puoli ja oikea puoli. Ja kun me teimme, että me katsoimme neljä, me katsoimme kaksi. Päätimme kunnossa, ilmeisesti kaksi tulee ensin, joten laitoimme kaksi sen paikka, seuraa neljä. Ja nyt sinulla on sellainen taaksepäin, ja tämä on tavallaan ominaisuus algoritmin kuin sulautua Lajittele, taaksepäin muistiin. Mikä oli seuraavan rivin tarina? Mitä minun pitäisi keskitytään seuraavaksi? Oikea puoli on vasemmalle puoli, joka on kuusi ja kahdeksan. Joten haluan vain selata tätä ilman belaboring pisteen liikaa. Kuudesta kahdeksaan, sitten kuusi on lajitellaan, kahdeksan lajitellaan. Yhdistää ne yhteen niin, ja nyt seuraava iso askel on tietenkin järjestää oikea puoli ensimmäinen askel tämän algoritmin. Joten keskitymme yksi, kolme, seitsemän, viisi. Me sitten keskittyä vasen puoli. Vasen puoli, että oikea puoli että, ja sitten yhdistää yksi ja kolme. Sitten oikea puoli ja sitten vasen puoli se, ja sitten oikeaa puolet. Yhdistää se, ja mitä nyt askel jää? Yhdistä iso vasen puoli ja iso oikea puoli, joten mennään sinne, sitten kaksi, sitten kolme, sitten neljä, sitten viisi, sitten kuusi, sitten seitsemän, sitten kahdeksan. Joten nyt miksi tämä lopulta paljastaa, varsinkin jos n ja logaritmit lisää yleensä melko paeta sinua, ainakin miesmuistiin? No, huomaa korkeus tämä asia. Meillä oli kahdeksan elementtejä, ja me jaettuna sen kaksi, kaksi, kaksi. Joten log base kaksi kahdeksan antaa meille kolme. Ja luottaa minuun, että jos hieman utuinen siitä. Mutta logaritmi kaksi kahdeksan on kolme, joten olemme tehneet kolme kerrosta yhdistämistä. Ja kun yhdistimme elementit, kuinka monta elementtiä ei katsomme kullekin näistä riviä? Yhteensä n, eikö? Koska yhdistää ylärivi, vaikka teimme sen hajanainen, me lopulta kosketti jokaista numero kerran. Ja toisessa rivissä, ja yhdistää nämä luettelot kokoa kaksi, meidän täytyi koskettaa jokaisen elementin kerran. Ja sitten täällä todella selvästi viimeisellä rivillä, meidän piti koskettaa jokainen näistä elementit kerran, mutta vain kerran, niin tässä piilee siis meidän n log n. Ja nyt vain tehdä asioita hieman virallisempi vain hetken, jos oli nyt analysoida klo eräänlainen korkeamman tason ja yrittää päättää, hyvin, kuinka voisi mennä noin ilmentävät käyntiaika tämän algoritmin vain katsomalla sitä ja ei käyttämällä keinotekoinen esimerkki? No, kuinka paljon aikaa sanoisit askel näin keltaisella veisi, jos n <2 paluun? Se on iso O mitä? Joten näen yksi, niin yksi askel, ehkä kaksi askelta, koska se on, jos ja palata sitten, mutta se on vakioaikaisia, eikö? Joten sanoimme O (1), ja se on miten minä ilmaista tätä. T, vain olla käyntiaika. n on koko syöttö, joten T (n), vain hieno tapa sanoa käynnissä aika annetaan panos koko n tulee olemaan suuruusluokkaa jatkuvasti ajan O (1). Mutta muuten, entä tämä? Miten ilmaista käyntiaika tämän keltainen viiva? T mitä? Voit eräänlainen huijata täällä vastata kysymykseeni syklisesti. Joten jos käyntiajan yleinen me vain sanoa, T (n). Ja nyt olet sellainen punting täällä sanoi hyvin, vain eräänlainen vasen puoli, ja sitten lajitella oikea puoli. Kuinka me saatamme vertauskuvallisesti käyntiaika tämän keltainen viiva? T mitä? Mikä on koko panos? n yli kaksi. Miksi en vain sanoa, että? Ja sitten tämä on toinen T (n / 2) ja sitten uudelleen, jos olen yhdistää kaksi lajiteltua puolikkaat, kuinka monta elementtiä olen menossa on koskettaa yhteensä? n. Joten en voi ilmaista tämän, vain olla sellainen fancy, koska käyntiaika yleensä. T (n) on vain ajoaika T (n / 2), plus T (n / 2), vasen puoli ja oikea puoli, plus O (n), joka on luultavasti n vaiheita, mutta ehkä, jos käytän kahta sormea, se on kaksi kertaa niin paljon vaiheita, mutta se on lineaarinen. On joitakin useita vaiheita se kertoimella n, joten saatamme ilmaista tämä tässä. Ja tämä on, jos nyt me punt on takaisin meidän lukion matematiikan oppikirja olemme että toistuminen lopulta päätyy vastaten tämän, n kertaa log n, jos itse tehdä ulos matematiikka virallisemmin. Niin, että vain kahdesta näkökulmasta. Yksi numeerisesti kovakoodatuilla edustava esimerkki käyttäen kahdeksan numeroa, ja lisää tarkastellaan yleisesti, miten menimme sinne. Mutta mikä on todella mielenkiintoista täällä on, jälleen, tämä käsite pyöräily. En käytä silmukoita. Olen tavallaan määritellään jotain suhteen itse, ei vain tämän Matemaattinen funktio, vaan myös tämän pseudo-koodin. Tämä pseudo-koodi on rekursiivinen siitä, että kaksi sen linjat lähinnä kertoo sen mennä käyttävät itse ratkaista pienempi Ongelmana on pieni koko, ja sitten uudestaan ​​ja uudestaan ja uudelleen, kunnes me vuolla se alas tämä ns pohja tapaus. Joten oikeastaan ​​tehdä enemmän pakottavia take-away tästä seuraavasti. Anna minun mennä gedit ja ottaa tarkastelemme joitakin nykypäivän lähdekoodin, erityisesti tässä esimerkissä täällä. Sigma 0, joka ilmeisesti lisää ykkösestä n. Katsotaanpa mitä tuttu ja tuntemattomia täällä. Ensin on pari sisältää, joten mitään uutta siellä. Prototyyppi. Olen hieman utuinen päälle Tämän jälkeen muutaman päivän, mutta mitä sanomme prototyyppi toiminto on? Yleisö: [kuulumaton]. SPEAKER 1: Mikä tämä on? Yleisö: Me julistaa sen. SPEAKER 1: Me julistaa sen. Joten opetat kalahtaa, hei, ei oikeastaan ​​täytäntöönpanossa vielä, mutta jossain tämän tiedoston, oletettavasti, aiotaan toiminto nimeltään mitä? Sigma. Ja tämä on vain lupaus, että se tulee näyttämään tältä. Se tulee ottaa kokonaisluvun input-- ja voin olla selvemmin ja sanoa int n --and se aio palata int, mutta puolipiste keinoin, mm, saan noin toteuttaa näitä vähän myöhemmin. Jälleen kalahtaa on tyhmä. Se vain menee tietää, mitä kerrot sen ylhäältä alas, joten meidän täytyy ainakin antaa se vihje mitä on tulossa. Nyt katsokaamme tärkein täällä. Katsotaanpa selaa täällä mitä tärkein tekee. Se ei ole pitkä funktion, ja itse asiassa konstrukti tässä tuttu. Julistan muuttuja n, ja sitten Olen kiusata käyttäjän uudelleen ja uudelleen ja positiivinen kokonaisluku käyttäen getInt, ja vain lähteneet tämän silmukan kun käyttäjä on täyttänyt. Do Vaikka olemme käytetään kiusata käyttäjä tällä tavalla. Nyt tämä on mielenkiintoista. Julistan int nimeltään "vastaus." Määritän sen paluuarvo on toiminto nimeltään "sigma." En tiedä, mitä se tekee vielä, mutta Muistan julistaa hetki sitten. Ja sitten olen ohimennen Arvo, joka on kirjoitettu, n, ja sitten voin ilmoittaa vastauksen. No katsotaanpa siirry takaisin vain hetken. Mennään eteenpäin tähän hakemistoon, tee sigma 0, ja todella ajaa tätä ohjelmaa ja katso mitä tapahtuu. Joten jos menen eteenpäin ja nousun Tässä ohjelmassa ./sigma-0, ja minä kirjoita positiivinen kokonaisluku kuin kaksi, Sigma, kuten Kreikan symboli kertoo, on vain menossa yhteen kaikki numerot nolla jopa kaksi. Joten 0 plus 1 plus 2. Joten tämän pitäisi toivottavasti antaa minulle 3. Sitä se tekee. Ja samoin, jos en suorita tätä uudelleen ja annan sen numero kolme, Se on 3 plus 2, niin se on 5 plus 1 pitäisi antaa minulle 6. Ja sitten jos saan todella hullu ja alkaa kirjoittaa isompi määrä, se pitäisi antaa minulle isompia ja isompia summia. Niin siinä kaikki. Joten mitä sigma näyttää? No, se on melko yksinkertainen. Se, miten voisimme ovat panneet Tässä viimeiset pari viikkoa. "Int" tulee olemaan palautuva. Sigma on nimi, ja se kestää muuttuja m sijasta n. Muutan että alkuun asti. Sitten tämä on vain järki tarkistaa. Näemme miksi hetki. Nyt julistan toisen muuttujan, summa, alustaa se nollaan. Sitten on tämä silmukka iteroidessaan, ilmeisesti selvyyden vuoksi, i: = 1 jopa = m, mikä on mitä käyttäjä kirjoitettu, ja sitten minä kasvattaa summaa näin. Ja sitten palata summa. Joten pari kysymystä. Yksi, väitän minun kommentti, että tämä vältetään riski päättymättömään silmukkaan. Miksi ohimennen negatiivinen luku aiheuttaa, mahdollisesti ääretön silmukka? Yleisö: Et koskaan pääse metriä. SPEAKER 1: Älä koskaan m. Mutta m johdetaan vuonna, joten katsotaanpa harkita yksinkertainen esimerkki. Jos m on hyväksyttiin mukaan käyttäjälle kielteinen. Riippumatta tärkein. Tärkein suojelee meitä tämäkin, joten olen vain on todella anaali sigma myös varmistaa että tulo ei voi olla negatiivinen. Joten jos m on negatiivinen, jotain kielteistä. Mitä nyt tapahtuu? No, minulla on menossa saada alustetaan yhteen, ja sitten tulee olemaan pienempi kuin tai yhtä suuri kuin m? Valmiustila. Että oli-- älkäämme, Katsotaanpa nix tämän tarinan. En kysynyt tätä kysymystä, koska vaara, että olen viittasi ei tule tapahtumaan, koska minulla on aina menossa olla suurempi than-- OK, En aja tätä kysymystä. OK. Keskitytään vain tähän osaan tästä. Miksi Julistan joitakin ulkopuolella silmukan? Huomautus linjalla 49 olen ilmoitettu i lenkin sisältä, mutta verkossa 48 olen julisti joitakin ulkopuolella. Joo. Yleisö: [kuulumaton]. SPEAKER 1: Toki. Joten ensinnäkin En todellakaan halua julistaa ja alustaa summa nollaan sisällä silmukka jokaisen iteraation, koska tämä olisi selvästi voittaa tarkoituksena tiivisti numeroita. Haluan pitää muuttaa arvon takaisin nollaan. Ja myös, mitä toinen enemmän mystistä Syynä tähän samaa mallia päätös? Joo. Yleisö: [kuulumaton]. SPEAKER 1: Aivan. Haluan käyttää sitä ulkopuolella silmukan liian mitä linjaa? 53. Ja perustuu meidän nyrkkisääntö Paria luentoja sitten, muuttujia scoped, todella, että aaltosulkeita jotka kattavat ne. Joten jos en julistaa summa sisällä Näiden ulko aaltosulkeita, En voi käyttää sitä linjaa 53. Toisin sanoen, jos olisin julistanut summa täällä, tai jopa Silmukka, en voinut käyttää sitä 53. Muuttuja olisi käytännössä mennyt. Joten pari syytä siellä. Mutta nyt mennään takaisin ja katso mitä tapahtuu. Niin sigma saa kutsutaan. Se lisää jopa 1 plus 2 tai 1 ja 2 plus 3, ja sitten palauttaa arvon, tallentaa sen vastauksen, ja printf täällä Siksi näen ruudulla. Joten tämä on mitä me kutsumme iteratiivinen lähestymistapa, jossa iteraatio vain tarkoittaa, että käytetään silmukka. For-silmukan, kun silmukka, Do Vaikka silmukka, juuri tekemässä jotain taas ja uudestaan ​​ja uudestaan. Mutta sigma on tavallaan siisti toiminto että voisin toteuttaa sen eri tavalla. Entä tämä, joka vain olla sellainen viileä, haluaisin todella päästä eroon Erän häiriötekijä sillä tämä toiminto on oikeastaan ​​aika yksinkertainen. Katsotaanpa vuolla se alas vain sen neljän keskeisen linjat ja päästä eroon kaikista kommentit ja aaltosulkeita. Tämä on tavallaan häkellyttävä Vaihtoehtoinen toteutus. Okei, ehkä ei häkellyttävä, mutta se on aika seksikkäämpää, okei, katsomaan tätä niin paljon enemmän ytimekkäästi. Vain neljä riviä koodia, Haluan ensin on tämä järki tarkistaa. Jos m on pienempi tai yhtä suuri kuin nolla, sigma ei ole mitään järkeä. Se vain pitäisi olla Tällöin positiivisten lukujen, joten olen juuri menossa palata nolla mielivaltaisesti niin että meillä on ainakin jotkut ns pohja tapaus. Mutta tässä on kauneutta. Kokonaisuudessaan tämän ajatuksen lisäämällä numerot 1: stä n tai m tässä tapauksessa voidaan tehdä sellainen vastuun siirtäminen. No, mikä on summa 1 m? No, tiedätkö mitä? Se on sama kuin summa m plus summa 1 m miinus 1. No arvaa mitä? Mikä sigma m miinus 1? No, jos sellainen seurata tätä loogisesti, se on sama kuin m miinus 1 plus sigma m miinus 2. Voit siis tavallaan vain-- tämä on kuin, jos olet vain yrittää ärsyttää kaverille ja he kysyvät sinulta kysymyksen, olet tavallaan vastata kysymykseen, voit sellaista pitää vastuun siirtäminen. Mutta mitä tärkeintä on, että jos pidät jolloin kysymys pienempiä ja pienempiä, olet ei pyydä mitä sigma N, mitä sigma of n, mitä sigma n: n? Kysyt mitä sigma N, mitä sigma n: miinus 1, mitä sigma n: miinus 2? Lopulta kysymyksesi on tulossa mitä? Mikä on sigma yhden tai nolla, joitakin hyvin pieniä arvo, ja heti kun saada, että ystäväsi, et aio kysyä sama kysymys uudelleen, olet juuri menossa sanoa, oi se on nolla. Olemme pelanneet tämmöinen tyhmä syklinen peli. Joten rekursio on toimittava ohjelmointia funktion kutsuu itseään. Tämä ohjelma, kun kootaan ja ajaa, on menossa käyttäytyvät täsmälleen samalla tavalla, mutta mikä tärkeintä on, että sisällä funktion kutsutaan sigma, on rivi koodia jossa olemme kutsua itseämme, jotka yleensä huono. Esimerkiksi mitä jos en ensin koonnut tätä, joten sigma-- Merkki sigma 1 ./sigma-1. Positiivinen kokonaisluku, kiitos, 50 1275. Joten mikä toiminto näyttää olla, joka perustuu yksi testi, oikea. Mutta mitä jos saan vähän vaarallinen ja poistaa ns base tapauksessa ja vain sanoa, hyvin olen juuri tekemässä Tämän monimutkaisempi kuin se on. Toivotaan vain laskea sigma ottamalla m ja lisäämällä sitten sigma m miinus yksi? No, mitä tulee tapahtumaan täällä? Katsotaanpa loitontaa. Katsotaanpa käännöksen jälkeen ohjelmassa, tallenna se, käännöksen jälkeen ohjelma, ja sitten valmis ./sigma-1 zoomaus, Syötä positiivinen kokonaisluku kiitos, 50. Kuinka moni teistä on valmis ja ruikuttaa näkemään sen? OK. Joten tämä voi tapahtua useista eri syistä, ja suoraan sanottuna tällä viikolla olemme aikeissa antaa sinulle enemmän niistä. Mutta tässä tapauksessa, kokeile järkeillä taaksepäin mitä olisi voinut tapahtua täällä? Segmentointi vika, sanoimme viime aika, viittaa segmentin muistia. Jotain pahaa on tapahtunut. Mutta mikä oli se mekaanisesti että meni pieleen täällä, koska minun poisto ja että niin sanotut pohja tapauksessa, jos Palasin kovakoodatuilla arvo? Mitä mieltä olet meni pieleen? Joo. Yleisö: [kuulumaton]. SPEAKER 1: Ah. Hyvä kysymys. Joten koko numeron että olin yhteen asti tuli niin iso, että se ylitti koko muistia. Hyvä idea, mutta ei pohjimmiltaan menossa aiheuttaa kaatumisen. Jotka saattavat aiheuttaa kokonaisluvun ylivuoto, jossa bitit vain käännä ja sitten me erehtyä todella iso numero kuin negatiivinen luku, mutta joka itse ei aiheuta kaatua. Koska lopussa päivä int on edelleen 32 bittiä. Et aio vahingossa varastaa 33. vähän. Mutta hyvä ajatus. Joo. Yleisö: [kuulumaton]. SPEAKER 1: menetelmä koskaan pysähtyy, ja se todellakin kutsuu itseään uudelleen ja uudestaan ​​ja uudestaan ​​ja uudestaan ja jälleen, eikä yksikään kyseisiä toimintoja koskaan loppuun, koska niiden ainoa linja koodi kutsuu itsensä uudestaan ​​ja uudestaan ja uudelleen. Ja mitä todella täällä tapahtuu, ja nyt me voi sellaista tehdä tämän kuvallisesti. Anna minun mennä yli kuva vain hetken. Tämä on kuva, joka lopulta konkretisoivat tarkemmin, mitä on tekeillä sisällä tietokoneen muistiin. Ja käy ilmi, että pohjassa tätä kuvaa on jotain kutsutaan pino. Tämä on kimpale muisti, kimpale RAM, joka on juuri käyttänyt aikaa funktiota kutsutaan. Aina kun, ohjelmoija, soittaa toiminto, käyttöjärjestelmä, kuten Mac OS, Windows, tai Linux, nappaa joukko tavuja, ehkä Muutaman kilotavua, ehkä muutamia megatavuja muistia, antaa niitä teille, ja sitten antaa voit ajaa toiminnon avulla mitä muuttujia tarvitset. Ja jos sitten soittaa toiseen funktio ja toisen toiminnon, saat toisen siivu muistia ja toinen siivu muistia. Ja todellakin, jos nämä vihreä tarjottimet alkaen Annenberg edustavat että muisti, tässä mitä tapahtuu ensimmäisenä kun soitat toiminto sigma. Se on kuin laittaisi tarjotin näin mitä on aluksi tyhjä pino. Mutta sitten jos lokero kutsuu itseään, niin sanoakseni, soittaa toiseen esimerkiksi sigma, joka on kuin kysyisi käyttöjärjestelmä, ooh, tarvitsevat hieman enemmän muistia, Anna se minulle. Ja sitten se saa kasataan päälle. Mutta mitä Tärkeintä tässä on, että ensimmäinen yksikkö on yhä olemassa, koska hän vetosi tähän toiseen lokeroon. Nyt puolestaan ​​sigma soittaa sigma, Se on kuin kysyisi lisää muistia. Saa kasattu tänne. sigma soittaa sigma, joka on toinen lokero, joka saa kasataan täällä. Ja jos pitää tehdä tätä, lopulta, eräänlainen kartta Visuaalisen kyseistä karttaa, mitä tulee tapahtua pino tarjottimia? Se tulee ylittää muistia tietokoneessa on. Ja heti kun tämä vihreä tarjotin ylittää vaakasuora viiva Edellä pino ja yläpuolella sana kasaan, josta tulemme takaisin tulevaisuudessa, että on huono asia. Pino on erilainen segmentti muistia, ja jos annat nämä tarjottimet paalun ja kasa, aiot ylittää oma segmentti muistia, ja ohjelma on todellakin menossa kaatua. Nyt syrjään, tämä ajatus ja rekursio, näin ollen, voi selvästi aiheuttaa ongelmia, mutta se ei ole välttämättä huono asia. Koska harkita, kun kaikki, how-- ja ehkä tämä vie hieman totuttelua to --how tyylikäs tai kuinka yksinkertainen että täytäntöönpano sigma oli. Ja emme aio käyttää rekursio kaikki, että paljon CS50, mutta CS51, ja oikeastaan ​​missään luokassa jossa voit muokata tietorakenteita kuten puita tai perhe puita, että on joitakin hierarkia, se on super, super hyödyllinen. Nyt, kuten syrjään, jotta voit kuten pyrkivä tietotekniikan tutkijoita perehtynyt joitakin Googlen sisällä vitsejä, jos menet Google ja voit etsiä mitä on määrittely, vaikkapa rekursio, kirjoita. Uh-huh. Sivuhuomautuksena, olen vetänyt ylös muutama. Tämä oli kuin 10 minuuttia viivyttely tänä aamuna. Jos myös Google "vinossa", ilmoitus kallistamalla päätä slightly-- ja niin tämä on ehkä useimmat hirvittävä kaikista koska joku vietti kuten päivänsä täytäntöönpanossa joitakin vuosia ago-- tule. Voi, odota-- se vika. Niin käynnissä yksi maailman suurin sivustot ovat typeriä pikku pääsiäismunia. He luultavasti kuluttavat triviaali määrä riviä koodia juuri niin, että voimme olla vähän hauskaa tuollaista. Mutta ainakin nyt saat joitakin niistä sisällä vitsejä. Nyt katsomaan joitakin White Lies olemme kertoneet myöhään, ja alkaa kuoria takaisin jotkut kerrokset teknisesti niin että te todella ymmärtää mitä on tekeillä ja voit ymmärtää joitakin uhkia, kuten Shellshock, että ovat nyt alkaneet tulla eturintamassa kaikkien huomiota, ainakin tiedotusvälineissä. Joten tässä on hyvin yksinkertainen funktio joka palauttaa mitään, mitätön. Sen nimi on swap. Se kestää kahden muuttujan ja se palauttaa mitään. Ottaa sisään ja b. Joten nopea esittelyn. Toimme nämä ylös. Voisimme yhtä hyvin ottaa hieman tauko täällä vain hetken ja on vähän jotain juotavaa. Jos joku panisi pahakseni tuloaan minut tänne hetkeksi. Miten sinusta viininpunainen paita? Tule ylös. Vain yksi tänään. Kiitos kuitenkin. Kunnossa, ja meillä on tulossa kuka täällä? Mikä sinun nimesi on? Kaiutin 4: Laura. SPEAKER 1: Laura. Tule ylös. Niin Laura, hyvin yksinkertainen haaste. Hauska tavata yo. Kunnossa. Joten meillä on maitoa tänne ja meillä on joitakin appelsiinimehua tänne ja jotkut kupit että me lainattu Annenberg tänään. Kaiutin 4: Borrowed. SPEAKER 1: Ja mene eteenpäin ja antaa sinulle puoli lasia tästä. Kunnossa. Ja me annamme sinulle puoli lasillinen maitoa. Niin, ja juuri niin, että voit muistaa, mitä tämä oli, Muistelin tuoda tämä ylös ja tänään. Okei. Jos sinulla ei ole mielessä, katsotaanpa, me laittaa ne päälle oma lasit jos haluat. Tämä tulee olemaan maailman Laura silmissä. Kunnossa. Joten tavoite, annetaan kaksi kuppia neste täällä, maito ja appelsiinimehu, on vaihtaa kaksi sisällön niin, että appelsiinimehu menee maitoa kuppi ja maito menee appelsiinimehu kuppi. SPEAKER 4: Saanko toisen kupillisen? SPEAKER 1: Olen niin iloinen kysyit, vaikka Olisi ollut paljon parempi kuvamateriaalia jos et olisi pyytänyt. Mutta kyllä, voimme tarjota sinulle kolmasosa kuppi, joka on tyhjä, tietenkin. Kunnossa. Joten vaihtaa sisältöä siellä. Very nice. Erittäin hyvä. Teet tämän erittäin huolellisesti. Ja vaiheeseen kolme. Kunnossa. Erinomainen. Aplodit olisi hyvä Laura. Kunnossa. Meillä on pieni jakaus lahja sinulle, mutta haluan ottaa nämä. Kiitos paljon. Niin yksinkertainen esimerkki, vaikka, osoittaa, että jos teet haluat vaihtaa sisältöä kaksi säiliötä, tai kutsukaamme niitä muuttujia, tarvitset väliaikaista varastointia lavastaa yksi sisällön niin että voit itse tehdä swap. Niin tosiaan, tämä lähdekoodi tänne C edustaa juuri sitä. Jos appelsiinimehu oli ja maitoa oli b, ja halusimme vaihtaa kaksi, voisit kokeilla jotain luovaa kaatamalla sisäkkäin, mutta luultavasti ei end erityisen hyvin. Joten käytämme kolmasosaa cup, puhelu se tmp, T-M-P sopimuksen mukaan, ja laittaa sisältö EYVL siinä sitten vaihtaa yhden kupin, sitten laittaa EYVL osaksi alkuperäinen cup, jolloin saavuttamisessa, aivan kuten Laura teki, swap. Joten juuri siihen. Anna minun mennä eteenpäin ja avata up esimerkki, joka on oikeastaan ​​nimeltään "no Vaihdetaan ", koska tämä ei ole niin yksinkertaisesti tehdä kuin luulisi. Joten tässä ohjelmassa, huomaa, että Käytän stdio.h, vanha ystävämme. Minulla on prototyyppi for swap siellä, joka tarkoittaa sen täytäntöönpano on luultavasti alhaalla, ja katsotaan mitä tämä tärkein Ohjelma aikoo tehdä minulle. Haluan ensin julistaa int x saa yksi, ja int y saa kaksi. Niin ajattele niitä, koska EYVL ja maito, vastaavasti. Ja sitten minä vain printf sanomalla x on tämä ja y on tämä, vain niin voin näkemään mitä tapahtuu. Sitten olen printf väittäen että olen vaihtamalla kaksi, ja sitten tulostaa väittävät, että he vaihtoivat, ja minä tulostaa x ja y uudelleen. Joten tässä ylös swap on mitä Laura teki, ja mitä näimme näytön hetki sitten. Joten mene eteenpäin ja olla pettynyt. Älkää swap, ja suorita mitään swap, zoomauksen tuotannon täällä. Anna x on 1, y on 2, vaihtamalla vaihtuneet. x on edelleen 1, ja y on edelleen 2. Joten vaikka rehellisesti sanottuna, tämä näyttää aivan kuten, joskin teknisesti, mitä Laura teki, ei näytä toimivan. Niin miksi? No, käy ilmi, että kun me kirjoittaa tällaisen ohjelman joka on sekä pää, korostettu täällä, ja sitten toinen toiminto, kuten swap, korostettu täällä, joka se kutsuu, maailma näyttää vähän jotain nämä lokerot hetki sitten. Kun tärkein ensin saa kutsutaan, Se on kuin kysyisi käyttöjärjestelmä ja vähän muistia paikallisia muuttujia kuin x ja y, että tärkein on, ja he päätyvät oikeassa. Mutta jos tärkeimmät puhelut vaihtaa, ja tärkeimmät kulkee vaihtaa kaksi perustetta, ja b, appelsiinimehua ja maitoa, se ei ole kuin luovuttamalla appelsiinimehua ja maitoa Laura. Mitä tietokone tekee, on se kulkee kopioita appelsiinimehua ja kopiot maitoa Laura, jotta mitä lopulta sisälle tämän lokeron on arvo yksi ja kaksi, tai EYVL ja maito, mutta jäljennöksiä, niin, että tässä vaiheessa tarina, siellä on lehdessä ja maito kussakin näistä tarjottimia. On yksi ja kaksi Kussakin näistä tarjottimia, ja swap-toiminto on todellakin toimi. Se vaihtamalla niitä sisällä Toisen ylimmän tarjotin, mutta että swap ei ole vaikutusta. Ja perustuu vain joidenkin Perusperiaatteena olemme puhui ennen, ja jopa vain muutama minuutti sitten, mitä saattaa selittää muuttuvat ja b sisällä swap ei ole vaikutusta x ja y, vaikka Kuljin x ja y swap toiminto. Mikä on avain sana tässä, että voi yksioikoisesti selittää? Taisin kuulla sen täällä? Yleisö: Return. SPEAKER 1: Paluu? Ei palaa. Mennään keskenään. Mikä se on? Yleisö: [kuulumaton]. SPEAKER 1: OK, joten return-- voisimme tehdä paluun työtä tarina, mutta siellä on vielä yksinkertaisempi selitys. Yleisö: laajuus. SPEAKER 1: Soveltamisala. Otan soveltamisalaan. Joten laajuus, muista missä meidän x ja y julisti. He julisti sisällä Tärkeimpien asti täällä. ja b puolestaan ​​ovat tehokkaasti julisti sisällä swap, ole aivan aaltosulkeita mutta silti yleisen alueen swap. Ja niin tosiaan, ja b olemassa vain tämän lokeroon alkaen Annenberg, tämä Toinen koodinpätkän. Joten olemme todellakin muuttumassa kopio, mutta se ei oikeastaan ​​paljonkaan apua. Joten katsomaan Tässä hieman alemmalla tasolla. Aion mennä takaisin lähdehakemisto, ja aion ensin zoomata täällä, ja vain vahvistaa, että olen tässä isompi pääteikkunaa Ohjelma on silti käyttäytyy niin. Oletetaan nyt, että tämä ei ole tahallinen. Selvästi Halusin swap työtä, joten se tuntuu vika. Nyt voisin aloittaa lisäämällä paljon printf: n minun koodia, tulostamalla x tänne, y yli täällä, täällä, b tänne. Mutta suoraan sanottuna, se on luultavasti mitä olet tehnyt jo pari viikkoa nyt virassa tuntia ja kotona työskenneltäessä on psets yrittää löytää joitakin bugeja. Mutta näet, jos et ole jo, että ongelma asettaa kolme esitellään komentoon nimeltään GDB, jos GDB, GNU debuggeri on itse koko joukko ominaisuuksia, jotka voivat tosiasiallisesti meidän ymmärtää tilanteita näin, mutta enemmän vetoavasti, ratkaista ongelmia ja löytää vikoja. Joten aion tehdä tämän. Sijasta ./noswap, olen sen sijaan juokse GDB ./noswap. Toisin sanoen aion ajaa minun Ohjelma ei Bash, uusi ystävä tänään. Aion ajaa minun Ohjelman noswap sisällä Tämän muu ohjelma nimeltä GDB, joka on debuggerin, joka on ohjelma, joka on suunniteltu auttamaan Te ihmiset löytämään ja poistamaan vikoja. Joten jos osuin Run täällä, siellä hirvittävä määrä tekstiä että et oikeastaan ​​koskaan tarvitse lukea. Se on pohjimmiltaan häiriötekijä alkaen nopea, joka Aion lyödä Ctrl-L nousta huipulla siellä. Tämä on GDB nopea. Jos haluan ajaa tämän ohjelman nyt koska tämä pieni lunttilappua nykypäivän dia ehdottaa, Run on ensimmäinen käskee meidän tarkoitus esitellä. Ja olen juuri menossa kirjoittaa ajaa tänne sisälle GDB, ja todellakin se juoksi minun ohjelma. Nyt on olemassa joitakin muita lähdöt näytön näin, mutta se on GDB vain olemalla anaali ja kertoa meille, mitä on tekeillä. Sinun ei todellakaan tarvitse huolehtia näistä yksityiskohdista juuri nyt. Mutta mikä on todella siistiä noin GDB, jos en tee tätä again-- Ohjaus-L tyhjentää screen-- anna minun mennä eteenpäin ja tyyppi "break tärkein," siten, kun lyön Enter, jossa mikä kutsutaan taitekohta klo noswap.c, linja 16, joka on kun GDB tajunnut minun ohjelma itse on, minun funktio oikeastaan ​​on. Tämä jätämme nyt mutta se osoite muistiin nimenomaan tätä toimintoa. Joten nyt kun kirjoitan ajaa, huomaa, mitä on siistiä täällä. Oma ohjelma murtuu rivillä I kertoi GDB keskeyttää suorituksen. Joten minun ei tarvitse nyt muuttaa koodia, lisätä joitakin printf: n, käännöksen jälkeen se, uusintana sitä, muuttaa, lisätä joitakin printf: n, tallenna se, käännöksen jälkeen se, aja se. Voin vain kävellä läpi minun ohjelma askel askel askeleelta ihmisen nopeudella, ei Intelillä-sisällä sellaista nopeutta. Joten nyt huomaa tätä linjaa näkyy tässä, ja jos palaan minun ohjelma gedit, huomaa, että tämä on todella ensimmäinen rivi koodia. On line 16 gedit. On line 16 sisällä GDB, ja jopa vaikka tämä mustavalkoinen käyttöliittymä ei ole läheskään niin käyttäjä ystävällinen, tämä tarkoittaa että linja 16 ei ole toteutettu vielä, mutta se on noin olla. Joten todellakin jos kirjoitan tulosta x, ei printf, vain tulostaa x, Saan väärä arvo on nolla, koska x ei ole alustettu vielä. Joten aion kirjoittaa seuraavaksi, tai, jos haluavat olla fancy, vain N seuraavaksi. Mutta kun kirjoitan seuraavaksi tulevat, nyt huomaa se siirtyy linjaa 17. Joten loogisesti, jos olen teloitettiin linja 16 ja olen nyt kirjoita print x, mitä minun pitäisi nähdä? Yksi. Ja nyt tämä on kieltämättä sekava. 2 dollaria on vain hieno tapa, jos haluat viitata, että arvo myöhemmin, voit sanoa "dollari allekirjoittaa kaksi." Se on kuin takaisin viittaus. Mutta nyt, vain sivuuttaa sitä. Mielenkiintoista on se, mitä on oikeudesta yhtäläisyysmerkin. Ja nyt jos kirjoitan ensi kerran ja tulostaa y, haluan nähdä 2. Voin nyt myös tulostaa x uudestaan, ja rehellisesti, jos saan hieman hämmentynyt siitä, missä minä olen, voin kirjoittaa lista lista ja vain nähdä yhteydessä ympäri kohta olen todella osoitteessa. Ja nyt voin kirjoittaa seuraava, ja siellä x on 1. Nyt kirjoitan seuraavaksi. Voi, y on 2. Ja vielä, se on hämmentävää, koska GDB tuotannosta on kavallettu oma tuotos. Mutta jos pitää mielessä, jonka vilkuillen edestakaisin koodin tai muuttamisesta sen ulos puolella rinnan ehkä sinun nähdä, että todella olen vain tehostamalla kautta ohjelmani. Mutta huomaa, mitä tapahtuu seuraavaksi, kirjaimellisesti. Tässä on line 22. Antakaa minun mennä yli sen, mikä liikkuu 23, ja jos tulostan x nyt vielä yksi. Ja jos voin tulostaa y nyt vielä yksi. Joten tämä ei ole hyvää harjoitusta. Joten tee uudelleen tämän. Anna minun mennä takaisin ylös alkuun ja tyyppi aikavälillä uudelleen. Ja se sanoo ohjelman joka on parhaillaan debugged on alkanut jo, aloitetaan alusta. Kyllä, tehdään tämä uudestaan. Ja tällä kertaa Tehdään seuraavaksi, seuraava, seuraava, seuraava, seuraava, mutta nyt asiat saavat mielenkiintoisen. Nyt haluan astua swap, joten en kirjoita seuraava. Kirjoitan askel, ja nyt huomaa sitä on noussut minua noswap.c linja 33. Jos menen takaisin gedit, mitä linjaa 33? Se on ensimmäinen todellinen riviä koodia sisällä swap. Mikä on mukavaa, koska nyt voin Tällainen penkoa ja saada utelias siitä, mitä tapahtuu juuri siellä. Saanen tulosta tmp. Vau. Miksi tmp on joitakin hullu, väärä roskat arvo? Yleisö: Se ei ole alustettu. SPEAKER 1: Se ei ole alustettu. Ja todellakin, kun suoritat ohjelman, olet antanut läjän muistia käyttöjärjestelmä, mutta ole alustettu arvoja, niin mitä bittiä olet nähdä täällä, vaikka se on tämä hullu iso negatiivinen numero, tarkoittaa vain että ne ovat jäänteitä joitakin aiempia käyttö että RAM, vaikka en ole itse tarvitsi sitä vielä. Joten nyt aion mennä eteenpäin ja tyyppi seuraavaksi, ja jos en nyt kirjoita print tmp, mitä minun pitäisi nähdä? Arvosta riippumatta oli, on ensimmäinen argumentti, vain kuten x oli ensimmäinen asia siirrellään vuonna, niin ja x tulisi olla samat, joten tulosta tmp pitäisi tulostaa minulle yksi. Joten mitä näet ongelmatilanteissa setti kolme on opetusohjelma tapaisena on GDB, mutta ymmärtää, että tämä on alku of katsomaan työkalu, joka tosiasiallisesti auttaa ongelmanratkaisussa niin paljon tehokkaammin. Mitä olemme viime kädessä aikoo tehdä keskiviikkona on alkaa kuoria takaisin muutama kerros ja poistaa joitakin apupyörät. Että asia sanottu merkkijonon olemme käyttäneet jo jonkin aikaa, aiomme hitaasti ottaa sen pois teiltä ja alkaa puhua jotain esoteerisesti tunnetaan char *, mutta aiomme tehdä tämän mukava ja ensin varovasti, vaikka viitteitä, kuten niitä kutsutaan, voi tehdä joitakin erittäin huonoja asioita, jos väärin, tarkastelemalla hieman claymation alkaen ystävämme Nick Parlante Stanfordin Yliopisto, tietojenkäsittelytieteen professorina tiede, jotka rakensivat tämän esikatselu ja mitä on tulossa tänä keskiviikkona. [VIDEOTOISTOSTA] Hei, Binky. Herätä. On aika osoitin hauskaa. Mitä se on? Oppia viitteitä? Voi Goody! [END VIDEOTOISTOSTA] SPEAKER 1: Se odottaa sinua keskiviikkona. Nähdään sitten. [VIDEOTOISTOSTA] -Ja Nyt, syvä ajatuksia, by Daven Farnham. Miksi me oppimisen C? Miksei +? [Naurua] [END VIDEOTOISTOSTA]