[Powered by Google Translate] [Tuần 7] [David J. Malan - Đại học Harvard [Đây là CS50. - CS50.TV] Được rồi. Chào mừng trở lại. Đây là CS50, và đây là sự bắt đầu của tuần 7. Một vài thông báo nhỏ: Pset5 bây giờ là trong tiến trình, hoặc sẽ sớm được, và cho tôi nói, khá trung thực, điều này không có xu hướng là một trong nhiều thách thức của bộ vấn đề của khóa học, vì vậy hãy để tôi đề cập đến điều này ngay bây giờ để tuần này hơn bao giờ hết bạn không đợi cho đến khi, nói, thứ tư đêm hoặc đêm thứ năm để bổ nhào. Đây chắc chắn là một pset thú vị. Chúng tôi nghĩ rằng nó là thú vị. Nếu bạn thực sự có được nó hoàn toàn chính xác và sau đó có thể thách thức Hội đồng quản trị được gọi là Big, bạn sẽ có một cơ hội để phù hợp với trí thông minh với một số nhân viên của khóa học và một số bạn cùng lớp của bạn. Ban Big là một khi bạn có làm việc kiểm tra chính tả của bạn, bạn sẽ có thể đi đến cs50.net sau khi chạy một lệnh, hoàn toàn chọn tham gia, và sau đó là số lượng thời gian và số lượng bộ nhớ RAM và nhiều hơn nữa mà bạn đã sử dụng trong việc thực hiện của bạn sẽ được trưng bày ở đây trên trang chủ của khóa học. Bạn sẽ nhận thấy rằng một bó toàn bộ những người ở đây được liệt kê như là nhân viên kể từ cuối tuần qua, các nhân viên nghĩ rằng nó sẽ được vui vẻ để cố gắng vượt qua mỗi khác. Vì vậy, nhận ra rằng mục tiêu ở đây không phải là để vượt qua các nhân viên. Ngay cả khi tôi chỉ ở đây ở vị trí thứ 13. Hoàn toàn chọn tham gia, nhưng nó là một cơ hội để xem làm thế nào ít RAM và làm thế nào vài giây CPU bạn có thể sử dụng vis-a-vis một số bạn cùng lớp của bạn. Và tôi sẽ thừa nhận rằng Kevin Michael Schmid, hiện đang ở vị trí số 1 là một trong TFS, đây là một thực hiện mà chúng ta gọi là không thể cho rằng ông sử dụng gần như 0 RAM và gần như 0 giây để tải. Vì vậy, chúng tôi sẽ chăm sóc của Kevin ẩn. [Cười] Có kỹ năng nhất định mà Kevin được đưa vào thử nghiệm ở đây. Một trong những điều chúng tôi nghĩ rằng chúng tôi muốn làm là quá CS50x là một tuần trong tiến trình, và các bạn sẽ là một phần của thí nghiệm này là những học sinh. Chúng tôi đã yêu cầu họ như một phần của pset0 của họ, tương tự như trình một dự án Scratch quan tâm đến họ - một trò chơi, một mảnh tương tác của nghệ thuật, một hình ảnh động, hoặc các loại tương tự - video 1 - 2-phút, nếu họ muốn nói với thế giới và những người mà họ thực sự đang có. Tôi nghĩ rằng tôi muốn chia sẻ với bạn chỉ là một vài đoạn video đã được đệ trình cho đến nay bởi vì đối với chúng tôi trên các nhân viên ít nhất nó thực sự là thú vị và cảm hứng cho người xem những người này từ tất cả các nơi trên thế giới - các quốc gia trên toàn thế giới - điều chỉnh, của tất cả mọi thứ, một khóa học khoa học máy tính trên Internet, cho dù đó là bởi vì họ muốn tiếp tục nghiên cứu của riêng mình, họ muốn đưa sự nghiệp của mình theo một hướng mới, họ muốn để điền vào những khoảng trống trong kiến ​​thức của mình, vì vậy một số trong những lý do mà các bạn có lẽ đã ở đây. Vì vậy, tôi cung cấp cho bạn 1 học sinh như vậy ở đây. Bạn có thể tăng âm lượng chỉ là một chút. Đây là một trong những sinh viên của chúng tôi đệ trình 1-phút. Xin chào, thế giới. Tôi là một sinh viên kỹ thuật công nghiệp ở Malaga, Tây Ban Nha. Tôi rất phấn khởi về khóa học trực tuyến này bởi vì tôi yêu khoa học máy tính, tôi thực sự, và tôi thực sự đánh giá cao mà tôi nhận được để khám phá nó. Và thực tế là tôi có thể tìm hiểu tất cả các bạn làm nhưng thay vì ở Harvard tôi ở Malaga, làm thế nào tuyệt vời như vậy? Vâng, tôi Fernando, và điều này là CS50. Xem các bạn. [Cười] Một clip chúng tôi đặc biệt thích, bạn sẽ thấy rằng tiếng Anh của quý ông này không phải là quá mạnh. Có vẻ như ông đã có máy tính dịch, do đó, bản thân các bản dịch là một chút không hoàn hảo, nhưng đây là một trong những mục yêu thích của chúng tôi vậy, đến nay cũng. [♪ ♪] Xin chào, thế giới. [Nói bằng tiếng Nhật] [Tôi có để chào đón bằng tiếng Nhật vì tiếng Anh của tôi rất không đáng tin cậy.] [Tôi đã đưa ra thông điệp cho bạn từ thành phố Gifu, Nhật Bản.] [Tôi có thể là một học sinh lần đầu tiên trong 20 năm, như có thể thấy.] [Tôi rất biết ơn Đại học Harvard, người đã cho tôi cơ hội này và EDX.] [Golf là một cây đàn guitar và điều yêu thích của tôi chạy.] [Cười] [♪ ♪] Tại sao bạn nghĩ rằng tôi đã cố gắng tham dự một cs50x.] [Đại học Harvard, là khao khát của tôi.] [Đặc biệt là nếu tôi xa sự hiện diện sống ở Nhật Bản.] [Tôi muốn thử ngay lập tức biết được sự tồn tại của EDX khi nào.] Anh có nghĩ vậy không bạn không liên quan đến tuổi học I.] [CS50 là khao khát của tôi. Tên tôi là Kazu, và đây là CS50.] [♪ ♪] [tiếng vỗ tay và cổ vũ] Một yêu thích của chúng ta là này trình ở đây từ một ai đó. [♪ ♪] [Malan Google nó nếu bạn không quen với meme này. Và rồi cuối cùng, một vài người khác đã đăng rằng có thể giành chiến thắng trong giải thưởng đáng yêu. [Sinh viên] Aww! >> [Malan] Chúng tôi sẽ phải để lắng nghe. Điều này là ngắn, do đó, lắng nghe. [Nữ loa] Tên của bạn là gì? >> Louie. [Nữ loa] Đây là gì? >> [Cười khúc khích] CS50. [Cười] Malan Ông đã làm 2 mất, mặc dù. Ở đây chúng tôi đi, người cuối cùng. Tên tôi là Louie, và điều này là CS50. [Cười] Điều này sau đó là CS50x. Xin cảm ơn đến tất cả những người bạn của trong khi đi theo ở nhà đã được dự phần cho đến nay. Hôm nay chúng ta kết thúc cuộc thảo luận của chúng ta về cấu trúc dữ liệu, ít nhất là một số cơ bản nhất, và sau đó chúng tôi tiếp tục cuộc trò chuyện của chúng tôi về HTML và lập trình web. Thật vậy, chúng tôi đã dành quá khứ một số 7 tuần xem xét các nguyên tắc cơ bản của chương trình - thuật toán, cấu trúc dữ liệu, và như thế - và C, như bạn có thể đã có kinh nghiệm vậy, đến nay, không nhất thiết phải truy cập nhiều nhất của các ngôn ngữ để thực hiện một số ý tưởng. Và như vậy bắt đầu từ tuần này và tuần sau và sau đó sau đây, cuối cùng chúng ta sẽ có thể chuyển đổi từ C, thường được gọi là một ngôn ngữ khá ở mức độ thấp, thứ cấp cao hơn, trong đó PHP, JavaScript, và như thế, mà chúng ta thấy sẽ rút ra những bài học mà chúng tôi đã học được trong vài tuần qua, nhưng bạn sẽ thấy rằng tuyên bố những thứ như mảng và bảng băm và tìm kiếm và phân loại trở nên dễ dàng hơn nhiều bởi vì bản thân các ngôn ngữ chúng tôi sẽ bắt đầu sử dụng sẽ trở nên mạnh mẽ hơn. Nhưng trước tiên, một ứng dụng của cây. Nó rất phổ biến những ngày này cần để nén thông tin. Trong bối cảnh những gì bạn sẽ muốn để nén một số loại thông tin kỹ thuật số? Yeah. >> [Sinh viên] Khi bạn cần phải gửi nó qua Web. Yeah, khi bạn muốn gửi một cái gì đó trên Web. Nếu bạn muốn tải về một tập tin lớn, đó là lý tưởng nếu ai đó ở đầu bên kia nén tập tin bằng cách sử dụng một định dạng zip hoặc một cái gì đó như thế vì vậy mà bạn đang gửi bit ít hơn nếu không có thể được truyền. Vì vậy, làm thế nào để bạn nén thông tin? Tất cả nắm để sử dụng bit ít hơn được yêu cầu mặc định. Nhưng đây là một điều tò mò vì nghĩ lại tuần 0 và 1 khi chúng tôi nói chuyện về ASCII và nhị phân và chúng tôi nói chuyện về ASCII đặc biệt như sử dụng 8 bit để đại diện cho các chữ cái trong bảng chữ cái để lá thư đó được đại diện bởi 65, chữ thường là số 97, tuy nhiên bạn đại diện cho 65 hoặc 97, bạn đang sử dụng 7 hoặc 8 bit. Tuy nhiên, nắm bắt được rằng có một số chữ cái trong bảng chữ cái tiếng Anh không được phổ biến như những người khác. Z không phải là phổ biến, Q không phải là tất cả phải là phổ biến, nhưng A và E là siêu phổ biến. Và cho tất cả các chữ cái, theo mặc định trên thế giới sử dụng cùng một số bit, chỉ có 8. Vì vậy, nó sẽ không được thông minh hơn nếu thay vì sử dụng 8 bit cho mỗi thư, ngay cả những thường xuyên sử dụng như Q và Z, điều gì sẽ xảy ra nếu chúng tôi sử dụng các bit ít hơn cho A và E và S và các chữ cái phổ biến nhất và được sử dụng nhiều bit hơn cho các chữ cái ít phổ biến, ý tưởng là chúng ta hãy tối ưu hóa cho trường hợp thông thường, mà là một chủ đề trong khoa học máy tính cố gắng tối ưu những gì sẽ xảy ra nhiều nhất và chi tiêu một thời gian ít hơn, một ít không gian hơn những điều mà, yeah, có thể xảy ra nhưng không nhất thiết phải là thường xuyên. Vì vậy, chúng ta hãy lấy một ví dụ. Giả sử chúng ta muốn để mã hóa thông tin khá hiệu quả. Bạn có thể đã lớn lên biết một chút gì đó về mã Morse, và tỷ lệ cược là bạn không biết mã thực tế, nhưng bạn có thể nhớ lại rằng nó ít nhất là hàng loạt các dấu chấm và dấu gạch ngang. Đây là một mã hóa tương đối hiệu quả và thông báo rằng lá thư phổ biến nhất - ví dụ, E - sử dụng tiếng bip ngắn nhất. Mã Morse là tất cả về tiếng bíp-bíp-bíp-bíp-bíp-bíp và tổ chức tấn hoặc trong một thời gian ngắn thời gian hoặc thời gian dài. E, như được biểu thị bằng dấu chấm, là một tiếng bíp ngắn siêu, chỉ cần tiếng bíp, và đó sẽ đại diện cho E. Ngược lại, T sẽ là một tiếng bíp dài hơn, như tiếng bíp [kéo dài âm thanh] và đó sẽ đại diện cho T. Nhưng đó vẫn còn khá ngắn bởi vì, ngược lại, nếu bạn nhìn vào Z, bày tỏ Z, bạn sẽ đi beep, beep [còn âm thanh], beep, beep [ngắn hơn âm thanh. Vì vậy, nó còn bởi vì nó ít phổ biến hơn. Nhưng Gotcha ở đây là mã Morse là một chút thiếu sót ở chỗ nó không phải ngay lập tức giải mã. Ví dụ, giả sử rằng bạn nghe trên một số cuối tiếng bíp dây ngắn], tiếng bíp dài. Thông điệp gì tôi chỉ nhận được? Một dấu chấm và dấu gạch ngang. Mà đại diện cho điều gì? [Sinh viên] A. >> [Malan] Có thể. Nó cũng có thể được E tiếp theo T. Nói cách khác, mã Morse, mặc dù nó thúc đẩy những nguyên tắc về tối ưu hóa các trường hợp góc, nó không thích bản thân để decodability ngay lập tức. Đó là, con người được nghe hoặc nhận được các dấu chấm và dấu gạch ngang bằng cách nào đó tìm ra nơi mà các vi phạm giữa các chữ cái, bởi vì nếu bạn không biết nơi mà những người phá vỡ, bạn có thể nhầm lẫn A cho ET hoặc ngược lại. Vì vậy, những gì bạn có thể làm gì? Trong mã Morse, bạn có thể chỉ là tạm dừng giữa mỗi của các chữ cái. Nhưng tạm dừng là loại của truy cập tới toàn bộ các điểm tăng tốc mọi thứ lên. Vì vậy, những gì nếu thay vì chúng tôi đến với một mã số, nơi không có tình trạng này xấu trong đó E là một tiền tố, ví dụ, của A - nói cách khác, nếu chúng ta có thể đảm bảo rằng các mô hình còn thiếu cho các chữ cái phổ biến dài cho các chữ cái ít phổ biến hơn, nhưng không có sự nhầm lẫn có thể? Một người đàn ông tên của Huffman năm trước phát minh ra chương trình này được gọi là mã hóa Huffman mà thực sự thúc đẩy một cấu trúc dữ liệu, chúng tôi đã dành một chút thời gian nói về tuần vừa qua, cây xanh, cây nhị phân cụ thể - một cây nhị phân có nghĩa là nó có không quá 2 trẻ em. Nó có thể là một con trái, có lẽ phải là một đứa trẻ, và đó là nó. Vì vậy, giả chỉ vì lợi ích của cuộc thảo luận mà ai đó muốn gửi một thông điệp trông như thế này. Đó là hoàn toàn vô nghia nhưng nó bao gồm Như, Bs, Cs, Ds, và Es. Và nếu bạn thực sự đếm lên tất cả Như, Bs, Cs, Ds, và Es và sau đó chia cho tổng số của các chữ cái, biểu đồ này ít ở đây nói rằng 45% của các chữ cái Es, 20% là As, 10% Bs, và vv. Vì vậy, nói cách khác, giả định rằng chuỗi trích dẫn chỉ là một số thông điệp mà bạn muốn gửi. Nó sẽ xảy ra là vô nghĩa chỉ để chúng ta có thể sử dụng như là một vài ký tự càng tốt, nhưng nó thực sự là trường hợp đó E vẫn là phổ biến nhất, và B và C là phổ biến nhất, ít nhất là 5 chữ cái trong bảng chữ cái. Vì vậy, làm thế nào chúng ta có thể đi về đến với một mã hóa, một mã hóa nhị phân, một mô hình của 0 và 1 cho mỗi của các chữ cái trong một cách mà E là một mẫu ngắn và có thể B và C là các mẫu hơi dài, một lần nữa, ý tưởng là chúng ta muốn sử dụng các bit ít hơn hầu hết thời gian và nhiều bit chỉ một lần trong một thời gian. Theo Huffman mã hóa, bạn có thể tạo ra một khu rừng cây. Có loại của một đường dây câu chuyện ở đây có liên quan đến cây và cũng là quá trình xây dựng. Hãy bắt đầu. Tôi đề nghị bạn bắt đầu với khu rừng này, có thể nói, 5 cây, mỗi trong số đó là một cây khá ngu ngốc. Cây này bao gồm chỉ một nút duy nhất, như đại diện ở đây là một vòng tròn. Vì vậy, mỗi người trong số những điều này có thể là một cấu trúc C và bên trong các cấu trúc C có thể là một phao đại diện cho đếm tần số và sau đó có thể là một char đại diện cho các lá thư. Vì vậy, suy nghĩ của các nút này là chỉ cần bất kỳ struct C cũ, nhưng, bây giờ, mức độ cao hơn. Đây là một khu rừng 5 cây, mỗi người chỉ có một nút duy nhất. Huffman đề xuất là chúng ta bắt đầu kết hợp những cây có tính tần số nhỏ nhất thành cây hơi lớn bằng cách kết nối chúng với một nút gốc mới. Vì vậy, trong số các chữ cái ở đây, nhận thấy rằng để thuận tiện cho tôi đã sắp xếp từ trái sang phải, mặc dù đó không phải là thực sự cần thiết, và thông báo rằng nhỏ nhất nút Hiện tại 10% và 10%. Vì vậy, Huffman đề xuất rằng chúng ta hợp nhất những 2 nút nhỏ nhất thành một cây mới bằng cách giới thiệu một nút cha mới và sau đó cung cấp cho phụ huynh một con trái và một đứa trẻ phải B là tùy tiện bên trái và C là tùy tiện quyền. Và sau đó Huffman tiếp tục đề xuất cho phép của bây giờ chỉ cần nghĩ về con trái ở một trong những cây này luôn luôn được đại diện bởi 0 và các con phải luôn luôn được đại diện bởi số 1. Nó không quan trọng nếu bạn flip chúng miễn là bạn phù hợp. Vì vậy, bây giờ chúng tôi có 4 cây trong rừng này. Và tôi nói 4 bởi vì bây giờ cây ở bên trái - và nó không phải quá nhiều một cây trong ý nghĩa là nó phát triển theo cách này, nó giống như một cây gia đình bây giờ là 0,2 là sắp xếp của cha mẹ của 2 đứa trẻ nhận thấy rằng cha mẹ mà chúng tôi đã rút ra 0,2. Chúng tôi đã thêm tính tần số của 2 trẻ em và cho nút mới tổng. Vì vậy, bây giờ chúng tôi chỉ cần lặp lại quá trình này. Tìm 2 nút nhỏ nhất và sau đó tham gia vào một cây mới và sau đó lặp lại quá trình hơn nữa. Ngay bây giờ chúng tôi có một vài ứng cử viên, 20%, 15%, và giảm thêm 20%. Trong trường hợp này, chúng tôi có để phá vỡ tie. Chúng ta có thể làm điều đó tùy tiện. Chúng tôi chỉ nên làm điều đó nhất quán. Trong trường hợp này tôi tùy tiện sẽ đi với một bên trái, và bây giờ tôi kết hợp 20% và 15% để cung cấp cho tôi một phụ huynh mới được gọi là 35%, có con bên trái là 0, có quyền của con là 1, và bây giờ chúng tôi có 3 cây trong rừng. Bạn có lẽ có thể nhìn thấy nơi này là đi. Nếu chúng ta lặp lại điều này một vài chi tiết, chúng ta sẽ có cây lớn hơn chỉ 1, tất cả các cạnh được dán nhãn với 0 và 1. Hãy làm điều đó một lần nữa. 35% là gốc cây đó. 20% và 45%, do đó, chúng ta sẽ kết hợp 35% và 20%. Bây giờ chúng tôi có cây này ở đây. Chúng tôi thêm những cùng nhau, chúng tôi có 55%. Bây giờ chỉ có 2 cây trong rừng. Chúng tôi làm điều này 1 thời gian thức, và hy vọng toán học tất cả các tần thêm bởi vì họ nên kể từ khi chúng tôi tính toán từ get-đi để thêm lên đến 100%. Và bây giờ chúng tôi có 1 cây. Vì vậy, đây là một cây mã Huffman. Nó loại mất một thời gian để đến đó bằng lời nói, nhưng thực tế là với một vòng lặp for hoặc với một hàm đệ quy, bạn có thể xây dựng điều này lên khá nhanh. Vì vậy, bây giờ chúng tôi có 1 nút mới, và tất cả các nút này bên trong đã được malloc'd, có lẽ, dọc theo con đường. Vì vậy, bây giờ ở trên cùng của cây này chúng tôi có 100%, nhưng bây giờ nhận thấy chúng ta có một con đường từ mới này great-great-ông bà cho tất cả great-great-great-cháu tất cả các cách ở phía dưới, tất cả lá. Những gì chúng tôi đang làm bây giờ là đề nghị để đại diện cho E với doanh nghiệp, chúng tôi chỉ đơn giản là sẽ sử dụng số 1. Tại sao? Bởi vì nếu chúng ta đi qua cây này từ gốc cuối cùng với các lá được gọi là E, chúng tôi làm theo chỉ 1 cạnh, cạnh phải, và đó là nhãn của khóa học tại trên bên phải 1. Vì vậy, ngụ ý ở đây cho Huffman là E mã hóa trong hệ nhị phân chỉ được 1. Và đó là đẹp, damn hiệu quả. Có thể không thực sự nhận được bất kỳ nhỏ hơn. Ngược lại, A sẽ được đại diện, nếu bạn làm theo logic, bởi những gì mô hình của bit thay vì? 01. Vì vậy, để có được đến A, chúng tôi bắt đầu ở gốc và chúng tôi đi bên trái và sau đó chúng tôi đi đúng, có nghĩa là chúng ta theo một 0 và sau đó là 1. Vì vậy, chúng ta sẽ đại diện cho chữ A với các mô hình 0 và 1. Và bây giờ nhận thấy chúng tôi đã có một tài sản của decodability ngay lập tức rằng chúng tôi không có trong mã Morse. Mặc dù cả hai mô hình này là khá ngắn - E là 1 bit, 2 bit - nhận thấy rằng họ không thể bị nhầm lẫn một hay khác, bởi vì nếu bạn nhìn thấy một 1, nó đã nhận được một E, nếu bạn nhìn thấy một 0 sau đó một 1 rõ ràng là đã nhận được một A. Tương tự như vậy, D là những gì? 001. C là gì? 0001. Và B là gì? 0000. Và một lần nữa, bởi vì tất cả các chữ cái chúng ta quan tâm là lá và không ai trong số họ là loại trung gian trong đường dẫn từ gốc đến lá, không có nguy cơ conflating mã hóa khác nhau 2 chữ cái ' bởi vì tất cả các mẫu bit xác định. 0000 sẽ luôn luôn được B. Có một nơi nào đó ở giữa không có nút mà bạn có thể nhầm lẫn giữa 1 lá thư cho người khác. Vì vậy, ngụ ý ở đây là gì? Bức thư phổ biến nhất - trong trường hợp này E - đã nhận được mã hóa ngắn nhất, Đã nhận được mã hóa ngắn nhất tiếp theo, và B và C, mà chúng ta đã biết từ các loại get-go trong những phổ biến nhất ở tần số 10% mỗi, họ đã nhận được mã hóa dài nhất. Và vì vậy điều này có nghĩa là bây giờ là nếu bạn muốn gửi một thông điệp rằng nén qua Internet hoặc trong một email hoặc tương tự, hơn là sử dụng ASCII tiêu chuẩn, bạn có thể gửi một tin nhắn mã hóa Huffman theo đó nếu bạn muốn gửi thư điện tử với doanh nghiệp, bạn gửi chỉ là một chút. Nếu bạn muốn gửi một A, bạn gửi 2 bit, 01, thay vì gửi 8 bit tiếp theo là một 8 bit tiếp theo là 8 bit khác và vv. Nhưng có một Gotcha ở đây. Nó không đủ để xây dựng cây này và sau đó bắt đầu gửi từ Alice đến Bob các mẫu bit ngắn hơn, chuỗi từ ASCII, bởi vì Alice cũng có thông báo cho Bob về những gì nếu Bob sẽ để có thể đọc tin nhắn nén? [Sinh viên phản ứng không nghe được] >> đó là gì? [Không nghe được sinh viên phản ứng] >> Trong cây. Hoặc thậm chí cụ thể hơn, những mã hóa, đặc biệt là kể từ khi trong câu chuyện này, chúng tôi đã thực hiện một cuộc gọi bản án tại một thời điểm. Nhớ rằng chúng ta phải chọn tùy tiện giữa 2 nút khác nhau 20%? Vì vậy, nó không phải là trường hợp đó, Bob, người nhận, chỉ có thể tái tạo lại cây của riêng mình bởi vì anh ta sẽ tạo ra cây bao giờ nên hơi khác nhau từ Alice. Hơn nữa, Bob không biết gì được thông báo ban đầu là bởi vì điều duy nhất Alice gửi anh ta, tất nhiên, là thông điệp nén. Vì vậy, đánh bắt với nén như thế này là, có, Alice có thể tiết kiệm rất nhiều toàn bộ bit bằng cách gửi 1 cho E và 01 cho A và vv, nhưng cô cũng để thông báo cho Bob lập bản đồ giữa các chữ cái và các bit bởi vì họ có thể không rõ ràng dựa vào chỉ ASCII nữa nếu chúng ta không sử dụng ASCII. Vì vậy, cô có thể gửi cho anh ta cây bằng cách nào đó - viết nó xuống, lưu nó như là dữ liệu nhị phân hoặc một cái gì đó như thế - hoặc chỉ cần gửi cho anh ta một cheat sheet chút, một tập tin Excel, cho thấy các ánh xạ. Vì vậy, hiệu quả của nén thực sự giả định rằng các thông điệp mà bạn đang gửi là khá lớn, ít nhất là kích thước trung bình, bởi vì nếu bạn đang gửi một thông điệp siêu ngắn, nếu bạn chỉ muốn để gửi tin nhắn BAD, mà sẽ xảy ra là một từ chúng ta có thể đánh vần ở đây, B-A-D, bạn có thể sẽ sử dụng các bit ít hơn, nhưng bắt là nếu bạn cũng phải thông báo cho Bob cây hoặc những mã hóa, bạn sẽ có thể lớn hơn tất cả các khoản tiết kiệm có những điều nén để bắt đầu với. Vì vậy, nó thực sự có thể là trường hợp đó, nếu bạn cố gắng nén ngay cả với một cái gì đó giống như định dạng file zip hoặc bạn có thể quen với - khá nhỏ các tập tin, tập tin ngay cả trống rỗng - đôi khi những tập tin có thể được lớn hơn và không nhỏ hơn. Nhưng thực tế chỉ xảy ra cho kích thước file nhỏ, do đó, nó sẽ không làm cho một file gigabyte là 2 GB; chúng ta đang thực sự nói byte hoặc kilobytes một vài. Một số chương trình như zip có đủ thông minh để nhận ra rằng, "Bạn sẽ phải chi tiêu nhiều bit nén này." "Hãy để tôi không bận tâm nén nó cho bạn ở tất cả." Vì vậy, đây chỉ là 1 cách sau đó nén định dạng văn bản. Chúng tôi có thể thực hiện một cái gì đó như thế này trong C. Ví dụ, ở đây là làm thế nào chúng ta có thể đại diện cho một nút trong cây này nơi chúng tôi có một char cho biểu tượng, một giá trị nổi cho tần số, và như chúng ta đã nhìn thấy với cấu trúc dữ liệu khác của chúng tôi, 2 con trỏ, 1 con trái, 1 bên phải, một trong đó có thể được NULL, nhưng nếu không, nó đề cập đến một con trái và một đứa trẻ phải. Vì vậy, điều này sau đó là mã hóa Huffman, và đó là 1 cách mà bạn có thể đi về nén thông tin, và nó chắc chắn một trong những dễ dàng nhất để thực hiện trong bối cảnh, nói rằng, cấu trúc dữ liệu tuần trước, mặc dù ngay cả các thuật toán phức tạp hơn tồn tại mà có thể làm đột biến thậm chí còn phức tạp hơn các dữ liệu của bạn. Bất kỳ câu hỏi sau đó trên cây, cây nhị phân, hoặc nén của văn bản? [Sinh viên] có một số không rõ ràng, như thế nào nếu không nghe được] chia thành 01 sau đó 011 sẽ là mơ hồ, phải không? [Không nghe được] >> câu hỏi. Sự mơ hồ. Hãy để tôi tóm tắt bằng cách đề cập đến bức tranh này ở đây. Bởi vì các ký tự mà bạn nén, các đại diện của, theo định nghĩa của thuật toán này luôn luôn giữ lá, bạn sẽ không bao giờ vô tình sử dụng cùng một khuôn mẫu bit cho các tiền tố của chữ nhiều. Vì vậy, nói cách khác, bạn đang quan tâm, nó giống như âm thanh, một sự mơ hồ phát sinh theo đó 001 có thể là sự khởi đầu của B hoặc bắt đầu của C hoặc một cái gì đó như thế. Nhưng điều đó không phải là trường hợp vì thông báo rằng tất cả các chữ cái trong bảng chữ cái chúng ta đang mã hóa có lá. Sự mơ hồ chỉ có thể phát sinh, như trong trường hợp của mã Morse, nếu, chẳng hạn, C là một nơi nào đó dọc theo con đường từ gốc đến B. [Sinh viên] Right. Vì vậy, trong trường hợp đó, nói rằng A có 2 lá. >> Say A có - đó một lần nữa. [Sinh viên] Say A có 2 lá, F và G, và sau đó G - >> Được rồi. Nhưng nó có thể không. A chính nó không thể có lá F và G bởi vì những chữ cái F và G mình sẽ để lại một nơi nào đó để bên trái của B hoặc quyền của E. Vì vậy, theo định nghĩa, họ phải có lá. Nếu không, bạn chính xác, chúng tôi đã không giải quyết được vấn đề mà mã Morse phải đối mặt với. Tốt câu hỏi. Các câu hỏi khác? Được rồi. Khái niệm về bit, nó quay ra chúng ta đã có sức mạnh tất cả cùng mà chúng tôi đã không thực sự được sử dụng khi nó đến để thao tác các số 0 và 1. Chúng tôi hỏi về điều này trên một trong những bài tập đầu tiên, cụ thể là, làm thế nào để bạn đi về chuyển đổi chữ hoa thành chữ thường hoặc ngược lại? Hoặc cụ thể hơn, một của những psets đầu tiên hỏi bao nhiêu bit bạn thực sự có để lật để thay đổi thành chữ thường hoặc ngược lại? Dưới đây là một lời nhắc nhở nhanh chóng của 65 và 97 trông giống như trong hệ nhị phân. Và thậm chí nếu câu hỏi đó đã loại phai nhạt trong trí nhớ của bạn, bạn có thể thấy một lần nữa ở đây là bao nhiêu bit cần được lộn thay đổi vốn thành chữ thường? Chỉ cần 1. Họ chỉ khác nhau ở 1 vị trí, bit thứ ba từ bên trái. Trong khi đó, A có 010, ít có một 011. Vì vậy, bằng cách nào đó chúng ta cần phải chỉ cần có thể để lật rằng bit, và sau đó chúng tôi có thể tận dụng hoặc chữ thường chữ. Chúng tôi đã làm điều này trong quá khứ bằng cách thực sự sử dụng nếu có điều kiện và kiểm tra nếu bức thư là giữa tư bản A và vốn Z, sau đó kết quả đầu ra như A - "a" + 26 hoặc một cái gì đó như thế. Bạn có thể làm một sự thay đổi số học các chữ cái trong bảng chữ cái. Nhưng nếu chúng ta chỉ có thể lật rằng bit duy nhất? Làm thế nào bạn có thể đi về việc tham gia 1 byte bit, do đó 8 bit như 01.000.001 và 01.100.001? Nếu bạn đã có những mô hình của các bit, làm thế nào chúng ta có thể thay đổi chỉ là 1 trong số họ? Điều gì sẽ xảy ra nếu chúng tôi giới thiệu màu vàng ở đây mô hình này khác bit? Nếu tôi làm cho 0s chuỗi màu vàng toàn bộ trừ bit 1 mà tôi muốn thay đổi và sau đó tôi giới thiệu một nhà điều hành mới được biết đến như là một nhà điều hành bitwise - Bitwise trong ý nghĩa rằng nó hoạt động trên các bit riêng lẻ, không phải trên toàn bộ một byte hoặc 4 byte tất cả cùng một lúc. Thanh dọc này có màu vàng cho thấy rằng nếu chúng ta có những đại diện vốn và bitwise "hoặc" với chuỗi màu vàng của các bit? Nói cách khác, suy nghĩ lại về cuộc thảo luận của chúng tôi các biểu thức Boolean trong Scratch và sau đó trong C. Làm một Boolean hoặc có nghĩa là đó là sự thật, hoặc là điều đầu tiên là đúng hoặc điều thứ hai là đúng hoặc cả hai đều có thể đúng, và sau đó kết quả đầu ra chính nó là đúng sự thật. Trong trường hợp này ở đây, chúng ta nhận được nếu chúng ta 0 "hoặc" ed với 0? False hay sai? Nó vẫn còn sai, vì thế chữ thường một vẫn còn như mong đợi. Điều gì sẽ xảy ra nếu thay vì chúng ta làm 1 hay 0? Điều này bây giờ còn 1, nhưng nhận thấy những gì xảy ra ở đây. Nếu chúng ta bắt đầu có vốn đầu A và chúng tôi tiếp tục "hoặc" bit riêng lẻ như chúng tôi đang làm gì ở đây, 0 hoặc màu vàng 1 cho chúng ta những gì xuống đây? Điều này cho chúng ta 1. Trong thực tế, giả sử chúng tôi không biết một phiên bản chữ hoa của ít những gì thực sự là. Hãy làm điều này. Hãy để tôi di chuyển này trở lại ở đây. Hãy làm điều này một lần nữa. 0 hoặc 0 mang lại cho tôi 0. 1 hoặc 0 mang lại cho tôi 1. 0 hoặc 1 mang lại cho tôi 1. 0 hoặc 0 mang lại cho tôi 0. Tiếp theo là 0, tiếp theo là 0, tiếp theo là 0. 1 hoặc 0 mang lại cho tôi 1. Và do đó, ngay cả khi chúng tôi không biết trước những gì thành chữ thường một là, chỉ đơn giản bằng cách "hay" ing với mô hình của các bit mà chúng tôi đã trình bày ở đây màu vàng, bạn có thể tự chữ thường a vốn bằng cách đảo mà bit. Chúng tôi sử dụng tuần biểu hiện trước đây: flipping một chút. Làm thế nào để bạn thực sự làm điều đó lập trình? Bạn sử dụng những gì thường được gọi là mặt nạ, một chuỗi các bit, trong trường hợp này chỉ để xảy ra để trông giống như con số này ở đây, và sau đó bạn "hoặc" với nhau bằng cách sử dụng nhà điều hành này C mới, không | |, bạn sử dụng một | và bạn thực sự sẽ nhận được câu trả lời ở đây vì lý do tại sao? Đây là vị trí số 1, 2 nơi, 4s, 8s, 16s, 32s. Vì vậy, nó chỉ ra rằng nếu bạn có một bức thư vốn và bitwise "hoặc" nó với số nguyên 32, bởi vì số nguyên 32 khi bạn nhìn vào nó như các bit như thế này, điều đó có nghĩa là bạn có thể lật các bit mà bạn thực sự muốn. Và tương tự như - và chúng ta sẽ xem xét mã trong thời điểm này chỉ là một - giả sử chúng ta muốn đi theo một hướng khác. Làm thế nào để bạn đi từ vốn chữ thường Một? Bit cần phải thay đổi? Đó là cùng. Chúng tôi muốn thay đổi điều đó bit thứ ba từ 1 đến 0 một. Và làm thế nào chúng ta có thể đi về việc này? Làm thế nào để chúng ta tắt một chút? Với những gì mô hình của các bit, chúng ta có thể tắt một chút? Điều gì sẽ xảy ra nếu chúng ta sắp xếp của nghịch mặt nạ? Trong khi đó, trước khi chúng tôi thực hiện 0s mặt nạ màu vàng toàn bộ trừ bit 1, chúng tôi muốn để bật, những gì nếu thời gian này chúng tôi thực hiện 1s mặt nạ toàn bộ ngoại trừ các bit mà chúng ta muốn tắt và sau đó sử dụng những gì nhà điều hành? Điều gì sẽ xảy ra nếu chúng tôi "và" những điều? Hãy có một cái nhìn. Nếu bây giờ chúng ta lật này, giả sử rằng một lần nữa tôi tạo ra một mặt nạ đó là tất cả 1s trừ bit 1 mà tôi muốn tắt và sau đó chứ không phải là "hay" những con số màu trắng lên hàng đầu với các con số màu vàng xuống đây, điều gì sẽ xảy ra nếu tôi thay vì "và" họ lại với nhau? Nó được gọi là một phép toán và Một cách hợp lý, đó là điều tương tự như một Boolean. Điều này mang lại cho tôi 0 & 1 là 0. Vì vậy, sai và đúng là sai. Đúng sự thật và sự thật là sự thật. Và đây là sự kỳ diệu: Đúng và sai là sai, vì thế chúng tôi đã tắt mà bit. Và bây giờ phần còn lại của câu chuyện là hơi đơn giản. Bởi vì phần còn lại của mặt nạ là 1s, nó không có vấn đề gì các con số là màu trắng. Khi bạn "và" một cái gì đó với sự thật, bạn sẽ không thay đổi giá trị của nó. Nếu đó là sự thật, nó sẽ vẫn còn đúng. Nếu nó sai, nó sẽ vẫn sai. Nhưng kỳ diệu xảy ra khi bạn có một cái gì đó là sự thật và sau đó bạn "và" nó với sai. Điều này có tác tắt rằng bit. Vì vậy, một chút khó hiểu có. Chúng ta hãy thực sự nhìn vào một số mã, mà thực sự có thể nhìn khó hiểu hơn, nhưng chúng ta hãy xem ở đây tại ToLower. Nếu tôi nhìn vào ToLower, đi từ A hoa thành chữ thường, chúng ta hãy xem làm thế nào chúng ta có thể thực hiện chương trình này. Đây là chính, và nó không phải dùng bất cứ đối số dòng lệnh. Tôi tuyên bố một c ký tự cho chữ mà người dùng sẽ gõ vào Sau đó tôi sử dụng một do quen thuộc vòng lặp trong khi chỉ cần đảm bảo rằng người dùng chắc chắn mang lại cho tôi số vốn hoặc B hoặc C. .. Z, do đó, họ cung cấp cho tôi một cái gì đó giữa A và Z. Và bây giờ tôi đang làm gì ở đây? Tôi "hay" ing với 0x20, nhưng đó là thực sự giống như - và chúng tôi sẽ trở lại với điều này trong một thời điểm - 32. Vì vậy, một lần nữa, 32 là mô hình này của các bit ở đây. Tại sao chúng ta biết điều này? Chỉ cần suy nghĩ lại về tuần 0. Đây là vị trí số 1, 2 nơi, 4s, 8s, 16s, 32s nơi. Vì vậy, con số này màu vàng xảy ra là 32. Sau đó tôi có thể mất một lá thư như char ở đây, phép toán "hoặc" nó theo nghĩa đen với số lượng 32, và những gì tôi nhận được trở lại? Phiên bản chữ thường char đó. Một lúc trước, mặc dù, tôi bày tỏ trong một ký hiệu cơ sở khác nhau. Điều này đã đại diện cho những gì? >> [Sinh viên] Hexadecimal. [Malan] Điều này xảy ra để đại diện cho hệ thập lục phân. Chúng tôi đã không nói về hệ thập lục phân tất cả những gì, nhưng nó thực sự thuận tiện trong các trường hợp như thế này. Mặc dù có vẻ phức tạp hơn và mặc dù có vẻ như 20 và không 32, nó chỉ ra rằng hệ thập lục phân thực sự là ký hiệu thuận tiện siêu bởi vì trong hệ thập lục phân mỗi chữ số sau khi 0x - và điều này có nghĩa là không có gì; đây là quy ước của con người chỉ nói rằng ở đây có một số thập lục phân - mỗi người trong số các chữ số, 2 và sau đó 0, mình có thể được đại diện với chính xác 4 bit. Vì vậy, nếu chúng ta làm điều này, hãy để tôi mở một trình soạn thảo văn bản ở đây - lạ autocomplete - nếu chúng ta làm một trình soạn thảo văn bản nhỏ ở đây, 0x20 số có nghĩa là ở đây là 4 bit, đây là một 4 bit. Hãy làm 4 bit ngoài cùng bên phải đầu tiên. 0 khi biểu diễn với 4 bit là gì? Siêu dễ dàng. Chỉ cần tất cả các số 0. Vì vậy, 4 bit như là số 0. Làm thế nào để bạn đại diện 2? Nó được một lúc kể từ khi chúng tôi đã làm điều này, nhưng đó là 0100. Vì vậy, đây là nơi 1s, đây là nơi 2, và sau đó nó không quan trọng những gì các nơi khác. Nói cách khác, trong hệ thập lục phân, bạn có thể nói 0x20, nhưng nếu sau đó bạn suy nghĩ về 2 là những gì và làm thế nào là nó trong hệ nhị phân, 0 là gì và thế nào là nó trong hệ nhị phân, các câu trả lời cho những câu hỏi này và điều này, tương ứng. Vì vậy, 0x20 xảy ra để đại diện cho mô hình của 8 bit, đó chính là mặt nạ mà chúng tôi muốn. Vì vậy, đây là cho thời điểm này chỉ là một bài tập trí tuệ, nhưng thực tế là trong mã của nó thường phổ biến hơn để viết các hằng số như thế này trong hệ thập lục phân bởi vì sau đó các lập trình viên có thể tương đối dễ dàng, thậm chí nếu cần một số giấy và bút chì, tìm ra những gì mà mô hình của các bit bởi vì bạn có thể không chỉ thể hiện 0 và 1 thường trong mã. Bạn không thể đi 00.010 và vv. Bạn phải chọn ký hiệu thập phân hoặc thập lục phân hay bát phân hoặc khác. Hầu hết mọi người có xu hướng chọn hệ thập lục phân chỉ đơn giản là để mỗi chữ số đại diện cho 4 bit và bạn có thể làm điều này toán học nhanh chóng. Và tôi sẽ vẫy tay của tôi tại toupper, đó là gần như giống nhau, nó trông gần như giống hệt nhau. Toupper xảy ra để sử dụng không phải là nhà điều hành hoặc là anh chàng này và df. Df đại diện cho điều gì? df? Bất cứ ai? >> [Sinh viên] 255. 255? Không 255. Đó sẽ là ff. Chúng tôi sẽ để lại một trong những điều này như là một ít tập thể dục. Nhưng nếu bạn đi từ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 và sau đó điều gì sẽ đến sau 9? Chúng tôi đang loại ra khỏi chữ số thập phân, nhưng trong hệ thập lục phân, những gì đến sau 9? [Sinh viên] a. >> Vì vậy, a, b, c, d. Bạn có thể tìm ra từ đó những gì mô hình của các bit d thực sự đại diện. Và nếu chúng ta làm toán, chúng ta sẽ thấy rằng mặt nạ bạn sẽ nhận được trở lại là giống hệt nhau này. Đây là f, tất cả các 1s, và điều này là d. Vì vậy, df đại diện cho mặt nạ đó. Được rồi. Và cuối cùng, không phải để làm những thứ âm thanh siêu, siêu kỹ thuật, nhưng giả sử chúng ta muốn viết một chương trình mà thực hiện điều này. Hãy để tôi đi trước và thực hiện nhị phân, mà là một chương trình trong một tập tin gọi là binary.c. Và bây giờ cho phép tôi chạy nhị phân và cung cấp cho tôi một số nguyên không âm. Hãy bắt đầu dễ dàng và gõ vào 0. Điều này bây giờ là một chương trình in ra một số nguyên trong biểu diễn nhị phân của nó. Vì vậy, nếu tôi chơi game này một lần nữa và loại chỉ trong 1, tôi cần phải có được một đại diện 32-bit của 1. Nếu tôi làm điều này một lần nữa với 2, tôi sẽ nhận được điều đó. Nếu tôi làm 7, tôi sẽ nhận được một 1s vài lúc kết thúc và vv. Nó chỉ ra tôi đề cập đến điều này bởi vì với hoạt động bitwise bạn thực sự có thể làm 1 điều khác là tốt. Bạn có thể tạo ra những mặt nạ tự động. Hãy xem xét ví dụ 1 cuối cùng liên quan đến hoạt động Bitwise. Đây là phần đầu tiên của mã này, nhắc nhở người dùng cho một số, và nó khẳng định rằng bạn cung cấp cho tôi một số nguyên không âm. Vì vậy, đó là sắp xếp các công cụ trường học cũ. Nhưng đây là một cái gì đó là loại thú vị. Làm thế nào để đi về việc in một số trong hệ nhị phân? Lần đầu tiên tôi lặp lại từ những gì những gì? Kích thước của một int thường là gì, ít nhất là trong thiết bị? >> [Sinh viên] 4. Đó là 4. Vì vậy, 4 * 8 là 32 - 1 là 31. Vì vậy, nếu tôi bắt đầu đếm từ 31, đại diện cho, nó quay ra, chỉ khái niệm, các bit 31 hoặc thứ tự các bit cao nhất, đó là anh chàng này ở đây, trong khi đây là có được bit 0. Vì vậy, đây là một chút 01 ... bit 31. Vì vậy, mã này đang làm gì? Thông báo này cho vòng lặp, mặc dù có vẻ khó hiểu, chỉ là lặp lại từ 31 xuống 0. Có bấy nhiêu thôi. Vì vậy, phần thú vị hiện nay là phải trong 5 dòng ở đây. Chú ý rằng trong dòng này tôi tuyên bố một biến gọi là mặt nạ để phù hợp với câu chuyện của chúng ta về những con số màu vàng. Và sau đó điều này đang làm gì? Đây là một nhà điều hành bitwise chúng tôi đã không nhìn thấy trước, rất có thể. Đó là các nhà điều hành dịch chuyển trái. Toán tử này thực hiện điều này. Dưới đây là số 1, và nếu bạn làm tôi lại thay đổi, sự thay đổi trái, làm những gì bạn nghĩ rằng có tác dụng làm mà cá nhân 1? Nghĩa đen thay đổi nó. Vì vậy, nếu số 1 là những gì bạn có trên bên trái và bạn bắt đầu bằng cách khởi tạo i đến 31, đó là những gì sẽ làm gì? Nó sẽ mất số 1 này và thay đổi nó 31 địa điểm ở đây. Và bởi vì rõ ràng là không có chữ số khác đằng sau nó, những người theo mặc định sẽ được thay thế với số 0. Vì vậy, bạn sẽ bắt đầu với số 1, trong đó tất nhiên trông như thế này - và để cho tôi vẽ nó trên đây ở trung tâm. Và sau đó khi bạn chuyển sang bên trái, anh chàng này về cơ bản đi theo cách này. Nhưng ngay sau khi bạn làm điều đó, 0 được lấp đầy. Nếu bạn thay đổi nó một lần thứ hai, nó đi theo cách này và 0 khác được lấp đầy. Bạn thay đổi nó một lần nữa và sau đó 0 khác được lấp đầy. Vì vậy, nếu bạn làm điều này điều của 1 << i 31 địa điểm, bạn sẽ nhận được một mặt nạ đó là 32 ký tự, là tận cùng bên trái trong số đó là một 1, tất cả các phần còn lại trong số đó là một 0. Và nó biến ra, như một sang một bên, thay đổi một số bên trái như thế này cũng tình cờ, và đôi khi thuận tiện, có tác dụng làm những gì con số đó? >> [Sinh viên] Tăng gấp đôi nó. Tăng gấp đôi nó bởi vì mỗi cột vị trí số 1, 2 nơi, nơi 4s, 8s nơi, nơi 16 - họ sẽ tăng gấp đôi tất cả như bạn đi bên trái. Hay đúng hơn, khi bạn chuyển 1s bạn sẽ kết thúc tăng gấp đôi giá trị của số. Bạn có thể làm biến đổi thú vị của các chữ số bằng cách chuyển tất cả mọi thứ theo cách này bởi quyền hạn của 2. Vì vậy, làm thế nào để làm việc này? Điều này sau đó mang lại cho tôi một chiếc mặt nạ đó là tất cả 0s trừ 1 ở vị trí chính xác tôi muốn nó, và sau đó biểu thức này, bị mất cắp từ toupper.c, chỉ đơn giản là nói lấy số n mà người sử dụng gõ vào, "Và" với chiếc mặt nạ, và bạn đang đi để có được? Bạn đang đi để có được một 1 nếu có là 1 trong vị trí đó đeo mặt nạ, hoặc bạn sẽ nhận được một 0 nếu không có. Và do đó, tất cả các chương trình này không có hiệu quả là nó có một vòng lặp, và nó tạo ra một mặt nạ với một 1 ở đây, sau đó một 1 ở đây, sau đó một 1 ở đây, và nó sử dụng Bitwise và lừa này để nói là có một bit 1 trong đầu vào của người sử dụng ở đây? Là có một bit 1 trong đầu vào của người sử dụng ở đây? Và nếu như vậy, nghĩa là in 1, khác in 0. Chúng tôi đang làm điều này với ints chỉ vì đó là lý do tại sao chúng tôi đang làm 32 bit thay vì 8, nhưng những gì chúng tôi đã giới thiệu sau đó là Bitwise và bitwise này hoặc, và nhà điều hành này chuyển trái, mà không phải là thường xuyên terribly hữu ích, nhưng hóa ra chúng có thể được. Trong thực tế, nếu bạn đã để đại diện cho một cái gì đó giống như một mảng của Booleans chỉ để đại diện cho đúng hay sai, giả sử bạn muốn theo dõi hay không một căn phòng đầy đủ của 300 học sinh là hiện tại, bạn có thể khai báo một mảng có kích thước 300 loại bool để bạn có được 300 bools, và bạn có thể thiết lập mỗi đúng nếu một người nào đó và sai khác. Tại sao là đại diện trong cấu trúc dữ liệu đó không hiệu quả? Gì xấu về việc thiết kế các cấu trúc dữ liệu, một mảng của 300 bools? Bool trong thực tế, bên dưới mui xe là gì? Điều này cũng là một cái gì đó mà có thể không được quen thuộc. Hóa ra là không bool. Nhớ là chúng tôi loại được tạo ra với file cs50.h, mà bản thân nó bao gồm tiêu chuẩn bool. C là loại ngu ngốc, mặc dù, khi nói đến bool. Nó sử dụng 8 bit để đại diện cho tất cả các bool, là hoàn toàn lãng phí bởi vì rõ ràng, bao nhiêu bit để bạn cần phải đại diện cho một bool? Chỉ cần 1. Vì vậy, nó chỉ ra rằng nếu bây giờ bạn có khả năng với các nhà khai thác bitwise để thao tác bit cá nhân ngay cả trong một char, ngay cả trong một byte đơn, nó quay ra bạn có thể làm giảm bộ nhớ cần thiết để đại diện cho một cái gì đó ngu ngốc như cấu trúc: dữ liệu đó theo kiểu của một yếu tố của 8. Thay vì sử dụng 8 bit để đại diện cho đúng hay sai, bạn có nghĩa là có thể sử dụng 1 bằng cách sử dụng một byte duy nhất cho mỗi 8 học sinh trong lớp học và điều chỉnh từ 0 1 bit cá nhân bằng cách sử dụng các loại thủ đoạn ở mức độ thấp. Điều đó thực sự chấm dứt năng lượng. Có bất kỳ câu hỏi về hoạt động Bitwise? Yeah. >> [Sinh viên] Có một nhà điều hành độc quyền hay không? Vâng. Có một nhà điều hành độc quyền hoặc trông như thế này, ^, biểu tượng cà rốt, có nghĩa là chỉ là điều đầu tiên hoặc điều thứ hai có thể là một 1 cho đầu ra là một 1. Đó cũng là một không, ~, mà sẽ cho phép bạn để đảo ngược một 0 đến 1 hoặc ngược lại cũng. Và cũng có một nhà điều hành thay đổi quyền, >>, mà là đối diện của một trong những chúng ta đã thấy. Được rồi. Hãy để có những điều đến một cấp độ cao hơn. Chúng tôi bắt đầu bằng cách nói chuyện về văn bản và sau đó nén và đại diện cho các văn bản với số lượng ít hơn của các bit; chúng ta đã nói một chút về việc làm thế nào chúng ta có thể bắt đầu thao tác mọi thứ trên một mức độ bitwise. Bây giờ hãy thu nhỏ trở lại tăng 10.000 feet để đại diện điều phức tạp hơn như đồ họa. Ở đây chúng tôi có một lá cờ của Đức, ở đây chúng tôi có một của Pháp. Đây có thể được đại diện trong các định dạng tập tin bạn có thể biết GIF, ví dụ. Nếu bạn đã từng nhìn thấy một hình ảnh trên trang web kết thúc. Gif, đây là một trao đổi định dạng đồ họa. Đây là 2 lá cờ ở đây loại cho vay mình đến nén cho những gì lý do có lẽ rõ ràng? >> [Không nghe được sinh viên phản ứng] Có rất nhiều sự lặp lại, phải không? Để gửi lá cờ của Đức, nghĩ về điều này như là một hình ảnh trên màn hình sao trong những ngày đầu của bạn. Bạn có thể nhớ lại rằng có điểm ảnh cá nhân chấm hoặc soạn một hình ảnh. Có cả một hàng chấm đen và toàn bộ hàng khác của các chấm đen. Có một loạt các hàng chấm đen mà chúng ta có thể thấy nếu chúng ta thực sự thu nhỏ trong, giống như khi chúng ta phóng to trên khuôn mặt của Rob trong Photoshop. Ngay khi chúng tôi nhận sâu hơn và sâu hơn và sâu hơn vào hình ảnh, bạn bắt đầu nhìn thấy các pixelation, tất cả các hình vuông mà bao gồm mắt của mình trong trường hợp đó. Tương tự đối phó ở đây. Nếu chúng ta phóng to khá một chút, bạn sẽ thấy dấu chấm cá nhân. Vâng, đây là một sự lãng phí của các bit. Nếu 1/3 của lá cờ là màu đen và 1/3 của lá cờ là màu vàng và vv, tại sao chúng ta không thể bằng cách nào đó nén lá cờ này? Và ngay cả cờ Pháp có thể được nén mặc dù mô hình là một chút khác nhau. Nó chỉ ra các định dạng file GIF là một định dạng nén lossless, có nghĩa là bạn có thể có một hình ảnh như cờ Đức ở đây, bạn có thể ném đi rất nhiều của các bit của nó mà không bị mất chất lượng. Điều này là trái ngược với một cái gì đó giống như hình ảnh JPEG, mà hầu hết chúng ta có thể quen thuộc hơn. Facebook hình ảnh và ảnh trên Flickr và các loại tương tự gần như luôn luôn lưu lại dưới dạng hình ảnh JPEG khi họ đang tải lên, nhưng hình ảnh JPEG là một định dạng lossy - nhờ đó mà bạn vứt bit - lossy nhưng bạn cũng vứt chất lượng. Và vì vậy nếu bạn nén hình ảnh với Photoshop hoặc tải chúng lên Facebook hoặc đưa họ về một chiếc điện thoại thực sự crappy, bạn biết rằng hình ảnh bắt đầu để có được rất lem luốt và pixelated, và đó là bởi vì nó được nén bằng máy tính hoặc điện thoại bằng cách ném thông tin đi. Tuy nhiên, GIF là tuyệt vời ở chỗ nó có thể sử dụng các bit ít hơn nó có thể theo mặc định mà không bị mất bất kỳ thông tin nào. Và nó về cơ bản như sau. Thay vì lưu trữ trong một tập tin như một BMP sẽ một triple RGB cho màu đen, màu đen, màu đen, màu đen, màu đen, màu đen, màu đen, màu đen, màu đen, màu đen, màu đen, màu đen và vân vân, đúng hơn, định dạng GIF sẽ nói, "Black" và sau đó, "Lặp lại 100 lần", hoặc một cái gì đó như thế. "Black, lặp lại 100 lần, màu đen, lặp lại 100 lần ..." "Vàng, lặp lại 100 lần." Và như vậy nó ghi nhớ, về cơ bản, các điểm ảnh tận cùng bên trái và sau đó mã hóa bằng cách nào đó các khái niệm lặp đi lặp lại rằng điểm ảnh một lần nữa và một lần nữa. Vì vậy, GIF sau đó có thể nén mình mà không bị mất bất kỳ thông tin nào. Nhưng nếu bạn đã đoán, nếu đó là các thuật toán mà GIF sử dụng, những lá cờ này, mặc dù họ trông giống hệt nhau về kích thước, là có được nhỏ hơn khi được lưu trên đĩa như là một GIF? >> [Sinh viên] Đức. Đức sẽ nhỏ hơn? Tại sao? [Sinh viên] Bởi vì bạn lặp lại nó nhiều, nhiều lần theo chiều ngang và sau đó bạn lặp lại một thời gian khác. >> Chính xác. Bởi vì những người phát minh ra GIF chỉ là loại tự ý quyết định rằng sự lặp lại sẽ được thừa hưởng theo chiều ngang và theo chiều ngang. Có rất nhiều chi tiết lặp đi lặp lại theo chiều ngang đây trong lá cờ Đức hơn trong lá cờ Pháp. Vì vậy, nếu chúng ta thực sự mở ra một thư mục trên ổ cứng của tôi có những ảnh GIF, bạn thực sự có thể thấy rằng cờ Đức ở đây là 2 kilobyte và một của Pháp là 4 kilobyte. Nó sẽ xảy ra là một sự trùng hợp ngẫu nhiên đó là một trong hai lần khác, nhưng đó là trong thực tế, các trường hợp đó, lá cờ Pháp là lớn hơn nhiều. Mặc dù chúng ta đang nói ở đây về đồ họa, cùng một ý tưởng có thể áp dụng đối với không phải những thứ như cờ nhưng hình ảnh là một chút phức tạp hơn. Nếu bạn có một hình ảnh của một quả táo, chắc chắn có rất nhiều trùng lặp, do đó, bằng cách nào đó chúng ta có thể nhớ rằng nền mặc định là màu xanh và không, như hình ảnh bên phải, phải nhớ màu sắc của mỗi điểm ảnh trong bức hình này. Vì vậy, chúng ta có thể ném bit đi mà không bị mất thông tin. Quả táo vẫn còn trông như nhau. Trong ví dụ này, ở đây, bạn có thể xem những gì sẽ xảy ra trong một bộ phim. Những đại diện cho cuộn phim trường cũ theo đó hình ảnh trên có bạn có lái xe RV qua một ngôi nhà và một cái cây. Và như van mà các ổ đĩa qua từ trái sang phải, những gì rõ ràng là không thay đổi? Ngôi nhà không đi bất cứ nơi nào, và cây không phải là đi bất cứ nơi nào. Điều duy nhất mà di chuyển là xe trong trường hợp này. Vì vậy, khi nền không thay đổi cho thấy, những gì bạn có thể làm trong các bộ phim tương tự như vậy chỉ cần vứt bỏ thông tin mà không thay đổi giữa các khung hình. Điều này thường được biết đến như là nén interframe theo đó nếu khung này trông gần giống như một trong những điều này, chúng ta không bận tâm lưu trữ trên đĩa bất kỳ các thông tin giống hệt nhau những khung hình trung gian, chúng ta chỉ sử dụng một lần trong một khung hình chính mà thực sự lưu trữ thông tin dư thừa chỉ là một kiểm tra sanity ít. Ngược lại, một cách tiếp cận video nén là trong ví dụ thứ hai và thấp hơn ở đây, thay vì lưu trữ 30 khung hình, tại sao không bạn chỉ cần lưu trữ 15 khung hình một giây để thay thế? Thay vì các loại phim chảy đẹp, hoàn hảo, nó có thể giống như nó nói lắp một chút, một chút trường học cũ, nhưng ảnh hưởng thực sẽ được sử dụng các bit ít hơn nếu không có thể là cần thiết. Vì vậy, nơi thực hiện điều này sau đó lại cho chúng tôi? Đó là một chút của một sang một bên trên nơi nào khác bạn có thể đi với nén. Để thêm vào đó, một lớp học như CS175 đây. Dưới đây là một ví dụ khác trong video. Nếu ong là điều duy nhất di chuyển, bạn thực sự có thể vứt bỏ thông tin trong những khung hình trung bởi vì hoa và bầu trời và lá không thay đổi. Nhưng Bây giờ chúng ta hãy xem xét 1 điều cuối cùng. Trong 5 phút tiếp theo, chúng tôi rời khỏi C đằng sau mãi mãi trong bài giảng? Vâng. Không có trong các psets, mặc dù. Cuối cùng câu chuyện về C và sau đó chúng tôi nhận được công cụ rất sexy liên quan đến HTML và Web và woo-hoo. Được rồi. Ở đây chúng tôi đi. Đó là động lực. Hóa ra tất cả thời gian này khi chúng tôi đã được viết chương trình chúng tôi chạy kêu vang. Và Clang, chúng tôi đã nói từ tuần đầu tiên khá nhiều, có mã nguồn và chuyển đổi nó thành mã đối tượng. Phải mất C và chuyển đổi nó thành 0 và 1. Tôi đã loại được nói dối với bạn trong một vài tuần bởi vì nó không hoàn toàn đơn giản như vậy. Có rất nhiều chi tiết bên dưới mui xe khi bạn chạy một chương trình như Clang. Trong thực tế, quá trình biên dịch một chương trình thực sự có thể được tóm tắt, như bạn có thể nhớ lại từ video của Rob trên trình biên dịch, thành 4 bước: tiền xử lý, biên soạn, lắp ráp, và liên kết. Nhưng chúng tôi trong lớp và hầu hết mọi người trên thế giới thường tóm tắt tất cả các bước như chỉ là "biên dịch." Nhưng nếu chúng ta bắt đầu với mã nguồn như thế này, nhớ lại điều này có lẽ là chương trình C đơn giản chúng tôi đã viết vậy, đến nay, nhớ lại rằng khi biên dịch nó sẽ trông như thế này. Nhưng có thực sự là một bước trung gian, và những bước như sau. Lần đầu tiên có điều này ở đầu này và hầu hết các chương trình của chúng tôi, # Include # Bao gồm làm cho chúng ta? Nó khá nhiều bản sao và bột nhão nội dung của stdio.h vào tập tin của tôi rằng tại sao? Tại sao tôi lại quan tâm đến nội dung của stdio.h? Những gì trong đó quan tâm? Printf kê khai, mẫu thử nghiệm của mình, để trình biên dịch sau đó biết những gì tôi có ý nghĩa khi tôi đề cập đến chức năng này printf. Vì vậy, bước 1 trong việc biên soạn là tiền xử lý, theo đó một chương trình như Clang hoặc một số chương trình trợ giúp mà kêu vang đi kèm với lần đọc đầu mã của bạn xuống dưới, trái sang phải, và bất cứ lúc nào nó thấy một biểu tượng # theo sau bởi một từ khóa như bao gồm, nó thực hiện hoạt động đó, sao chép và dán trong stdio.h trường hợp vào tập tin của bạn. Đó là bước 1. Sau đó, bạn có một tập tin C lớn hơn vì các bản sao lớn, công việc dán đó chỉ xảy ra rất nhiều. Bước 2 giờ được biên dịch. Nhưng hóa ra biên dịch có mã nguồn mà trông như thế này và biến nó thành một cái gì đó trông như thế này, mà đối với những người quen thuộc được gọi là? >> [Sinh viên] hội. >> Hội ngôn ngữ. Điều này thực sự là một cái gì đó nếu bạn mất CS61 bạn sẽ nhảy vào chi tiết hơn. Đây chỉ là về gần như là bạn có thể nhận được để viết 0 và 1 mình nhưng viết những điều theo cách như vậy mà vẫn làm cho ít nhất một chút ý nghĩa. Đây là những hướng dẫn của máy, và nếu chúng ta di chuyển xuống các chức năng chính ở đây, nhận thấy rằng có chỉ dẫn này đẩy, di chuyển hướng dẫn, trừ hướng dẫn, gọi hướng dẫn, và vv. Khi bạn nghe rằng máy tính của bạn có Intel bên trong, bạn có một CPU Intel trong Mac hoặc máy PC của bạn, điều đó không có nghĩa là gì? CPU đi kèm được xây dựng bởi các công ty như Intel hiểu hướng dẫn nhất định. Họ không có ý tưởng những chức năng như trao đổi hoặc một chính se, nhưng họ không biết những gì hướng dẫn rất thấp cấp như thêm, trừ, đẩy, di chuyển, gọi điện, và vv. Vì vậy, khi bạn biên dịch mã C vào lắp ráp ngôn ngữ, rất thân thiện với người sử dụng mã của bạn trông được chuyển đổi thành một cái gì đó trông như thế này, mà nghĩa đen di chuyển byte hoặc 4 byte xung quanh trong các đơn vị nhỏ như vậy trong và ngoài của CPU. Nhưng cuối cùng, khi Clang là sẵn sàng để có đại diện của các chương trình của bạn thành 0 và 1, sau đó bước được gọi là lắp ráp xảy ra, và điều này một lần nữa tất cả xảy ra trong chớp mắt khi chạy Clang. Chúng tôi bắt đầu ở đây, nó ra một tập tin như thế này, và sau đó nó chuyển đổi các 0 và 1. Và nếu bạn muốn quay trở lại tại một số điểm và thực sự thấy điều này trong hành động, nếu tôi đi vào hello1.c đây là một trong những chương trình đầu tiên chúng tôi nhìn - thông thường chúng tôi sẽ biên dịch này với hello1.c Clang và điều này sẽ cung cấp cho chúng tôi a.out. Nếu ngược lại, thay vào đó bạn cung cấp cho nó-S cờ, những gì bạn sẽ nhận được là hello1.s và bạn thực sự sẽ thấy ngôn ngữ lắp ráp. Tôi đang làm điều này cho một chương trình rất ngắn, nhưng nếu bạn đi trở lại cho Scramble hoặc Recover hoặc chương trình nào bạn đã viết và chỉ ra khỏi tò mò muốn để xem những gì nó thực sự trông như thế nào, những gì thực sự được đưa vào CPU, bạn có thể sử dụng mà-S cờ với Clang. Nhưng sau đó, cuối cùng, có vẫn còn 1 Gotcha. Dưới đây là 0 và 1 đại diện cho thực hiện của tôi trên thế giới, xin chào. Nhưng tôi sử dụng chức năng của người khác trong chương trình của tôi. Vì vậy, mặc dù quá trình này tôi có hello.c, nó được biên dịch vào lắp ráp mã, và sau đó nó được lắp ráp thành 0 và 1, chỉ có 0 và 1 được kết quả vào thời điểm này trong thời gian là những cái mà kết quả từ mã của tôi. Nhưng người đã viết printf, họ biên dịch mã của họ cách đây 20 năm và nó bây giờ cài đặt một nơi nào đó trên thiết bị, vì vậy chúng tôi bằng cách nào đó phải hợp nhất của mình 0 và 1 và 0 1s, và đó đưa chúng ta đến bước thứ 4 và cuối cùng của biên dịch, được gọi là liên kết. Vì vậy, ở phía bên trái, chúng ta có cùng một bức ảnh chính xác như trước: hello.c trở thành lắp ráp mã trở thành 0 và 1. Nhưng nhớ lại rằng tôi đã sử dụng thư viện I / O tiêu chuẩn trong mã của tôi, và điều đó có nghĩa là một nơi nào đó trên máy tính có một tập tin gọi là stdio.c hoặc ít nhất là phiên bản biên dịch của chúng vì một ai đó một vài năm trước đây biên soạn stdio.c vào mã lắp ráp và sau đó một bó toàn bộ 0 và 1. Đây là những gì được biết đến như một tĩnh hoặc một thư viện động. Đó là một số tập tin ngồi một nơi nào đó trong thiết bị. Nhưng cuối cùng, tôi phải mất 0 và số 1 của tôi và của người đó 0 và 1 và bằng cách nào đó liên kết chúng lại với nhau, nghĩa là kết hợp các số 0 và 1 vào một tập tin duy nhất được gọi là a.out hoặc hello1 hoặc bất cứ điều gì tôi gọi là chương trình của tôi do đó kết quả cuối cùng có tất cả các 1s và 0s soạn chương trình của tôi. Vì vậy, thời gian này, tất cả các học kỳ này khi bạn đã sử dụng Clang và thậm chí gần đây chạy make để chạy Clang, tất cả các bước đã được xảy ra loại ngay lập tức nhưng rất cố tình. Và vì vậy nếu bạn tiếp tục trong khoa học máy tính, cụ thể là CS61, đây là lớp mà bạn sẽ tiếp tục lột quay trở lại đó nói về hiệu quả, tác động an ninh, và như thế các chi tiết mức độ thấp hơn. Nhưng với điều đó, chúng tôi sắp rời khỏi C phía sau. Chúng ta hãy đi trước và đi nghỉ 5 phút của chúng tôi ngay bây giờ, và khi chúng ta trở lại: Internet. Được rồi. Chúng tôi đang trở lại. Bây giờ chúng ta bắt đầu nhìn của chúng tôi không chỉ ở HTML bởi vì, như bạn sẽ thấy, HTML chính nó thực sự là khá đơn giản nhưng thực sự tại lập trình web nói chung, kết nối mạng nói chung, và làm thế nào tất cả các công nghệ này đến với nhau để cho phép chúng tôi tạo ra các chương trình phức tạp hơn nhiều trên Internet hơn vậy, đến nay chúng tôi đã có thể trong các cửa sổ màu đen và trắng. Thật vậy, vào thời điểm này trong học kỳ mặc dù chúng tôi sẽ dành nhiều thời gian tương đối ít hơn trên PHP, HTML, CSS, JavaScript, SQL và nhiều hơn nữa, hầu hết các sinh viên làm cuối cùng làm dự án cuối cùng mà là dựa trên web bởi vì như bạn sẽ thấy, các nền bây giờ bạn có trong C rất nhiều áp dụng cho các ngôn ngữ cấp cao hơn. Và khi bạn bắt đầu suy nghĩ về dự án cuối cùng của bạn, trong đó, giống như vấn đề Thiết lập 0, nơi bạn được khuyến khích để làm bất cứ điều gì nhất quan tâm đến bạn Scratch dự án cuối cùng là cơ hội của bạn để có những kiến ​​thức mới và hiểu biết với C hoặc PHP hoặc JavaScript hoặc muốn ra cho một spin và tạo ra mảnh của bạn rất riêng của phần mềm cho thế giới xem. Và hạt giống bạn với những ý tưởng, biết rằng bạn có thể đứng đầu ở đây, projects.cs50.net. Hàng năm chúng tôi thu hút các ý tưởng từ các giảng viên và nhân viên và sinh viên trong khuôn viên trường chỉ để gửi ý tưởng của mình cho những điều thú vị mà có thể được giải quyết bằng cách sử dụng máy tính, sử dụng các trang web, sử dụng phần mềm. Vì vậy, nếu bạn đang đấu tranh để đến với một ý tưởng của riêng bạn, tất cả các phương tiện di chuyển thông qua các ý tưởng có từ năm nay và cuối cùng. Nó là hoàn toàn được giải quyết một dự án đã được giải quyết trước. Chúng ta đã thấy nhiều ứng dụng để nhìn thấy tình trạng của giặt trong khuôn viên trường, nhiều ứng dụng cho điều hướng menu phòng ăn, nhiều ứng dụng cho điều hướng danh mục khóa học và các loại tương tự. Và quả thực, trong một bài giảng trong tương lai và các cuộc hội thảo trong tương lai, chúng tôi sẽ giới thiệu cho bạn một số hàm API công bố công khai, cả hai thương mại cũng như ở đây có sẵn từ CS50 trong khuôn viên trường để bạn có thể truy cập vào dữ liệu và sau đó có thể làm những điều thú vị với nó. Vì vậy, các dự án cuối cùng trong một vài ngày khi chúng tôi phát hành các đặc điểm kỹ thuật, nhưng bây giờ, biết rằng bạn có thể làm việc solo hoặc với 1 hoặc 2 người bạn trên bất kỳ dự án quan tâm đến bạn nhất. Internet. Bạn đi trước và kéo ra khỏi máy tính xách tay của bạn, bạn hãy vào facebook.com cho lần đầu tiên, không đăng nhập trong thời gian gần đây, và nhấn Enter. Chính xác những gì sẽ xảy ra? Khi bạn nhấn Enter trên máy tính của bạn, một bó toàn bộ các bước bắt đầu sắp xếp kỳ diệu xảy ra. Vì vậy, các bạn ở đây trên máy chủ web, như Facebook là ở đây bên phải, và bằng cách nào đó bạn đang sử dụng ngôn ngữ này được gọi là HTTP, Hypertext Transfer Protocol. HTTP không phải là một ngôn ngữ lập trình. Đó là nhiều hơn của một giao thức. Nó là một bộ các công ước mà các trình duyệt web và máy chủ web sử dụng khi intercommunicating. Và điều này có nghĩa là như sau. Giống như trong thế giới thực, chúng tôi có các công ước mà nếu bạn đáp ứng một số nhân lực cho lần đầu tiên, nếu bạn không nhớ humoring tôi ở đây, Tôi có thể đến với bạn, nói, "Xin chào, tôi tên là David." >> Hi, David. Tên tôi là Sammy. "Hi, David Tên tôi là Sammy. Vì vậy, bây giờ chúng tôi đã tham gia trong loại giao thức của con người ngớ ngẩn nơi mà tôi đã bắt đầu giao thức, Sammy đã phản ứng, chúng tôi đã lắc tay, và giao dịch hoàn tất. HTTP là rất tinh thần tương tự. Khi yêu cầu trình duyệt web của bạn www.facebook.com, những gì trình duyệt của bạn thực sự làm đang mở rộng bàn tay của mình, có thể nói, đến máy chủ và gửi tin nhắn. Và thông điệp đó thường là một cái gì đó giống như nhận được những gì bạn muốn nhận được - làm cho tôi trang chủ, mà thường được biểu thị bằng một dấu gạch chéo ở cuối URL. Và chỉ để bạn biết những gì ngôn ngữ tôi đang nói, trình duyệt sẽ cho bạn biết mà tôi đang nói HTTP phiên bản 1.1, Và cũng có thể là phương pháp tốt tôi sẽ cho bạn biết rằng các máy chủ mà tôi muốn trang chủ của là facebook.com. Thông thường, một trình duyệt web, unbeknownst cho bạn của con người, gửi tin nhắn qua mạng Internet khi bạn chỉ cần gõ www.facebook.com, Nhập vào trình duyệt của bạn. Và Facebook phản ứng với những gì? Nó phản ứng với một số chi tiết tương tự khó hiểu mà còn nhiều hơn nữa. Hãy để tôi đi tới trang chủ của Facebook ở đây. Đây là màn hình mà hầu hết chúng ta có thể không bao giờ nhìn thấy nếu bạn ở lại đăng nhập vào tất cả các thời gian, nhưng điều này thực sự là trang nhà của họ. Nếu chúng ta làm điều này trong Chrome, nhận thấy rằng bạn có thể kéo lên menu ngữ cảnh này chút. Sử dụng Chrome, cho dù trên Mac OS, Windows, Linux, hoặc tương tự, Nếu bạn kiểm soát nhấp chuột hoặc nhấp chuột trái, bạn thường có thể kéo lên một menu trông như thế này, nơi mà một vài lựa chọn đang chờ đợi, một trong số đó là View Page Source. Bạn cũng có thể thường nhận được những điều này bằng cách vào menu View và poking xung quanh. Ví dụ, đây dưới Xem, phát triển là điều tương tự. Tôi sẽ đi trước và nhìn vào View Page Source. Những gì bạn sẽ thấy là HTML mà Mark đã viết để đại diện cho facebook.com. Đó là một mớ hỗn độn đầy đủ ở đây, nhưng chúng ta sẽ thấy rằng điều này có ý nghĩa nhiều hơn một chút trước khi dài. Nhưng có một số mô hình ở đây. Hãy để tôi di chuyển xuống các công cụ như thế này. Đây là khó khăn cho một con người để đọc, nhưng nhận ra là mô hình này của dấu ngoặc góc cạnh với các từ khóa như tùy chọn, các từ khóa như giá trị, một số chuỗi trích dẫn. Đây là nơi mà khi bạn đã đăng ký cho lần đầu tiên quy định năm sinh của bạn là gì. Rằng trình đơn thả xuống của năm sinh là bằng cách nào đó mã hóa ở đây trong ngôn ngữ này được gọi là HTML, HyperText Markup Language. Nói cách khác, khi trình duyệt của bạn yêu cầu một trang web, nó nói công ước này được gọi là HTTP. Nhưng facebook.com không đáp ứng với yêu cầu đó? Nó phản ứng với một số của những tin nhắn khó hiểu, như chúng ta sẽ thấy trong một thời điểm. Tuy nhiên, hầu hết các phản ứng của nó là ở dạng HTML, HyperText Markup Language. Đó là ngôn ngữ thực tế trong đó một trang web được viết. Và những gì một trình duyệt web thực sự sau đó là, sau khi nhận được một cái gì đó trông như thế này, đọc nó trên xuống dưới, trái sang phải, và bất cứ lúc nào nó thấy một trong những dấu ngoặc góc cạnh theo sau bởi một từ khóa như tùy chọn, nó sẽ hiển thị ngôn ngữ đánh dấu theo cách thích hợp. Trong trường hợp này, nó sẽ hiển thị một trình đơn thả xuống năm. Nhưng một lần nữa, đây là một mớ hỗn độn đầy đủ để xem xét. Đây không phải là bởi vì phát triển Facebook biểu hiện 0 cho 5 cho phong cách, ví dụ. Điều này là bởi vì hầu hết các mã mà họ viết là trong thực tế, viết đẹp, cũng nhận xét, độc đáo thụt vào, và như thế, nhưng máy Tất nhiên, máy tính, trình duyệt thực sự không give a damn xem mã của bạn được theo kiểu. Và trên thực tế, nó hoàn toàn lãng phí nhấn phím tab tất cả những lần và đưa ý kiến ​​tất cả cả mã của bạn và để lựa chọn thực sự mô tả tên biến bởi vì nếu trình duyệt không quan tâm, tất cả các bạn đang làm vào cuối ngày là lãng phí byte. Vì vậy, nó chỉ ra những gì hầu hết các trang web làm là mặc dù mã nguồn cho facebook.com, cs50.net và tất cả các trang web khác trên Internet thường được tốt bằng văn bản và cũng nhận xét và độc đáo thụt vào và các loại tương tự, thường trước khi trang web được đưa lên mạng Internet, các mã được minified, theo đó các HTML và CSS - cái gì khác chúng ta sẽ sớm thấy - mã JavaScript chúng ta sẽ sớm thấy được nén theo đó tên dài biến trở thành X và Y và Z, và tất cả các khoảng trắng đó mà làm cho tất cả mọi thứ để có thể đọc được là tất cả bỏ đi, bởi vì nếu bạn nghĩ về nó theo cách này, Facebook được một trang tỷ số truy cập một ngày - một cái gì đó điên rồ như thế - vì vậy nếu một lập trình chỉ để được qua đường hậu môn nhấn thanh không gian thêm 1 thời gian chỉ để thụt lề một số dòng mã bao giờ nhiều hơn nữa? Ngụ ý là gì nếu Facebook bảo tồn khoảng trắng trong tất cả các byte họ gửi lại cho mọi người trên Internet? Nhấn thanh không gian một lần cung cấp cho bạn thêm một byte trong tập tin của bạn. Và nếu một tỷ người sau đó tiến hành để tải trang chủ ngày hôm đó, bao nhiêu dữ liệu đã được truyền qua Internet? Một gigabyte không có lý do tốt. Và được cấp cho rất nhiều trang web này không phải là một vấn đề khả năng mở rộng, nhưng đối với Facebook, Google, một số trang web phổ biến nhất có khuyến khích tài chính để làm cho mã của bạn trông giống như một mớ hỗn độn để bạn sử dụng như vài byte có thể thêm vào sau đó nén bằng cách sử dụng một cái gì đó như zip, một thuật toán gọi gzip mà trình duyệt không cho bạn tự động. Nhưng điều này là khủng khiếp. Chúng tôi sẽ không bao giờ tìm hiểu bất cứ điều gì về các trang web của những người khác và làm thế nào để thiết kế các trang web nếu chúng ta phải nhìn vào nó như thế này. Vì vậy, may mắn thay, các trình duyệt như Chrome và IE và Firefox những ngày này thường đi kèm với xây dựng trong các công cụ phát triển. Trong thực tế, nếu tôi đi xuống đây để kiểm tra nguyên tố hoặc nếu tôi đi vào View, Nhà phát triển, và đi đến Công cụ phát triển một cách rõ ràng, cửa sổ này ở dưới cùng của màn hình của tôi bây giờ bật lên. Đó là một chút đáng sợ lúc đầu bởi vì có rất nhiều các tab không quen thuộc ở đây, nhưng nếu tôi nhấp vào yếu tố tất cả các con đường ở phía dưới bên trái, Chrome rõ ràng là khá thông minh. Nó biết làm thế nào để giải thích tất cả các mã này. Và do đó, những gì Chrome không là nó làm sạch tất cả các HTML của Facebook. Mặc dù không có khoảng trắng ở đó, có không thụt đầu dòng có, bây giờ nhận thấy rằng tôi có thể bắt đầu điều hướng trang web này tất cả các phân cấp. Nó chỉ ra rằng tất cả các trang web được viết trong một ngôn ngữ được gọi là HTML5 nên bắt đầu với điều này, khai báo DOCTYPE này, có thể nói: Đó là loại ánh sáng và màu xám có, nhưng đó là dòng đầu tiên của mã trong tập tin này, mà chỉ cho các trình duyệt, "Hey, ở đây có một số HTML5 Ở đây có một trang web." Khung mở đầu tiên vượt ra ngoài đó sẽ xảy ra là điều này, một khung mở HTML tag, và sau đó nếu tôi lặn vào sâu hơn - những mũi tên này là hoàn toàn vô nghĩa; họ chỉ là vì lợi ích trình bày của họ là không thực sự trong tập tin - nhận thấy rằng bên trong tag HTML của Facebook, bất cứ điều gì bắt đầu với một khung mở và sau đó một từ được gọi là một thẻ. Vì vậy, bên trong các tag HTML là rõ ràng là một thẻ đầu và một thẻ cơ thể. Bên trong của thẻ đầu bây giờ là cả một mớ hỗn độn cho Facebook bởi vì họ có rất nhiều siêu dữ liệu và những thứ khác để tiếp thị và quảng cáo. Nhưng nếu chúng ta di chuyển xuống, xuống, xuống, xuống, chúng ta hãy xem nó ở đâu. Ở đây nó được. Đây là một trong ít nhất là phần nào quen thuộc. Tiêu đề của trang chủ của Facebook, nếu bạn nhìn vào các tab trên thanh tiêu đề của bạn, Chào mừng bạn đến với Facebook - Đăng nhập, Đăng ký hoặc Tìm hiểu thêm. Đó là những gì bạn sẽ thấy trong thanh tiêu đề của Chrome, và đó là cách nó được trình bày trong các mã. Nếu chúng ta bỏ qua mọi thứ khác trong đầu, hầu hết ruột của một trang web trong cơ thể, và nó quay ra rằng mã của Facebook sẽ trông phức tạp hơn hơn so với hầu hết mọi thứ, chúng ta sẽ viết ban đầu chỉ vì nó được xây dựng trong những năm qua, nhưng có một toàn bộ rất nhiều thẻ script, mã JavaScript, mà làm cho các trang web rất tương tác: nhìn thấy tình trạng cập nhật ngay lập tức bằng cách sử dụng ngôn ngữ như JavaScript. Có một cái gì đó được gọi là một div, mà là một bộ phận của một trang. Nhưng trước khi chúng tôi nhận được đến chi tiết đó, chúng ta hãy cố gắng để thu nhỏ và nhìn vào một phiên bản đơn giản của Facebook 1.0, do đó, để nói chuyện. Dưới đây là hello thế giới của các trang web. Nó đã có khai báo DOCTYPE ở đầu đó là một chút khác nhau từ mọi thứ khác. Không có gì khác chúng tôi viết trong một trang web sẽ bắt đầu với cho in đậm. Một lần nữa, câu chuyện là như nhau: hello, dấu phẩy, bắt đầu thực hiện này đậm, sau đó thế giới được in đậm, và điều này có nghĩa là ngừng in ấn này in đậm. Hãy để tôi đi trước và lưu tập tin của tôi, quay trở lại vào Chrome, tôi sẽ phóng to chỉ để chúng ta có thể nhìn thấy nó tốt hơn, và tải lại, và bạn sẽ thấy thế giới mà bây giờ là in đậm. Web là tất cả về các siêu liên kết, do đó, chúng ta hãy đi trước và làm điều này: trang web ưa thích của tôi là, hãy nói, youtube.com. Lưu, tải lại. Okay. Có một vài vấn đề bây giờ bên cạnh những hideousness của trang web. 1, tôi khá chắc chắn tôi nhấn Enter. Và tôi đã làm. Tôi không chỉ nhấn Enter, tôi cũng thụt vào, thực hành những gì chúng tôi đã được rao giảng về phong cách, nhưng của tôi là ngay bên cạnh thế giới. Vậy tại sao điều này? Các trình duyệt chỉ làm những gì bạn nói với họ để làm. Tôi đã không nói với các trình duyệt, "dòng Nghỉ giải lao ở đây Chèn đoạn phá vỡ ở đây." Vì vậy, trình duyệt, nó không quan trọng nếu tôi nhấn Quay lại 30 lần, nó vẫn sẽ đặt bên phải của tôi với thế giới. Những gì tôi thực sự phải làm ở đây là nói một cái gì đó như
, chèn một ngắt dòng. Và thực sự, một ngắt dòng là loại một điều kỳ lạ vì bạn có thể không thực sự bắt đầu di chuyển đến dòng khác, sau đó làm một cái gì đó, và sau đó di chuyển đến một dòng mới. Đó là loại một hoạt động nguyên tử. Bạn có thể làm điều đó hoặc bạn không. Bạn nhấn Enter hoặc bạn không. Vì vậy, br là một chút của một thẻ khác nhau, và vì vậy tôi cần phải sắp xếp cả hai mở và đóng nó tất cả cùng một lúc. Cú pháp cho rằng là thế này. Về mặt kỹ thuật, bạn có thể làm một cái gì đó như thế này trong một số phiên bản của HTML, nhưng điều này chỉ là ngu ngốc vì không có lý do để bắt đầu và dừng lại một cái gì đó nếu bạn thay vì có thể làm tất cả cùng một lúc. Nhận ra rằng HTML5 không yêu cầu nghiêm ngặt này dấu gạch chéo, do đó, bạn sẽ thấy sách giáo khoa và các tài nguyên trực tuyến mà không có nó, nhưng đối với các biện pháp tốt, chúng ta hãy thực hành đối xứng mà chúng tôi đã nhìn thấy vậy đến nay. Điều này có nghĩa rằng từ khóa là cả hai mở và đóng cửa. Vì vậy, bây giờ cho tôi lưu tập tin của tôi, quay trở lại. Được rồi, do đó, nó bắt đầu trông đẹp hơn, ngoại trừ Web tôi biết là loại có thể click, và chưa youtube ở đây dường như không dẫn đến bất cứ điều gì. Đó là bởi vì mặc dù nó trông giống như một liên kết, trình duyệt không biết rằng mỗi gia nhập, vì vậy tôi phải để cho trình duyệt rằng đây là một liên kết. Các cách để làm điều này là sử dụng một thẻ neo: và cho tôi di chuyển này vào một dòng mới chỉ là như vậy đó là một chút dễ đọc hơn, và tôi sẽ thu nhỏ kích thước phông chữ. Tôi thực hiện chưa? Không. Có sẽ là sự đối lập. Thẻ này, thẻ neo, không thực sự có một thuộc tính, thay đổi hành vi của nó, và giá trị của thuộc tính đó là rõ ràng của YouTube URL. Nhưng hãy chú ý sự phân đôi là chỉ vì đó là URL bạn sẽ, đó không có nghĩa là lời mà bạn đang nhấn mạnh và làm cho một liên kết. Thay vào đó, có thể là một cái gì đó như thế này. Vì vậy, tôi có thể nói này từ một siêu liên kết bằng cách sử dụng thẻ neo gần. Thông báo tôi không làm điều này. 1, điều này sẽ chỉ là một sự lãng phí thời gian của mọi người và nó không cần thiết. Để đóng một thẻ, bạn chỉ đề cập đến tên của thẻ một lần nữa. Bạn không đề cập đến bất kỳ các thuộc tính. Vì vậy, hãy tiết kiệm đó, trở lại. Được rồi, thì đấy, bây giờ nó là màu xanh và siêu liên kết. Nếu tôi nhấp vào nó, tôi thực sự đi đến YouTube. Vì vậy, mặc dù trang web của tôi không phải là trên Internet, nó là ít nhất là HTML, và nếu chúng ta để Internet bắt kịp, chúng tôi thực sự sẽ kết thúc ở đây tại youtube.com. Và tôi có thể quay trở lại và đây là trang web của tôi. Nhưng hãy chú ý điều này. Nếu bạn đã từng nhận được thư rác hoặc tấn công lừa đảo trực tuyến, bây giờ bạn có khả năng chỉ sau 5 phút để làm điều tương tự. Chúng ta có thể ở đây và làm một cái gì đó giống như www.badguy.com hoặc bất cứ điều gì các trang web sơ sài, và sau đó bạn có thể nói xác minh tài khoản PayPal của bạn. [Cười] Và bây giờ điều này sẽ đi đến badguy.com, mà tôi sẽ không bấm vào vì tôi không có ý tưởng mà dẫn. [Cười] Nhưng bây giờ chúng ta có khả năng để thực sự kết thúc ở đó. Vì vậy, chúng tôi đang thực sự chỉ mới bắt đầu cào trên bề mặt. Chúng tôi không lập trình cho mỗi gia nhập, chúng ta đang viết ngôn ngữ đánh dấu. Nhưng ngay sau khi chúng tôi ra khỏi vòng vốn từ vựng của chúng tôi trong HTML, chúng tôi sẽ giới thiệu PHP, một ngôn ngữ lập trình thực tế mà sẽ cho phép chúng tôi để tạo ra HTML tự động, tạo ra CSS tự động, để chúng tôi có thể bắt đầu vào thứ tư để thực hiện, nói, công cụ tìm kiếm của chúng tôi và nhiều hơn nữa. Nhưng trong một vài ngày. Chúng ta sẽ thấy bạn sau đó. [CS50.TV]