>> [MÚSICA DE XOGO]
>> COLUMNA 1: Todo ben, esta é CS50, e este é o inicio da cuarta semana
e como xa debería ter oído ou ler, o mundo está acabando.
Indo ao redor de Internet foi de coñecemento e concienciación
dun erro nun programa, un linguaxe de programación chamada Bash.
Este foi fermoso marca como Shellshock, é a porta Bash,
pero artigos como estes Non foron pouco frecuentes.
E, de feito, moitos deles traen lembranzas de Heartbleed,
que pode ter notado na prema de novo na primavera pasada, que
foi igualmente moi dramática.
Agora, aqueles de vostedes aquí hoxe, como moitos de vostedes teñen,
mesmo se non entende o que é todo sobre, escoitou falar de Shellshock?
Todo ben, e como moitos de vós teñen ordenadores que son vulnerables?
OK, non debe ser moi, moito máis mans ata o momento, por razóns veremos.
>> Imos dar un ollo ao que está vén pasando nos medios de comunicación
e, a continuación, explicar un pouco aquí para nós tecnicamente.
>> COLUMNA 2: Os expertos en seguridade teñen advertiu que un fallo grave podería
ser de arredor de centos de afectar millóns de usuarios da rede no mundo.
Entón, cal é o erro que foi apelidado Shellshock, eo que fai?
Ben, Shellshock tamén é coñecido como o Bug Bash, o software que explota.
Hackers usan virus para escanear vulnerable sistemas rodando Linux e Unix
sistemas operativos e infecta-las.
Bash é un shell de liña de comandos.
Isto permite aos usuarios enviar comandos para lanzar programas e funcións no software
escribindo texto.
É normalmente usado por programadores, e non debe ser aberto ao mundo exterior,
aínda Shellshock cambia iso.
>> Ben, worringly, algúns analistas advirten que podería ser unha ameaza maior,
Shellshock porque permite total control dunha máquina infectada,
Considerando Heartbleed só permitiu hackers para espiar ordenadores.
É tan serio, é foi avaliado a 10 de 10
á gravidade do National Vulnerability Database.
2/3 de todos os servidores web están no risco, incluíndo algúns ordenadores Mac.
Ben, asegúrese de corrixir os seus sistemas agora.
Calquera que hóspede un sitio en funcionamento os sistemas operativos afectados
debe actuar o máis rápido posible.
Calquera que pode pagar debe ollar para a súa aplicación de seguimento e web
firewalls de ollar para calquera ataque.
Palestrante 3: A peor cousa que podería acontecer é
que alguén vai escribir un código que ía e comprobar automaticamente
Internet e afectaría todos estes computadores.
E xa que eles fan isto, así, o peor que podería facer
é simplemente borrar todo, ou pechar os sitios de abaixo.
Para que poidamos ver os danos a partir dese punto de vista,
onde teriamos persoas mal intencionadas que decide causar estragos
recollendo sistemas abaixo ou a exclusión arquivos, e cousas así.
COLUMNA 2: Algúns din que este é un dos máis difíciles de medir
erros en anos, e Pode levar semanas ou mesmo
meses para determinar o seu impacto final.
>> COLUMNA 1: Entón, todo isto é certo, pero o curioso é que, case todos
das imaxes que acaba de ver, excepto talvez o teclado,
non ten nada que ver con o erro ningún.
Servidores e fíos e así por diante, É unha especie de tanxencialmente relacionado,
pero no centro é realmente moi familiarizado o que está pasando aquí.
De feito, déixeme entrar noso aparello CS50.
Deixe-me ir adiante e dar a xanela de terminal aquí.
E vostedes teñen benvida a utilizar este, ou a versión integrada da mesma,
no gedit para escribir programas, escribir comandos, e así por diante,
e esta é en realidade, e ten foi por semanas, Bash, B-A-S-H.
Este é o Bourne-again Shell, que é só un xeito elegante de dicir,
este é un programa que ten un palpebrar rápido, eficaz,
que queda alí esperando para a entrada para ti.
E é a orde interface de liña a través da cal
Vostedes foron a execución de comandos e en definitiva, compilación e logo, executando
programas.
>> Pero Bash é tamén unha programación linguaxe no seguinte sentido.
Vostede sabe que existen comandos como cd e ls e tamén clang e outros,
pero pode definir os seus propios comandos por implementar las en Bash.
Agora non imos entrar en grandes detalles
como a bater a linguaxe de programación, pero sabe, por exemplo, que, no momento,
non hai ningún comando chamado "Ola".
Por iso, se pode atopar en un deses paquetes.
Non está instalado no meu ordenador.
Pregunta ó seu administrador.
Pero se eu quero que haxa un programa de chamado "Ola" en Bash, ou polo meu aviso,
Podo realmente usar unha sintaxe que é así como C. Non é así o mesmo,
pero parece moi semellante a un función, aínda faltan algúns detalles.
Nada parece acontecer, pero agora si escribir "Ola",
realmente pode escribir unha programa, non en C, non en Java,
non noutro programación linguaxe, pero en si Bash.
>> Agora, a clave aquí é que escribín o nome eu quería dar a esta nova orde,
e os parénteses son tamén simbólica de este ser unha función.
Como un aparte, tamén se pode facer o desfrute as cousas, e de feito, mesmo en Mac OS,
este é un programa chamado Terminal.
Vén integrado no de ninguén ordenador que teña un Mac nesta sala,
e pode facer cousas similares en Mac OS, pero pode ir máis aló.
E iso é algo tanxencial, pero é o tipo de diversión.
Remember me hoxe de mañá, cando se pensa sobre iso,
dun pequeno partido que eu adoitaba xogar cun dos ex TFS do CS50
en que en calquera momento ía a pé teclado con a súa pantalla desbloqueado,
Quere executar un comando como isso-- "dicir Hola".
E agora calquera momento el volveu para a súa teclado despois limpar a pantalla
e ía sentir, tentar facer un traballo,
consultar o contido da súa directory--
>> [AUDIO REPRODUCIÓN]
>> Alô.
Ola.
>> COLUMNA 1: Entón, para ser xusto, non era, en realidade, "Ola".
Xeralmente era algo máis parecido que--
[AUDIO REPRODUCIÓN]
-Beep.
COLUMNA 1: --aquela I would-- así que o seu ordenador fose
Xuro para el en calquera momento realmente sentouse á do teclado.
E moi rapidamente descubriu non deixar a súa pantalla desbloqueado.
Pero iso suxire o tipo de diversión estúpida que
pode ter algo como Bash.
Pero é un pouco máis serio, con certeza, que iso.
E, de feito, este é un dos A maioría dos erros perigosos e duradeiros
que realmente chegou ao mundo global.
Este erro foi en torno a preto de 20 anos,
e vai ser alcanzado en só un momento da súa relativa simplicidade.
>> Polo tanto, este é un representante manda que se
posuír un Mac, literalmente agora cando ten a súa tapa aberta,
podes probar escribir en que programa chamado Terminal.
Terminal está baixo Aplicacións Utilities--
Por primeira vez, os usuarios de Windows non ten que preocuparse tanto threat-- especial
pero aqueles de vostedes con Macs pode escribir isto nunha fiestra que vou facer aquí,
e se insire que a este programa
chamado Terminal, como eu vou facer agora, Se ves a palabra "vulnerable"
o ordenador é vulnerables á explotación.
>> Agora, o que iso realmente significa?
E este é recoñecidamente unha sintaxe moi tolo,
pero imos polo menos sacar algúns dos aspectos interesantes.
Polo tanto, hai unha sintaxe parecer algo familiarizado, polo menos, desde o C
e programación en xeral.
Vexo algúns parénteses, punto e coma, claves e tal,
pero verifícase que este cousa estúpida aquí en amarelo
é esencialmente unha función que non fai nada.
Os medios de colon facer nada, ea punto e coma significa deixar de facer nada.
Así, dentro destas claves, o feito de
que eu teño un igual asinar á esquerda, este
É, esencialmente, crear un comando ou dunha variable,
chamado x, e atribuíndolle lle que pouco amarelo de código alí.
Isto podería ser algo así como "echo Ola "ou" dicir bip "ou algo
semellante ao.
Pero teña en conta se os seus ollos vagar máis á dereita,
non hai máis a esta liña de só o fin dese punto e coma.
"Boto vulnerable", e logo ademais hai aínda máis.
Outro punto e coma, o bash-c:.
>> Entón, longa historia curta, esta liña de código é
suficiente para convincente un ordenador que se
vulnerables a facer algo que queres que faga,
porque hai un erro no que Bash aínda Bash debería deixar
liñas de lectura da dereita comando alí despois do texto amarelo,
por un ano de idade erro 20-plus, Bash foi realmente lendo
alén dese punto e coma e fermosa moi facendo o que se di.
>> Entón, cal é a implicación de que, en definitiva?
Eu só dixo "echo Ola" ou "echo vulnerable"
pero que se fixo algo realmente maliciosa, como rm-rf *,
que non pode xa escribiu anteriormente,
e, a verdade, probablemente non debe moi pronto,
porque pode facer unha moitos danos con el.
Por que?
rm fai o que, por suposto?
Eliminar.
* Significa o que?
Todo.
Polo tanto, é un chamado wild card, entón iso significa
borrar todo en o directorio actual.
r pasa para referirse recursiva, o que significa que se o que está excluíndo
é un directorio, e dentro é outros arquivos e outros directorios,
recursivamente mergullo alí e borrar todo isto.
Correo-f é o peor de todos eles.
Alguén sabe o que significa f aquí?
Force.
Así forzar os medios, incluso Se esta é unha mala idea,
facelo sen me avisar para confirmación.
Entón, vostede sabe, nós rimos iso, pero, francamente, eu probablemente
escriba isto varias veces un día, porque a realidade
é que é o camiño máis rápido para eliminar unha morea de cousas.
Pero, aínda que eu teña feito algún dano.
>> Pero se fose para enganar un ordenador para definir algunha variable estúpido
ou función chamada x, mais despois enganar o ordenador en execución
ademais dos límites desa función, ademais punto e coma,
podería realmente enganar un ordenador para realizar algo como rm-rf
ou a orde de correo ou a orde Copiar.
Calquera cousa, literalmente, pode facer co ordenador, sexa borrando arquivos,
a creación de ficheiros, enviar spam a alguén, ataca algún servidor remotamente,
se pode expresar-lo cunha orde, ten
pode enganar un ordenador para facelo.
>> Agora, o que é un exemplo de como pode facelo?
Así, hai unha morea de ordenadores no Bash internet funciona.
Todos os usuarios nos Mac están entre eles.
Unha morea de servidores Linux están entre eles tamén, e servidores Unix.
O Windows novo queda relativamente fóra do gancho
a menos que teña instalado software especial.
Agora unha morea de servidores, polo exemplo, servidores web son executados,
e, de feito, é posible que o Linux máis popular sistema operativo
para rodar en computadores en internet que están servindo páxinas da rede.
Agora, como veremos máis tarde no tempo, cando
envía unha solicitude de seu browser-- Chrome,
Internet Explorer, whatever-- para un servidor remoto,
verifícase que, a pesar de acaba de escribir www.example.com,
seu navegador está enviando unha mensaxe iso é un pouco máis escuro, como este.
>> Pero teña en conta un pouco de algo raro.
As primeiras dúas liñas Nunca vira antes,
pero eles non se parecen particularmente ameazante.
Pero teña en conta o que eu roubei para a terceira liña aquí.
Un bandido foron para enviar unha mensaxe así do seu ordenador
a un Mac ou vulnerable servidor Linux vulnerable,
o curioso é que Bash, que ventá de consola pouco simple,
é omnipresente e moitas veces é Usado para realizar esencialmente
o contido dun mensaxe que recibe.
E por esa lóxica, pode enganar un servidor web, polo que,
enviando algo parecido User-Agent, que xeralmente
se quere dicir o Nome do seu navegador.
User-Agent Chrome, User-Agent Internet Explorer, Firefox User-Agent, este
é só o seu navegador de xeito de identificarse.
Pero se un cara mal moi intelixentemente di: mm-mm, eu son
non vou dicir a vostede o meu navegador é,
Estou en vez de ir a enviarlle esta cousa enigmática-mirando cunha -rf rm
* Nel, pode literalmente enganar un servidor web vulnerable en internet
para realizar o que, en alí para borrar todos os ficheiros.
E, francamente, iso non é mesmo o peor de todo.
Podes facer calquera cousa.
Podería comezar a distribución ataque de denegación de servizo
se enviou esta mensaxe a acios enteiros de servidores web
e despois tiña todos eles descenden, para exemplo, en servidores Harvard.edu,
e pode clasificar de Bang o inferno fóra deles
por un tráfico de rede que se se non, desencadeada por unha cara mal.
>> Entón, longa historia curta, case todos nesta sala que posúe un Mac
é vulnerable a iso.
O consolo é que, a menos que é executando un servidor web no seu portátil,
e, a menos que realmente configurado para que algo así como SSH para el,
está realmente seguro.
É vulnerable, pero non é un tentando entrar no seu portátil,
así pode clasificar de estar seguro.
Con todo, Apple pronto estar a actualizar unha corrección para iso.
O mundo de Linux xa lanzou unha serie de correccións para Fedora e Ubuntu
e outras versións de Linux, e de feito se executar update 50 no dispositivo,
aínda que tamén será actualizados e corrixidos.
Pero iso tampouco ten foi realmente vulnerable,
porque a menos que ten reparou co aparello
e fixo o seu portátil publicamente accesible en Internet, o que non é
Por defecto, vostede ten en realidade, foi bo porque
de cortalumes e outras técnicas.
>> Pero é un exemplo extremo dun erro que vivimos para, literalmente, para 20
anos, e quen sabe se alguén todo este tempo souben sobre iso?
E, de feito, este é un dos os retos fundamentais
que veremos máis tarde na semestre coa seguridade,
é que, así como no mundo real, os mociños están en desvantaxe.
Para manter os bandidos fóra, temos que asegúrese de que cada porta está pechada,
que cada fiestra é segura, que todos os puntos de entrada nunha casa
é seguro para manter os bandidos fóra.
Pero o que o Vila ten que facer para realmente comprometer a súa casa
e rouba-lo?
El ou ela só ten que atopar un desbloqueado porta, unha fiestra rota, ou algo
nese sentido, e é o mesmo en seguridade de ordenadores.
Podemos escribir millóns de liñas de código de programación
e gastar centos ou miles de horas a tentar obtelo correcto,
pero se fai só un erro na corrección,
pode pór todo o sistema e en realidade, neste caso, toda a Internet
e do mundo en perigo.
>> Entón, se quere saber máis sobre iso, vai a esta URL aquí.
Non é necesario unha acción esta noite, a menos que é
entre os que máis cómodo foron executando o seu propio web
servidor, no caso de que vostede debe, que, En realidade, actualizar o seu software.
>> E este é tamén o título de un discurso e, agora, un papel,
que temos conectado na sitio do curso para hoxe.
Foi por un compañeiro chamado Ken Thompson, que
estaba aceptando un famoso premio en ciencia da computación,
e deu a este discurso de algúns anos hai, esencialmente, sobre o mesmo tema.
Preguntar persoas a pregunta, Se realmente
confianza, en definitiva, o software que lle foi dado?
Por exemplo, todos temos escribindo programas,
e estamos compilando los con tinido.
E para o seu coñecemento, escribiu calquera programa de CS50 onde hai
unha porta traseira do tipo, hai un xeito que un cara mal, se executar o programa,
podería asumir o seu ordenador?
Probablemente non, non?
Mario e Greedy e crédito.
Estes son todos moi pequenos programas.
Vostede tería que ser moi mal se o
fixo todo o seu ordenador vulnerable despois de escribir 10 ou 20 liñas de código,
ou, polo menos, algúns descoñecen das implicacións de seguridade.
Agora digo isto de broma, pero imos ver hoxe
e esta semana é realmente moi, moi fácil
ser mal e facer aínda programas curtos vulnerables.
>> Pero, polo de agora, polo menos, entender que a cuestión que se pon aquí
é sobre Clang nun compilador.
Por que fomos confiando Clang nos últimos dous ou tres semanas?
Quen vai dicir que quen escribiu Clang non tiña un "se" condición alí
que, esencialmente, inxectado algúns ceros e aqueles en cada programa que compila
que permitiría a el ou ela o acceso seu ordenador cando está durmindo
ea súa tapa do portátil é aberto e seu ordenador funciona?
Correcto?
Temos este tipo de dereito sistema de honra agora onde nós confío que Clang é legal.
Confía que o aparello é legal.
Confía en que, literalmente, todos os programas no seu Mac ou PC é de confianza.
E como este erro simple indica, mesmo se non é malicioso,
iso non é absolutamente susceptible de ser o caso.
>> Entón ten que estar asustada como o inferno.
Francamente, non hai simples solución a esta outra
que un tipo de conciencia social da crecente complexidade
que estamos a construír encima dos nosos sistemas de ordenador,
e como cada vez máis vulnerables que podería moi ben ser.
>> Agora, co que dixo, Breakout.
Entón Breakout é problema establecer tres, e Breakout é un xogo de outrora
que ten que se lembrar, pero para nós no conxunto de problemas de tres,
que nos permite tomar as cousas de volta ata un entalhe
para que, cando estamos a escribir programas, mesmo nunha fiestra de terminal como este,
podemos realmente executada, en definitiva, programas gráficos non
ao contrario dos que tivemos acceso a en perigo.
Polo tanto, este é o persoal do implantación de Breakout,
que é só iso de salto de ladrillos xogo, que mover a súa raqueta para atrás
e cara atrás, e bater na pelota contra os ladrillos de cores enriba.
Entón, iso está nos levando especie de volta a onde
, Foron capaces de ser moi rápido co Scratch, e agora con C,
implementación da nosa propia interfaces gráficas de usuario.
>> Pero máis que iso, este conxunto representa o primeiro problema
en que estamos dando ti unha morea de código.
E, de feito, eu traio explícita atención para iso, porque sobre todo
para aqueles menos cómodo, este conxunto de problemas, polo menos a primeira vista,
vai sentir como demos-se un entalhe.
Porque che dei, para algunhas das buscas
e clasificar os problemas no pset, unha morea de código que escribiu,
e un par de comentarios que din "facer",
onde ten que encher os espazos en branco.
Entón, non moi asustado, pero é a primeira vez
estamos entregando-lle un código que precisa primeiro ler, entender, e logo, engade a
e completa-lo.
>> E entón, con Breakout, imos facer o mesmo,
dándolle unha ducia de máis liñas de código que, francamente, darlle
unha gran parte do cadro de o xogo pero paran
de aplicar os ladrillos e o balón e na raqueta,
pero facemos aplicar algunhas outras características.
E, aínda que a primeira vista, unha vez máis, especialmente se menos cómodo,
Pode parecer particularmente difícil e Pensas que hai tantas novas funcións
precisa involucrar súa mente ao redor, e iso é verdade.
Pero lembre, é así como do risco.
As probabilidades son que non usar todos as pezas do puzzle en cero.
As probabilidades son que non lle importaba para embrulhar súa mente en torno de todos eles
porque todo o que tiña era unha rápida ollada para comprender, oh,
iso é o que podo facer con esta peza do puzzle.
E, de feito, o conxunto de problemas 3 spec, imos sinala-lo
na documentación que se presenta-lo a novas funcións,
e, finalmente, a programación constrúe usa.
Condicións, lazos, variables e funcións
será o mesmo que o o que vimos ata agora.
>> Entón, en realidade, o que nós imos dar vostede é un código de exemplo que
permite crear un diálogo que non parece, ao contrario diso,
e, finalmente, transformalo en algo parecido con iso.
Entón, aproveitar CS50, discutir o horario de expediente e máis,
e se consolar co feito de que a cantidade de código que ten que escribir
en realidade non é tanto así.
O primeiro reto é para aclimatar -se dalgún código que escribiu.
>> Calquera dúbida sobre pset3, Shellshock, ou doutro xeito?
>> Audiencia: Parecía que pasando con Breakout
que o código é case un estilo orientado a obxectos,
pero eu penso que era un C programa orientado a obxectos.
COLUMNA 1: Unha excelente pregunta.
Así, en mirando a través da código de distribución, o código
escribimos para pset3, para os que están familiarizados, el
Parece que é un pouco orientada a obxectos.
A resposta curta é, é.
É unha aproximación de como pode facer código orientado a obxectos utilizando
unha linguaxe como C, pero é aínda, en definitiva procesual.
Non existen métodos dentro as variables, como vai ver.
Pero lembra-se diso.
E nós imos ver este recurso novo cando chegamos ao PHP e JavaScript
ata o final do semestre.
Pero, por agora, pense nisto como unha información do que está por vir.
Boa pregunta.
Todo correcto.
Entón, merge sort era coma nós cousas deixadas por última vez.
E merge sort foi legal no sentido de que era moito máis rápido,
, Polo menos, con base nos ensaios superficiais fixemos a semana pasada, que, digamos, burbulla
tipo, a selección de clasificación, ordenación por inserción.
E o que era limpo tamén é só como forma sucinta e limpa
pode expresar la.
E o que podemos dicir que foi un superior obrigados, baixo o tempo de execución da fusión
Ordenar?
Si?
>> Audiencia: n log n?
>> COLUMNA 1: n log n, certo. n log n.
E nós imos voltar para o que isto realmente significa é de onde vén iso,
pero este foi mellor que o tempo de execución
que vimos a burbulla selección e inserción tipo?
Entón n ao cadrado. n ao cadrado é maior que iso,
e mesmo se non é evidente, sei que log n é menor que n,
por iso, se fai n veces algo menor que n,
será menor que n ao cadrado.
É un pouco de intuición alí.
Pero pagamos un prezo por iso.
Foi máis rápido, pero un tema que comezou a xurdir a semana pasada foi esa compensación.
Eu teño un mellor desenvolvemento tempo sabio, pero o que
que teño que pasar por outro banda, a fin de conseguir isto?
>> Audiencia: Memoria.
COLUMNA 1: Diga de novo?
Audiencia: Memoria.
COLUMNA 1: Memoria, ou espazo de forma máis xeral.
E non foi super obvia cos seres humanos,
pero recordar que os nosos voluntarios foron avanzando e pisando
de volta como se houbese unha matriz aquí, e como se houbese
un segundo conxunto que aquí eles poderían usar, porque
un lugar necesario para mesturar estas persoas.
Non poderiamos simplemente trocalos no lugar.
Entón, merge sort alavancagem hai máis espazo, que
nós non necesitamos os outros algoritmos,
pero a vantaxe é que é moito máis rápido.
E, francamente, no espazo do mundo real estes RAM dias--, disco duro espaço--
é relativamente barato, e por iso é non necesariamente unha cousa mala.
>> Entón, imos dar un ollo rápida, algo máis metodicamente, polo o que fixemos
e por iso que dixo que estaba n log n.
Entón aquí están os oito números ea oito voluntarios que tivemos a última vez.
E o primeiro que se funden Ordenar nos dixo para facer o que era?
Audiencia: Divídese en dous.
COLUMNA 1: Diga de novo?
Audiencia: Divídese en dous.
COLUMNA 1: Débeda en dous, seguro.
Isto lembra moito o libro de teléfono, de dividir
e conquistar máis xeral.
Entón, miramos para o lado esquerdo.
E, a continuación, xa dixemos, tipo a metade da esquerda dos elementos,
o que nós fixemos próxima dicir?
Ordena a metade esquerda da esquerda metade, o que nos permitiu,
despois de dividir en dous, concentrarse en catro e dous.
>> Como clasificar unha lista agora, en amarelo, de tamaño dous, utilizando Merge Sort?
Ben división lo ao medio, e clasificar a metade esquerda.
E este era o lugar onde as cousas quedou un pouco brevemente estúpido.
Como clasificar unha lista que é de tamaño un, como este número catro aquí?
É clasificada.
Está feito.
>> Pero entón como clasificar unha lista de un tamaño cando é o número dous?
Ben, o mesmo, pero agora o que era o terceiro eo paso fundamental na Merge Sort?
Vostede tiña que se funden á esquerda metade e metade dereita.
E xa que fixemos iso, nós miramos en catro, nós miramos para dous.
Decidimos todo ben, obviamente dous ven en primeiro lugar,
entón poñemos dous na súa lugar, seguido por catro.
E agora ten que tipo de retroceso, e iso é unha especie de característica
dun algoritmo como Unir Ordenar, retroceder na memoria.
Cal foi a liña seguinte da historia?
O que eu debería estar centrada na próxima?
A metade dereita da esquerda metade, que é de seis e oito anos.
>> Entón deixe-me pasar por este sen belaboring o punto moito.
Seis e oito, a continuación, seis son clasificadas, oito son clasificados.
Fundín-las así, e agora o seguinte gran paso
É, por suposto, ordenar a metade dereita da o primeiro paso deste algoritmo.
Entón, nos concentrados en un, tres, sete, cinco.
Nós, entón, concentrar-se na metade esquerda.
A metade esquerda do que a metade dereita que, a continuación, fundir nun e tres.
A continuación, a metade dereita, despois á esquerda metade do mesmo, a continuación, a metade dereita do mesmo.
Unir-lo, e agora o que paso permanece?
Unir o gran media esquerda eo gran metade dereita, de xeito que un vai alí en baixo,
despois dous, despois tres, despois catro, despois cinco, despois seis, despois sete, despois oito.
>> Entón agora por que isto acaba por revelar, especialmente se n máis e logaritmos
xeralmente bastante escapar de ti, polo menos na memoria recente?
Ben, teña en conta a altura desa cousa.
Tivemos oito elementos, e nós dividido por dous, por dous, por dous.
Entón rexistro base dous dos oito dános tres.
E confiar en min que, se algo vago sobre iso.
Pero rexistro base dous dos oito é tres, así fixemos tres capas de fusión.
E cando se fundiu elementos, cantos elementos
se miramos para cada unha destas liñas?
Un total de n, non?
Porque se fundir a liña superior, aínda que nós fixemos iso aos poucos,
que en definitiva, tocou en cada número unha vez.
E na segunda liña, a mesturar estas listas de tamaño dous,
tivemos que tocar cada elemento unha vez.
E entón aquí realmente claramente na última fila,
tivemos que tocar cada un destes elementos dunha vez, pero só unha vez,
entón aquí está, entón, a nosa log n n.
>> E agora só para facer as cousas un pouco máis formal só por un momento, se
eran agora analizar esta a unha especie de nivel máis alto
e tentar decidir, así como pode ir sobre expresando
o tempo de execución do algoritmo só de ollar para el e non
usando un exemplo inventado?
Ben, canto tempo diría que un paso como este en amarelo levaría,
Se n <2 retorno?
Isto é un gran O de que?
Entón, eu estou a ver un, polo que unha única etapa, quizais dúas etapas porque é se
e despois volver, pero é constante de tempo, non?
Entón nós dixemos O (1), e que se como vou expresar iso.
T, basta ter tempo de execución.
n é o tamaño da entrada, entón T (n), só un xeito elegante
de dicir que o funcionamento dado tempo de entrada de tamaño n
será na orde constante de tempo, en O (1).
>> Pero doutra banda, o que sobre iso?
Como se expresa a tempo desta liña amarela que funcionan?
T de que?
Pode tipo de fraude aquí e responder a miña pregunta cíclica.
Así, se o tempo de funcionamento en xeral que acabamos de dicir é T (n).
E agora está tipo de punt aquí e dicindo, así, só ordenar a metade esquerda,
e, a continuación, clasificar a metade dereita.
Como podemos representar simbólicamente o tempo de execución desta liña amarela?
T de que?
Cal é o tamaño da entrada?
n máis de dous.
Por que non dixo iso?
E, a continuación, esta é outra T (n / 2) e, a continuación, de novo, se eu fundir dúas metades ordenada,
cantos elementos é que eu vou ter que tocar todo?
n.
Para que eu poida expresar isto, só para ser unha especie de fantasía,
como o tempo de funcionamento en xeral.
T (n) é só o tempo de execución T (n / 2), ademais de T (n / 2), deixou metade e metade dereita,
ademais S (n), que é, probablemente, n pasos, pero quizais, se eu estou a usar dous dedos,
é o dobre pasos, pero é lineal.
É unha serie de pasos iso é un factor de n,
así podemos expresalo como este.
E é aí que agora imos chutar a traseira do noso libro de matemáticas do ensino medio
estamos en definitiva, que a recorrencia termínase igual a este, n veces log n,
se realmente facer a a matemática máis formal.
>> Entón, iso é só dúas perspectivas.
Unha numericamente cun codificado exemplo representativo
usando oito números e un máis ollo xeral como chegamos alí.
Pero o que é realmente interesante aquí é, unha vez máis, esta noción de ciclismo.
Eu non estou a usar para loops.
Eu son o tipo de definición algo en termos de si mesmo,
Non só coa presente función matemática,
pero tamén en termos de este código pseudo.
Este código pseudo é recursiva en que dúas das súas liñas
é, esencialmente, dicindo-lle para ir utilizarse para resolver un menor
problema de menor tamaño, e, a continuación, unha e outra vez
e de novo ata que tallar ata este chamado caso base.
>> Entón, imos realmente tomar un máis atractivo take-away de iso do seguinte xeito.
Deixe-me ir en gedit e un ollar para algúns dos código fonte de hoxe,
en particular, este exemplo aquí.
Sigma 0, que, ao parecer aumenta os números de un a n.
Entón imos ver o que é familiar e descoñecido aquí.
En primeiro lugar, temos un par de inclúe, polo tanto, nada novo nisto.
Prototype.
Eu son un pouco vago sobre isto despois de algúns días,
pero o que dicimos un prototipo dunha función é?
Audiencia: [inaudível].
COLUMNA 1: ¿Que é iso?
Audiencia: Nós anunciala-lo.
COLUMNA 1: Nós anunciala-lo.
Entón, está ensinando Clang, hey, non realmente aplicar iso aínda,
pero en algún lugar neste ficheiro, presuntamente, vai ser unha función chamada que?
Sigma.
E esta é só unha promesa de que que vai mirar como esta.
Vai levar un enteiro como input-- e podo ser máis explícito
e dicir int n -E é devolverá un int,
pero medio punto e coma, mm, eu vou dar a volta para aplicar esta un pouco máis tarde.
Unha vez máis, Clang é burro.
El só vai saber o que diga a el de arriba abaixo,
por iso necesitamos polo menos dar unha información do que está por vir.
>> Agora imos ollar para o principal aquí.
Imos rolar para abaixo aquí e ver o principal está facendo.
Non é que a longo dunha función, e en realidade, a construción aquí é familiar.
Eu declaro unha variable n, e despois Eu importunar o usuario novo e de novo
a un número enteiro positivo usando getInt, e só saír fóra deste circuíto
xa que o usuario teña cumprido.
Do While, que usan para importunar ao usuario dese xeito.
Agora isto é interesante.
Declaro un int chamado "resposta".
Eu atribuílo lo o valor de retorno dunha función chamada "sigma".
Eu non sei o que iso fai aínda, pero Lembro declarar que un momento atrás.
E entón eu estou pasando no valor que o usuario inseriu, n,
e entón eu informar a resposta.
Ben, imos rodar atrás por só un momento.
Imos adiante neste directorio, facer sigma 0, e realmente executar este programa
e ver que pasa.
Entón, se eu ir adiante e executar Neste programa, ./sigma-0,
e eu escribir un positivo enteiro como dous, Sigma,
como símbolo grego indica, é só vai sumar todos os números de
zerar en ata dous.
Así 0 máis 1 máis 2.
Polo tanto, este debe espero darme 3.
Isto é todo o que está facendo.
E do mesmo xeito, se eu executar isto de novo e eu darlle o número de tres,
iso é 3 + 2, de xeito que é 5, máis 1 debería darme 6.
E entón se eu ficar moito tolo e comezar a escribir en números grandes,
debe darme sumas cada vez maiores.
Entón, iso é todo.
>> Entón, o que sigma parece?
Ben, é moi sinxelo.
É como poderiamos ter implantado isto para o último par de semanas.
"Int" será o tipo de retorno.
Sigma é o nome, e hai que m dunha variable no canto de n.
Vou cambiar isto enriba.
Entón este é só unha proba de sanidade.
Vexamos por que en un momento.
Agora eu declarar outra variable, suma, inicialize-o a cero.
Entón eu teño ese loop iteración, aparentemente, para maior claridade,
desde i = 1 enriba dun m =, que é todo o que o usuario inseriu, e entón eu
incrementar a suma así.
E, a continuación, voltar a suma.
>> Así, un par de preguntas.
Un, eu afirmo no meu comentario que esta evita risco dun loop infinito.
Por que pasar en un número negativo inducir, potencialmente, un loop infinito?
>> Audiencia: Vostede non vai chegar a m.
>> COLUMNA 1: Nunca chegar m.
Pero m é pasado, entón imos Considero un exemplo simple.
Se m é pasado polo usuario como un negativo.
Independentemente do principal.
Iniciar nos protexe de iso tamén, entón eu son só
sendo moi anal con sigma tamén asegurarse de
que a entrada non pode ser negativa.
Polo tanto, se m é negativa, algo así como un negativo.
O que vai ocorrer?
Ben, eu vai se inicializar con un,
e entón eu será inferior ou igual a m?
>> Estar por.
Isto estava-- non imos, imos nix esta historia.
Eu non pedín a esta pregunta, porque o risco que estou aludindo
non vai ocorrer, porque é sempre será maior Aceptar than--,
Eu retiro a esta pregunta.
Está ben.
Imos centrar só esta parte aquí.
Por que eu declarar algún fóra do loop?
Aviso en liña 49 eu teño declarado i interior do lazo,
pero en liña 48 eu teño declarou algúns fóra.
Si.
Audiencia: [inaudível].
COLUMNA 1: Claro.
Entón, en primeiro lugar, eu certamente non quero declarar e arrincar suma
a cero no interior da circuíto en cada iteración,
porque iso ía derrotar claramente a propósito de sumar os números.
Quere estar cambiando o valor de volta a cero.
E tamén, o que é outro máis arcanos razón para esa mesma decisión deseño?
Si.
>> Audiencia: [inaudível].
COLUMNA 1: Exactamente.
Quero acceder a ela fóra do lazo tamén en que liña?
En 53.
E en base a nosa regra de ouro dende un par de conferencias atrás,
variables son alcance, realmente, ao claves que abranguen.
Entón, se eu non declarar suma dentro desas claves externas,
Eu non podo usalo na liña 53.
Dito doutro xeito, se eu declarei suma aquí, ou incluso dentro do
Para loop, eu non podía acceder a ela en 53.
A variable que efectivamente desaparecido.
Así, un par de razóns alí.
Pero agora imos volver e ver que pasa.
Entón sigma é chamada.
Engade-se 1 máis 2 ou 1 máis 2 máis 3, e logo retorna o valor,
almacena en resposta, e printf aquí É por iso que eu estou a ver na pantalla.
Entón é iso que nós imos chamar unha iterativo visión, onde só iteración
significa usar un loop.
Un loop, un loop while, un Do While loop, só facendo algo de novo
e de novo e de novo.
>> Pero sigma é un tipo de función puro en que eu podería implementar lo de forma diferente.
E sobre iso, o que só para ser ben legal,
déixeme realmente se librar dunha gran cantidade de distracción
porque esta función É realmente moi simple.
Imos tallar-lo só aos seus catro liñas centrais
e se librar de toda a comentarios e chaves.
Esta é unha especie de alucinante execución alternativa.
Todo ben, quizais non alucinante, pero é o tipo de máis sexy, todo ben,
de ollar para este moito máis sucinta.
Con só catro liñas de código, A primeira vez que teño esa proba de sanidade.
Se m é igual ou inferior a cero, sigma non ten sentido.
É só debería estar en Neste caso, a números positivos,
entón eu só vou volver cero arbitrariamente
para que, polo menos, ter algúns chamados caso base.
>> Pero aquí está a beleza.
A totalidade desa idea, engadindo que o os números entre 1 e n, ou m, neste caso,
se pode facer a través de pasar o balón.
Ben, o que é a suma de 1 a m?
Ben, vostede sabe o que?
É o mesmo que a suma de m máis a suma de 1 a menos 1 m.
Ben, vostede sabe o que?
O que hai de sigma de m menos 1?
Ben, se seguir este tipo de loxicamente, é o mesmo que m menos 1
ademais de sigma de m menos 2.
Así, pode tipo de apenas-- isto é así, se está só
intentando irritar correo e eles lle facer unha pregunta,
vostede medio que responder con unha pregunta, pode tipo de manter pasar o balón.
Pero o que é importante é que se continúa facer a pregunta menor e menor
e menor, está non preguntar o que hai de sigma
de n, o que é sigma de n, o que é sigma de n?
Está facendo o que é sigma de n, o que é sigma
de n menos 1, o que é sigma de n menos 2?
Finalmente a súa pregunta vai chegar a ser o que?
Que é de unha ou sigma cero, un valor moi pequeno,
e así que conseguir isto, o seu amigo,
non vai preguntar a mesma pregunta de novo,
está indo só para dicir, ah, é cero.
Somos feitos de xogar este tipo de xogo cíclico estúpido.
>> Entón recursividade é o acto en programación dunha función que se autodenomina.
Este programa, cando compilado e executado, é vai comportarse exactamente do mesmo xeito,
pero o que é importante é que dentro dunha función chamada sigma,
hai unha liña de código, en que estamos chamando a nós mesmos,
que normalmente se mal.
Por exemplo, se eu primeiro compilou este, así que sigma--
facer sigma 1 ./sigma-1.
Enteiro positivo, por favor, 50 1275.
Entón, cal é a función parece ser, en base a unha proba, correcta.
Pero e se eu ir un pouco perigoso e eliminar o chamado caso base,
e dicir, ben, eu só estou facendo iso é máis complicado do que é.
Imos calcular o sigma tomando m e, a continuación, engadindo
en sigma m de menos un?
Ben, o que vai pasar aquí?
Imos diminuír o zoom.
Imos recompilar o programa, salvalo, recompilar o programa,
e entón preparado ./sigma-1 ampliar, entrar enteiro positivo, por favor, 50.
Cantos de vostedes están dispostos para confesar que ver iso?
>> Está ben.
Entón isto pode ocorrer por un certo número de razóns,
e, a verdade, esta semana estamos a punto de darlle un deles.
Pero, neste caso, proba razoar atrás
o que podería acontecer aquí?
Fallo de segmentación, que dixo no último tempo, refírese a un segmento de memoria.
Algo malo ocorreu.
Pero o que era mecánicamente que non deu correcto
aquí por mor da miña retirada de que o chamado caso base,
onde volvín un valor incorporado?
¿Que pensas que deu mal?
Si.
>> Audiencia: [inaudível].
COLUMNA 1: Ah.
Boa pregunta.
Así, o tamaño do número que eu estaba resumindo
quedou tan grande que superou o tamaño do espazo de memoria.
Boa idea, pero non fundamentalmente vai causar un accidente.
Isto pode causar estourido de enteiros, onde os bits simplemente virar
e logo, nos confundimos realmente un gran número de como un número negativo,
pero iso en si non vai causar un accidente.
Porque, ao final do día un int aínda é de 32 bits.
Non vai accidentalmente roubar algo 33.
Pero un bo pensamento.
Si.
>> Audiencia: [inaudível].
COLUMNA 1: O método nunca deixa de funcionar,
e, de feito, chámase a si mesmo de novo e de novo e de novo e de novo
e unha vez máis, e ningunha as funcións de todos os tempos
rematar, pois o seu único liña de código chama a si mesmos unha e outra vez
e de novo.
E o que é realmente pasando aquí, e agora nós
pode tipo de deseñar ese pictoricamente.
Deixade-me pasar un imaxe por só un momento.
Esta é unha imaxe, que acabará por detallar
con máis detalle, do que está a suceder dentro da memoria do seu ordenador.
E verifícase que en a parte inferior da imaxe
é algo chamado de pila.
Este é un anaco de memoria, unha peza de memoria RAM,
que só é usado en calquera momento unha función é chamada.
Cada vez que, programador, chamar unha función,
o sistema operativo, como Mac OS, Windows ou Linux,
colle unha morea de bytes, quizais un poucos kilobytes, pode que algúns megabytes
de memoria, os entrega para ti, e entón permite
realizar a súa función a usar o que quere que as variables que necesitas.
E se, a continuación, chamar outro función e outra función,
comeza outra porción de memoria e outra porción de memoria.
>> E, de feito, se estas bandexas verdes de Annenberg representan a memoria,
aquí está o que acontece por primeira vez que chamar función sigma.
É como poñer nunha bandexa como esta sobre o que é inicialmente unha pila baleira.
Pero, entón, se esa bandexa chama-se, por así dicir,
chamando outra instancia de sigma, que é
como preguntar o sistema operativo, ooh, precisa un pouco máis de memoria,
me que dar.
E entón el fica amoreado en na parte superior.
Pero o que é importante aquí é que a primeira bandexa aínda está alí,
porque invocou esta segunda bandexa.
Agora, con todo, chamar sigma sigma, Isto é como preguntar a máis memoria.
Queda empilhado enriba aquí.
sigma chamar sigma, que é outro bandexa que queda empilhado aquí.
E se continúa facendo iso, finalmente, tipo de mapear este visual
para este gráfico, o que vai pasar coa pila de bandexas?
Que vai ser superior o importe de memoria do ordenador.
E así que esta bandexa verde supera a liña horizontal
arriba pila e por riba desa palabra chea, que imos volver no futuro,
que é unha cousa mala.
A pila é un diferente segmento de memoria,
e se deixar que estes bandexas de pila e pila en,
vai superar seu propio segmento de memoria,
e un programa é de feito vai fallar.
>> Agora, como un aparte, esta idea de recursividade, polo tanto,
pode claramente levar a problemas, pero non é necesariamente unha cousa mala.
Por considerar, despois todo, e quizais how--
isto leva moito tempo para se acostumar • Como a elegante ou como simple
que a posta en marcha do sigma foi.
E nós non imos usar recursão moito nos CS50,
pero en CS51, e realmente calquera clase onde manipular estruturas de datos
como árbores ou árbores genealógicas, que teñen algunha xerarquía,
el é super, super útil.
Agora, como un aparte, para que como aspirantes a científicos da computación
está familiarizado con algúns dos Google bromas, se vai a Google
e mira para o que está a definición de, digamos, a recursão, escriba.
Uh-huh.
Como un aparte, eu puxei un pouco.
Iso foi como 10 minutos de procrastinação esta mañá.
Se tamén Google "torto", previo inclinando a cabeza slightly--
e entón que é, se cadra, máis atroz de todos
sempre que alguén pasou como seu día de aplicación do presente
algúns anos ago-- imos.
Oh, wait-- iso é un erro.
>> Así sendo executado nun dos maiores sitios do mundo
son eses ovos de Pascua estúpidos.
Probablemente consumir unha número non trivial de liñas de código
só para que poidamos ter pequenas cousas divertidas como esta.
Pero polo menos agora comeza algunhas desas bromas.
>> Agora imos dar un ollo a algunhas das branco mentiras que vimos dicir nos últimos tempos,
e comezar a pelar algunhas capas tecnicamente
de xeito que realmente entender o que está pasando
e pode entender algunhas das ameazas,
como Shellshock, que xa comezou a facer
na vangarda de todo o mundo atención, polo menos nos medios de comunicación.
Entón aquí está unha función moi sinxelo que retorna nada, baleiro.
O seu nome é de intercambio.
Leva en dúas variables e el retorna nada.
Leva en ae b.
Entón, unha rápida demostración.
Trouxo estes anterior.
Podemos moi ben ter un pouco romper aquí por só un momento
e ter un pouco de algo para beber.
Se alguén non lle importaría unirse me ata aquí só por un momento.
E como a vostede coa camisa marrón?
Imos cara arriba.
Só o de hoxe.
Grazas, con todo.
Todo ben, e temos chegando que aquí?
Cal é o seu nome?
>> COLUMNA 4: Laura.
>> COLUMNA 1: Laura.
Imos cara arriba.
Entón Laura, reto moi sinxelo hoxe.
Pracer en coñece-yo.
Todo correcto.
Polo tanto, temos un pouco de leite ata aquí e temos un pouco de zume de laranxa aquí
e algúns vasos que prestado de Annenberg hoxe.
>> COLUMNA 4: prestado.
COLUMNA 1: E indo para adiante e darlle a metade dun vaso de agasallo.
Todo correcto.
E nós imos dar-lle a metade un vaso de leite.
Ah, e só para que poida lembre que este era como,
Remember me de traer iso e hoxe.
Ok.
Se non lle importa, imos ver, nós pode poñer-los sobre os seus propios lentes
se quere.
Este será o mundo de ollos de Laura.
Todo correcto.
Polo tanto, o seu obxectivo, dado dúas cuncas de líquido aquí, leite e zume de laranxa,
é cambiar os dous contidos de xeito que a zume de laranxa vai á cunca de leite
e leite pasa a o vaso de zume de laranxa.
>> COLUMNA 4: Eu recibín outro vaso?
COLUMNA 1: Estou tan feliz que preguntou, aínda que sería moito mellor rodaxe
se non tivese pedido.
Pero si, podemos ofrecer-lle un terceiro vaso que está baleiro, por suposto.
Todo correcto.
Entón cambiar o contido alí.
Moi bo.
Está facendo iso moi coidado.
E o paso tres.
Todo correcto.
Excelente.
Un gran aplauso sería bo para Laura.
Todo correcto.
Temos un pequeno agasallo de despedida para ti, pero deixe-me leva-los.
Moitas grazas.
Así, un exemplo simple, con todo, para demostrar que, se fai
quere cambiar o contido de dous recipientes,
ou imos chamalos de variables, precisa dalgún almacenamento temporal
encenar un dos contidos en que realmente pode facer o intercambio.
Entón, en realidade, este código fonte aquí en C é representativa de exactamente isto.
Se o zume de laranxa era un eo leite era b, e queriamos cambiar os dous,
podería tentar algo creativo vertendo-se unhas ás outras,
pero que seguramente non acabar particularmente ben.
E, así, usar un vaso terceira, chamada el tmp, T-M-P, por convención,
e poñer o contido do DO en que, a continuación, cambiar un vaso,
logo poñer o DO na vaso orixinais, así
acadar, exactamente como Laura fixo, o intercambio.
>> Entón, imos facer exactamente isto.
Deixe-me ir adiante e abrir -se un exemplo de que é
en realidade, chámase "non Intercambio ", porque este non é
como simplemente feito como se podería pensar.
Entón, neste programa, teña en conta que Está a usar stdio.h, o noso vello amigo.
Eu teño o prototipo para cambiar alí enriba, o que
significa a súa implementación probablemente a continuación,
e imos ver o que este principal programa vai facer por min.
A primeira vez que declarar int x recibe un, e int y recibe dous.
Entón, creo que os que DO e leite, respectivamente.
E entón eu só teño un printf dicindo x é este
e y é iso, só para que eu poida visualmente ver o que está pasando.
Así que printf reivindicando que estou cambiando os dous,
e entón eu imprimir un afirman que son trocadas,
e eu imprimir x e y de novo.
Entón, aquí en intercambio é o que Laura fixo,
e exactamente o que vimos en a pantalla dun momento atrás.
>> Entón, imos adiante e unha gran desilusión.
Non cambio, e non corre intercambio, zoom sobre a saída aquí.
Escriba x é 1, y é 2, cambiando trocados.
aínda x é 1, e y é aínda 2.
Así, aínda que, a verdade, iso parece exactamente como, aínda máis tecnicamente,
Laura o que fixo, non parece funcionar.
Entón, por que isto?
Ben, acontece que cando escribimos un programa como este
que ten tanto principal, destacamos aquí, e logo, outra función, como intercambio,
Destácanse aquí, que chama, o mundo
parece un pouco algo como estas bandexas hai pouco.
Cando principal en primeiro lugar se chama, Isto é como preguntar sistema operativo
para un pouco de memoria para calquera lugar, variables como xe y que a principal ten,
e eles acaban por aí.
Pero, se as chamadas principais cambiar, e principal pasa para intercambiar dous argumentos, a e b,
zume de laranxa e leite, non é como entregando o zume de laranxa eo leite
para Laura.
Que un ordenador fai, é pasa copias do zume de laranxa
e copias do leite para Laura, de xeito que o que é, en definitiva neste bandexa
é o valor dun e dous, ou DO e leite, pero copias dos mesmos,
de xeito que, neste punto na historia, non
é DO e leite en cada unha destas bandexas.
Hai un un e dous en cada unha destas bandexas,
ea función de intercambio é de feito a traballar.
Está cambiando-os por dentro de bandexa o segundo máis alto,
pero que a cambio non ten impacto.
E en base a só algunhas principio básico temos
falamos antes, e de feito a poucos minutos, o que
podería explicar por que cambiar a eb dentro intercambio
non ten efecto sobre xe y, aínda Pase xe y para a función de intercambio.
Cal é a palabra clave aquí que pode simplista explicar?
Creo que oín-lo aquí?
Audiencia: Return.
COLUMNA 1: Retorno?
Non volver.
Imos con outro.
¿Que é iso?
>> Audiencia: [inaudível].
>> COLUMNA 1: OK, entón return-- puidésemos facer o traballo de retorno na historia,
pero hai unha explicación aínda máis simple.
Audiencia: Scope.
COLUMNA 1: Ámbito.
Vou levar ámbito.
Entón alcance, lembre que a x e y declarada.
Están declaradas dentro de principal ata aquí.
a eb, con todo, son efectivamente declarado
dentro de intercambio, non exactamente as claves, pero aínda
na área xeral de intercambio.
E así, de feito, a e b só existen dentro desa bandexa
de Annenberg, esta segunda parte do código.
Entón, nós estamos cambiando a copia, pero iso non é realmente todo o que útil.
>> Entón, imos dar un ollo este nivel un pouco inferior.
Vou volver o directorio de orixe,
e eu estou indo para a primeira zoom aquí, e só
para confirmar que estou nesta fiestra de terminal grande,
o programa aínda está comportándose así.
Supoña agora que este non é intencional.
Claramente eu quería intercambio para traballo, polo que se sente como un erro.
Agora eu podería comezar a engadir un Moitas printf do para o meu código,
imprimir x aquí, y sobre aquí, un alí, b aquí.
Pero, francamente, iso é probablemente o que ten feito por un par de semanas
agora, no horario de oficina e na casa cando se traballa
en Serie de exercicios intentando atopar algúns erros.
Pero vai ver, se non ten, que conxunto de problemas presenta tres
para un comando chamado GDB, onde GDB, depurador GNU,
ten-se unha morea de recursos que poden, de feito,
imos entender situacións como este, pero máis convincente,
resolver problemas e atopar erros.
Entón, eu vou facer iso.
No canto de ./noswap, estou vez vai executar GDB ./noswap.
Noutras palabras, eu estou indo a executar o meu programa non en Bash, o noso novo amigo
hoxe.
Eu estou indo a executar o meu programa noswap dentro
deste outro programa chamado GDB, que é un depurador, que
é un programa que foi deseñado para axudar Vós, humanos, atopar e eliminar erros.
Entón, se eu bater correr aquí, hai unha cantidade atroz de texto
que realmente non ten que ler.
É esencialmente unha distracción a partir da liña, que
Vou bater Control-L para chegar ao cumio alí.
Este é o poder GDB.
Se eu queira executar este programa agora, como esta pequena folla de fraude en hoxe
diapositivas suxire, run é o primeiro ordena que pretendía introducir.
E eu estou indo só para escribir correr ata aquí dentro GDB,
e de feito el foi o meu programa.
Agora hai algún adicional saídas da pantalla como esta,
pero iso é GDB só sendo anal e nos dicir o que está a suceder.
Realmente non se preocupe sobre estes detalles agora mesmo.
Pero o que é realmente legal sobre GDB, se eu fai iso novamente--
Control-L limpa o screen-- déixeme ir adiante e escriba "romper principal", así,
cando prema Intro, definindo o que é chamado un punto de ruptura na noswap.c,
liña 16, que é onde GDB descubrín o meu programa, en realidade,
é, a miña función é realmente.
Isto imos ignorar por agora pero ese é o enderezo
na memoria especificamente desta función.
Entón agora cando tecleo correr, entender o que é legal aquí.
O meu programa quebra na liña I dixo GDB para deter a execución en.
Entón eu non teño que cambiar agora meu código, engadir algúns printf de, recompilar, reprise
el, cambiar, engadir algúns printf do, salvalo, recompilar, executalo.
Só podo andar a través do meu programa paso a paso a paso na velocidade humana,
non no tipo Intel dentro da velocidade.
>> Entón agora entender esta liña aparece aquí, e se eu volver
ao meu programa no gedit, entender que iso é verdade
a primeira liña de código.
Hai liña 16 en gedit.
Hai liña 16 en GDB, e mesmo aínda que esta interface en branco e negro
non é tan usuario agradable, isto significa
que a liña 16 non foi executado aínda, pero que está a piques de ser.
Entón, en realidade, se eu escribir impresión x, non printf, só print x,
Recibo algún valor falso alí de cero, porque x aínda non foi inicializado.
Entón eu vou escribir a continuación, ou, se quere ser extravagante, só n para o próximo.
Pero cando eu tecleo seguinte entra agora ter en conta que se move sobre a liña 17.
Entón, loxicamente, se eu tivera executado liña 16 e agora estou a escribir print x,
o que debo ver?
Unha.
>> E agora ese é recoñecidamente confuso.
Dous dólares é só un xeito elegante de si quero referirse a ese valor máis tarde,
pode dicir "sinal de dólar dous."
É como unha referencia para atrás.
Pero, polo de agora, só ignore-lo.
O que é interesante é o que se á dereita do signo igual.
E agora si escribir seguinte novo e imprimir y, eu debería ver 2.
Eu tamén xa pode imprimir x de novo, e, francamente,
se eu estou quedando un pouco confuso en canto ao onde estou, podo tipo de lista para lista
e só ver algún contexto arredor o punto que eu estou realmente en.
E agora podo escribir xunto, e non é x 1.
Agora eu tecleo seguinte.
Oh, y é 2.
E unha vez máis, é confuso, porque a produción do GDB
está a ser mesturados coa miña propia saída.
Pero se manter presente, por mirando cara atrás e cara adiante no seu código
ou poñendo-o para fóra do lado a banda, quizais, vai
ver que realmente eu son só percorrendo o meu programa.
>> Pero teña en conta o que pasa a continuación, literalmente.
Aquí está a liña 22.
Déixeme ir sobre el, movendo-se, así, en a 23, e se eu imprimir x agora, aínda un.
E se eu imprimir y agora, aínda un.
Polo tanto, este non é un exercicio útil.
Entón, imos refacer iso.
Déixeme volver ata o tirada superior e tipo de novo.
E está dicindo o programa que está a ser depurado
xa comezou, iniciado a partir do inicio.
Si, imos facelo de novo.
E esta vez imos facer a continuación, next, next, next, next,
pero agora as cousas comezan a estar interesantes.
Agora quero entrar intercambio, entón eu non escribir a continuación.
Eu tecleo paso, e agora entende que me saltou a liña noswap.c 33.
Se eu atrás para o gedit, o que é liña 33?
Esta é a primeira real liña de código dentro intercambio.
O que é bo, porque agora podo tipo de fuçar e estar curioso
sobre o que está pasando realmente alí.
Déixeme imprimir tmp.
Whoa.
Por que ter algún tmp tolo, valor de lixo falso?
Audiencia: Non se inicializar.
COLUMNA 1: Non se inicializar.
E, de feito, cando executar un programa, está dado unha chea de memoria
polo sistema operativo, pero non inicializou calquera valores,
entón o que está bocados ver aquí, aínda que sexa
este gran negativo tolo número, significa só
que aqueles que son os restos algún uso anterior de que a memoria RAM,
a pesar de eu non ter eu precisaba diso aínda.
Entón agora eu estou indo a ir adiante e tipo seguinte, e se eu agora escriba impresión tmp,
o que debo ver?
Sexa cal sexa o valor de a foi, un é o primeiro argumento, só
como x foi a primeira que está a ser transmitido,
así un e x debe ser o mesmo, así imprimir tmp debe imprimir-me un.
>> Entón, o que podes ver no conxunto de problemas tres é un tutorial das sortes no GDB,
pero entende que este é o comezo de un ollo a unha ferramenta que vai realmente
axudar a resolver problemas forma moito máis eficaz.
O que estamos, en última instancia fará o mércores
é comezar a descascada algunhas capas e eliminar algunhas Rodas pequenas.
Esa cousa chamada cadea que temos utilizado durante algún tempo,
imos tomar lentamente que lonxe de ti e comezar a falar
algo máis esotericamente coñecido como char *,
pero imos facelo agradable e suavemente en primeiro lugar, aínda que os punteiros,
como son chamados, poden facer algunha cousas moi malas vítimas de abuso,
mirando un pouco de claymation noso amigo Nick parlante de Stanford
Universidade, profesor en ordenador ciencia que montar ese previsualización
do que está por vir este mércores.
>> [REPRODUCIÓN]
Ei, Binky.
Acorde.
É hora de diversión punteiro.
>> -Cal Que é iso?
Máis información sobre punteiros?
Ah, que bo!
[FIN REPRODUCIÓN DE VIDEO]
COLUMNA 1: Que espera por ti en mércores.
Imos velo axiña.
[REPRODUCIÓN]
-E Agora pensamentos profundos, por Daven Farnham.
>> Por que estamos aprendendo C?
Por que non a +?
>> [Risas]
>> [FIN REPRODUCIÓN DE VIDEO]