📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

電腦科學教授解答程式設計問題!vibe coding根本沒那麼神?到底是有多推Rust?討厭數學也能寫程式?程式語言之間有何不同?|名人專業問答|GQ Taiwan

GQ Taiwan33:49

Transcription

我是 Sarah Chasons。我是加州大学伯克利分校的计算机科学教授。我今天在这里回答你们来自互联网的问题。这是编程支持。[音乐] Tech Guy 21,或者也可能是 Tech Guy 21,这取决于它是否是对 Latte 的引用,他说:“早期万维网还剩下什么?”事实证明,有史以来第一个网站仍然可供我们访问。所以,我现在笔记本电脑上就有它。这是一位名叫 Tim Berners Lee 的人在 90 年代初建立的网页。它描述了万维网是什么,因为 Tim Berners Lee 实际上是创造万维网的人。我们可以看到,它在我们的现代网络浏览器中仍然完全可读且易于管理,对吧?这只是 Safari。但有人还重建了它在那个时代的浏览器中看起来的样子。所以,在这里我们可以看到,我们有了万维网。内容都是一样的,但当然,它的显示方式截然不同,因为他们当时使用的机器工作方式不同。他们当时制造的浏览器工作方式也不同。它为我们提供了如何实际浏览页面其余部分的说明。内容都是一样的,但显然显示方式略有不同。Admirable Long 9546 问道:“刚开始学习编程,一直都这么难吗?”简单的答案是,不。你一生中学习过的所有技能,其中一些部分随着时间的推移都变得自动化了。当你开始骑自行车时,它们最终变得自动化了。当你开始弹吉他时,它也开始变得自动化,编程也会发生同样的事情。No confidence 5070。哦,我很抱歉这个用户名,他问道:“如果我讨厌数学,我还能学习编程吗?”答案是肯定的,绝对,绝对,100%。所以,有些数学会让某些编程更容易,但并非所有数学都如此,也不是所有编程都如此。有些电子游戏可以让你练习一些让编程更容易的事情,对吧?比如,有很多不同的技能,你可能正在练习,这些技能可能会帮助你处理一些你需要用到的东西,以便完成编程任务。数学就是其中之一。同样,也不是所有数学。当然,有些类型的计算机编程你可能想做,它们可能需要你付出一些数学努力。所以,计算机编程世界中有一些领域,你可能希望对数学的某些部分感到舒适。但是,不,你绝对绝对绝对可以进入编程领域,并且在不擅长数学的情况下成为一名出色的程序员。互联网上的某人问道:“最早的计算机病毒是什么样的?它们是如何感染和影响计算机的?”大约在 70 年代初,计算机开始通过一种叫做 ARPANET 的东西相互连接。那时还没有互联网。所以你可以通过这种方式开始传播东西。当时有一种叫做 Creeper 的病毒。它会在屏幕上打印出一些东西,比如“我是 Creeper。抓住我吧。”然后他们不得不发明 Reaper 来清除在这些机器上运行的 Creeper 程序。Demand 2010 问道:“程序员是如何编写第一个代码的?”早期,有 ENIAC。ENIAC 是我们现在看来是通用计算机的第一台计算机。它看起来很像老式的电话交换机,你只是把电线和不同的部件连接起来。而这实际上是你如何传达你想要它做什么。最终,人们想出了如何使用穿孔卡片,一种硬纸板的东西,你在上面打孔。这就是我们在开始将程序存储在内存中之前很长一段时间内向计算机输入指令的方式。所以最初是人类在编写那些 0 和 1。这非常痛苦。所有这些手动工作都非常累人。这需要几个月的时间。所以这位了不起的思想家 Grace Hopper 创造了“编译器”这个词。Grace Hopper 是早期计算领域的杰出先驱。她是一位数学家。她非常了不起。她想出了一个主意,与其让所有人类进行编译,不如让机器上有一个程序来为我们进行编译。那就是编译器。她发明了 A0 这个工具,用于将许多不同的程序部分、许多不同的半相关代码部分组合在一起,并让它们相互通信。这可以说是现代编译器的前身。事实上,从那时起,我们在此基础上添加了所有这些额外的东西。所以,Grace Hopper 在 50 年代初写的东西,对我们来说甚至不再像编译器了,对吧?它看起来像是编译器的某个子组件,因为我们在此基础上构建了所有这些其他东西。Better sir 9013 问道:“编程语言之间有什么区别?为什么有些语言被认为更难,而它们都只是相同的代码行?”有很多不同的因素可以区分编程语言。我经常考虑的一个重要因素是它们在多大程度上“支持你”。所以,一个很常见的情况是,编程语言会自动尝试为你捕获一些类型的错误,尝试阻止你遇到一些可能在以后困扰你的问题。有些语言说,“你知道吗,你自己看着办吧。”就像,“写你想写的就行。”你想放什么错误就放什么错误。我来运行它。所以,属于这一类的一个例子是 C。还有其他编程语言说,“你知道吗,我会尝试为你捕获至少一些错误。”可能不是所有错误,但我会尝试捕获一些错误,并且我不会试图阻碍你。我不会试图向你索取大量额外信息来做到这一点。所以,属于这一类的例子可能是 Python。然后你可能还有其他语言,它真的真的在尽力支持你。它会尽力为你捕获尽可能多的错误。而它做到这一点的方式是,它会向你索取额外信息。所以,它会让你更努力地工作,但作为交换,它会为你捕获很多错误。属于这一类的一个例子可能是 Rust。Faint Tai 问道:“作为一名程序员,你一天的工作内容是什么?”不幸的是,答案是你可能想要的编程量并不多。总的来说,很多程序员之所以开始编程,是因为他们喜欢编程。然后事实证明,他们每天大部分时间都在与其他程序员讨论如何让这个人的代码与那个人的代码协同工作,如何让所有大型代码库协同工作,或者你与客户或将使用这段代码的人交谈,并弄清楚他们的需求是什么。你们会开很多会来弄清楚程序应该做什么,然后你们会尽可能地挤出实际的编码时间,因为那通常是乐趣所在。DG Holmes 问道:“Python 真的适合一切的第二佳语言吗?”我猜说这句话的人,老实说,他们可能有点想贬低 Python。有点想说它不是任何事情的第一佳语言。但另一种理解方式是说 Python 非常灵活。而且这是真的。Python 非常灵活。你可以舒适地用 Python 编写各种程序。你可能会玩得很开心。我个人很喜欢 Python。我对 Python 没有恶意。所以,好评。学习 Python。一位 Reddit 用户问道:“2025 年学习 C++ 还值得吗?”简单的答案是绝对值得。后续的答案是,“如果你要进入一个现有的代码库,而它已经是用 C++ 编写的,好的,太棒了。它已经用 C++ 编写了。你很可能会使用 C++。”另一方面,如果你要开始一个新项目,看看是否可以使用 Rust。不妨看看。Roy Rustdev 说:“为什么 Rust 在 Stack Overflow 的调查中是大家最喜欢的编程语言?你为什么喜欢 Rust?你试图说服别人学习 Rust 吗?”Rust 可能是我们现在拥有的最令人兴奋的新兴编程语言之一。他们在设计这门语言的许多不同方面都非常用心。人们非常兴奋的一点是,他们对你做错事时收到的错误消息非常用心。老实说,当你开始学习一门语言时,这确实很重要。但如果你更深入地研究语言本身的设计,它汇集了过去 20 年来编程语言领域新研究的最佳思想。所以,有很多令人兴奋的想法,关于我们如何帮助程序员捕获更多错误。这种想法是,编程语言应该支持你。它应该留意你可能做错的事情,并提前捕获它们。Rust 在其他语言无法真正做到的层面上做到了这一点,同时又极其快速。所以,如果你在想,“哦,我必须使用 C 才能编写这个,才能确保它足够快地运行,”你可能也会考虑 Rust,因为它性能很高,但它也再次强调,它支持你。Star Knight 12 说:“JavaScript 是一门伟大的语言。我不知道为什么人们无缘无故地讨厌它。我明白你的意思。我认为总的来说,有一些理由可以对 JavaScript 的一些设计选择持谨慎态度,但基本上,如果你对 JavaScript 不满意,那就学习 TypeScript,对吧?如果你想在网上写东西,并且对被锁定在 JavaScript 中感到非常沮丧,没问题。学习 TypeScript。你会开心的。这是一个非常令人兴奋的问题。Brilliant sir 5729 问道:“编程语言是如何被创造出来的?”有人有一个想法,我想写出这种程序。我想让程序文本说这个,这就是我想让它做的事情。然后,将高层表示转换为 0 和 1 所需的所有步骤,现在都由你负责。这个过程叫做编写编译器,或者你也可以编写解释器。实现编程语言有多种方法。但基本上,是的,这需要一个想法。所以你不一定需要生成汇编指令,因为事实证明我们有所有现有的编程语言。所以你可以利用这一点来实现你的新语言,这可能对你来说更容易。所以,也许我想发明 Unicorn Lang,对吧?我可以编写我的编译器,将 Unicorn Lang 编译成 Rust,Rust 是一种现有的编程语言。现在我有了这个 Rust 程序从另一端出来,我就可以把它输入到现有的 Rust 编译器中,并用它来最终得到 0 和 1。所以你可以开始堆叠这些不同的编译器。Cheap long stake 说:“为什么计算机只使用二进制代码 0 和 1?”当我们日常生活中写数字时,我们使用的是十进制。我们有 0 到 9 这九个数字。而对于计算机,正如我们已经讨论过的那样,我们使用的是 0 和 1,二进制。这不一定是固有的。这不是强制性的。我们都认为是计算机的第一台计算机 ENIAC,实际上使用的是十进制。这是可以做到的。你完全可以做到。请记住,我们在计算机内部表示信息的方式是电流流过计算机的某个部分。所以,请想象一下,我把你关在一个房间里。房间里有一盏灯泡。墙的另一边,我控制着一个调光开关。我想让你告诉我,我们是在调光开关的低位还是高位。我会在外面随意操作它。每次我喊你,你都必须告诉我低或高。如果我只给你低和高,你可能会相当可靠地做到。我可能在调光开关上操作得有点偏差,但你可能仍然能够喊出低或高。现在,相反,假设我说,我选择了调光开关上的这 10 个位置,我想让你根据我放在那里的位置喊出 0、1、2、3、4、5、6、7、8 或 9。但是请记住,你在另一个房间里。你没有看到我在调光开关上做了什么。你只看到了灯泡。所以,假设我把它调到 5。有时你可能会喊出 5。有时你可能会喊出 6。有时你可能会喊出 4。在计算机内部使用十进制是可以做到的,但如果你想想,“好吧,我们真的在试图弄清楚有多少电流流过这个。”它要容易得多。如果你只使用 0 和 1,它会更可靠。Illustrious run 4733 问道:“为什么调试比编写代码更难?”它太难了。基本上,答案归结为你的大脑中对程序正在做什么的认知模型与程序实际正在做什么之间的差异。如果你正在编写东西,对吧,编写程序的初稿,你甚至不一定处于测试你的认知模型是否与程序一致的阶段。但基本上,我们一直以来的看法是,“好吧,这就是我期望程序做的事情。”你让你的认知模型与程序正在做什么保持一致。所以,你一点一点地构建程序,并在此过程中不断确保它正在做你期望的事情。如果我们到了调试的地步,我们正在寻找出了问题的地方,那么我们的认知模型和程序实际正在做什么就已经出现了分歧。如果这是你没有写过的东西,那就更难了,因为你必须从头开始建立认知模型。你没有任何认知模型可以开始。所以你必须去阅读代码,弄清楚,“好吧,我期望这个程序做什么?”Pleasant relation 144 问道:“你们是怎么记住所有语法规则的?”我们不一定。事实证明,你知道,与我学习西班牙语相比,对吧?我会去,我会试着用西班牙语和某人交谈。我不会每次都看着我的电脑来翻译一个词。相比之下,如果我在编辑器里输入代码,电脑就在我旁边。如果我忘了什么,我可以查一下,这没什么大不了的。Red Pajamas 问道:“我怎么知道是应该学习后端、前端还是全栈?”答案是,你可能事先不知道。你真的只需要尝试一下。所以,在任何一个领域成为真正舒适和感觉像专家可能需要几年时间,但要了解日常工作是什么样的,只需尝试一两周,你就可以大致了解这些程序是什么样的,以及你是否喜欢编写它们。Kavina 14 问道:“计算机科学家如何为 CRISPR 做贡献?”我非常喜欢这个问题,因为我对将编程语言工作,以及更广泛的计算机科学与学科对话的工作感到非常兴奋。我认为这非常强大和令人兴奋,更多的人应该考虑它。但我认为实际的答案是,去与那些正在做你想支持的工作的人交谈。所以,我经常给我的一些博士生建议,他们在这方面做得非常出色,他们会出去成为他们想支持的那种工作的团队的学徒。例如,我有一位出色的博士生,他目前基本上被派驻在一个生物实验室。你知道,他是一名计算机科学家,但他学会了如何使用移液器。他上过生物课。他在实验室里帮助处理编程任务。他会在那里了解他们的日常工作,因为不幸的是,这并不像我们能让生物方面的人写一两段关于他们问题的话,然后我们就开始工作那么简单。需要付出努力才能弄清楚真正的差距在哪里,以及我们可以做些什么来填补它们。所以,花时间与你渴望服务的受众和社区在一起。我认为这非常强大。Senior Pineapple,或者可能是 Senor Pineapple,问道:“从零开始构建自己的游戏引擎有多难?”答案是非常难。但你可能也会玩得很开心。总的来说,你将花费大量时间来决定你想让程序员使用哪些抽象。基本上,一个他们可以反复使用的想法或词语。如果你有一个预先构建的代码片段,它将完成一件大事,但他们可以通过一个简短的名称来调用它,并一遍又一遍地重用这段代码。所以,当你构建自己的游戏引擎时,你就是在试图预测人们将需要反复使用的代码片段是什么。但事实证明,要构建一个真正的游戏,对吧,要构建,尤其是如果你考虑的是 3D 游戏,程序员将需要做很多事情,而你需要一些时间才能做到。另一件事是,这取决于你决定走多低的级别。比如,你可能是在现有的游戏引擎之上构建的,在这种情况下,你可能不必处理这个问题。但如果你要一直深入到决定每个像素如何显示,你将不得不进行大量的计算机图形学计算,这涉及到一些数学。所以这个过程非常非常有趣,如果你对游戏编程感兴趣,编写自己的游戏引擎是一个非常有趣的学习过程,但绝对不是最快的游戏开发路线。Marthala 问道:“ChatGPT 真的像它看起来那样具有革命性吗?与其他技术突破相比,我认为不是那么回事。”我认为这取决于你个人是否对目标是把看起来不错的词语组合在一起的任务感兴趣。如果这会改变你的世界,那就太棒了。ChatGPT 是建立在一种叫做大型语言模型(LLM)的程序之上的。大型语言模型基本上是一个用于组合看起来不错的词语的程序。所以,大型语言模型的设计者实际采取的方法是:好吧,我们要做的就是收集我们在网上能找到的所有文档,所有网页本身,以及我们能找到的所有其他文档,这些基本上是人类组合起来的词语。所以,我们有一些相当有力的证据表明,人类认为这些词语组合在一起看起来不错。所以,我们将让它在这些文档上玩“填空游戏”。我可能有一个简单的文档。它说“狗有四条腿”。对吧?所以我将把它输入程序,然后说“空白狗有四条腿”。第一次回答时,它说“天空”。你说“不,你这个傻程序,不是天空”。这个词是“那个”,我想要那个词。你再试一次。你用空白代替第二个词。所以是“那个空白有四条腿”,它说“游泳”。你说“不,你这个傻机器,不是游泳”。我想要一只狗。所以你重复这个过程大约 300 到 400 年的计算时间,因为你可以将工作分配给许多不同的计算机,然后让它们一起整理它们的“作弊表”。我们已经向它展示了答案。你可能会说,“Sarah,这似乎不太对。”“程序将能够作弊。”这正是关键,对吧?你试图让它作弊。你希望它作弊。所以,你正在给这个 LLM,这个大型语言模型一个“作弊表”。如果你曾经听说过某个 LLM 的参数数量,那就是关于它得到的“作弊表”的大小。你让它玩填空游戏大约 300 到 400 年的计算时间。然后,你得到一个相当擅长填空的程序。现在,这并不自动意味着你得到了 ChatGPT,但将其中一个变成聊天机器人相当容易,对吧?因为现在我们创建一个新文档,它说“这是人类和聊天机器人之间的对话记录”,然后文档的下一部分说“人类说‘瑞典的首都是什么?’聊天机器人说:空白”,然后它现在填空,因为它擅长玩填空游戏。所以,它可能会说“那个”,然后你再试一次,但现在它说“聊天机器人说:那个空白”,然后也许下一个词是“首都”,你只是继续这个过程,继续这个过程。所以,这就是大型语言模型的工作原理。它们只是用于组合看起来不错的词语的程序。GPT girl next door 问道:“随着人工智能的飞速发展,深入学习编程还有价值吗?”是的,你仍然需要能够以老式的方式编写代码,才能从这些生成式 AI 工具中获得程序。所以,第一件事是,你在编程教育过程中学到的一个非常重要的技能是如何分解编程问题,对吧?你从一个庞大、模糊、不太明确的大问题开始,然后你弄清楚,“好吧,我可以把它分成这两部分,然后我可以把那一部分分成更小的部分”,你一直这样做,直到达到一个非常小的程度,小到你可以用一行代码或几行代码来解决它。如果你没有受过这方面的训练,这并不一定容易做到。所以,如果你只是给出一些模糊的、开放式的问题,很难将其转化为一个真正有用且能够运行的程序。下一个重要的问题是,我作为一个非程序员通常会写的人类语言文本,例如英语文本,与我作为一个程序员会写的内容不同。在所有输入到大型语言模型以弄清楚哪些词语组合在一起看起来不错的文档中,包含代码的文档通常是由程序员编写的。所以,它们使用了程序员风格的人类语言描述以及代码。所以,即使程序员写的人类语言描述可能产生好的代码,其他描述这些问题的方式可能不起作用。为了使用这些工具,这些生成式 AI 工具来实际生成有用的程序,你大多需要已经知道如何以老式的方式编写程序,这对很多人来说很令人沮丧,但至少目前看来,这就是现实。Minute order 4809 问道:“在编码时,使用 AI 的最佳方法是什么?”我的第一个答案是,你确定要仔细检查,但如果你决定,“是的,我开始了。”你想做的是首先将你的问题,无论它是什么样的,分解成你能想到的最小部分。理想情况下,这应该是大约五行代码左右的东西,类似的东西。然后,不要用标准的语言来写,而是用伪代码来写。所以,伪代码基本上是你描述“这就是计算机要做的事情,然后这是计算机要做的事情,这是计算机要做的事情。”它基本上看起来像用编程语言写作,只是你不关心语法。所以,你不在乎是否缺少分号,或者缩进是否正确,等等。把它输入到你的 AI 工具中。然后,你必须有一个具体的计划,来让你自己相信输出的内容是正确的。你是否有 20 个测试要运行?你是否有朋友可以看看这段代码,确保它确实在做正确的事情?或者,如果你自己是一名程序员,你会检查它是否真的在做正确的事情?所以,有一个具体的计划来检查它。或者,你知道,就不要使用它。ad historical 6271 问道:“有经验的开发者,你们对‘Vibe coding’的体验如何?”Vibe coding 是指我们使用大型语言模型,或者像 ChatGPT 这样的工具,或者基于相同底层生成式 AI 技术构建的其他工具来生成程序,而不是用老式的方式通过输入编程语言来编写。Vibe coding 在重写以前写过很多很多次的东西时似乎效果不错。另一方面,如果你想做任何新事情,那可能不会有什么进展。最好的办法是把问题分解成非常小的部分,然后用你自己的推理来实际编写程序。实际上,有一些非常有趣的研究对此进行了研究,研究了它是否真的能提高一个人的生产力,还是他们认为它提高了他们的生产力。事实证明,使用基于 LLM 的工具使他们慢了 20%,但即使在使用该工具完成任务后,他们都说他们认为这使他们快了 20%。Alterior kid 324 问道:“现场编码实际上是什么样的?”基本上,任何时候你编程,你可能都是在现场进行的。我不知道还有什么替代方法,所以你可能是在现场进行的。但通常,我们专门使用这个词来指代在观众面前进行,就像你们一样。所以,我现在就来做。我们将利用这个机会来看看用一个相当短、相当简单的程序可以做些什么,但我们将一步一步地讨论它。所以,我现在要打开一个编辑器。我们有这个非常小的程序。所以,我们有一个 URL,一个结构有趣的 URL,但它和你可能在浏览器中输入的 URL 是一样的。然后我们有一些国家代码,这个有很多。但在这里我们有一个较小的列表。我们可以看到 USA、Mexico、Canada。让我们先把它打印出来。所以,让我们打印出更少的国家代码。程序员喜欢从零开始计数而不是从一开始。事实上,这指的是列表中的第一个项目。我们将复制几次,因为我们需要打印所有项目。这叫做 tiny map。所以我将运行 tiny map。你可以看到我刚刚打印出了这些国家代码。它不是一个令人兴奋的程序,但也许我想实际使用这些字符串,这些小文本片段,来修改原始 URL。所以,与其只是打印国家代码,不如复制这个,在示例 URL 中写着 USA 的地方,我将用我们正在使用的国家代码替换它。让我们把它放进去。我们想从零开始。同样,我们将不得不复制粘贴几次。来了。Python 3。我们现在看到了 URL 的变体。我们可以看到有 USA 的,有 Mexico 的,有 Canada 的。好吧,我们可能对仅仅打印 URL 不太感兴趣。我们可能想用那个 URL 做一些有趣的事情,比如从它那里获取一些数据,就像我们把它输入浏览器一样。所以,让我们打开一个叫做库的东西。基本上,如果其他程序员制作了一堆小的程序片段,他们对自己说,“这对很多人都会有用。我将把它提供出来。”我们就称之为库。所以,我将导入 requests。所以,现在让我们用 requests.get 代替 print。我们将对所有这些 URL 重复这个过程。我个人开始对每次都重新输入这个长字符串感到厌烦。我开始想,也许有什么东西可以帮助我避免所有这些复制粘贴,也许可以为我自动化这个过程。让我们来介绍一下循环。循环将允许我们对一系列具有相似结构的项目或我们想要做同样的事情的项目重复执行某个操作。所以,对于 I in range length of fewer country codes,让我们做一些事情。我们可能会做 requests。但我不想总是为国家代码列表中的第一个项目这样做。我可能想为 E 项目这样做,对吧?零号,然后第一个,然后第三个。现在,我们没有任何[清嗓子]打印出来,但我将展示这实际上会为所有项目运行。所以,我知道 request 会给我返回一些 JSON。JSON 只是我们拥有的标准格式之一,它允许我们以许多不同的程序都能理解的方式表示数据。所以,如果你有一个标准化的方式,那么你的不同程序就可以相互通信。所以,让我们通过运行每个请求来打印回来的 JSON。好吧,一大堆混乱的 JSON,读起来不太有趣。让我们添加一些小的分隔符,让它稍微容易一点。我们可以再次运行它。好吧,我们现在看到这些是根据它们与三个项目中的哪个相关联而分开的。我正在寻找这个预期寿命数据,我知道 URL 的这个特定部分是这样,并且我知道 JSON 中将作为值的特定部分是这个数字值在这里。所以,我将把它放入代码中,这样我就不必全部查看。让我们给它起个名字。叫什么好呢?我们就叫它 JSON。然后我们可以从 JSON 中提取我们正在寻找的部分。所以,JSON,我认为它在值里面,我们只想得到这个数字值。所以,让我们给它起个名字。也许叫它预期寿命。所以,现在我想打印出国家代码。这个值在这里。我们只需要确保我们已经存储了它,我们已经保存了它,我们已经给它起了名字,然后我们才能使用它。让我们打印出国家代码和预期寿命。让我们看看我们是否得到了预期的数据。看起来不错。我们可以看到我们正在查看的这三个国家的预期寿命。好吧,让我们实际保存这些数据,因为我们以后可能想用它做些其他事情。所以,让我们创建一个新列表。这个列表将是空的。我们将用我们从这些请求库的调用中获取的数据来填充它,从网络上获取数据并说“带回这个国家的数据”。我们继续打印它。我们还将把它添加到数据中。所以,我们将添加到数据列表中,然后我们将放入国家代码和预期寿命。让我们在过程结束时打印出我们的数据,以确保它看起来是我们期望的样子。我将再次运行程序。好吧,我们现在在最后看到了这些数据。如果把它放在地图上呢?同样,我们将需要使用一个别人为我们构建的好的库。所以,让我们导入 plotly.express,并称之为 px。所以,现在,除了打印数据之外,我们还可以创建一个表示数据的图形。所以,fig = px。我认为是 chloropl。让我们使用我们的数据。现在,我们必须告诉它哪些是位置,哪些是我们想要可视化的内容。所以我将说 locations,并且它将是 0,这意味着它是这些对中的零号项目。我们可以看到这里。我们可以看到国家代码在左边。所以它是零号项目。然后预期寿命是第一项,或者用我们日常使用的更常见的术语来说,它是第二项。所以,让我们说 color = 1。一旦我们有了它,让我们实际显示图形。好了,我们已经准备好了程序。太棒了。我们可以看到我们的地图。在这里。它有这三个国家的颜色。我们可能对对所有国家这样做感兴趣。所以,我很快就会进去,实际上改变我们正在使用的列表。所以,你可以看到我们一直在使用这些更少的国家代码,它只说了三个。但是,为什么不为所有国家运行呢?对吧?数据就在那里。所以,让我们使用一些国家代码而不是更少的国家代码。然后,让我们删除所有这些旧的不必要的行。然后,我们将拥有我们的最终程序。所以,来了。它将与互联网通信。它将收集所有这些不同国家的信息。几分钟后,我认为不到一分钟,我们就得到了地图。它有许多不同国家的数据。HTMI 926 问道:“我如何阅读代码?”这实际上是一个极其困难的问题,因为阅读代码实际上非常困难。不像我们坐下来看一段文字。我们将从第一页开始。我们将翻到第二页。我们以这种线性的方式移动。这并不是我们通常阅读代码的方式。如果你的代码有可能恶意,请不要采纳这个建议。但如果这段代码没有恶意,那就运行它。看看你感兴趣的输出部分,你想进一步研究。找出那段代码的哪个部分实际上创建了那个输出,然后开始往回工作,对吧?来自代码早期部分的输出是什么,最终进入了创建那个输出的过程?甚至还有专门用于帮助你逐步执行代码的调试器。所以,我最喜欢的调试器类型之一是“时间旅行调试器”。你已经执行了你感兴趣的程序,但你可能实际上想回溯。你想回到过去看看之前发生了什么。你可以这样做。如果你想向前旅行,你也可以这样做。因此,时间旅行。Vro 3 问道:“计算机如何理解代码?”我将通过一个具体的程序来讲解。我将向你们展示,我们如何从看起来像你在其他地方可能见过的计算机程序的东西,一直到你可以实际存储在机器中的 0 和 1。我们将通过四个阶段来完成。所以,这将是整个过程的输入。所以,来了。我们有 1 + 2 + 4。所以,首先需要做的是,我必须弄清楚其中的哪些部分要单独处理,哪些要一起处理。我将通过划线来做到这一点。所以,左括号将单独处理。1 将单独处理。加号,2,右括号,加号,4。你可以看到我们忽略了这些空格。我们有左括号,1,加号,2,右括号,下一个加号,以及 4。这个阶段,我刚刚画出的,叫做词法分析或标记化,因为右边列表中的这些东西就是标记。所以,接下来我们要做的就是把它变成我们可以用来了解程序结构的东西。所以,在这里,我将称之为“树”的根部,我们将有一个加法运算符。这将是第二个发生的运算,因为我们要确保我们加在一起的 1 和 2,我们可以看到它们在括号里。我们实际上想先做那个,对吧?因为它已经被分组了。左边是 1,右边是 2。然后,在顶部的加法运算的最后一个分支上,将是 4。现在我们可以开始看到这里有一些结构。我们可以看到 1 和 2 将通过某种运算进行分组,然后无论我们从该运算中得到什么,它都将与 4 进行分组。但实际上很多人知道,最终进入计算机的东西必须是 0 和 1。而且,此时不一定有明确的方法将其转换为 0 和 1。所以,现在我们将把它变成“指令”。指令基本上就是处理器知道如何处理的东西。所以,来了。我们将把 1 移进去,对吧?因为这是我们正在处理的第一个值,移入 R8,这是计算机可用的槽之一。然后,也许我们将把 2 移入 R9,另一个槽。现在我们有了运行第一次加法所需的一切。所以,让我们执行一个 add 指令,我们将把 R8 和 R9 中的值加在一起。这会将该值放入 R8。所以,现在让我们把 4 移入其中一个槽。所以,我们不再使用 R9 来处理我们之前使用的东西。所以,让我们把值 4 移入 R9。现在,如果我们执行 add R8 R9,我们应该在那里得到整个程序的计算结果。然后,这个阶段,我们实际上是将程序的结构化表示转换为指令,这实际上叫做代码生成。但最终它必须变成 0 和 1。所以,让我高亮显示一些我们在这条指令中看到的常见结构。我们可以看到,有这个东西,然后有那个东西,然后有这个东西。事实证明,我们有一个方案可以将每个东西转换为二进制数。然后,我们对所有这些指令执行完全相同的过程。最后,我们得到的就是 0 和 1。所以,现在我将转向计算机。好了。所以,我们现在在 x8664 playground 中。这是一个网站。你可以在浏览器中访问它。我已经输入了我在 iPad 上画出的指令。所以,现在我们将看到它实际上如何表示计算机状态,当我们运行这些指令时。所以,来了。我们从第一个 move 指令开始。你可以看到,在这里的 R8 中,我们现在有了值 1。所以,让我们执行下一步。太棒了。我们可以看到,现在在 R9 中,我们有了那个 2 的值。如果我们继续,我们将看到我们已经完成了加法,并且加法的输出,值 3 现在位于 R8 中。太棒了。再来一次。我们将 4 移入 R9。我们重用 R9 是可以的,对吧?我们没有覆盖任何我们以后需要的东西。所以,完全没问题。我们可以把那个值放入 R9。然后,再来一次。我们可以看到我们已经完成了最后的加法。并且我们得到了最终结果 7,它表示在 R8 中。这就是计算机理解你编写的代码的方式。就是这样。我们今天的问题已经问完了。希望你们都学到了新东西。希望你们对编程语言,甚至对编译器感到兴奋。下次再见。[音乐]