>> [음악 연주]
>> SPEAKER 1 : 좋아,이 CS50입니다, 이것은 주 넷의 시작이고,
당신이 들어있을 수 있습니다 또는 읽기, 세계는 종료되었습니다.
인터넷의 주위에 모든 것 된 지식과 인식을 가지고
프로그램의 버그 배쉬라는 프로그래밍 언어입니다.
이 멋지고 브랜드되었습니다 Shellshock, 또는 배쉬 문으로,
그러나이 같은 기사 드문되지 않았습니다.
그리고 사실, 그들 중 많은 사람들이 가지고 Heartbleed의 다시 추억,
당신은에서 눈치 챘을 수있는 , 지난 봄에 다시 누르는
마찬가지로 상당히 극적이었다.
지금 당신의 사람들의 여기 오늘날 얼마나 많은 당신,이
당신이 이해하지 않는 경우에도 어떤 그것은 Shellshock 들어, 전부 야?
좋아, 당신의 얼마나 많은 취약한 컴퓨터가?
OK, 훨씬, 훨씬 더 손이 있어야한다 지금까지 이유로 우리는 보게 될 것이다.
>> 의는 무엇이 있는지 살펴 보자 언론에서 계속되고
후 조금 설명 여기 우리를 위해 기술적.
>> 스피커 2 : 보안 전문가가 경고 심각한 결함이 있었던 그
수백 영향을 약 될 세계 웹 사용자의 수백만.
그래서 정확히되었습니다 버그는 무엇인가 Shellshock 더빙, 그것은 무엇을합니까?
음, Shellshock 또한으로 알려져 있습니다 배쉬 버그, 그것을 악용하는 소프트웨어입니다.
해커는 취약한 스캔하고 바이러스를 사용 리눅스와 유닉스를 실행하는 시스템
시스템을 운영 한 다음 감염.
배쉬는 명령 줄 셸입니다.
이것은 사용자의 문제가 시작 명령을 할 수 있습니다 소프트웨어 내에서 프로그램 및 기능
텍스트를 입력하여.
그것은 일반적으로 프로그래머가 사용하고 있어요 더 넓은 세계에 개방하지 말아야
Shellshock가 변경하지만.
>> 음, worringly, 일부 분석가 그것은 더 큰 위협이 될 수 있습니다 경고,
Shellshock 완료 할 수 있기 때문에 감염된 시스템의 제어,
Heartbleed 반면에만 허용 해커는 컴퓨터에 스파이합니다.
그것은, 그래서 심각한 10에서 10를 평가 한
국가 별 심각도 취약점 데이터베이스.
모든 웹 서버의 2/3에있다 일부 Mac 컴퓨터를 포함하여 위험.
글쎄, 당신 확인 지금 시스템을 패치.
웹 사이트 실행을 호스팅하는 사람 영향을받는 운영 체제
가능한 한 빨리 조치를 취해야합니다.
이 보일 것 감당할 수있는 사람 자신의 모니터링 및 웹 응용 프로그램에
방화벽은 공격 피려.
스피커 3 : 최악의 일이 일어날 수 즉
누군가가 코드를 작성하는 것이 그 자동으로 이동 및 스캔 것
인터넷과 영향을주는 이러한 모든 컴퓨터.
그리고 그들은 물론, 그렇게되면, 그들이 할 수있는 최악의 일
그냥 모든 것을 삭제하고, 아래 사이트를 종료합니다.
그래서 우리는 피해를 볼 수 이러한 관점에서,
우리는 악의적 인 사람들이있을 것입니다 곳 누가 막 파괴를 야기하는 결정
시스템을 작동 중단 또는 삭제하여 같은 파일 등의 여러가지 작업을하고 있습니다.
스피커 2 : 일부는이 하나라고 가장 어려운의 측정
년의 버그, 그리고 주 지거나 할 수 있습니다
개월은 궁극적 인 영향을 확인합니다.
>> SPEAKER 1 : 그래서 그 모든 사실이다 하지만 재미있는 것은 거의 모든입니다
이미지 당신은 방금 본, 아마 키보드를 제외
함께 할 수 없다 어떠한 버그.
서버 및 전선 등, 그것은 종류의 접선 방향과 관련이 있어요,
하지만 핵심 꽤 사실이다 잘 여기에 무슨 일이 일어나고 있는지.
사실, 나에게로 가자 우리 CS50 장비.
내가 가서 극대화하자 여기에 터미널 창.
그리고 너희들이 사용하고있다 나는 그 버전을 포함
프로그램을 작성하기 위해 gedit에서의, 등 명령을 입력하고,
이 사실이며, 보유 주, 강타, B-A-S-H에 있었다.
이것은이다 본쉘 다시 쉘 하는 말을 그냥 멋진 방법입니다,
이있는 프로그램입니다 효과적으로, 신속 깜박
즉, 대기가 앉아 당신을 위해 입력.
그리고 그것은 명령이다 줄 인터페이스를 통해 어떤
너희들이 명령을 실행하고 있으며 궁극적으로 컴파일하고 실행
프로그램.
>> 그러나 강타는 또한 프로그램입니다 다음과 같은 의미의 언어입니다.
당신은 같은 명령이 있다는 것을 알고 CD 및 LS 또한 연타 등,
하지만 당신은 자신의 명령을 정의 할 수 있습니다 배쉬 쉘을 구현하여.
이제 우리는 안 갈거야 훌륭한 세부 사항으로 이동
으로는 프로그래밍 언어를 배쉬 만합니다 알고, 예를 들면, 그 순간에,
라는 어떤 명령도 없다 "안녕하세요."
그래서 그것은에서 찾을 수있다 이러한 패키지 중 하나.
내 컴퓨터에 설치되어 있지 않은 것.
관리자에게 문의하십시오.
하지만이 원한다면 프로그램이 될 수 있습니다 배쉬 또는 내 프롬프트에서 "안녕하세요"라고,
사실 그건 구문을 사용할 수 있습니다 아주 C. 것처럼, 아주 동일 하
하지만 꽤 비슷합니다 기능, 몇 가지 세부 사항을 누락이기는하지만.
어떠한 일이 일어날 것 같다, 하지만 지금은 "안녕하세요"를 입력하면
당신은 실제로 쓸 수 있습니다 프로그램이 아닌 C에서가 아니라 자바,
하지 다른 프로그래밍 언어,하지만 배쉬 자체.
>> 이제 열쇠는 여기에 내가 쓴 것입니다 나는이 새로운 명령을주고 싶어 이름,
괄호는 아르 이 상징은 함수 인.
여담으로, 당신은 또한 재미를 수행 할 수 있습니다 그리고 사실, 심지어 맥 OS에 대한 것,
이 터미널이라는 프로그램입니다.
그것은 누구의에 내장되어 제공 이 방에 맥이 컴퓨터,
당신은 맥에서 비슷한 일을 할 수있다 OS는,하지만 당신은 그 이상 더 갈 수 있습니다.
그리고 이것은 약간의 접선 하지만 재미 가지입니다.
오늘 아침에 생각 나게했다, 이 작업을 통해 생각할 때,
작은 게임의 나는 재생하는 데 사용 CS50의 이전 TF들 중 하나
언제 그가 거리에서 도보 것있다 자신의 화면을 자신의 키보드 잠금 해제,
나는 명령을 실행할 것 이 항아리처럼 "인사."
이제 언제 그가 다시 와서 자신의 키보드 나 화면을 삭제 한 후
그는, 앉아 것 몇 가지 작업을 수행하려고,
그의 directory--의 내용을 나열
>> [AUDIO 재생]
>> - 안녕하세요.
안녕하세요.
>> 공정성에 따라서,, : SPEAKER 1 그것은 "안녕하세요."사실이 아니었다
그것은 일반적으로 무엇인가이었다 거저 더 가깝다
[AUDIO 재생]
-Beep.
SPEAKER 1 : 나는 would-- 떡 치는 그래서 자신의 컴퓨터는 것
그는 실제로 그에게 모든 시간을 맹세 자신의 키보드에 앉았다.
그리고 매우 빨리 그는 알아 냈 그의 화면 잠금이 해제 떠날 수 없습니다.
하지만이 정렬을 제안합니다 바보 같은 재미의 당신을
배쉬 같은 것을 함께 할 수 있습니다.
그러나 조금 더 심각한,보다 확실합니다.
그리고 사실,이 중 하나이다 가장 위험하고 오래 지속 버그
그건 정말 세계적으로 세계를 강타했다.
이 버그는 주변에있다 약 20 년 동안,
당신은 단지 강타 할 것이다 상대적 단순성에 의해 순간.
>> 그래서이 대표는 명령 당신 경우
말 그대로 지금, Mac을 소유 당신이 당신의 뚜껑이 열려있을 때,
당신은에 입력 시도 할 수 있습니다 터미널이라는 프로그램입니다.
터미널을 받고있다 응용 프로그램 Utilities--
한번, Windows 사용자는 필요가 없습니다 이 특정 threat-- 걱정
하지만 맥 당신의 사람들은 입력 할 수 있습니다 창에이 내가 여기서 할 것 같은,
당신은 입력 할 경우 이 프로그램에 해당
내가 지금 할 거처럼, 터미널이라고, 당신이 단어를 보면 "취약"
컴퓨터는 악용에 취약.
>> 지금은 실제로 무엇을 의미 하는가?
그리고이 인정 하듯이 있습니다 꽤 미친 구문,
하지만 이제 적어도 밖으로 그려 보자 흥미로운 몇 가지.
그래서 보이는 몇 가지 문법이있다 적어도 C에서, 조금 익숙해
더 일반적으로 프로그래밍.
좀 괄호를 참조 세미콜론, 중괄호, 등,
하지만이 밝혀 노란색 여기에 멍청한
기능은 본질적으로 그는 아무 작업도 수행하지 않습니다.
콜론 수단은 아무것도 할 수없고, 세미콜론은 아무것도하지 않고 중단을 의미합니다.
이러한 내부 그래서 중괄호, 사실
나는 평등을 가지고 왼쪽이에 서명
기본적으로 만드는 것입니다 명령 또는 변수
X라고하고, 할당 이 코드의 노란색 비트.
즉, "에코 같은 것을 할 수 있습니다 안녕하세요 "또는"말을 삐 "또는 뭔가
그 가깝다.
그러나 당신의 눈 경우주의 우측으로 더 방황
이상이 라인에 더있어 그 세미콜론 그냥 끝입니다.
다음 "취약 에코"와 그 이상 더있다.
또 다른 세미콜론, bash는 -c :.
>> 그래서 긴 이야기를 짧은 이 코드 줄은
경쟁력 충분 이야 컴퓨터
무언가를하기에 취약 여러분이 원하는 것을,
배시있다에 버그가 있기 때문에 강타는 정지되어 있었다하더라도
명령 권한의 읽기 라인 거기에 노란색 텍스트 후,
20 플러스 세 버그, 강타는 실제로 읽고있다
그 세미콜론을 넘어 꽤 많은이에게 무슨 일.
>> 그래서 의미는 무엇입니까 의 궁극적?
난 그냥 "안녕하세요 에코"고 말했다 또는 "취약 에코"
그러나 당신이 뭔가를 한 경우 실제로 악성, RM은 -rf의 *와 같은,
하는 당신은 그렇지 않습니다 그 어느 때 입력 한
솔직히 당신이 아마 너무 빨리해야한다,
당신은 할 수 있기 때문에 그것으로 손상을 많이합니다.
왜?
RM은 물론 무엇을합니까?
제거합니다.
* 무엇을 의미?
모든.
그래서 소위이야 와일드 카드, 그 의미하므로
모든 것을 삭제 현재 디렉토리.
-r 재귀 의미하는 일이, 당신이 삭제하는지 경우에 어떤 의미
디렉토리이며,이 내부 다른 파일 및 다른 디렉토리이며
재귀가에 뛰어 그 모두 삭제.
그리고 -f은 그들 모두의 최악이다.
누구나 -f 여기에 무슨 뜻인지 알아?
포스.
그래서 심지어 수단 강제 이 나쁜 생각하면,
나에게 메시지를 표시하지 않고 그것을 할 추가 확인을 위해.
그래서, 당신도 알다시피, 우리는 웃음 이 있지만, 솔직히 아마
이 여러 번 입력 일, 현실 때문에
그것이 가장 빠른 방법입니다 물건의 모두를 삭제합니다.
그러나 심지어 나는 약간의 손상을 했어요.
>> 하지만 당신은 컴퓨터를 속이는 것 인 경우 바보 같은 변수를 정의로
또는 기능은 X라고하지만 실행에 컴퓨터를 속여
그 경계를 넘어 기능, 즉 세미콜론을 넘어,
당신은 참으로 컴퓨터를 속일 수 RM은 같은 것을 실행에 -rf
또는 이메일 명령 또는 복사 명령.
무엇이든은 말 그대로 당신이 함께 할 수있는 컴퓨터가 파일을 삭제하든,
파일을 만드는 사람을 스팸, 원격으로 일부 서버를 공격,
당신은 그것을 표현할 수있는 경우 명령을하면
그 일에 컴퓨터를 속일 수 있습니다.
>> 지금의 예 무엇 당신이 어떻게 할 수 있는가?
음, 많은 컴퓨터가있다 인터넷 실행 배쉬합니다.
우리 Mac 사용자 모두가 그들 사이에 있습니다.
리눅스 서버의 많은 중입니다 뿐만 아니라 그들, 그리고 유닉스 서버.
윈도우를 다시 가져옵니다 상대적으로 오프 후크
당신은 설치하지 않았다면 특별한 소프트웨어.
서버의 지금 많은에 대한 예를 실행하여 웹 서버,
사실 리눅스는 아마입니다 가장 인기있는 운영 체제
인터넷에있는 컴퓨터에서 실행합니다 즉, 웹 페이지를 제공하고 있습니다.
이제 우리는 나중에 살펴 보 겠지만 학기에
당신의 요청을 보내 당신의 browser-- 크롬,
인터넷 익스플로러, 던지 ... 원격 서버,
그것은 밝혀 그 경우에도 방금 입력 한 www.example.com,
브라우저가 메시지를 보내는 그건 좀 더 비밀이 같은입니다.
>> 그러나 이상한 뭔가를 조금 알 수 있습니다.
처음 두 행 나는 한 번도 본 적이
하지만 그들은 보이지 않는 특히 위협.
하지만 도난당한 한 것을 알 수 여기에 세 번째 라인.
나쁜 사람이 메시지를 송신한다면 자신의 컴퓨터에서이 같은
취약한 Mac 또는에 취약한 리눅스 서버,
재미있는 것은, 그 배쉬입니다 그 간단한 작은 명령 프롬프트
편재하고 자주 기본적으로 실행하는 데 사용
의 내용 는 수신 메시지입니다.
그리고 그 논리에 의해, 당신은 할 수 따라서, 웹 서버를 속여
같은 것을 보내 사용자 에이전트, 일반적으로하는
말을하도록되어 브라우저의 이름을 지정합니다.
사용자 에이전트 크롬, 사용자 에이전트 인터넷 탐색기 사용자 에이전트 파이어 폭스,이
당신의 브라우저입니다 그 자체를 식별하는 방법.
그러나 만약 나쁜 사람이 매우 똑똑 mm-mm, 난 말한다
당신을 말하지 않을 어떤 브라​​우저는,
내가 대신 당신이를 보낼거야 RM은 -rf와 함께 일을 암호 같은 예측
* 그것에서, 당신은 말 그대로 속임수 수 있습니다 인터넷에 취약한 웹 서버
정확히 그 실행에 이 모든 파일을 삭제하기위한.
그리고 솔직히, 그건 아니에요 그것은 심지어 최악.
당신은 모든 작업을 수행 할 수 있습니다.
당신은 시작할 수 분산 서비스 거부 공격
당신은이 메시지를 전송하는 경우 웹 서버의 전체 송이
한 다음 모두에 대해 내려했다 예, Harvard.edu 서버에서,
당신은 빅뱅의 정렬 할 수 있습니다 그들을 밖으로 지옥
이었다 네트워크 트래픽 그렇지 않으면이 나쁜 사람에 의해 트리거.
>> 그래서, 짧은 긴 이야기를 거의 Mac을 소유하고이 방에있는 모든 사람
이에 취약합니다.
실버 라이닝 당신이 아니라면 것입니다 노트북에 웹 서버를 실행,
당신은 실제로 구성하지 않았다면 그것은 그것으로 SSH 같은 것을 허용하는
당신은 실제로 안전 해요.
그것은 취약하지,하지만 거기에 하나의 노트북에려고,
그래서 당신은 종류의 안심하실 수 있습니다.
그러나 애플은 곧 것 이것에 대한 수정 사항을 업데이트합니다.
리눅스의 세계는 이미 출시했습니다 페도라와 우분투에 대한 수정 사항
다른 리눅스 버전, 그리고 실제로 어플라이언스에 업데이트 50을 실행하는 경우,
너무 것조차 업데이트 및 수정.
하지만 너무하지 정말, 취약
당신이하지 않았다면 때문에 어플라이언스와 함께 만지작 거렸다
공개적으로 노트북을 만든 아니다 인터넷에 접근
기본적으로, 당신은했습니다 실제로 때문에 미세하고
방화벽 및 기타 기술.
>> 하지만 버그의 극단적 인 예입니다 우리는 문자 그대로 20 살았던 것을
년, 누가 사람을 알고있는 경우 모든 시간은 그것에 대해 알고있다?
그리고 사실,이 중 하나이다 기본 과제
우리는 나중에 볼 수 있음 보안에 대한 학기,
즉, 단지 현실 세계에서와 같다 좋은 사람은 불리하다.
나쁜 놈들을 유지하기 위해, 우리는에있다 모든 문이 잠겨 있는지 확인
모든 창에 해당, 안전한지 집에 항목의 모든 지점
나쁜 놈들을 유지하는 것이 안전합니다.
그러나 무엇을 나쁜 사람으로이 실제로 당신의 가정을 손상 할
당신 훔치?
그 또는 그녀는 그냥 잠금 해제 일을 찾을 수있다 문, 하나의 깨진 창, 또는 뭔가
이러한 라인을 따라, 그리고 야 컴퓨터 보안에서 같은 일.
우리는 수백만을 작성할 수 있습니다 프로그래밍 코드의 라인
수백 또는 수천을 보내고 그것이 올바른려고 시간,
하지만 경우에 당신은 하나를 만들 정확성의 실수,
만약 전체 시스템을 넣을 수 있고, 실제로,이 경우, 전체 인터넷
위험의 세계.
>> 당신이 더 많은 것을 배우고 싶은 경우에 따라서 이것에 대해, 여기에이 URL로 이동합니다.
행동에 대한 필요가 없습니다 오늘 밤 당신이 아니라면
것과 더 편안 중에서 자신의 웹을 실행 한
서버, 어떤 당신이해야하는 경우, 사실, 소프트웨어를 업데이트합니다.
>> 그리고 이것은 너무의 제목입니다 음성, 지금은 종이,
우리는에 연결했는지 오늘 코스의 웹 사이트.
그것은 동료에 의해이었다 이름 켄 톰슨 (Ken Thompson), 사람
아주 유명한 수락했다 컴퓨터 과학에서 수상,
그는 몇 년이 연설을했다 전 기본적으로이 동일한 주제에.
질문은 사람을 요구, 당신이해야 정말
신뢰 궁극적 소프트웨어 당신이 주어 졌어?
예를 들어, 우리는 모두가 프로그램을 작성하고,
우리는 컴파일했습니다 연타로.
그리고 당신의 지식, 당신은 쓴 CS50에 대한 프로그램있다
종류의 뒷문은 방법이 나쁜 사람이 당신의 프로그램을 실행하는 경우,
컴퓨터 이상 걸릴 수 있습니다?
아마하지, 그렇지?
마리오와 욕심, 그리고 신용.
이들은 모두 아주 작은 프로그램입니다.
당신은 꽤 될 거라고 나쁜 실제로 경우
당신의 전체적인 컴퓨터가 공격에 취약했다 코드 (10) 또는 라인 (20)을 작성 후,
또는 몇몇의 적어도 모르고 보안 관련의.
지금은 그 우습게 말 그러나 우리는 오늘 보게 될
이번 주에는 실제로입니다 정말, 정말 쉬운
나쁜 심지어 만들려면 짧은 프로그램 취약.
>> 하지만 지금은 적어도 실현 질문은 여기에 요청을 받고 있음
컴파일러에 연타에 관한 것입니다.
왜 우리는 연타를 신뢰 한 지난 3 주 하시나요?
누가 누구든지 연타를 쓴 말을하다 거기에 "만약"조건이 없었다
그 본질적 일부 0을 주입 모든 프로그램에 것들은 그것을 컴파일
그 할 것이다 그 혹은 그녀의 액세스 컴퓨터 할 때 자고있어
와 노트북 덮개가 열려 있습니다 컴퓨터가 실행되고?
오른쪽?
우리는 명예 시스템 바로 이런 종류의가 지금 우리는 연타가 합법적임을 신뢰 곳.
어플라이언스가 합법적임을 믿습니다.
당신은 신뢰가 문자 그대로 모든 프로그램 Mac 또는 PC에 신뢰할 수 있습니다.
그리고이 간단한 버그에서 알 수 있듯이, 악의적 아니더라도,
그 절대적으로 아니다 케이스가 될 가능성.
>> 그래서 당신은 지옥으로 무서워해야한다.
솔직히, 간단한이 없습니다 이 다른 솔루션
사회적 인식의 일종 이상 복잡성 증가의
우리는 상단에 구축하고 있다는 우리의 컴퓨터 시스템,
어떻게 점점 더 취약 우리는 아주 잘 될 수 있습니다.
>> 지금 생각하면 브레이크 아웃 말했다와 함께.
그래서 브레이크 아웃입니다 문제는 세 가지를 설정하고, 브레이크 아웃은 작년부터 게임
당신이 기억 수도 있지만, 우리를 위해 문제에서, 셋을 설정
그것은 우리가 걸릴 수 있습니다 상황이 홈을 백업
우리가 프로그램을 작성할 때되도록 심지어이 같은 터미널 창에서,
우리는 사실, 궁극적으로 실행할 수 있습니다 그래픽 프로그램을하지
그와 달리 우리는 있었다 스크래치에 액세스.
그래서이 직원의입니다 브레이크 아웃의 구현,
이는 단지이 벽돌 깨는입니다 게임, 당신은 다시 노를 저어 이동하는 것이
앞뒤로, 당신은 공을 상단까지 그 색깔의 벽돌에 대한.
따라서이 우리를 가져오고있다 종류의 다시 곳
우리는 매우 신속하게 할 수 있었다 스크래치와, 지금은 C와,
우리 자신을 구현 그래픽 사용자 인터페이스.
>> 그러나 그 이상이 문제 세트는 제 나타내고
있는 우리가주는거야 당신이 코드의 무리입니다.
그리고 사실, 내가 명시 적으로 가져 이에 대한 관심, 특히 때문에
그 적은 편안한에 대한이 문제는, 적어도 첫번째 눈에 설정
같은 느낌 것입니다 우리는 한 단계 그것을 촬영했습니다.
, 우리는 당신을 준 때문에 검색은 일부
및 PSET에서 문제를 정렬 우리가 작성한 코드의 무리
및 주석의 몇 즉 "어떻게"라고
어디 빈칸을 채울 수 있습니다.
그래서 너무 무서운, 그러나 이것은 처음 인
우리는 당신이 코드를 전달하고 당신이 할 필요가 첫번째 읽고 이해 한 다음에 추가
과를 완료합니다.
>> 그리고 브레이크 아웃과 함께, 우리는 동일한 기능을 수행 할거야
당신에게 몇 통 이상의 라인을 제공 코드로, 솔직히, 당신을 줄이
프레임 워크의 로트 게임하지만 짧은 중지
의 벽돌을 구현 그리고 볼과 패들,
하지만 우리는 몇 가지 다른 기능을 구현 않습니다.
심지어 첫눈에 그, 다시 특히, 덜 편안하게하는 경우
특히 어려운 보일 수 및 당신은 너무 많은 새로운 기능이 있다고 생각
당신은 당신의 마음을 포장 할 필요가 주위에, 그것은 사실입니다.
그러나 그것의 마음에 계속 아주 스크래치 등을들 수있다.
확율은 모두 사용하지 않은 아르 스크래치에서 퍼즐 조각.
승률은 포장을 상관하지 않았다 아르 그들 모두 주위에 당신의 마음
그것은했다 모든 이었기 때문에 빠른 눈, 오, 이해하기
그게 내가 무엇을 할 수 그 퍼즐 조각.
그리고 실제로, 문제 설정 3 사양, 우리는 당신을하겠다
문서도 그 것이다 몇 가지 새로운 기능을 소개,
궁극적 프로그래밍 사용 구성한다.
, 루프 조건, 변수 및 함수를
동일 할 것 우리는 지금까지 본 적이있다.
>> 그래서 참으로, 우리는 무엇을 줄 것이다 당신은 몇 가지 샘플 코드입니다
당신은 창을 만들 수 있습니다 즉,이 달리하지 보인다
궁극적으로 바꿀 확실히 이런 식으로 뭔가.
그래서 CS50을 활용 , 근무 시간 등을 논의
그리고 그 사실에 만족할 수 당신이 작성해야하는 코드의 양
실제로 모든 그 정도입니다.
첫 번째 과제는 적응하는 것입니다 자신은 몇 가지 코드에 우리는 서면으로 작성했습니다.
>> pset3에 대한 질문, Shellshock 또는 달리?
>> 청중 : 그것은처럼 보였다 브레이크 아웃을 겪고
코드가 거의입니다 객체 지향 스타일
하지만 난 C가를 생각 객체 지향 프로그램입니다.
SPEAKER 1 : 훌륭한 질문입니다.
그래서 통해 찾고 분포 코드, 코드
우리는 pset3 쓴 익숙한위한이를
그것은을 것 같아 작은 객체 지향.
짧은 대답이된다.
그것은 당신이 방법의 근사치 사용하여 객체 지향 코드를 할 수 있습니다
C 언어와 같은, 그러나이다 여전히 궁극적 절차.
내부 메서드는 없습니다 변수는, 당신은 볼 수있다.
그러나 그 연상시킨다.
그리고 우리는 다시 그 기능을 볼 수 있습니다 우리는 PHP와 자바 스크립트에 도착하면
마지막 학기를 향해.
하지만 지금은 그것을 생각 무엇의 힌트가 올 수 있습니다.
좋은 질문입니다.
좋아.
그래서 일종의이었다 병합 어떻게 왼쪽 것을 마지막으로.
그리고 정렬 시원했다 병합 감각이 너무 빨리이었다,
적어도 피상적 인 검사에 기초 우리는 거품, 말,보다, 지난 주 한
정렬, 선택 정렬, 삽입 정렬.
그리고 무엇도 단정했다 그냥입니다 방법을 간결하고 명확하게
당신은 그것을 표현할 수 있습니다.
그리고 우리는 상부 무엇인지 말 했는가 병합의 실행 시간에 바인딩
정렬?
그래?
>> 청중 : N 로그 n?
>> SPEAKER 1 : N, 오른쪽 N 로그인합니다. n 여기서 n 로그인합니다.
그리고 우리는 그 무엇에 돌아올거야 정말 의미 또는 어디에서 오는지,
그러나 이것은 더 좋았다 어떤 실행 시간보다
우리는 버블 보았다 선택과 삽입 정렬?
그래서 N 제곱. N 제곱 이보다 더 큰
그것은 아주 명백하지 않더라도, 해당 로그 n은 n보다 작은 알고,
그래서 당신은 n 배를 할 경우 n보다 작은 것을,
그것은 N 제곱 이상이어야 것입니다.
그것은이 직관의 비트입니다.
그러나 우리는 이것에 대한 가격을 지불했다.
더 빨리,하지만 테마 시작하는 지난 주 등장이 상충했다.
나는 더 나은 성능을 가지고 시간을 현명하지만, 무엇을
나는 다른에 지출해야 않았다 손을 위해 그것을 달성하기 위해?
>> 청중 : 메모리.
SPEAKER 1 : 다시 말해?
청중 : 메모리.
SPEAKER 1 : 메모리, 또는 공간이 더 일반적.
그리고 슈퍼 아니었다 우리 인간과 분명,
그러나 우리의 자원 봉사자 리콜 앞으로 스테핑 및 스테핑했다
마치 다시 배열이있다 하지만 여기에, 그리고 거기에
여기에 두 번째 배열 그들은 사용할 수 있습니다 때문에 우리
필요한 곳​​은 그 사람을 병합합니다.
우리는 장소에 교환 할 수 없습니다.
그래서 정렬 활용을 병합 더 많은 공간이 어느
우리는 함께 필요하지 않았다 다른 알고리즘,
하지만 거꾸로는 훨씬 더 빠른 것입니다.
그리고 솔직히, 현실 세계의 공간에서 이러한였던 ​​시절에는 ... RAM, 하드 디스크 space--
상대적으로 저렴하고, 그래서이다 반드시 나쁜 일이.
>> 자, 잠깐 살펴 좀하자 더 질서, 우리가 무슨 짓을했는지에
왜 우리는 N 로그 n 있다고 말했다.
그래서 여기에 8 자리 숫자이며 팔 자원 봉사자 우리는 지난 시간에했다.
그리고 병합 먼저 정렬 할 우리에게 무엇 이었는가 말 했어요?
대상 : 둘의 분할.
SPEAKER 1 : 다시 말해?
대상 : 둘의 분할.
SPEAKER 1 : 두에 나누기, 맞아.
이것은 매우 연상 분열의 전화 번호부,
더 일반적으로 정복.
그래서 우리는 왼쪽 반 보았다.
그리고 우리는 일종의 말했다 한 번 요소의 왼쪽 절반
우리가 다음에 무슨 말을 했습니까?
왼쪽의 왼쪽 절반을 정렬 반, 이는 우리를 허용
두 분할 한 후, 사 및이에 초점을 맞 춥니 다.
>> 당신은 어떻게에, 지금 목록을 정렬 할 노란색, 정렬 병합하여 크기 둘의?
음 반으로 나누어, 왼쪽 절반을 정렬 할 수 있습니다.
그리고이 곳 일이었다 조금 바보 잠깐을 얻었다.
당신의입니다 목록을 정렬하는 방법 크기 하나, 여기에이 번호를 사처럼?
이 분류입니다.
당신이 완료됩니다.
>> 하지만 어떻게 당신의 목록을 정렬 할 크기는 두 번째이다 하나?
음,하지만 지금은 무엇을 같은 일이었다 세번째와 병합 정렬의 핵심 단계?
당신은 왼쪽을 병합했다 절반과 오른쪽 절반.
우리가 그런 짓을하면, 우리는 보았다 네, 우리는이를 바라 보았다.
우리는 모든 권리를 결정 분명 두 사람은 먼저
그래서 우리는 두 가지를 넣어 그 네 다음 장소.
그리고 지금 당신이 가지 되감기해야 이것은 특성의 일종이다
병합 같은 알고리즘의 정렬 메모리에 되감기.
이야기의 다음 줄은 무엇입니까?
나는 다음에 무엇에 집중해야 하는가?
왼쪽의 오른쪽 절반 6 및 8이다 반.
>> 그래서 나는 그냥이 단계별로하자 너무 많은 점을 삼기 않고.
6 및 8, 다음 여섯입니다 정렬 팔이 정렬됩니다.
그런 그들을 함께 병합 이제 다음 큰 단계
물론부터 오른쪽 절반을 정렬한다 이 알고리즘의 첫 단계.
그래서 우리는 1, 3, 일곱, 오에 초점을 맞 춥니 다.
우리는 그 다음 왼쪽 부분에 초점을 맞 춥니 다.
그 좌측 절반의 우측 절반 즉, 다음 1 ~ 3에 병합합니다.
그런 다음 오른쪽 절반은 다음 절반 왼쪽 그 다음, 그것의 오른쪽 절반.
단계가 남아있는 지금에 병합하고,?
큰 왼쪽 절반 큰 병합 오른쪽 절반, 그래서 하나가 내려갑니다
다음 다음 다음 다음 둘, 셋, 넷, 오, 다음 여섯, 다음 일곱, 여덟.
>> 그래서 지금 왜 궁극적으로 계시하고, 특히 n 및 대수 더
일반적으로 오히려 당신을 탈출 적어도 최근의 기억에서?
음,이 일의 높이를 알 수 있습니다.
우리는 팔 요소가 있고, 우리 2로, 2로, 2로 나눈 다.
그래서 기본 로그 팔의이 우리에게 세 가지를 제공합니다.
그리고 그 날 믿어 경우 그에 약간 헷갈리는.
하지만, 팔의이 세 가지입니다 기본 로그인 그래서 우리는 병합의 세 층을 완료했습니다.
그리고 우리는 합병 요소, 요소 수
우리는 이러한 각 행에보고 했습니까?
N의 총, 오른쪽?
맨 위 행을 병합 할 수 있기 때문에, 우리가 단편을했다하더라도,
우리는 궁극적으로 한 번씩 숫자를 만졌다.
그리고 두 번째 행, 행 크기 둘의 그 목록을 병합,
우리는 한 번 각 요소를 터치했다.
그리고 여기에 정말 분명 마지막 행에서,
우리는 그 각각을 터치했다 한 번, 한 번만 요소,
그래서 여기에 우리의 N 로그 N, 다음있다.
>> 그리고 지금은 그냥 일을 조금 만들려면 단지 잠시 동안 공식 더 당신이 경우
지금을 분석했다 높은 레벨에서의 정렬
얼마나 잘, 결정하려고 당신이 표현에 대해 갈 수도
이 알고리즘의 실행 시간 단지 그것을하지 봄으로써
인위적인 예를 사용하여?
글쎄, 얼마나 많은 시간을 당신은 말할 것 노란색이 걸릴 것 같은 단계,
N <이 돌아 오면?
즉, 어떤 큰 O입니까?
그래서, 한, 그래서 한 단계를보고 있어요 아마이 단계는 경우이기 때문에
다음 돌아가 겠지만, 이곳은 일정 시간, 오른쪽?
그래서 우리는 O (1), 그리고 그 말 나는이 표현됩니다 방법에 대해 설명합니다.
T, 그냥 시간을 실행합니다.
N은, 입력의 크기 그래서 T (N), 그냥 멋진 방법
실행을 말하는 크기 n의 시간이 주어진 입력
순서가 될 것입니다 일정 시간의, O (1).
>> 그러나, 그렇지 않으면,이에 대해 무엇을?
당신을 표현하는 방법 이 노란색 라인의 실행 시간?
어떤 T?
당신은 가지 여기에 속임수 수 주기적으로 내 질문에 대답.
그래서 실행 시간에 있다면 우리가 말하는 일반 T (N)입니다.
그리고 지금 당신이 가지 여기 펀트하고 있고 , 음, 그냥 왼쪽 절반을 정렬, 말
다음 오른쪽 절반을 정렬 할 수 있습니다.
우리는 상징적으로 표현하는 방법 이 노란색 라인의 실행 시간은?
어떤 T?
입력의 크기는 무엇입니까?
이 이상 없음.
왜 난 그런 말을하지?
그리고 다음이 또 다른 T입니다 (N / 2) 다음 다시, 나는 두 개의 정렬 반쪽을 병합하는 경우,
얼마나 많은 요소 내가가는 총 터치해야 하는가?
명.
그래서 나는이 표현할 수 그냥 가지 멋진 될
일반적인 실행 시간 등.
T (n)은, T (N / 2)의 단지 실행 시간 플러스 T (N / 2)의 절반과 오른쪽 절반 좌측
플러스 아마 N 단계입니다 O (N), 하지만 어쩌면, 나는 두 손가락을 사용하고있는 경우,
그것은 많은 두 배입니다 단계하지만 선형이다.
그것은 단계 몇개 야 즉, N의 팩터이다
그래서 우리는이 같은이 표현 할 수 있습니다.
그리고 이것은 우리가에 펀트 볼 수있는 곳 지금 다시 우리의 고등학교 수학 교과서
우리는 궁극적으로 재발하는 것이 야 끝은이 동등 해, n 번 여기서 n 로그인
실제로 아웃 할 경우 수학 형식적.
>> 그래서 두 관점을합니다.
함께 한 수치 대표적인 예를 하드 코딩
8 자리 숫자, 그리고 이상을 사용 우리가 거​​기에 도착하는 방법의 일반적인 모습입니다.
그러나 여기서 정말 흥미로운 다시, 자전거의이 개념이다.
나는 루프를 사용하지 않는거야.
나는 가지 정의하고있어 자체의 측면에서 뭔가
뿐만 아니라이와 수학 함수,
뿐만 아니라, 이러한 의사 코드의 관점에서.
이 의사 코드는 재귀 그 라인의 두에
본질적으로 말하고있다하면 이동합니다 작은 해결하기 위해 자체를 사용
작은 크기의 문제, 다시 다시
다시 때까지 우리의 큰칼을 소위 기본 케이스에 이르기까지.
>> 그래서 실제로 더 설득력을 그려 보자 테이크 아웃이에서 다음과 같이.
날의 gedit로 가서 보자 오늘의 소스 코드의 일부를 보면,
이 예 여기에 특히.
분명히 추가 시그마 공, 숫자 N을 통해 한.
그래서 무슨 일이 익숙한 보자 여기에 익숙하지.
처음에 우리는 몇 가지있다 포함, 그래서 아무것도 새로운있다.
프로토 타입입니다.
나는에 약간 헷갈리는 해요 이 몇 일 후,
그러나 우리는 무엇을 말 했는가 함수의 프로토 타입은?
청중 : [들리지].
SPEAKER 1 : 무엇입니까?
청중 : 우리는 그것을 발표합니다.
SPEAKER 1 : 우리는 그것을 발표합니다.
그래서 당신은, 헤이, 연타를 가르치는 실제로 아직이를 구현하지,
하지만 어딘가에이 파일에, 아마도, 함수가 무엇을 호출 할 것입니다?
시그마.
그리고 이것은 단지 약속입니다 그것은 다음과 같을 것.
이 같은 정수를 취할 것 input--와 좀 더 명시 적으로 할 수 있습니다
그리고 정수 n을 - 그리고 그것의 말 int를 반환하는 것,
하지만 세미콜론 수단, mm, 나는 주위에 얻을 것이다 잠시 후에이 작업을 구현합니다.
다시 말하지만, 연타은 바보입니다.
그것은 단지 무엇을 아는 것 당신은, 위에서 아래를 알려주는
그래서 우리는 적어도 줄 필요 그것은 무엇의 힌트가 올 수 있습니다.
>> 이제 여기에 주요 살펴 보자.
여기서 아래로 스크롤하자 하고있는 주요 기능을 참조하십시오.
이 이름은 함수의 길이 아니며, 사실 여기 구조는 잘 알고있다.
나는 그 변수 n을 선언하고, 나는 또 다시 사용자를 훼방
의 getInt를 사용하여 양의 정수를 들면 이 루프 밖으로 만 종료
일단 사용자가 준수했다.
동안 작업을 수행, 우리는에 사용했습니다 그 방법에서 사용자를 괴롭힌다.
지금 이것은 재미있다.
나는라는 INT 선언 "대답을."
나는 그것을 반환 값 지정 라는 함수의 "시그마."
그 아직 무엇 모르겠지만, 나는 조금 전에 그것을 선언 기억한다.
그리고 제가 전달 해요 값은 사용자가 타이프, N 것을
그리고, 나는 그 답을보고합니다.
음의 다시 스크롤 할 수 단지 잠시.
이제이 디렉토리로 앞서 가자, 확인 시그마 공, 실제로이 프로그램을 실행
무슨 일이 일어 나는지 참조하십시오.
내가 가서 실행한다면 이 프로그램 ./sigma-0,
나는 긍정적를 입력 이 같은 정수, 시그마,
그리스 기호에서 알 수 있듯이, 단지입니다 모든 번호를 추가하는 것
이 최대에 제로.
그래서 영 플러스 1 플러스 2.
그래서이 희망을 나에게 세를 제공해야합니다.
즉, 일의 전부입니다.
그리고 마찬가지로, 경우에 나는 다시 실행 나는, 그것을 3 번을 부여
즉, 그래서 즉, 3 플러스 2입니다 5 더하기 1은 나에게 6을 주어야한다.
그리고 난 정말 미친 얻을 다음 경우 더 큰 숫자를 입력하면됩니다
그것은 나에게 제공해야 더 크고 더 큰 금액.
그래서 그게 다야.
>> 그래서 시그마처럼 보여?
음, 꽤 간단합니다.
우리가 구현하는 방법이다 지난 몇 주에이.
"INT"는 반환 형식이 될 것입니다.
시그마 이름이며, 소요 대신 N의 변수 m.
나는 위에 해당을 변경할 수 있습니다.
그런 다음이 그냥 전성 검사이다.
우리는 순간에 이유를 볼 수 있습니다.
지금은 또 다른 변수를 선언, 합은 0으로 초기화한다.
그럼 루프를 들어이가 명백하게 명확성을 위해, 반복,
난 = 1에서 최대 =의 m에있는이다 어떤 사용자의 입력 한 다음 I
이 같은 금액을 증가.
그리고 합계를 반환합니다.
>> 그래서 몇 가지 질문.
하나는,이 나의 의견에 주장 무한 루프의 위험을 방지 할 수 있습니다.
왜 음수를 전달 것 잠재적으로 무한 루프를 유도?
>> 청중 : 당신은 m에 도달하지 못할 것이다.
>> SPEAKER 1 : m에 도달하지 마십시오.
그러나 m는 전달, 그래서하자된다 간단한 예를 고려하십시오.
m는에 의해 전달되는 경우 음의 하나로서 사용자입니다.
에 관계없이 주의.
주요으로부터 우리를 보호 이도, 그래서 난 그냥 해요
정말 항문되고 시그마는 또한 확인하십시오
그 입력은 음수가 될 수 없습니다.
m이 음수 인 경우에 따라서, 음 하나 같은.
무슨 일이 일어날까요?
글쎄, 난에가는 일에 초기화 얻을,
그리고 제가 될 것입니다 m보다 작거나 같다?
>> 대기.
즉,의를하지 말자 대요 의이 이야기를 아무것도 없어요 수 있습니다.
나는 때문에, 그 질문을하지 않았다 내가 암시하고있는 위험
내가이기 때문에 발생하지 않을 항상 큰 than-- 확인 될 것이다,
나는 그 질문을 철회.
확인을 클릭합니다.
여기서 만이 부분에 초점을 보자.
이유는 몇 가지를 선언 않았다 루프의 외부?
선 나는했습니다 49에 공지 루프 내부에 난 선언,
하지만 온라인 48 나는했습니다 일부 외부를 선언했다.
그래.
청중 : [들리지].
SPEAKER 1 : 물론.
그래서 가장 먼저 난 분명하지 않습니다 선언하고 합을 초기화 할
제로 내부에 모든 반복에 반복,
이 명확하게 패배 때문에 숫자를 합산의 목적.
나는 계속 변경되는 것 다시 제로로 값입니다.
또한, 어떤 다른 더 비밀이야 같은 디자인 결정에 대한 이유?
그래.
>> 청중 : [들리지].
SPEAKER 1 : 그렇지.
밖에서 액세스 할 너무 무엇을 줄 루프?
53.
그리고 엄지 손가락의 우리의 규정에 근거 강의 몇 년전,
변수에, 정말, 범위 아르 를 포함 중괄호.
나는 내부의 합을 선언하지 않는 경우에 따라서 이러한 외부 중괄호,
I 라인 53에서 사용할 수 없습니다.
내가 선언 된 경우, 다른 방법을 넣어 여기에서, 또는 심지어 내의 합
루프, 나는 53에 액세스 할 수 없습니다.
변수는 효율적으로 사라질 것이다.
그래서 거기에 몇 가지 이유.
하지만 지금은 그냥 돌아가요 무슨 일이 일어 나는지 참조하십시오.
그래서 시그마 불려갑니다.
그것은 1 더하기 2, 1 더하기 2 가산 및 3은 다음, 값을 반환
대답에 저장을하고, 여기에 printf의 나는 화면에보고 있어요 이유이다.
그래서 이것은 우리가 반복적 인 전화 할게 무엇인가 접근 방법, 위치 반복 단지
루프를 사용하는 것을 의미한다.
루프, while 루프, 마 잠시 동안 루프, 그냥 다시 일을하고
다시 다시.
>> 그러나 시그마는 깔끔한 기능에 가지입니다 나는 다르게 구현할 수 있었다.
이것에 대해 무엇을, 어떤 그냥 가지 멋진합니다
내가 정말 제거하자 주의 산만의 많은
이 기능 때문에 정말 매우 간단합니다.
하자 큰칼 아래로 단지 네 개의 핵심 라인
및 제거 모든 의견과 중괄호.
이 압도적 가지입니다 대안 구현입니다.
좋아, 어쩌면 짜릿한하지, 하지만 섹시, 모든 권리의 종류,이다
훨씬 더 간결이 보는.
코드의 단지 4 라인, 내가 처음이 전성 검사를해야합니다.
m이보다 작거나 같으면 제로는 시그마는 이해되지 않는다.
그것은에서만해야하는데 양수에 대한이 경우,
그래서 난 그냥 갈거야 임의로 0을 반환
우리는 적어도 갖도록 몇 가지 기본 케이스 소위.
>> 그러나 여기 아름다움입니다.
이 아이디어를 추가의 전부, 1부터 n까지 번호, 또는 m이 경우,
벅을 전달 가지로 수행 할 수 있습니다.
음, m 1의 합은 무엇입니까?
글쎄, 당신이 뭘 알아?
이는 m의 합과 동일하다 플러스 m에서 1을 뺀 1의 합.
그럼 당신이 뭘 알아?
m 마이너스 1의 시그마는 무엇입니까?
음, 경우에 당신은 가지이를 따라 논리적으로, 이는 m에 1을 뺀 것과 동일하다
플러스 마이너스 m 2의 시그마.
그래서 당신은 가지 그냥 ... 수 당신이 있다면이 같은입니다
친구를 성가 시게하려고 그들은 당신에게 질문을,
당신은 가지 질문과 응답 당신은 가지 벅을 통과 유지할 수 있습니다.
그러나 중요한 것은 당신이 계속하는 경우 것입니다 질문은 작아 만드는
작은, 당신은있어 시그마가 무엇을 요구하지
N의의 시그마 무엇 N, N의 시그마는 무엇인가?
당신은 무슨 일이있어 요구하고 N의 시그마, 무슨 시그마
n 개의 마이너스 1, n은 마이너스 2의 시그마는 무엇인가?
결국 질문 어떻게 될 것입니까?
하나의 시그마는 무엇인가 제로, 매우 작은 값으로,
그리고 즉시로 즉, 당신의 친구를 얻을
당신은 질문하지 않을 수 있습니다 다시 같은 질문
당신은 오 제로이야 말할 것입니다.
우리는 이런 종류의 재생을 마쳤 바보 순환 게임.
>> 그래서 재귀 프로그래밍하는 작업입니다 함수 자체를 호출.
컴파일하고 실행하면이 프로그램은이다 정확히 같은 방식으로 동작하는 것,
그러나 키 것은 그 안에 시그마이라는 함수,
코드에있어서의 선이있다 우리는 우리 자신을 부르고 있어요
이는 일반적으로 나쁜 것입니다.
예를 들어, 어떤 첫째 나는 경우 이 컴파일, 그래서 sigma--을
시그마 1 ./sigma-1을합니다.
양의 정수, 제발, 50 1275.
그래서 기능에 보인다 정확한 테스트에 기초하여, 될.
그러나 나는 조금 위험한 것을 얻을 경우 소위 기본 케이스를 삭제
그냥 잘 난 그냥 만들고있어, 말 그것보다이 더 복잡합니다.
그냥 시그마를 계산하자 m을 복용 한 후 추가하여
m 하나를 뺀의 시그마?
그럼, 여기에 일어날?
의이 축소 보자.
의 프로그램을 다시 컴파일하자 , 저장 프로그램을 다시 컴파일
다음 준비 ./sigma-1은 확대 , (50) 양의 정수를 해주세요.
얼마나 많은 당신은 기꺼이 그보고에 자백하는?
>> 확인을 클릭합니다.
그래서이에 일어날 수 여러 가지 이유로,
솔직히 이번 주에 우리는있어 당신이 그 (것)들의 더 ​​많은 것을 줄에 대한 정보가 포함되어 있습니다.
그러나이 경우, 시도 거꾸로 추론하기
여기에 무슨 일이 있었 겠는가?
분할의 오류, 우리는 마지막으로 말했다 시간은 메모리의 세그먼트를 의미한다.
뭔가 안 좋은 일이 일어났다.
그러나 무슨 일이에요 기계적으로 비스듬히 갔다 그
이 곳에서 내 제거 그 소위 기본 사건의
어디 하드 코딩 된 값을 반환?
당신은 무엇을 잘못 생각하십니까?
그래.
>> 청중 : [들리지].
SPEAKER 1 : 아.
좋은 질문입니다.
숫자의 크기 그래서 나는 합산 것을
그것을 초과 정도로 큰있어 메모리 공간의 크기.
좋은 생각,하지만 근본적으로 충돌이 발생할 것.
즉, 정수 오버 플로우가 발생할 수 있습니다, 비트는 뒤집 곳
그리고, 우리는 정말 큰 실수 음수 등에 번호,
하지만 그 자체가 충돌을 일으킬하지 않습니다.
때문에 끝에 일 INT는 여전히 32 비트입니다.
당신은 안 갈거야 실수로 33 비트를 훔치는.
하지만 좋은 생각.
그래.
>> 청중 : [들리지].
SPEAKER 1 : 방법 결코 실행되지 중지,
실제로 그것은 다시 자신을 호출 다시하고 다시하고 다시
다시, 그리고 없음 지금까지 이러한 기능
자신의 유일한 선 때문에 완료 코드는 또 다시 스스로가 호출
다시.
그리고 무슨 일이 정말로 우리를 이곳에서, 그리고 지금
가지 그림으로이를 그릴 수 있습니다.
나에 가서 보자 단지 잠시 동안 그림.
이 것이 사진입니다 결국 살 것
자세한 세부 사항에서, 무슨 일이 일어나고 있는지의 컴퓨터의 메모리 내부.
그리고 그에 밝혀 이 사진의 아래쪽
스택 뭔가라는입니다.
이 덩어리입니다 메모리, RAM의 덩어리
그건 그냥 언제든지 사용되는 함수가 호출됩니다.
언제든지 당신, 프로그래머, 함수를 호출
운영 체제, 추천 맥 OS, Windows 또는 리눅스,
잡고 바이트의 무리, 어쩌면 몇 킬로바이트, 아마도 몇 메가 바이트
메모리,이를 손 당신하고는 있습니다
당신은 사용하여 기능을 실행 어떤 변수가 필요합니다.
그리고 그 다음에 또 다른 호출하는 경우 기능과 다른 기능을
당신은 메모리의 다른 슬라이스를 얻을 메모리의 또 다른 조각.
>> 그리고 실제로 이러한 녹색 트레이 경우 아넨 버그에서 해당 메모리를 나타냅니다
여기에 첫째 무슨 일이 일어날 시간은 당신이 함수 시그마를 호출합니다.
그것은이 같은 트레이를 넣어처럼 처음에 빈 스택 무엇에.
그러나 경우 용지함 말하자면, 자신을 호출,
다른 인스턴스를 호출 시그마, 그건
운영 체제를 묻는 등 우, 조금 더 많은 메모리를 필요로
이리 줘.
그리고, 그것은 정상에에 쌓여됩니다.
그러나 여기에서 중요한 것은 때문이다 첫번째 트레이, 아직 거기
그는이 두 번째 트레이를 호출하기 때문이다.
이제 한편, 시그마는 시그마 전화, 즉, 더 많은 메모리를 요구 같아요.
여기에 쌓여 가져옵니다.
시그마는 다른 사람의, 시그마를 호출 여기에 쌓여됩니다 트레이.
그리고 당신은이 일을 계속하는 경우, 결국, 가지 비주얼 매핑
그 차트, 무슨 일이야 트레이의 스택 일이?
이 양을 초과하려고 메모리를 컴퓨터가 있습니다.
그리고 바로이 녹색 트레이로 수평선을 초과
스택 위 그 단어 힙 위 그것은 우리가 미래에 다시 올 것이다,
그건 나쁜 일이다.
힙은 다른 메모리의 세그먼트,
당신이 허락한다면 트레이 더미 더미에
당신은 초과거야 메모리의 자신의 세그먼트,
및 프로그램은 실제로 충돌 할 것이다.
>> 이제 옆으로,이 아이디어로 재귀 따라서
분명히 문제가 발생할 수 있지만, 그것이 반드시 나쁜 것은 아니다.
고려 때문에, 후 모든 어떻게 .. 아마
이것은 몇 가지가 익숙해 소요 --how하는 우아한 방법이나 간단한
시그마의 구현이었다.
그리고 우리는 사용하지 않을거야 CS50의 모든 훨씬 재귀,
하지만, CS51, 그리고 정말 모든 클래스 는 데이터 구조를 조작 할 곳
나무, 또는 가족 나무처럼, 즉 어떤 계층이
그것은 매우 유용합니다, 슈퍼입니다.
자, 옆으로, 그래서 당신이 컴퓨터 과학자 지망생 등
구글의 일부에 익숙한 당신이 구글에 가면 내부의 농담,
당신은 무엇인지 찾아 의 정의는 말, 재귀, 입력합니다.
어 - 허.
옆으로, 나는 몇 가지를 뽑아.
이 10 분 같았다 꾸물 거리는 아침.
당신이 만약 구글 "찌그러진"통보 당신의 머리를 기울여서 slightly--
다음이 하나는 아마도 대부분의 모든 극악한
누군가가 같이 보낸 이후 이를 구현하는 자신의 일
몇 년이 어서, 갑자기.
아, 잠깐 ... 그 버그입니다.
>> 그래서 중 하나에서 실행 세계에서 가장 큰 웹 사이트
이 멍청한 부활절 달걀입니다.
아마도 그들은 소비 줄의 코드 사소 수
단지 우리가 가질 수 있도록 그런 작은 재미 것들입니다.
하지만 적어도 지금은 얻을 그 안에 농담의 일부.
>> 이제 몇 가지를 살펴 보자 흰색, 우리는 늦게 말했어있다
다시 벗겨 시작 일부 층 기술적으로
당신이 정말 이해가 너무 무슨 일 됐어요
당신은 이해할 수 위협의 일부,
Shellshock처럼, 그 이제되기 시작했다
모든 사람의의 선두에 주의, 적어도 미디어.
그래서 여기에 아주 간단한 기능입니다 즉, 무효, 아무 것도 반환하지 않습니다.
그것의 이름은 스왑입니다.
그것은 두 개의 변수에 걸리는 그것은 아무것도 반환하지 않습니다.
a와 b로 이동합니다.
그래서 빠른 데모.
우리는이를 가져왔다.
우리는뿐만 아니라 조금 걸릴 수 있습니다 잠시 여기를 휴식
마실 수있는 작은 선물이 있습니다.
누군가가 가입 으시면 여기에 그냥 잠시 저입니다.
어떻게 밤색 셔츠에 당신은?
올라 와요.
그냥 한 오늘.
하지만, 감사합니다.
좋아, 우리는이 누가 여기에 오는?
당신의 이름은 무엇입니까?
>> SPEAKER 4 : 로라.
>> SPEAKER 1 : 로라.
올라 와요.
로라, 매우 간단 도전 오늘.
요 만나서 반가워요.
좋아.
그래서 우리는 여기에 우유를 가지고 우리는 여기에 일부 오렌지 주스를
어떤 컵이 우리 오늘 아넨 버그에서 빌린.
>> SPEAKER 4 : 대여.
SPEAKER 1 : 그리고 앞서 갈 당신이 반 잔을 제공합니다.
좋아.
그리고 우리는 당신에게 반주지 우유 한 잔.
아, 그리고 당신이 할 수 있도록 이 어땠는지 기억
내가 가지고 기억 이 최대 오늘에.
좋아.
괜찮 으시면, 어디 보자, 우리 자신의 안경을 넣을 수 있습니다
당신이 원하는 경우.
이 로라의 눈에서 세계 수있을 것입니다.
좋아.
그래서 당신의 목표는 두 잔 제공 여기에 액체, 우유, 오렌지 주스,
이 내용을 바꿔 지도록 오렌지 주스는 우유 컵에 간다
그리고 우유로 전환 오렌지 주스 한잔.
>> SPEAKER 4 : 내가 다른 컵을받을 수 있나요?
SPEAKER 1 : 그래도, 당신이 물어 너무 기뻐요 그것은 훨씬 더 나은 장면이었을 것입니다
당신은 질문하지 않았다면.
하지만 그래, 우리는 당신에게 세 번째를 제공 할 수 있습니다 물론, 비어 컵입니다.
좋아.
그래서이 내용을 교환합니다.
아주 좋은.
아주 좋아.
당신은 매우 신중하게이 일을하고 있습니다.
그리고 세 단계.
좋아.
우수.
큰 박수 로라에 대 한 좋은 것입니다.
좋아.
우리는 약간의 이별 선물을 당신을 위해,하지만 날이 걸릴 수 있습니다.
정말 감사합니다.
그래서 간단한 예,하지만, 당신이 경우에 입증하는
내용물을 교환 할 이 컨테이너,
또는의 변수를 부르 자, 일부 임시 저장소가 필요
그래서에서 내용 중 하나를 준비합니다 실제로 스왑을 할 수있다.
그래서 참, 여기 소스 코드까지의 C는 정확히의 대표입니다.
오렌지 주스 및 우유 인 경우 , 나, 그리고 우리는이를 교환 원
당신은 창조적 인 무언가를 시도 할 수 있습니다 다른에 하나를 부어,
하지만 그건 아닐 것 특히 끝.
그래서 우리는 세 번째 컵, 호출을 사용하여 이 규칙에 따라 T-M-P를 tmp를
상기의 내용을 넣어 OJ는 점에서, 다음 한 컵을 교환,
다음에 OJ을 넣어 원래 컵, 이에
정확하게 달성 로라, 스왑을했다.
>> 그럼 정확히 할 수 있습니다.
내가 가서 풀어 보자 이다 예를 들어 최대
실제로 아니오 "라고 이 아니기 때문에 "스왑
당신이 생각하는 것만 큼 간단하게 수행.
그래서이 프로그램에, 알 나는 stdio.h에, 우리의 오랜 친구를 사용하고 있습니다.
나는 프로토 타입을 , 거기 스왑하는
그 구현의 의미 아마 아래로 아래
그리고 보자 메인 무엇을이 이 프로그램은 나를 위해 할 것입니다.
내가 먼저 정수 x가 도착 선언 한, 그리고 y는이를 가져옵니다 int 형.
그래서 OJ로 그 생각 각각 우유.
그리고 난 그냥이 printf의 x는 이것이다라고
y는 그저 내가 할 수있는이입니다 시각적으로 무슨 일이 일어나고 있는지를 참조하십시오.
그럼 내가 주장의 printf있다 나는이 두 가지를 교환하고있어 그
그리고, 나는를 인쇄 그들이 교환하고 있다고 주장,
나는 다시 X와 Y를 인쇄 할 수 있습니다.
그래서 여기로 스왑이에 정확히 로라가 무슨 짓을했는지,
우리는에보고 정확히 조금 전에 화면.
>> 그럼 가서하자 몹시 실망.
더 스왑을 확인하지 않고 스왑 사이트를 운영 할 수 없습니다, 여기에 출력을 확대.
입력 X는 y는 교환 스와핑, 2, 1이다.
X는 여전히 1이고, y는 여전히 2이다.
그래서 비록 솔직히이 보인다 정확히 기술적으로,이기는하지만 좋아
로라가 무슨 짓을했는지, 작동하지 않았다.
왜 그럴까요?
음,이 때 밝혀 우리는이 같은 프로그램을 작성
즉, 두 주, 여기 강조했다 다음 다른 기능, 스왑 등
여기에서 강조되는 그것은 세계 호출
같은 작은 선물을 본다 조금 전에이 트레이.
경우 메인 호출되는 첫번째, 즉, 운영 체제 묻는 거와 같아
로컬 메모리의 비트 x와 메인가 가지고있는 Y와 같은 변수
그들은 바로 거기에 끝.
주요 통화 스왑 및 주요 그러나 경우 두 개의 인수, a와 b를 교환 통과
오렌지 주스, 우유,은처럼하지 오렌지 주스와 우유를 나눠
로라한다.
컴퓨터가 무엇입니까, 그것은이다 오렌지 주스의 사본을 전달합니다
그래서 로라에게 우유의 복사, 어떤이 용지함의 내부 지향하는
값의 하나, 둘, 또는 OJ이며 우유,하지만 그 사본,
그래서이 점에서 이야기에서,이
이 트레이의 각 OJ와 우유입니다.
하나 둘이있다 이 트레이의 각,
및 스왑 기능은 참으로 노력하고 있습니다.
그것은 내부를 교환하는 것 둘째 최상위 트레이,
하지만 스와핑은 영향을주지 않습니다.
그리고 그냥 몇 가지를 기반으로 우리가했습니다 기본 원리
이전에 대해 이야기하고, 실제로 불과 몇 분 전, 무엇을
변경 이유를 설명 할 수 스왑의 내부와 b
비록, (X, Y)에 아무런 영향을주지 않는다 나는 스왑 기능으로 X와 Y를 통과했다.
여기에 핵심 단어는 무엇인가 단순하게 설명 할 수 있는가?
내가 여기를들은 것 같은데?
청중 : 돌아갑니다.
SPEAKER 1 : 반환?
반환하지 않습니다.
의 다른 하나 가자.
그게 뭔데?
>> 청중 : [들리지].
>> SPEAKER 1 : OK, 우리가 할 수 return-- 때문에 이야기에 반환을하려면
하지만 더 간단한 설명이있다.
대상 : 범위.
SPEAKER 1 : 범위.
나는 범위를 할게요.
그래서 범위, 위치를 기억 우리의 x와 y를 선언했다.
그들은 내부에 선언되고있는 메인의 여기까지.
A와 B 사이에, 아르 효과적으로 선언
스왑의 내부 꽤에서 중괄호하지만 여전히
스왑의 일반 영역에.
그리고 참으로, a와 b 단이 트레이 내에 존재
아넨 버그에서이 코드의 두 번째 덩어리.
그래서 우리는 실제로 사본을 변경하지만,있어 그게 정말 그렇게 도움이되지입니다.
>> 그럼 살펴 보자 이 약간 낮은 수준.
나는 다시 갈거야 소스 디렉토리,
나는 첫번째에 갈거야 여기에 확대, 단지
나는이에 걸 확인 큰 단자 창
프로그램은 여전히​​처럼 행동합니다.
지금이 가정 의도적 없습니다.
분명히 난에 스왑을 원 작품은, 그래서 벌레처럼 느낀다.
지금은 추가 시작할 수 내 코드의 printf의 많은,
, 여기에 Y를 X를 통해 출력하기 여기, 여기 요, 여기 요 나.
하지만 솔직히, 그게 아마 무슨이다 당신은 주 동안 해왔
지금은 근무 시간에 집에서 작업 할 때
몇 가지 버그를 찾기 위해 노력하여 pset에.
당신이 이미하지 않은 경우하지만 당신은 볼 것이다 그 문제는 세 가지를 소개 설정
GDB라는 명령에, 여기서 GDB, GNU 디버거,
자체의 모두가 기능이 실제로 수
우리가 상황을 이해하자 이런 식으로,하지만 더 강력하게,
문제를 해결하고 버그를 찾을 수 있습니다.
그래서 나는이 작업을 수행 할거야.
대신 ./noswap, 나는 대신 해요 GDB의 ./noswap를 실행하는 것.
즉, 내가 도망 갈거야 내 프로그램이 아닙니다 배쉬, 우리의 새로운 친구
오늘.
내가 도망 갈거야 내 내부 프로그램 noswap
라는이 다른 프로그램의 디버거 인 GDB, 어떤
수 있도록 설계 프로그램입니다 당신이 버그를 발견하고 제거 인간이.
여기 실행에 충돌한다면, 거기에 텍스트의 잔인한 양
당신은 정말 읽을 필요가 없다는 것.
그것은 본질적으로 산만이다 프롬프트에서 어떤
나는 컨트롤-L을 칠거야 이 상단까지 얻을 수 있습니다.
이것은 GDB 프롬프트이다.
지금이 프로그램을 실행하려면, 오늘날에이 작은 컨닝 페이퍼 등
슬라이드 실행이 첫 번째 제안합니다 우리가 소개하는 의미 것을 명령한다.
그리고 난 그냥 입력 할거야 GDB의 내부 여기 실행
실제로 내 프로그램을 실행.
이제 몇 가지 추가를 거기 이 같은 화면의 출력,
하지만 GDB 그냥되는 항문이다 그리고 무슨 일이 일어나고 있는지 우리에게 말하고.
당신은 정말 걱정할 필요가 없습니다 지금이 세부 사항에 대한 정보가 포함되어 있습니다.
하지만 정말 멋진 무엇 내가 할 경우 GDB는이 again--
제어-L은 나를 놓아 screen-- 웁니다 앞서를 입력하여 "주요 휴식"
내가 입력 쳤을 때, 무슨 일이있어 설정 브레이크 포인트 noswap.c에서라고,
GDB입니다 라인 (16), 실제로 내 프로그램을 알아 냈어
입니다, 내 기능은 실제로.
우리가 지금은 무시 보겠습니다 하지만 주소입니다
특히이 기능의 메모리에.
그래서 지금은 실행 입력 할 때, 여기에 멋진 것을 알 수 있습니다.
내 프로그램은 라인 I에서 휴식 에서 실행을 일시 중지 GDB 말했다.
그래서 지금 내 코드를 변경할 필요가 없습니다, 일부의 printf의 추가 재 컴파일을 다시 실행
그것은, 변경, 일부의 printf의 추가 저장, 재 컴파일, 실행합니다.
난 그냥 내 프로그램을 통해 걸을 수있다 인간의 속도 단계로 단계별로,
없는 속도의 인텔 내부의 종류에서.
>> 그래서 지금이 줄을 알 내가 돌아 가면 여기에 표시하고,
gedit에서 내 프로그램, 즉 실제로 있음을 알
코드의 첫 줄.
선 (16)의 gedit에있다.
이 라인 (16)는 GDB 내에서, 그리고 심지어 이 흑백 인터페이스하지만
하지 거의 사용자로입니다 친절이 의미
그 라인 (16)이 실행되지 않은 아직,하지만이 될 거예요.
그래서 실제로 내가 인쇄를 입력하면 X,하지의 printf, 그냥 인쇄 X,
나는 제로의 몇 가지 가짜 가치를 x는 아직 초기화되지 않은 때문이다.
당신이 경우 그래서, 다음에 입력하는 것, 또는있어 바로 옆에 N, 멋진 싶어요.
하지만 다음 지금 입력 입력 할 때 이 라인 (17)으로 이동 알 수 있습니다.
그래서 논리적으로, 내가 실행 한 경우 라인 (16)과 지금은 인쇄 x를 입력
내가 무엇을 볼 것인가?
한.
>> 그리고 지금이 인정 하듯이 혼란 스럽다.
$ 2는 단지 멋진 방법입니다 당신이 경우 나중에 그 값을 참조하려면,
당신은 "달러가이 서명."말할 수
그것은 역 참조 같아요.
하지만 지금은 그냥 무시합니다.
흥미로운 것은 무엇입니다 등호의 오른쪽에.
그리고 지금은 다음에 다시 입력하면 인쇄 Y, 나는이 표시되어야합니다.
또한 이제 인쇄 할 수 있습니다 X 다시, 그리고 솔직히,
나는에 관해서는 조금 혼란 받고 있어요 경우 내가 어디, 나는 목록에 대한 목록을 입력 할 수 있습니다
단지 주변에 일부 내용을 참조 점은 사실에있어.
그리고 지금은 입력 할 수 있습니다 다음, 거기에 X는 1입니다.
지금은 옆에 입력합니다.
오 y는 2입니다.
그리고 다시, 그것은 혼란 GDB의 출력 때문에
내 자신의 출력과 뒤섞여되고있다.
하지만 당신은에 의해, 염두에 두어야하는 경우 앞뒤로 코드에서이기는
또는 측면을 세우고 아마 옆에, 당신은거야
정말 난 그냥 볼 내 프로그램을 통해 스테핑.
>> 그러나 문자 그대로, 다음에 어떻게되는지 알 수 있습니다.
여기에 라인 (22)입니다.
따라서 이동하는, 내가 그 위에 가자 23에, 그리고 지금은, 여전히 한 x를 인쇄합니다.
그리고 하나는 여전히 지금 Y를 인쇄합니다.
그래서이 유용한 운동이 아니다.
그래서이 작업을 다시 할 수 있습니다.
나에 백업 가자 다시 상단과 형식 실행됩니다.
그리고 프로그램을 말하는 것 그는 디버깅하는 것
이미 시작된, 처음부터 시작했다.
그래, 다시이 작업을 수행 할 수 있습니다.
그리고 이번에는의 다음 해 보자 다음, 다음, 다음, 다음,
하지만 지금은 상황이 흥미있어.
지금은 한 단계 씩 할 스왑, 그래서 다음 입력하지 마십시오.
나는 그것을 발견 지금 단계를 입력하고 noswap.c 라인 (33) 나 올랐다.
내가 gedit를 다시 들으면, 선 (33) 무엇인가?
즉, 실제 처음이야 스왑의 내부 코드의 라인입니다.
어느 때문에 지금 내가 할 수있는, 좋은 가지 살펴볼 호기심 얻을
에 관해서는 무슨 일이 진정으로 일어나고.
나를 TMP를 인쇄 할 수 있습니다.
우와.
왜 TMP 몇 가지를 않습니다 미친, 가짜 쓰레기 값?
청중 : 그것은 초기화되지 않았습니다.
SPEAKER 1 :이 초기화되지 않았습니다.
그리고 실제로, 당신은 프로그램을 실행하면, 당신은 메모리의 전체 무리를 부여하고
운영 체제에서,하지만 모든 값을 초기화하지 않은,
그래서 어떤 비트가있어 그것은, 비록 여기보고
이 미친 큰 음 숫자는 단지 수단
그 것을 잔재에서입니다 그 RAM의 일부 이전 사용,
내가하지 않은 경우에도 자신은 아직 그것을 필요로했다.
그래서 지금은 전방 및 유형에 갈거야 다음, 나는 지금 인쇄 TMP를 입력하면,
내가 무엇을 볼 것인가?
어쨌든의 값이었다 그냥 첫 번째 인수입니다
X처럼 처음 일이 전달되는
그래서, X는 동일해야, 그래서 인쇄 TMP 나에게 하나를 인쇄해야합니다.
>> 그래서 당신은 문제 세트에 볼 수 있습니다 셋은 GDB에 종류의 튜토리얼
그러나 이것은 시작임을 실현 도구에서 봐 실제로 것
당신이 문제를 해결하는 데 도움이 훨씬 더 효과적.
우리는 궁극적으로있어 무엇 수요일에 할 것
몇 층을 벗겨 시작된다 일부 훈련 바퀴를 제거합니다.
그 일이라는 캐릭터 라인 우리는 몇 시간 동안 사용했습니다
우리는 천천히 그것을 빼앗아거야 과에서하는 얘기 시작
뭔가 더 esoterically char *로 알려진,
하지만 우리는이 좋은을 할 거 야하고 부드럽게 첫째로, 심지어 포인터하지만,
은 호출하는 등 어떤 작업을 수행 할 수 있습니다 경우 학대 매우 나쁜 일,
에서 약간의 클레이 메이션을보고하여 우리의 친구 스탠포드에서 닉 Parlante
대학, 컴퓨터 교수 이 미리보기를 함께 넣어 과학
이 수요일 와서 무엇의.
>> [동영상 재생]
안녕, 빙키.
일어나.
그것은 포인터 재미를위한 시간이다.
>> 그게 뭐지?
포인터에 대해 알아?
아, 케이크!
[END VIDEO 재생]
SPEAKER 1 : 그건 수요일에 당신을 기다립니다.
우리는 당신에게 다음 볼 수 있습니다.
[동영상 재생]
- 그리고 지금, 깊은 생각, Daven 판햄에 의해.
>> 왜 우리는 C를 배우고있다?
왜 A +?
>> [웃음]
>> [END VIDEO 재생]