1 00:00:00,000 --> 00:00:12,040 >> [MUSIC CHƠI] 2 00:00:12,040 --> 00:00:16,460 >> SPEAKER 1: Được rồi, đây là CS50, và đây là sự bắt đầu của tuần thứ tư, 3 00:00:16,460 --> 00:00:20,420 và như bạn có thể đã nghe nói hoặc đọc, thế giới đã được kết thúc. 4 00:00:20,420 --> 00:00:23,520 Đi khắp nơi trên internet có được kiến ​​thức và nhận thức 5 00:00:23,520 --> 00:00:27,100 một lỗi trong một chương trình, một ngôn ngữ lập trình được gọi là Bash. 6 00:00:27,100 --> 00:00:32,729 Điều này đã được nhãn hiệu tuyệt vời như Shellshock, hoặc cửa Bash, 7 00:00:32,729 --> 00:00:35,485 nhưng bài viết như thế này đã không được phổ biến. 8 00:00:35,485 --> 00:00:38,807 Và trên thực tế, nhiều người trong số họ mang lại kỷ niệm sau của Heartbleed, 9 00:00:38,807 --> 00:00:41,640 mà bạn có thể nhận thấy trong nhấn trở lại vào mùa xuân vừa qua, mà 10 00:00:41,640 --> 00:00:43,980 tương tự là khá ấn tượng. 11 00:00:43,980 --> 00:00:47,110 Bây giờ của những người bạn ở đây ngày hôm nay, có bao nhiêu bạn có, 12 00:00:47,110 --> 00:00:50,330 ngay cả khi bạn không hiểu những gì đó là tất cả về, nghe nói về Shellshock? 13 00:00:50,330 --> 00:00:51,370 14 00:00:51,370 --> 00:00:54,245 Được rồi, và có bao nhiêu bạn có máy tính dễ bị tổn thương? 15 00:00:54,245 --> 00:00:55,680 16 00:00:55,680 --> 00:01:00,250 OK, có phải là xa, xa hơn tay lên ngay bây giờ, vì những lý do chúng ta sẽ thấy. 17 00:01:00,250 --> 00:01:02,580 >> Chúng ta hãy nhìn vào những gì là được diễn ra trong các phương tiện truyền thông 18 00:01:02,580 --> 00:01:05,304 và sau đó giải thích nó một chút ở đây cho chúng ta về mặt kỹ thuật. 19 00:01:05,304 --> 00:01:07,670 20 00:01:07,670 --> 00:01:11,250 >> SPEAKER 2: chuyên gia bảo mật có cảnh báo rằng một lỗ hổng nghiêm trọng có thể 21 00:01:11,250 --> 00:01:15,650 là về ảnh hưởng đến hàng trăm hàng triệu người sử dụng web trên thế giới. 22 00:01:15,650 --> 00:01:20,600 Vì vậy, những gì chính xác là lỗi đó là được gọi là Shellshock, và những gì nó làm gì? 23 00:01:20,600 --> 00:01:23,720 24 00:01:23,720 --> 00:01:28,910 Vâng, Shellshock còn được gọi là các Lỗi Bash, phần mềm khai thác nó. 25 00:01:28,910 --> 00:01:33,230 Tin tặc sử dụng virus để quét dễ bị tổn thương các hệ thống chạy Linux và Unix 26 00:01:33,230 --> 00:01:36,300 hệ điều hành và sau đó lây nhiễm cho họ. 27 00:01:36,300 --> 00:01:38,730 Bash là một vỏ dòng lệnh. 28 00:01:38,730 --> 00:01:43,460 Điều này cho phép người sử dụng vấn đề lệnh để khởi động chương trình và các tính năng trong phần mềm 29 00:01:43,460 --> 00:01:45,250 bằng cách gõ văn bản. 30 00:01:45,250 --> 00:01:49,980 Nó thường được sử dụng bởi các lập trình viên, và không nên mở cửa với thế giới rộng lớn hơn, 31 00:01:49,980 --> 00:01:51,590 mặc dù Shellshock thay đổi đó. 32 00:01:51,590 --> 00:01:54,160 33 00:01:54,160 --> 00:01:57,910 >> Vâng, worringly, một số nhà phân tích cảnh báo nó có thể là một mối đe dọa lớn hơn, 34 00:01:57,910 --> 00:02:01,580 vì Shellshock cho phép hoàn thành kiểm soát của một máy tính bị nhiễm, 35 00:02:01,580 --> 00:02:06,030 trong khi chỉ được phép Heartbleed hacker gián điệp trên máy tính. 36 00:02:06,030 --> 00:02:09,130 Đó là quá nghiêm trọng, đó là được xếp hạng 10 trong số 10 37 00:02:09,130 --> 00:02:11,900 cho mức độ nghiêm trọng của các quốc gia Cơ sở dữ liệu dễ bị tổn thương. 38 00:02:11,900 --> 00:02:15,530 39 00:02:15,530 --> 00:02:20,015 2/3 của tất cả các máy chủ web đang ở rủi ro, bao gồm cả một số máy tính Mac. 40 00:02:20,015 --> 00:02:22,760 41 00:02:22,760 --> 00:02:25,600 Vâng, chắc chắn bạn vá các hệ thống của bạn bây giờ. 42 00:02:25,600 --> 00:02:29,330 Bất cứ ai lưu trữ một trang web chạy các hệ điều hành bị ảnh hưởng 43 00:02:29,330 --> 00:02:31,800 nên có hành động càng sớm càng tốt. 44 00:02:31,800 --> 00:02:35,390 Bất cứ ai có thể đủ khả năng đó nên xem xét để ứng dụng giám sát và các trang web của họ 45 00:02:35,390 --> 00:02:37,355 tường lửa để tìm cho ra bất kỳ cuộc tấn công. 46 00:02:37,355 --> 00:02:39,979 47 00:02:39,979 --> 00:02:41,770 SPEAKER 3: Điều tồi tệ nhất có thể xảy ra là 48 00:02:41,770 --> 00:02:45,080 rằng ai đó sẽ viết mã sẽ tự động chuyển và quét 49 00:02:45,080 --> 00:02:48,280 Internet và sẽ ảnh hưởng đến tất cả các máy tính. 50 00:02:48,280 --> 00:02:50,710 Và một khi họ làm điều đó, tốt, điều tồi tệ nhất họ có thể làm 51 00:02:50,710 --> 00:02:53,300 chỉ là xóa tất cả mọi thứ, hoặc đóng cửa các trang web xuống. 52 00:02:53,300 --> 00:02:55,360 Vì vậy, chúng ta có thể nhìn thấy thiệt hại từ quan điểm đó, 53 00:02:55,360 --> 00:02:58,300 nơi chúng tôi sẽ có những người độc hại vừa quyết định gây ra tàn phá 54 00:02:58,300 --> 00:03:02,534 bằng cách đưa hệ thống giảm hoặc xóa Bức ảnh, và những thứ như thế. 55 00:03:02,534 --> 00:03:05,200 SPEAKER 2: Một số người nói đây là một trong trong những khó khăn nhất để đo lường 56 00:03:05,200 --> 00:03:08,080 lỗi trong năm, và nó có thể mất vài tuần hoặc thậm chí 57 00:03:08,080 --> 00:03:10,820 tháng để xác định tác động cuối cùng của nó. 58 00:03:10,820 --> 00:03:12,180 59 00:03:12,180 --> 00:03:15,560 >> SPEAKER 1: Vì vậy, tất cả điều đó là sự thật, nhưng điều buồn cười là, hầu hết các 60 00:03:15,560 --> 00:03:18,330 của hình ảnh bạn thấy, ngoại trừ có lẽ bàn phím, 61 00:03:18,330 --> 00:03:20,930 không có gì để làm với lỗi nào. 62 00:03:20,930 --> 00:03:23,960 Máy chủ và dây điện và vân vân, nó liên quan đến loại tiếp tuyến, 63 00:03:23,960 --> 00:03:27,410 nhưng cốt lõi nó thực sự khá quen thuộc những gì đang xảy ra ở đây. 64 00:03:27,410 --> 00:03:30,050 Trong thực tế, hãy để tôi đi vào thiết bị CS50 của chúng tôi. 65 00:03:30,050 --> 00:03:32,910 Hãy để tôi đi trước và tối đa hóa cửa sổ thiết bị đầu cuối ở đây. 66 00:03:32,910 --> 00:03:36,020 Và các bạn đã được sử dụng này, hoặc phiên bản nhúng của chúng, 67 00:03:36,020 --> 00:03:39,460 trong gedit để viết chương trình, gõ lệnh, và vân vân, 68 00:03:39,460 --> 00:03:43,690 và điều này là thực sự, và có được trong nhiều tuần, Bash, B-A-S-H. 69 00:03:43,690 --> 00:03:46,890 Đây là Bourne-again shell, mà chỉ là một cách nói, 70 00:03:46,890 --> 00:03:50,220 đây là một chương trình có một nhấp nháy nhanh chóng, hiệu quả, 71 00:03:50,220 --> 00:03:51,970 mà ngồi đó chờ đợi cho đầu vào cho bạn. 72 00:03:51,970 --> 00:03:53,920 Và đó là lệnh giao diện dòng qua đó 73 00:03:53,920 --> 00:03:57,650 các bạn đã chạy lệnh và cuối cùng là biên dịch và sau đó chạy 74 00:03:57,650 --> 00:03:58,400 chương trình. 75 00:03:58,400 --> 00:04:01,320 >> Nhưng Bash cũng là một lập trình ngôn ngữ theo nghĩa sau đây. 76 00:04:01,320 --> 00:04:05,460 Bạn có biết rằng có những lệnh như cd và ls và cũng kêu vang và những người khác, 77 00:04:05,460 --> 00:04:09,580 nhưng bạn có thể xác định cho riêng mình bằng cách thực hiện chúng trong Bash. 78 00:04:09,580 --> 00:04:11,420 Bây giờ chúng ta sẽ không đi sâu vào chi tiết 79 00:04:11,420 --> 00:04:16,089 như Bash ngôn ngữ lập trình, nhưng biết, ví dụ, rằng tại thời điểm này, 80 00:04:16,089 --> 00:04:17,607 không có lệnh gọi là "hello". 81 00:04:17,607 --> 00:04:19,440 Vì vậy, nó có thể được tìm thấy trong một trong những gói này. 82 00:04:19,440 --> 00:04:20,856 Nó không phải được cài đặt trên máy tính của tôi. 83 00:04:20,856 --> 00:04:21,870 Yêu cầu quản trị của bạn. 84 00:04:21,870 --> 00:04:26,030 Nhưng nếu tôi muốn có được một chương trình gọi là "hello" trong Bash hoặc tại dấu nhắc của tôi, 85 00:04:26,030 --> 00:04:30,810 Tôi thực sự có thể sử dụng cú pháp đó là khá giống như C. Nó không phải hoàn toàn giống nhau, 86 00:04:30,810 --> 00:04:35,020 nhưng có vẻ khá giống với một chức năng, mặc dù thiếu một số chi tiết. 87 00:04:35,020 --> 00:04:38,090 Không có gì có thể xảy ra, nhưng bây giờ nếu tôi gõ "hello" 88 00:04:38,090 --> 00:04:40,960 bạn thực sự có thể viết một chương trình, không có trong C, không phải trong Java, 89 00:04:40,960 --> 00:04:44,280 không lập trình khác ngôn ngữ, nhưng trong Bash chính nó. 90 00:04:44,280 --> 00:04:47,630 >> Bây giờ chìa khóa ở đây là tôi đã viết Tôi muốn đặt tên cho lệnh mới này, 91 00:04:47,630 --> 00:04:50,820 và dấu ngoặc đơn cũng có biểu tượng này là một chức năng. 92 00:04:50,820 --> 00:04:54,010 Là một sang một bên, bạn cũng có thể làm niềm vui vật, và trên thực tế, ngay cả trên Mac OS, 93 00:04:54,010 --> 00:04:55,620 đây là một chương trình gọi là Terminal. 94 00:04:55,620 --> 00:04:58,800 Nó được xây dựng vào bất kỳ ai máy tính có một máy Mac trong căn phòng này, 95 00:04:58,800 --> 00:05:03,640 và bạn có thể làm điều tương tự trong Mac Hệ điều hành, nhưng bạn có thể đi nhiều hơn thế. 96 00:05:03,640 --> 00:05:07,110 Và đây là một chút tiếp tuyến, nhưng nó là loại thú vị. 97 00:05:07,110 --> 00:05:09,715 Tôi đã nhắc nhở sáng nay, khi nghĩ đến điều này thông qua, 98 00:05:09,715 --> 00:05:13,279 của một trò chơi nhỏ mà tôi sử dụng để chơi với một trong TF cựu của CS50 99 00:05:13,279 --> 00:05:16,570 theo đó bất cứ lúc nào anh ấy sẽ đi bộ từ bàn phím của mình với màn hình mở khóa của mình, 100 00:05:16,570 --> 00:05:23,611 Tôi sẽ thực thi một lệnh như this-- "chào". 101 00:05:23,611 --> 00:05:26,610 Và bây giờ bất cứ lúc nào ông trở lại của mình bàn phím sau khi tôi xóa màn hình 102 00:05:26,610 --> 00:05:27,985 và ông sẽ ngồi xuống, cố gắng để làm một số công việc, 103 00:05:27,985 --> 00:05:29,250 liệt kê các nội dung của directory-- của mình 104 00:05:29,250 --> 00:05:29,510 >> [AUDIO xem lại] 105 00:05:29,510 --> 00:05:30,010 >> -Hello. 106 00:05:30,010 --> 00:05:31,621 107 00:05:31,621 --> 00:05:32,120 Xin chào. 108 00:05:32,120 --> 00:05:35,030 >> SPEAKER 1: Vì vậy, trong công bằng, nó không thực sự "hello". 109 00:05:35,030 --> 00:05:36,894 Đó là một cái gì đó thường hơn giống như that-- 110 00:05:36,894 --> 00:05:37,560 [AUDIO xem lại] 111 00:05:37,560 --> 00:05:37,750 -Beep. 112 00:05:37,750 --> 00:05:39,320 SPEAKER 1: --that tôi would-- vì vậy máy tính của mình sẽ 113 00:05:39,320 --> 00:05:42,170 thề với anh bất cứ lúc nào ông thực sự ngồi xuống bàn phím của mình. 114 00:05:42,170 --> 00:05:46,265 Và rất nhanh chóng, ông đã tìm ra không rời khỏi màn hình của mình mở khóa. 115 00:05:46,265 --> 00:05:48,730 Tuy nhiên, điều này cho thấy các loại vui vẻ ngu ngốc mà bạn 116 00:05:48,730 --> 00:05:50,210 có thể có với một cái gì đó giống như Bash. 117 00:05:50,210 --> 00:05:52,770 Nhưng nó nhiều hơn một chút nghiêm trọng, để chắc chắn, hơn thế. 118 00:05:52,770 --> 00:05:57,235 Và trong thực tế, đây là một trong những hầu hết các lỗi nguy hiểm và lâu dài 119 00:05:57,235 --> 00:05:58,860 đã thực sự đạt thế giới trên toàn cầu. 120 00:05:58,860 --> 00:06:02,060 Lỗi này đã được khoảng đối với một số 20 năm, 121 00:06:02,060 --> 00:06:05,780 và bạn sẽ được đánh chỉ trong một thời điểm bởi sự đơn giản tương đối của nó. 122 00:06:05,780 --> 00:06:07,990 >> Vì vậy, đây là một đại diện lệnh rằng nếu bạn 123 00:06:07,990 --> 00:06:10,448 sở hữu một máy Mac, nghĩa là ngay bây giờ khi bạn có nắp mở, 124 00:06:10,448 --> 00:06:12,940 bạn có thể thử gõ vào đó chương trình gọi là Terminal. 125 00:06:12,940 --> 00:06:15,410 Thiết bị đầu cuối đang được Ứng dụng Utilities-- 126 00:06:15,410 --> 00:06:18,790 một lần, người dùng Windows không phải lo lắng về threat-- đặc biệt này 127 00:06:18,790 --> 00:06:22,310 nhưng những người bạn với máy Mac có thể gõ này vào cửa sổ như tôi sẽ làm ở đây, 128 00:06:22,310 --> 00:06:24,210 và nếu bạn gõ đó vào chương trình này 129 00:06:24,210 --> 00:06:28,830 được gọi là thiết bị đầu cuối, như tôi sẽ làm gì bây giờ, nếu bạn thấy từ "dễ bị tổn thương" 130 00:06:28,830 --> 00:06:32,200 máy tính của bạn dễ bị bóc lột. 131 00:06:32,200 --> 00:06:33,850 >> Bây giờ điều đó có thực sự nghĩa là gì? 132 00:06:33,850 --> 00:06:35,870 Và đây là thừa nhận một số cú pháp khá điên rồ, 133 00:06:35,870 --> 00:06:39,050 nhưng chúng ta ít nhất rút ra một số trong những khía cạnh thú vị. 134 00:06:39,050 --> 00:06:42,567 Vì vậy, có một số cú pháp giống một chút quen thuộc, ít nhất là từ C 135 00:06:42,567 --> 00:06:43,950 và lập trình nói chung. 136 00:06:43,950 --> 00:06:47,550 Tôi thấy một số dấu ngoặc đơn, dấu chấm phẩy, dấu ngoặc nhọn, và như vậy, 137 00:06:47,550 --> 00:06:50,820 nhưng nó quay ra rằng điều này điều ngu ngốc ở đây màu vàng 138 00:06:50,820 --> 00:06:53,580 về cơ bản là một chức năng mà không làm gì. 139 00:06:53,580 --> 00:06:57,840 Các phương tiện đại tràng không làm gì cả, và dấu chấm phẩy có nghĩa là dừng lại không làm gì. 140 00:06:57,840 --> 00:07:00,250 Vì vậy, bên trong các dấu ngoặc nhọn, thực tế 141 00:07:00,250 --> 00:07:02,440 rằng tôi có một bằng ký bên trái, điều này 142 00:07:02,440 --> 00:07:05,500 về cơ bản là tạo ra một lệnh, hoặc một biến, 143 00:07:05,500 --> 00:07:09,520 gọi là x, và gán cho nó đó chút màu vàng mã đó. 144 00:07:09,520 --> 00:07:14,040 Đó có thể là một cái gì đó giống như "echo hello "hay" nói tiếng bíp "hoặc một cái gì đó 145 00:07:14,040 --> 00:07:15,120 tương tự như vậy. 146 00:07:15,120 --> 00:07:17,780 Nhưng hãy chú ý nếu đôi mắt của bạn đi lang thang thêm vào bên phải, 147 00:07:17,780 --> 00:07:22,150 có nhiều đến dòng này hơn chỉ cuối dấu chấm phẩy. 148 00:07:22,150 --> 00:07:25,160 "Echo dễ bị tổn thương," và sau đó ngoài ra có nhiều hơn. 149 00:07:25,160 --> 00:07:26,530 Một dấu chấm phẩy, bash-c :. 150 00:07:26,530 --> 00:07:28,120 151 00:07:28,120 --> 00:07:34,050 >> Vì vậy, câu chuyện dài ngắn, dòng mã này là 152 00:07:34,050 --> 00:07:36,660 đủ để hấp dẫn một máy tính đó là 153 00:07:36,660 --> 00:07:39,830 dễ bị tổn thương để làm một cái gì đó mà bạn muốn nó để làm, 154 00:07:39,830 --> 00:07:44,290 bởi vì có một lỗi trong Bash đó mặc dù Bash được cho là để ngăn chặn 155 00:07:44,290 --> 00:07:48,980 đọc dòng lệnh bên phải sau khi có văn bản màu vàng, 156 00:07:48,980 --> 00:07:52,520 cho một lỗi 20-cộng với tuổi, Bash đã thực sự được đọc 157 00:07:52,520 --> 00:07:56,780 ngoài dấu chấm phẩy và đẹp làm nhiều những gì nó nói. 158 00:07:56,780 --> 00:07:59,070 >> Vì vậy, ý nghĩa là những gì của mà cuối cùng? 159 00:07:59,070 --> 00:08:01,340 Tôi chỉ nói "echo hello" hoặc "echo dễ bị tổn thương" 160 00:08:01,340 --> 00:08:05,449 nhưng những gì nếu bạn đã làm một cái gì đó thực sự độc hại, như rm-rf *, 161 00:08:05,449 --> 00:08:07,240 mà bạn có thể không đã từng đánh máy trước, 162 00:08:07,240 --> 00:08:08,920 và bạn có thể thẳng thắn không nên quá sớm, 163 00:08:08,920 --> 00:08:10,700 bởi vì bạn có thể làm một rất nhiều thiệt hại với nó. 164 00:08:10,700 --> 00:08:11,210 Tại sao? 165 00:08:11,210 --> 00:08:12,990 rm làm những gì, tất nhiên? 166 00:08:12,990 --> 00:08:14,270 Loại bỏ. 167 00:08:14,270 --> 00:08:15,930 * Có nghĩa là gì? 168 00:08:15,930 --> 00:08:16,430 Tất cả. 169 00:08:16,430 --> 00:08:18,180 Vì vậy, nó là một cái gọi là thẻ hoang dã, do đó, nó có nghĩa là 170 00:08:18,180 --> 00:08:20,410 xóa mọi thứ trong thư mục hiện hành. 171 00:08:20,410 --> 00:08:23,379 r xảy ra có nghĩa là đệ quy, có nghĩa là nếu bạn đang xóa 172 00:08:23,379 --> 00:08:26,420 là một thư mục, và bên trong có là các tập tin và thư mục khác, 173 00:08:26,420 --> 00:08:28,950 đệ quy đi sâu vào có và xóa tất cả. 174 00:08:28,950 --> 00:08:31,040 Và f là tồi tệ nhất của tất cả. 175 00:08:31,040 --> 00:08:32,580 Bất cứ ai biết những gì f có nghĩa là ở đây? 176 00:08:32,580 --> 00:08:33,690 177 00:08:33,690 --> 00:08:34,360 Force. 178 00:08:34,360 --> 00:08:37,830 Vì vậy, buộc phương tiện, thậm chí nếu điều này là một ý tưởng tồi, 179 00:08:37,830 --> 00:08:40,939 làm điều đó mà không nhắc tôi để xác nhận thêm. 180 00:08:40,939 --> 00:08:43,230 Vì vậy, bạn đã biết, chúng tôi cười này, nhưng thẳng thắn mà nói, tôi có thể 181 00:08:43,230 --> 00:08:44,972 loại này nhiều lần một ngày, bởi vì thực tế 182 00:08:44,972 --> 00:08:47,210 là đó là cách nhanh nhất để xóa một bó toàn bộ các công cụ. 183 00:08:47,210 --> 00:08:48,590 Nhưng ngay cả khi tôi đã làm một số thiệt hại. 184 00:08:48,590 --> 00:08:53,100 >> Nhưng nếu bạn để lừa một máy tính vào việc xác định một số biến ngu ngốc 185 00:08:53,100 --> 00:08:56,810 hoặc chức năng gọi là x, nhưng sau đó lừa máy tính vào thực hiện 186 00:08:56,810 --> 00:09:00,030 vượt ra ngoài ranh giới của đó chức năng, ngoài dấu chấm phẩy, 187 00:09:00,030 --> 00:09:04,430 bạn thực sự có thể lừa một máy tính vào thực hiện một cái gì đó giống như rm-rf 188 00:09:04,430 --> 00:09:07,810 hoặc lệnh Email hoặc lệnh Copy. 189 00:09:07,810 --> 00:09:11,400 Bất cứ điều gì nghĩa là bạn có thể làm với máy tính, cho dù đó là xóa các tập tin, 190 00:09:11,400 --> 00:09:15,350 tạo ra các tập tin, gửi thư rác một ai đó, tấn công một số máy chủ từ xa, 191 00:09:15,350 --> 00:09:17,190 nếu bạn có thể thể hiện nó với một lệnh, bạn 192 00:09:17,190 --> 00:09:19,120 có thể lừa một máy tính vào làm điều đó. 193 00:09:19,120 --> 00:09:21,510 >> Bây giờ một ví dụ về những gì làm thế nào bạn có thể làm điều này? 194 00:09:21,510 --> 00:09:24,300 Vâng, có rất nhiều máy tính Bash trên internet đang chạy. 195 00:09:24,300 --> 00:09:26,390 Tất cả người dùng Mac chúng tôi là trong số đó. 196 00:09:26,390 --> 00:09:30,390 Rất nhiều máy chủ Linux là một trong họ là tốt, và các máy chủ Unix. 197 00:09:30,390 --> 00:09:32,630 Windows một lần nữa được tương đối ra khỏi móc 198 00:09:32,630 --> 00:09:34,590 trừ khi bạn đã cài đặt phần mềm đặc biệt. 199 00:09:34,590 --> 00:09:37,130 Bây giờ rất nhiều máy chủ, cho Ví dụ, máy chủ web chạy, 200 00:09:37,130 --> 00:09:39,840 và trong thực tế Linux có lẽ là hầu hết các hệ điều hành phổ biến 201 00:09:39,840 --> 00:09:43,060 để chạy trên các máy tính trên internet được phục vụ lên các trang web. 202 00:09:43,060 --> 00:09:44,910 Bây giờ như chúng ta sẽ thấy sau này trong học kỳ, khi 203 00:09:44,910 --> 00:09:48,470 bạn gửi một yêu cầu từ browser-- Chrome của bạn, 204 00:09:48,470 --> 00:09:50,790 Internet Explorer, whatever-- đến một máy chủ từ xa, 205 00:09:50,790 --> 00:09:53,730 nó chỉ ra rằng mặc dù bạn chỉ cần gõ www.example.com, 206 00:09:53,730 --> 00:09:59,590 trình duyệt của bạn gửi một tin nhắn đó là nhiều hơn một chút phức tạp, như thế này. 207 00:09:59,590 --> 00:10:01,239 >> Nhưng hãy chú ý một chút gì đó kỳ lạ. 208 00:10:01,239 --> 00:10:03,030 Hai dòng đầu tiên Tôi chưa bao giờ thấy trước đây, 209 00:10:03,030 --> 00:10:04,904 nhưng họ không nhìn đặc biệt là đe dọa. 210 00:10:04,904 --> 00:10:08,030 Nhưng hãy chú ý những gì tôi đã bị đánh cắp cho dòng thứ ba ở đây. 211 00:10:08,030 --> 00:10:13,390 Nếu một kẻ xấu đã gửi một thông điệp như thế này từ máy tính của mình 212 00:10:13,390 --> 00:10:17,270 sang một máy Mac dễ bị tổn thương hoặc máy chủ Linux dễ bị tổn thương, 213 00:10:17,270 --> 00:10:21,580 điều buồn cười là Bash đó, đơn giản nhắc ít lệnh, 214 00:10:21,580 --> 00:10:27,450 là mặt ở khắp nơi và thường là được sử dụng chủ yếu để thực hiện 215 00:10:27,450 --> 00:10:30,020 nội dung của một thông điệp mà nó nhận được. 216 00:10:30,020 --> 00:10:33,490 Và theo logic đó, bạn có thể lừa một máy chủ web, do đó, 217 00:10:33,490 --> 00:10:36,370 bằng cách gửi một cái gì đó giống như User-Agent, mà thường 218 00:10:36,370 --> 00:10:38,300 là nghĩa vụ phải nói tên của trình duyệt của bạn. 219 00:10:38,300 --> 00:10:42,420 User-Agent Chrome, User-Agent Internet Explorer, User-Agent Firefox, điều này 220 00:10:42,420 --> 00:10:44,590 chỉ là trình duyệt của bạn cách để xác định chính nó. 221 00:10:44,590 --> 00:10:46,605 Nhưng nếu một kẻ xấu rất khéo léo nói, mm-mm, tôi 222 00:10:46,605 --> 00:10:47,930 sẽ không cho bạn biết những gì trình duyệt của tôi là, 223 00:10:47,930 --> 00:10:50,888 Tôi thay vì sẽ gửi cho bạn này khó hiểu, tìm kiếm việc bằng một rm-rf 224 00:10:50,888 --> 00:10:55,840 * Trong đó, bạn có nghĩa là có thể lừa một máy chủ web dễ bị tổn thương trên internet 225 00:10:55,840 --> 00:10:59,055 vào thực hiện một cách chính xác rằng trong có để xóa tất cả các file. 226 00:10:59,055 --> 00:11:00,930 Và thẳng thắn mà nói, đó không phải là thậm chí tồi tệ nhất của nó. 227 00:11:00,930 --> 00:11:01,763 Bạn có thể làm bất cứ điều gì. 228 00:11:01,763 --> 00:11:04,480 Bạn có thể bắt đầu một phân phối tấn công từ chối dịch vụ 229 00:11:04,480 --> 00:11:07,030 nếu bạn gửi thông điệp này đến toàn bộ chùm các máy chủ web 230 00:11:07,030 --> 00:11:10,256 và sau đó có tất cả chúng xuống, cho Ví dụ, trên các máy chủ Harvard.edu, 231 00:11:10,256 --> 00:11:12,130 và bạn có thể sắp xếp các bang quái trong số họ 232 00:11:12,130 --> 00:11:15,490 bởi một mạng lưới giao thông đó là nếu không kích hoạt bởi kẻ xấu này. 233 00:11:15,490 --> 00:11:18,760 >> Vì vậy, câu chuyện dài ngắn, gần như tất cả mọi người trong căn phòng này sở hữu một máy Mac 234 00:11:18,760 --> 00:11:20,240 là dễ bị tổn thương này. 235 00:11:20,240 --> 00:11:24,100 Các lớp lót bạc là trừ khi bạn chạy một máy chủ web trên máy tính xách tay của bạn, 236 00:11:24,100 --> 00:11:27,780 và trừ khi bạn đã thực sự cấu hình nó cho phép một cái gì đó giống như SSH vào nó, 237 00:11:27,780 --> 00:11:28,670 bạn thực sự an toàn. 238 00:11:28,670 --> 00:11:31,710 Đó là dễ bị tổn thương, nhưng không có một cố gắng để có được vào máy tính xách tay của bạn, 239 00:11:31,710 --> 00:11:33,290 vì vậy bạn có loại có thể yên tâm. 240 00:11:33,290 --> 00:11:36,210 Tuy nhiên, Apple sẽ sớm được cập nhật bản sửa lỗi cho việc này. 241 00:11:36,210 --> 00:11:39,660 Thế giới của Linux đã phát hành một số bản sửa lỗi cho Fedora và Ubuntu 242 00:11:39,660 --> 00:11:43,790 và phiên bản khác của Linux, và thực sự nếu bạn cập nhật 50 trong thiết bị, 243 00:11:43,790 --> 00:11:45,930 thậm chí cũng sẽ được cập nhật và sửa chữa. 244 00:11:45,930 --> 00:11:47,764 Nhưng đó cũng có không thực sự là dễ bị tổn thương, 245 00:11:47,764 --> 00:11:49,804 bởi vì trừ khi bạn đã tinkered với thiết bị này 246 00:11:49,804 --> 00:11:52,770 và làm cho máy tính xách tay của bạn công khai truy cập trên internet, mà không phải là 247 00:11:52,770 --> 00:11:54,910 theo mặc định, bạn đã thực sự được tốt vì 248 00:11:54,910 --> 00:11:56,890 của tường lửa và các kỹ thuật khác. 249 00:11:56,890 --> 00:12:01,000 >> Nhưng nó là một ví dụ điển hình của một lỗi mà chúng tôi đã sống cho đúng nghĩa đen 20 250 00:12:01,000 --> 00:12:04,050 năm, và ai biết được nếu một người nào đó tất cả thời gian này đã được biết về nó? 251 00:12:04,050 --> 00:12:06,300 Và trên thực tế, đây là một trong những thách thức cơ bản 252 00:12:06,300 --> 00:12:08,690 rằng chúng ta sẽ thấy sau này trong học kỳ về an ninh, 253 00:12:08,690 --> 00:12:13,020 là giống như trong thế giới thực, người tốt đang ở thế bất lợi. 254 00:12:13,020 --> 00:12:16,500 Để giữ cho những kẻ xấu ra, chúng ta phải đảm bảo rằng tất cả các cánh cửa bị khóa, 255 00:12:16,500 --> 00:12:20,340 rằng tất cả các cửa sổ là an toàn, mà tất cả các điểm nhập cảnh vào một ngôi nhà 256 00:12:20,340 --> 00:12:21,980 là an toàn để giữ những kẻ xấu ra. 257 00:12:21,980 --> 00:12:26,870 Nhưng những gì kẻ xấu phải làm gì để thực sự thỏa hiệp nhà của bạn 258 00:12:26,870 --> 00:12:28,200 và ăn cắp từ bạn? 259 00:12:28,200 --> 00:12:32,574 Người đó chỉ cần có để tìm thấy một khóa cửa, một cửa sổ bị hỏng, hoặc một cái gì đó 260 00:12:32,574 --> 00:12:35,240 theo con đường này, và đó là điều tương tự trong bảo mật máy tính. 261 00:12:35,240 --> 00:12:37,660 Chúng tôi có thể viết hàng triệu dòng mã lập trình 262 00:12:37,660 --> 00:12:40,570 và chi tiêu hàng trăm hoặc hàng ngàn giờ cố gắng để làm cho nó chính xác, 263 00:12:40,570 --> 00:12:43,370 nhưng nếu bạn chỉ làm một sai lầm trong tính chính xác, 264 00:12:43,370 --> 00:12:47,030 bạn có thể đặt toàn bộ hệ thống và thực sự trong trường hợp này, toàn bộ internet 265 00:12:47,030 --> 00:12:48,660 và trên thế giới có nguy cơ. 266 00:12:48,660 --> 00:12:51,950 >> Vì vậy, nếu bạn muốn tìm hiểu thêm về điều này, đi đến URL này ở đây. 267 00:12:51,950 --> 00:12:54,450 Không cần phải hành động tối nay trừ khi bạn 268 00:12:54,450 --> 00:12:57,116 trong số những người cảm thấy thoải mái hơn đã được chạy web của riêng bạn 269 00:12:57,116 --> 00:12:59,810 máy chủ, trong trường hợp bạn cần mà, trên thực tế, cập nhật phần mềm của bạn. 270 00:12:59,810 --> 00:13:03,244 >> Và đây cũng là danh hiệu một bài phát biểu, và bây giờ là một giấy, 271 00:13:03,244 --> 00:13:05,410 mà chúng tôi đã liên kết trên trang web trình của ngày hôm nay. 272 00:13:05,410 --> 00:13:07,600 Đó là bởi một đồng nghiệp tên là Ken Thompson, người 273 00:13:07,600 --> 00:13:10,120 đã được chấp nhận rất nổi tiếng giải thưởng khoa học máy tính, 274 00:13:10,120 --> 00:13:13,495 và ông đã phát biểu này vài năm trước đây, chủ yếu là trên cùng một chủ đề. 275 00:13:13,495 --> 00:13:18,250 276 00:13:18,250 --> 00:13:20,520 Hỏi folks câu hỏi, nên bạn thực sự 277 00:13:20,520 --> 00:13:23,480 tin tưởng, cuối cùng, phần mềm bạn đã được đưa ra? 278 00:13:23,480 --> 00:13:26,100 Ví dụ, tất cả chúng ta được viết chương trình, 279 00:13:26,100 --> 00:13:27,820 và chúng tôi đã biên soạn họ kêu vang. 280 00:13:27,820 --> 00:13:31,830 Và kiến ​​thức của bạn, bạn đã viết bất kỳ chương trình cho CS50 nơi có 281 00:13:31,830 --> 00:13:35,310 một cánh cửa trở lại của các loại, có một cách là một kẻ xấu, nếu chạy chương trình của bạn, 282 00:13:35,310 --> 00:13:37,410 có thể mất trên máy tính của bạn? 283 00:13:37,410 --> 00:13:38,310 Có lẽ là không, phải không? 284 00:13:38,310 --> 00:13:40,180 Mario, và tham lam, và tín dụng. 285 00:13:40,180 --> 00:13:41,680 Đây là tất cả các chương trình khá nhỏ. 286 00:13:41,680 --> 00:13:43,910 Bạn muốn có được khá xấu nếu bạn thực sự 287 00:13:43,910 --> 00:13:47,310 thực hiện toàn bộ máy tính của bạn dễ bị tổn thương sau khi viết 10 hoặc 20 dòng mã, 288 00:13:47,310 --> 00:13:49,690 hoặc ít nhất là không nhận thức được một số của tác động an ninh. 289 00:13:49,690 --> 00:13:52,023 Bây giờ tôi nói rằng bông lơn, nhưng chúng ta sẽ thấy ngày nay 290 00:13:52,023 --> 00:13:54,600 và trong tuần này nó thực sự thực sự, thực sự dễ dàng 291 00:13:54,600 --> 00:13:57,980 là xấu và làm cho ngay cả chương trình ngắn dễ bị tổn thương. 292 00:13:57,980 --> 00:14:02,880 >> Nhưng hiện nay, ít nhất, nhận ra là câu hỏi được hỏi ở đây 293 00:14:02,880 --> 00:14:04,850 là về kêu vang trong một trình biên dịch. 294 00:14:04,850 --> 00:14:08,360 Tại sao chúng tôi được tin tưởng kêu vang cho hai hoặc ba tuần qua? 295 00:14:08,360 --> 00:14:12,650 Ai nói rằng bất cứ ai đã viết kêu vang không có "nếu" điều kiện trong đó 296 00:14:12,650 --> 00:14:17,680 mà chủ yếu tiêm một số không và những người thân vào mỗi chương trình biên dịch 297 00:14:17,680 --> 00:14:21,180 mà có thể cho anh ta hoặc cô truy cập máy tính của bạn khi bạn đang ngủ 298 00:14:21,180 --> 00:14:23,580 và nắp máy tính xách tay của bạn đang mở và máy tính của bạn đang chạy? 299 00:14:23,580 --> 00:14:24,080 Phải không? 300 00:14:24,080 --> 00:14:28,350 Chúng tôi có loại này hệ thống danh dự bên phải tại nơi mà chúng tôi tin tưởng rằng kêu vang là VN. 301 00:14:28,350 --> 00:14:30,000 Bạn tin tưởng rằng thiết bị này là hợp pháp. 302 00:14:30,000 --> 00:14:34,430 Bạn tin tưởng rằng nghĩa đen mỗi chương trình trên máy Mac hoặc máy PC của bạn là đáng tin cậy. 303 00:14:34,430 --> 00:14:37,510 Và như lỗi đơn giản này cho thấy, thậm chí nếu nó không độc hại, 304 00:14:37,510 --> 00:14:40,580 đó là hoàn toàn không có thể là trường hợp. 305 00:14:40,580 --> 00:14:42,350 >> Vì vậy, bạn nên sợ hãi như là địa ngục. 306 00:14:42,350 --> 00:14:45,560 Thành thật mà nói, không có đơn giản giải pháp cho điều này khác 307 00:14:45,560 --> 00:14:48,185 hơn một loại nhận thức xã hội sự phức tạp ngày càng tăng 308 00:14:48,185 --> 00:14:50,310 mà chúng ta đang xây dựng trên hệ thống máy tính của chúng tôi, 309 00:14:50,310 --> 00:14:53,740 và làm thế nào ngày càng dễ bị tổn thương chúng tôi rất tốt có thể được. 310 00:14:53,740 --> 00:14:55,570 >> Bây giờ với những gì đã nói, Breakout. 311 00:14:55,570 --> 00:14:59,889 Vì vậy, Breakout là vấn đề thiết lập ba, và Breakout là một trò chơi từ năm qua 312 00:14:59,889 --> 00:15:02,180 mà bạn có thể nhớ lại, nhưng cho chúng ta trong vấn đề thiết lập ba, 313 00:15:02,180 --> 00:15:04,450 nó cho phép chúng tôi để có việc sao lưu một notch 314 00:15:04,450 --> 00:15:08,880 để khi chúng tôi đang viết chương trình, thậm chí trong một cửa sổ Terminal như thế này, 315 00:15:08,880 --> 00:15:14,670 chúng tôi thực sự có thể chạy, cuối cùng, các chương trình đồ họa không 316 00:15:14,670 --> 00:15:17,800 không giống như những gì chúng ta đã có truy cập vào trong Scratch. 317 00:15:17,800 --> 00:15:20,910 Vì vậy, đây là của nhân viên thực hiện Breakout, 318 00:15:20,910 --> 00:15:23,930 mà chỉ là này phá gạch trò chơi, mà bạn di chuyển paddle của bạn trở lại 319 00:15:23,930 --> 00:15:27,590 và ra, và bạn đánh bóng chống lại những viên gạch màu lên hàng đầu. 320 00:15:27,590 --> 00:15:30,020 Vì vậy, đây là mang lại cho chúng tôi loại trở lại nơi 321 00:15:30,020 --> 00:15:33,180 chúng tôi có thể rất nhanh chóng với Scratch, và bây giờ với C, 322 00:15:33,180 --> 00:15:35,800 thực hiện của chúng ta giao diện người dùng đồ họa. 323 00:15:35,800 --> 00:15:38,960 >> Nhưng hơn thế nữa, điều này vấn đề đại diện cho tập đầu tiên 324 00:15:38,960 --> 00:15:41,000 trong đó chúng ta đang đem lại cho bạn có một loạt các mã. 325 00:15:41,000 --> 00:15:43,940 Và trên thực tế, tôi mang lại cho rõ ràng ý đến điều này, bởi vì đặc biệt 326 00:15:43,940 --> 00:15:47,090 cho những người kém thoải mái, điều này vấn đề thiết lập, ít nhất là ở cái nhìn đầu tiên, 327 00:15:47,090 --> 00:15:49,170 sẽ cảm thấy như chúng tôi đã đưa nó lên một notch. 328 00:15:49,170 --> 00:15:51,540 Bởi vì chúng tôi đã đưa cho bạn, cho một số các tìm kiếm 329 00:15:51,540 --> 00:15:54,930 và phân loại các vấn đề trong pset, một loạt các mã mà chúng tôi đã viết, 330 00:15:54,930 --> 00:15:56,680 và một vài ý kiến mà nói "để làm" 331 00:15:56,680 --> 00:15:58,221 nơi bạn có để điền vào chỗ trống. 332 00:15:58,221 --> 00:16:00,020 Vì vậy, không quá đáng sợ, nhưng đó là lần đầu tiên 333 00:16:00,020 --> 00:16:03,370 chúng tôi trao cho bạn mã mà bạn cần lần đầu tiên đọc, hiểu, và sau đó thêm vào 334 00:16:03,370 --> 00:16:04,290 và hoàn thành nó. 335 00:16:04,290 --> 00:16:05,940 >> Và sau đó với Breakout, chúng ta sẽ làm như vậy, 336 00:16:05,940 --> 00:16:08,740 tạo cho bạn một vài chục dòng hơn mã đó, thẳng thắn, cung cấp cho bạn 337 00:16:08,740 --> 00:16:11,490 rất nhiều khuôn khổ cho các trò chơi nhưng dừng ngắn 338 00:16:11,490 --> 00:16:14,304 thực hiện những viên gạch và quả bóng và mái chèo, 339 00:16:14,304 --> 00:16:15,970 nhưng chúng tôi thực hiện một số tính năng khác. 340 00:16:15,970 --> 00:16:18,280 Và thậm chí là ở cái nhìn đầu tiên, một lần nữa, đặc biệt là nếu không thoải mái, 341 00:16:18,280 --> 00:16:21,480 có vẻ đặc biệt khó khăn và bạn nghĩ rằng có rất nhiều chức năng mới 342 00:16:21,480 --> 00:16:24,070 bạn cần để bọc tâm trí của bạn xung quanh, và đó là sự thật. 343 00:16:24,070 --> 00:16:26,281 Nhưng hãy nhớ, đó là khá giống như Scratch. 344 00:16:26,281 --> 00:16:28,780 Tỷ lệ cược là bạn không sử dụng tất cả các các mảnh ghép trong Scratch. 345 00:16:28,780 --> 00:16:31,120 Tỷ lệ cược là bạn không quan tâm để bọc tâm trí của bạn xung quanh tất cả chúng 346 00:16:31,120 --> 00:16:33,617 bởi vì tất cả nó đã là một Nhìn lướt qua để hiểu, oh, 347 00:16:33,617 --> 00:16:35,450 đó là những gì tôi có thể làm với mảnh ghép. 348 00:16:35,450 --> 00:16:38,260 Và quả thực, trong vấn đề thiết lập 3 spec, chúng tôi sẽ chỉ cho bạn 349 00:16:38,260 --> 00:16:41,370 tài liệu hướng dẫn mà sẽ giới thiệu với bạn một số chức năng mới, 350 00:16:41,370 --> 00:16:43,570 và cuối cùng là lập trình xây dựng bạn sử dụng. 351 00:16:43,570 --> 00:16:47,610 Điều kiện, vòng, biến, và các chức năng 352 00:16:47,610 --> 00:16:50,720 sẽ giống những gì chúng ta đã thấy cho đến nay. 353 00:16:50,720 --> 00:16:53,560 >> Vì vậy, trên thực tế, những gì chúng tôi sẽ cung cấp cho bạn là một số mẫu mã mà 354 00:16:53,560 --> 00:16:56,110 cho phép bạn tạo ra một cửa sổ không trông không giống như này, 355 00:16:56,110 --> 00:16:59,540 và cuối cùng biến nó thành một cái gì đó khá như thế này. 356 00:16:59,540 --> 00:17:02,250 Vì vậy, tận dụng lợi thế của CS50, thảo luận về giờ làm việc và nhiều hơn nữa, 357 00:17:02,250 --> 00:17:05,290 và chịu thoải mái trong thực tế là số lượng mã bạn phải viết 358 00:17:05,290 --> 00:17:06,760 thực sự là không phải tất cả những gì nhiều. 359 00:17:06,760 --> 00:17:10,359 Thách thức đầu tiên chỉ là để thích nghi mình để một số mã, chúng tôi đã viết. 360 00:17:10,359 --> 00:17:11,450 361 00:17:11,450 --> 00:17:15,810 >> Bất kỳ câu hỏi về pset3, Shellshock, hay nói cách khác? 362 00:17:15,810 --> 00:17:19,226 >> TƯỢNG: Có vẻ như đi qua với Breakout 363 00:17:19,226 --> 00:17:22,154 rằng mã gần như một phong cách hướng đối tượng, 364 00:17:22,154 --> 00:17:24,675 nhưng tôi nghĩ rằng C là một hướng đối tượng chương trình. 365 00:17:24,675 --> 00:17:26,050 SPEAKER 1: Một câu hỏi tuyệt vời. 366 00:17:26,050 --> 00:17:28,258 Vì vậy, trong việc tìm kiếm thông qua các đang phân phối, các mã 367 00:17:28,258 --> 00:17:30,180 chúng tôi đã viết cho pset3, cho những người quen thuộc, nó 368 00:17:30,180 --> 00:17:32,230 Dường như đó là một ít đối tượng. 369 00:17:32,230 --> 00:17:33,800 Câu trả lời ngắn gọn là, nó được. 370 00:17:33,800 --> 00:17:38,130 Đó là một xấp xỉ của bạn như thế nào có thể làm mã hướng đối tượng sử dụng 371 00:17:38,130 --> 00:17:41,850 một ngôn ngữ như C, nhưng nó là vẫn còn cuối cùng là thủ tục. 372 00:17:41,850 --> 00:17:44,900 Không có phương pháp bên trong các biến, như bạn sẽ thấy. 373 00:17:44,900 --> 00:17:46,180 Nhưng đó là gợi nhớ về điều đó. 374 00:17:46,180 --> 00:17:48,780 Và chúng ta sẽ thấy tính năng này một lần nữa khi chúng tôi nhận được PHP và JavaScript 375 00:17:48,780 --> 00:17:49,946 vào cuối học kỳ. 376 00:17:49,946 --> 00:17:53,667 Nhưng hiện nay, nghĩ về nó như một gợi ý về những gì sắp tới. 377 00:17:53,667 --> 00:17:54,250 Câu hỏi. 378 00:17:54,250 --> 00:17:56,051 379 00:17:56,051 --> 00:17:56,550 Tất cả các quyền. 380 00:17:56,550 --> 00:17:59,730 Vì vậy, sắp xếp hợp nhất là cách chúng tôi điều trái thời gian qua. 381 00:17:59,730 --> 00:18:03,250 Và sắp xếp hợp nhất đã được mát mẻ trong nghĩa là nó đã được nhanh hơn rất nhiều, 382 00:18:03,250 --> 00:18:07,100 ít nhất là dựa trên các bài kiểm tra lướt qua chúng tôi đã làm tuần trước, hơn, nói, bong bóng 383 00:18:07,100 --> 00:18:08,710 sắp xếp, lựa chọn sắp xếp, sắp xếp chèn. 384 00:18:08,710 --> 00:18:11,780 Và những gì đã được gọn gàng quá chỉ là cách ngắn gọn và sạch 385 00:18:11,780 --> 00:18:12,810 bạn có thể thể hiện nó. 386 00:18:12,810 --> 00:18:15,840 Và những gì chúng ta đã nói nó là một trên ràng buộc về thời gian chạy của hợp nhất 387 00:18:15,840 --> 00:18:16,340 sắp xếp? 388 00:18:16,340 --> 00:18:17,633 389 00:18:17,633 --> 00:18:18,495 Vâng? 390 00:18:18,495 --> 00:18:19,360 >> TƯỢNG: n log n? 391 00:18:19,360 --> 00:18:20,819 >> SPEAKER 1: n log n, phải. n log n. 392 00:18:20,819 --> 00:18:23,776 Và chúng tôi sẽ trở lại với những gì mà thực sự có nghĩa là hoặc nơi xuất phát từ, 393 00:18:23,776 --> 00:18:25,570 nhưng điều này là tốt hơn so với những gì thời gian chạy 394 00:18:25,570 --> 00:18:28,440 mà chúng ta đã thấy cho bong bóng lựa chọn và sắp xếp chèn? 395 00:18:28,440 --> 00:18:30,610 Vì vậy, n bình phương. n bình phương lớn hơn này, 396 00:18:30,610 --> 00:18:34,650 và thậm chí nếu nó không hoàn toàn rõ ràng, biết rằng log n nhỏ hơn n, 397 00:18:34,650 --> 00:18:36,910 vì vậy nếu bạn làm n lần một cái gì đó nhỏ hơn n, 398 00:18:36,910 --> 00:18:38,680 nó sẽ được ít hơn n bình phương. 399 00:18:38,680 --> 00:18:40,130 Đó là một chút của trực giác đó. 400 00:18:40,130 --> 00:18:42,190 Nhưng chúng tôi đã phải trả giá cho việc này. 401 00:18:42,190 --> 00:18:47,000 Đó là nhanh hơn, nhưng một chủ đề mà bắt đầu xuất hiện trong tuần qua là sự cân bằng này. 402 00:18:47,000 --> 00:18:49,804 Tôi có hiệu suất tốt hơn thời gian khôn ngoan, nhưng những gì 403 00:18:49,804 --> 00:18:52,470 Tôi đã phải mất mặt khác tay, để đạt được điều đó? 404 00:18:52,470 --> 00:18:53,591 >> TƯỢNG: bộ nhớ. 405 00:18:53,591 --> 00:18:54,465 SPEAKER 1: Giả sử một lần nữa? 406 00:18:54,465 --> 00:18:55,173 TƯỢNG: bộ nhớ. 407 00:18:55,173 --> 00:18:57,040 SPEAKER 1: nhớ, hoặc không gian nói chung. 408 00:18:57,040 --> 00:18:59,040 Và đó không phải là siêu rõ ràng với con người của chúng tôi, 409 00:18:59,040 --> 00:19:02,240 nhưng nhớ lại rằng tình nguyện viên của chúng tôi đã bước về phía trước và bước 410 00:19:02,240 --> 00:19:04,780 trở lại như thể có một mảng ở đây, và như thể có 411 00:19:04,780 --> 00:19:07,130 một mảng thứ hai ở đây mà họ có thể sử dụng, bởi vì chúng tôi 412 00:19:07,130 --> 00:19:09,080 nơi nào cần thiết để kết hợp những folks. 413 00:19:09,080 --> 00:19:11,480 Chúng tôi không thể chỉ trao đổi chúng tại chỗ. 414 00:19:11,480 --> 00:19:13,800 Vì vậy, hợp nhất phân loại đòn bẩy là không gian hơn, 415 00:19:13,800 --> 00:19:15,620 chúng ta không cần có các thuật toán khác, 416 00:19:15,620 --> 00:19:17,410 nhưng ngược là nó nhanh hơn nhiều. 417 00:19:17,410 --> 00:19:20,780 Và thẳng thắn mà nói, trong không gian thế giới thực những RAM days--, đĩa cứng space-- 418 00:19:20,780 --> 00:19:25,030 là tương đối rẻ, và vì vậy đó là không nhất thiết phải là một điều xấu. 419 00:19:25,030 --> 00:19:28,320 >> Vì vậy, chúng ta hãy có một cái nhìn nhanh chóng, một chút nhiều phương pháp, những gì chúng tôi đã làm 420 00:19:28,320 --> 00:19:30,220 và tại sao chúng ta biết nó đã được n log n. 421 00:19:30,220 --> 00:19:33,260 Vì vậy, đây là những con số tám và các tám tình nguyện viên chúng tôi đã có thời gian qua. 422 00:19:33,260 --> 00:19:35,718 Và điều đầu tiên mà Merge Sắp xếp nói với chúng tôi phải làm là gì? 423 00:19:35,718 --> 00:19:37,010 424 00:19:37,010 --> 00:19:38,010 TƯỢNG: Chia làm hai phần. 425 00:19:38,010 --> 00:19:38,663 SPEAKER 1: Giả sử một lần nữa? 426 00:19:38,663 --> 00:19:39,650 TƯỢNG: Chia làm hai phần. 427 00:19:39,650 --> 00:19:40,610 SPEAKER 1: Chia ra làm đôi, bên phải. 428 00:19:40,610 --> 00:19:42,818 Điều này là rất gợi nhớ danh bạ điện thoại, phân chia 429 00:19:42,818 --> 00:19:44,220 và chinh phục nói chung. 430 00:19:44,220 --> 00:19:45,640 Vì vậy, chúng ta nhìn vào nửa trái. 431 00:19:45,640 --> 00:19:48,700 Và một khi chúng tôi đã nói, sắp xếp nửa bên trái của các yếu tố, 432 00:19:48,700 --> 00:19:49,690 những gì chúng ta đã nói tới? 433 00:19:49,690 --> 00:19:51,210 434 00:19:51,210 --> 00:19:54,860 Sắp xếp nửa trái của trái một nửa, trong đó cho phép chúng tôi, 435 00:19:54,860 --> 00:19:57,570 sau khi chia hai, tập trung vào bốn và hai. 436 00:19:57,570 --> 00:20:01,280 >> Làm thế nào để sắp xếp một danh sách bây giờ, trong màu vàng, kích thước hai, sử dụng Merge theo? 437 00:20:01,280 --> 00:20:02,330 438 00:20:02,330 --> 00:20:04,580 Cũng chia một nửa, và sắp xếp các nửa trái. 439 00:20:04,580 --> 00:20:07,100 Và đây là nơi mà mọi thứ có một chút ngu ngốc một thời gian ngắn. 440 00:20:07,100 --> 00:20:10,720 Làm thế nào để sắp xếp một danh sách đó là của kích thước một, giống như con số này bốn ở đây? 441 00:20:10,720 --> 00:20:12,330 442 00:20:12,330 --> 00:20:13,210 Nó được sắp xếp. 443 00:20:13,210 --> 00:20:14,200 Bạn đang thực hiện. 444 00:20:14,200 --> 00:20:17,300 >> Nhưng sau đó làm thế nào để sắp xếp một danh sách kích thước một khi đó là số hai? 445 00:20:17,300 --> 00:20:21,640 Vâng, điều tương tự, nhưng bây giờ đã được những gì thứ ba và các bước quan trọng trong Merge theo? 446 00:20:21,640 --> 00:20:24,020 Bạn phải nhập trái một nửa và nửa bên phải. 447 00:20:24,020 --> 00:20:26,580 Và một khi chúng ta đã làm điều đó, chúng tôi đã tại bốn, chúng tôi nhìn hai. 448 00:20:26,580 --> 00:20:28,750 Chúng tôi quyết định rồi, rõ ràng là hai đến trước, 449 00:20:28,750 --> 00:20:31,840 vì vậy chúng tôi đặt hai trong của nó vị trí, kèm theo bốn. 450 00:20:31,840 --> 00:20:35,010 Và bây giờ bạn phải loại tua lại, và đây là loại đặc trưng 451 00:20:35,010 --> 00:20:37,570 của một thuật toán như Merge Sắp xếp, tua lại trong bộ nhớ. 452 00:20:37,570 --> 00:20:40,240 Dòng tiếp theo của câu chuyện là gì? 453 00:20:40,240 --> 00:20:41,780 Những gì tôi nên tập trung vào tiếp theo? 454 00:20:41,780 --> 00:20:43,110 455 00:20:43,110 --> 00:20:47,350 Nửa bên phải của trái một nửa, nào là sáu và tám. 456 00:20:47,350 --> 00:20:50,320 >> Vì vậy, hãy để tôi bước qua này mà không belaboring điểm quá nhiều. 457 00:20:50,320 --> 00:20:53,330 Sáu và tám, sau đó sáu là sắp xếp, tám được sắp xếp. 458 00:20:53,330 --> 00:20:57,190 Kết hợp chúng lại với nhau như thế, và bây giờ là bước tiến lớn tiếp theo 459 00:20:57,190 --> 00:21:00,990 được, tất nhiên, sắp xếp nửa bên phải từ bước đầu tiên của thuật toán này. 460 00:21:00,990 --> 00:21:02,870 Vì vậy, chúng tôi tập trung vào một, ba, bảy, năm. 461 00:21:02,870 --> 00:21:04,540 Sau đó chúng tôi tập trung vào nửa trái. 462 00:21:04,540 --> 00:21:09,400 Nửa bên trái đó, nửa bên phải của đó, và sau đó hợp nhất trong một và ba. 463 00:21:09,400 --> 00:21:13,100 Sau đó, nửa bên phải, sau đó còn lại một nửa của nó, sau đó nửa bên phải của nó. 464 00:21:13,100 --> 00:21:15,985 Kết hợp nó vào, và bây giờ những gì bước vẫn còn? 465 00:21:15,985 --> 00:21:18,040 466 00:21:18,040 --> 00:21:22,460 Hợp nhất nửa trái lớn và lớn nửa bên phải, vì vậy người ta đi xuống đó, 467 00:21:22,460 --> 00:21:27,330 sau đó hai, rồi ba, rồi bốn, sau đó năm, sau đó sáu, sau đó bảy, sau đó tám. 468 00:21:27,330 --> 00:21:31,990 >> Vì vậy, bây giờ tại sao điều này cuối cùng được tiết lộ, đặc biệt là nếu n và logarit hơn 469 00:21:31,990 --> 00:21:35,487 nói chung chứ không phải thoát khỏi bạn, ít nhất là trong thời gian gần đây? 470 00:21:35,487 --> 00:21:37,070 Vâng, chú ý đến chiều cao của điều này. 471 00:21:37,070 --> 00:21:41,230 Chúng tôi đã có tám yếu tố, và chúng tôi chia nó bằng hai, hai, bởi hai. 472 00:21:41,230 --> 00:21:44,590 Vì vậy, cơ sở đăng nhập hai trong số tám cho chúng ta ba. 473 00:21:44,590 --> 00:21:45,640 474 00:21:45,640 --> 00:21:48,540 Và tin tưởng tôi về điều đó nếu một chút mơ hồ về điều đó. 475 00:21:48,540 --> 00:21:54,710 Tuy nhiên, cơ sở đăng nhập hai tám là ba, vì vậy chúng tôi đã làm ba lớp sáp nhập. 476 00:21:54,710 --> 00:21:57,170 Và khi chúng tôi sáp nhập yếu tố, bao nhiêu yếu tố 477 00:21:57,170 --> 00:21:58,950 chúng tôi đã nhìn vào mỗi người hàng? 478 00:21:58,950 --> 00:22:00,212 479 00:22:00,212 --> 00:22:01,437 Tổng cộng có n, phải không? 480 00:22:01,437 --> 00:22:04,020 Bởi vì để hợp nhất hàng đầu, mặc dù chúng tôi đã làm trọn vẹn, 481 00:22:04,020 --> 00:22:05,990 cuối cùng chúng ta chạm vào mỗi số một lần. 482 00:22:05,990 --> 00:22:09,054 Và trong hàng thứ hai, để kết hợp những danh sách kích thước hai, 483 00:22:09,054 --> 00:22:10,470 chúng tôi đã chạm vào từng yếu tố một lần. 484 00:22:10,470 --> 00:22:12,690 Và sau đó ở đây thực sự rõ ràng ở hàng cuối cùng, 485 00:22:12,690 --> 00:22:15,430 chúng tôi đã phải chạm vào nhau của những các yếu tố một lần, nhưng chỉ một lần, 486 00:22:15,430 --> 00:22:18,400 vì vậy đây nằm, sau đó, chúng tôi n log n. 487 00:22:18,400 --> 00:22:21,780 >> Và bây giờ chỉ để làm cho mọi việc một chút nhiều chính thức chỉ là một khoảnh khắc, nếu bạn 488 00:22:21,780 --> 00:22:24,260 là đến nay phân tích này tại một loại mức độ cao hơn 489 00:22:24,260 --> 00:22:28,340 và cố gắng để quyết định, tốt như thế nào bạn có thể đi về thể hiện 490 00:22:28,340 --> 00:22:31,780 thời gian chạy của thuật toán này chỉ cần nhìn vào nó và không 491 00:22:31,780 --> 00:22:33,590 bằng cách sử dụng một ví dụ giả tạo? 492 00:22:33,590 --> 00:22:36,590 Vâng, bao nhiêu thời gian bạn có thể nói một bước như thế này trong màu vàng sẽ mất, 493 00:22:36,590 --> 00:22:37,173 nếu n <2 trở lại? 494 00:22:37,173 --> 00:22:38,840 495 00:22:38,840 --> 00:22:39,830 Đó là một O lớn của những gì? 496 00:22:39,830 --> 00:22:41,450 497 00:22:41,450 --> 00:22:44,540 Vì vậy, tôi đang nhìn thấy một, vì vậy một bước, có lẽ hai bước bởi vì nó nếu 498 00:22:44,540 --> 00:22:47,110 và sau đó quay trở lại, nhưng nó thời gian liên tục, phải không? 499 00:22:47,110 --> 00:22:49,960 Vì vậy, chúng tôi đã nói O (1), và đó là làm thế nào tôi sẽ thể hiện điều này. 500 00:22:49,960 --> 00:22:51,480 T, chỉ cần thời gian chạy. 501 00:22:51,480 --> 00:22:54,150 n là kích thước của đầu vào, nên T (n), chỉ là một cách ưa thích 502 00:22:54,150 --> 00:22:56,330 nói rằng các hoạt động thời gian đầu vào cho kích thước n 503 00:22:56,330 --> 00:23:00,220 là có được về trình tự thời gian liên tục, trong O (1). 504 00:23:00,220 --> 00:23:01,970 >> Nhưng nếu không, những gì về điều này? 505 00:23:01,970 --> 00:23:05,660 Làm thế nào bạn sẽ thể hiện thời gian của dòng màu vàng này chạy? 506 00:23:05,660 --> 00:23:06,250 T của những gì? 507 00:23:06,250 --> 00:23:09,440 508 00:23:09,440 --> 00:23:12,665 Bạn có thể loại gian lận ở đây và trả lời câu hỏi của tôi theo chu kỳ. 509 00:23:12,665 --> 00:23:14,770 510 00:23:14,770 --> 00:23:17,900 Vì vậy, nếu thời gian chạy trong Nhìn chung, chúng tôi chỉ nói là T (n). 511 00:23:17,900 --> 00:23:18,950 512 00:23:18,950 --> 00:23:22,490 Và bây giờ bạn đang loại punting đây nói, tốt, chỉ cần sắp xếp một nửa trái, 513 00:23:22,490 --> 00:23:23,920 và sau đó sắp xếp nửa bên phải. 514 00:23:23,920 --> 00:23:27,520 Làm thế nào chúng ta có thể biểu tượng đại diện cho thời gian chạy của dòng màu vàng này? 515 00:23:27,520 --> 00:23:28,020 T của những gì? 516 00:23:28,020 --> 00:23:29,360 Kích thước của đầu vào là gì? 517 00:23:29,360 --> 00:23:30,510 518 00:23:30,510 --> 00:23:31,057 n hơn hai. 519 00:23:31,057 --> 00:23:32,140 Tại sao tôi không chỉ nói rằng? 520 00:23:32,140 --> 00:23:36,449 Và sau đó đây là một T (n / 2) và sau đó một lần nữa, nếu tôi kết hợp hai nửa đã được sắp xếp, 521 00:23:36,449 --> 00:23:38,615 có bao nhiêu yếu tố tôi sẽ phải chạm tổng? 522 00:23:38,615 --> 00:23:39,780 523 00:23:39,780 --> 00:23:40,320 n. 524 00:23:40,320 --> 00:23:42,790 Vì vậy, tôi có thể thể hiện điều này, chỉ là loại ưa thích, 525 00:23:42,790 --> 00:23:44,430 như thời gian chạy nói chung. 526 00:23:44,430 --> 00:23:51,140 T (n) chỉ là thời gian chạy của T (n / 2), cộng với T (n / 2), còn lại một nửa và nửa bên phải, 527 00:23:51,140 --> 00:23:55,360 cộng với O (n), mà có lẽ là bước n, nhưng có lẽ, nếu tôi đang sử dụng hai ngón tay, 528 00:23:55,360 --> 00:23:57,960 nó nhiều gấp đôi bước, nhưng đó là tuyến tính. 529 00:23:57,960 --> 00:24:00,440 Đó là một số bước đó là một yếu tố của n, 530 00:24:00,440 --> 00:24:02,270 vì vậy chúng tôi có thể thể hiện điều này vì điều này. 531 00:24:02,270 --> 00:24:05,550 Và đây là nơi mà bây giờ chúng ta sẽ đá trái banh vào sau của sách giáo khoa toán trường trung học của chúng tôi 532 00:24:05,550 --> 00:24:10,290 chúng tôi là tái phát cuối cùng kết thúc bằng này, n lần đăng nhập n, 533 00:24:10,290 --> 00:24:12,530 nếu bạn thực sự làm ra toán học chính thức hơn. 534 00:24:12,530 --> 00:24:13,950 >> Vì vậy, đó chỉ là hai quan điểm. 535 00:24:13,950 --> 00:24:17,500 Một số lượng với một mã hóa cứng ví dụ đại diện 536 00:24:17,500 --> 00:24:21,140 sử dụng tám con số, và nhiều hơn nữa nhìn chung như thế nào, chúng tôi đã có. 537 00:24:21,140 --> 00:24:25,670 Nhưng những gì thực sự thú vị ở đây là, một lần nữa, khái niệm này của xe đạp. 538 00:24:25,670 --> 00:24:26,900 Tôi không sử dụng cho các vòng. 539 00:24:26,900 --> 00:24:29,860 Tôi là loại xác định một cái gì đó về bản thân, 540 00:24:29,860 --> 00:24:31,950 không chỉ với điều này chức năng toán học, 541 00:24:31,950 --> 00:24:34,860 mà còn về mã giả này. 542 00:24:34,860 --> 00:24:38,260 Mã giả này là đệ quy trong đó hai dây chuyền của nó 543 00:24:38,260 --> 00:24:42,310 cơ bản là nói cho nó đi sử dụng nó để giải quyết một nhỏ hơn 544 00:24:42,310 --> 00:24:45,400 vấn đề kích thước nhỏ hơn, và sau đó một lần nữa và một lần nữa 545 00:24:45,400 --> 00:24:48,820 và một lần nữa cho đến khi chúng nó bớt xuống cái gọi là trường hợp cơ sở này. 546 00:24:48,820 --> 00:24:52,810 >> Vì vậy, hãy thực sự rút ra một hấp dẫn hơn take-away từ này như sau. 547 00:24:52,810 --> 00:24:58,420 Hãy để tôi đi vào gedit và tham gia một xem xét một số mã nguồn của ngày hôm nay, 548 00:24:58,420 --> 00:24:59,930 đặc biệt là ví dụ này ở đây. 549 00:24:59,930 --> 00:25:03,709 Sigma 0, mà dường như thêm số một đến n. 550 00:25:03,709 --> 00:25:05,750 Vì vậy, chúng ta hãy xem những gì quen thuộc và không quen thuộc ở đây. 551 00:25:05,750 --> 00:25:08,690 Trước tiên chúng ta có một vài bao gồm, vì vậy không có gì mới ở đó. 552 00:25:08,690 --> 00:25:09,190 Nguyên mẫu. 553 00:25:09,190 --> 00:25:11,370 Tôi là một chút mơ hồ về này sau vài ngày, 554 00:25:11,370 --> 00:25:13,790 nhưng những gì chúng ta đã nói một nguyên mẫu của một chức năng là gì? 555 00:25:13,790 --> 00:25:15,099 556 00:25:15,099 --> 00:25:16,015 TƯỢNG: [không nghe được]. 557 00:25:16,015 --> 00:25:16,905 SPEAKER 1: Cái gì thế? 558 00:25:16,905 --> 00:25:17,800 TƯỢNG: Chúng tôi thông báo nó. 559 00:25:17,800 --> 00:25:18,883 SPEAKER 1: Chúng tôi thông báo nó. 560 00:25:18,883 --> 00:25:22,290 Vì vậy, bạn đang giảng dạy kêu vang, hey, không thực sự thực hiện điều này chưa, 561 00:25:22,290 --> 00:25:25,740 nhưng đâu đó trong tập tin này, có lẽ, sẽ được một chức năng gọi là gì? 562 00:25:25,740 --> 00:25:26,930 563 00:25:26,930 --> 00:25:27,540 Sigma. 564 00:25:27,540 --> 00:25:30,540 Và đây chỉ là một lời hứa nó sẽ giống như thế này. 565 00:25:30,540 --> 00:25:33,720 Nó sẽ mất một số nguyên như input-- và tôi có thể được rõ ràng hơn 566 00:25:33,720 --> 00:25:36,570 và nói int n --and nó sẽ trả lại một int, 567 00:25:36,570 --> 00:25:39,900 nhưng có nghĩa là dấu chấm phẩy, mm, tôi sẽ nhận được xung quanh để thực hiện điều này một chút sau đó. 568 00:25:39,900 --> 00:25:40,989 Một lần nữa, kêu vang là câm. 569 00:25:40,989 --> 00:25:43,280 Nó sẽ chỉ biết những gì bạn nói với nó trên xuống dưới, 570 00:25:43,280 --> 00:25:45,765 vì vậy chúng tôi cần ít nhất là cho nó là một gợi ý về những gì sắp tới. 571 00:25:45,765 --> 00:25:47,330 >> Bây giờ chúng ta hãy nhìn vào chính ở đây. 572 00:25:47,330 --> 00:25:50,040 Hãy di chuyển xuống đây và xem những gì chính đang làm. 573 00:25:50,040 --> 00:25:53,780 Nó không phải là dài của một chức năng, và trong thực tế xây dựng ở đây là quen thuộc. 574 00:25:53,780 --> 00:25:57,590 Tôi tuyên bố một biến n, và sau đó Tôi làm phiền người sử dụng một lần nữa và một lần nữa 575 00:25:57,590 --> 00:26:01,880 cho một số nguyên dương sử dụng getInt, và chỉ thoát ra khỏi vòng lặp này 576 00:26:01,880 --> 00:26:03,280 một khi người dùng đã tuân thủ. 577 00:26:03,280 --> 00:26:05,670 Trong khi làm, chúng tôi đã sử dụng để sự chấp thuận của người sử dụng theo cách đó. 578 00:26:05,670 --> 00:26:06,670 Bây giờ đây là thú vị. 579 00:26:06,670 --> 00:26:08,510 Tôi tuyên bố một int gọi là "câu trả lời." 580 00:26:08,510 --> 00:26:11,420 Tôi gán cho nó giá trị trả về của một chức năng được gọi là "sigma". 581 00:26:11,420 --> 00:26:15,200 Tôi không biết những gì mà không nêu ra, nhưng Tôi nhớ tuyên bố nó vừa mới đây. 582 00:26:15,200 --> 00:26:18,310 Và sau đó tôi đi qua trong giá trị mà người dùng gõ vào, n, 583 00:26:18,310 --> 00:26:20,420 và sau đó tôi báo cáo câu trả lời. 584 00:26:20,420 --> 00:26:22,260 Vâng chúng ta hãy di chuyển trở lại chỉ trong một thời điểm. 585 00:26:22,260 --> 00:26:28,620 Chúng ta hãy đi trước vào thư mục này, hãy sigma 0, và thực sự chạy chương trình này 586 00:26:28,620 --> 00:26:30,490 và xem những gì sẽ xảy ra. 587 00:26:30,490 --> 00:26:35,930 Vì vậy, nếu tôi đi trước và chạy chương trình này, ./sigma-0, 588 00:26:35,930 --> 00:26:40,139 và tôi gõ vào một tích cực số nguyên như hai, Sigma, 589 00:26:40,139 --> 00:26:43,180 là biểu tượng của Hy Lạp có nghĩa, chỉ là sẽ thêm lên tất cả các số điện thoại từ 590 00:26:43,180 --> 00:26:44,320 số không vào đến hai. 591 00:26:44,320 --> 00:26:46,560 Vì vậy, 0 cộng với 1 cộng với 2. 592 00:26:46,560 --> 00:26:48,830 Vì vậy, đây hy vọng sẽ cho tôi 3. 593 00:26:48,830 --> 00:26:49,750 Đó là tất cả nó làm. 594 00:26:49,750 --> 00:26:52,690 Và tương tự, nếu tôi chạy này một lần nữa và tôi cho nó thứ ba, 595 00:26:52,690 --> 00:26:56,721 đó là 3 cộng với 2, vì vậy đó là 5, cộng với 1 nên cho tôi 6. 596 00:26:56,721 --> 00:26:59,470 Và sau đó nếu tôi nhận được thực sự điên rồ và bắt đầu gõ vào con số lớn hơn, 597 00:26:59,470 --> 00:27:01,290 nó sẽ cho tôi lớn hơn và lớn hơn số tiền. 598 00:27:01,290 --> 00:27:02,250 Vì vậy, đó là tất cả. 599 00:27:02,250 --> 00:27:04,010 >> Vì vậy, những gì sigma như thế nào? 600 00:27:04,010 --> 00:27:05,430 Vâng, đó là khá dễ dàng. 601 00:27:05,430 --> 00:27:08,940 Đó là cách mà chúng ta có thể đã thực hiện này trong vài tuần qua. 602 00:27:08,940 --> 00:27:11,120 "Int" là có được kiểu trả về. 603 00:27:11,120 --> 00:27:14,330 Sigma là tên, và phải mất một m biến thay vì n. 604 00:27:14,330 --> 00:27:15,940 Tôi sẽ thay đổi điều đó lên hàng đầu. 605 00:27:15,940 --> 00:27:17,340 Sau đó, đây chỉ là một kiểm tra sanity. 606 00:27:17,340 --> 00:27:18,430 607 00:27:18,430 --> 00:27:19,950 Chúng ta sẽ thấy lý do tại sao trong một thời điểm. 608 00:27:19,950 --> 00:27:24,220 Bây giờ tôi tuyên bố một biến khác, Tóm lại, khởi tạo nó bằng không. 609 00:27:24,220 --> 00:27:28,140 Sau đó, tôi có điều này Đối với loop lặp lại, rõ ràng cho rõ ràng, 610 00:27:28,140 --> 00:27:33,810 từ i = 1 trên lên đến một = m, đó là bất cứ điều gì người dùng gõ vào, và sau đó tôi 611 00:27:33,810 --> 00:27:35,690 tăng số tiền như thế này. 612 00:27:35,690 --> 00:27:37,360 Và sau đó trả lại số tiền. 613 00:27:37,360 --> 00:27:38,440 >> Vì vậy, một vài câu hỏi. 614 00:27:38,440 --> 00:27:42,370 Một, tôi yêu cầu bồi thường trong bình luận của tôi rằng điều này tránh nguy cơ của một vòng lặp vô hạn. 615 00:27:42,370 --> 00:27:45,620 Tại sao đi qua trong một số âm gây ra, có khả năng, một vòng lặp vô hạn? 616 00:27:45,620 --> 00:27:49,396 617 00:27:49,396 --> 00:27:51,290 >> TƯỢNG: Bạn sẽ không bao giờ đạt m. 618 00:27:51,290 --> 00:27:52,880 >> SPEAKER 1: Không bao giờ đạt m. 619 00:27:52,880 --> 00:27:55,880 Nhưng m được thông qua tại, vì vậy hãy xem xét một ví dụ đơn giản. 620 00:27:55,880 --> 00:27:58,510 Nếu m được thông qua tại các sử dụng như là một tiêu cực. 621 00:27:58,510 --> 00:28:00,059 Không phân biệt chính. 622 00:28:00,059 --> 00:28:01,850 Chính bảo vệ chúng ta khỏi này quá, vì vậy tôi chỉ 623 00:28:01,850 --> 00:28:04,680 thực sự là đường hậu môn với sigma để cũng đảm bảo 624 00:28:04,680 --> 00:28:06,540 rằng các đầu vào không thể phủ định. 625 00:28:06,540 --> 00:28:10,130 Vì vậy, nếu m là tiêu cực, cái gì đó như một tiêu cực. 626 00:28:10,130 --> 00:28:11,930 Điều gì sẽ xảy ra? 627 00:28:11,930 --> 00:28:14,390 Vâng, tôi sẽ được khởi tạo một, 628 00:28:14,390 --> 00:28:19,060 và sau đó tôi sẽ là nhỏ hơn hoặc bằng m? 629 00:28:19,060 --> 00:28:24,130 630 00:28:24,130 --> 00:28:24,765 >> Stand by. 631 00:28:24,765 --> 00:28:26,930 632 00:28:26,930 --> 00:28:29,370 Đó was-- chúng ta không, hãy đụng tới câu chuyện này. 633 00:28:29,370 --> 00:28:32,780 Tôi đã không hỏi câu hỏi đó, bởi vì nguy cơ mà tôi đang ám chỉ đến 634 00:28:32,780 --> 00:28:38,360 sẽ không xảy ra, vì tôi là luôn luôn lớn than-- OK, 635 00:28:38,360 --> 00:28:39,871 Tôi rút lại câu hỏi đó. 636 00:28:39,871 --> 00:28:40,370 OK. 637 00:28:40,370 --> 00:28:42,030 Hãy chỉ tập trung vào phần này ở đây. 638 00:28:42,030 --> 00:28:44,210 639 00:28:44,210 --> 00:28:48,830 Tại sao tôi lại khai báo một số bên ngoài vòng lặp? 640 00:28:48,830 --> 00:28:52,010 Thông báo trên dòng 49 tôi đã tôi tuyên bố bên trong vòng lặp, 641 00:28:52,010 --> 00:28:54,950 nhưng trực tuyến 48 tôi đã tuyên bố một số bên ngoài. 642 00:28:54,950 --> 00:28:55,695 Yeah. 643 00:28:55,695 --> 00:28:56,611 TƯỢNG: [không nghe được]. 644 00:28:56,611 --> 00:28:58,734 645 00:28:58,734 --> 00:28:59,400 SPEAKER 1: Chắc chắn. 646 00:28:59,400 --> 00:29:03,360 Vì vậy, đầu tiên và quan trọng nhất tôi chắc chắn không muốn khai báo và khởi tạo tổng hợp 647 00:29:03,360 --> 00:29:06,130 để không bên trong vòng lặp trên mỗi lần lặp, 648 00:29:06,130 --> 00:29:09,370 vì điều này sẽ đánh bại rõ Mục đích của việc tổng hợp các con số. 649 00:29:09,370 --> 00:29:11,770 Tôi sẽ tiếp tục thay đổi giá trị trở lại bằng không. 650 00:29:11,770 --> 00:29:17,992 Và cũng có thể, những gì khác phức tạp hơn Lý do cho rằng quyết định thiết kế giống nhau không? 651 00:29:17,992 --> 00:29:18,954 Yeah. 652 00:29:18,954 --> 00:29:20,279 >> TƯỢNG: [không nghe được]. 653 00:29:20,279 --> 00:29:21,070 SPEAKER 1: Chính xác. 654 00:29:21,070 --> 00:29:24,060 Tôi muốn truy cập nó bên ngoài của vòng lặp quá về những gì dòng? 655 00:29:24,060 --> 00:29:25,390 656 00:29:25,390 --> 00:29:26,400 Trên 53. 657 00:29:26,400 --> 00:29:29,910 Và dựa trên quy tắc của ngón tay cái của chúng tôi từ một vài bài giảng trước đây, 658 00:29:29,910 --> 00:29:33,680 biến được scoped, thực sự, đến dấu ngoặc nhọn mà bao gồm họ. 659 00:29:33,680 --> 00:29:38,190 Vì vậy, nếu tôi không khai báo số tiền bên trong các dấu ngoặc nhọn bên ngoài, 660 00:29:38,190 --> 00:29:40,250 Tôi không thể sử dụng nó trong dòng 53. 661 00:29:40,250 --> 00:29:43,160 Nói cách khác, nếu tôi tuyên bố tổng hợp ở đây, hoặc thậm chí trong 662 00:29:43,160 --> 00:29:45,410 Đối với loop, tôi không thể truy cập nó trong 53. 663 00:29:45,410 --> 00:29:47,150 Các biến có hiệu quả sẽ được đi. 664 00:29:47,150 --> 00:29:48,579 Vì vậy, một vài lý do đó. 665 00:29:48,579 --> 00:29:50,370 Nhưng bây giờ chúng ta hãy quay trở lại và xem những gì sẽ xảy ra. 666 00:29:50,370 --> 00:29:51,730 Vì vậy, sigma được gọi là. 667 00:29:51,730 --> 00:29:55,640 Nó cho biết thêm lên 1 cộng với 2, hoặc 1 cộng với 2 cộng với 3, và sau đó trả về giá trị, 668 00:29:55,640 --> 00:29:59,660 lưu trữ nó trong câu trả lời, và printf đây là lý do tại sao tôi nhìn thấy trên màn hình. 669 00:29:59,660 --> 00:30:03,079 Vì vậy, đây là những gì chúng tôi sẽ gọi lặp đi lặp lại phương pháp tiếp cận, nơi mà chỉ lặp đi lặp lại 670 00:30:03,079 --> 00:30:03,870 nghĩa là sử dụng một vòng lặp. 671 00:30:03,870 --> 00:30:06,900 Một Đối với loop, một vòng lặp Trong khi đó, một Do Trong khi vòng lặp, chỉ cần làm một cái gì đó một lần nữa 672 00:30:06,900 --> 00:30:08,380 và một lần nữa và một lần nữa. 673 00:30:08,380 --> 00:30:13,505 >> Nhưng sigma là loại một chức năng gọn gàng trong mà tôi có thể thực hiện nó một cách khác nhau. 674 00:30:13,505 --> 00:30:14,620 675 00:30:14,620 --> 00:30:19,120 Gì về điều này, mà chỉ để được loại mát mẻ, 676 00:30:19,120 --> 00:30:21,880 cho tôi thực sự thoát khỏi của rất nhiều phân tâm 677 00:30:21,880 --> 00:30:24,380 bởi vì chức năng này thực sự là khá đơn giản. 678 00:30:24,380 --> 00:30:27,780 Hãy bớt nó xuống chỉ đến bốn dòng cốt lõi của nó 679 00:30:27,780 --> 00:30:30,410 và để loại bỏ tất cả các ý kiến ​​và dấu ngoặc nhọn. 680 00:30:30,410 --> 00:30:34,334 Đây là loại một tâm-thổi thực hiện thay thế. 681 00:30:34,334 --> 00:30:37,250 Được rồi, có lẽ không quan tâm-thổi, nhưng nó là loại hấp dẫn hơn, tất cả các bên phải, 682 00:30:37,250 --> 00:30:39,920 xem xét điều này rất nhiều ngắn gọn hơn. 683 00:30:39,920 --> 00:30:43,120 Với chỉ bốn dòng mã, Đầu tiên tôi có kiểm tra sanity này. 684 00:30:43,120 --> 00:30:45,732 Nếu m là nhỏ hơn hoặc bằng bằng không, sigma làm cho không có ý nghĩa. 685 00:30:45,732 --> 00:30:48,190 Nó chỉ có nghĩa vụ phải được trong trường hợp này cho các số dương, 686 00:30:48,190 --> 00:30:50,340 vì vậy tôi chỉ cần đi để trở lại không tùy tiện 687 00:30:50,340 --> 00:30:53,210 để chúng tôi ít nhất có một số cái gọi là trường hợp cơ sở. 688 00:30:53,210 --> 00:30:54,430 >> Nhưng ở đây là vẻ đẹp. 689 00:30:54,430 --> 00:30:59,930 Toàn bộ ý tưởng này, thêm số từ 1 đến n, m hoặc trong trường hợp này, 690 00:30:59,930 --> 00:31:02,630 có thể được thực hiện bằng cách loại đi qua các buck. 691 00:31:02,630 --> 00:31:04,947 Vâng, số tiền từ 1 đến m là gì? 692 00:31:04,947 --> 00:31:05,780 Vâng, bạn biết gì không? 693 00:31:05,780 --> 00:31:11,949 Điều này tương tự như tổng của m cộng với số tiền từ 1 đến m trừ đi 1. 694 00:31:11,949 --> 00:31:12,740 Vâng, bạn biết gì không? 695 00:31:12,740 --> 00:31:13,940 Sigma của m trừ đi 1 là gì? 696 00:31:13,940 --> 00:31:17,860 Vâng, nếu bạn loại theo điều này một cách hợp lý, nó giống như m trừ đi 1 697 00:31:17,860 --> 00:31:21,415 cộng với sigma của m trừ đi 2. 698 00:31:21,415 --> 00:31:22,480 699 00:31:22,480 --> 00:31:26,012 Vì vậy, bạn có thể loại just-- này là như thế, nếu bạn chỉ 700 00:31:26,012 --> 00:31:28,220 cố gắng để làm phiền một người bạn và họ hỏi bạn một câu hỏi, 701 00:31:28,220 --> 00:31:31,344 bạn loại phản ứng với một câu hỏi, bạn có thể loại tiếp tục đi qua các buck. 702 00:31:31,344 --> 00:31:34,560 Nhưng điều quan trọng là nếu bạn tiếp tục làm cho các câu hỏi nhỏ hơn và nhỏ hơn 703 00:31:34,560 --> 00:31:36,910 và nhỏ hơn, bạn không yêu cầu sigma là những gì 704 00:31:36,910 --> 00:31:39,116 n, sigma của những gì n, sigma của n là gì? 705 00:31:39,116 --> 00:31:40,990 Bạn đang yêu cầu những gì sigma của n, sigma là những gì 706 00:31:40,990 --> 00:31:42,839 n trừ đi 1, sigma n trừ đi 2 là gì? 707 00:31:42,839 --> 00:31:44,880 Cuối cùng, câu hỏi của bạn sẽ trở thành những gì? 708 00:31:44,880 --> 00:31:50,250 Sigma của một hoặc là gì bằng không, một số giá trị rất nhỏ, 709 00:31:50,250 --> 00:31:52,220 và ngay sau khi bạn nhận được rằng, bạn của bạn, 710 00:31:52,220 --> 00:31:54,350 bạn sẽ không hỏi cùng một câu hỏi một lần nữa, 711 00:31:54,350 --> 00:31:55,975 bạn chỉ cần đi để nói, oh nó không. 712 00:31:55,975 --> 00:31:58,490 Chúng tôi thực hiện xong việc này ngu ngốc trò chơi mang tính chu kỳ. 713 00:31:58,490 --> 00:32:02,950 >> Vì vậy, đệ quy là hành động trong lập trình một chức năng gọi điện thoại riêng của mình. 714 00:32:02,950 --> 00:32:06,630 Chương trình này, khi biên dịch và chạy, là sẽ hành xử một cách chính xác theo cùng một cách, 715 00:32:06,630 --> 00:32:09,620 nhưng những gì quan trọng là bên trong của một hàm gọi là sigma, 716 00:32:09,620 --> 00:32:13,150 có một dòng mã trong đó chúng tôi đang kêu gọi chúng ta, 717 00:32:13,150 --> 00:32:14,980 mà thông thường sẽ là xấu. 718 00:32:14,980 --> 00:32:21,160 Ví dụ, nếu tôi đầu tiên biên soạn này, do đó hãy sigma-- 719 00:32:21,160 --> 00:32:22,710 làm cho sigma 1 ./sigma-1. 720 00:32:22,710 --> 00:32:25,050 721 00:32:25,050 --> 00:32:27,690 Số nguyên dương, xin vui lòng, 50 năm 1275. 722 00:32:27,690 --> 00:32:30,810 Vì vậy, những gì các chức năng dường như được, dựa trên một thử nghiệm, chính xác. 723 00:32:30,810 --> 00:32:34,917 Nhưng nếu tôi có được một chút nguy hiểm và xóa cái gọi là trường hợp cơ sở, 724 00:32:34,917 --> 00:32:37,750 và chỉ cần nói, tôi cũng chỉ cần làm này phức tạp hơn nó được. 725 00:32:37,750 --> 00:32:42,450 Hãy chỉ tính sigma bằng cách lấy m và sau đó thêm 726 00:32:42,450 --> 00:32:44,564 trong sigma của m trừ một? 727 00:32:44,564 --> 00:32:45,980 Vâng, những gì sẽ xảy ra đây? 728 00:32:45,980 --> 00:32:47,140 Hãy thu nhỏ. 729 00:32:47,140 --> 00:32:52,920 Chúng ta hãy biên dịch lại chương trình, lưu nó, biên dịch chương trình, 730 00:32:52,920 --> 00:33:00,450 và sau đó sẵn sàng ./sigma-1 phóng to, nhập số nguyên dương xin vui lòng, 50. 731 00:33:00,450 --> 00:33:02,180 732 00:33:02,180 --> 00:33:04,430 Có bao nhiêu bạn sẵn sàng để fess lên để nhìn thấy điều đó không? 733 00:33:04,430 --> 00:33:04,950 >> OK. 734 00:33:04,950 --> 00:33:06,690 Vì vậy, đây có thể xảy ra một số lý do, 735 00:33:06,690 --> 00:33:09,148 và thẳng thắn trong tuần này chúng tôi về cung cấp cho bạn nhiều trong số họ. 736 00:33:09,148 --> 00:33:11,780 Nhưng trong trường hợp này, hãy thử với lý do ngược 737 00:33:11,780 --> 00:33:14,430 những gì có thể đã xảy ra ở đây? 738 00:33:14,430 --> 00:33:17,400 Lỗi phân khúc, chúng tôi đã nói cuối cùng thời gian, đề cập đến một phân đoạn của bộ nhớ. 739 00:33:17,400 --> 00:33:18,690 Một cái gì đó không hay xảy ra. 740 00:33:18,690 --> 00:33:21,550 Nhưng đó là gì máy móc đó đã bị thất bại 741 00:33:21,550 --> 00:33:25,000 ở đây vì loại bỏ tôi đó được gọi là trường hợp cơ sở, 742 00:33:25,000 --> 00:33:26,870 nơi tôi trở về một giá trị mã hóa cứng? 743 00:33:26,870 --> 00:33:28,970 744 00:33:28,970 --> 00:33:30,460 Bạn nghĩ gì đã xảy ra? 745 00:33:30,460 --> 00:33:31,219 Yeah. 746 00:33:31,219 --> 00:33:32,135 >> TƯỢNG: [không nghe được]. 747 00:33:32,135 --> 00:33:36,387 748 00:33:36,387 --> 00:33:36,970 SPEAKER 1: Ah. 749 00:33:36,970 --> 00:33:37,550 Câu hỏi. 750 00:33:37,550 --> 00:33:39,508 Vì vậy, kích thước của số mà tôi đã được tổng hợp 751 00:33:39,508 --> 00:33:41,920 đã quá lớn mà nó vượt quá kích thước của không gian bộ nhớ. 752 00:33:41,920 --> 00:33:44,640 Ý tưởng tốt, nhưng về cơ bản không sẽ gây ra một vụ tai nạn. 753 00:33:44,640 --> 00:33:48,230 Điều đó có thể gây ra tràn số nguyên, nơi các bit chỉ cần lật qua 754 00:33:48,230 --> 00:33:51,760 và sau đó chúng ta nhầm lẫn một thực sự lớn số cho giống như một số âm, 755 00:33:51,760 --> 00:33:53,260 nhưng chính nó sẽ không gây ra một vụ tai nạn. 756 00:33:53,260 --> 00:33:55,509 Bởi vì ở cuối của ngày một int vẫn là 32 bit. 757 00:33:55,509 --> 00:33:57,640 Bạn sẽ không vô tình ăn cắp một chút 33. 758 00:33:57,640 --> 00:33:58,431 Nhưng một ý nghĩ tốt. 759 00:33:58,431 --> 00:33:58,984 Yeah. 760 00:33:58,984 --> 00:33:59,900 >> TƯỢNG: [không nghe được]. 761 00:33:59,900 --> 00:34:00,551 762 00:34:00,551 --> 00:34:02,300 SPEAKER 1: Phương pháp không bao giờ ngừng chạy, 763 00:34:02,300 --> 00:34:06,658 và thực sự nó gọi chính nó một lần nữa và một lần nữa và một lần nữa và một lần nữa 764 00:34:06,658 --> 00:34:08,449 và một lần nữa, và không ai trong số những chức năng bao giờ 765 00:34:08,449 --> 00:34:13,310 hoàn thành vì dòng duy nhất của họ mã gọi themself một lần nữa và một lần nữa 766 00:34:13,310 --> 00:34:14,219 và một lần nữa. 767 00:34:14,219 --> 00:34:16,080 Và những gì thực sự xảy ra ở đây, và bây giờ chúng tôi 768 00:34:16,080 --> 00:34:18,100 có thể loại vẽ những bức tranh này. 769 00:34:18,100 --> 00:34:20,899 Hãy để tôi đi qua một hình ảnh chỉ trong một thời điểm. 770 00:34:20,899 --> 00:34:22,940 Đây là một hình ảnh, mà cuối cùng sẽ xác thịt ra 771 00:34:22,940 --> 00:34:26,336 chi tiết hơn về những gì đang xảy ra bên trong bộ nhớ máy tính của bạn. 772 00:34:26,336 --> 00:34:28,460 Và nó chỉ ra rằng trên dưới cùng của hình ảnh này 773 00:34:28,460 --> 00:34:29,709 là một cái gì đó gọi là chồng. 774 00:34:29,709 --> 00:34:31,920 Đây là một đoạn bộ nhớ, một đoạn của bộ nhớ RAM, 775 00:34:31,920 --> 00:34:33,920 đó là chỉ được sử dụng bất cứ lúc nào một chức năng được gọi. 776 00:34:33,920 --> 00:34:36,239 Bất cứ lúc nào, một lập trình viên, gọi một chức năng, 777 00:34:36,239 --> 00:34:38,860 hệ điều hành, như Mac OS, Windows, Linux, 778 00:34:38,860 --> 00:34:41,920 lấy một loạt các byte, có thể là một vài kilobyte, có thể vài MB 779 00:34:41,920 --> 00:34:44,590 bộ nhớ, bàn tay họ cho bạn, và sau đó cho phép 780 00:34:44,590 --> 00:34:47,650 bạn chạy chức năng của bạn bằng cách sử dụng bất cứ điều gì biến bạn cần. 781 00:34:47,650 --> 00:34:50,699 Và nếu bạn sau đó gọi khác chức năng và chức năng khác, 782 00:34:50,699 --> 00:34:53,590 bạn nhận được một phần của bộ nhớ và một phần của bộ nhớ. 783 00:34:53,590 --> 00:34:57,090 >> Và quả thực, nếu các khay màu xanh lá cây từ Annenberg đại diện cho bộ nhớ, 784 00:34:57,090 --> 00:34:59,870 đây là những gì sẽ xảy ra đầu tiên khi bạn gọi chức năng sigma. 785 00:34:59,870 --> 00:35:04,510 Nó giống như đặt một khay như thế này về những gì ban đầu một ngăn xếp rỗng. 786 00:35:04,510 --> 00:35:07,142 Nhưng sau đó nếu khay tự gọi mình, có thể nói, 787 00:35:07,142 --> 00:35:08,850 gọi điện thoại dụ khác sigma, đó là 788 00:35:08,850 --> 00:35:11,640 như yêu cầu hệ điều hành, ooh, cần một ít bộ nhớ hơn, 789 00:35:11,640 --> 00:35:12,520 cho tôi đó. 790 00:35:12,520 --> 00:35:14,840 Và sau đó nó được chất đống trên trên đầu trang. 791 00:35:14,840 --> 00:35:18,030 Nhưng mấu chốt ở đây là khay đầu tiên vẫn còn đó, 792 00:35:18,030 --> 00:35:20,620 bởi vì anh ta gọi khay thứ hai này. 793 00:35:20,620 --> 00:35:23,500 Bây giờ trong khi đó, sigma gọi sigma, đó là như yêu cầu bộ nhớ hơn. 794 00:35:23,500 --> 00:35:25,830 Được chất đống trên đây. 795 00:35:25,830 --> 00:35:29,350 sigma gọi sigma, đó là một khay đó được chất đống ở đây. 796 00:35:29,350 --> 00:35:32,942 Và nếu bạn tiếp tục làm điều này, cuối cùng, loại bản đồ hình ảnh này 797 00:35:32,942 --> 00:35:35,525 biểu đồ rằng, những gì đang xảy đến xảy ra với chồng khay? 798 00:35:35,525 --> 00:35:37,480 799 00:35:37,480 --> 00:35:41,160 Nó sẽ vượt quá số tiền bộ nhớ máy tính của bạn. 800 00:35:41,160 --> 00:35:45,790 Và ngay khi khay màu xanh lá cây này vượt quá đường ngang 801 00:35:45,790 --> 00:35:49,410 trên stack và trên đống từ, mà chúng tôi sẽ quay trở lại trong tương lai, 802 00:35:49,410 --> 00:35:50,410 đó là một điều xấu. 803 00:35:50,410 --> 00:35:52,810 Heap là một khác nhau phân đoạn của bộ nhớ, 804 00:35:52,810 --> 00:35:55,190 và nếu bạn để cho các khay cọc và đống trên, 805 00:35:55,190 --> 00:35:57,800 bạn sẽ vượt quá phân khúc của riêng bạn của bộ nhớ, 806 00:35:57,800 --> 00:36:00,420 và một chương trình thực sự sẽ sụp đổ. 807 00:36:00,420 --> 00:36:02,930 >> Bây giờ là một sang một bên, ý tưởng này đệ quy, do đó, 808 00:36:02,930 --> 00:36:06,500 có thể dẫn đến các vấn đề rõ ràng, nhưng nó không nhất thiết phải là một điều xấu. 809 00:36:06,500 --> 00:36:08,840 Bởi vì xem xét, sau khi tất cả, và có thể how-- 810 00:36:08,840 --> 00:36:11,700 này có một số nhận được sử dụng để --how thanh lịch hoặc cách đơn giản 811 00:36:11,700 --> 00:36:14,890 việc thực hiện của sigma là. 812 00:36:14,890 --> 00:36:17,440 Và chúng tôi sẽ không sử dụng đệ quy tất cả những gì nhiều trong CS50, 813 00:36:17,440 --> 00:36:20,780 nhưng trong CS51, và thực sự bất kỳ lớp học nơi bạn thao tác cấu trúc dữ liệu 814 00:36:20,780 --> 00:36:23,640 như cây, hoặc cây gia đình, có một số hệ thống phân cấp, 815 00:36:23,640 --> 00:36:26,000 đó là siêu, siêu hữu ích. 816 00:36:26,000 --> 00:36:29,750 Bây giờ, khi một sang một bên, để bạn như tham vọng các nhà khoa học máy tính 817 00:36:29,750 --> 00:36:33,180 đã quen thuộc với một số của Google đùa bên trong, nếu bạn đi đến Google 818 00:36:33,180 --> 00:36:36,345 và bạn tìm kiếm những gì là định nghĩa, nói rằng, đệ quy, nhập. 819 00:36:36,345 --> 00:36:40,208 820 00:36:40,208 --> 00:36:41,110 Uh-huh. 821 00:36:41,110 --> 00:36:42,670 Là một sang một bên, tôi kéo lên một vài. 822 00:36:42,670 --> 00:36:45,470 Điều này giống như 10 phút sự trì hoãn sáng nay. 823 00:36:45,470 --> 00:36:52,890 Nếu bạn cũng Google "lệch", thông báo bằng cách nghiêng đầu của bạn slightly-- 824 00:36:52,890 --> 00:36:55,120 và sau đó một điều này có lẽ tồi tệ nhất của tất cả các 825 00:36:55,120 --> 00:36:57,286 kể từ khi một người nào đó đã như ngày của họ thực hiện điều này 826 00:36:57,286 --> 00:36:59,880 một số năm ago-- nào. 827 00:36:59,880 --> 00:37:01,140 828 00:37:01,140 --> 00:37:04,540 Oh, wait-- đó là một lỗi. 829 00:37:04,540 --> 00:37:08,410 830 00:37:08,410 --> 00:37:11,410 >> Vì vậy, chạy trên một trong những các trang web lớn nhất thế giới 831 00:37:11,410 --> 00:37:13,510 là những ít trứng Phục sinh ngu ngốc. 832 00:37:13,510 --> 00:37:16,690 Họ có thể tiêu thụ một số không tầm thường của dòng mã 833 00:37:16,690 --> 00:37:19,280 chỉ để chúng tôi có thể có những điều thú vị nhỏ nhặt như thế. 834 00:37:19,280 --> 00:37:22,140 Nhưng ít nhất bây giờ bạn có một số những câu chuyện cười bên trong. 835 00:37:22,140 --> 00:37:28,330 >> Bây giờ chúng ta hãy có một cái nhìn tại một số các trắng nằm chúng tôi đã nói về muộn, 836 00:37:28,330 --> 00:37:30,707 và bắt đầu lột vỏ trở lại một số lớp kỹ thuật 837 00:37:30,707 --> 00:37:32,790 để bạn thực sự hiểu những gì đã xảy ra 838 00:37:32,790 --> 00:37:34,860 và bạn có thể hiểu một số các mối đe dọa, 839 00:37:34,860 --> 00:37:38,060 như Shellshock, mà bây giờ đã bắt đầu để trở thành 840 00:37:38,060 --> 00:37:41,110 vào vị trí hàng đầu của tất cả mọi người của sự chú ý, ít nhất là trong các phương tiện truyền thông. 841 00:37:41,110 --> 00:37:45,810 Vì vậy, đây là một chức năng rất đơn giản trả về không có gì, có hiệu lực. 842 00:37:45,810 --> 00:37:46,790 Tên của nó là trao đổi. 843 00:37:46,790 --> 00:37:50,880 Phải mất trong hai biến và nó trả về không có gì. 844 00:37:50,880 --> 00:37:52,260 Đưa vào a và b. 845 00:37:52,260 --> 00:37:53,337 Vì vậy, một cuộc biểu tình nhanh chóng. 846 00:37:53,337 --> 00:37:54,170 Chúng tôi mang những lên. 847 00:37:54,170 --> 00:37:56,100 Chúng tôi cũng có thể mất một ít phá vỡ ở đây chỉ một khoảnh khắc 848 00:37:56,100 --> 00:37:57,250 và có một chút gì đó để uống. 849 00:37:57,250 --> 00:38:00,120 Nếu một người nào đó sẽ không nhớ tham gia tôi lên đây để chỉ một khoảnh khắc. 850 00:38:00,120 --> 00:38:01,830 Làm thế nào về bạn trong màu áo nâu? 851 00:38:01,830 --> 00:38:02,335 Nào lên. 852 00:38:02,335 --> 00:38:04,060 853 00:38:04,060 --> 00:38:05,260 Chỉ cần một ngày hôm nay. 854 00:38:05,260 --> 00:38:06,251 Cảm ơn bạn, mặc dù. 855 00:38:06,251 --> 00:38:08,000 Được rồi, và chúng tôi có sắp tới những người ở đây? 856 00:38:08,000 --> 00:38:08,660 Tên của bạn là gì? 857 00:38:08,660 --> 00:38:09,360 >> SPEAKER 4: Laura. 858 00:38:09,360 --> 00:38:09,740 >> SPEAKER 1: Laura. 859 00:38:09,740 --> 00:38:10,370 Nào lên. 860 00:38:10,370 --> 00:38:11,460 861 00:38:11,460 --> 00:38:13,850 Vì vậy, Laura, thách thức rất đơn giản ngày hôm nay. 862 00:38:13,850 --> 00:38:14,704 863 00:38:14,704 --> 00:38:15,370 Rất vui được gặp yo. 864 00:38:15,370 --> 00:38:16,410 865 00:38:16,410 --> 00:38:16,910 Tất cả các quyền. 866 00:38:16,910 --> 00:38:21,179 Vì vậy, chúng tôi có một số sữa ở đây và chúng tôi có một số nước cam ở đây 867 00:38:21,179 --> 00:38:23,345 và vài cái cốc mà chúng ta vay mượn từ Annenberg ngày hôm nay. 868 00:38:23,345 --> 00:38:24,178 >> SPEAKER 4: vay. 869 00:38:24,178 --> 00:38:27,240 SPEAKER 1: Và sẽ đi trước và cung cấp cho bạn một nửa ly này. 870 00:38:27,240 --> 00:38:28,250 871 00:38:28,250 --> 00:38:28,800 Tất cả các quyền. 872 00:38:28,800 --> 00:38:30,750 Và chúng tôi sẽ cung cấp cho bạn một nửa một ly sữa. 873 00:38:30,750 --> 00:38:31,905 874 00:38:31,905 --> 00:38:35,890 Oh, và chỉ để bạn có thể nhớ những gì này là như thế nào, 875 00:38:35,890 --> 00:38:38,860 Tôi nhớ mang điều này và ngày hôm nay. 876 00:38:38,860 --> 00:38:42,030 877 00:38:42,030 --> 00:38:42,530 Được rồi. 878 00:38:42,530 --> 00:38:45,470 Nếu bạn không quan tâm, chúng ta hãy xem, chúng tôi có thể đặt chúng trên kính của riêng bạn 879 00:38:45,470 --> 00:38:46,560 nếu bạn muốn. 880 00:38:46,560 --> 00:38:48,710 Đây sẽ là thế giới từ đôi mắt của Laura. 881 00:38:48,710 --> 00:38:49,210 Tất cả các quyền. 882 00:38:49,210 --> 00:38:53,820 Vì vậy, mục tiêu của bạn, có hai ly chất lỏng ở đây, sữa và nước cam, 883 00:38:53,820 --> 00:38:58,370 được trao đổi hai nội dung để các nước cam đi vào cốc sữa 884 00:38:58,370 --> 00:39:00,710 và sữa đi vào cốc nước cam. 885 00:39:00,710 --> 00:39:02,359 >> SPEAKER 4: Tôi có được cốc khác? 886 00:39:02,359 --> 00:39:05,650 SPEAKER 1: Tôi rất vui vì bạn đã hỏi, mặc dù nó đã có cảnh quay tốt hơn nhiều 887 00:39:05,650 --> 00:39:06,710 nếu bạn đã không hỏi. 888 00:39:06,710 --> 00:39:10,620 Nhưng có, chúng tôi có thể cung cấp cho bạn một phần ba cốc đó là trống rỗng, tất nhiên. 889 00:39:10,620 --> 00:39:11,120 Tất cả các quyền. 890 00:39:11,120 --> 00:39:12,300 Vì vậy, trao đổi các nội dung đó. 891 00:39:12,300 --> 00:39:16,100 892 00:39:16,100 --> 00:39:17,050 Rất tốt đẹp. 893 00:39:17,050 --> 00:39:20,390 894 00:39:20,390 --> 00:39:21,305 Rất tốt. 895 00:39:21,305 --> 00:39:23,121 896 00:39:23,121 --> 00:39:24,745 Bạn đang làm điều này khá cẩn thận. 897 00:39:24,745 --> 00:39:26,970 898 00:39:26,970 --> 00:39:28,655 Và bước ba. 899 00:39:28,655 --> 00:39:30,390 900 00:39:30,390 --> 00:39:31,350 Tất cả các quyền. 901 00:39:31,350 --> 00:39:31,930 Tuyệt vời. 902 00:39:31,930 --> 00:39:33,930 Một tràng pháo tay sẽ là tốt cho Laura. 903 00:39:33,930 --> 00:39:36,500 904 00:39:36,500 --> 00:39:37,000 Tất cả các quyền. 905 00:39:37,000 --> 00:39:40,790 Chúng tôi có một món quà chia tay ít cho bạn, nhưng hãy để tôi có những. 906 00:39:40,790 --> 00:39:42,620 Cảm ơn bạn rất nhiều. 907 00:39:42,620 --> 00:39:46,170 Vì vậy, một ví dụ đơn giản, tuy nhiên, để chứng minh rằng nếu bạn làm 908 00:39:46,170 --> 00:39:48,300 muốn trao đổi các nội dung của hai container, 909 00:39:48,300 --> 00:39:52,360 hoặc hãy gọi cho họ biến, bạn cần một số lưu trữ tạm thời 910 00:39:52,360 --> 00:39:56,710 đến giai đoạn một trong các nội dung trong quá mà bạn thực sự có thể làm trao đổi. 911 00:39:56,710 --> 00:40:01,790 Vì vậy, trên thực tế, nguồn này đang lên ở đây trong C là đại diện chính xác điều đó. 912 00:40:01,790 --> 00:40:06,340 Nếu nước cam là một và sữa là b, và chúng tôi muốn trao đổi hai, 913 00:40:06,340 --> 00:40:08,990 bạn có thể thử một cái gì đó sáng tạo bằng cách đổ một trong những thành khác, 914 00:40:08,990 --> 00:40:11,031 nhưng mà có lẽ sẽ không kết thúc đặc biệt tốt. 915 00:40:11,031 --> 00:40:15,260 Và vì vậy chúng tôi sử dụng một cốc thứ ba, cuộc gọi nó tmp, T-M-P theo quy ước, 916 00:40:15,260 --> 00:40:19,370 và đưa các nội dung của OJ trong đó, sau đó trao đổi một ly, 917 00:40:19,370 --> 00:40:22,610 sau đó đặt OJ vào ly ban đầu, do đó 918 00:40:22,610 --> 00:40:25,320 đạt được, chính xác như Laura đã làm, trao đổi. 919 00:40:25,320 --> 00:40:26,850 >> Vì vậy, chúng ta hãy làm chính xác điều đó. 920 00:40:26,850 --> 00:40:30,110 Hãy để tôi đi trước và mở lên một ví dụ đó là 921 00:40:30,110 --> 00:40:32,720 thực sự gọi là "không có trao đổi, "bởi vì đây không phải là 922 00:40:32,720 --> 00:40:36,180 như chỉ đơn giản là thực hiện như bạn nghĩ. 923 00:40:36,180 --> 00:40:41,190 Vì vậy, trong chương trình này, nhận thấy rằng Tôi đang sử dụng stdio.h, người bạn cũ của chúng tôi. 924 00:40:41,190 --> 00:40:43,130 Tôi có nguyên mẫu để trao đổi trên đó, mà 925 00:40:43,130 --> 00:40:45,450 có nghĩa là thực hiện của nó có thể xuống dưới, 926 00:40:45,450 --> 00:40:48,050 và chúng ta hãy xem điều này chính chương trình sẽ làm cho tôi. 927 00:40:48,050 --> 00:40:52,020 Đầu tiên tôi tuyên bố int x được một, và int y được hai. 928 00:40:52,020 --> 00:40:54,930 Vì vậy, suy nghĩ của những người như OJ và sữa, tương ứng. 929 00:40:54,930 --> 00:40:57,100 Và sau đó tôi chỉ có một printf nói x là này 930 00:40:57,100 --> 00:41:00,120 và y là điều này, vì vậy tôi chỉ có thể trực quan xem những gì đang xảy ra. 931 00:41:00,120 --> 00:41:03,810 Sau đó, tôi đã tuyên bố printf mà tôi đang trao đổi hai, 932 00:41:03,810 --> 00:41:07,100 và sau đó tôi in ra một cho rằng họ đang trao đổi, 933 00:41:07,100 --> 00:41:09,300 và tôi in ra x và y một lần nữa. 934 00:41:09,300 --> 00:41:13,010 Vì vậy, ở đây là trong trao đổi chính xác những gì Laura đã làm, 935 00:41:13,010 --> 00:41:16,240 và chính xác những gì chúng ta đã thấy trên màn hình một chút thời gian trước đây. 936 00:41:16,240 --> 00:41:19,380 >> Vì vậy, chúng ta hãy đi trước và là vô cùng thất vọng. 937 00:41:19,380 --> 00:41:24,690 Làm cho không có trao đổi, và chạy không có trao đổi, phóng to ở trên đầu ra ở đây. 938 00:41:24,690 --> 00:41:28,320 Nhập x 1, y là 2, trao đổi trao đổi. 939 00:41:28,320 --> 00:41:32,700 x vẫn là 1, và y vẫn là 2. 940 00:41:32,700 --> 00:41:37,630 Vì vậy, mặc dù, thẳng thắn mà nói, điều này có vẻ chính xác như thế, mặc dù về mặt kỹ thuật, 941 00:41:37,630 --> 00:41:40,730 Laura những gì đã làm, dường như không làm việc. 942 00:41:40,730 --> 00:41:42,130 Vì vậy, tại sao vậy? 943 00:41:42,130 --> 00:41:46,630 Vâng, nó chỉ ra rằng khi chúng ta viết một chương trình như thế này 944 00:41:46,630 --> 00:41:51,590 mà có cả chính, nhấn mạnh ở đây, và sau đó chức năng khác, như trao đổi, 945 00:41:51,590 --> 00:41:54,230 nhấn mạnh ở đây, mà nó gọi, thế giới 946 00:41:54,230 --> 00:41:57,030 trông một chút gì đó giống như các khay một thời điểm trước đây. 947 00:41:57,030 --> 00:42:00,440 Khi chính đầu tiên được gọi là, đó là giống như yêu cầu hệ điều hành 948 00:42:00,440 --> 00:42:04,030 cho một chút bộ nhớ cho bất kỳ địa phương biến như x và y có chính, 949 00:42:04,030 --> 00:42:05,660 và họ kết thúc ngay tại đó. 950 00:42:05,660 --> 00:42:10,920 Nhưng nếu cuộc gọi chính trao đổi, và chính qua trao đổi hai tham số, a và b, 951 00:42:10,920 --> 00:42:16,410 nước cam và sữa, nó không giống như bàn giao các nước cam và sữa 952 00:42:16,410 --> 00:42:17,500 Laura. 953 00:42:17,500 --> 00:42:21,300 Những gì một máy tính không có gì, là nó đi bản sao của nước cam 954 00:42:21,300 --> 00:42:27,110 và bản sao của sữa Laura, để những gì cuối cùng bên trong khay này 955 00:42:27,110 --> 00:42:32,510 là một trong những giá trị và hai, hoặc OJ và sữa, nhưng bản sao, 956 00:42:32,510 --> 00:42:34,790 vì vậy ở thời điểm này trong câu chuyện, có 957 00:42:34,790 --> 00:42:36,930 là OJ và sữa trong mỗi khay. 958 00:42:36,930 --> 00:42:39,260 Có một và hai trong mỗi khay, 959 00:42:39,260 --> 00:42:41,720 và chức năng trao đổi được thực sự làm việc. 960 00:42:41,720 --> 00:42:46,090 Nó trao đổi chúng bên trong khay trên cùng thứ hai, 961 00:42:46,090 --> 00:42:48,147 trao đổi nhưng không có tác động. 962 00:42:48,147 --> 00:42:49,980 Và dựa trên chỉ số Nguyên tắc cơ bản chúng tôi đã 963 00:42:49,980 --> 00:42:52,970 nói trước đây, và thực sự chỉ là một vài phút trước, những gì 964 00:42:52,970 --> 00:42:58,770 có thể giải thích lý do tại sao thay đổi a và b bên trong trao đổi 965 00:42:58,770 --> 00:43:05,560 không ảnh hưởng đến x và y, mặc dù Tôi đi ngang qua x và y với chức năng trao đổi. 966 00:43:05,560 --> 00:43:08,750 Từ chính ở đây đó là những gì cách đơn giản có thể giải thích? 967 00:43:08,750 --> 00:43:11,250 968 00:43:11,250 --> 00:43:12,627 Tôi nghĩ rằng tôi nghe nói nó ở đây? 969 00:43:12,627 --> 00:43:13,335 TƯỢNG: Return. 970 00:43:13,335 --> 00:43:14,085 SPEAKER 1: Quay trở lại? 971 00:43:14,085 --> 00:43:14,590 Không trở lại. 972 00:43:14,590 --> 00:43:15,895 Chúng ta hãy đi với một người khác. 973 00:43:15,895 --> 00:43:16,395 Đó là những gì? 974 00:43:16,395 --> 00:43:17,080 >> TƯỢNG: [không nghe được]. 975 00:43:17,080 --> 00:43:20,000 >> SPEAKER 1: OK, vì vậy chúng tôi có thể return-- làm cho công việc trở lại trong những câu chuyện, 976 00:43:20,000 --> 00:43:21,914 nhưng có một lời giải thích đơn giản hơn. 977 00:43:21,914 --> 00:43:22,580 TƯỢNG: Phạm vi. 978 00:43:22,580 --> 00:43:23,288 SPEAKER 1: Phạm vi. 979 00:43:23,288 --> 00:43:24,300 Tôi sẽ đưa phạm vi. 980 00:43:24,300 --> 00:43:27,290 Vì vậy, phạm vi, nhớ nơi x và y của chúng tôi tuyên bố. 981 00:43:27,290 --> 00:43:30,840 Họ tuyên bố bên trong của chính quyền ở đây. 982 00:43:30,840 --> 00:43:33,200 a và b, trong khi đó, là tuyên bố một cách hiệu quả 983 00:43:33,200 --> 00:43:35,930 bên trong trao đổi, không hoàn toàn các dấu ngoặc nhọn nhưng vẫn 984 00:43:35,930 --> 00:43:37,690 trong khu vực chung của trao đổi. 985 00:43:37,690 --> 00:43:40,560 Và như vậy thực sự, a và b chỉ tồn tại trong khay này 986 00:43:40,560 --> 00:43:44,850 từ Annenberg, điều này đoạn thứ hai của mã. 987 00:43:44,850 --> 00:43:49,500 Vì vậy, chúng tôi đang thực sự thay đổi bản sao, nhưng đó không phải là tất cả những gì thực sự hữu ích. 988 00:43:49,500 --> 00:43:52,190 >> Vì vậy, chúng ta hãy nhìn vào này cấp thấp hơn một chút. 989 00:43:52,190 --> 00:43:55,430 Tôi sẽ quay trở lại mục Source, 990 00:43:55,430 --> 00:43:58,330 và tôi sẽ đầu tiên phóng to ở đây, và chỉ 991 00:43:58,330 --> 00:44:02,290 để xác nhận rằng tôi đang ở trong này cửa sổ thiết bị đầu cuối lớn hơn, 992 00:44:02,290 --> 00:44:04,430 chương trình vẫn còn hành xử như vậy. 993 00:44:04,430 --> 00:44:06,840 Giả sử bây giờ điều này không phải là cố ý. 994 00:44:06,840 --> 00:44:10,090 Rõ ràng là tôi muốn trao đổi để làm việc, do đó, nó cảm thấy như một lỗi. 995 00:44:10,090 --> 00:44:12,780 Bây giờ tôi có thể bắt đầu thêm một rất nhiều của printf để mã của tôi, 996 00:44:12,780 --> 00:44:16,010 in ra ở đây x, y trên ở đây, ở đây, b trên đây. 997 00:44:16,010 --> 00:44:18,220 Nhưng thẳng thắn mà nói, có lẽ đó là những gì bạn đã làm cho một vài tuần 998 00:44:18,220 --> 00:44:20,190 bây giờ, trong giờ làm việc và ở nhà khi làm việc 999 00:44:20,190 --> 00:44:22,150 trên psets cố gắng để tìm thấy một số lỗi. 1000 00:44:22,150 --> 00:44:25,560 Nhưng bạn sẽ thấy, nếu bạn chưa có, vấn đề thiết lập ba giới thiệu đến bạn 1001 00:44:25,560 --> 00:44:31,630 để một lệnh gọi là GDB, nơi GDB, gỡ rối GNU, 1002 00:44:31,630 --> 00:44:34,040 chính nó có một bó toàn bộ tính năng mà có thể thực sự 1003 00:44:34,040 --> 00:44:38,160 cho chúng tôi hiểu tình huống như thế này, nhưng compellingly hơn, 1004 00:44:38,160 --> 00:44:39,940 giải quyết vấn đề và tìm lỗi. 1005 00:44:39,940 --> 00:44:40,940 Vì vậy, tôi sẽ làm điều này. 1006 00:44:40,940 --> 00:44:44,770 Thay vì ./noswap, tôi thay sẽ chạy GDB ./noswap. 1007 00:44:44,770 --> 00:44:47,410 1008 00:44:47,410 --> 00:44:51,200 Nói cách khác, tôi sẽ chạy của tôi chương trình không trong Bash, người bạn mới của chúng tôi 1009 00:44:51,200 --> 00:44:51,850 ngày hôm nay. 1010 00:44:51,850 --> 00:44:53,970 Tôi sẽ chạy của tôi chương trình noswap bên trong 1011 00:44:53,970 --> 00:44:56,900 của chương trình này được gọi là khác GDB, mà là một chương trình gỡ rối, mà 1012 00:44:56,900 --> 00:45:01,035 là một chương trình được thiết kế để giúp người bạn tìm và loại bỏ lỗi. 1013 00:45:01,035 --> 00:45:03,410 Vì vậy, nếu tôi nhấn Run ở đây, có một lượng tàn bạo của văn bản 1014 00:45:03,410 --> 00:45:04,868 mà bạn thực sự không bao giờ phải đọc. 1015 00:45:04,868 --> 00:45:07,290 Đó là bản chất là một mất tập trung từ cửa sổ, mà 1016 00:45:07,290 --> 00:45:10,030 Tôi sẽ nhấn Control-L để có được ở trên đó. 1017 00:45:10,030 --> 00:45:11,800 Đây là dấu nhắc GDB. 1018 00:45:11,800 --> 00:45:15,550 Nếu tôi muốn chạy chương trình này bây giờ, như cheat này ít tờ về ngày hôm nay 1019 00:45:15,550 --> 00:45:21,860 trượt cho thấy, Run là lần đầu tiên lệnh mà chúng tôi có nghĩa là để giới thiệu. 1020 00:45:21,860 --> 00:45:25,150 Và tôi chỉ cần đi gõ chạy lên đây bên trong GDB, 1021 00:45:25,150 --> 00:45:26,811 và thực sự nó chạy chương trình của tôi. 1022 00:45:26,811 --> 00:45:29,310 Bây giờ có một số bổ sung kết quả đầu ra của màn hình như thế này, 1023 00:45:29,310 --> 00:45:31,910 nhưng đó là GDB chỉ là qua đường hậu môn và cho chúng tôi biết những gì đang xảy ra. 1024 00:45:31,910 --> 00:45:34,451 Bạn không thực sự phải lo lắng về những chi tiết này ngay bây giờ. 1025 00:45:34,451 --> 00:45:36,890 Nhưng những gì thực sự thú vị về GDB, nếu tôi làm điều này again-- 1026 00:45:36,890 --> 00:45:42,100 Control-L xóa screen-- cho tôi đi phía trước và gõ "phá vỡ chính", do đó, 1027 00:45:42,100 --> 00:45:45,743 khi tôi nhấn Enter, thiết lập những gì gọi là một điểm break ở noswap.c, 1028 00:45:45,743 --> 00:45:51,270 đường 16, đó là nơi mà GDB tìm ra chương trình của tôi thực sự 1029 00:45:51,270 --> 00:45:53,070 là, chức năng của tôi là thực sự. 1030 00:45:53,070 --> 00:45:55,070 Điều này chúng tôi sẽ bỏ qua cho bây giờ nhưng đó là địa chỉ 1031 00:45:55,070 --> 00:45:57,310 trong bộ nhớ đặc biệt của chức năng này. 1032 00:45:57,310 --> 00:46:00,240 Vì vậy, bây giờ khi tôi gõ chạy, thông báo những gì mát mẻ ở đây. 1033 00:46:00,240 --> 00:46:05,650 Chương trình của tôi phá vỡ tại đường tôi nói với GDB tạm dừng thực hiện tại. 1034 00:46:05,650 --> 00:46:09,850 Vì vậy, tôi không phải bây giờ thay đổi mã của tôi, thêm một số của printf, biên dịch lại nó, chạy lại 1035 00:46:09,850 --> 00:46:13,300 nó, thay đổi, bổ sung một số của printf, lưu nó, biên dịch lại nó, chạy nó. 1036 00:46:13,300 --> 00:46:18,100 Tôi chỉ có thể đi bộ qua chương trình của tôi Từng bước từng bước với tốc độ con người, 1037 00:46:18,100 --> 00:46:20,880 không phải ở loại Intel bên trong tốc độ. 1038 00:46:20,880 --> 00:46:24,580 >> Vì vậy, bây giờ thấy dòng này xuất hiện ở đây, và nếu tôi quay trở lại 1039 00:46:24,580 --> 00:46:27,800 để chương trình của tôi trong gedit, nhận thấy rằng đó là thực sự 1040 00:46:27,800 --> 00:46:29,280 dòng đầu tiên của mã. 1041 00:46:29,280 --> 00:46:31,240 Có 16 dòng trong gedit. 1042 00:46:31,240 --> 00:46:34,610 Có 16 dòng trong GDB, và thậm chí mặc dù giao diện màu đen và trắng 1043 00:46:34,610 --> 00:46:37,760 là gần như không sử dụng thân thiện, điều này có nghĩa 1044 00:46:37,760 --> 00:46:41,680 dòng 16 đã không được thực hiện nêu ra, nhưng đó là về để được. 1045 00:46:41,680 --> 00:46:46,220 Vì vậy, thực sự nếu tôi gõ in x, không printf, chỉ cần in x, 1046 00:46:46,220 --> 00:46:50,730 Tôi nhận được một số giá trị không có thật có bằng không, vì x đã không được khởi tạo được nêu ra. 1047 00:46:50,730 --> 00:46:54,760 Vì vậy, tôi sẽ đánh tiếp theo, hoặc, nếu bạn muốn được ưa thích, chỉ cho n tiếp theo. 1048 00:46:54,760 --> 00:46:59,090 Nhưng khi tôi gõ tiếp theo nhập, bây giờ nhận thấy nó chuyển sang dòng 17. 1049 00:46:59,090 --> 00:47:02,840 Vì vậy, một cách logic, nếu tôi đã thực hiện dòng 16 và bây giờ tôi gõ in x, 1050 00:47:02,840 --> 00:47:03,640 những gì tôi nên xem? 1051 00:47:03,640 --> 00:47:04,970 1052 00:47:04,970 --> 00:47:05,520 Một. 1053 00:47:05,520 --> 00:47:07,820 >> Và bây giờ đây là phải thừa nhận là khó hiểu. 1054 00:47:07,820 --> 00:47:11,260 $ 2 chỉ là một cách ưa thích của, nếu bạn muốn tham khảo giá trị mà sau này, 1055 00:47:11,260 --> 00:47:12,510 bạn có thể nói "đồng đô la ký hai." 1056 00:47:12,510 --> 00:47:13,480 Nó giống như một tham chiếu trở lại. 1057 00:47:13,480 --> 00:47:14,570 Nhưng hiện nay, chỉ cần bỏ qua nó. 1058 00:47:14,570 --> 00:47:17,070 Điều thú vị là những gì trên bên phải của dấu bằng. 1059 00:47:17,070 --> 00:47:21,000 Và bây giờ nếu tôi gõ một lần nữa tiếp theo và in y, tôi sẽ thấy 2. 1060 00:47:21,000 --> 00:47:23,870 Tôi còn có thể in x một lần nữa, và thẳng thắn, 1061 00:47:23,870 --> 00:47:27,130 nếu tôi nhận được một chút nhầm lẫn như tôi đang ở đâu, tôi có thể loại danh sách cho danh sách 1062 00:47:27,130 --> 00:47:30,590 và chỉ cần nhìn thấy một số bối cảnh xung quanh điểm tôi đang thực sự. 1063 00:47:30,590 --> 00:47:35,180 Và bây giờ tôi có thể gõ tiếp theo, và có x là 1. 1064 00:47:35,180 --> 00:47:36,300 Bây giờ tôi gõ tiếp theo. 1065 00:47:36,300 --> 00:47:37,710 Oh, y là 2. 1066 00:47:37,710 --> 00:47:40,750 Và một lần nữa, nó là khó hiểu, vì đầu ra của GDB 1067 00:47:40,750 --> 00:47:43,044 được trộn lẫn với sản lượng của riêng tôi. 1068 00:47:43,044 --> 00:47:45,710 Nhưng nếu bạn giữ trong tâm trí, bởi liếc qua lại mã của bạn 1069 00:47:45,710 --> 00:47:47,740 hoặc đặt nó ra phía bên cạnh có lẽ, bạn sẽ 1070 00:47:47,740 --> 00:47:51,020 thấy rằng thực sự tôi chỉ đẩy mạnh thông qua chương trình của tôi. 1071 00:47:51,020 --> 00:47:54,620 >> Nhưng hãy chú ý những gì xảy ra tiếp theo, theo nghĩa đen. 1072 00:47:54,620 --> 00:47:56,380 Đây là dòng 22. 1073 00:47:56,380 --> 00:48:01,315 Hãy để tôi đi qua nó, do đó di chuyển vào đến 23, và nếu tôi in x bây giờ, vẫn là một. 1074 00:48:01,315 --> 00:48:03,890 Và nếu tôi in y bây giờ, vẫn là một. 1075 00:48:03,890 --> 00:48:05,820 Vì vậy, đây không phải là một bài tập hữu ích. 1076 00:48:05,820 --> 00:48:07,450 Vì vậy, hãy làm lại này. 1077 00:48:07,450 --> 00:48:10,069 Hãy để tôi quay trở lại với đầu và loại chạy một lần nữa. 1078 00:48:10,069 --> 00:48:12,110 Và nó nói chương trình đó là đang được gỡ rối 1079 00:48:12,110 --> 00:48:14,109 đã bắt đầu đã có, bắt đầu từ đầu. 1080 00:48:14,109 --> 00:48:15,420 Vâng, chúng ta hãy làm điều này một lần nữa. 1081 00:48:15,420 --> 00:48:22,000 Và lần này chúng ta hãy làm gì tiếp theo, tiếp theo, tiếp theo, tiếp theo, tiếp theo, 1082 00:48:22,000 --> 00:48:24,180 nhưng bây giờ mọi thứ trở nên thú vị. 1083 00:48:24,180 --> 00:48:27,760 Bây giờ tôi muốn bước vào trao đổi, vì vậy tôi không đánh tiếp theo. 1084 00:48:27,760 --> 00:48:34,380 Tôi gõ bước, và bây giờ thấy nó đã tăng tôi để dòng noswap.c 33. 1085 00:48:34,380 --> 00:48:37,240 Nếu tôi trở lại gedit, dòng 33 là gì? 1086 00:48:37,240 --> 00:48:40,500 Đó là thực tế đầu tiên dòng mã bên trong trao đổi. 1087 00:48:40,500 --> 00:48:44,150 Đó là tốt đẹp, bởi vì bây giờ tôi có thể loại poke xung quanh và nhận được tò mò 1088 00:48:44,150 --> 00:48:46,052 như những gì đang xảy ra thực sự ở đó. 1089 00:48:46,052 --> 00:48:46,760 Hãy để tôi in tmp. 1090 00:48:46,760 --> 00:48:47,770 1091 00:48:47,770 --> 00:48:48,800 Whoa. 1092 00:48:48,800 --> 00:48:51,438 Tại sao có một số tmp điên, giá trị rác không có thật? 1093 00:48:51,438 --> 00:48:54,579 1094 00:48:54,579 --> 00:48:56,120 TƯỢNG: Nó đã không được khởi tạo. 1095 00:48:56,120 --> 00:48:57,150 SPEAKER 1: Nó đã không được khởi tạo. 1096 00:48:57,150 --> 00:49:00,270 Và quả thực, khi bạn chạy một chương trình, bạn đang đưa ra một bó toàn bộ bộ nhớ 1097 00:49:00,270 --> 00:49:03,392 bởi hệ điều hành, nhưng bạn đã không được khởi tạo bất kỳ giá trị, 1098 00:49:03,392 --> 00:49:05,600 vì vậy bất cứ bit bạn nhìn thấy ở đây, mặc dù nó 1099 00:49:05,600 --> 00:49:07,770 tiêu cực lớn này điên số lượng, chỉ có nghĩa là 1100 00:49:07,770 --> 00:49:10,750 mà đó là những tàn dư từ một số sử dụng trước đó của RAM, 1101 00:49:10,750 --> 00:49:13,050 mặc dù tôi có không bản thân mình cần nó được nêu ra. 1102 00:49:13,050 --> 00:49:17,086 Vì vậy, bây giờ tôi sẽ đi trước và loại tiếp theo, và nếu tôi bây giờ gõ in tmp, 1103 00:49:17,086 --> 00:49:17,835 những gì tôi nên xem? 1104 00:49:17,835 --> 00:49:19,570 1105 00:49:19,570 --> 00:49:23,360 Dù giá trị của một là, một là tham số đầu tiên, chỉ cần 1106 00:49:23,360 --> 00:49:25,550 x như là người đầu tiên điều được thông qua tại, 1107 00:49:25,550 --> 00:49:30,450 do đó, một và x nên giống nhau, tmp để in nên in cho tôi một. 1108 00:49:30,450 --> 00:49:36,360 >> Vì vậy, những gì bạn sẽ thấy trong vấn đề thiết lập ba là một hướng dẫn của các loại trên GDB, 1109 00:49:36,360 --> 00:49:40,020 nhưng nhận ra rằng đây là sự khởi đầu của một cái nhìn tại một công cụ mà sẽ thực sự 1110 00:49:40,020 --> 00:49:42,774 giúp bạn giải quyết vấn đề rất nhiều hiệu quả hơn. 1111 00:49:42,774 --> 00:49:44,690 Điều chúng tôi cuối cùng sẽ làm gì vào ngày thứ Tư 1112 00:49:44,690 --> 00:49:48,180 được bắt đầu gọt vỏ lại một vài lớp và loại bỏ một số bánh xe đào tạo. 1113 00:49:48,180 --> 00:49:50,496 Đó là chuỗi điều được gọi là chúng tôi đã sử dụng một thời gian, 1114 00:49:50,496 --> 00:49:53,370 chúng ta sẽ dần dần đi mà đi từ bạn và bắt đầu nói về 1115 00:49:53,370 --> 00:49:55,725 một cái gì đó nhiều hơn esoterically được gọi là char *, 1116 00:49:55,725 --> 00:49:59,550 nhưng chúng ta sẽ làm tốt đẹp và nhẹ nhàng lúc đầu, mặc dù con trỏ, 1117 00:49:59,550 --> 00:50:02,730 như chúng được gọi, có thể làm một số những điều rất xấu nếu bị lạm dụng, 1118 00:50:02,730 --> 00:50:06,040 bằng cách nhìn vào một chút từ Claymation bạn của chúng tôi Nick Parlante Stanford 1119 00:50:06,040 --> 00:50:09,670 Đại học, một giáo sư trong máy tính khoa học người để cùng nhau xem thử 1120 00:50:09,670 --> 00:50:11,075 của những gì sẽ đến thứ Tư này. 1121 00:50:11,075 --> 00:50:12,196 1122 00:50:12,196 --> 00:50:13,400 >> [VIDEO xem lại] 1123 00:50:13,400 --> 00:50:13,900 Này, Binky. 1124 00:50:13,900 --> 00:50:14,930 1125 00:50:14,930 --> 00:50:15,780 Thức dậy. 1126 00:50:15,780 --> 00:50:17,240 Đó là thời gian cho con trỏ thú vị. 1127 00:50:17,240 --> 00:50:18,260 1128 00:50:18,260 --> 00:50:19,350 >> Cái gì vậy? 1129 00:50:19,350 --> 00:50:21,150 Tìm hiểu về con trỏ? 1130 00:50:21,150 --> 00:50:22,050 Oh, hay qúa! 1131 00:50:22,050 --> 00:50:22,897 1132 00:50:22,897 --> 00:50:23,730 [END IMG xem lại] 1133 00:50:23,730 --> 00:50:25,396 SPEAKER 1: Điều đó đang chờ bạn vào ngày thứ Tư. 1134 00:50:25,396 --> 00:50:26,440 Chúng ta sẽ thấy bạn sau đó. 1135 00:50:26,440 --> 00:50:27,106 [VIDEO xem lại] 1136 00:50:27,106 --> 00:50:30,420 -Và Bây giờ, sâu suy nghĩ, bởi Daven Farnham. 1137 00:50:30,420 --> 00:50:33,980 1138 00:50:33,980 --> 00:50:35,900 >> -Sao Chúng ta học C? 1139 00:50:35,900 --> 00:50:36,785 Tại sao không A +? 1140 00:50:36,785 --> 00:50:38,550 1141 00:50:38,550 --> 00:50:40,910 >> [Cười] 1142 00:50:40,910 --> 00:50:42,160 >> [END IMG xem lại]