[MUSIC Playing] Kryetari 1: Në rregull, kjo është CS50, dhe kjo është fillimi i javës katër, dhe si ju mund të keni dëgjuar ose lexuar, bota është duke përfunduar. Duke shkuar të gjithë rreth internetit ka qenë e njohurive dhe vetëdijes e një bug në një program, a gjuhë programimi të quajtur Bash. Kjo është quajtur mrekullisht si Shellshock, ose derën Bash, por artikuj si këto nuk kanë qenë të rralla. Dhe në fakt, shumë prej tyre të sjellë kujtimet mbrapa e Heartbleed, të cilat ju mund të keni vënë re në shtypni përsëri këtë pranverë kaluar, e cila në mënyrë të ngjashme ishte mjaft dramatike. Tani e atyre prej jush këtu sot, sa prej jush kanë, edhe në qoftë se ju nuk e kuptoni se çfarë kjo është e gjitha në lidhje me, dëgjuar Shellshock? Në rregull, dhe sa prej jush kanë kompjutera që janë të pambrojtur? OK, nuk duhet të jetë shumë, shumë më tepër duart deri tani, për arsye ne do të shohim. Le të bëjmë një vështrim në atë që është vazhduar në media dhe pastaj të shpjegojë atë pak këtu për ne teknikisht. Gjuha 2: Ekspertët e sigurisë kanë paralajmëroi se një e metë serioze mund të jetë gati për të ndikojë në qindra miliona e përdoruesve të internetit në botë. Pra, çfarë saktësisht është bug që ka qenë quajtur Shellshock, dhe çfarë e bën këtë? E pra, Shellshock është i njohur edhe si Bug Bash, software ajo shfrytëzon. Hakerët përdorin virusin për të scan pambrojtur Sistemet running Linux dhe Unix sistemet operative dhe më pas infektojnë ato. Bash është një shell command line. Kjo lejon përdoruesit çështje urdhëron për të nisur Programet dhe karakteristika brenda software nga shtypja në tekst. Është përdorur në mënyrë tipike nga programuesit, dhe nuk duhet të jetë e hapur për botën më të gjerë, pse Shellshock ndryshon se. E pra, worringly, disa analistë paralajmërojnë se mund të jetë një kërcënim i madh, sepse Shellshock lejon plotë kontrollin e një makine të infektuar, ndërsa Heartbleed lejohet vetëm hakerat për të spiunuar në kompjuter. Është kaq serioze, është e është vlerësuar një 10 nga 10 për peshën nga Kombëtare Baza e të dhënave dobësi. 2/3 e të gjithë serverat e internetit janë në rrezikut, duke përfshirë disa kompjuterat Mac. Well, sigurohuni që ju të patch sistemet e tuaja tani. Çdokush pret një website running sistemet operative të prekur duhet të marrin masa sa më shpejt të jetë e mundur. Kushdo që mund të përballojë ajo duhet të duket të monitorimit dhe web zbatimin e tyre firewalls për të parë jashtë për ndonjë sulme. Kryetari 3: Gjëja më e keqe që mund të ndodhë është që dikush do të shkruaj kodin që do të shkojnë automatikisht dhe skanim internetit dhe do të ndikojë në të gjitha këto kompjutera. Dhe një herë ata e bëjnë se, mirë, Gjëja më e keqe që mund të bëni është vetëm të fshini çdo gjë, ose mbyllur faqet poshtë. Pra, ne mund të shohim dëme nga kjo pikëpamje, ku ne do të kemi njerëz me qëllim të keq që vetëm të vendosë për të shkaktuar kërdi duke sjellë sisteme poshtë ose fshirjes fotografi, dhe gjëra të tilla si se. Gjuha 2: Disa thonë se kjo është një e më e vështirë për të matur bugs në vite, dhe ajo mund të duhen javë ose edhe muaj për të përcaktuar ndikimin e saj përfundimtar. Kryetari 1: Pra, të gjithë e që është e vërtetë, por Funny gjë është, pothuajse të gjithë nga imazhet qe sapo e pa, me përjashtim të ndoshta tastierë, ka asgjë të bëjë me bug whatsoever. Serverat dhe telat dhe kështu me radhë, është e lidhur lloj tangenciale, por në thelb kjo është në fakt shumë e njohur se çfarë po ndodh këtu. Në fakt, më lejoni të shkoj në aplikim tonë CS50. Më lejoni të shkojnë përpara dhe të maksimizuar dritare terminali këtu. Dhe ju djema kanë përdorur këtë, ose versionin ngulitur tij, në gedit në mënyrë për të shkruar programe, shtypni komandat, dhe kështu me radhë, dhe kjo është në të vërtetë, dhe ka qenë për javë, Bash, B-A-S-H. Kjo është Bourne-përsëri shell, e cila është vetëm një mënyrë e sofistikuar për të thënë, ky është një program që ka një keq të shpejtë, në mënyrë efektive, që ulet aty duke pritur për të dhëna për ju. Dhe kjo është komanda line interface me anë të të cilat ju djema janë duke komandat dhe në fund të fundit hartimin dhe pastaj duke programe. Por bash edhe një programimit Gjuha në kuptimin e mëposhtme. Ju e dini se ka komandat si cd dhe ls dhe tingëllim dhe të tjerët, por ju mund të përcaktojë komandat tuaja duke zbatuar ato në Bash. Tani ne nuk do të shkojnë në hollësi të madhe si për të Bash gjuhë programimi, por e dini, për shembull, që në këtë moment, nuk ka komandë të quajtur "hello". Pra, ajo mund të gjendet në një nga këto paketa. Kjo nuk është instaluar në kompjuterin tim. Pyesni administratorin tuaj. Por në qoftë se unë dua që të ketë një program quajtur "hello" në Bash ose në ftim tim, Unë në fakt mund të përdorni sintaksë që është krejt si C. Kjo nuk është krejt e njëjtë, por kjo duket shumë e ngjashme me një funksion, edhe pse mungojnë disa detaje. Asgjë nuk duket të ndodhë, por tani, nëse unë lloji "hello," në të vërtetë ju mund të shkruani një program, jo ​​në C, jo në Java, jo në një tjetër programimit gjuhë, por në vetë Bash. Tani kryesore këtu është që kam shkruar emrin Unë të kërkuar për të dhënë këtë komandë të re, dhe kllapa janë gjithashtu simbolike e kjo duke qenë një funksion. Si një mënjanë, ju gjithashtu mund të bëni fun gjërat, dhe në fakt, edhe në Mac OS, ky është një program i quajtur Terminal. Ajo vjen e ndërtuar në askujt kompjuter që ka një Mac në këtë dhomë, dhe ju mund të bëni gjëra të ngjashme në Mac OS, por ju mund të shkoni më tej se. Dhe kjo është pak tangjencial, por kjo është lloj i fun. Unë u kujtoi këtë mëngjes, kur duke menduar këtë anë, e një lojë pak kam përdorur për të luajtur me një nga ish-TFS CS50-së ku çdo herë ai do të dalë nga tastierë e tij me ekran e tij hapur, Unë do të të ekzekutuar një komandë si this-- "thonë hello." Dhe tani çdo herë ai u kthye në e tij keyboard pasi kam pastruar në ekran dhe ai do të ulen, të përpiqet të bëjë disa punë, lista përmbajtjen e directory-- tij [AUDIO Playback] -Hello. Përshëndetje. Kryetari 1: Pra, në drejtësi, ajo nuk ishte në të vërtetë "hello". Ajo ishte zakonisht diçka më e ngjashme me that-- [AUDIO Playback] -Beep. Kryetari 1: --that I would-- kështu që kompjuteri i tij do të betohem në atë në çdo kohë që ai në të vërtetë u ul në tastierën e tij. Dhe shumë shpejt ai me motive nga mos lënë ekran i tij i hapur. Por kjo sugjeron lloj i fun budallaqe që ju mund të ketë me diçka si Bash. Por kjo është pak më shumë serioze, të jetë i sigurt, se kaq. Dhe në fakt, kjo është një nga shumica e mete rrezikshme dhe të zgjasin që e ka goditur me të vërtetë botën globalisht. Kjo bug ka qenë rreth për rreth 20 vjet, dhe ju do të goditur në vetëm një moment nga thjeshtësinë e saj të afërm. Pra, kjo është një përfaqësues thuaj që në qoftë se ju vetë një Mac, fjalë për fjalë të drejtë tani kur ju keni kapak tuaj të hapur, ju mund të provoni të shtypni në se program të quajtur Terminal. Terminali është nën Aplikime Utilities-- për një herë, përdoruesit e Windows nuk duhet të shqetësuar për këtë threat-- veçantë por ata që ndër ju me Macs mund të shtypni këtë në një dritare si unë do të bëj këtu, dhe në qoftë se ju nuk shkruani që në këtë program quajtur Terminal, si unë do të bëj tani, nëse ju shihni fjalën "të prekshme," kompjuteri juaj është i pambrojtur ndaj shfrytëzimit. Tani çfarë do që në të vërtetë do të thotë? Dhe kjo është pa dyshim disa sintaksë goxha i çmendur, por le të paktën të nxjerrë jashtë disa nga aspektet interesante. Pra, ka disa sintaksë që duket a njohur pak, të paktën nga C dhe programimit në përgjithësi. Unë shoh disa kllapa, pikpresje, formatimin e teksteve kaçurrel, dhe të tilla, por rezulton se kjo gjë e trashë këtu në të verdhë është në thelb një funksion që nuk bën asgjë. Mjetet zorrës së trashë të bëjë asgjë, dhe pikëpresje do të thotë mos bërë asgjë. Pra, brenda këtyre formatimin e teksteve kaçurrel, fakti se unë kam një të barabartë nënshkruajë për të majtë, kjo thelb është krijuar një komandë, ose një variabël, quajtur x, dhe caktimin atë se pak e verdhë e kodit atje. Kjo mund të jetë diçka si "echo hello "apo" thonë bip "ose diçka e ngjashme me këtë. Por vini re, nëse sytë tuaj endet më tej në të djathtë, ka më shumë për këtë linjë se vetëm në fund të asaj pikëpresje. "Echo të prekshme," dhe pastaj përtej se ka edhe më shumë. Një tjetër pikëpresje, bash -c :. Pra histori të gjatë të shkurtër, kjo linjë e kodit është mjaftueshme për imponues një kompjuter që është të prekshme për të bërë diçka se ju doni të bëni, sepse ka një bug në Bash ku edhe pse bash është dashur për të ndaluar lexuar linjat e djathtë e komandës ka pas tekstit të verdhë, për një 20-vjeçare plus bug të vjetër, Bash ka qenë në fakt leximi përtej kësaj pikëpresje dhe shumë e sa duke bërë atë që është thënë. Pra, çfarë është implikimi e që në fund të fundit? Unë vetëm tha se "echo hello" ose "echo prekshme," por ajo në qoftë se keni bërë diçka në të vërtetë me qëllim të keq, si rm -rf *, të cilat ju nuk mund kanë shtypur kurrë më parë, dhe sinqerisht ju ndoshta nuk duhet shumë shpejt, sepse ju mund të bëni një shumë e dëmit me të. Pse? rm bën çfarë, natyrisht? Heq. * Do të thotë çfarë? Të gjitha. Pra, kjo është një i ashtuquajtur kartë e rrezikshme, kështu që kjo do të thotë fshini çdo gjë në Lista aktuale. -r ndodh të thotë rekursive, që do të thotë në qoftë se ajo që ju jeni fshirjes është një directory, dhe brenda ka është fotografi të tjera dhe drejtoritë e tjera, Recursively pikiatë në atje dhe fshini të gjithë se. Dhe f është më e keqja e të gjithë atyre. Çdokush e di se çfarë do të thotë -f këtu? Force. Pra detyruar mjetet, madje edhe në qoftë se kjo është një ide e keqe, bëjë atë pa bërë mua për konfirmim të mëtejshëm. Pra, ju e dini, ne qeshim me këtë, por sinqerisht, unë ndoshta shtypni këtë herë të shumta një ditë, sepse realiteti është kjo është mënyra më e shpejtë për të fshini një bandë e tërë e gjëra. Por edhe unë kam bërë disa dëme. Por në qoftë se ju do të gënjejnë një kompjuter në përcaktimin e disa ndryshore budallaqe ose funksion i quajtur x, por pastaj tricking kompjuterin në ekzekutimin përtej kufijve të që funksion, përtej kësaj pikëpresje, ju mund të vërtetë gënjejnë një kompjuter në ekzekutimin diçka si rm -rf ose Email komandës ose komandën Copy. Çdo gjë të vërtetë ju mund të bëni me kompjuter, nëse është e fshirjes fotografi, krijimin fotografi, spamming dikë, sulmuar një server nga distanca, në qoftë se ju mund të shprehin atë me një komandë, ju mund të gënjejnë një kompjuter në duke bërë që. Tani ajo është një shembull i se si ju mund të bëni këtë? E pra, ka shumë të kompjuterëve në Bash internet running. Të gjithë përdoruesit e na Mac janë në mesin e tyre. Shumë serverat Linux janë ndër ato, si edhe, dhe serverat Unix. Dritaret përsëri merr relativisht off hook nëse nuk e keni instaluar software të veçantë. Tani një shumë të servers, për shembull, serverat drejtuar web, dhe në fakt Linux është ndoshta më të sistemit operativ popullor për të kandiduar në kompjuter në internet që po shërbejnë faqet e Internetit. Tani si ne do të shohim më vonë në semestrin, kur të dërgoni një kërkesë nga Chrome juaj browser--, Internet Explorer, whatever-- në një server të largët, rezulton se edhe pse ju vetëm të shtypur www.example.com, shfletuesi juaj po dërgon një mesazh kjo është pak më e errët, si kjo. Por vini re një diçka të vogël të çuditshme. Dy linjat e para Unë kurrë nuk kam parë më parë, por ata nuk e shohin veçanërisht kërcënuese. Por vini re atë që unë e kam vjedhur për linjën e tretë këtu. Në qoftë se një djalë i keq do të dërgojë një mesazh si kjo nga kompjuteri tij ose të saj në një Mac pambrojtur ose a pambrojtur server Linux, Funny gjë është se Bash, që thjeshtë pak komandë të shpejtë, është i përhapur kudo dhe shpesh është përdorur për të në thelb të ekzekutuar përmbajtja e një Mesazhi që ajo merr. Dhe nga kjo logjikë, ju mund të gënjejnë një web server, prandaj, duke dërguar diçka si User-Agent, të cilat zakonisht është menduar për të thënë emrin e shfletuesit tuaj. User-Agent krom, User-Agent Internet Explorer, User-Agent Firefox, kjo është vetëm të shfletuesit mënyrë për të identifikuar veten. Por në qoftë se një djalë i keq shumë cleverly thotë, mm-mm, unë jam nuk do të ju them çfarë shfletuesi im është, Unë jam në vend të kësaj do të ju dërgoj këtë gjë të fshehtë, në kërkim me një -rf rm * Në të, ju mund të vërtetë të gënjejnë një pambrojtur web server në internet në ekzekutimin e pikërisht se në atje për fshirjes të gjitha dosjet. Dhe sinqerisht, kjo nuk është e edhe më të keq të saj. Ju mund të bëni asgjë. Ju mund të filloni një të shpërndara mohimi i sulmit të shërbimit në qoftë se ju ka dërguar këtë mesazh tek bunches e tërë e serverat e internetit dhe pastaj të kishin ata të gjithë vijnë, për shembull, në serverat Harvard.edu, dhe ju mund të lloj të zhurmë dreq prej tyre nga një rrjetit të trafikut që ishte shkaktuar ndryshe me këtë djalë i keq. Pra, histori të gjatë të shkurtër, pothuajse të gjithë në këtë dhomë që zotëron një Mac është e ndjeshme për këtë. Rreshtim argjendi është se nëse ju jeni drejtimin e një web server në laptopë tuaj, dhe nëse ju keni konfiguruar në të vërtetë ajo për të lejuar diçka si SSH në të, ju jeni të vërtetë të sigurt. Është e prekshme, por nuk ka ka e duke u përpjekur për të marrë në laptop, kështu që ju mund të lloj të tjera siguroi. Megjithatë, Apple do të së shpejti jetë përditësimin një fix për këtë. Bota e Linux ka lëshuar tashmë një numër i fixes për Fedora dhe Ubuntu dhe versionet e tjera të Linux, dhe me të vërtetë në qoftë se ju drejtuar përditësim 50 në aplikim, edhe se shumë do të jetë e përditësuar dhe të korrigjohen. Por se edhe nuk ka qenë me të vërtetë të pambrojtur, sepse nëse nuk keni tinkered me aplikim dhe bëri laptop publikisht arritshme on internetit, e cila nuk eshte nga default, ju keni në të vërtetë qenë mirë, sepse i firewalling dhe teknika të tjera. Por kjo është një shembull ekstrem i një bug se ne kemi jetuar për të fjalë për fjalë 20 vjet, dhe kush e di nëse dikush e gjithë kjo kohë është njohur në lidhje me të? Dhe në fakt, kjo është një nga sfidat themelore se ne do të shohim më vonë në semestër në lidhje me sigurinë, është se ashtu si në botën e vërtetë, njerëz të mirë janë në disavantazh. Për të mbajtur të liq jashtë, ne duhet të sigurohuni që çdo dera është e mbyllur, se çdo dritare është e sigurtë, që çdo pikë e hyrjes në një shtëpi është e sigurtë për të mbajtur të liq jashtë. Por ajo që e bën djalë i keq duhet të bëni që në fakt kompromis shtëpinë tuaj dhe vjedhin nga ju? Ai ose ajo vetëm ka për të gjetur një të hapur derë, një dritare e thyer, ose diçka në këto linja, dhe kjo është njëjta gjë në sigurinë kompjuterike. Ne mund të shkruani miliona rreshta të kodit programimit dhe të shpenzojnë qindra ose mijëra e orë duke u përpjekur për të marrë atë të saktë, por në qoftë se ju bëni vetëm një gabim në korrektësi, ju mund të vënë të gjithë sistemin dhe të vërtetë në këtë rast, e gjithë internetit dhe botërore në rrezik. Pra, nëse ju dëshironi të mësoni më shumë në lidhje me këtë, shkoni në këtë URL këtu. Nuk ka nevojë për veprim sonte nëse ju jeni në mesin e atyre më të rehatshme se janë drejtimin e web tuaj server, në të cilin rast ju duhet, në fakt, të rinovuar software tuaj. Dhe kjo gjithashtu është titulli i një fjalim, dhe tani një letër, që ne kemi lidhur në website kursin për sot. Ajo ishte nga një shoku me emrin Ken Thompson, i cili u pranuar një shumë të famshëm Çmimi në shkenca kompjuterike, dhe ai i dha këtë fjalim disa vite më parë, në thelb në këtë temë të njëjtë. Asking folks pyetja, duhet ju me të vërtetë besim, në fund të fundit, software ju keni dhënë? Për shembull, ne të gjithë kemi qenë i shkruar programet, dhe ne kemi qenë hartimin e ata me tingëllim. Dhe për dijeninë tuaj, a keni shkruar ndonjë program për CS50 ku ka një derë mbrapa në terezi, ka një mënyrë se një djalë i keq, nëse running programin tuaj, mund të marrë përsipër kompjuterin tuaj? Jo ndoshta, e drejtë? Mario, dhe të babëzitur, dhe Credit. Këto janë të gjitha programet mjaft të vogla. Ju do të duhet të jetë goxha keq në qoftë se ju në të vërtetë bëri tërë kompjuterin tuaj pambrojtur pas shkruar 10 ose 20 rreshta të kodit, ose të paktën pavetëdijshëm disa të implikimeve të sigurisë. Tani them se shaka, por ne do të shohim sot dhe këtë javë është e vërtetë me të vërtetë, të vërtetë e lehtë të jetë e keqe dhe të bëjë edhe programeve të shkurtra të rrezikuara. Por tani për tani, të paktën, të kuptojnë se çështja u pyetur këtu është rreth tingëllim në një përpilues. Pse kemi qenë të besuar tingëllimë për të kaluar dy ose tre javë? Kush është për të thënë se kushdo që ka shkruar tingëllimë nuk kanë një "nëse" gjendjen në atje që në thelb injektuar disa zero dhe ato në çdo program që harton që do të le ose aksesi i saj kompjuterin tuaj, kur ju jeni në gjumë dhe kapak tuaj laptop është e hapur dhe kompjuteri juaj është duke? E drejta? Ne kemi këtë lloj të drejtën e sistemit nder tani ku ne kemi besim se tingëllimë është legit. Ju besoni se pajisja është legit. Ju besoni që fjalë për fjalë çdo program në Mac ose PC tuaj është i besueshëm. Dhe siç sugjeron ky bug thjeshtë, edhe në qoftë se kjo nuk është me qëllim të keq, që nuk është absolutisht e të ngjarë të jetë rasti. Kështu që ju duhet të jenë të frikësuar si ferr. Sinqerisht, nuk ka të thjeshtë zgjidhje për këtë tjetrin shumë se një lloj të vetëdijes shoqërore të rritjes së kompleksitetit se ne jemi duke ndërtuar në krye nga sistemet tona kompjuterike, dhe se si të pambrojtur gjithnjë ne mund të jetë shumë mirë. Tani me se tha, Breakout. Pra Breakout është problemi vendosur tre, dhe Breakout është një lojë nga kaluar që ju të mund të të kujtojnë, por për ne në problemin vendosur tre, ajo na lejon që të marrë gjëra të mbështetur një nivel kështu që kur ne jemi të shkruar programe, edhe në një dritare Terminal si kjo, ne fakt mund të kandidojë, në fund të fundit, jo programe grafike ndryshe nga ato që kishim qasje në në Scratch. Pra, kjo është e stafit të së zbatimi i Breakout, e cila është vetëm ky tulla-thyer lojë, që ju të lëvizur vozis tuaj mbrapa dhe me radhë, dhe ju goditi topin kundër atyre tulla ngjyrë deri krye. Pra, kjo është duke e çuar ne lloj përsëri në ku ne kemi qenë në gjendje të jetë shumë shpejt me Scratch, dhe tani me C, zbatimin e jona user interfaces grafike. Por më shumë se kaq, kjo set problemi paraqet parë në të cilën ne jemi duke i dhënë ju një bandë e kodit. Dhe në fakt, unë të sjellë të qartë vëmendje për këtë, sepse sidomos për ata më pak të rehatshme, kjo Problemi vendosur, të paktën në pamje të parë, do të ndjehen si ne kemi marrë atë një nivel. Sepse ne kemi dhënë ty, për disa të kërkimit dhe zgjidhja e problemeve në pset, një bandë e kodit që kemi shkruar, dhe nja dy komente që thonë se "për të bërë", ku ju duhet të plotësoni në bosh. Pra, jo shumë të frikshme, por kjo është hera e parë ne jemi dorëzuar t'ju kodin që ju duhet për të së pari të lexoni, të kuptojnë, dhe pastaj shtoni në dhe të plotë atë. Dhe pastaj me Breakout, ne jemi duke shkuar për të bërë të njëjtën gjë, duke ju dhënë një duzinë disa rreshta më shumë të kodit që, sinqerisht, ju jap një shumë e kornizës për loja por të ndaluar të shkurtër e zbatimit tulla dhe topin dhe vozis, por ne zbatimin e disa karakteristika të tjera. Dhe madje që në shikim të parë, përsëri, veçanërisht në qoftë se më pak të rehatshme, mund të duket e frikshme dhe veçanërisht mendoni se ka kaq shumë funksione të reja ju duhet të përfundojë mendjen tuaj rreth, dhe kjo është e vërtetë. Por mbani në mend, është e krejt si Scratch. Shanset janë që ju nuk e përdorni të gjithë copa mister në Scratch. Shanset janë që ju nuk u kujdes për të përfunduar mendjen tuaj rreth të gjithë ata sepse të gjithë ajo mori ishte një shikim të shpejtë për të kuptuar, oh, kjo është ajo që unë mund të bëj me atë copë mister. Dhe me të vërtetë, në problemin vendosur 3 spekulim, ne do të ju pikë në dokumentacionin që do të prezantoj me disa funksione të reja, dhe në fund të fundit i programimit ndërton ju përdorni. Kushtet, sythe, variablave, dhe funksionet do të jetë identike me ajo që kemi parë deri tani. Pra me të vërtetë, çfarë ne do të japim ju është një kod mostër që ju lejon të krijoni një dritare që nuk duket ndryshe nga kjo, dhe në fund të fundit të kthehet në diçka mjaft si kjo. Pra, të përfitojnë nga CS50, diskutuar mbi orarin e punës dhe më shumë, dhe të marrin ngushëllim në faktin se shuma e kodit që ju keni për të shkruar është në të vërtetë jo të gjithë se shumë. Sfida e parë është vetëm për të acclimate veten në një farë kodin që kemi shkruar. Çdo pyetje mbi pset3, Shellshock, apo ndryshe? Audienca: Ajo dukej si duke kaluar me Breakout se kodi është pothuajse një stil objekt-orientuar, por mendova C ishte një objekt-orientuar program. Kryetari 1: Një pyetje e shkëlqyer. Pra, në kërkim përmes Kodi i shpërndarjes, kodin kemi shkruar për pset3, për ata të njohur, atë duket si ajo është një pak object-oriented. Përgjigja e shkurtër është, ajo është. Është një përafrim se si ju mund të bëjë kodin object-oriented përdorur një gjuhë si C, por është ende në fund të fundit procedurale. Nuk ka metoda brenda e variablat, si ju do të shihni. Por ajo të kujton se. Dhe ne do të shohim atë funksion përsëri kur ne të merrni për të PHP dhe JavaScript drejt në fund të semestrit. Por tani për tani, të mendojnë për atë si një aluzion të asaj që është për të ardhur. Pyetje e mirë. Të gjithë të drejtë. Pra Merge ishte lloj si ne gjëra të majtë për herë të fundit. Dhe Merge lloj ishte e ftohtë në ndjenjë se ajo ishte aq shumë më të shpejtë, të paktën në bazë të testeve të përciptë kemi bërë javën e kaluar, se sa, të themi, flluskë lloj, lloj përzgjedhje, futje lloj. Dhe ajo që ishte shumë i zoti është vetëm se si të ngjeshur dhe të pastër ju mund të shprehë atë. Dhe ajo që bëri që ne të themi se ishte një sipërme i lidhur në kohë shfaqje prej bashkimi lloj? Po? Audienca: n log n? Kryetari 1: n log n, e drejtë. n log n. Dhe ne do të kthehen në atë që me të vërtetë do të thotë ose ku që vjen nga, por kjo ishte më e mirë se çfarë kohë running që pamë për flluskë Përzgjedhja dhe futje lloj? Pra, n katror. n katror është më e madhe se kjo, dhe madje edhe në qoftë se kjo nuk është mjaft e qartë, e di se log n është më e vogël se n, kështu që nëse ju bëni herë n diçka më e vogël se n, ajo do të jetë më pak se katror n. Është pak e intuitës atje. Por kemi paguar një çmim për këtë. Ajo ishte më e shpejtë, por një temë që ka filluar të dalë javën e kaluar ishte kjo tradeoff. I kam performancë më të mirë Ora e mençur, por ajo që nuk kam për të shpenzuar nga ana tjetër dorë, në mënyrë që të arritur këtë? Audienca: Memory. Kryetari 1: Thuaj përsëri? Audienca: Memory. Kryetari 1: Memory, ose hapësirë ​​më shumë në përgjithësi. Dhe kjo nuk ishte super qartë me njerëzit tanë, por kujtojnë se vullnetarëve tanë u shkonte përpara dhe rrit mbrapa sikur ka një grup këtu, dhe sikur nuk ka një koleksion të dytë këtu se ata mund të përdorin, sepse ne diku të nevojshme për të bashkojë ato folks. Ne nuk mund vetëm shkëmbim të tyre në vend. Pra bashkojë levave renditjes është më hapësirë, e cila ne nuk duhet me algoritme të tjera, por me kokë është se ajo është shumë më e shpejtë. Dhe sinqerisht, në hapësirën e vërtetë botërore këto RAM days--, hard disk space-- është relativisht i lirë, dhe kështu që është e jo domosdoshmërisht një gjë e keqe. Pra, le të marrin një vështrim të shpejtë, pak më shumë metodike, në atë që ne e bëmë dhe pse ne tha se n u log n. Kështu që këtu janë tetë numra dhe tetë vullnetarë kemi pasur herën e fundit. Dhe gjëja e parë që Merge Lloj na tha që të bënte ishte çfarë? Audienca: Ndani në dy. Kryetari 1: Thuaj përsëri? Audienca: Ndani në dy. Kryetari 1: Ndani në dy pjesë, të drejtë. Kjo është shumë e kujton librin e telefonit, e ndarjes dhe të pushtuar më në përgjithësi. Pra, ne shikuar në gjysmën e majtë. Dhe pastaj një herë thamë, lloj gjysma e majtë e elementeve, Çfarë kemi tjetër themi? Sort gjysmën e majtë të majtë gjysmë, e cila na lejohet të, pasi duke e ndarë në dy pjesë, të përqëndrohet në katër dhe dy. Si mund të zgjidhur një listë tani, në verdhë, e madhësisë dy, duke përdorur bashkojë Rendit? E pra ndajnë atë në gjysmë, dhe lloj gjysmën e majtë. Dhe kjo ishte e ku gjërat mori një kohë të shkurtër pak budalla. Si mund të zgjidhur një listë që është e një madhësi, si këtë numër katër këtu? Është e renditura. Ju jeni bërë. Por atëherë si mund të zgjidhur një listë të e kur është numri dy madhësia? E pra, të njëjtën gjë, por tani ajo ishte tretë dhe hapi kyç në bashkojë Rendit? Ju është dashur të bashkojë të majtën gjysmë dhe gjysmë të drejtë. Dhe një herë ne e bëmë këtë, kemi shikuar në katër, ne kemi shikuar në dy. Ne vendosëm të gjithë të drejtë, padyshim dy vjen e para, kështu që ne kemi vënë dy në saj të vend, e ndjekur nga katër. Dhe tani ju duhet të lloj rewind, dhe kjo është lloj karakteristike i një algoritmi si Merge Lloj, Rewind në kujtesë. Cili ishte linjë tjetër të tregimit? Çfarë duhet të jetë duke u fokusuar në e ardhshme? Gjysma e drejta e të majtë gjysmë, e cila është gjashtë dhe tetë. Pra, më lejoni vetëm të hap nëpër këtë pa belaboring pikë shumë. Gjashtë dhe tetë, pastaj gjashtë është renditura, tetë është e renditura. Përziej ato së bashku si kjo, dhe tani hapi tjetër i madh është, natyrisht, të lloj gjysmën e duhur nga Hapi i parë i këtij algoritmi. Pra, ne të përqëndrohet në një, tre, shtatë, pesë. Ne pastaj të përqëndrohet në gjysmën e majtë. Gjysma e majtë e se, gjysma e drejta e se, dhe pastaj shkrihen në një dhe tre. Pastaj gjysma djathtë, pastaj u largua gjysma e tij, atëherë gjysma e drejta e saj. Bashkojë atë në, dhe tani çfarë hapi mbetet? Bashkojë gjysmën e madhe e majtë dhe e madhe gjysma e drejtë, kështu që shkon poshtë aty, atëherë dy, pastaj tre, pastaj katër, atëherë pesë, pastaj gjashtë, pastaj shtatë, pastaj tetë. Deri tani, pse është kjo në fund të fundit duke zbuluar, veçanërisht nëse n dhe logaritmet më shumë në përgjithësi në vend shpëtuar ju, të paktën në kujtim të kohëve të fundit? E pra, njoftim lartësinë e kësaj gjëje. Ne kishim tetë elemente, dhe ne ndarë atë nga dy, nga dy, nga dy. Pra hyni bazë dy nga tetë na jep tre. Dhe besoni mua në se në qoftë se një mjegullt pak mbi këtë. Por hyni bazë dy nga tetë është tre, kështu që ne kemi bërë tri shtresa të bashkimit. Dhe kur ne u bashkua elementet, si shumë elemente e shikojmë në secilin prej këtyre rreshtave? Një total prej n, e drejtë? Për shkak të bashkojë rreshtin e lartë, edhe pse ne e bëmë atë pak nga pak, ne fund të fundit prekur çdo numër herë. Dhe në radhë të dytë, për të bashkojë ato listat e madhësisë dy, ne kishim për të prekur çdo element herë. Dhe pastaj këtu të vërtetë në mënyrë të qartë në rreshtin e fundit, ne kishim për të prekur njëri prej atyre Elementet e një herë, por vetëm një herë, kështu që këtu qëndron, atëherë, tonë log n n. Dhe tani vetëm për të bërë gjërat pak më formale për vetëm një moment, nëse ju ishin tani të analizuar këtë në një lloj nivel më të lartë dhe të përpiqen për të vendosur, edhe si mund të ju shkoni në lidhje me shprehjen e koha drejtimin e këtij algoritmi vetëm duke shikuar në të dhe nuk duke përdorur një shembull të trilluar? E pra, sa kohë do të thoni një hap si kjo në të verdhë do të marrë, nëse n <2 kthimi? Kjo është një O e madhe e çfarë? Kështu që unë jam duke parë një të tillë, kështu një hap, ndoshta dy hapa, sepse kjo është në qoftë se dhe pastaj të kthehen, por është e Koha konstante, e drejtë? Pra, ne tha O (1), dhe kjo është se si unë do të shprehin këtë. T, vetëm të jetë running kohë. n është madhësia e input, kështu T (n), vetëm një mënyrë e sofistikuar i thënë drejtimin Ora input dhënë me madhësi n do të jetë në rendin kohe konstante, në O (1). Por ndryshe, çka në lidhje me këtë? Si do ta shprehin running kohë e kësaj linje të verdhë? T i çfarë? Ju mund të lloj të mashtrojnë këtu dhe përgjigje pyetjen time ciklikisht. Pra, në qoftë se koha që konkurrojnë në përgjithësi ne vetëm të themi është T (n). Dhe tani ju jeni lloj i punting këtu dhe duke thënë, mirë, vetëm lloj gjysmën e majtë, dhe pastaj të zgjidhur gjysmën e duhur. Si mund ne të përfaqësuar simbolikisht koha drejtimin e kësaj linje të verdhë? T i çfarë? Çfarë është madhësia e input? n mbi dy. Pse nuk mundem të them vetëm se? Dhe pastaj kjo është tjetër T (n / 2) dhe pastaj përsëri, në qoftë se unë të bashkohen dy gjysmave të renditura, sa elemente jam unë do që të ketë për të prekur gjithsej? n. Kështu që unë mund të shprehin këtë, vetëm të jetë lloj i zbukuruar, si koha kalon në përgjithësi. T (n) është vetëm koha drejtimin e T (n / 2), plus T (n / 2), u largua gjysma dhe gjysma e duhur, plus O (n), e cila është ndoshta n hapa, por ndoshta, në qoftë se unë jam duke përdorur dy gishta, kjo është dy herë më shumë hapa, por është linear. Kjo është disa numër hapash që është një faktor i N, kështu që ne mund të shprehim këtë si kjo. Dhe ky është vendi ku tani ne do të vë bast për mbrapa e shkollës së mesme tonë matematikë tekst ne jemi se përsëritje në fund të fundit përfundon barabartë kjo, n herë log n, në qoftë se ju në të vërtetë të bëjë jashtë matematikë më zyrtarisht. Pra, kjo është vetëm dy perspektiva. Një numerikisht me një vështirë-koduar shembull përfaqësues duke përdorur tetë numra, dhe një më shumë vështrim i përgjithshëm se si kemi marrë atje. Por ajo që është me të vërtetë interesante këtu është, përsëri, ky nocion e çiklizmit. Unë nuk jam duke përdorur për sythe. Unë jam lloj i përcaktimit diçka në aspektin e vetë, jo vetëm me këtë funksion matematikore, por edhe në drejtim të këtij kodi pseudo. Ky kod pseudo është gjithkund rekursive në atë dy linja saj është në thelb duke u thënë atë për të shkuar përdorin vetë për të zgjidhur një më të vogël Problemi i madhësisë më të vogël, dhe pastaj përsëri dhe përsëri dhe përsëri deri ne shkurtoj atë poshtë në këtë të ashtuquajturin rastin bazë. Pra, le të vërtetë të tërheqë një shumë bindëse marrë-larg nga kjo si më poshtë. Më lejoni të shkoj në gedit dhe për të marrë një të shikojmë disa nga kodin e sotme burim, në mënyrë të veçantë ky shembull këtu. Sigma 0, e cila shton me sa duket numri një deri n. Pra, le të shohim se çfarë është e njohur dhe të panjohura këtu. Së pari ne kemi një çift të përfshin, kështu që asgjë të re atje. Prototype. Unë jam një i mjegullt pak në kjo pas disa ditësh, por ajo që u themi një prototip i një funksioni është? Audienca: [padëgjueshme]. Kryetari 1: Çfarë është ajo? Audienca: Ne shpallë atë. Kryetari 1: Ne shpallë atë. Pra, ju jeni të mësimdhënies tingëllim, hej, jo të vërtetë zbatimin këtë ende, por diku në këtë fotografi, me sa duket, do të jetë një funksion të quajtur çfarë? Sigma. Dhe kjo është vetëm një premtim që ajo do të duket si ky. Ajo do të marrë një numër të plotë, si input-- dhe unë mund të jetë më i qartë dhe thonë int n --and është do të kthehen një int, por do të thotë pikëpresje, mm, unë do të marrë rreth për të zbatuar këtë pak më vonë. Përsëri, tingëllimë është memec. Kjo vetëm do të dini se çfarë ju tregoni atë të lartë e deri në fund, kështu që ne duhet të paktën të dhënë atë një aluzion të asaj që është për të ardhur. Tani le të shohim kryesore këtu. Le të lëvizni poshtë këtu dhe shohim se çfarë kryesor është duke bërë. Nuk është se e gjatë e një funksion, dhe në fakt konstrukti këtu është e njohur. Unë deklaroj një n ndryshueshme, dhe pastaj Unë mërzit përdoruesit përsëri dhe përsëri për një numër i plotë pozitiv duke përdorur getInt, dhe vetëm dalje nga ky lak një herë përdorues ka përmbushur. A Ndërsa, ne kemi përdorur për të mërzit përdoruesit në atë mënyrë. Tani kjo është interesante. Unë deklaroj një int quajtur "përgjigje." Unë caktojë kjo vlera e kthimit e një funksion të quajtur "SIGMA." Unë nuk e di atë që e bën, por Mbaj mend duke deklaruar atë një moment më parë. Dhe atëherë unë jam duke kaluar në vlera që përdoruesi shtypur në, n, dhe pastaj unë raportoni përgjigjen. E pra le të lëviz mbrapa për vetëm një moment. Le të shkojmë përpara në këtë directory, të bëjë SIGMA 0, dhe në të vërtetë të drejtuar këtë program dhe të shohim se çfarë ndodh. Pra, nëse unë shkoj përpara dhe të drejtuar ky program, ./sigma-0, dhe unë lloji në një pozitiv integer si dy, Sigma, si simbol greke nënkupton, është vetëm do të shtoni deri të gjitha numrat nga zero në deri në dy. Pra, 0 plus 1 plus 2. Pra, kjo duhet të shpresojmë se më jepni 3. Kjo është e gjitha ajo është duke bërë. Dhe në mënyrë të ngjashme, në qoftë se unë të drejtuar këtë përsëri dhe unë i jep numrin tre, kjo është 3 plus 2, kështu që është e 5, plus 1 duhet të jepni 6. Dhe pastaj në qoftë se unë të marrë me të vërtetë i çmendur dhe filloni të shtypni në numër më të mëdha, ajo duhet të jepni shuma më të mëdha. Pra, kjo është e gjitha. Pra, çfarë e bën të duket SIGMA si? E pra, kjo është goxha e drejtpërdrejtë. Është mënyra se si ne mund të kemi zbatuar kjo për dy javëve të shkuara. "Int" do të jetë lloj kthimi. Sigma është emri, dhe ajo merr një m ndryshueshme në vend të n. Unë do të ndryshojë që deri lartë. Atëherë kjo është vetëm një kontroll mendje e shëndoshë. Ne do të shohim se pse në një moment. Tani unë deklaroj një ndryshore, Shuma, nisja atë në zero. Pastaj unë kam këtë për lak iterating, me sa duket për qartësi, nga i = 1 më lart në një = m, e cila është çfarëdo përdoruesi shtypur në, dhe pastaj unë rrisim shumën si kjo. Dhe pastaj kthehen shumën. Pra, disa pyetje. Një, unë pretendojnë në komentin tim se kjo shmang rrezikun e një lak të pafund. Pse do të kalon në një numër negativ shkaktoj, potencialisht, një lak pafund? Audienca: Ju kurrë nuk do të arrijnë m. Kryetari 1: Asnjëherë mos arrijnë m. Por m është e kaluar në, kështu që le të konsiderojnë një shembull të thjeshtë. Nëse m është miratuar në nga Përdorues si një negativ. Pavarësisht kryesore. Kryesore na mbron nga këtë shumë, kështu që unë jam vetëm duke qenë të vërtetë anal me SIGMA për të gjithashtu të sigurt se input nuk mund të jetë negativ. Pra, nëse m është negative, diçka si një negativ. Çfarë do të ndodhë? E pra, unë do të të niset për një, dhe pastaj unë do të jetë më pak se ose e barabartë me m? Sehir. Kjo was-- mos-së, le hiç këtë histori. Unë nuk kërkoj këtë pyetje, sepse rreziku që unë jam duke aluduar në nuk do të ndodhë për shkak se i është gjithmonë do të jetë në rregull më i madh than--, Unë mohoj këtë pyetje. OK. Le të fokusohemi vetëm në këtë pjesë këtu. Pse unë deklaroj disa jashtë lak? Njoftimi on line 49 Unë e kam deklaruar i brenda lak, por në internet 48 Unë e kam deklaruar disa jashtë. Po. Audienca: [padëgjueshme]. Kryetari 1: Sigurisht. Pra, para së gjithash unë sigurisht nuk e bëjnë duan të deklarojnë dhe të nisja shumë me zero brendësi lak në çdo përsëritje, sepse kjo do të humbjen në mënyrë të qartë Qëllimi i mbledhur deri numrat. Unë do të të mbajtur në ndryshim vlera e kthyer në zero. Dhe gjithashtu, çfarë është një tjetër më të errët Arsyeja për të njëjtin vendim të projektimit? Po. Audienca: [padëgjueshme]. Kryetari 1: Pikërisht. Unë dua të hyni në atë jashtë e lak too në atë linjë? Më 53. Dhe në bazë të rregullit tonë e pranoj nga disa ligjërata më parë, Variablat janë scoped, me të vërtetë, për të formatimin e teksteve kaçurrel që përfshijnë ato. Pra, në qoftë se unë nuk e deklarojnë shumën brenda e këtyre formatimin e teksteve kaçurrel jashtme, Unë nuk mund ta përdorin atë në linjë 53. Vendos një mënyrë tjetër, në qoftë se unë deklaruar Shuma në këtu, apo edhe brenda Për loop, unë nuk mund të hyni në atë në 53. Ndryshueshme në mënyrë efektive do të jetë zhdukur. Pra disa arsye atje. Por tani le të kthehemi dhe të shohim se çfarë ndodh. Pra SIGMA merr quajtur. Ajo shton deri 1 plus 2, ose 1 plus 2 plus 3, dhe pastaj kthimit vlerën, dyqane se në përgjigje, dhe printf këtu është arsyeja pse unë jam duke parë në ekran. Pra, kjo është ajo që ne do të thërrasë një përsëritës qasje, ku përsëritje vetëm do të thotë duke përdorur një lak. Një Për lak, një lak, ndërsa, a bëni ndërsa loop, vetëm duke bërë diçka përsëri dhe përsëri dhe përsëri. Por SIGMA është lloj i një funksion i zoti në që unë mund të zbatojë atë ndryshe. Po në lidhje me këtë, i cili vetëm të jetë lloj i ftohtë, më lejoni të vërtetë të shpëtoj e shumë zbavitje sepse këtë funksion është me të vërtetë shumë e thjeshtë. Le të shkurtoj atë vetëm për katër linjat e saj kryesore dhe të shpëtoj të gjithë Komentet dhe formatimin e teksteve kaçurrel. Kjo është lloj i një mendje-defekt Zbatimi alternativë. Në rregull, ndoshta nuk e mendje-defekt, por kjo është lloj i sexier, të gjithë të drejtë, për të parë në këtë mënyrë shumë më shkurtimisht. Me vetëm katër rreshta të kodit, Për herë të parë e kanë këtë kontroll mendje e shëndoshë. Nëse m është më pak se ose e barabartë me zero, SIGMA nuk ka kuptim. Ajo është menduar vetëm për të qenë në ky rast për numrat pozitiv, kështu që unë jam vetëm duke shkuar për të kthehet zero në mënyrë arbitrare në mënyrë që ne të paktën të ketë disa ashtuquajturi rasti bazë. Por këtu është bukuria. Tërësia e kësaj ideje, duke shtuar numrat nga 1 deri n, ose m në këtë rast, mund të bëhet nga lloji i kaluar dollar. E pra, ajo që është shuma e 1 për të m? E pra, ju e dini se çfarë? Është e njëjtë si shuma e m plus shuma e 1 në m minus 1. E pra ju e dini se çfarë? Çfarë është SIGMA të m minus 1? E pra, në qoftë se ju lloj i ndjekin këtë logjikisht, është e njëjta si m minus 1 plus SIGMA e m minus 2. Kështu që ju mund të lloj just-- kjo është si, në qoftë se ju jeni vetëm duke u përpjekur për të fyejnë një mik dhe ata të ju pyes një pyetje, ju lloj i përgjigjet me një pyetje, ju mund të lloj të mbajtur duke kaluar dollar. Por ajo që është kryesore është se në qoftë se ju mbani duke bërë pyetje vogla dhe të vogla dhe më të vogla, ju jeni jo duke i kërkuar se çfarë është SIGMA i n, çfarë është SIGMA e n, çfarë është e SIGMA n? Ju jeni duke i kërkuar se çfarë është SIGMA i n, çfarë është SIGMA e n minus 1, çfarë është SIGMA e n minus 2? Përfundimisht pyetja juaj do të bëhet çfarë? Çfarë është SIGMA e një ose zero, disa vlera shumë të vogla, dhe sa më shpejt që ju merrni atë, mikut tuaj, ju nuk do të kërkojë njëjtën pyetje përsëri, ju jeni vetëm duke shkuar për të thënë, oh kjo është zero. Ne jeni bërë duke luajtur këtë lloj e lojës budallaqe ciklike. Pra recursion është akti në programimin e një funksion që e quan veten. Ky program, kur hartuar dhe drejtuar, është do të sillen pikërisht të njëjtën mënyrë, por ajo që është kryesore është që brenda e një funksion të quajtur SIGMA, ka një vijë e kodit ku ne jemi duke e quajtur veten, i cili normalisht do të ishte keq. Për shembull, çfarë nëse unë i parë hartuar këtë, kështu që të bëjë sigma-- bërë SIGMA 1 ./sigma-1. Numër i plotë pozitiv, ju lutem, 50 1275. Pra, çfarë funksioni duket të jetë, në bazë të një testi, të saktë. Por ajo që në qoftë se unë të marrë një pak i rrezikshëm dhe fshini të ashtuquajturin rasti bazë, dhe vetëm thonë, dhe unë jam vetëm duke e bërë kjo më e komplikuar se sa është. Le të vetëm të llogaritur SIGMA duke marrë m dhe pastaj duke shtuar në SIGMA e një m minus? E pra, çfarë do të ndodhë këtu? Le të zoom out. Le të përpiluar programin, shpëtuar atë, përpiluar programin, dhe pastaj gati ./sigma-1 zooming në, hyjë numër i plotë pozitiv, ju lutem, 50. Sa prej jush janë të gatshëm të fess deri në duke parë se? OK. Pra, kjo mund të ndodhë për një numër arsyesh, dhe sinqerisht këtë javë ne jemi gati për të ju jap më shumë prej tyre. Por në këtë rast, do të përpiqen për arsye prapa çfarë mund të ketë ndodhur këtu? Faji segmentimit, kemi thënë e kaluar koha, i referohet një segment të kujtesës. Diçka e keqe ka ndodhur. Por ajo që ishte ajo mekanikisht që shkoi shtrembër këtu për shkak të largimit tim e që të ashtuquajturin rasti bazë, ku kam kthyer një vlerë të vështirë-koduar? Çfarë mendoni se shkoi keq? Po. Audienca: [padëgjueshme]. Kryetari 1: Ah. Pyetje e mirë. Pra, nga madhësia e numrit që unë u mbledhur deri mori aq i madh se ajo tejkaluar madhësia e hapësirës kujtesës. Ide e mirë, por jo krejtësisht do të shkaktojë një përplasje. Kjo mund të shkaktojë del nga shtrati numër i plotë, ku bit vetëm rrokullisje mbi dhe pastaj ne gabim një të vërtetë të madhe numri për të si një numër negativ, por që në vetvete nuk do të shkaktojë një përplasje. Sepse në fund të ditë një int është ende 32 bit. Ju nuk jeni do të aksidentalisht vjedhin një grimë e 33. Por një mendim i mirë. Po. Audienca: [padëgjueshme]. Kryetari 1: Metoda nuk ndalet running, dhe në të vërtetë ai e quan veten përsëri dhe përsëri dhe përsëri dhe përsëri dhe përsëri, dhe asnjë nga ato funksione ndonjëherë përfundojë sepse vija e tyre e vetëm të Kodi quan themself përsëri dhe përsëri dhe përsëri. Dhe ajo që është me të vërtetë ndodh këtu, dhe tani ne mund të lloj të tërheqë këtë në pikturë. Më lejoni të shkoj në një foto për vetëm një moment. Kjo është një foto, që përfundimisht do të mishit nga në më shumë detaje, e çfarë po ndodh brenda e kujtesës e kompjuterit tuaj. Dhe kjo rezulton se në fund të kësaj foto është diçka e quajtur rafte. Kjo është një copë e kujtesës, një copë e RAM, që është përdorur vetëm në çdo kohë një funksion quhet. Çdo herë që, një programues, thërrasë një funksion, sistemit operativ, si Mac OS, Windows, apo Linux, grabs një bandë e bytes, ndoshta një disa kilobytes, ndoshta disa megabajt e kujtesës, duart e tyre për ju, dhe pastaj të lejon të ju drejtuar funksion tuaj duke përdorur çdo gjë që variabla që ju duhet. Dhe në qoftë se ju atëherë telefononi një tjetër Funksioni dhe një tjetër funksion, ju merrni një fetë e kujtesës dhe një tjetër fetë e kujtesës. Dhe me të vërtetë, në qoftë se këto tabaka gjelbër nga Annenberg prezantojnë atë kujtesës, këtu është ajo që ndodh e para herë që të telefononi funksion SIGMA. Është si të vënë një tabaka si kjo në atë që është fillimisht një rafte bosh. Por pastaj në qoftë se tabaka e quan veten, në mënyrë që të flasin, duke e quajtur një tjetër shembull i SIGMA-s, që është si të pyesësh e sistemit operativ, Ooh, duhet një memorie pak më shumë, më jepni atë. Dhe pastaj ajo merr grumbulluar në në krye. Por ajo që është kryesore këtu është se tabaka parë është ende atje, sepse ai thirret këtë tabaka dytë. Tani ndërkohë, SIGMA telefononi SIGMA, kjo është si të pyesësh për më shumë memorie. Merr grumbulluar në mbi këtu. SIGMA telefononi SIGMA, kjo është një tjetër tabaka që merr grumbulluar në këtu. Dhe në qoftë se ju mbani duke bërë këtë, përfundimisht, lloj hartë këtë vizuale në këtë tabelë, çfarë do të ndodhë me rafte e tabaka? Ajo do të kalojë shumën e kujtesës kompjuteri juaj ka. Dhe, sa më shpejt që këtë tabaka gjelbër kalon vijën horizontale mbi rafte dhe mbi atë grumbull të fjalës, të cilat ne do të kthehen në të ardhmen, që është një gjë e keqe. Tog është një tjetër segment i kujtesës, dhe në qoftë se ju le këto tabaka grumbull dhe grumbull në, ju jeni do të kalojë segment tuaj të kujtesës, dhe një program është me të vërtetë duke shkuar për të rrëzuar. Tani si një mënjanë, këtë ide e recursion, për këtë arsye, në mënyrë të qartë mund të çojë në probleme, por kjo nuk është domosdoshmërisht një gjë e keqe. Për shkak se e konsiderojnë, pas të gjithë, how-- dhe ndoshta kjo merr disa duke u përdorur të --how elegante apo sa e thjeshtë se zbatimi i SIGMA ishte. Dhe ne nuk jemi duke shkuar për të përdorur recursion të gjithë se shumë në CS50, por në CS51, dhe me të vërtetë çdo klasë ku ju manipuluar strukturat e të dhënave si pemë, ose pemë familjare, që kanë disa hierarki, kjo është super, super të dobishme. Tani, si një mënjanë, në mënyrë që ju si aspirojnë shkencëtarët kompjuterike janë të njohur me disa nga Google shaka brenda, në qoftë se ju shkoni në Google dhe ju të kërkoni atë që është Përkufizimi i, të themi, recursion, të hyjë. Uh-huh. Si një mënjanë, unë u tërhoq deri disa. Kjo ishte si 10 minuta zvarritje këtë mëngjes. Nëse ju gjithashtu Google "shtrembër", njoftimi duke e përkulur kokën slightly-- dhe atëherë kjo është ndoshta më të egër të të gjitha që dikush shpenzuar si ditën e tyre zbatimin e kësaj disa vite ago-- eja. Oh, wait-- kjo është një bug. Pra, kandidon për një nga faqet e internetit më të mëdha botërore janë këto vezë të vogla idiote Pashkëve. Ata ndoshta konsumojnë një numër jo banale i linjave të kodit vetëm në mënyrë që ne mund të kemi pak gjëra zbavitëse si kjo. Por të paktën tani ju merrni disa nga këto shaka brenda. Tani le të marrin një vështrim në disa nga bardhë shtrihet ne kemi qenë të thënë kohët e fundit, dhe të fillojnë të zhvishem përsëri disa shtresa teknikisht në mënyrë që ju të vërtetë kuptojnë çfarë po u ndodh dhe ju mund të kuptoni disa nga kërcënimet, si Shellshock, që tani kanë filluar të bëhen në ballë të gjithëve vëmendje, të paktën në media. Kështu që këtu është një funksion shumë e thjeshtë se asgjë kthimit, i pavlefshëm. Emri i tij është swap. Ajo merr në dy variablave dhe të kthehet asgjë. Merr në a dhe b. Pra, një demonstrim të shpejtë. Kemi sjellë këto deri. Ne mund edhe të marrë pak thyejnë këtu për vetëm një moment dhe kanë një diçka të vogël për të pirë. Nëse dikush nuk do mend bashkuar mua deri këtu për vetëm një moment. Si për ju në këmishë ngjyrë gështenjë? Eja lart. Vetëm një sot. Faleminderit, edhe pse. Të gjithë të drejtë, dhe ne kemi vjen që këtu? Si e keni emrin? Kryetari 4: Laura. Kryetari 1: Laura. Eja lart. Pra Laura, sfidë shumë e thjeshtë sot. Gëzohem që u njohëm yo. Të gjithë të drejtë. Pra, ne kemi disa qumësht gjatë këtu dhe ne kemi disa lëng portokalli mbi këtu dhe disa gota që ne huazuar nga Annenberg sot. Kryetari 4: huazuara. Kryetari 1: Dhe do të shkojë përpara dhe do t'ju japë një gjysmë gotë me këtë. Të gjithë të drejtë. Dhe ne do të ju jap gjysmë një gotë qumësht. Oh, dhe vetëm kështu që ju mund të mbani mend se çfarë kjo ishte si, Mu kujtua për të sjellë kjo deri dhe sot. Mirë. Në qoftë se ju nuk do mend, le të shohim, ne mund të vënë ato mbi syzet tuaja në qoftë se ju dëshironi. Kjo do të jetë bota nga sytë e Laura. Të gjithë të drejtë. Pra qëllimi juaj, duke pasur parasysh dy gota lëngshme këtu, qumësht dhe lëng portokalli, është shkëmbim dy përmbajtjen kështu që Lëng portokalli shkon në filxhan qumësht dhe qumësht shkon në filxhan lëng portokalli. Kryetari 4: A merrni një filxhan? Kryetari 1: Unë jam aq i kënaqur që ju kërkohet, edhe pse do të kishte qenë shumë më mirë pamjet në qoftë se ju nuk e kishte pyetur. Por po, ne mund t'ju ofrojmë një të tretë filxhan që është bosh, natyrisht. Të gjithë të drejtë. Pra shkëmbim përmbajtjen atje. Very nice. Shumë mirë. Ju jeni duke e bërë këtë të mrekullueshëm me kujdes. Dhe hap tre. Të gjithë të drejtë. Excellent. Një raund i madh e duartrokitje do të ishte mirë për Laura. Të gjithë të drejtë. Ne kemi një dhuratë të vogël lamtumire për ju, por më lejoni të marrë këto. Thank you so much. Pra, një shembull i thjeshtë, edhe pse, për të treguar se në qoftë se ju bëni doni të bie në ujdi përmbajtjen e dy kontejnerëve, ose le të thërrasë ata variablave, keni nevojë për disa ruajtje të përkohshme në skenë një nga përmbajtjet në mënyrë që në fakt mund të bëjë shkëmbim. Pra me të vërtetë, ky kod burim deri këtu në C është përfaqësues i pikërisht këtë. Nëse lëng portokalli ishte një dhe qumësht ishte b, dhe kemi dashur të bie në ujdi dy, ju mund të provoni diçka krijuese me derdhje njëri në tjetrin, por që ndoshta nuk do të përfundojë veçanërisht mirë. Dhe kështu që ne përdorim një filxhan të tretë, thirrje ajo tmp, T-M-P nga konventa, dhe të vënë përmbajtjen e OJ në se, më pas bie në ujdi një filxhan, pastaj FZ në kupa origjinale, duke arritjen, pikërisht si Laura bëri, swap-in. Pra, le të bëjë pikërisht këtë. Më lejoni të shkoj përpara dhe të hapur deri një shembull që është në të vërtetë quhet "jo bie në ujdi, "sepse kjo nuk është si thjesht bëhet si ju mund të mendoni. Pra, në këtë program, njoftim që Unë jam duke përdorur stdio.h, miku ynë i vjetër. Kam prototip për shkëmbim deri atje, e cila do të thotë zbatimin e saj ndoshta poshtë më poshtë, dhe le të shohim se çfarë ky kryesore Programi do të bëjë për mua. I pari deklaroj int x merr një, dhe int y merr dy. Pra, mendoj se e atyre si OJ dhe qumësht, respektivisht. Dhe atëherë unë vetëm kam një printf thënë se x është kjo dhe y është kjo, vetëm kështu unë mund vizualisht të parë se çfarë po ndodh. Pastaj unë kam printf pretenduar që unë jam shkëmbejnë dy, dhe pastaj unë të shtypura nga një pretendojnë se ata janë swapped, dhe unë të shtypura nga x dhe y përsëri. Pra, këtu poshtë në swap-i është pikërisht ajo që bëri Laura, dhe pikërisht ajo që kemi parë në ekran një moment më parë. Pra, le të shkojnë përpara dhe të të zhgënjehet rëndë. Bëni asnjë shkëmbim, dhe të drejtuar asnjë shkëmbim, zooming në në prodhim këtu. Hyjë x eshte 1, y eshte 2, shkëmbejnë swapped. x është ende 1, dhe y është ende 2. Pra, edhe pse, sinqerisht, kjo duket pikërisht pëlqen, edhe pse më shumë teknikisht, atë që bëri Laura, nuk duket për të punuar. Pra, pse është se? E pra, ajo rezulton se kur kemi shkruar një program si kjo që ka dy kryesore, theksuar këtu, dhe pastaj një tjetër funksion, si shkëmbim, theksuar këtu, të cilat ajo e quan, bota duket një diçka të vogël si këto tabaka një moment më parë. Kur së pari merr quajtur kryesore, kjo është si të pyesësh sistemit operativ për një grimë e kujtesës për çdo lokal variabla si x dhe y që ka kryesor, dhe ata përfundojnë të drejtë atje. Por në qoftë se thirrjet kryesore bie në ujdi, dhe kryesore kalon të bie në ujdi dy argumente, A dhe B, lëng portokalli dhe qumësht, kjo nuk është si dorëzimin e lëng portokalli dhe qumësht të Laura. Çfarë një kompjuter e bën, është ajo kalon kopjet e lëng portokalli dhe kopje të qumështit tek Laura, në mënyrë që çfarë është në fund të fundit brenda këtij tabaka është një vlerë dhe dy, ose OJ dhe qumësht, por kopje të saj, kështu që në këtë pikë në histori, ka është OJ dhe qumësht në secilën prej këtyre tabaka. Ka një një dhe një dy në secilën nga këto tabaka, dhe funksioni swap është me të vërtetë duke punuar. Është shkëmbejnë ato brenda e tabaka dytë larti, por që shkëmbejnë ka asnjë ndikim. Dhe në bazë të vetëm disa Parimi bazë ne kemi biseduar rreth më parë, dhe në të vërtetë vetëm disa minuta më parë, çfarë mund të shpjegojë pse ndryshon a dhe b brenda e swap nuk ka efekt në x dhe y, edhe pse I kaluar x dhe y të funksionit të shkëmbimit. Çfarë është fjala kyçe këtu se mund të thjeshtë e shpjegoni? Unë mendoj se kam dëgjuar këtu? Audienca: Kthimi. Kryetari 1: Kthehu? Jo të kthehen. Le të shkojë me një tjetër. Çfarë është ajo? Audienca: [padëgjueshme]. Kryetari 1: OK, kështu që ne mund return-- bëjnë punën e kthimit në histori, por ka një shpjegim edhe më të thjeshta. Audienca: Fusha. Kryetari 1: Fusha. Unë do të marrë qëllimin. Pra fushëveprimi, mos harroni ku x tonë dhe y deklaruar. Ata janë deklaruar brenda i kryesor drejtë deri këtu. a dhe b, ndërkohë, janë deklaruar në mënyrë efektive brenda e swap, jo fare në formatimin e teksteve kaçurrel, por ende në zonën e përgjithshme e shkëmbimit të. Dhe kështu me të vërtetë, a dhe b ekzistojnë vetëm brenda kësaj tabaka nga Annenberg, kjo copë e dytë e kodit. Pra, ne jemi me të vërtetë ndryshuar kopje, por që nuk është e vërtetë të gjithë që të dobishme. Pra, le të marrin një vështrim në ky nivel pak më të ulët. Unë jam duke shkuar për të shkuar mbrapa në Drejtoria Burimi, dhe unë jam duke shkuar për të parë zoom në këtu, dhe vetëm ta konfirmoj që unë jam në këtë dritare më e madhe terminali, Programi është ende sillet si kjo. Supozoni tani që kjo nuk është i qëllimshëm. Është e qartë se unë të kërkuar shkëmbim të punë, kështu që ajo ndihet si një bug. Tani unë mund të filloni duke shtuar një Shumë printf për kodin tim, shtypjen nga x gjatë këtu, y mbi këtu, një këtu, b mbi këtu. Por sinqerisht, kjo është ndoshta ajo që ju keni qenë duke bërë për disa javë tani, në të orarit të punës dhe në shtëpi kur punojnë në psets duke u përpjekur për të gjetur disa bugs. Por ju do të shihni, në qoftë se ju nuk e keni tashmë, se problemi vendosur tre ju fut në një komandë të quajtur Gdb, ku Gdb, Rregullues GNU, ka vetë një bandë e tërë e karakteristika që mund të vërtetë le të kuptojmë situatat si kjo, por më imponuese, zgjidhur problemet dhe për të gjetur mete. Kështu që unë jam duke shkuar për të bërë këtë. Në vend të ./noswap, unë jam në vend do të kandidojë Gdb ./noswap. Me fjalë të tjera, unë jam duke shkuar për të drejtuar tim Programi jo në Bash, miku ynë i ri sot. Unë jam duke shkuar për të drejtuar tim noswap program brenda i këtij programi tjetër të quajtur Gdb, e cila është një debugger, e cila është një program që është projektuar për të ndihmuar ju Njerëzit të gjeni dhe për të hequr bugs. Pra, nëse unë goditi Run këtu, nuk ka një shumë e tmerrshme e tekstit se ju me të vërtetë kurrë nuk keni për të lexuar. Kjo është në thelb një zbavitje nga e shpejtë, e cila Unë jam duke shkuar për të goditur Kontrollit-L për të marrë në krye atje. Kjo është Gdb shpejtë. Nëse unë dua të drejtuar këtë program tani, si ky mashtrojnë fletë të vogël në e sotme rrëshqitje sugjeron, Run është i pari urdhëron që ne do të thotë për të futur. Dhe unë jam vetëm duke shkuar për të llojit drejtuar deri këtu brenda të gdb, dhe në të vërtetë ajo u zhvillua programin tim. Tani ka disa shtesë Rezultatet e ekranit si kjo, por kjo është Gdb vetëm duke u anal dhe duke na thënë se çfarë po ndodh. Ju nuk mund të vërtetë kanë për t'u shqetësuar në lidhje me këto detaje të drejtë tani. Por ajo që është me të vërtetë e ftohtë në lidhje Gdb, po e bëra këtë again-- Kontrolli-L hap screen-- më lejoni të shkoj përpara dhe të tipit "thyejnë kryesore," në këtë mënyrë, kur unë hit Enter, duke vendosur se çfarë është quhet një pikë pushim në noswap.c, Linja 16, e cila eshte ku Gdb motive nga programin tim në të vërtetë është, funksioni im në të vërtetë është. Këtë ne do të injorojë për tani por kjo është adresa në kujtim në mënyrë specifike të këtij funksioni. Deri tani, kur unë lloji drejtuar, njoftim se çfarë është ftohtë këtu. Programi im thyen në linjë të I tha Gdb për pushim ekzekutimin në. Kështu që unë nuk duhet të ndryshojë tani kodin tim, shtoni disa printf-së, përpiluar atë, përsëritja atë, të ndryshojë, shtoni disa printf-së, shpëtuar atë, përpiluar atë, e drejtuar atë. Unë vetëm mund të ecin nëpër programin tim hap pas hapi pas hapi me shpejtësi të njeriut, jo në lloj Intel-brenda të shpejtësisë. Deri tani vini re këtë linjë duket këtu, dhe në qoftë se unë kthehem në programin tim në gedit, vini re se që është në të vërtetë Linja e parë e kodit. Ka linjë 16 në gedit. Ka linjë 16 brenda Gdb, dhe madje edhe edhe pse këtë ndërfaqe të zezë dhe të bardhë nuk është gati si përdorues miqësore, kjo do të thotë që linja 16 nuk është ekzekutuar ende, por është gati të jetë. Pra, me të vërtetë, nëse unë lloji të shtypura x, jo printf, vetëm të shtypura x, Kam marrë disa vlera fals atje e zero, sepse x nuk është nisur ende. Kështu që unë jam duke shkuar për të llojit tjetër, ose, në qoftë se ju duan të jenë të dashuroj, vetëm n për të ardhshëm. Por, kur unë lloji tjetër të hyjë, tani njoftim që shkon në linjë 17. Pra, logjikisht, në qoftë se unë kam ekzekutuar Linja 16 dhe unë tani lloji shtypura x, çfarë duhet të shoh? Një. Dhe tani kjo është pa dyshim konfuze. $ 2 është vetëm një mënyrë e sofistikuar për të, në qoftë se ju duan për të referuar në këtë vlerë më vonë, ju mund të thoni "dollar të nënshkruajë dy." Është si një referencë mbrapa. Por tani për tani, vetëm injorojnë atë. Ajo që është interesante është ajo që është në të djathtë e shenjë të barabartë. Dhe tani, nëse unë lloji tjetër përsëri dhe y të shtypura, unë duhet të shoh 2. Unë gjithashtu mund të tani të shtypura x përsëri, dhe sinqerisht, në qoftë se unë jam duke marrë një pak të hutuar se ku unë jam, unë mund të shtypni listën për listën dhe vetëm shikoni disa kontekst rreth Pika që unë jam në të vërtetë në të. Dhe tani unë mund të shtypni ardhshëm, dhe atje x është 1. Tani unë lloji tjetër. Oh, y është 2. Dhe përsëri, kjo është konfuze, sepse prodhimit Gdb-së është duke u perziere me prodhim time. Por në qoftë se ju mbani në mend, nga glancing mbrapa dhe me radhë në kodin tuaj ose hedhjen atë krah nga ana e ndoshta, ju do të shihni se me të vërtetë unë jam vetëm shkelën përmes programit tim. Por, vini re çfarë ndodh më pas, fjalë për fjalë. Ja linjë 22. Më lejoni të shkoj mbi të, duke lëvizur në deri 23, dhe në qoftë se unë të shtypura x tani, ende një. Dhe në qoftë se unë të shtypura y tani, ende një. Pra, kjo nuk është një ushtrim i dobishëm. Pra, le të bëj sërish këtë. Më lejoni të kthehem deri në lartë dhe lloji kandidojë përsëri. Dhe kjo e thënë e programit që është duke u debugged ka filluar tashmë, filluar nga fillimi. Po, le ta bëjmë këtë përsëri. Dhe këtë herë le të bëjë tjetër, tjetër, tjetër, tjetër, tjetër, por tani gjërat interesante. Tani unë dua të futemi në swap, kështu që unë nuk e tipit tjetër. Unë lloji hap, dhe tani vërejmë ka kërceu mua në linjë noswap.c 33. Nëse unë kthehem në gedit, çfarë është linjë 33? Kjo është e para aktuale linjë e kodit brenda shkëmbim. E cila është e mirë, sepse tani unë mund të lloj thes rreth dhe për të marrë kurioz se çfarë po ndodh me të vërtetë në atje. Më lejoni të shtypura tmp. Whoa. Pse tmp kanë disa çmendur, vlera fals mbeturinave? Audienca: Ajo nuk është nisur. Kryetari 1: Kjo nuk është nisur. Dhe me të vërtetë, kur ju drejtuar një program, ju jeni të dhënë një bandë e tërë e kujtesës nga sistemi operues, por qe nuk kanë nisur asnjë vlerat, kështu që çdo gjë që ju jeni bit duke parë këtu, edhe pse kjo është kjo negative çmendur e madhe numër, thjesht do të thotë se ata janë mbeturinat nga disa përdorimi i mëparshëm i kësaj RAM, edhe pse unë nuk e kanë veten e nevojshme atë ende. Deri tani unë jam duke shkuar për të shkuar përpara dhe lloji tjetër, dhe në qoftë se unë tani lloji tmp shtypura, çfarë duhet të shoh? Çfarëdo vlera e një ishte, a është argumenti i parë, vetëm si x ishte i pari gjë duke kaluar në, kështu a dhe x duhet të jetë njëjtë, kështu shtypura tmp duhet të printoni më një të tillë. Pra, ajo që ju do të shihni në grup e problemeve tre është një tutorial në terezi në Gdb, por e kuptojnë se kjo është fillimi e një vështrim në një mjet që do të vërtetë të ju ndihmojë zgjidhjen e problemeve shumë më shumë në mënyrë efektive. Ajo që ne jemi në fund të fundit do të bëjë të mërkurën po fillojnë të zhvishem përsëri disa shtresa dhe për të hequr disa rrota të trajnimit. Kjo gjë quhet string që ne kemi përdorur për disa kohë, ne do të ngadalë të marrë se larg nga ju dhe të fillojnë të flasin për diçka më shumë esoterically i njohur si char *, por ne jemi duke shkuar për të bërë këtë të bukur dhe të butë në fillim, edhe pse pointers, si ata janë të thirrur, mund të bëjë disa gjëra shumë të këqija, nëse të abuzuar, duke shikuar në një claymation të vogël nga miku ynë Nick Parlante nga Stanford Universiteti, një profesor në kompjuter shkenca që e vënë së bashku këtë vrojtim e ajo që është për të ardhur këtë mërkurën. [VIDEO Playback] -Hej, Binky. Wake up. Është koha për argëtim akrep. -Çfarë Është se? Mëso për pointers? Oh, Goody! [VIDEO END rishikim] Kryetari 1: Kjo ju pret të mërkurën. Ne do të shohim ju pastaj. [VIDEO Playback] -Dhe Tani, Thellë Mendime, nga Daven Farnham. -Pse Jemi mësuar C? Pse nuk e A +? [Qeshura] [VIDEO END rishikim]