[Powered by Google Translate] [Semana 7]
[David J. Malan - Harvard University]
[Esta é CS50. - CS50.TV]
Todo ben. Benvido de volta. Este é CS50, e este é o inicio da semana 7.
Un par de pequenos anuncios:
Pset5 está en marcha, ou en breve será,
e deixe-me dicir, moi sincero, este tende a estar entre os máis reto
de conxuntos do curso de problema, entón deixe-me falar iso agora
de xeito que esta semana máis que nunca que non espera ata que, digamos, na noite do mércores
ou xoves á noite para mergullo dentro
Esta é sempre unha pset interesante. Nós pensamos que é divertido.
Se realmente obtelo totalmente correcta e pode, entón, desafiar o Consello chamados grandes,
vai ter a oportunidade de combinar intelixencia con algúns dos funcionarios do curso
e algúns dos seus compañeiros de clase.
O que o Big Board, é unha vez que ten o seu traballo corrector ortográfico,
será capaz de ir cs50.net despois da execución dun comando,
puramente optar, a continuación, a cantidade de tempo e cantidade de RAM e máis
que usou na súa implementación serán expostos aquí na páxina do curso casa.
Vostede vai entender que unha morea desas persoas aquí están listados como equipo
desde o fin de semana, o equipo penso que sería divertido tentar superar uns ós outros.
Entón entender que o obxectivo aquí non é superar o persoal.
Aínda que eu só estou aquí, no número 13.
Puramente optar, pero é unha oportunidade para ver o quão pouca memoria RAM
e como algúns segundos de CPU pode usar vis-a-vis algúns dos seus compañeiros de clase.
>> E eu vou admitir que Kevin Michael Schmid,
actualmente na posición número 1 como un dos TFS,
Esta é unha implementación que non chaman posible
unha vez que está a usar case 0 RAM e case 0 segundo a carga.
Entón, imos coidar de Kevin desactivada. [Risas]
Hai certas habilidades que Kevin está poñendo a proba aquí.
Unha das cousas que nós pensamos en facer tamén é agora CS50x é unha semana en curso,
e vostedes son tanto unha parte dese experimento como estes estudantes son.
Pedimo lles como parte da súa pset0, que foi tamén a presentar un proxecto Scratch
de interese para eles - un xogo, unha peza interactiva de arte, unha animación ou similar -
1 - vídeo de dous minutos, se quere, dicindo Hola para o mundo e que elas realmente son.
Eu penso que eu ía compartir con vostede só un par de vídeos que foron presentados ata agora
porque para nós, no equipo, polo menos, realmente foi emocionante
e inspirado ver estas persoas de todo o mundo - países de todo o mundo -
acorde, de todas as cousas, para un curso de ciencia da computación na Internet,
se é porque eles queren continuar os seus estudos,
eles queren tomar as súas carreiras nunha nova dirección,
eles queren cubrir as lagoas no seu coñecemento,
polo tanto, algunhas das mesmas razóns que vostedes quizais teñan sido aquí.
>> Entón, eu darlle un tal estudante aquí. Vostede podería aumentar o volume un pouco.
Aquí está un dos nosos alumnos de 1 minuto submissões.
Ola, mundo. Eu son un estudante de enxeñería industrial aquí en Málaga, España.
Estou animado con este curso en liña, porque eu amo a ciencia da computación, realmente facer,
e eu realmente aprecio que eu comezar a explorar lo.
E o feito de que eu poida aprender o mesmo de todos vostedes fan
pero, en vez de estar en Harvard estou en Málaga, como impresionante é isto?
Ben, eu son Fernando, e este é o CS50. Vexo vostedes.
[Risas] Outro clip que nos gusta moito, vai considerar que este cabaleiro inglés non é tan forte.
Parece que tiña unha tradución automática, polo que as traducións son un pouco imperfecto,
pero este foi un dos nosos favoritos ata agora, tamén.
[♪ ♪]
Ola, mundo. [Falando en xaponés]
[Eu teño que cumprimentar en xaponés, porque o meu inglés é moi fiable.]
[Eu entreguei a mensaxe para ti da cidade de Gifu, no Xapón].
[I pode ser un estudante, por primeira vez en 20 anos, como se pode ver.]
[Eu son moi grata a Universidade de Harvard, que me deu a oportunidade e EDX.]
[Golf é un guitarra e miña cousa favorita en execución.] [Risas]
[♪ ♪]
[Por que pensas que eu estaba tentando asistir a unha cs50x.]
[Universidade de Harvard, é o meu desexo.]
[Especialmente se son presenza distante viviu no Xapón].
[Eu quería probar de inmediato coñecemento da existencia de tal cando EDX.]
[Non pensa que non relacionado coa idade do aprendizaxe I.]
[CS50 é o meu desexo. O meu nome é Kazu, e este é o CS50.]
[♪ ♪] [aplausos e aplausos]
Outro favorito do noso foi esta submisión aquí de alguén.
[♪ ♪] [Malan] Google se non estás familiarizado con ese meme.
>> E entón, finalmente, un par de outros que foi publicado que, quizais, gañar o premio encantador.
[Estudantes] Aww! >> [Malan] Nós imos ter que escoitar. Esta é curto, para escoitar de preto.
[Orador feminino] Cal é o seu nome? >> Louie.
[Orador feminino] O que é isto? >> [Risas] CS50. [Risas]
[Malan] El fixo dous takes, con todo.
Aquí imos nós, última.
O meu nome é Louie, e este é o CS50.
[Risas] Iso, entón, é CS50x.
Grazas a todos os que a continuación xunto na casa
que foron, ata agora, que participa.
Hoxe, podemos concluír nosa discusión de estruturas de datos,
polo menos, algúns dos máis fundamental,
e despois seguimos a nosa conversa sobre HTML e programación web.
En realidade, pasamos o pasado preto de sete semanas buscando nos fundamentos da programación -
algoritmos, estruturas de datos, e outros semellantes -
e C, como pode ter probado ata agora,
non é necesariamente o máis accesible de linguas
que a execución de algunhas desas ideas.
E así dende esta semana e na próxima semana e entón o seguinte,
imos finalmente ser capaz de transición a partir de C, a cal é xeralmente coñecida como unha lingua relativamente baixo nivel,
para cousas de máis alto nivel, entre eles PHP, Javascript, e similares,
que veremos aproveitar as mesmas leccións que aprendemos ao longo das últimas semanas,
pero vai descubrir que declarar as cousas como matrices e táboas hash e investigación e clasificación
tornar-se moito máis fácil, porque os idiomas propios imos comezar a usar
vai facer máis poderoso.
Pero, primeiro, unha proposta de árbores.
É moi común nos días de hoxe a necesidade de comprimir información.
En que contexto queres comprimir algún tipo de información dixital?
>> Si >> [Alumno] Cando precisa envialo a través de Internet.
Si, cando quere enviar algo a web.
Se desexa facer a descarga dun arquivo grande, é ideal se alguén do outro lado
comprimiu o ficheiro usando un formato zip ou algo parecido
de xeito que está enviando menos bits do que podería ser transmitidos.
Así como comprimir información?
Todo se reduce a usar menos bits que son esixidos por defecto.
Pero este é un tipo de cousa curiosa, porque pensa que volve a 0 e 1 semana
Cando falamos sobre ASCII e binario e nós conversas sobre ASCII en particular
como a utilización de 8 bits para representar as letras do alfabeto
de xeito que a letra A está representada por 65, minúsculas a é o número 97,
e con todo vostede representar o 65 ou 97, está a usar 7 ou 8 bits.
Pero o problema é que hai algunhas letras no alfabeto inglés
que non son tan populares como os outros.
Z non é todo o que popular, Q non é todo o que popular, pero A e E son super popular.
E aínda para todas estas cartas, por defecto, o mundo usa o mesmo número de bits, de só 8.
Polo tanto, non sería máis intelixente, en vez de usar 8 bits para cada letra,
mesmo o máis pouco usado como Q e Z,
o que se usássemos menos bits para A e E e S e as letras máis populares
e usados ​​máis bits para as letras menos populares,
a idea é optimizar imos para o caso común,
que é un tema en ciencia da computación de intentar optimizar o que vai ocorrer máis
e pasar un pouco máis de tempo, un pouco máis de espazo para as cousas que, si, pode ocorrer
pero non necesariamente con tanta frecuencia.
Entón, imos dar un exemplo.
>> Supoña que queremos codificar a información bastante eficiente.
Pode crecer sabendo un pouco sobre o código Morse,
e as probabilidades son que non sabía o código real,
pero ten que se lembrar que é, polo menos, esta serie de puntos e trazos.
Esta é unha codificación moi eficiente, e observe que a carta do máis popular - por exemplo, e -
utiliza a máis curta de sinais sonoros.
O código Morse é todo sobre bip-bip-bip-bip-bip-bip e seguro tons
ou por curtos períodos de tempo, ou períodos de tempo longos.
E, tal como indica o punto, é un sinal de super curta, só bip, e iso representaría E.
En contraste, T sería un bip longo, como bip [prolóngase son]
e que representaría T.
Pero iso aínda é moi curto, porque, por outra banda, se ollar para Z,
para expresar Z ía beep, beep [máis son], beep, beep [son máis curta].
Entón, é máis porque é menos común.
Pero a pegadinha aquí é que o código Morse é un pouco fallou
en que non é inmediatamente decodable.
Por exemplo, supoñamos que oe algún fin do bip fío [curto] beep [longa].
Cal é a mensaxe que eu acaba de recibir? Un punto e un guión. O que isto supón?
[Estudante] A. >> [Malan] Quizais.
Tamén podería ser seguido por T.
Noutras palabras, o código Morse, aínda aproveita este principio de optimizar o proceso de canto,
non se presta a desencriptación inmediato.
É dicir, o ser humano que está escoitando ou recibir estes puntos e trazos
ten de algunha maneira descubrir onde os intervalos son entre as letras,
porque se non sabe onde as quebras son, pode confundir un para ET ou viceversa.
>> Entón, o que podería facer? En código Morse que podería só facer unha pausa entre cada unha das letras.
Pero a pausa é unha especie de contador para o punto de acelerar as cousas.
Entón, o que en vez diso, veu con un código onde non había esa situación malo
en que E é un prefixo, por exemplo, de A -
noutras palabras, se puidésemos estar seguro de que os patróns son aínda pouco para as letras populares
tempo para as letras menos populares, pero non hai confusión posible?
Un home co nome de Huffman anos inventou ese esquema chamado de código de Huffman
que realmente aproveita unha das estruturas de datos que pasamos un pouco de tempo a falar sobre
a semana pasada, que de árbores, árbores binarias especificamente -
un significado árbore binaria que non ten máis que dous nenos.
Ten quizais un fillo esquerdo, quizais un neno dereita, e é iso.
Entón supoño que só por unha cuestión de debate que alguén queira enviar unha mensaxe
que se parece con isto. É un completo disparate, pero é composto de As, BS, CS, DS e es.
E se realmente contar a todos os As, BS, CS, DS e Es
e despois dividir polo número total de letras,
este cadro pouco aquí di que o 45% das cartas son Es, o 20% son como,
10% BS, e así por diante.
Polo tanto, noutras palabras, asumir que a cadea alí
é só unha mensaxe que quere enviar.
El pasa a ser un disparate só así podemos utilizar como letras como sexa posible,
pero é verdade que permanece é o máis popular,
e B e C son as menos populares, polo menos, unha destas 5 letras do alfabeto.
Entón, como podemos ir en chegar cunha codificación,
unha codificación binaria, un patrón de 0 e 1 para cada unha desas cartas
de tal xeito que E é un estándar de curto e quizais B e C son patróns lixeiramente máis longos,
de novo, a idea de que queremos usar menos bits maior parte do tempo
e máis bits só de cando en vez.
De acordo co código de Huffman, podes crear un bosque de árbores.
Hai unha especie de unha historia aquí que implica árbores e tamén o proceso de construción de los.
Imos comezar.
>> Propoño que comece con esta fraga, por así dicir, de 5 árbores,
cada un dos cales é unha árbore moi estúpido.
A árbore está composto por só un único nodo, coma representado aquí por un círculo.
Así, cada unha desas cousas pode ser un struct C
e dentro da estrutura C pode ser un float representando a conta de frecuencia
e despois quizais un char que representa a letra.
Entón, creo que un deses nós como só struct C calquera idade, pero, por agora, de nivel superior.
Esta é unha selva de 5 árbores, cada un dos que só teñen un único nodo.
O Huffman proposta é que comezamos a combinar esas árbores
que teñen as menores contas de frecuencia un pouco maior en árbores
ligando-os con un nodo raíz nova.
Así, entre as letras aquí, observe que, por conveniencia eu clasificados los de esquerda a dereita,
a pesar de que non é estrictamente necesario, e observe que os menores nós
son actualmente o 10% e 10%.
Entón Huffman propuxo que mesturar estas dúas menores nós nunha nova árbore
pola introdución dun novo nodo pai e despois dar ese pai dun neno esquerdo e un dereito do neno
onde B é arbitrariamente a esquerda e C é arbitrariamente a dereita.
E entón Huffman aínda proposto que imos agora só de pensar no fillo esquerdo
nunha desas árbores sempre como representado por 0
e do dereito do neno sempre como representado polo número 1.
>> Non importa se lanza-los, sempre que é consistente.
Polo tanto, agora temos catro árbores no bosque.
E digo catro porque agora a árbore á esquerda -
e non é tanto unha árbore no sentido de que ela medra deste xeito,
é máis como unha árbore de familia onde agora o 0.2 é unha especie de pai dos dous fillos -
conta que, no que pai temos deseñado 0,2.
Nós engadimos a conta de frecuencia dos dous fillos e dado o novo nodo a suma total.
Entón agora só repetir ese proceso.
Atopar as dúas menores nós e despois uni-los nunha nova árbore
e repita o proceso aínda máis.
Agora temos algúns candidatos, 20%, 15%, e outros 20%.
Neste caso, temos que romper o empate. Podemos facelo de forma arbitraria.
Debemos facelo só de forma consistente.
Neste caso, eu vou arbitrariamente ir co outro á esquerda,
e eu agora fusionar o 20% e os 15% para me dar un novo pai chamou 35%,
cuxo esquerda neno é 0, cuxo dereito é un neno, e agora temos tres árbores no bosque.
Podes, se cadra, ver onde iso vai dar.
Se repetirmos esta máis algunhas veces, nós imos ter só unha árbore grande,
todos cuxas beiras están rotulados coa 0s e 1s.
Imos facelo de novo.
35% é a raíz que árbore. 20% e 45%, polo que estamos indo a mesturar a 35% e 20%.
Agora temos esa árbore aquí. Nós engadimos os xuntos, temos 55%.
Agora só hai dúas árbores no bosque.
Facemos isto unha última vez, e espero que matematicamente todas as frecuencias suman
porque eles deben xa que calculados a partir da-go de sumar o 100%.
E agora temos unha árbore.
Polo tanto, esta é unha árbore de Huffman codificación.
É o tipo de tardou un pouco para chegar alí verbalmente, pero a realidade é un loop
ou cunha función recursiva, pode construír esta cousa moi rápido.
Polo tanto, agora temos un novo nodo, e todos estes nós internos foron malloc'd,
presuntamente, ao longo do camiño.
Entón agora, na parte superior desta árbore temos o 100%, pero agora conta que temos un camiño
desta nova gran-gran-gran-avó para todas as gran-gran-gran-netos
todo o camiño para o fondo, para todas as follas.
>> O que imos facer agora é propoñer que, a fin de representar a letra E,
simplemente usar o número 1. Por que?
Porque se cruzar esta árbore a partir da raíz final ata a folla coñecido como E,
seguimos só a punta, a bordo da dereita, e que é rotulado de curso superior en dereito 1.
Así, a implicación aquí para Huffman foi que a codificación e en binario debe ser só unha.
E iso é moi moi eficiente. Non pode realmente ficar menor do que iso.
En cambio, un vai ser representado, se seguir a lóxica,
por que patrón de bits en vez? 01.
Así, para obter a A, comezamos na raíz e vaia á esquerda e despois vaia á dereita,
o que significa que seguiu a 0 e, a continuación, un 1.
Así, deberán representar a letra A co estándar 0 e 1.
E agora entende que xa temos unha propiedade de desencriptación inmediata
que nós non temos en código Morse.
Aínda que ambos os estándares son bastante curto - E un pouco, un é de 2 bits -
conta que non poden ser confundidas un ou o outro,
porque se ve un un que ten que ser un E, se ves un 0, un 1 é, obviamente, ten que ser un A.
Do mesmo xeito, o que hai de D? 001.
¿Que é C? 0001.
E o que é B? 0000.
E, de novo, porque todas as cartas que preocupan son as follas
e ningún deles son unha especie de intermediarios no camiño da raíz ata a folla,
non hai risco de confundir codificacións dúas letras 'diferentes
porque todos eses patróns de bits son deterministas.
0000 será sempre B.
Non hai no nalgún lugar entre o que pode confundir unha carta para o outro.
Entón, cal é a implicación aquí?
>> A carta máis popular - neste caso é - quedou máis curto de codificación,
Un quedou a codificación máis baixo seguinte,
e B e C, que xa sabía do tipo get-go foron dos menos populares
a frecuencia do 10% cada un, eles obtiveron o maior codificación.
E entón o que isto significa que agora é que se quere enviar unha mensaxe de que é comprimido
a través de Internet ou por correo electrónico ou semellante,
en vez de usar ASCII estándar, pode enviar unha mensaxe codificada Huffman
a través do cal se pretende enviar a letra E, envía un único bit.
Se queres enviar un A, envía 2 bits, 01, en vez de enviar 8 bits
seguidos de máis 8 bits seguidos por máis 8 bits e así por diante.
Pero hai unha pegadinha aquí.
Non é suficiente só para construír esta árbore e, a continuación, iniciar o envío de Alicia para Bob
o estándar máis curto pouco, cadea de ASCII,
Alicia tamén porque ten que saber Bob daquilo
Bob vai ser capaz de ler a súa mensaxe comprimido?
[Resposta do alumno inaudível] >> ¿Que é iso?
[Resposta do alumno inaudível] >> de que a árbore é.
Ou aínda máis especificamente, o que estas codificacións son,
especialmente porque durante esta historia que fixo un xuízo nun punto.
Lembre que tivemos que elixir arbitrariamente entre os dous diferentes nós do 20%?
Polo tanto, non é o caso de que Bob, o destinatario, pode só reconstruír a árbore na súa propia
porque quizais el vai crear a árbore levemente diferente de Alicia.
Ademais, Bob aínda non sabe o que a mensaxe orixinal é
porque o único que Alicia está enviándolle, por suposto, é a mensaxe de comprimidos.
>> Así, a captura con compresión coma este é que, si, Alicia pode gardar un monte de bits
enviando 1 a E e 01 para A e así por diante,
pero ela tamén ten que saber o que Bob é o mapeamento entre as letras e os bits
porque non pode confiar en só claramente ASCII máis se non estamos usando ASCII.
Entón, ela pode enviarlle a árbore de algunha maneira -
anota-la, garde-como datos binarios, ou algo así -
ou só enviar-lle unha folla de fraude pouco, un arquivo de Excel, que mostra os mapeamento.
Así, a eficacia de compresión realmente asume que as mensaxes que está enviando
son moi grandes, polo menos, de medio porte,
porque se está enviando unha mensaxe super curto,
se quere só para enviar a mensaxe BAD, que pasa a ser unha palabra que pode significar aquí,
B-A-D, probablemente vai usar menos bits,
pero o problema é se tamén ten que saber Bob o que a árbore é
ou o que estas codificacións son, vai probablemente superan todas as economías
de ter as cousas comprimido para comezar.
Entón pode realmente ser o caso de que se tentar comprimir
mesmo con algo formatos zip ou arquivo que pode estar familiarizado co -
arquivos moi pequenos, incluso arquivos baleiros -
ás veces, estes arquivos poden ser maior e non menor.
Pero, realista, o que pasa só para arquivos pequenos,
por iso non vai facer que un arquivo Gigabyte ser de 2 gigabytes;
estamos realmente fala máis ou só un par de kilobytes.
>> Algúns programas como zip son intelixentes o suficiente para entender que,
"Vai gastar máis bits comprimir iso."
"Deixe-me incomoda comprimi-lo para ti en todo."
Polo tanto, esta é só unha forma de comprimir a continuación, formato de texto.
Nós poderiamos aplicar algo así en C.
Por exemplo, aquí é como podemos representar un nó na árbore
onde temos un char para o símbolo, un valor flotante para a frecuencia,
e, como vimos cos nosos estruturas de datos, outros dous punteiros,
1 para o fillo esquerdo, un á dereita, sendo que ambos poden ser NULL,
pero se non, el se refire a un neno esquerdo e un dereito do neno.
Polo tanto, este é, entón, Huffman, e é unha maneira que pode ir sobre a comprimir información,
e é certamente un dos máis fáciles de aplicar
no contexto, por exemplo, as estruturas de datos da última semana,
aínda mesmo algoritmos máis sofisticados existir
que poden facer mutacións aínda máis sofisticadas dos seus datos.
Algunha preguntas, entón en árbores, árbores binarias, ou compresión de texto?
[Estudante] Existe algunha ambigüidade, como dividir [inaudível] o 01,
entón 011 sería ambiguo, non?
[Inaudível] >> Boa pregunta. Ambigüidade.
Deixe-me resumir referíndose a este cadro aquí.
Como os caracteres que está comprimindo, as representacións de,
por definición deste algoritmo permanecer sempre as follas,
nunca vai utilizar accidentalmente o mesmo patrón de bits para o prefixo de varias letras.
Polo tanto, noutras palabras, está preocupado, parece que, dunha ambigüidade que proviña
en que 001 pode ser o inicio de B ou o inicio de C ou algo así.
Pero iso non pode ser o caso porque aviso de que todas as letras do alfabeto que está codificando
son as follas.
>> A ambigüidade só pode xurdir, como no caso do código Morse,
se, por exemplo, C estaba en algún lugar ao longo do camiño da raíz ata B.
[Estudante] Dereito. Así, neste caso, por exemplo un ten 2 follas. Diga >> A ten - Indicar iso de novo.
[Estudante] Indicar A ten dúas follas, F e G, e entón g - >> Certo. Pero non pode.
A ti non podería ter follas F e G, porque esas letras F e G
elas propias ser deixa lugar á esquerda ou á dereita B de E.
Así, por definición, estes deben ser follas.
Se non, está absolutamente correcto, non resolvemos o problema que enfronta o código Morse.
Boa pregunta. Outras preguntas? Todo ben.
Esta noción de bits, verifícase que xa tiña poder todo o tempo que non temos realmente usado
cando se trataba de manipular eses 0s e 1s.
Preguntas sobre iso nun dos conxuntos máis antigos problemas:
ou sexa, como vai facer sobre a conversión de maiúsculas a minúsculas e viceversa?
Ou, máis concretamente, un deses serie de exercicios primeiro preguntou
cantos bits realmente ten que virar a fin de cambiar un en minúscula unha ou viceversa?
Aquí está un recordatorio rápido que 65 e 97 parece en binario.
E aínda que esa pregunta ten a sorte de desvaneceu na súa memoria,
podes ver de novo aquí que cantos bits ten que ser invertida
para cambiar maiúsculo para minúsculas unha? Só un.
>> Eles só difiren nun único lugar, o terceiro bit desde a esquerda.
Considerando a ten un 010, un pouco un 011.
Entón, dalgunha forma, necesitamos só ser capaz de virar ese bocado,
e entón podemos capitalizar ou minúsculas.
Nós fixemos iso no pasado usando efectivamente, se as condicións
e comprobar que a letra está entre capitais A e Z capital,
a continuación, saídas como a - a + 26 ou algo así.
Probablemente fixo un cambio de aritmética para as letras do alfabeto.
Pero o que si puidésemos virar que un único bit?
Como podería ir sobre a toma de vale un byte de 8 bits, así como anacos 01000001 e 01100001?
Se tivese os patróns de bits, como podemos ir sobre o cambio de só un deles?
O que se presentar en amarelo Velaí outro patrón de bits?
Se eu fai toda a 0s cordas amarela excepto para o pouco que quero cambiar
e entón eu introducir un novo operador coñecido como un operador bit a bit -
bit a bit, no sentido de que opera en anacos individuais,
non sobre un byte completo ou catro bytes dunha soa vez.
Esta barra vertical alí en amarelo suxire que o que se tomamos a representación do capital dunha
e bits a bit OR-lo con a secuencia de bits amarelo?
Noutras palabras, creo que volver á nosa discusión de expresións booleanas en scratch e despois en C.
>> Facendo un booleano ou significa que, para ser certo, ou o primeiro que ten que ser feito
ou a segunda cousa que ten que ser certo ou ambos teñen que ser verdade,
e, a continuación, o produto resultante é, en si certa.
Neste caso aquí, que é o que imos chegar, se tomamos 0 "ou" ed con 0? Falsa ou falsa?
Aínda é falso, entón a unha minúscula permanece como o esperado.
E se en vez diso, facer 1 ou 0?
Este agora queda 1, pero entender o que está a ocorrer aquí.
Se comezar con A maiúsculo e seguimos a "ou" os seus bits individuais como estamos facendo aquí,
0 ou amarelo nos dá o que aquí? Isto dá-nos unha.
De feito, supoña que non sabía o que a versión en maiúsculas pouco un realmente era.
Imos facelo. Deixe-me pasar esta de volta aquí.
Imos facer iso de novo. 0 ou 0 dáme 0.
1 ou 0 dáme un.
0 ou 1 me dá 1.
0 ou 0 dáme 0. O seguinte é 0, a próxima é de 0, o seguinte é 0.
1 ou 0 dáme un.
E por iso mesmo que nós non sabiamos de antemán o que era un minúsculas,
simplemente por "ou" ing A este patrón de bits que temos aquí presentados en amarelo,
pode minúsculas un capital Un virando o bit.
Usan esta expresión semanas: apertar un pouco.
Como realmente facer iso programaticamente?
Vostede usa o que é xeralmente chamado de máscara, unha secuencia de bits,
que neste caso só acontece a ollar como este número aquí,
e entón "ou" iso en conxunto, utilizando este operador C nova,
non | |, usa un único | e realmente obter esa resposta aquí por que?
Este é o lugar 1s, 2s lugar, 16S 4s, 8s, 32s.
Así, verifícase que se aproveitar unha letra maiúscula A e OU bit a bit co 32 enteiro,
porque o 32 enteiro, cando mira para el como bits, mira como este,
Isto significa que pode virar o pouco que realmente quere.
E do mesmo xeito - e nós imos ollar para o código en só un momento -
Supoña que queremos ir na outra dirección.
>> Como vai de capital dunha minúscula para a? Que pouco ten que cambiar?
É o mesmo.
Queremos cambiar isto a partir dun terceiro bit 1 a 0.
E como podemos facer sobre iso?
Como podemos apagar un pouco? Co estándar de bits pode desactivar un pouco?
E se a xente medio que inverta a máscara?
Considerando que, antes, fixemos os 0s máscara toda amarela
excepto para o pouco que queriamos conectar,
E desta vez, nós facemos o 1s máscara enteira, excepto para o pouco que queremos para desactivar
e, a continuación, usar o que operador?
E se nós "e" as cousas? Imos dar un ollo.
Agora virar para iso, supoña que de novo eu crear unha máscara que é todo 1s
excepto para o pouco que eu queira desactivar
e despois, no canto de "ou" os números brancos enriba cos números amarelos ata aquí,
e eu, en vez "e" eles xuntos? É chamado un bit a bit e.
Loxicamente, é a mesma cousa que un Boolean e.
Isto dáme 0 e 1 e 0. Tan falso e certo é falso.
Certa e verdadeira é certo.
E aquí está a máxica: o verdadeiro eo falso agora falso, polo que temos que apagado pouco.
E agora o resto da historia é un pouco simple.
Unha vez que o resto da máscara está 1s, non importa cal os números están en branco.
Cando "e" algo certo, non vai cambiar o seu valor.
Se é verdade, permanecerá certo. Se era falsa, permanecerá falsa.
>> Pero a maxia acontece cando toma algo que era certo
e entón "e" con teito.
Isto ten o efecto de que o bit de apagar.
Así, unha enigmática pouco alí.
Imos realmente ollar para un código, o que realmente pode ollar aínda máis enigmático,
pero imos dar un ollo aquí tolower.
Se eu ollar para tolower, pasando de capital dun para letras minúsculas a,
imos ver como podemos aplicar este programa.
Aquí está o principal, e non está tomando calquera argumentos de liña de comandos.
Estou declarando un carácter C para a letra que o usuario vai escribir dentro
Eu, entón, usar un do lazo familiar mentres só para asegurarse de que o usuario sempre me dá un A maiúsculo
ou B ou C. .. Z, de xeito que me dea algo entre A e Z.
E agora o que eu estou facendo aquí?
Eu son "ou" ing iso con 0x20, pero que en realidade é o mesmo que -
e imos voltar a iso nun momento - 32.
Entón, de novo, 32 e este patrón de bits aquí. Por que saber iso?
Basta pensar de volta para semana 0.
Este é o lugar 1s, 2s lugar, 4s, 8s, 16S, 32s lugar.
Polo tanto, este número amarelo pasa a ser 32.
Podo, entón, tomar unha carta como char aquí, bit a bit "ou" iso literalmente co número 32,
eo que podo volver? A versión minúscula que char.
Hai intres, porén, eu expresei iso nunha notación de base diferente.
O que isto supón? >> [Alumno] hexadecimal.
[Malan] Isto acontece para representar hexadecimal.
Nós non falamos sobre hexadecimal tanto así,
pero é realmente cómodo en casos como este.
>> Aínda que parece máis complexo e, aínda que parece que o 20 e non 32,
verifícase que é na verdade a notación hexadecimal super cómodo
porque en hexadecimal todos os díxitos despois do 0x - e iso non significa nada;
iso é só unha convención humana que di que aquí vén un número hexadecimal -
cada un destes díxitos, a 2 e, a continuación, a 0, en si poden ser representados
con exactamente 4 bits.
Entón, se facemos iso, deixe-me abrir un editor de texto aquí - raro autocomplete -
Se facemos un editor de texto pouco aquí, o 0x20 número significa aquí é de 4 bits, aquí está máis 4 bits.
Imos facer os 4 bits máis á dereita en primeiro lugar.
0 cando representado con 4 bits é o que? Super doado. Só 0s todos.
Entón 4 bits como 0s.
Como representar 2? Foi un tempo dende que fixen iso, pero é 0100.
Polo tanto, este é o lugar 1s, este é o lugar 2s, e entón non importa o que os outros lugares son.
Noutras palabras, en hexadecimal pode dicir 0x20,
pero se pensar entón sobre o que é a 2 e como é representado en binario,
cal é a 0 e como é representado en binario,
as respostas a estas preguntas son este e este, respectivamente.
Entón 0x20 acontece para representar ese patrón de 8 bits,
que é precisamente a máscara que queriamos.
Polo tanto, este é o momento só un exercicio intelectual,
pero a realidade está no código é tipicamente máis común para escribir constantes como esta
en hexadecimal, a continuación, xa que o programador pode de xeito relativamente doado,
aínda que se esixe un pouco de papel e lapis, descubrir o que o patrón de bits é
porque non pode simplemente expresar 0s e 1s normalmente no código.
Vostede non pode ir 00010 e así por diante.
>> Ten que escoller notacións decimal ou hexadecimal ou octal ou outro.
A maioría das persoas tenden a elixir hexadecimal simplemente para que cada díxito representa 4 bits
e pode facer esa matemática rápida.
E eu vou acenar a miña man a toupper, que é case o mesmo, parece case idéntico.
Toupper pasa de usar non o operador ou mais este cara e DF.
O que representan DF? DF? Alguén? >> [Alumno] 255.
255? 255 non. Iso sería ss.
Imos deixar este como un pouco de exercicio.
Pero se vai de 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 e entón o que vén despois de 9?
Somos o tipo de fóra de díxitos decimais, pero en hexadecimal o que vén despois de 9?
[Estudante] a. Entón >> a, b, c, d.
Pode descubrir a partir de aí o patrón de bits d realmente representa.
E se facemos as contas, veremos que a máscara que acabar quedando atrás é idéntico a este.
Trátase de f, todos 1s, e este é d. Entón DF representa a máscara. Todo ben.
E, por último, para non facer as cousas de son super, super técnica,
Pero supoña que quería escribir un programa que fai isto.
Deixe-me ir adiante e facer binario, que é un programa nun arquivo chamado binary.c.
E agora déixeme executar binarios e me dar un número enteiro non negativo.
Imos comezar fácil e escriba 0.
Isto agora é un programa que imprime un enteiro na súa representación binaria.
Entón, se eu xogar este xogo de novo e escriba en só unha, eu debería ter unha representación de 32 bits do 1.
Se eu fai iso de novo con dous, eu entendo iso.
Se eu fai 7, eu debería ter un 1s poucos ao final, e así por diante.
Acontece Digo isto porque, con operacións bit a bit
pode realmente facer outra cousa tamén.
Pode crear esas máscaras dinamicamente.
Bótalle un ollo neste exemplo unha final inclúen operacións bit a bit.
Aquí está a primeira parte do código, solicitar ó usuario un número,
e insiste en que me dea un número enteiro non negativo.
Entón ese é tipo de cousas vella escola.
Pero aquí é algo que é ben interesante.
>> ¿Como ir sobre a impresión de un número en binario?
A primeira iteração de que para que?
Que é o tamaño dun int tipicamente, polo menos, no interior do aparello? >> [Alumno] 4.
E 4. Entón, 4 * 8 é de 32 - 1 é 31.
Entón, se eu estou empezando a contar a partir de 31, que representa, ao parecer,
só conceptualmente, o bit 31 ou pouco máis alta orde, que é este cara aquí,
Considerando que este vai ser 0 bits.
Polo tanto, esta é pouco 01 ... 31 bits.
Entón o que está facendo este código?
Teña en conta que este lazo for, aínda que pareza enigmático, é só a iteração de 31 a 0. É iso aí.
Así, a parte interesante agora debe estar neses cinco liñas aquí.
Teña en conta que nesa liña que eu estou declarando unha máscara variable chamada
para ser coherente coa nosa historia deses números amarelos.
E entón que é o que está facendo?
Este é outro operador bit a bit non vimos antes, o máis probable.
É o operador de desprazamento cara á esquerda.
Este operador fai iso.
Aquí está o número 1, e se fai eu deixei cambio, desvío á esquerda,
¿Que pensas que ten o efecto de facer que un individuo?
Literalmente desprazándose o.
Entón, se o número 1 é o que ten na esquerda e comeza por arrincar I a 31,
que é o que vai facer? El vai levar este número 1 e cambie-31 lugares por aquí.
E porque non hai, obviamente, non os outros díxitos detrás del,
aqueles por defecto será substituído con 0s.
Entón vai comezar co número 1, o que naturalmente se parece iso -
e deixe-me aproveitar iso aquí no centro.
E entón, como cambia as cousas para a esquerda, este cara vai esencialmente desa forma.
Pero así que fai iso, un 0 é cuberto dentro
Se transferir-lo unha segunda vez, que vai para un lado e outro 0 é cuberto dentro
>> Cambia de novo e despois outro 0 é cuberto dentro
Entón, se fai esa cousa de 1 << i 31 prazas, que acaban recibindo unha máscara
que é de 32 carácteres, o que máis á esquerda do que é o 1,
todo o resto dos cales son un 0.
E non é que, como un aparte, cambiando un número para a esquerda como esta
tamén casualmente, e por veces conveniente,
ten o efecto de facer o que para ese número? >> [Alumno] dobrando-lo.
Dobrar porque cada unha das columnas - o lugar 1s, 2s lugar, lugar 4s,
Lugar 8s, 16S lugar - eles están todos de duplicación que vaia á esquerda.
Ou mellor, cando cambiar a 1s vai acabar dobrando o valor do número.
Pode acabar facendo transformacións interesantes de díxitos
cambiando todo máis desta forma por potencias de 2.
Entón, como funciona isto?
Iso, entón, dáme unha máscara que é todo 0s excepto por un 1 en lugar precisamente o que quero,
e entón esta expresión, que é roubado de toupper.c,
está simplemente dicindo que o número n que o usuario introduciu,
"E" é con esa máscara, eo que é o que vai conseguir?
Está indo para obter un 1 se hai un 1 no que a situación enmascarado,
ou está indo para obter un 0 se non hai.
E así todo o programa este que efectivamente é que ten un loop,
e crea unha máscara cun 1 por aquí, entón a 1 para acá, entón a 1 para acá,
e el utiliza este bit a bit e truco para dicir que hai un bit 1 na entrada do usuario aquí?
>> Existe un bit 1 na entrada do usuario aquí? E se é así, literalmente imprimir un, senón imprimir 0.
Estamos facendo iso con ints só porque é por iso que nós estamos facendo 32 bits en lugar de 8,
pero o que nós introducimos é este bit a bit e, este bit a bit OR,
e este desvío á esquerda do operador, o que moitas veces non son moi útiles,
pero acontece que poden ser.
En realidade, se fose a representar algo así como un array de booleanos
só para representar verdadeiro ou falso, supoña que queira seguir ou non
unha sala chea de 300 alumnos está presente,
pode declarar unha matriz de tamaño 300 do tipo bool para que obteña 300 bools,
e pode definir cada cara true se alguén está aquí e falso en caso contrario.
Por que a representación en que a estrutura de datos ineficiente?
O que é malo sobre o proxecto de que a estrutura de datos, un conxunto de 300 bools?
¿Que é un bool, en realidade, por baixo do capuz?
Isto, tamén, é algo que pode non estar familiarizado.
Acontece que non hai bool.
Lembre que tipo de creada que co arquivo cs50.h,
que á súa vez inclúe bool estándar.
C é o tipo de muda, pero cando se trata de bool.
El usa 8 bits para representar todos os bool, que é completamente inútil
porque, obviamente, cantos bits que precisa para representar un bool? Só 1.
Así, verifícase que se agora ten a habilidade cos operadores bit a bit
para manipular bits individuais, mesmo nun char, mesmo en un único byte,
non é que pode diminuír a memoria necesaria para representar algo estúpido
así a estrutura de datos denominada frecuencia por un factor de 8.
En vez de usar oito bits para representar verdadeiro ou falso, podería literalmente usar un
usando un único byte para cada oito alumnos da clase
e cambiar 0-1 bits individuais usando estes tipos de baixo nivel trucos.
Isto realmente pór fin á enerxía. Hai dúbidas sobre as operacións bit a bit?
>> Si >> [Alumno] Existe un operador exclusiva ou?
Si Existe un operador exclusiva ou parecida con esta, ^, o símbolo de cenoria,
o que significa que a única cousa que o primeiro ou o segundo aspecto pode ser un 1 para a saída para ser un 1.
Hai tamén un non, ~, o que lle permitirá inverter a 0 a 1, ou viceversa, así.
E hai tamén un operador de desprazamento cara á dereita, >>, que é o oposto do que vimos.
Todo ben. Imos levar as cousas agora a un nivel superior.
Comezamos por falar de texto e, a continuación, comprimi-lo
e representando o texto cun número menor de bits;
nós falamos un pouco sobre como podemos agora comezar a manipular as cousas nun nivel bit a bit.
Imos agora zoom ata 10 mil pés de representación
das cousas máis complexas, como gráficos.
Aquí temos unha bandeira de Alemaña, aquí temos un de Francia.
Estes poden ser representados en formatos de ficheiro que pode saber - GIFs, por exemplo.
Se xa viu unha imaxe na web que remata en. GIF,
este é un formato de intercambio de gráficos.
Estas dúas bandeiras aquí tipo de prestar-se a compresión
para o que quizais sexa obvio motivo? >> [Resposta do alumno inaudível]
Hai unha morea de repetición, non?
Para enviar bandeira de Alemaña, pense nisto como unha imaxe na pantalla
atrás os seus días de scratch.
Podes lembrar que non hai píxeles individuais ou puntos que compoñen unha imaxe.
>> Hai toda unha liña de puntos negros e outra liña enteira de puntos negros.
Hai unha morea de liñas de puntos negros que se poida ver se realmente o zoom,
así como cando zoom no rostro de Rob en Photoshop.
Así como temos máis, máis e máis fondo na imaxe,
comezou a ver a pixelização, todas as prazas que compoñen o seu ollo nese caso.
Mesmo aquí. Se o zoom un pouco, vería puntos individuais.
Ben, este é un tipo de desperdicio de bits.
Un terzo do pavillón é negro e un terzo do pavillón é amarelo e así por diante,
por que non podemos dalgún xeito comprimir esta bandeira?
E mesmo a bandeira francesa pode ser comprimido, aínda que o estándar é un pouco diferente.
Acontece que o formato de ficheiro GIF é un formato de compresión sen perdas,
o que significa que pode ter unha imaxe como a bandeira alemá aquí,
pode tirar unha morea de seus bits sen sacrificar a calidade.
Isto está en contraste con algo como JPEG,
coa que a maioría de nós probablemente está máis familiarizado.
Facebook fotos e fotos de Flickr e afíns
case sempre son gardadas coma JPEGs cando está cargado,
pero JPEGs é unha perda - formato en que xogue fóra bits - con perdas
pero tamén xoga fóra de calidade.
E por iso, se comprimir imaxes con Photoshop ou envialos a Facebook
ou leva-los en un teléfono realmente malo,
vostede sabe que o cadro comeza a estar moi manchado e pixelizada,
e iso é porque está sendo comprimido polo ordenador ou teléfono
por, literalmente, xogando información de distancia.
Pero GIF é sorprendente na medida en que pode usar menos bits que podería por defecto
sen perder ningunha información.
>> E é, esencialmente, faio da seguinte maneira.
En vez de almacenar nun ficheiro como un BMP sería un triplo RGB para negro, negro, branco, negro,
negro, branco, negro, branco, negro, branco, negro, branco e así por diante,
en vez diso, o formato GIF é que vai dicir, "Black",
e, a continuación, "Repita iso 100 veces", ou algo así.
"Negro, repita este 100 veces, negro, repita este 100 veces ..."
"Amarelo, repita este 100 veces."
E así el se lembra de, esencialmente, o pixel máis á esquerda
e despois de algunha maneira codifica a noción de repetir que o pixel de novo e de novo.
Entón GIFs pode comprimir-se sen perder ningunha información.
Pero se tivese que adiviñar, se ese é o algoritmo que GIFs uso,
cal destas bandeiras, aínda que eles parecen idénticos en tamaño,
vai ser menor cando gardados no disco como un GIF? >> [Alumno] Alemaña.
Alemaña vai ser menor? Por que?
[Alumno] Porque repetir iso moitas e moitas veces na horizontal
e entón repetir outra vez. >> Exactamente.
Porque as persoas que inventaron GIF só un tipo de arbitrariamente decide
que a repetición será alavancado horizontal, e non lateralmente.
Hai unha repetición máis lateralmente aquí no pavillón alemán que na bandeira francesa.
Entón, se nós realmente abrir un cartafol no meu disco duro que ten eses GIFs,
realmente pode ver que a bandeira alemá aquí é de 2 kilobytes ea francesa é de 4 kilobytes.
El pasa a ser unha coincidencia que un é o dobre do outro,
pero é, de feito, o caso de que a bandeira francesa é moito maior.
>> Aínda que nós estamos falando aquí sobre os gráficos, as mesmas ideas poden ser aplicadas a
non cousas como bandeiras, pero imaxes que son un pouco máis complexo.
Se sacar unha foto dunha mazá, seguramente hai unha morea de duplicación alí,
para que pudéssemos de algunha maneira, lembre que o fondo de pantalla é azul
e non, como a imaxe da dereita indica,
ten que lembrar a cor de cada pixel nesta foto.
Así, podemos tirar anacos alí sen perda de información.
A mazá aínda parece a mesma cousa.
Neste exemplo aquí, pode ver o que pasa nun filme.
Estes representan bobinas vella escola de cine en que na imaxe de arriba hai
ten unha condución RV pasado unha casa e unha árbore.
E, como que van drives pasado de esquerda a dereita, o que, obviamente, non cambiando?
A casa non vai a sitio ningún, e que a árbore non vai a sitio ningún.
O único que se está movendo é a van neste caso.
Así como fondo inalteradas suxire, o que pode facer en filmes
é igualmente só tirar a información que non cambia entre cadros.
Isto é xeralmente coñecida como a compresión interframe
través do cal se este cadro é case idéntica a esta,
non imos preocupar almacenado no disco ningunha información idéntica
sobre eses cadros intermedios, imos usar só cadros principais de cando en vez
que, en realidade, almacenar esta información de forma redundante só como un pouco de sanidade comprobar.
>> Por outra banda, outra visión para a compresión de vídeo, neste segundo exemplo e inferior aquí,
onde, en vez de almacenar 30 cadros, por que non só almacenar 15 cadros por segundo en vez diso?
Ao contrario do que o tipo de película que flúe fermoso, perfectamente,
el pode ollar como está falar un pouco, nunha pequena escola de idade,
pero o efecto neto será a de usar moito menos bits que doutra forma sería necesaria.
Entón onde é que iso, entón iso nos deixa?
Isto foi un pouco de un lado sobre onde máis pode ir a compresión.
Para saber máis sobre iso, ter unha aula de como CS175 aquí.
Aquí está outro exemplo dentro de vídeo.
A abella é a única cousa en movemento,
realmente pode tirar información nestes cadros medios
porque a flor e do ceo e as follas non están cambiando.
Pero imos agora considerar unha última cousa.
Nos próximos cinco minutos que deixamos C atrás para sempre na clase? Si Non nos serie de exercicios, no entanto.
Última historia sobre C e, entón, chegar a cousas moi sexy
envolvendo HTML e Web e Woo-Hoo. Todo ben.
Aquí imos nós. Esa é a motivación.
Acontece que todo ese tempo en que teñen escrito programas que rodan Clang.
E Clang, dixemos desde a primeira semana moi bonito, ten código fonte
e convérteo en código obxecto.
Leva C e convertelo en 0s e 1s.
Eu tipo de mentiras para ti por algunhas semanas, porque non é tan sinxelo coma iso.
>> Hai moito máis a suceder debaixo do capó cando executar un programa como o Clang.
En realidade, o proceso de compilación dun programa realmente pode ser resumido,
como pode se lembrar de vídeo de Rob sobre compiladores,
para estes catro pasos: pre-procesamento, compilación en si, montaxe e conexión.
Pero na aula ea maioría das persoas do mundo tipicamente resumir todas estas etapas
só como "compilación".
Pero se comezar co código fonte como esta, recordo este é quizais o máis simple programa en C
temos escrito ata agora, lembro que cando compilado acaba dese xeito.
Pero hai, en realidade, un paso intermedio, e os pasos son como segue.
Primeiro hai esa cousa na parte superior deste e máis dos nosos programas,
# Incluír
O que o # include facer por nós?
El copia moi fermoso e cementoso o contido da stdio.h no meu arquivo de xeito que por que?
Por que me preocupe co contido de stdio.h? O que hai alí de interese?
Printf da declaración, o seu prototipo, de xeito que o compilador, entón, sabe o que quero dicir
cando mencionar esa función printf.
Entón, paso 1 na compilación é o pre-procesamento, en que un programa como o Clang
ou algún programa de axuda que vén con Clang le o código de arriba para a base,
esquerda a dereita, ea calquera momento ve un símbolo # seguido dunha palabra clave como include,
el executa esta operación, copiar e pegar neste caso stdio.h no seu arquivo.
Isto é o paso 1.
Entón tes un arquivo moi grande C por mor da copia enorme, pegue traballo que só aconteceu.
>> 2 paso agora é compilar.
Pero acontece que a compilación ten código fonte que se parece iso
e transformalo en algo que se parece iso,
que para aqueles familiarizados se chama? >> [Alumno] Asemblea. Lingua >> Asemblea.
Esta é realmente unha cousa se tomar CS61 vai mergullo en máis detalles.
Este é só o máis próximo que pode comezar a escribir 0s e 1s se
pero escribir as cousas de tal forma que aínda fai, polo menos, un pouco de sentido.
Estas son instrucións de máquina, e desprácese á función principal aquí,
entender que existe esta instrución push, mover instrución, restar instrución,
chamar a instrución, e así por diante.
Cando escoita que o seu ordenador ten procesador Intel dentro,
ten unha CPU Intel no seu Mac ou PC, o que significa isto?
Unha CPU vén construído por empresas como Intel comprender certas instrucións.
Eles non teñen idea do que funciona como intercambio son ou principal son, por si só,
pero eles saben o que moito instrucións de baixo nivel, como engadir, subtrair, empurrar,
mover, chamar, e así por diante son.
Entón, cando compilar o código C en linguaxe de montaxe,
seu propio código de usuario agradable para o futuro é convertido en algo que se parece iso,
que, literalmente, móvese máis ou 4 bytes en torno a tales pequenas unidades dentro e fóra da CPU.
Pero, finalmente, cando Clang está preparado para asumir esa representación do seu programa
en 0s e 1s, a continuación, a etapa denominada montaxe acontece,
e isto todo acontece de novo nun palpebrar de ollos ao executar Clang.
Nós comezamos aquí, el xera un ficheiro coma este, e despois convértese para estes 0s e 1s.
E se quere ir cara atrás nalgún punto e realmente ver iso en acción,
se eu entrar en hello1.c-este é un dos programas primeiros que vimos -
Normalmente nós compilar este con hello1.c Clang e iso nos daría a.out.
Se, pola contra ti en vez dar o S-bandeira, o que vai conseguir é hello1.s
e vai realmente ver a linguaxe assembly.
>> Estou facendo isto para un programa moi curto, pero se volver para Scramble
ou recuperar ou calquera outro programa que escribiu e só por curiosidade
quero ver o que realmente parece, o que está realmente a ser alimentado na CPU,
pode usar este S-bandeira coa Clang.
Pero, entón, por fin, aínda hai unha pegadinha.
Aquí están os 0s e 1s que representan miña implementación do Ola mundo.
Pero eu usei a función de alguén no meu programa.
Así, aínda que o proceso fose eu tomar hello.c,
é feita en código de montaxe, e despois queda montado 0s e 1s,
a única 0s e 1s que son emitidas neste momento no tempo
son os que resultan do meu código.
Pero a persoa que escribiu printf, que compilou o código 20 anos
e agora está instalado nalgún lugar do aparello,
para que de algunha maneira ten que mesturar os seus 0s e 1s co meu 0s e 1s,
e que nos leva ao paso 4 e final de elaboración, coñecido como conexión.
Así, no lado esquerdo, temos o cadro exactamente como antes:
hello.c torna-se un código de montaxe torna-se 0s e 1s.
Pero lembre que eu usei a biblioteca de E / S por defecto no meu código,
e iso significa que en algún lugar no seu ordenador hai un ficheiro chamado stdio.c
ou, polo menos, a mesma versión compilada porque alguén fai uns anos
compilado en código stdio.c montaxe e despois unha morea de 0s e 1s.
Iso é o que se coñece como estático ou unha biblioteca dinámica.
É un arquivo sentado nalgún lugar do aparello.
>> Pero, finalmente, eu teño que tomar a miña 0s e 1s e desa persoa 0s e 1s
e dalgún modo vincular-los xuntos, literalmente combinar os 0s e 1s
nun único arquivo chamado a.out ou hello1 ou o que eu chamei o meu programa
de xeito que o resultado final ten todos os 1s e 0s que deben compoñer o meu programa.
Entón todo este tempo neste semestre, cando está usando Clang
e mesmo, máis recentemente, de executar o make, a fin de realizar Clang,
todas esas etapas foron a suceder tipo de instantaneamente, pero moi deliberadamente.
E se seguir en ciencia da computación, ou sexa, CS61,
Esta é a capa que vai continuar a pelar aí fóra
fala de eficiencia, implicacións de seguridade, e outros deses detalles de nivel inferior.
Pero, con iso, que estamos a piques de deixar C atrás.
Imos adiante e tomar o noso intervalo de 5 minutos, agora,
e cando volten: a Internet.
Todo ben. Estamos de volta.
Agora imos comezar a nosa mirada non só en HTML, porque, como podes ver,
HTML en si é realmente moi simple
pero realmente programación web en xeral, en rede de xeito máis xeral,
e como todas estas tecnoloxías se reúnen
para permitir crear programas máis sofisticados enriba da Internet
que ata agora temos sido capaces de nos estas fiestras branco e negro.
En realidade, neste momento, no semestre aínda que vai pasar un tempo relativamente menos
en PHP, HTML, CSS, JavaScript, SQL e máis,
a maioría dos estudantes do final para facer proxectos finais, que están baseados na web
porque como podes ver, o fondo que ten agora en C
é moi aplicable a estas linguaxes de alto-nivel.
>> E como comezar a pensar sobre o seu proxecto final,
que, como conxunto de problemas 0, onde foron encoraxados
de facer máis nada do seu interese en scratch,
O proxecto final é a súa oportunidade de ter o seu novo coñecemento e habilidade con C
ou PHP ou JavaScript ou similar, para un xiro
e crear o seu propio anaco de software para o mundo ver.
E a semente que con ideas, sabe que pode dirixirse aquí, projects.cs50.net.
Todos os anos, solicitar ideas de profesores e funcionarios e grupos de estudantes no campus
só para presentar as súas ideas para cousas interesantes que poderían ser resoltos usando ordenadores,
usando sitios, usando o software.
Entón, se está loitando para chegar a unha idea do seu propio país,
por todos os medios percorrer as ideas a partir deste ano eo último.
É perfectamente ben para afrontar un proxecto que foi abordado antes.
Vimos moitas aplicacións para ver o estado de roupa no campus,
moitas aplicacións para navegar no menú comedor,
moitas aplicacións para navegar o catálogo de cursos e afíns.
E, de feito, nunha charla futuro e futuros seminarios,
imos presenta-lo a algunhas APIs dispoñibles ao público, ambos dispoñibles no mercado
, Así como aquí dispoñible CS50 no campus para que teña acceso a datos
e pode, entón, facer cousas interesantes con ela.
Entón, máis en proxectos finais algúns días, cando liberamos a especificación,
pero por agora, sei que pode traballar só ou con un ou dous amigos
en máis calquera proxecto de interese para vostede.
Internet.
Dalle puxe o seu portátil, vai para facebook.com por primeira vez,
non conectado recentemente, e prema Intro. O que ocorre exactamente?
>> Cando prema Intro no seu computador, monte un conxunto de pasos
comezar especie de pase de máxica ocorrer.
Entón aquí no servidor, web esquerda como Facebook está aquí á dereita,
e dalgunha forma está a usar esta linguaxe chamada HTTP, formato Transfer Protocol.
HTTP non é unha linguaxe de programación. É máis dun protocolo.
É un conxunto de convencións que os navegadores e servidores web empregan cando intercomunicación.
E o que iso significa é o seguinte.
Así como no mundo real, temos estas convencións
onde se atopa algún ser humano por primeira vez, se non lle importa xogar comigo aquí,
Eu podería vir ata ti, diga: "Ola, meu nome é David." >> Ola, David. O meu nome é Sammy.
"Ola, David. Meu nome é Sammy."
Entón, agora temos só implicados neste tipo de protocolo humano parvo
onde iniciar o protocolo, Sammy respondeu,
temos aperto de mans e a transacción sexa rematada.
HTTP é moi semellante en espírito.
Cando os seus pedidos navegador www.facebook.com,
que o seu navegador está realmente facendo está estendendo a súa man, por así dicir,
ao servidor e está enviándolle unha mensaxe.
E esa mensaxe é tipicamente algo como - o que quere chegar? -
me á páxina de inicio, que normalmente é indicado por unha única barra ao final dunha URL.
E só así vostede sabe que lingua estou falando, eu o navegador vou dicir a vostede
que eu estou falando HTTP versión 1.1,
E tamén para a boa medida, eu vou dicir a vostede que o servidor que quero a páxina de inicio do
é facebook.com.
Normalmente, un navegador web, sen saber, o ser humano,
envía a mensaxe a través de Internet cando simplemente teclea www.facebook.com,
>> Entrar no seu navegador.
E o que Facebook responder con?
El responde con algúns detalles de aparencia semellante enigmáticas, pero tamén moito máis.
Deixe-me ir á fronte da páxina de Facebook casa aquí.
Esta é a pantalla que a maioría de nós probablemente nunca ver se estar conectado todo o tempo,
pero esta é de feito a súa páxina principal.
Se facemos isto no Chrome, entender que pode puxar arriba os menús de contexto pouco.
Usando o Chrome, sexa en Mac OS, Windows, Linux, ou similar,
Se controlar clic ou prema esquerdo, normalmente pode tirar un menú que se parece iso,
onde algunhas opcións esperan, un dos cales é View Page Source.
Tamén pode normalmente obter a estas cousas, indo ao menú Ver e bisbilhotando.
Por exemplo, aquí en Ver, creador é a mesma cousa.
Eu estou indo a ir adiante e ollar para View Page Source.
O que vai ver é o código HTML que Mark escribiu para representar facebook.com.
É unha desorde completa aquí, pero imos ver que iso ten sentido un pouco máis antes de tempo.
Pero hai algúns patróns aquí. Deixe-me rolar para cousas como esta.
Isto é difícil para un ser humano para ler, pero entende que non hai ese nivel de corchetes angulares
con palabras clave como opción, palabras clave como valor, algunhas cordas citadas.
Este é o lugar onde, cando se inscribiu por primeira vez, especificado que o seu ano de nacemento é.
Este menú desplegable de anos de nacemento é de algunha maneira codificada aquí
nesta linguaxe chamada HTML, formato Markup Language.
Noutras palabras, cando o navegador solicita unha páxina web,
fala esta convención chamado HTTP.
Pero o que é facebook.com responder a esa petición con?
>> El responde con algunhas destas mensaxes crípticas, como veremos nun momento.
Pero a maior parte da súa resposta en forma de HTML, linguaxe de marcado de hipertexto.
Esa é a linguaxe real en que unha páxina está escrita.
E o que é un navegador realmente é, entón, despois do recibimento de algo que se parece iso,
le-lo de arriba para abaixo, de esquerda a dereita, e calquera vez que ve un deses soportes angulares
seguido por unha palabra clave como opción, el exhibe que a linguaxe de marcado de forma adecuada.
Neste caso, sería amosar un menú de lista despregable de anos.
Pero, de novo, iso é unha desorde completa para ollar.
Isto non é porque os desenvolvedores de Facebook manifestan 0 a 5 de estilo, por exemplo.
Isto é porque a maioría do código que escribir é, de feito, escribiu fermoso,
ben comentado, así recuado, e similares,
pero de máquinas de curso, ordenadores, navegadores realmente non dou a mínima
se o seu código é ben estilo.
E, en realidade, é completamente inútil para bater a tecla tab todas as veces
e para enviar comentarios durante todo o seu código e escoller realmente descritivos nomes de variables
porque o seu navegador non importa, todo o que está facendo ao final do día é perder máis.
>> Así, verifícase que a maioría dos sitios de facer é mesmo que o código fonte para facebook.com,
para cs50.net e todos eses outros sitios en Internet
son tipicamente ben escrita e ben comentado e ben recuado e similares,
normalmente antes do web e colocar en Internet, o código é minified,
que o código HTML e CSS - algo que imos ver en breve -
o código JavaScript que imos ver en breve é ​​comprimido,
a través do cal os nomes de variables longos fan-se X e Y e Z,
e todos os que os espazos en branco que fai todo parecer tan lexible é todo xogado fóra,
porque se pensar sobre iso dese xeito, Facebook recibe unha páxina de millóns de accesos por día -
unha cousa tola como esta - de xeito que un programador só para ser anal
bateu a barra de espazo xa extra só para guión algunha liña de código sempre moito máis?
Cal é a implicación o Facebook que preserva os espazos en branco
en todos os bytes que enviar de volta para as persoas na internet?
Bater a barra de espazo xa que lle dá un byte extra no seu arquivo.
E se mil millóns de persoas, a continuación, proceder ao descargar da páxina de inicio dese día,
canto máis datos se transmiten a través de Internet?
Un Gigabyte por ningunha boa razón.
E concedido por unha morea de sitios non é unha cuestión tan scalable,
pero para o Facebook, a Google, para algúns dos sitios máis populares
hai gran impulso financeiro para facer o seu código ollar como unha confusión
de xeito que está a usar como algúns bytes posible, ademais de, a continuación, comprimi-lo
usar algo como zip, un algoritmo chamado gzip,
que o navegador fai automaticamente para ti. Pero iso é terrible.
Nós nunca imos aprender algo sobre sitios de outras persoas e crear páxinas web
se temos de mirar para el como este.
>> Entón, por sorte, navegadores como Chrome e IE e Firefox estes días
normalmente veñen con ferramentas embutidas creador.
En realidade, se eu baixar aquí para inspeccionar elemento ou se eu for a ver, Developer
e vaia Ferramentas de Desenvolvemento explicitamente,
Nesta ventá, na parte inferior da pantalla do meu agora aparece.
É un pouco intimidante no principio, porque hai unha morea de pestanas descoñecidas aquí,
pero se eu premer en elementos todo o camiño na parte inferior esquerda,
Chrome é, obviamente, moi intelixente. El sabe como interpretar todo este código.
E así Chrome fai é que limpa todo HTML Facebook.
Aínda que non hai espazo en branco alí, non hai retirada alí,
Agora, observe que eu poida comezar a navegar nesta páxina web aínda máis xerarquicamente.
Acontece que cada páxina web escrito nunha linguaxe chamada HTML5 debe comezar con iso,
esta declaración DOCTYPE, por así dicir: <! DOCTYPE html>
É unha especie de luz e gris alí, pero esta é a primeira liña de código neste ficheiro,
e que só di o navegador, "Ei, aquí vén algún HTML5. Aí vén unha páxina web."
O primeiro soporte aberto alén do que vén a ser esa cousa, un soporte aberto tag HTML,
e entón eu mergullo no máis profundo - esas frechas son completamente sen sentido;
son só por mor da presentación, eles non están realmente no arquivo -
entenderá que dentro de etiquetas HTML Facebook, calquera cousa que comeza cun soporte aberto
e despois ten unha palabra é chamado de etiqueta.
Entón, dentro da etiqueta HTML é aparentemente unha marca de cabeza e unha marca de corpo.
Dentro da marca de cabeza agora é unha desorde toda a Facebook
porque eles teñen unha morea de metadatos e outras cousas para o marketing e publicidade.
>> Pero se rolar para abaixo, abaixo, abaixo, abaixo, imos ver onde está. Aquí está.
Este é polo menos un pouco familiarizado.
O título da páxina de Facebook de casa, se ollar na guía na súa barra de título,
é Benvido ao Facebook - Log In, Registre-se ou saber máis.
Isto é o que ve na barra de Chrome título,
e é así que é representado no código.
Se ignorar todo na cabeza, a maior parte das entrañas dunha páxina web están no corpo,
e verifícase que o código de Facebook vai mirar máis complexo
que a maioría das cousas que vou escribir inicialmente só porque foi construído ao longo dos anos,
pero hai unha morea de marcas de script, o código JavaScript,
que fai o sitio moi interactivo:
ver actualizacións de estado instantáneamente utilizando linguaxes como JavaScript.
Hai unha cousa chamada div, que é unha división dunha páxina.
Pero antes de chegar a ese detalle, imos tentar diminuír o zoom
e ollar para a versión máis sinxela de Facebook 1.0, por así dicir.
Aquí está o mundo, Ola de páxinas web.
El ten esa declaración DOCTYPE arriba
que é un pouco diferente de todo o resto.
Nada máis que escribir nunha páxina web vai comezar con <! agás que non hai liña
e excepto por unha cousa chamada comentarios HTML.
Pero para a maior parte, todo nunha páxina web está aberta soporte, soporte clave, preto.
>> Neste caso, podes ver a máis simple das páxinas web posíbeis.
A etiqueta HTML contén unha marca de cabeza e que contén unha etiqueta corpo,
de notar que non hai esa noción de partida e parada etiquetas.
Esta é a marca de inicio para HTML, esta é a etiqueta de peche ou a etiqueta final.
Repare que son unha especie de opostos no sentido de que a etiqueta preto ou etiqueta final
ten esa barra dentro de si.
Mentres tanto, hai unha marca de cabeza aberta aquí e unha marca de cabeza preto aquí.
>> Hai un título aberto e un título de tag preto aquí.
O feito de ter colocado o título nunha liña, puramente arbitraria.
El só parecía que ía encaixar moi ben nunha soa liña, entón eu non me incomodei premer Intro algunhas veces.
Mentres tanto, o corpo que eu fixen guión só para estar sempre tan clara.
Teña en conta que o HTML é unha linguaxe moi burro.
De feito, volve o día anterior había editores WYSIWYG
e Microsoft Word onde podes dicir: "Faino resaltado, en cursiva facer este",
realmente escribir ordes pequenos ensaios en 20 + anos
en que diría, "Comezar a facer este texto en negra. Pare de facer este texto en negra."
"Comezar a facer este texto en cursiva. Pare de facelo cursiva texto."
>> Isto é o que HTML ou calquera linguaxe de marcado é.
Esta primeira marca di: "Ei, navegador. Aí vén un pouco de HTML."
A próxima marca di: "Ei, navegador. Aí vén a cabeza, a cabeceira da miña páxina web."
"Ei, navegador. Aquí vén o título."
E entón, por aquí, "Ei, navegador. Isto é todo para o título."
Entón é así que o navegador saiba non amosar máis caracteres que Ola, mundo
na barra de título.
Mentres tanto, este di: "Isto é todo para a cabeza."
Este di: "Aquí vén o corpo Aquí está o corpo real." - Literalmente, as palabras Ola mundo.
E isto di aquí: "Isto é todo para o corpo. Isto é todo o código HTML."
Así, os navegadores son moi burro.
Eles só ler estas cousas de arriba para abaixo, de esquerda a dereita, e facer exactamente o que eles din que facer.
Imos realmente facer un pequeno exemplo aquí.
Deixe-me abrir o máis simple dos programas no meu Mac aquí, ou sexa, TextEdit.
En Windows, podes usar Notepad.exe.
Pero iso é todo o que precisas para comezar a facer páxinas web.
Eu estou indo a ir adiante e só copiar e pegar este código neste arquivo.
Eu estou indo a ir adiante e salva-o no meu escritorio,
e eu vou gardar como hello.html,
e agora o ficheiro chámase hello.html.
Aquí é a miña zona de traballo.
Déixame ir nun navegador e arrastrar o ficheiro para o navegador.
E listo, aquí está a miña páxina web primeiro.
Teña en conta que o título da guía é Ola, mundo de acordo coa tag título,
e observe que Ola, mundo é o corpo da miña páxina web,
e Woo-Hoo, eu estou en internet.
>> Eu non son realmente, non, porque este ficheiro non está en Internet.
El pasa a ser no meu disco duro local en que determinado camiño.
Pero a idea é a mesma. Todo o que necesitamos agora é un servidor web para que cargalo.
Pero primeiro imos realmente introducir complexidade un pouco máis e un pouco máis de estilización.
Este é un simple, se aburrido páxina web.
Acontece que hai outros tipos de marcas que podemos utilizar.
Por exemplo, aquí en amarelo eu introducín dúas novas etiquetas.
Non imos xogar moito con eses de hoxe, pero entender que a etiqueta ligazón
de algunha maneira, parece diferente de todo o resto.
A etiqueta enlace leva o que son chamados de atributos,
é un atributo é algo que modifica o comportamento dunha etiqueta.
Neste caso, esta non é a mellor opción de nomes, enlace, porque é unha especie de sentido,
pero esta etiqueta ligazón di, esencialmente, incluír o arquivo chamado styles.css dentro da miña páxina web.
Podes pensar niso como análogo ao C # include Directiva.
Styles.css está referíndose a unha linguaxe totalmente diferente que non imos xogar hoxe,
pero é a estética: os tamaños de fonte, cor, recheo de retirada, marxes,
e de todos os que tipo de detalle a estética.
Mentres tanto, a marca de script é funcionalmente semellante,
pero en vez de include CSS, que a linguaxe, que inclúe outro idioma, JavaScript.
Polo tanto, noutras palabras, con estas dúas marcas que eu, finalmente, ser capaz de escribir a miña propia páxina web
pero tamén puxar o código que ou calquera outra persoa que teña escrito
para que poidamos estar nos ombros de outras persoas, podemos practicar un bo deseño,
fatorar código común.
Se eu teño 10 páxinas web diferentes, isto significa que algúns dos meus estética
pode ser fatorada, así como # include, nun ficheiro separado.
Entón, nós estamos chegando alí.
Pero primeiro imos realmente facer algo máis interesante con este ficheiro.
>> Unha vez máis, este é só o TextEdit. Eu non son tecnicamente en internet aínda, pero nós imos chegar alí.
Gustaríame facer Ola, mundo un pouco máis ousado que é.
Así Ola, imos dicir arbitrariamente para negriña.
Unha vez máis, a historia é a mesma: Ola, coma, comezar a facelo en negra,
entón o mundo está impreso en negriña, e iso significa deixar de imprimir esta en negra.
Deixe-me ir adiante e gardar o meu arquivo, volva para o Chrome, eu vou aumentar o zoom só para que poidamos velo mellor,
e recargar, e vai ver que o mundo está agora en negra.
A web é todo sobre hiperlinks, entón imos seguir adiante e facelo:
o meu sitio favorito é, imos dicir, youtube.com.
Gardar, recargar. Okay. Hai algúns problemas agora ademais da hediondez do sitio web.
1, eu estou seguro que eu prema Intro aquí. E eu fixen.
Non só prema Intro, eu tamén recuado, practicando o que estamos predicando sobre o estilo,
pero a miña é ben próximo ao mundo.
Entón, por que é isto? Navegadores só facer o que lles din que facer.
Eu non dixo o navegador, "liñas de romper aquí. Introduza parágrafo romper aquí."
Así, o navegador, non importa se eu acertar retorno de 30 veces,
ela aínda vai poñer o meu xunto mundo.
O que eu realmente teño que facer aquí é dicir algo así como , insira unha quebra de liña.
>> E, de feito, un salto de liña é un tipo de cousa estraña
porque non pode realmente comezar a moverse para outra liña, a continuación, facer algo,
e, a continuación, deixar de se mover para unha nova liña. É unha especie de unha operación atómica.
Queres facelo ou non. Vostede escriba Intro ou non.
Entón br é un pouco dunha marca diferente, e por iso eu teño para clasificar tanto abrir e pechar
dunha soa vez.
A sintaxe para iso.
Tecnicamente, podería facer algo así en algunhas versións de HTML,
pero iso é unha estupidez, porque non hai ningunha razón para iniciar e deter algo
se pode facelo, en vez de unha soa vez.
Entenda que o HTML5 non estrictamente esixe esa barra,
así vai ver libros de texto e recursos en liña que non o posúen,
pero para unha boa medida imos practicar a simetría que vimos ata agora.
Isto significa que a etiqueta é tamén aberto e pechado.
Entón, agora déixeme gardar o meu arquivo, volva aquí.
Ok, iso está comezando a parecer mellor, excepto a web que sei é tipo de previsión,
e aínda youtube aquí non parece levar a nada.
Isto porque aínda que el se parece con unha ligazón, o seu navegador non sabe que, por si só,
entón eu teño que dicir ao navegador que este é un enlace.
>> A forma de facelo é empregar unha marca de referencia:
<A href para hiper referencia, que é a forma da vella escola de dicir unha ligazón,
= "Http :/ / www.youtube.com">
e deixe-me pasar isto para unha nova liña só por iso é un pouco máis lexible,
e eu vou diminuír o tamaño da fonte.
Estou feito aínda? Non Non vai ser esta dicotomía.
Esta marca, a marca de referencia, de feito, tomar un atributo,
que modifica o seu comportamento, eo valor deste atributo é aparentemente URL de YouTube.
Pero teña en conta a dicotomía é que só porque esa é a URL que está indo,
iso non significa que ten que ser a palabra que está destacando e facendo unha ligazón.
En vez diso, que pode ser algo como isto.
Entón, eu teño que dicir que deixar de facer esa palabra un hipervínculo a usar a etiqueta referencia preto.
Repare que eu non estou facendo iso.
1, este sería só un desperdicio de tempo de todos e que non é necesario.
>> Para pechar unha etiqueta, só mencionar o nome da marca de novo.
Non menciona calquera dos atributos.
Entón, imos gardar este, volver. Ok, preparado, agora é azul e hiperenlace.
Se eu premer nel, realmente ir ao YouTube.
Así, aínda que a miña páxina web non está en Internet, é, como mínimo, HTML,
e deixamos a Internet incorporarse, nós realmente acabar aquí no youtube.com.
E podo volver e aquí está a miña páxina web. Pero entender iso.
Se xa cheguei de spam ou dun ataque de phishing,
agora ten a capacidade despois de só cinco minutos para facer o mesmo.
Podemos ir aquí e facer algo como www.badguy.com
ou o que o sitio é esbozado, e entón pode dicir comprobar a súa conta PayPal
[Risas] E agora iso está indo a ir a badguy.com, que eu non estou indo a premer en
porque eu non teño idea de onde que leva. [Risas]
>> Pero agora temos a capacidade de realmente acabar alí.
Entón, nós estamos realmente empezando a rabuñar a superficie.
Non estamos a programación por si só, estamos escribindo linguaxe de marcado.
Pero así que completar o noso vocabulario en HTML,
imos introducir PHP, unha linguaxe de programación real
que nos permitirá xerar HTML automaticamente xerar CSS automaticamente
para que poidamos comezar o mércores para aplicar, por exemplo,
o noso propio motor de procura e moito máis.
Pero, máis que nun par de días. Imos ver entón.
>> [CS50.TV]