<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ 编程语言 - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ freeCodeCamp 是一个免费学习编程的开发者社区，涵盖 Python、HTML、CSS、React、Vue、BootStrap、JSON 教程等，还有活跃的技术论坛和丰富的社区活动，在你学习编程和找工作时为你提供建议和帮助。 ]]>
        </description>
        <link>https://www.freecodecamp.org/chinese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ 编程语言 - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 11 May 2026 15:33:11 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/tag/programming-languages/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 你不知道的Java ]]>
                </title>
                <description>
                    <![CDATA[ 本文记录了JVM及Java生态中一些有意思的事情，希望能带给你一个耳目一新的Java。 Java真的有点老了，之前我们不觉得，但是当95后程序员看着一门比他们年纪还大的语言的时候，那种感觉，应该跟我这样的80后看到C++的感觉差不多。但是你也不要被这种“老”所误导，Java仍然是一门相当活跃的语言，这种活跃体现在官方发版和社区生态两个方面。尤其是2017年以后，Java也是发车式release，一年两班车，版本必须发，赶得上的特性就上，赶不上就等一下班。 我觉得喜欢技术的人，没人会抗拒这种激进的发版策略。但是公司就不一样了，现在我司所有的Java程序还跑在Java8上，还想在生产环境用Oracle的Java8的话就有风险了，不付费的话，更新补丁啥的想都不要想。 这就引出了我要讲的第一个地方： 除了Oracle的Java，还有的选么？ 有，不仅有，而且非常多。这里我随便列几家（摘自sdk list java [ https://sdkman.io]）：  * AdoptOpenJDK  * Amazon  * Azul Zulu  * BellSoft  * SAP  * Tr ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/java-you-have-not-know-about/</link>
                <guid isPermaLink="false">5fb156d35f583f05650910fa</guid>
                
                    <category>
                        <![CDATA[ Java ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 后端开发 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 编程语言 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ 牧云踏歌 ]]>
                </dc:creator>
                <pubDate>Thu, 18 Nov 2021 10:10:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/04/photo-1497515114629-f71d768fd07c-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><em>本文记录了JVM及Java生态中一些有意思的事情，希望能带给你一个耳目一新的Java。</em></p><p>Java真的有点老了，之前我们不觉得，但是当95后程序员看着一门比他们年纪还大的语言的时候，那种感觉，应该跟我这样的80后看到C++的感觉差不多。但是你也不要被这种“老”所误导，Java仍然是一门相当活跃的语言，这种活跃体现在官方发版和社区生态两个方面。尤其是2017年以后，Java也是发车式release，一年两班车，版本必须发，赶得上的特性就上，赶不上就等一下班。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/11/diagramm-oracle-1.png" class="kg-image" alt="diagramm-oracle-1-w438" width="876" height="530" loading="lazy"></figure><p>我觉得喜欢技术的人，没人会抗拒这种激进的发版策略。但是公司就不一样了，现在我司所有的Java程序还跑在Java8上，还想在生产环境用Oracle的Java8的话就有风险了，不付费的话，更新补丁啥的想都不要想。</p><p>这就引出了我要讲的第一个地方：</p><h3 id="-oracle-java-">除了Oracle的Java，还有的选么？</h3><p>有，不仅有，而且非常多。这里我随便列几家（摘自<a href=" https://sdkman.io">sdk list java</a>）：</p><ul><li>AdoptOpenJDK</li><li>Amazon</li><li>Azul Zulu</li><li>BellSoft</li><li>SAP</li><li>TravaOpenJDK</li></ul><p>是不是有点意思了？</p><p>当然这都源于06年的时候，Sun公司做的一个无比英明的决定，就是搞开源版的Java，后来便有了OpenJDK项目，真是大写的服字。那年笔者刚上大学，不过还没等我大学毕业，Sun公司转眼就被Oracle给收购了，怎不令人唏嘘？</p><p>顺便再提一下这两天刚发生的有意思的事情：Apple公司不是在几天前（2020-11-11）刚刚发布了他们基于ARM架构的新Mac么，而就在前不久，微软站出来说给Java贡献代码，为了实现Java向Apple的新架构的适配。我还在新闻下面看到一个评论，大意是说曾几何时，微软的JVM还是特别厉害的JVM实现呢。</p><p>所以，Java虽然名义上是Oracle的，但因其开源的历史渊源，其实很多公司都对它投入了相当大心血，包括很多大佬级别的公司，比如华为公司也是贡献过不少代码的。这些全球顶尖的公司，共同维持着Java世界的秩序。现在Java的迭代速度又坐上火箭了，所以网上那些非要较真引战的伪技术帖，动不动就唱衰Java，我觉得还为时过早。</p><p>如果你是名前端程序员，想学学后端，技多不压身想法的话，我觉得后端学什么都挺好；但是如果你是打算吃后端这碗饭，我个人还是首推Java的。</p><p>但是Java写起项目来，仪式感真是太强了（贬义），对新人极度不友好。有时候别说是新人了，那种充满了仪式感的样板语言，还有言Java必Spring的无脑式安利，对老人也是一种摧残。</p><h3 id="-spring-">这里我推荐几个框架，让大家从Spring的樊笼中解放出来</h3><ol><li> <a href="https://sparkjava.com">SparkJava</a></li></ol><ul><li>上手难度：★☆☆☆☆</li><li>学习曲线：★☆☆☆☆</li><li>功能强大：★★☆☆☆</li><li>场景推荐：入门学习或者个人微型项目使用</li></ul><p>2. &nbsp; &nbsp;<a href="https://micronaut.io">Micronaut</a></p><ul><li>上手难度：★★☆☆☆</li><li>学习曲线：★★★☆☆</li><li>功能强大：★★★★☆</li><li>场景推荐：有Java Web开发经验的团队使用</li></ul><p>3. &nbsp; &nbsp; <a href="https://vertx.io">Vert.x</a></p><ul><li>上手难度：★☆☆☆☆</li><li>学习曲线：★★★☆☆</li><li>功能强大：★★★★★</li><li>场景推荐：有异步编程基础的个人或团队，需要应对高并发项目使用</li></ul><p>4. &nbsp; &nbsp;<a href="https://quarkus.io">Quarkus</a></p><ul><li>上手难度：★★☆☆☆</li><li>学习曲线：★★★★☆</li><li>功能强大：★★★★★</li><li>场景推荐：离不开Java生态，团队战力强，做云原生项目使用</li></ul><p>以上几款框架都是发展态势非常好的框架，笔者多多少少也在项目里用过，所以就根据自己的经验做了推荐。具体还得各位看看文档，自己斟酌食用。</p><p>当你打开上面几个框架的官网，应该还会发现另外一个有意思的事情——几乎这些框架都支持多种语言。我个人最喜欢Vert.x，它也是最神勇的一个。来看看它支持的语言吧，下面是其官网的截图：</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/11/16054538781615-1.jpg" class="kg-image" alt="16054538781615-1" width="1150" height="378" loading="lazy"></figure><p>醒目的“Polyglot”，相当给力的多语言支持。这又是怎么回事呢？咱们开始下一个议题。</p><h4 id="java-java">Java不止Java</h4><p>我们都知道Java程序实际上是靠Java虚拟机，也就是JVM解释执行Java字节码运行的（当然也有例外，这个以后有机会展开说）。所以用什么语言写代码其实反而没那么重要，只要最后经过编译，能搞成字节码在JVM上执行就行了。微软也是这么干的鼻祖，近几年前端JS、TS也得编译编译，最后被浏览器执行，我觉得也都是这么个意思。</p><p>那么，在Java生态里，可以编译成字节码被JVM运行的语言有多少呢？我列几个给大家看看：</p><ul><li>Ruby对应的JRuby</li><li>Python对应JPython</li><li>Groovy</li><li>Scala</li><li>Clojure</li><li>Kotlin</li></ul><p>上面这几个兄弟，在JVM面前，跟老大哥Java语言基本上也平起平坐了，用起来都算方便的。可以根据自己的经验，比如之前用Ruby、Python什么的可以继续用着；而搞科研的一般Scala用得比较多，不过你要是没听过，基本也就别用了，曲高和寡啊；Kotlin现在如日中天，如果你除了是全栈，也想搞搞全端开发，Kotlin还是很推荐的；我自己呢，Groovy用得比较多，这是一款动静两相宜的语言，用过都说好。</p><p>对比一下上一小节的图片，唯独少了JavaScript，这又是怎么回事呢？这个又是个有意思的事了。</p><h4 id="java-javascript">Java与JavaScript</h4><p>网上经常拿雷锋与雷峰塔类比这哥俩，我是觉得说得有点太伤感情了。毕竟Java与JavaScript还是有不少历史渊源的，至少后者当年定名是为了蹭Java的热度来的，有兴趣的小伙伴可以自己查查当年的故事，也是不错的。</p><p>更何况现在地球人都知道Java是Oracle的，毕竟Oracle因为Google Android侵权Java而起诉的事情闹得沸沸扬扬也有年头了——9行代码引出的血案。但是JavaScript的商标属于哪个公司，不知道大家都知道么？<strong>答案还是Oracle</strong>。</p><p>上面都是些历史或者商业上的事，跟技术到底有啥关系呢？其实也没啥关系。不过在JVM里面有个叫<strong>Nashorn</strong>的东西又是一个超神的存在，它居然是一个嵌在JVM里面的JavaScript引擎。说白了，JavaScript代码是可以跑在Java环境下的。来看下面的例子：</p><pre><code class="language-javascript">var hello = function() {
  print("Hello Nashorn!");
};

hello();</code></pre><p>把上面的内容保存到hello.js文件里。如果你的电脑装过Java，可以通过<strong>jjs</strong>命令调用上面的脚本文件，如图：<br></p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/11/16054567055477-1.jpg" class="kg-image" alt="16054567055477-1" width="265" height="145" loading="lazy"></figure><p><br>惊不惊喜，意不意外？不过如果你安装了最新版本的Java 15的话，就不用了这个功能了，因为这个功能在15里被拿掉了。不过，考虑这个叫Nashorn的引擎从Java 8开始就一直存在了，至少从2014年到现在也有6年了，事实上不论是JavaScript程序员还是Java程序员都极少知道它的存在，建议你现在可以就地问问你身边写Java代码的朋友知不知道这回事；）</p><h4 id="-">结语</h4><p>好奇心重的小伙伴可能会问了：Nashorn被拿掉之后，Oracle难道就没什么后着？还有前面说Java主要就是JVM解释字节码执行代码的时候，留了个伏笔，暗示还有不一样的玩法存在。下一回，我来给大家讲讲目前一个超级有意思的项目，一个既能颠覆Java自己，又能影响整个语言生态的东西——<strong>GraalVM</strong>。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 为什么有这么多编程语言？ ]]>
                </title>
                <description>
                    <![CDATA[ 现在有很多编程语言，而且每隔几年就会开发出更多的语言。我们有 Python、JavaScript、PHP、C++、Ruby、Java、C#，还有太多太多无法在此一一列举。 所以你可能想知道——为什么有这么多编程语言，我们需要所有这些语言吗？ 在本文中，你将了解为什么开发人员不断创造更多的编程语言，以及如何选择要学习的语言。 技术和编程语言的演变 我们拥有这么多编程语言的第一个也是最大的原因是技术一直在发展。随着更多技术的出现和进步，我们需要更多的工具来为这些技术制作软件。 由于语言能力的限制，我们目前拥有的编程语言可能无法处理出现的特定问题。这个问题可能非常独特，以至于没有现存的解决方案可以满足它的需求，因此人们或公司决定自己创建一种新语言。 以下是根据特定需求开发的一些值得注意的编程语言示例：  1. C 语言——Dennis Ritchie 和贝尔实验室于 1972 年创建了 C，以克服旧语言的问题。他们首先用它来运行 Unix     操作系统。今天，它几乎可以在所有类型的软件和硬件上运行。  2. C++——Bjarne Stroustrup 在 1985 年创建  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/why-are-there-so-many-programming-languages/</link>
                <guid isPermaLink="false">6141d278b201730648bda19f</guid>
                
                    <category>
                        <![CDATA[ 编程语言 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Wed, 22 Sep 2021 03:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/09/joshua-coleman-fXls-tVemno-unsplash.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>现在有很多编程语言，而且每隔几年就会开发出更多的语言。我们有 Python、JavaScript、PHP、C++、Ruby、Java、C#，还有太多太多无法在此一一列举。</p><p>所以你可能想知道——为什么有这么多编程语言，我们需要所有这些语言吗？</p><p>在本文中，你将了解为什么开发人员不断创造更多的编程语言，以及如何选择要学习的语言。</p><h2 id="-">技术和编程语言的演变</h2><p>我们拥有这么多编程语言的第一个也是最大的原因是技术一直在发展。随着更多技术的出现和进步，我们需要更多的工具来为这些技术制作软件。</p><p>由于语言能力的限制，我们目前拥有的编程语言可能无法处理出现的特定问题。这个问题可能非常独特，以至于没有现存的解决方案可以满足它的需求，因此人们或公司决定自己创建一种新语言。</p><p>以下是根据特定需求开发的一些值得注意的编程语言示例：</p><ol><li><strong>C 语言</strong>——Dennis Ritchie 和贝尔实验室于 1972 年创建了 C，以克服旧语言的问题。他们首先用它来运行 Unix 操作系统。今天，它几乎可以在所有类型的软件和硬件上运行。</li><li><strong>C++</strong>——Bjarne Stroustrup 在 1985 年创建 C++ 主要有两个原因。第一个原因是为了升级 C 语言的功能，第二个原因是为了让每个人都可以在各个领域使用它。</li><li>PHP – PHP 由 Rasmus Lerdorf 于 1994 年创建，他最初将其用于个人项目，后来他改进了语言并将其发布给公众，开发人员开始大量使用它进行 Web 开发。</li><li><strong>Go 语言</strong>——谷歌在 2009 年创建了 Go 语言，因为他们当时使用的语言对于某些任务来说太慢且不方便。此外，谷歌想要一种性能快速但仍然相对易于阅读的编程语言。</li><li><strong>JavaScript</strong> —— Netscape 在 1995 年创建了 JavaScript。他们最初为前端开发创建 JavaScript，因此 Web 开发人员和设计人员都可以在短时间内学习和创建网站功能。现在我们将它用于后端、前端和移动开发。</li></ol><h2 id="--1">不同类型的开发人员工作需要不同的语言</h2><p>我们拥有这么多编程语言的另一个原因是，有不同类型的开发人员工作需要不同的工具。</p><p>把它想象成一个医生和他们的病人。医生的工作是治疗病人。有不同种类的疾病和伤害，每一种都足够复杂，可以用不同的疗法来治疗。因此，医生专注于某些领域，例如心脏病学、牙科、外科等。</p><p>对于程序员来说也是如此。由于有不同种类的软件和平台，每一种都需要自己的工具和功能，程序员可以像医生一样专攻。</p><p>以下是一些开发人员的工作以及他们使用的主要编程语言：</p><ul><li>游戏开发人员使用 C++ 或 C# 为 PC 和控制台制作视频游戏。</li><li>Web 开发人员使用 HTML、CSS、JavaScript 和 PHP 来制作网站和 Web 应用程序。</li><li>移动应用程序开发人员使用 Java 和 Kotlin 制作 Android 应用程序或使用 Swift 制作 iOS 应用程序。</li><li>软件开发人员使用 C++、C# 和 Java 来制作桌面应用程序、业务应用程序和系统软件。</li><li>数据科学家使用 Python、R 和 MatLab 来分析用于科学研究和教育目的的数据。</li></ul><p>这些不是你可以用来执行这些任务的唯一语言，只是一些最常用的示例。</p><h2 id="--2">开发人员对他们的项目有不同的需求和目标</h2><p>编程语言如此之多的第三个原因是，并非所有语言都能满足开发人员或公司的目标。不同的开发人员有自己的目标和优先级，有些编程语言比其他语言更适合某些类型的任务。</p><ul><li>一些开发人员想要一种超级快速和高性能的编程语言，欢迎使用 Go 语言或 C++。这些语言支持对系统资源（如内存和线程）进行非常精细的控制。</li><li>其他开发人员想要一种可以在几天而不是几周内构建程序的编程语言。向 JavaScript 问好！很难找到一种更通用的语言。<a href="https://learn.coderslang.com/0102-what-can-i-do-with-javascript/">你可以在从后端到 Web 和移动应用程序的任何地方使用 JS</a>。</li><li>然后，一些开发人员更喜欢针对特定任务的编程语言。2021 年，大量数据科学将使用 Python 交付。</li><li>最后，一些开发人员想要一种有趣的编程语言，试试 Haskell 或 Lisp，让我知道它是怎么回事:)</li></ul><h2 id="--3">如何选择编程语言</h2><p>既然你已经了解了为什么有这么多编程语言，那么接下来你可能还会问一个问题：</p><p>我应该学习哪种编程语言？</p><p>幸运的是，有一个非常简单的答案：与其着眼于编程语言本身，不如考虑你的最终目标。</p><p>你想从事什么类型的编程工作？你想构建什么？你所在地区的职位发布需要什么？一旦你查看了这些因素，你就可以选择一种可以帮助你实现目标的编程语言。</p><p>例如，如果你的目标是制作专业网站，那就学习 HTML、CSS 和 JavaScript。</p><p>如果你想进入游戏开发领域，那就去学习 C++ 和 C#。</p><p>或者，如果你希望在移动应用程序方面开始你的职业生涯，你就应该查看适用于 iOS 应用程序的 Swift 和适用于 Android 应用程序的 Java 或 Kotlin。</p><h2 id="--4"><strong>总结</strong></h2><p>总而言之，有许多编程语言的主要原因是不同的问题需要不同的工具来解决。每种编程语言都具有使其适用于特定任务的某些特性和特点。</p><p>就像医生的工作如何划分为不同的专业，每个专业都解决复杂的问题并使用适合其工作的工具一样，编程也是如此。</p><p>我希望这篇文章已经回答了你的问题，并让你更好地了解为你的程序员职业选择哪种编程语言。</p><p>如果你想了解更多信息，可以获取我的<a href="https://learn.coderslang.com/free-ebooks/">免费电子书</a>以准备技术面试或开始<a href="https://js.coderslang.com/">学习全栈 JavaScript</a>。</p><p>原文：<a href="https://www.freecodecamp.org/news/why-are-there-so-many-programming-languages/">Why Are There So Many Programming Languages?</a>，作者：<a href="https://www.freecodecamp.org/news/author/coderslang/">Vasyl Lagutin</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JavaScript 语言通识 ]]>
                </title>
                <description>
                    <![CDATA[ 通过这个系列的文章，我们在过去的知识里面建立一个新的秩序，也就是建立知识体系。在重学 JavaScript 的过程中，我们以 JavaScript 的语法为线索，从细到粗地完整学习一遍 JavaScript 的语言知识。 语言按语法分类 首先这里我们先讲一讲泛用的语言的分类学，在我们平时说话，我们讲的是中文，当我们去国外留学或者旅游，我们都会需要讲英文。不知道大家有没有这种经历，在国外时因为英文不是很好的时候，我们会把关键词凑起来这么一说，然后语法也不对，但是老外也听懂了。比如说 “很久不见”，我们就会说 "long time no see"，然后老外还觉得挺好用的，所有他们也就加语言里面了。 这类的语言有一个特点，就是它的语法没有一个严格的定义，所以我们叫它做 “非形式化语言”，典型的代表就是我们平时说的这些。 在计算机里面，大部分的语言都是 “形式语言” —— 形式语言它的特性是有一个形式化定义，它是非常的严谨严格。 然后在形式语言里面也是分类的，这里给大家讲一下其中一种就是 “乔姆斯基谱系”。 > 乔姆斯基谱系 [https://zh.wikipedia.org/wik ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/javascript-language-analysis/</link>
                <guid isPermaLink="false">5f96af925f583f0565090b9a</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 编程语言 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 前端开发 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ 三钻 ]]>
                </dc:creator>
                <pubDate>Mon, 31 May 2021 11:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/10/marc-mintel-Q-ioK6NPFos-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>通过这个系列的文章，我们在过去的知识里面建立一个新的秩序，也就是建立知识体系。在重学 JavaScript 的过程中，我们以 JavaScript 的语法为线索，从细到粗地完整学习一遍 JavaScript 的语言知识。</p><!--kg-card-begin: markdown--><h1 id="">语言按语法分类</h1>
<p>首先这里我们先讲一讲泛用的语言的分类学，在我们平时说话，我们讲的是中文，当我们去国外留学或者旅游，我们都会需要讲英文。不知道大家有没有这种经历，在国外时因为英文不是很好的时候，我们会把关键词凑起来这么一说，然后语法也不对，但是老外也听懂了。比如说 “很久不见”，我们就会说 "long time no see"，然后老外还觉得挺好用的，所有他们也就加语言里面了。</p>
<p>这类的语言有一个特点，就是它的语法没有一个严格的定义，所以我们叫它做 “<strong>非形式化语言</strong>”，典型的代表就是我们平时说的这些。</p>
<p>在计算机里面，大部分的语言都是 “<strong>形式语言</strong>” —— 形式语言它的特性是有一个形式化定义，它是非常的严谨严格。</p>
<p>然后在形式语言里面也是分类的，这里给大家讲一下其中一种就是 “<strong>乔姆斯基谱系</strong>”。</p>
<blockquote>
<p><a href="https://zh.wikipedia.org/wiki/%E4%B9%94%E5%A7%86%E6%96%AF%E5%9F%BA%E8%B0%B1%E7%B3%BB">乔姆斯基谱系</a>：是计算机科学中刻画形式文法表达能力的一个分类谱系，是由诺姆·乔姆斯基于 1956 年提出的。它包括四个层次.</p>
<ul>
<li>非形式化语言
<ul>
<li>中文，英文</li>
</ul>
</li>
<li>形式化语言 （乔姆斯基谱系）
<ul>
<li>0-型：无限制文法 —— <em>只要定义清楚了语言是什么样的</em></li>
<li>1-型：上下文相关文法 —— <em>同样的一个词、句的组合，它的上文、下文和内容相关的</em></li>
<li>2-型：上下文无关文法 —— <em>同样一个表达，不管放到哪里都是一样的意思</em></li>
<li>3-型：正则文法 —— <em>能够被正则表达式去描述的一种文法</em></li>
</ul>
</li>
</ul>
<p>在乔姆斯基谱系里面 0123 是一种包含关系，就是说一个上下文相关文法，它一定也属于 0-型，但是反过来就不一定了。</p>
</blockquote>
<h1 id="bnf">什么是产生式？（BNF）</h1>
<blockquote>
<ul>
<li>产生式： 在计算机中指 Tiger 编译器将源程序经过词法分析（Lexical Analysis）和语法分析（Syntax Analysis）后得到的一系列符合文法规则（Backus-Naur Form，BNF）的语句</li>
<li><a href="https://zh.wikipedia.org/wiki/%E5%B7%B4%E7%A7%91%E6%96%AF%E8%8C%83%E5%BC%8F">巴科斯诺尔范式</a>：即巴科斯范式（英语：Backus Normal Form，缩写为 BNF）是一种用于表示上下文无关文法的语言，上下文无关文法描述了一类形式语言。它是由约翰·巴科斯（John Backus）和彼得·诺尔（Peter Naur）首先引入的用来描述计算机语言语法的符号集。</li>
<li>终结符： 最终在代码中出现的字符（ <a href="https://zh.wikipedia.org/wiki/%E7%B5%82%E7%B5%90%E7%AC%A6%E8%88%87%E9%9D%9E%E7%B5%82%E7%B5%90%E7%AC%A6"></a> <a href="https://zh.wikipedia.org/wiki/">zh.wikipedia.org/wiki/</a> 終結符與非終結符)</li>
</ul>
</blockquote>
<ul>
<li>用尖括号（<code>&lt;</code>, <code>&gt;</code>）括起来的名称来表示语法结构名</li>
<li>语法结构分成基础结构和需要用其他语法结构定义的复合结构
<ul>
<li>基础结构称终结符</li>
<li>复合结构称非终结符</li>
</ul>
</li>
<li>引号和中间的字符表示终结符</li>
<li>可以有括号</li>
<li><code>*</code> 表示重复多次</li>
<li><code>|</code> 表示 “或”</li>
<li><code>+</code> 表示至少一次</li>
</ul>
<h2 id="">案例：</h2>
<p>我们来用 BNF 来表述一下大家比较熟悉的四则运算。</p>
<ul>
<li>四则远算是：1 + 2 * 3</li>
<li>这里面的总结符：
<ul>
<li>Number</li>
<li><code>+</code>、<code>-</code>、<code>*</code>、<code>/</code></li>
</ul>
</li>
<li>非终结符
<ul>
<li>MultiplicativeExpression</li>
<li>AdditiveExpression</li>
</ul>
</li>
</ul>
<p>小时候我们学的四则运算是加减乘除，实际上它是有一个优先级的关系的。我们可以理解为一个 <code>1+2x3</code>的连加法当中，可以拆分成一个 <code>1</code>和 <code>2x3</code>组成的。那么 <code>2x3</code> 是它的子结构，然后 <code>2</code> 和 <code>3</code>，就是这个结构中的 <code>Number</code>，然后中间就是运算符 <code>*</code>。</p>
<p>所以用 BNF 去描述这个远算的时候，首先我们会定义一个<code>加法表达式</code>，格式就是：</p>
<ul>
<li><code>乘法表达式的列表</code> 或</li>
<li><code>加法表达式</code> + <code>乘法表达式</code> 或</li>
<li><code>加法表达式</code> - <code>乘法表达式</code></li>
</ul>
<blockquote>
<p>因为 BNF 是可以递归的，所以在定义表达式的时候，可以使用自身的表达式。</p>
</blockquote>
<p>那么乘法也是类似，只不过那加法中乘法的表达式换成了 <code>Number</code> 就可以了：</p>
<ul>
<li><code>Number</code> 或</li>
<li><code>乘法表达式</code> * <code>Number</code> 或</li>
<li><code>乘法表达式</code> / <code>Number</code></li>
</ul>
<p>最后我们看看用代码是怎么写的：</p>
<pre><code>&lt;MultiplicativeExpression&gt;::=&lt;Number&gt; |
    &lt;MultiplicativeExpression&gt; "*" &lt;Number&gt; |
    &lt;MultiplicativeExpression&gt; "/" &lt;Number&gt; |


</code></pre>
<h1 id="">深入了解产生式</h1>
<p>这里我们来尝试通过产生式，来深入理解一下前面讲到的乔姆斯基谱系。</p>
<blockquote>
<p>终结符： 最终在代码中出现的字符<a href="https://zh.wikipedia.org/wiki/%E7%B5%82%E7%B5%90%E7%AC%A6%E8%88%87%E9%9D%9E%E7%B5%82%E7%B5%90%E7%AC%A6">zh.wikipedia.org/wiki/ 終結符與非…</a></p>
</blockquote>
<ul>
<li><strong>0-型：无限制文法</strong>
<ul>
<li>产生式：<code>?</code>::=<code>?</code></li>
<li>在无限制文法当中是可以产生多个非终结符</li>
<li>所以在无限制文法里面是可以随便写</li>
</ul>
</li>
<li><strong>1-型：上下文相关文法</strong>
<ul>
<li>产生式：<code>?</code><a><code>?</code>::=<code>?</code><b><code>?</code></b></a></li><a><b>
<li>对产生的书写做出了一定的限制</li>
<li>可以在左边右边的<code>?</code>中写多个非终结符</li>
<li>但是可变化的只能是前面与后面，并且是有关系的</li>
<li>而中间一定是有一个固定的不变的部分</li>
<li>所以 <code>&lt;A&gt;</code> 前面的 <code>?</code> 就是上文，后面的 <code>?</code> 就是下文</li>
</b></a></ul><a><b>
</b></a></li><a><b>
</b></a><b><li><a><strong>2-型：上下文无关文法</strong>
</a><ul><a>
</a><li><a>产生式：</a><a>::=<code>?</code></a></li><a>
<li>左边的 <code>&lt;A&gt;</code> 一定是一个非终结符</li>
<li>右边的 <code>?</code> 就是可以随便写，可以是一大堆终结符或者混合终结符和非终结符</li>
</a></ul><a>
</a></li><a>
</a><li><a><strong>3-型：正则文法</strong>
</a><ul><a>
</a><li><a>产生式：</a><a>::=</a><a><code>?</code> ✅, </a><a>::=?</a><a> ❌</a></li><a>
<li>正则文法式有要求的</li>
<li>假如说正则文法式递归定义的，那么它不允许你这个定义 A 出现在尾巴上</li>
</a><li><a>如果左边的符号 </a><a> ，那么右边一定要出现在产生式的最开头的</a></li><a>
<li>根据这个规则，所有的正则文法都是可以被正则表达式来表示的</li>
</a></ul><a>
</a></li><a>
</a></b></ul><b><a>
<blockquote>
<p>那 JavaScript 是<strong>上下文相关文法</strong>，<strong>上下文无关文法</strong>还是<strong>正则无关文法</strong>？</p>
</blockquote>
<p>JavaScript 总体上属于上下文无关文法，其中的表达式部分大部分属于正则文法，但是这里面是有两个特例的：</p>
<ol>
<li>JavaScript 的表达式里面有新加一个<code>**</code> 运算符，<code>**</code> 表示乘方
<ul>
<li>乘方运算符其实是右结合的 ，比如说 2 ** 1 ** 2 结果是 2</li>
<li>这里是因为 1 ** 2 是先计算的，1 的 2 次方是 1，然后 2 的 1 次方是2，所以最后结果是 2 而不是 4</li>
<li>所以因为它是右结合的，就不是一个正则文法</li>
<li>如果 if 这些判断加入的话，就更加不是正则文法了</li>
</ul>
</li>
<li>比如说 <code>get</code>
<ul>
<li>如果我们在写成 <code>get a {return 1}</code> 那 get 就类似关键字的东西</li>
<li>但是如果我们在 <code>get</code> 后面加入 <code>:</code>，那 get 本身就是属性名了</li>
</ul>
</li>
</ol>
<p>所以如果我们严格按照乔姆斯基谱系来理解，那么 <strong>JavaScript 是属于上下文相关文法</strong>。在 JavaScript 引擎的实现上，可以理解为众体的编程的结构，都是一个针对上下文无关文法的，一旦遇到像 <code>get</code> 这样的上下文相关的地方，那么就会单独的用代码做一些特例处理。所以一般来说也就不会把 JavaScript 归类为上下文相关文法去处理。</p>
<h2 id="">其他产生式</h2>
<p>除了乔姆斯基谱系可以用 BNF 来定义，其实还有很多的不同的产生式的类型。比如说后来出现的 EBNF、ABNF，都是针对 BNF 的基础上做了语法上的扩张。所以一般来说每一个语言的标准里面，都会自定义一个产生式的书写方式。</p>
<p>比如说 JavaScript 中也是：</p>
<pre><code>AdditiveExpression:
    MultiplicativeExpression
    AdditiveExpression +
MultiplicativeExpression
    AdditiveExpression -
MultiplicativeExpression

</code></pre>
<blockquote>
<p>它的开头是用<strong>缩进</strong>来表示的，就是相当于<strong>产生式左边的非终结符</strong>，非终结符之后跟着一个冒号，之后给了两个空格的缩进。然后在 JavaScript 的标准中，它的非终结符，加号、减号是用加粗的黑字体来表示终结符的。<strong>所以网上的产生式是五花八门的，只学一个 BNF 是无法读懂所有的语言的</strong>。虽然所他们都有不一样的标准和写法，但是它们所表达的意思大致上都是一样的。<strong>所以我们需要理解产生式背后的思路和原理，那么我们是可以忽略表达式上的区别的。</strong></p>
</blockquote>
<h1 id="">现代语言的分类</h1>
<h2 id="">现代语言的特例</h2>
<ul>
<li>
<p><strong>C++</strong> 中，<code>*</code> 可能表达乘号或者指针，具体是哪个，取决于星号前面的标识符是否被声明为类型</p>
</li>
<li>
<p><strong>VB</strong> 中，<code>&lt;</code> 可能是小于号，也可能是 XML 直接量的开始，取决于当前位置是否可以接受XML直接量；</p>
</li>
<li>
<p><strong>Python</strong> 中，行首的 <code>tab</code> 符和空格会根据上一行的行首空白以一定规则被处理成虚拟终结符 indent 或者 dedent；</p>
</li>
<li>
<p><strong>JavaScript</strong> 中，<code>/</code> 可能是除号，也可能是正则表达式开头，处理方式类似于 VB，字符串模版中也需要特殊处理 <code>}</code>，还有自动插入分号规则；</p>
<h2 id="">语言的分类</h2>
</li>
</ul>
<p><strong>形式语言 —— 用途</strong></p>
<ul>
<li>数据描述语言 —— 有些时候我们需要去存储一个纯粹的数据，本身是没有办法进行编程的
<ul>
<li>JSON, HTML, XAML, SQL, CSS</li>
</ul>
</li>
<li>编程语言
<ul>
<li>C, C++, Java, C#, Python, Ruby, Perl, PHP, Go, Perl, Lisp, T-SQL, Clojure, Haskell, JavaScript, CoffeeScriptx</li>
</ul>
</li>
</ul>
<p><strong>形式语言 —— 表达方式</strong></p>
<ul>
<li>声明式语言
<ul>
<li>JSON, HTML, XAML, SQL, CSS, Lisp, Clojure, Haskell</li>
</ul>
</li>
<li>命令型语言
<ul>
<li>C, C++, Java, C#, Python, Ruby, Perl, JavaScript</li>
</ul>
</li>
</ul>
<h1 id="">编程语言的性质</h1>
<h2 id="">图灵完备性</h2>
<ul>
<li>命令式 —— 图灵机
<ul>
<li>goto</li>
<li>if 和 while</li>
</ul>
</li>
<li>声明式 —— lambda
<ul>
<li>递归</li>
</ul>
</li>
</ul>
</a><blockquote><a>
</a><ul><a>
</a><li><a></a><a href="https://zh.wikipedia.org/wiki/%E5%9C%96%E9%9D%88%E5%AE%8C%E5%82%99%E6%80%A7">图灵完备性</a>：在可计算性理论里，如果一系列操作数据的规则（如指令集、编程语言、细胞自动机）可以用来模拟单带图灵机，那么它是图灵完全的。这个词源于引入图灵机概念的数学家艾伦·图灵。虽然图灵机会受到储存能力的物理限制，图灵完全性通常指“具有无限存储能力的通用物理机器或编程语言”。</li>
<li><a href="https://zh.wikipedia.org/wiki/%E5%9B%BE%E7%81%B5%E6%9C%BA">图灵机（Turing machine）</a>：又称确定型图灵机，是英国数学家艾伦·图灵于 1936 年提出的一种将人的计算行为抽象掉的数学逻辑机，其更抽象的意义为一种计算模型，可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。</li>
</ul>
</blockquote>
<h2 id="">动态与静态</h2>
<ul>
<li>动态：
<ul>
<li>在用户的设备 / 在线服务器上运行</li>
<li>时机：产品实际运用时</li>
<li>术语：Runtime（运行时）</li>
</ul>
</li>
<li>静态：
<ul>
<li>在程序员的设备上运行</li>
<li>时机：产品开发时</li>
<li>术语：Compiletime（编译时）</li>
</ul>
</li>
</ul>
<blockquote>
<p>JavaScript 这种解释执行的语言，它是没有 Compiletime 的。我们现在也会用到 Webpack 去 build 一下我们的代码，但是实际上还是没有 Compiletime 的。所以说，今天的 Runtime 和 Compiletime 的对应已经不准确了，但是我们依然会愿意沿用 Compiletime 的习惯，因为 JavaScript 它也是 “Compiletime（开发时）” 的一个时间，所以也会用 Compiletime 这个词来讲 JavaScript 里面的一些特性。</p>
</blockquote>
<h2 id="">类型系统</h2>
<ul>
<li><strong>动态类型系统</strong> —— 在用户机器上可以找到的类型时
<ul>
<li>JavaScript就是动态类型系统</li>
</ul>
</li>
<li><strong>静态类型系统</strong> —— 只在程序员编写代码的时候可以找到的类型时
<ul>
<li>C++最终编译到目标的机器的代码的时候，所有的类型信息都被丢掉了</li>
</ul>
</li>
<li><strong>半动态半静态类型系统</strong> —— 比如 Java 一类的语言提供了反射机制
<ul>
<li>在编译时主要的类型检查和类型的操作，都已经在编译时被处理掉了</li>
<li>但是如果你想在运行时去获得类型信息，还是可以通过反射去获取的</li>
</ul>
</li>
<li><strong>强类型与弱类型</strong> —— 说明在编程语言里类型转换发生的形式
<ul>
<li>强类型： 无隐式转换（类型转化是不会默认发生的）</li>
<li>弱类型： 有隐式转换（JavaScript 就是典型的弱类型的语言，默认把 Number 转换成 String 类型然后相加后给你得到一个 String 类型，还有 String 和 Boolean 双等运算，会先把 Boolean 转成 Number 然后再跟 String 去做是否相同的对比）</li>
</ul>
</li>
<li><strong>复合类型</strong>
<ul>
<li>结构体</li>
<li>函数签名（包含参数类型和返回值类型两个部分）</li>
</ul>
</li>
<li><strong>子类型</strong> —— 典型的语言就是 C++（在做类型转换的时候，会有一些默认的行为）</li>
<li><strong>范型</strong>
<ul>
<li>协变与逆变：[ <a href="https://jkchao.github.io/typescript-book-chinese/tips/covarianceAndContravariance.html%5D(https://jkchao.github.io/typescript-book-chinese/tips/covarianceAndContravariance.html)">jkchao.github.io/typescript-…</a></li>
<li>协变例子：凡是能用范型数组 <code>Array &lt;Parent&gt;</code> 的地方都能用 <code>Array &lt;Child&gt;</code></li>
<li>逆变例子：凡是能用 <code>Function &lt;Child&gt;</code> 的地方，都能用 <code>Function &lt;Parent&gt;</code></li>
</ul>
</li>
</ul>
<h1 id="">一般命令式编程语言的设计方式</h1>
<p>一般来说我们的命令式语言可能有一些细微的结构上的不一致，但是它总体上来讲会分成5个层级。</p>
<ul>
<li>原子级（Atom）—— 一个语言的最小的组成单位
<ul>
<li>关键字（Identifier）</li>
<li>字符/数字的直接量（Literal）</li>
<li>变量名（Variables）</li>
</ul>
</li>
<li>表达式（Expression）—— 原子级结构通过运算符相连接和辅助符号形成
<ul>
<li>原子单位（Atom）</li>
<li>操作符（Operator）—— 加减乘除，拼接符等等</li>
<li>语法符（Punctuator）</li>
</ul>
</li>
<li>语句（Statement）—— 表达式加上特定的标识符、关键字、符号形成一定的结构
<ul>
<li>表达式（Expression）</li>
<li>关键字（Keyword）</li>
<li>语法符（Punctuator）</li>
</ul>
</li>
<li>结构化（Structure）—— 帮助我们组织、分块、分成不同的复用结构
<ul>
<li>函数（Function）</li>
<li>类（Class）</li>
<li>过程（Process）—— PASCAL 语言就会有 Process 的概念</li>
<li>命名空间（Namespace）—— C++ / PHP 中就会有 Namespace 的概念</li>
</ul>
</li>
<li>程序（Program）—— 管理语言模块和安装
<ul>
<li>程序（Program）—— 实际执行的代码</li>
<li>模块（Module）—— 准备好被复用的模块</li>
<li>包（Package）</li>
<li>库（Library）</li>
</ul>
</li>
</ul>
<p>我们对每一个层级的讲解方式都会有一个，比较固定的结构。对每一个层级来说我们是以语法作为线索，但是实际上除了语法，重点讲的是语义和进行时。</p>
<p>所谓 “语义” 就是在实行上在用户使用的时候是什么样子的。前端工程师最关心的就是，我们写什么样的语法，最后变成用户的电脑上运行时什么样子的，这是我们的变成过程。</p>
<p>而中间连接语法运行时，正是这个语言的语义。我们通过一定的语法表达一定的语义，最后改变了运行时的状态。</p>
<!--kg-card-end: markdown--></b> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 两种流行编程语言 Python 和 JavaScript 的主要区别是什么？ ]]>
                </title>
                <description>
                    <![CDATA[ 欢迎！如果你想了解 Python 和 JavaScript 的区别，这篇文章就是为你准备的。 这两门语言都很流行，也很强大，但是它们有一些区别。这里会详细介绍。 在这篇文章里，你会学到：  * 现实中 Python 和 JavaScript 的应用场景。  * Python 和 JavaScript 句法和函数的区别。 开始吧  ✨ 🔹 Python VS JavaScript: 真实世界的应用领域 我们会快速看一下它们在现实中的应用领域。 Python 得益于 Python 的功能强大和灵活多变，它已成为全球几乎所有科学领域中必不可少的工具。 它是一种通用的编程语言，支持不同的编程范式。 Python 广泛应用于科学和特定领域，包括数据科学、人工智能、机器学习、计算机科学教育、计算机视觉和图像处理、医学、生物甚至是天文学。 Python 也可以用于 web 开发。我们要和 JavaScript 应用对比的就是 Python 的 web 应用。Python 可以用于后端开发，后端开发的程序是 web 开发里用户直接看不到的部分，比如服务端应用程序。 JavaSc ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/python-vs-javascript-what-are-the-key-differences-between-the-two-popular-programming-languages/</link>
                <guid isPermaLink="false">603badf6c354c605689eaa42</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 编程语言 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ ZhichengChen ]]>
                </dc:creator>
                <pubDate>Sun, 28 Feb 2021 09:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/02/Python-vs.-JavaScript-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong>欢迎</strong>！如果你想了解 Python 和 JavaScript 的区别，这篇文章就是为你准备的。</p>
<p>这两门语言都很流行，也很强大，但是它们有一些区别。这里会详细介绍。</p>
<p><strong>在这篇文章里，你会学到：</strong></p>
<ul>
<li>现实中 Python 和 JavaScript 的应用场景。</li>
<li>Python 和 JavaScript 句法和函数的区别。</li>
</ul>
<p><strong>开始吧</strong>  ✨</p>
<h2 id="pythonvsjavascript">🔹 Python VS JavaScript: 真实世界的应用领域</h2>
<p>我们会快速看一下它们在现实中的应用领域。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-187.png" alt="image-187" width="600" height="400" loading="lazy"></p>
<h3 id="python">Python</h3>
<p>得益于 Python 的功能强大和灵活多变，它已成为全球几乎所有科学领域中必不可少的工具。 它是一种通用的编程语言，支持不同的编程范式。</p>
<p>Python 广泛应用于科学和特定领域，包括数据科学、人工智能、机器学习、计算机科学教育、计算机视觉和图像处理、医学、生物甚至是天文学。</p>
<p>Python 也可以用于 web 开发。我们要和 JavaScript 应用对比的就是 Python 的 web 应用。Python 可以用于后端开发，后端开发的程序是 web 开发里用户直接看不到的部分，比如服务端应用程序。</p>
<h3 id="javascript">JavaScript</h3>
<p>Python 可以用来开发后端应用，JavaScript 既可以开发后端应用也可以开发前端应用。</p>
<p>前端是应用里用户可以看见及交互的部分。当你浏览或者操作网站或者 web 应用时，就使用了 JavaScript。</p>
<p>类似的，当你使用移动应用时，也可能用到了 JavaScript，因为一些框架诸如   <a href="https://reactnative.dev/">React Native</a> 允许我们写一些可以发布到不同平台的移动应用。</p>
<p>JavaScript 在 web 开发里应用的如此广泛也得益于它的灵活性，可以用它来构建各种 web 组件。</p>
<h3 id="pythonjavascript">Python 和 JavaScript 应用领域的区别</h3>
<p>简短来说，开发者经常在科学领域使用 Python。而 JavaScript 则用于 web 开发，用户界面交互以及服务端开发。</p>
<h2 id="pythonvsjavascript">🔸 Python VS JavaScript: 句法</h2>
<p>现在了解了它们的应用领域，来看一看它们写法和句法的不同。</p>
<p>我们会涉及到如下部分：</p>
<ul>
<li>语句块</li>
<li>变量定义</li>
<li>变量命名约定</li>
<li>常量</li>
<li>数据类型和值</li>
<li>注释</li>
<li>内置数据结构</li>
<li>操作符</li>
<li>输入/输出</li>
<li>条件语句</li>
<li>for 循环和 while 循环</li>
<li>函数</li>
<li>面向对象编程</li>
</ul>
<h2 id="pythonjavascript">Python 和 JavaScript 中的语句块</h2>
<p>每种编程语言都有他自己的代码块风格，让我们来看看 Python 和 JavaScript 间代码块的区别：</p>
<h3 id="python">Python 怎样定义代码块</h3>
<p>Python 依赖缩进来定义代码块。当一系列连续的代码行缩进级别相同时，代表它们是同一个代码块。</p>
<p>我们在 Python 中用这种方式来定义条件、函数、循环以及每个基本的语句。</p>
<p>这里是一些例子：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-127.png" alt="image-127" width="600" height="400" loading="lazy"><br>
Python 中使用缩进来定义代码块</p>
<p><strong>💡 提示:</strong>  一会我们会看到 Python 和 JavaScript 中这些语句的区别，目前只关注缩进就好了。</p>
<h3 id="javascript">JavaScript 怎样定义代码块</h3>
<p>JavaScript 使用大括号(<code>{}</code>)来给相同的代码块分组。</p>
<p>这里是一些例子：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-128.png" alt="image-128" width="600" height="400" loading="lazy"><br>
JavaScript 使用大括号来定义代码块</p>
<h2 id="pythonjavascript">Python 和 JavaScript 中的变量定义</h2>
<p>赋值语句在任何编程语言里都是最基础的语句。来看一下 怎样在 Python 和 JavaScript 中定义一个变量。</p>
<h3 id="python">怎样在 Python 中定义一个变量</h3>
<p>在 Python 中定义变量，可以在变量名后跟一个等号(<code>=</code>)和要赋给变量的值。</p>
<p>如下：</p>
<pre><code class="language-python">&lt;variable_name&gt; = &lt;value&gt;
</code></pre>
<p>比如：</p>
<pre><code class="language-python">x = 5
</code></pre>
<h3 id="javascript">怎样在 JavaScript 中定义一个变量</h3>
<p>JavaScript 的句法类似，只需要在变量名前添加关键字 <code>var</code>，然后在行末尾添加一个分号（<code>;</code>）。</p>
<p>如下：</p>
<pre><code>var &lt;variable_name&gt; = &lt;value&gt;;
</code></pre>
<p><strong>💡 提示:</strong>  当使用 <code>var</code>  定义变量时，变量具有函数作用域。</p>
<p>举个例子：</p>
<pre><code>var x = 5;
</code></pre>
<p>也可以使用关键字 <code>let</code>：</p>
<pre><code>let &lt;variable_name&gt; = &lt;value&gt;;
</code></pre>
<p>举个例子：</p>
<pre><code>let x = 5;
</code></pre>
<p><strong>💡 提示:</strong> 在这里，使用 <code>let</code> 关键字，变量具有块级作用域。仅可以在定义它的语句块内可用。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-125.png" alt="image-125" width="600" height="400" loading="lazy"><br>
Python 和 JavaScript 中的变量定义</p>
<p>💡  <strong>提示：</strong> 在 JavaScript 里，语句结尾有一个分号（<code>;</code>）但是在 Python 里，另起一行就代表了语句结束。</p>
<h2 id="pythonjavascript">Python 和 JavaScript 里的变量命名约定</h2>
<p>Python 和 JavaScript 遵循两种不同的变量命名约定。</p>
<h3 id="python">Python 怎么命名变量</h3>
<p>在 Python 里使用 <code>蛇形命名（snake_case）</code>。</p>
<p>根据  <a href="https://www.python.org/dev/peps/pep-0008/#function-and-variable-names">Python 编程规范</a>：</p>
<blockquote>
<p>变量命名遵循和函数命名相同的规范。</p>
<p>函数命名应该 “小写，下划线分割单词” 以提高辨识度。</p>
</blockquote>
<p>因此，Python 里典型的变量命名如下：</p>
<pre><code class="language-python">first_name
</code></pre>
<p>💡  <strong>提示：</strong> 编程规范也提到，如果上下文使用了 <code>mixedCase</code>，那么应该保持风格统一。</p>
<h3 id="javascript">JavaScript 里怎么命名变量</h3>
<p>在 JavaScript 里使用 <code>小驼峰（lowerCamelCase）</code> 命名风格。变量名以小写字母开始，每个新的单词以大写字母开始。</p>
<p>根据 MDN Web 文档的 <a href="https://developer.mozilla.org/en-US/docs/MDN/Guidelines/Code_guidelines/JavaScript#Variable_naming">JavaScript 准则</a>：</p>
<blockquote>
<p>变量命名使用小驼峰。命名应该是简洁的、可读的、语义化的。</p>
</blockquote>
<p>JavaScript 里典型的命名变量如下：</p>
<pre><code class="language-javascript">firstName
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-178.png" alt="image-178" width="600" height="400" loading="lazy"></p>
<h2 id="pythonjavascript">Python和 JavaScript 里的常量</h2>
<p>可。现在已经了解了变量，现在来聊一聊常量。常量的值在程序执行期间不可改变。</p>
<h3 id="python">怎样在 Python 里定义常量</h3>
<p>在 Python 里，用命名约定来定义常量，在语言没有严格的规则来阻止值的改变。</p>
<p>根据  <a href="https://www.python.org/dev/peps/pep-0008/#constants">Python 编程规范</a>：</p>
<blockquote>
<p>常量通常在模块级别定义，单词大写通过下划线分割。</p>
</blockquote>
<p>这是在 Python 里定义常量的命名风格：</p>
<pre><code>CONSTANT_NAME
</code></pre>
<p>比如:</p>
<pre><code class="language-javascript">TAX_RATE_PERCENTAGE = 32
</code></pre>
<p>💡 <strong>提示：</strong> 这对我们自己和其他开发人员来说是一个提示，表示不应在程序中修改此值。但是技术上，这个值还是能被修改的。</p>
<h1 id="javascript">怎样在 JavaScript 中定义常量</h1>
<p>JavaScript 则可以定义不能在程序里修改，无法重新分配修饰符的常量。</p>
<p>但这并不意味着值本身不能改变。</p>
<p>根据  <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const">MDN Web 文档</a> 里的  <code>const</code> 文章：</p>
<blockquote>
<p><code>const</code>  声明创建了值的一个只读引用。这并不意味着值不能改变 — 只是表示修饰符不能重新分配。比如，如果常量引用的是一个对象，这意味着对象的内容（比如，属性）可以改变。</p>
</blockquote>
<p>在常量名称前添加 <code>const</code> 关键字来定义常量：</p>
<pre><code>const TAX_RATE_PERCENTAGE = 32;
</code></pre>
<p>如果尝试改变常量的值，会报错：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-180.png" alt="image-180" width="600" height="400" loading="lazy"></p>
<p>也就是说，常量的值不能改成另一个值。</p>
<p><strong>💡 提示：</strong> 可以在  <a href="https://developers.google.com/web/tools/chrome-devtools/console">Chrome 开发者工具里的控制台</a> 来运行 JavaScript 代码片段。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-181.png" alt="image-181" width="600" height="400" loading="lazy"></p>
<h2 id="pythonjavascript">Python 和 JavaScript 里的数据类型和值</h2>
<p>让我们来看一下 Python 和 JavaScript 的数据类型的区别。</p>
<h3 id="">数值类型</h3>
<p><strong>Python</strong> 具有三种数值类型，可帮助我们更科学的执行精确的计算。 这些数字类型包括：<code>int</code>（整数），<code>float</code>（浮点数）和 <code>complex</code>（复数）。 它们中的每一个都有其自己的属性，特征和应用领域。</p>
<p>而  <strong>JavaScript</strong> 只有两种数值类型：<code>Number</code>  和  <code>BigInt</code>。 <code>Number</code> 既可以是整数也可以是浮点数。</p>
<p>根据 MDN Web 文档的  <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number">Number</a>：</p>
<blockquote>
<p>JavaScript 代码中的数字如 <code>37</code> 是浮点值，而不是整数。 日常使用中没有单独的整数类型。（JavaScript 现在有了 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt">BigInt</a> 类型，但并非旨在用于替换日常使用的 Number 。<code>37</code> 仍然是Number而不是BigInt。）</p>
</blockquote>
<h3 id="nonevsnull">None vs. null</h3>
<p>在 <strong>Python</strong> 中，有一个特殊的值叫做 <strong>None</strong>，我们通常使用它来描述变量在程序中没有值的状态。</p>
<p><strong>JavaScript</strong> 中的等效值是 <code>null</code>，它表示变量指向尚未创建的对象（<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null">源</a>）。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-144.png" alt="image-144" width="600" height="400" loading="lazy"></p>
<h3 id="undefined"><code>undefined</code>  值</h3>
<p>在 <strong>JavaScript</strong> 中，我们有一个特殊值，当我们声明变量而不分配初始值时会自动分配这个特殊值。</p>
<p>这是一个例子：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-142.png" alt="image-142" width="600" height="400" loading="lazy"></p>
<p>可以看到，变量 <code>x</code> 的值是 <code>undefined</code>。</p>
<p>在 <strong>Python</strong> 中，必须为变量分配一个初始值。 没有初始值会声明失败。</p>
<p><strong>💡提示：</strong> 可以将 <strong>None</strong> 分配为 Python 中的变量作为初始值，以表示不存在任何值。</p>
<h3 id="pythonjavascript">Python 和 JavaScript 里的原始数据类型</h3>
<p>原始数据类型是可以在编程语言中使用的最基本的值。让我们比较一下这两种语言的原始数据类型：</p>
<ul>
<li><strong>Python</strong> 具有四种原始数据类型：整数类型（<code>int</code>）、浮点数类型（<code>float</code>）、布尔类型（<code>bool</code>）和字符串类型（<code>str</code>）。</li>
<li><strong>JavaScript</strong> 具有六种原始数据类型：<code>undefined</code>、布尔值、字符串、数字、<code>BigInt</code> 和 <code>Symbol</code>。</li>
</ul>
<h2 id="pythonjavascript">怎样在 Python 和 JavaScript 里写注释</h2>
<p>注释对于编写简洁易读的代码非常重要。让我们看看如何在 Python 和 JavaScript 中添加注释：</p>
<h3 id="">单行注释</h3>
<ul>
<li>在 <strong>Python</strong> 中，我们使用井号（<code>#</code>）编写注释。 该符号后面同一行上的所有字符均被视为注释的一部分。</li>
<li>在 <strong>JavaScript</strong> 中，我们用两个斜线（<code>//</code>）开始单行注释。</li>
</ul>
<p>这里是一个例子：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-145.png" alt="image-145" width="600" height="400" loading="lazy"></p>
<p>在 Python 里:</p>
<pre><code class="language-python"># Comment
</code></pre>
<p>在 JavaScript 里:</p>
<pre><code class="language-javascript">// Comment
</code></pre>
<h3 id="">多行注释</h3>
<ul>
<li>在 <strong>Python</strong> 中，多行注释的每一行都以井号标签开始。</li>
<li>在 <strong>JavaScript</strong> 中，多行注释以 <code>/*</code> 开始，以 <code>*/</code> 结尾。 这些符号之间的所有字符均被视为注释的一部分。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-146.png" alt="image-146" width="600" height="400" loading="lazy"></p>
<p>在 Python 里:</p>
<pre><code class="language-python"># Multi-line comment 
# in Python to explain
# the code in detail.
</code></pre>
<p>在 JavaScript 里:</p>
<pre><code class="language-javascript">/* 
Multi-line comment 
in JavaScript to explain 
the code in detail.
*/
</code></pre>
<h2 id="pythonjavascript">Python 和 JavaScript 的内置数据结构</h2>
<p>Python 和 JavaScript 的内置数据结构也有一些区别。</p>
<h3 id="tuples">Tuples</h3>
<ul>
<li>在 <strong>Python</strong> 中，我们有一个称为 <strong>tuple</strong> 的内置数据结构，它与 list 非常相似，但不可变。因此，在程序执行期间无法更改它，它可以用于存储不应修改的数据。</li>
<li>在 <strong>JavaScript</strong> 中，没有内置这种数据结构。但是可以使用语言的某些特性来实现类似的数据结构。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-182.png" alt="image-182" width="600" height="400" loading="lazy"></p>
<h3 id="listsvsarrays">Lists vs. Arrays</h3>
<ul>
<li>在 <strong>Python</strong> 中，<strong>lists</strong> 用于在同一数据结构中存储一系列值。 可以在程序中对其进行修改、索引、切片和使用。</li>
<li>在 <strong>JavaScript</strong> 中，此数据结构的等效版本称为 <strong>array</strong>。</li>
</ul>
<p>这是一个例子：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-147.png" alt="image-147" width="600" height="400" loading="lazy"></p>
<h3 id="">哈希表</h3>
<ul>
<li>在 <strong>Python</strong> 中，有一个称为 <strong>dictionary</strong> 的内置数据结构，可帮助我们将某些值映射到其他值并创建键值对。这可以用作哈希表。</li>
<li><strong>JavaScript</strong> 没有这种类型的内置数据结构，可以使用语言的某些元素来实现相同的功能。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-183.png" alt="image-183" width="600" height="400" loading="lazy"></p>
<h2 id="pythonjavascript">Python 和 JavaScript 的运算符</h2>
<p>任何编程语言编写表达式都需要用到运算符。让我们看看 Python 和 JavaScript 中的运算符主要区别。</p>
<h3 id="floordivision">Floor Division</h3>
<p>大多数算术运算符在 Python 和 JavaScript 中的用法完全相同，Floor Division 运算符却略有不同。</p>
<ul>
<li>在 <strong>Python</strong> 中， 用双斜杠（<code>//</code>）表示 floor division 运算（也称为 “整数除法”）。</li>
<li>在 <strong>JavaScript</strong> 中，没有特定的 floor division 运算符。 但是可以调用 <strong>Math.floor()</strong> 方法将结果四舍五入到最接近的整数。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-149.png" alt="image-149" width="600" height="400" loading="lazy"></p>
<h3 id="">比较值和类型</h3>
<p>在 <strong>Python</strong> 里使用 <code>==</code> 运算符来比较两个值或者数据类型是否相等。</p>
<p>比如：</p>
<pre><code class="language-python"># Comparing Two Integers
&gt;&gt;&gt; 0 == 0     
True
# Comparing Integer to String
&gt;&gt;&gt; 0 == "0"
False
</code></pre>
<p>在 <strong>JavaScript</strong> 中也有此运算符，但它的工作方式略有不同，它会在执行比较之前将两个对象转换为相同的类型。</p>
<p>如果我们使用 JavaScript 运行上一个示例中的 “整数与字符串” 比较（<code>0 == "0"</code>），比较的结果为 <code>True</code> 而不是 <code>False</code> ，因为 JavaScript 在比较之前会将比较的值转换为相同的数据类型：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-150.png" alt="image-150" width="600" height="400" loading="lazy"></p>
<p>在JavaScript中，要检查值<strong>和</strong>数据类型是否相等，我们需要使用此运算符 <code>===</code>（严格相等运算符）。</p>
<p>现在我们得到了预期的结果：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-151.png" alt="image-151" width="600" height="400" loading="lazy"></p>
<p>棒！</p>
<p><strong>💡提示：</strong> Python中的 <code>==</code> 等价于JavaScript中的 <code>===</code> 运算符。</p>
<h3 id="">逻辑运算符</h3>
<ul>
<li>在 <strong>Python</strong> 中，三个逻辑运算符为：<code>and</code>、<code>or</code> 和 <code>not</code>。</li>
<li>在 <strong>JavaScript</strong> 中，这些运算符分别为：<code>&amp;&amp;</code>、<code>||</code> 和 <code>!</code> 。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-152.png" alt="image-152" width="600" height="400" loading="lazy"></p>
<h3 id="">类型运算符</h3>
<ul>
<li>在 <strong>Python</strong> 中，使用 <code>type()</code> 函数来检查对象的类型。<br>
-在 <strong>JavaScript</strong> 中，使用 <code>typeof</code> 运算符。</li>
</ul>
<p>这是它们语法的图示：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-153.png" alt="image-153" width="600" height="400" loading="lazy"></p>
<h2 id="pythonjavascript">Python 和 JavaScript 里的输入和输出</h2>
<p>读取用户输入并向用户显示值是非常常见的操作。让我们看看如何用 Python 和 JavaScript 做到这一点：</p>
<h3 id="input">Input</h3>
<ul>
<li>在 <strong>Python</strong> 中，使用 <code>input()</code> 函数来读取用户输入。 将提示信息写在括号内。</li>
<li>在 <strong>JavaScript</strong> 中，一种替代方法（如果您正在浏览器上运行代码）是显示 <code>window.prompt(message)</code> 提示框，并将结果分配给变量。</li>
</ul>
<p>两种方法之间的主要区别是，在 Python 中，将提示用户在控制台中输入值，而在 JavaScript 中，浏览器中会显示一个提示框，用户可以在上面输入值。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-161.png" alt="image-161" width="600" height="400" loading="lazy"></p>
<p>💡  <strong>提示：</strong> 您将在 Python 控制台中看到如下提示：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-184.png" alt="image-184" width="600" height="400" loading="lazy"></p>
<p>对于 JavaScript，可以打开Chrome Developer工具并在控制台中输入以下代码：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-163.png" alt="image-163" width="600" height="400" loading="lazy"></p>
<p>会展示如下提示框：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-162.png" alt="image-162" width="600" height="400" loading="lazy"><br>
当调用  window.prompt() 时弹出的提示框</p>
<h3 id="output">Output</h3>
<ul>
<li>在 <strong>Python</strong> 中，使用 <code>print()</code> 函数将值打印到控制台，括号内是要打印的值。</li>
<li>在 <strong>JavaScript</strong> 中，使用 <code>console.log()</code> 向控制台打印一个值，括号内是要打印的值。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-164.png" alt="image-164" width="600" height="400" loading="lazy"></p>
<p>💡 <strong>提示：</strong> 如果您使用的是浏览器，还可以调用 <code>alert()</code> 以显示一个提示框，括号内是要显示的消息（或值）。</p>
<h2 id="pythonjavascript">Python 和 JavaScript 中的条件语句</h2>
<p>使用条件，可以根据特定条件是 <code>True</code> 还是 <code>False</code> 来选择程序中执行的语句。让我们看看它们在 Python 和 JavaScript 中的区别。</p>
<h3 id="if"><code>if</code>  语句</h3>
<ul>
<li>在 <strong>Python</strong> 中，依靠缩进来指示哪些代码行属于条件代码。</li>
<li>在 <strong>JavaScript</strong> 中，必须用括号将条件括起来，用花括号将条件代码括起来。该代码也应缩进。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-154.png" alt="image-154" width="600" height="400" loading="lazy"><br>
Python（左）和 JavaScript（右）的条件</p>
<h3 id="ifelse"><code>if/else</code>  语句</h3>
<p>else 子句在两种语言中都非常相似。唯一的区别是：</p>
<ul>
<li>在 <strong>Python</strong> 中，要在 <code>else</code> 关键字后写一个冒号（<code>:</code>）</li>
<li>在 <strong>JavaScript</strong> 中，用花括号（<code>{}</code>）将属于此子句的代码括起来。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-155.png" alt="image-155" width="600" height="400" loading="lazy"></p>
<h3 id="">多重条件</h3>
<p>多重条件用法:</p>
<ul>
<li>在 <strong>Python</strong> 中，在关键字 <code>elif</code> 后跟新的条件。条件后跟一个冒号（<code>:</code>），并在下一行缩进显示条件执行的代码。</li>
<li>在 <strong>JavaScript</strong> 中，在关键字 <code>else if</code> 后接条件（用括号括起来）。条件后写花括号，并在花括号中缩进代码。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-156.png" alt="image-156" width="600" height="400" loading="lazy"><br>
Python（左）和 JavaScript（右）的条件</p>
<h3 id="javascriptswitch">JavaScript 里的 Switch 语句</h3>
<ul>
<li>在 <strong>JavaScript</strong> 中，我们还有一个额外的控件结构，可用于根据表达式的值选择要执行的代码。 该语句就是 <code>switch</code>。</li>
<li><strong>Python</strong> 没有内置这种控制结构。</li>
</ul>
<p>这是该语句的一般语法：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-159.png" alt="image-159" width="600" height="400" loading="lazy"><br>
JavaScript 中的 switch 语句</p>
<p>在 JavaScript 里：</p>
<pre><code class="language-javascript">switch (expression) {
    case value1:
        // Code
        break;
    case value2:
        // Code
        break;
    case value3:
        // Code
        break;
    default:
        // Code
}
</code></pre>
<p><strong>💡提示：</strong> 我们可以根据需要添加任意多个 case，并且表达式可以是变量。</p>
<h2 id="pythonjavascriptforwhile">Python 和 JavaScript 中的 for 循环和 while 循环</h2>
<p>现在，让我们看看如何在 Python 和 JavaScript 中定义不同类型的循环以及它们的主要区别。</p>
<h3 id="for">For 循环</h3>
<p>在 Python 中定义 for 循环的语法比 JavaScript 中的语法相对简单。</p>
<ul>
<li>在 <strong>Python</strong> 中，在关键字 <code>for</code> 后跟循环变量的名称，关键字<code>in</code>，以及对 <code>range()</code> 函数的调用，函数需指定必要的参数。然后，我们写一个冒号（<code>:</code>），后面跟缩进的循环体。</li>
<li>在 <strong>JavaScript</strong> 中，必须明确指定几个语句。从关键字 <code>for</code> 开始，后跟括号。在这些括号内，定义循环变量及其初始值，为 <code>False</code> 时终止的循环的条件，以及每次迭代时变量的更新方式。然后，我们编写花括号以创建代码块，并在花括号内编写缩进的循环主体。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-165.png" alt="image-165" width="600" height="400" loading="lazy"><br>
Python（左）和 JavaScript（右）中的 For 循环</p>
<h3 id="">通过遍历迭代</h3>
<p>可以在 Python 和 JavaScript 中使用 for 循环来迭代可迭代对象的元素。</p>
<ul>
<li>在 <strong>Python</strong> 中，关键字 <code>for</code> 后跟循环变量，<code>in</code> 关键字和迭代的对象。 然后是冒号（<code>:</code>）和循环体（缩进）。</li>
<li>在 <strong>JavaScript</strong> 中，可以使用 <code>for..of</code> 循环。 先写 <code>for</code> 关键字后跟括号，然后在括号内写上 <code>var</code> 关键字后以及循环变量、关键字 <code>of</code> 和迭代的对象。接着用花括号将循环的主体括起来，别忘了保持缩进。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-167.png" alt="image-167" width="600" height="400" loading="lazy"><br>
Python（左）和 JavaScript（右）中的 For 循环</p>
<p>在 <strong>JavaScript</strong> 中，还可以用 <code>for..in</code> 循环来迭代对象的属性。</p>
<p>根据 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in">MDN Web 文档</a>:</p>
<blockquote>
<p><code>for...in</code> 语句以任意顺序遍历一个对象的除 Symbol 以外的可枚举属性。</p>
</blockquote>
<p>这是例子：</p>
<pre><code class="language-javascript">const object = { a: 1, b: 2, c: 3 };

</code></pre>
<p>当我们在 Chrome 开发者工具的控制台中运行此代码时，输​​出为：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-168.png" alt="image-168" width="600" height="400" loading="lazy"></p>
<h3 id="while">While循环</h3>
<p>While 循环在 Python 和 JavaScript 中非常相似。</p>
<ul>
<li>在 <strong>Python</strong> 中，编写关键字 <code>while</code> 后跟条件、冒号（<code>:</code>），并在新行中编写循环的主体（缩进）。</li>
<li>在 <strong>JavaScript</strong> 中，语法非常相似。 不同之处在于，必须用括号将条件括起来，并用花括号将循环的主体括起来。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-169.png" alt="image-169" width="600" height="400" loading="lazy"><br>
Python（左）和 JavaScript（右）中的 While 循环</p>
<h3 id="javascriptdowhile">JavaScript 中的 <code>do..while</code> 循环</h3>
<p>在 <strong>JavaScript</strong> 中，我们还有一种 Python 中不存在的循环类型。</p>
<p>这种循环称为 <code>do..while</code> 循环，因为它至少执行一次操作，并且在条件为  <code>True</code> 时继续运行。</p>
<p>这是基本语法：</p>
<pre><code class="language-javascript">do {
    // Code
} while (condition);
</code></pre>
<p>💡 <strong>提示：</strong> 这种类型的循环保证代码将至少执行一次。</p>
<p>当我们要求用户输入时，这特别有用，因为将提示用户键入值。 如果输入有效，我们可以继续执行该程序。 如果无效，我们可以提示用户再次输入该值，直到有效为止。</p>
<h2 id="pythonjavascript">Python 和 JavaScript 中的函数</h2>
<p>对于编写简洁、可维护和易读的程序，函数非常重要。函数的语法在 Python 和 JavaScript 中非常相似，让我们分析它们的主要区别：</p>
<ul>
<li>在 <strong>Python</strong> 中，关键字 <code>def</code> 后跟函数名称，括号内是参数列表。 在此列表之后，跟一个冒号（<code>:</code>）和该函数的主体（缩进）。</li>
<li>在 <strong>JavaScript</strong> 中，唯一的区别是我们使用 <code>function</code> 关键字定义一个函数，并用花括号将函数的主体括起来。</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-170.png" alt="image-170" width="600" height="400" loading="lazy"><br>
Python（左）和 JavaScript（右）中的函数</p>
<p>此外，Python 和 JavaScript 函数之间还有一个非常重要的区别：</p>
<h3 id="function">Function 的参数个数</h3>
<ul>
<li>在 <strong>Python</strong> 中，传递给函数调用的参数数量必须与函数定义中定义的参数数量相匹配。 如果不是这种情况，将发生异常。</li>
</ul>
<p>这是一个例子：</p>
<pre><code class="language-python">&gt;&gt;&gt; def foo(x, y):
    print(x, y)

</code></pre>
<ul>
<li>在 <strong>JavaScript</strong> 中，这不是必要的，因为参数是可选的。可以传入比函数定义的参数更少或更多的参数来调用函数。默认情况下，缺少的参数会被赋予值 <code>undefined</code>，并且额外的参数可以通过 <code>arguments</code> 对象进行访问。</li>
</ul>
<p>这是 JavaScript 中的一个例子：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-171.png" alt="image-171" width="600" height="400" loading="lazy"></p>
<p>注意用三个参数调用函数，但是函数定义的参数列表中仅包含两个参数。</p>
<p>💡 <strong>提示：</strong> 要获取传递给函数的参数数量，您可以在函数内使用 <code>arguments.length</code>。</p>
<h2 id="pythonjavascript">Python 和 JavaScript 面向对象编程</h2>
<p>Python 和 JavaScript 都支持面向对象编程，因此让我们看看如何创建和使用此编程范例的主要元素。</p>
<h3 id="classes">Classes</h3>
<p>在 Python 和 JavaScript 中 class 定义的第一行非常相似。 关键字 <code>class</code> 后跟类的名称。</p>
<p>唯一的区别是：</p>
<ul>
<li>在 <strong>Python</strong> 中，在 class 名之后，要写一个冒号（<code>:</code>）</li>
<li>在 <strong>JavaScript</strong> 中，用大括号（<code>{}</code>）包围 class 的内容</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-172.png" alt="image-172" width="600" height="400" loading="lazy"><br>
Python（左）和 JavaScript（右）中的 class 定义</p>
<p><strong>💡提示：</strong> 在 Python 和 JavaScript 中，类名应以大写字母开头，每个单词也应以大写字母开头。</p>
<h3 id="">构造器和属性</h3>
<p>构造函数是一种特殊的方法，当创建类的新实例（新对象）时会调用该方法。 其主要目的是初始化实例的属性。</p>
<ul>
<li>在 <strong>Python</strong> 中，用于初始化新实例的构造函数称为<code>init</code>（前后都有两个下划线）。 在创建类的实例初始化其属性时，会自动调用此方法。 它的参数列表定义了创建实例必须传递的值。 该列表的第一个参数是 <code>self</code>。</li>
</ul>
<p><strong>💡提示：</strong> 在 Python 中，使用 <code>self</code> 来引用实例，而在 JavaScript 中，使用 <code>this</code>。</p>
<p>使用以下语法，将值分配给 <strong>Python</strong> 中的属性：</p>
<pre><code>self.attribute = value
</code></pre>
<p>而在 <strong>JavaScript</strong>，使用如下语法：</p>
<pre><code>this.attribute = value;
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-174.png" alt="image-174" width="600" height="400" loading="lazy"><br>
Python（左）和 JavaScript（右）中的 class 例子</p>
<h2 id="pythonjavascript">Python 和 JavaScript 中的方法</h2>
<ul>
<li>在 <strong>Python</strong> 中，我们使用关键字 <code>def</code> 定义方法，然后是方法名以及括号内的参数列表。 该参数列表以 <code>self</code> 参数开头，该参数引用正在调用该方法的实例。 在此列表之后，需要跟一个冒号（<code>:</code>），并将该方法的主体缩进。</li>
</ul>
<p>这是一个例子：</p>
<pre><code class="language-python">
class Circle:

	def __init__(self, radius, color):
		self.radius = radius
		self.color = color

	def calc_diameter(self):
		return self.radius * 2


</code></pre>
<p>例子：Python Class 里的方法</p>
<ul>
<li>在 <strong>JavaScript</strong> 中，方法是通过编写其名称，后跟参数列表和花括号来定义的。 在花括号内，我们编写方法的主体。</li>
</ul>
<pre><code class="language-javascript">
class Circle {

    constructor(radius, color) {
        this.radius = radius;
        this.color = color;
    }

    calcDiameter() {
        return this.radius * 2;
    }
}

</code></pre>
<p>例子：JavaScript Class 里的方法</p>
<h3 id="instances">Instances</h3>
<p>创建 class 的实例</p>
<ul>
<li>在 <strong>Python</strong> 中，直接编写类的名称，并在括号内传递参数。</li>
</ul>
<pre><code class="language-python">my_circle = Circle(5, "Red")
</code></pre>
<ul>
<li>在 <strong>JavaScript</strong> 中，需要在类名之前添加 <code>new</code> 关键字。</li>
</ul>
<pre><code class="language-javascript">my_circle = new Circle(5, "Red");
</code></pre>
<h2 id="">🔹总结</h2>
<p>Python 和 JavaScript 在不同的应用场景里都是非常强大的语言。</p>
<p>Python 可用于 Web 开发和其他广泛的应用场景，包括科学研究领域。  JavaScript 主要用于 Web 开发（前端和后端）和移动应用程序开发。</p>
<p>它们具有重要的区别，但是它们都具有我们编写功能强大的程序所需的相同基本要素。</p>
<p><strong>我希望您喜欢这篇文章并且对您有所帮助。</strong> 现在，您知道 Python 和 JavaScript 之间的主要区别了吧。</p>
<p>⭐ <a href="https://www.youtube.com/channel/UCng0h8WiHLmT57JJ8At4LfQ"><strong>订阅我的 YouTube 频道</strong></a>，并在 <a href="https://twitter.com/EstefaniaCassN"><strong>Twitter</strong></a> 上关注我，以找到更多的编码教程和技巧。</p>
<!--kg-card-end: markdown--><p>原文：<a href="https://www.freecodecamp.org/news/python-vs-javascript-what-are-the-key-differences-between-the-two-popular-programming-languages/">Python VS JavaScript – What are the Key Differences Between The Two Popular Programming Languages?</a>，作者：<a href="https://www.freecodecamp.org/news/author/estefaniacn/">Estefania Cassingena Navone</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 即时编译的原理 ]]>
                </title>
                <description>
                    <![CDATA[ 即时编译是一种提升解释型程序性能的方法。在执行的时候，可以将程序编译为本机代码以提升其性能。即时编译也被称为动态编译。 动态编译比静态编译具有一些优势。在运行 Java 或 C＃应用程序时，运行时环境可以对其进行概要分析，以生成更多优化的代码。如果应用程序在运行时行为发生了变化，则运行时环境可以重新编译代码。 即时编译的缺点包括启动延迟和运行时编译的资源。为了降低使用资源，许多即时编译器仅编译经常使用的代码路径。 概述 传统上，有两种方法可以将源代码转换为可以在平台上运行的形式。静态编译将代码转换为特定平台的语言。解释器直接执行源代码。 即时编译尝试利用两者的优势。在运行解释型程序时，即时编译器确定最常用的代码并将其编译为机器代码，可以通过某种方法或较小的代码段完成。 动态编译最初是由 J. McCarthy 在 1960 年的一篇关于 LISP 的论文中提到的。 即时编译，即时或动态翻译是在程序执行期间进行的编译，意思是在运行时，而不是在执行之前，将程序翻译成机器代码。即时的优点在于，由于编译是在运行时进行的，因此即时编译器可以访问动态运行时信息，从而可以进行更好的优化（ ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/just-in-time-compilation-explained/</link>
                <guid isPermaLink="false">5ff7d1e439641a0517d53587</guid>
                
                    <category>
                        <![CDATA[ 编译器 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 编程语言 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Fri, 08 Jan 2021 03:33:19 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/01/photo-1580706483913-b6ea7db483a0.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>即时编译是一种提升解释型程序性能的方法。在执行的时候，可以将程序编译为本机代码以提升其性能。即时编译也被称为动态编译。</p><p>动态编译比静态编译具有一些优势。在运行 Java 或 C＃应用程序时，运行时环境可以对其进行概要分析，以生成更多优化的代码。如果应用程序在运行时行为发生了变化，则运行时环境可以重新编译代码。</p><p>即时编译的缺点包括启动延迟和运行时编译的资源。为了降低使用资源，许多即时编译器仅编译经常使用的代码路径。</p><h2 id="-">概述</h2><p>传统上，有两种方法可以将源代码转换为可以在平台上运行的形式。静态编译将代码转换为特定平台的语言。解释器直接执行源代码。</p><p>即时编译尝试利用两者的优势。在运行解释型程序时，即时编译器确定最常用的代码并将其编译为机器代码，可以通过某种方法或较小的代码段完成。</p><p>动态编译最初是由 J. McCarthy 在 1960 年的一篇关于 LISP 的论文中提到的。</p><p>即时编译，即时或动态翻译是在程序执行期间进行的编译，意思是在运行时，而不是在执行之前，将程序翻译成机器代码。即时的优点在于，由于编译是在运行时进行的，因此即时编译器可以访问动态运行时信息，从而可以进行更好的优化（例如内联函数）。</p><p>关于即时编译，有一个重要之处是它将字节码编译为正在运行的机器的机器代码指令。意思是，生成的机器代码针对正在运行的机器的 CPU 架构进行了优化。</p><p>即时编译器的一些示例是 Java 中的 JVM（Java 虚拟机）和 C＃中的 CLR（公共语言运行库）。</p><h2 id="--1">历史</h2><p>最初，编译器负责将高级语言（比汇编程序高的语言）转换为目标代码（机器指令），然后将其（通过链接器）链接为可执行文件。</p><p>在语言发展的某一时期，编译器将高级语言编译为伪代码，然后将其解释（由解释器）以运行你的程序。这消除了目标代码和可执行文件，并允许这些语言可移植到多个操作系统和硬件平台。</p><p>Pascal（编译为 P-Code）是最早的一个。Java 和 C＃ 是最近的示例。最终，术语 P-Code 被替换为字节码，因为大多数伪操作都是一个字节长。</p><p>即时（即时）编译器是运行时解释器的功能，它不会在每次调用方法时都解释字节码，而是将字节码编译为正在运行的计算机的机器代码指令，然后调用此目标代码。理想情况下，运行目标代码的效率将克服每次运行时重新编译程序的效率低下的问题。</p><h3 id="--2">典型场景</h3><p>源代码已完全转换为机器代码。</p><h3 id="--3">即时场景</h3><p>源代码将被转换为汇编语言，例如结构 [对于 C＃来说，是用于 ex IL（中间语言），对于 Java，是 ByteCode）。</p><p>仅当应用程序的需求（即需要的代码）被转换为机器代码时，中间代码才被转换为机器语言。</p><h2 id="--4"><strong>比较即时和非即时</strong></h2><p>在即时编译中，并非所有代码都首先转换为机器代码。一部分必需的代码将被转换为机器代码，然后，如果所调用的方法或功能不在机器中，则将其转换为机器代码，从而减轻 CPU 的负担。由于机器代码将在运行时生成，因此即时编译器将生成针对机器的 CPU 体系结构进行了优化的机器代码。</p><p>即时编译的一些示例：</p><ul><li>Java：JVM（Java 虚拟机）</li><li>C＃：CLR（公共语言运行时）</li><li>Android：较新版本的 DVM（Dalvik 虚拟机）或 ART（Android 运行时）</li></ul><p>Java 虚拟机（JVM）执行字节码并维护一个函数执行多少次的计数。如果此计数超过预定义的限制，则即时编译将代码编译为机器语言，该语言可以直接由处理器执行（不同于正常情况下， javac 将该代码编译为字节码，然后再编译为 Java，解释器会逐行解释此字节码，然后将其转换为机器代码并执行）。</p><p>同样，下次计算此函数时，将再次执行相同的编译代码。这与正常解释不同，在正常解释中，代码逐行再次解释。前者使执行速度更快。</p><p>原文：<a href="https://www.freecodecamp.org/news/just-in-time-compilation-explained/">Just in Time Compilation Explained</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 解释型语言和编译型语言的区别 ]]>
                </title>
                <description>
                    <![CDATA[ 前言 每个程序都是一组指令，无论是添加两个数字还是通过互联网发送请求。编译器和解释器将人类可读的代码转换为计算机可读的机器代码。 对于编译型语言，目标计算机以编译语言直接翻译程序。而对于解释型语言，源代码不会直接由目标计算机翻译，而是由 另一个  程序（即解释器）读取并执行代码。 好吧...那么这到底是什么意思呢？ 想象你要制作一个鹰嘴豆泥食谱，但是它是用古希腊语写的。你不会讲古希腊语言，你可以通过两种方式遵循其指示。首先是有人已经为你翻译成英文，你（以及其他会说英语的人）可以阅读食谱的英语版本，做鹰嘴豆泥。那么翻译的配方就是  编译版本。第二种方法是，如果你有一位了解古希腊语的朋友，当你准备制作鹰嘴豆泥时，你的朋友会坐在你的旁边，将菜谱逐行翻译成英语。在这种情况下，你的朋友是食谱  解释版本  的解释者。 编译型语言 编译语言直接转换为处理器可以执行的机器代码。结果，它们会比解释语言更快更高效地执行。 它们还使开发人员可以更好地控制硬件方面，例如内存管理和 CPU 使用率。 编译语言需要一个“构建”步骤——首先需要手动对其进行编译。每次需要进行更改时，你都需要“重建”程序。在 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/compiled-versus-interpreted-languages/</link>
                <guid isPermaLink="false">5ff51fa439641a0517d534ea</guid>
                
                    <category>
                        <![CDATA[ 编程语言 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Wed, 06 Jan 2021 07:20:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/01/photo-1555949963-aa79dcee981c.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <h3 id="-">前言</h3><p>每个程序都是一组指令，无论是添加两个数字还是通过互联网发送请求。编译器和解释器将人类可读的代码转换为计算机可读的机器代码。</p><p>对于编译型语言，目标计算机以编译语言直接翻译程序。而对于解释型语言，源代码不会直接由目标计算机翻译，而是由 <em>另一个</em> 程序（即解释器）读取并执行代码。</p><h3 id="--1"><strong>好吧...那么这到底是什么意思呢？</strong></h3><p>想象你要制作一个鹰嘴豆泥食谱，但是它是用古希腊语写的。你不会讲古希腊语言，你可以通过两种方式遵循其指示。首先是有人已经为你翻译成英文，你（以及其他会说英语的人）可以阅读食谱的英语版本，做鹰嘴豆泥。那么翻译的配方就是 <em>编译版本</em>。第二种方法是，如果你有一位了解古希腊语的朋友，当你准备制作鹰嘴豆泥时，你的朋友会坐在你的旁边，将菜谱逐行翻译成英语。在这种情况下，你的朋友是食谱 <em>解释版本</em> 的解释者。</p><h3 id="--2"><strong>编译型语言</strong></h3><p>编译语言直接转换为处理器可以执行的机器代码。结果，它们会比解释语言更快更高效地执行。 它们还使开发人员可以更好地控制硬件方面，例如内存管理和 CPU 使用率。</p><p>编译语言需要一个“构建”步骤——首先需要手动对其进行编译。每次需要进行更改时，你都需要“重建”程序。在鹰嘴豆泥示例中，整个编译是在呈现给你之前进行的。如果原始作者决定他要使用其他种类的橄榄油，则需要重新翻译整个食谱并重新发送给你。</p><p>纯编译语言的示例是 C，C ++，Erlang，Haskell，Rust 和 Go。</p><h3 id="--3"><strong>解释型语言</strong></h3><p>翻译员逐行执行程序的每个命令。在这里，如果作者决定使用其他种类的橄榄油，则可以将旧的橄榄油划掉，然后添加新的橄榄油。然后，你的翻译朋友可以随时将更改传达给你。</p><p>解释型语言曾经比编译型语言慢很多。但是，随着<a href="https://www.freecodecamp.org/news/just-in-time-compilation-explained/">即时编译</a>的发展，这种差距正在缩小。</p><p>常见的解释语言的示例是 PHP，Ruby，Python 和 JavaScript。</p><h3 id="--4"><strong>一个小提醒</strong></h3><p>大多数编程语言可以同时具有编译和解释的实现——语言本身不一定是编译或解释的。但是，为简单起见，通常将其简称为某一类。</p><p>例如，Python 可以在交互模式下作为编译程序或解释语言执行。另一方面，大多数命令行工具，CLI 和 shells 在理论上可以归类为解释语言。</p><h2 id="--5"><strong>优势和劣势</strong></h2><h3 id="--6"><strong>编译型语言的优势</strong></h3><p>编译为本地机器代码的程序往往比解释的代码要快。这是因为在运行时翻译代码的过程增加了开销，并可能导致程序整体变慢。</p><h3 id="--7"><strong>编译型语言的劣势</strong></h3><p>最突出的两点劣势是：</p><ul><li>在测试之前完成整个编译步骤需要额外的时间</li><li>生成的二进制代码对平台的依赖性</li></ul><h3 id="--8"><strong>解释型语言的优势</strong></h3><p>解释型语言更加灵活，并且通常具有诸如动态键入和程序较小的特点。另外，由于解释器自己执行源程序代码，因此代码本身相对于平台是独立的。</p><h3 id="--9"><strong>解释型语言的劣势</strong></h3><p>与编译型语言相比，其最明显的缺点在于执行速度。</p><p>原文：<a href="https://www.freecodecamp.org/news/compiled-versus-interpreted-languages/">Interpreted vs Compiled Programming Languages: What's the Difference</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 开发者如何选择编程语言（一） ]]>
                </title>
                <description>
                    <![CDATA[ “PHP是最好的语言！”“人生苦短，我用 Python！”“JavaScript 一统天下”……关于编程语言的讨论和争论时不时就在我们眼前出现。 其实没有一种编程语言在所有领域（操作系统、硬件驱动、办公软件、游戏、Web 服务器、数据库、搜索引擎、大数据处理、高频交易、机器学习、数值计算等等）都是银弹。我们要学会根据应用场景选择最适合的编程语言。 那么我们如何根据应用场景和编程语言的特性来选择适合的编程语言呢？我认为可以考察编程语言的以下特点和特性： 1. 执行方式 1.1. 汇编执行型 汇编语言（assembly）的源文件由汇编器（assembler）转换为 CPU 可直接执行的二进制程序文件。 1.2. 编译、（汇编）、执行型 C / C++ / Fortran / Pascal / Go / Rust 等编程语言的源文件一般由编译器（compiler）先编译为汇编指令，再由汇编器生成 CPU 可直接执行的二进制程序文件。 现在编译器一般不会把编译出来的汇编指令输出到文件，而通常在内存中直接交给内置的汇编器进行处理，所以我们会看到这些编程语言的编译器直接就输出一个可执行的 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-choose-a-programming-language/</link>
                <guid isPermaLink="false">5f8038aa5f583f0565090a33</guid>
                
                    <category>
                        <![CDATA[ 编程语言 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 编程学习 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 软件开发 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Yuping Wu ]]>
                </dc:creator>
                <pubDate>Fri, 09 Oct 2020 10:25:06 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/10/daria-shevtsova-zbWFT4eVopE-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>“PHP是最好的语言！”“人生苦短，我用 Python！”“JavaScript 一统天下”……关于编程语言的讨论和争论时不时就在我们眼前出现。</p><p>其实没有一种编程语言在所有领域（操作系统、硬件驱动、办公软件、游戏、Web 服务器、数据库、搜索引擎、大数据处理、高频交易、机器学习、数值计算等等）都是银弹。我们要学会根据应用场景选择最适合的编程语言。</p><p>那么我们如何根据应用场景和编程语言的特性来选择适合的编程语言呢？我认为可以考察编程语言的以下特点和特性：</p><h2 id="1-">1. 执行方式</h2><h3 id="1-1-">1.1. 汇编执行型</h3><p>汇编语言（assembly）的源文件由汇编器（assembler）转换为 CPU 可直接执行的二进制程序文件。</p><h3 id="1-2-">1.2. 编译、（汇编）、执行型</h3><p>C / C++ / Fortran / Pascal / Go / Rust 等编程语言的源文件一般由编译器（compiler）先编译为汇编指令，再由汇编器生成 CPU 可直接执行的二进制程序文件。</p><p>现在编译器一般不会把编译出来的汇编指令输出到文件，而通常在内存中直接交给内置的汇编器进行处理，所以我们会看到这些编程语言的编译器直接就输出一个可执行的程序文件。</p><p>C / C++ 的编译器 GCC / G++ 和编译器后端 LLVM 都可以把编译出来的汇编指令输出到文件中，供我们查看。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/ilya-pavlov-OqtafYT5kTw-unsplash.jpg" class="kg-image" alt="ilya-pavlov-OqtafYT5kTw-unsplash" width="600" height="400" loading="lazy"></figure><h3 id="1-3-">1.3. 编译、解释执行型</h3><p>Java / Scala 源文件由 Java 编译器编译成二进制的 class 文件，由 Java 虚拟机（Java virtual machine ，简称 JVM）解释执行。C# / <code>VB.net</code> 源文件由编译器编译为二进制的 exe 或 dll 文件，由 .net 运行时（runtime）程序解释执行。</p><h3 id="1-4-">1.4. 解释、执行型</h3><p>解释执行型语言通常又被称为脚本（script）语言。例如 Bash 脚本、Powershell脚本、JavaScript、Python、PHP、Ruby、Matlab 脚本、Mathematica 脚本等。它们的源文件由相应的运行时程序直接读取并解释执行。</p><h3 id="1-5-">1.5. 编译转换、解释执行型语言</h3><p>TypeScript、JSX、CoffeeScript 等语言通常是先由编译转换程序转换为 JavaScript，再由 JavaScript 运行时解释执行。</p><h3 id="1-6-">1.6. 其他类型</h3><p>例如 Kotlin 即可以被编译为 Java 的 class文件由 JVM 解释执行，也可以被编译转换为 JavaScript ，还可以被编译为可执行程序直接被 CPU 执行。</p><h3 id="1-7-">1.7. 不同执行方式的执行效率</h3><p>Java 的 class 文件中和 .net 的二进制文件中的指令都是类似 CPU 指令的代码，各硬件平台上的虚拟机 / 运行时程序只需花很少的代价就可以将其转换成该平台上的 CPU 指令执行，而不需要再对源代码进行词法语法分析。因此这些编译、解释执行型语言的运行效率通常比下面要介绍的解释执行型语言要高。</p><p>但是编译、解释执行型语言又比汇编 / 编译执行型语言多一个将虚拟机指令转换为 CPU 指令的过程，所以它们运行效率通常又比汇编 / 编译执行型语言的低。</p><p>因此，在对执行效率要求高的系统（例如高频交易的系统、核心网络的路由器中的路由程序）中，通常不采用解释执行型语言，而是采用编译执行型语言来开发。</p><h3 id="1-8-">1.8. 在系统级编程方面的适用性</h3><p>由于编译解释型语言或者脚本语言的运行效率不如编译执行型语言，而且需要虚拟机或者解释器才能运行，因此在操作系统或者驱动程序的编程中通常使用的是编译执行型的语言，如 C / C++ / Rust。</p><p>而在与 CPU 架构密切相关的地方，例如操作系统的内存管理模块的设置页表地址的程序，或者需要使用 CPU 的 IO / 中断等指令的时候，基本上只能使用汇编语言。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/aleksander-vlad-jiVeo0i1EB4-unsplash--1-.jpg" class="kg-image" alt="aleksander-vlad-jiVeo0i1EB4-unsplash--1-" width="600" height="400" loading="lazy"></figure><h2 id="2-">2. 内存管理</h2><h3 id="2-1-">2.1. 手动管理内存</h3><p>汇编语言以及 C / C++、Fortran、Pascal 等许多编译执行型语言都需要手动管理内存，由程序员手动回收无用的数据占用的内存。</p><h3 id="2-2-">2.2. 自动管理内存</h3><p>编译执行型语言中的 Go，Java、C#、<code>VB.net</code> 等绝大多数编译、解释执行型语言，还有 JavaScript、Python、PHP 等绝大多数脚本语言都是由运行环境自动管理内存（增加作为对象池的堆的内存、无用对象的垃圾回收等）。</p><p>其中 Go 主要采用标记清除算法做垃圾回收（英文 Garbage Collection，缩写 GC）。而 Java 可以指定标记清除、标记整理、标记复制与标记清除结合的分代 GC 算法等等算法中的一种做垃圾回收。对于其他语言的 GC 算法，我没了解过，读者有兴趣可以自己查阅资料。</p><h3 id="2-3-">2.3. 半自动管理内存</h3><p>Rust 语言中多数情况下，通过对象的所有权机制可以使得对象的内存申请和释放在编译期就可以确定，这些对象的内存管理可以看成是由编译器自动处理的。对于少数不受所有权机制限制的不安全对象，仍需要手动管理内存。</p><h3 id="2-4-">2.4. 自动管理内存的优劣</h3><p><strong>2.4.1. 优点</strong></p><p>把程序员从释放无用内存或者管理内存池等逻辑中解放出来，降低内存泄漏的可能性。</p><p><strong>2.4.2. 缺点</strong></p><p>程序员通常无法控制垃圾回收的时机，而垃圾回收通常需要暂停程序的运行，这会导致无法预料的程序卡顿。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/goran-ivos-TorAcb4AQRc-unsplash--1--1.jpg" class="kg-image" alt="goran-ivos-TorAcb4AQRc-unsplash--1--1" width="600" height="400" loading="lazy"></figure><h2 id="3-vs-">3. 强类型 VS 弱类型</h2><h3 id="3-1-">3.1. 强类型</h3><p>通常在需要编译的语言（如 C / C++ / Java / C# / Kotlin 等语言）中，一个变量 / 对象的属性必须在声明之后才能使用（一个变量必须被声明后才能被读，必须被声明后或者在声明时才能写；一个对象的属性没被定义的话不能被写入），而且一个变量 / 对象的属性 / 函数的入参与返回值的数据类型在声明时就确定下来、不能再改变了。如果违反了这两个约束，那么在编译源代码的时候就会报错。</p><h3 id="3-2-">3.2. 弱类型</h3><p>通常在脚本语言（如 Python、JavaScript、PHP）中，一个对象的属性是可以动态变化的，甚至变量不需要声明就可以使用（读或者写）；一个变量 / 对象的属性 / 函数的入参与返回值的数据类型是不固定的。</p><h3 id="3-3-">3.3. 强弱结合</h3><p>在 TypeScript 和在版本 7 以后的 PHP 等语言之中，既可以使用动态类型，也可以规定某些变量 / 对象的属性 / 函数的返回值的数据类型。如果违反了规定的数据类型，会引起编译转换器 / 解释器报错。</p><h3 id="3-4-">3.4. 不适用</h3><p>在汇编语言中通常没有变量（不考虑预处理器），因此不存在静态类型或者动态类型的问题。</p><h3 id="3-5-">3.5. 弱类型的优劣</h3><p><strong>3.5.1. 优点</strong></p><p>初学者不需理解数据类型就可入门，进行简单的编程。</p><p>程序员不受数据类型的限制，可以采取更灵活的实现方式，例如在某个类的对象中增加一个属性来存储一些额外的数据，而不需要改变类的定义。</p><p>程序变更前后的兼容性比较好。例如一个类增减了成员属性，旧类的实例对象序列化后，反序列化为新类的实例对象时，强类型语言可能会因字段不一致而出错，而弱类型语言则通常不会出错。又例如 JavaScript 中某个函数增加一个默认为空的入参，调用方不需修改即可兼容。</p><p><strong>3.5.2. 缺点</strong></p><p>弱类型语言不能在编译期确定变量的数据类型，从而不能在编译期对一些变量的内存使用进行优化（例如内存页对齐、缓存对齐等）。</p><p>弱类型语言在运行时可能出现由于类型混乱导致的错误。例如错把数字变量比较的规则应用于字符串变量的比较，从而得到 “10” &lt; “2”。</p><p>弱类型语言中，如果一些变量、对象属性、函数的入参或返回值使用的数据类型过多，会降低代码的可读性和可维护性，甚至导致程序代码混乱而出错。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/10/maxwell-nelson-taiuG8CPKAQ-unsplash--1-.jpg" class="kg-image" alt="maxwell-nelson-taiuG8CPKAQ-unsplash--1-" width="600" height="400" loading="lazy"></figure><h2 id="4-">4. 并行 / 并发模型</h2><p>首先要说明的是，并行和并发并不是一样的概念，它们的区别可以参考这个<a href="https://www.zhihu.com/question/33515481">知乎问题 1</a>。并行的一定是并发的，并发的不一定是并行的。</p><h3 id="4-1-">4.1. 多线程并行</h3><p>汇编语言可以直接调用操作系统的 API 来实现多线程。</p><p>C / C++ 可以通过 pthread 库或者直接调用操作系统的 API 来实现多线程。</p><p>Java 可以调用 Java API 来实现多线程，C# / <code>VB.net</code> 则可以调用 .net 的 API 来实现多线程。</p><p>Python 也可以通过其官方 API 实现多线程。虽然最普遍使用的 Python 运行时 CPython 和 PyPy 目前由于全局解释器锁（GIL）的缘故使不同线程不能在多个 CPU 核心（core）中并行运行，但还是有某些 Python 运行时如 Jython 已去掉了 GIL。</p><p>JavaScript 在支持 worker API 的运行时程序上可以通过创建 worker 来实现多线程，但这些线程之间只能通过消息通讯，不能共享内存。</p><h3 id="4-2-">4.2. 用户态线程 / 协程并发</h3><p>Python 可以通过生成器、asyncio 库或者 async / await 语法来使用协程（coroutine）。</p><p>Go 可以通过 goroutine 来使用协程。Gorotine 是可以并行的，可以充分利用多个 CPU 核心。</p><p>Kotlin 可以通过 kotlinx.coroutine 包提供的 API 来使用协程。</p><h3 id="4-3-io-api-">4.3. 非阻塞 IO API + 内置事件循环并发</h3><p>JavaScript 运行时通过提供非阻塞的 IO API 以及内部实现事件循环的方式，使得 JavaScript 可以在等待 IO 返回数据的同时可以并发地运行其他处理逻辑。</p><h3 id="4-4-">4.4. 多进程并行</h3><p>PHP 目前没有语言上的特性或者自带的 API 可以实现多线程或协程，要实现多线程需要额外安装 pthreads 拓展或者 Swoole 拓展。通常 PHP 的并发是通过多进程来实现的。</p><p>如果使用有 GIL 的 Python 运行时程序、Ruby 运行时程序或者不支持 worker API 的 JavaScript 运行时程序（例如版本 10 以前的 Node.js），如果想要充分利用多个 CPU 核心，也需要通过多进程来实现并行。</p><p>未完待续。</p><p></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 我们是如何采用 freeCodeCamp 的课程创办一所免费编程学校的 ]]>
                </title>
                <description>
                    <![CDATA[ 题图是一张学生在教室上课的照片，由于 COVID-19 疫情，我们采取了全面的远程教学。 如果你想学习编程，一般有三种方法可以选择：  * 搜索相关的课程来自学  * 上大学，修一个计算机相关学位  * 上编程学校，那里有动手实践的速成班，可以让你快速地在 3 个月至 1 年的时间内找到自己的第一份软件开发工作 虽然第一个选项是最便宜的，但是它也是最容易让人感到挫折和困难的一个选项。我们会在自学编程的一路上遇到各种障碍，然后想要放弃。 如果你一段时间不工作（或者不是全职工作），仍然能付得起学费和生活费用，仍然能供养得起家庭，那么第二个和第三个选项更好。但我相信不是所有人都可以做到。 这就是为什么我们创办了 freeCodeSchool Indy [https://freecodeschoolindy.com/] 。这个免费编程教学项目采用 freeCodeCamp 的课程，我们指导学生利用 3 个月的业余时间学习编程。 我们每周有两堂两小时的课程——星期一和星期三的下午 6 点至 8 点，课程涵盖基本的 HTML 到 JavaScript 的所有内容，甚至还会包括 Reac ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-we-created-a-free-coding-school-with-the-freecodecamp-curriculum/</link>
                <guid isPermaLink="false">5f4394afc8da7105cbc151ca</guid>
                
                    <category>
                        <![CDATA[ 教育 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 编程语言 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 创新 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Lee Lih Kai ]]>
                </dc:creator>
                <pubDate>Mon, 24 Aug 2020 10:26:35 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/08/photo-1524178232363-1fb2b075b655.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><em>题图是一张学生在教室上课的照片，由于 <em>COVID-19</em> 疫情，我们采取了全面的远程教学。</em></p><p>如果你想学习编程，一般有三种方法可以选择：</p><ul><li>搜索相关的课程来自学</li><li>上大学，修一个计算机相关学位</li><li>上编程学校，那里有动手实践的速成班，可以让你快速地在 3 个月至 1 年的时间内找到自己的第一份软件开发工作</li></ul><p>虽然第一个选项是最便宜的，但是它也是最容易让人感到挫折和困难的一个选项。我们会在自学编程的一路上遇到各种障碍，然后想要放弃。</p><p>如果你一段时间不工作（或者不是全职工作），仍然能付得起学费和生活费用，仍然能供养得起家庭，那么第二个和第三个选项更好。但我相信不是所有人都可以做到。</p><p>这就是为什么我们创办了 <a href="https://freecodeschoolindy.com/" rel="nofollow">freeCodeSchool Indy</a> 。这个免费编程教学项目采用 freeCodeCamp 的课程，我们指导学生利用 3 个月的业余时间学习编程。</p><p>我们每周有两堂两小时的课程——星期一和星期三的下午 6 点至 8 点，课程涵盖基本的 HTML 到 JavaScript 的所有内容，甚至还会包括 React 入门知识。</p><p>学生每周需要花大约 6 个小时的时间进行自学。每周日下午 1 点至 5 点是我们的办公室答疑时间，他们可以自愿参与。如果他们在第一个 3 个月内完成第一个项目，那他们就可以参与接下来 3 个月的第二个项目，即学习使用 Node.js 进行后端网页开发。</p><p>我们执行这项计划一年多了，很高兴今年五月份我们顺利完成了第一轮的教学。在这篇文章里分享我们分享一些学到的东西。</p><h2 id="-">我们的目标是建立一所免费的编程学校</h2><p>起初，我们的目标是为所有人（不论他们的收入和生活状况如何，比如是否有能力在一段时间内不工作）提供便捷的支持性的教育。</p><p>我们并不是想要与任何的训练营或者编程学校竞争，当然他们也是为学生提供了有价值的服务。我们只是尝试为需要弹性安排课程时间或负担不起编程学校学费的人们提供另外一个更便捷的选项。</p><p>我们的员工、志愿者、社区成员或者是已完成我们课程的校友都会为学生提供教导和指引。</p><p>当然我们希望那些想要成为开发者的学生可以找到心仪的工作，但我们并没有能力保证任何事情，只能竭尽所能提供更多的支持，不管他们最后决定自学，还是参与更正式的课程（比如去编程学校或者修学位）。</p><p>就像我之前所说的，这一切花了我们团队一年的时间——寻找合适的空间作为教室，找到老师，决定项目和课程的形式。</p><p>接下来介绍一下我们的筹备过程。</p><h2 id="--1">我们如何安排课程</h2><p>我们做的第一件事情就是决定课程的时长与目标。我们最终决定开设 3 个月的课程，让学生学会基本的 HTML, CSS 和 JavaScript，以及其他知识，比如说 Bootstrap 和 React 组件。</p><p>若一切按照计划进行，我们计划是让完成第一阶段的学生放一个月的假，然后学习第二阶段的课程。第二阶段的课程同样进行 3 个月，会沿用第一阶段的知识，教他们 JavaScript 框架的更多内容，并介绍 Node.js 。</p><p>从一个 3 个月的小型业余课程开始，有助于我们学会如何安排和调整长期计划。这个课程让学生有个短期的目标，使他们可以在短时间内完成自己的作品集。</p><p><a href="https://github.com/freecodeschoolindy">这是我们在 Github 上的社群</a>，我们会不断地更新资源和提供开源资料。</p><h2 id="-freecodecamp-">采用 freeCodeCamp 的课程</h2><p>开发课程将会花费非常多的时间和金钱。幸运的是 freeCodeCamp 已经有了完善的免费课程供我们使用和修改，而且没有限制</p><p>因此我们采用了 freeCodeCamp 的课程，并把它作为我们的内容提纲。我们把 freeCodeCamp 的挑战题目作为课后作业，同时让学生独立或组队完成上面的项目。</p><p>在这个过程中，我们也鼓励学生在课程之外多学一些，这样他们能够在项目进行中或结束时拿到 freeCodeCamp 的证书。</p><h2 id="--2">我们如何寻找开课的地点</h2><p>印第安纳波利斯公共图书馆慷慨地同意我们在那里开课，以及周日在那里组织答疑。但电脑室的空间有限，所以每班我们只能收 22 名学生。</p><p>虽然我们可以使用更大的会议厅安排更大的班级，但那样的话，我们就不能招募没有手提电脑的学生了，那不符合我们“让所有人都有机会学习编程”的目标。</p><p>我们原本没有计划实行远程授课，但受到疫情的影响，我们必须调整我们的课程，使用 Discord 进行授课和联络学生。</p><h2 id="--3">我们如何选择科技工具</h2><p>我们在开课之前上线了一个 Discord 论坛（就像 freeCodeCamp 论坛一样），学生可以登录，接收通知，提问，和发布作业。管理员也通过这个平台追踪学生的学习进度，促进交流。</p><h2 id="--4">我们如何管理学校</h2><h3 id="--5">招募学生</h3><p>在计划这个课程的时候，我们担心没有人会感兴趣，那么这个计划最终会没什么意义。但实际上有兴趣的学生太多，我们无法接受所有的报名——计划了 22 个名额，却有超过 140 个人报名！并且我们没有做太多的营销工作。</p><p>看到这么多人感兴趣，我们感到非常开心，但也需要决定如何公平地选择学生。</p><p>我们要求报名的人完成 3 个简单的编程挑战，例如 <a href="https://studio.code.org/flappy/1" rel="nofollow">Code.org 的 Flappy Game</a>。这样我们知道了哪些人是对编程真正有兴趣，将报名人数减少至 80 人左右，然后以抽签的方式决定最终能够参与课程的学生。</p><h3 id="--6">授课</h3><p>每位学生都有自己的个性和喜好，学习方式各有不同。我们无法期望他们只上一个小时的课，就能吸收所有信息并毫无问题地完成作业。</p><p>我们决定在每次上课之前先解答同学们的疑问，通常我们不会收到太多的问题。接着，以幻灯片的形式开始进入授课内容，每隔 15 分钟会暂停一下，让学生有时间尝试老师刚刚所教的东西。同时也会有导师从旁给予协助，学生也可以在这个环节在课堂内提出问题。</p><p>我们也经常预留 2 小时课程的最后 30 分钟让学生做自己的作业。</p><h3 id="--7">收集作业</h3><p>有些学生不愿意提交作业，因为他们不好意思让其他同学看见他们的代码，或者有人觉得这是个免费的课程，所以不需要交作业，更有一些人受班上同学的影响，同学不交那我也不要交。</p><p>如果某位同学是害羞分享代码，那我们就会鼓励他分享给我们的老师看，并让他知道我们曾经和他一样不会写代码。</p><p>如果某位同学就是不想写作业，那我们也没什么好多说的。我们会尝试劝退那些不是真正想参与我们课程的学生。</p><p>所有学生的作业原本是在论坛内提交，但我们发现这样非常没有效率，学生并没有经常登录，也从不在那儿提问。</p><p>现在所有作业在我们学校的 Discord 聊天室里提交。</p><p>自从我们将项目搬运的 Discord 后——包括上课、回答问题等，交作业的人数增加了，我们也从员工和志愿者那里得到了更多有建设性的反馈。</p><h3 id="--8">期限</h3><p>需不需要为完成项目设置最后期限呢？我们目前的观点是不需要。</p><p>第一批学生中大多数人的进度有点慢，有的人更是在课程完成几周后才完成项目。难道我们要惩罚那些有完成但不是在规定时间内完成的学生？不需要，原因是：每个人都有自己的学习节奏。</p><p>如果一个学生在 3 个月内完成项目，另一个学生在 4 个月内完成，他们两个应该同样被视为是完成了。</p><p>有一天，我们将会推行滚动式招生制度，更细化地帮助学生。到了那个时候，我们能做的就是保持弹性的教学，让他们什么时候完成作业了就什么时候提交。</p><h3 id="--9">鼓励学生提问</h3><p>这是我们遇到的最大问题！有的人落后于自己的同学，对课程有疑惑，但又不寻求帮忙。甚至有的人疑惑到连提什么问题都不知道。</p><p>我们无法强迫别人提问，但可以给他们提示。我们找到让学生提问的最好方法就是在课程开始之前做一个简短的测试，并在课堂上留出时间，让学生可以在小组内提问。</p><p>如果学生想要以文字的形式提问，他们可以在聊天群发布帖子或者给任何一位员工发私信。</p><p>我们只能够帮助到这么多，如果学生遇到了问题但没有提出来，我们提供不了任何的解决方案。我们努力满足他们的需求，但他们也需要做出一些努力，主动咨询我们。</p><h3 id="--10">问卷调查</h3><p>定期地对学生进行问卷调查为我们的课程带来了许多非常有帮助的回应。</p><p>我们在课程开始的阶段收集学生的目标和背景资料。然后在中途（大约在第 6 周）和结束的时候，分别进行了两次问卷调查。</p><p>收到许多有用的信息之后，我们发现可以多安排几次调查和增加几道题目。现在，我们大概会每月向学生进行问卷调查。以下是我们会问的一些问题：</p><ul><li>你感觉目前的课程怎么样？是否有达到你的期望？</li><li>你觉得导师们对你完成作业有没有帮助？</li><li>我们可以怎样更好地帮助你实现目标？</li><li>你有什么想反馈给我们？</li></ul><h3 id="--11">处理退学事件</h3><p>生活中总有突发事件，计划赶不上变化。我们理解会有一些非常积极的同学可能是因为一些无法避免的问题而被迫停止参与课程。</p><p>如果他和我们沟通自己的情况，我们会安排他参与下一期的课程。</p><p>如果他没有和我们沟通，就不来上课了，那么他可以再申请下一期的课程，但是我们不会再招募他了。</p><h2 id="--12">员工与志愿者</h2><h3 id="--13">招募志愿者</h3><p>如果没有志愿者的协助，这个项目很难取得成功。以下我们招募的几类志愿者。</p><p><strong>职责：</strong></p><ul><li><strong>发起人</strong>——没错，我们也是志愿者。我们非常的幸运，有一个很好的团队可以去执行这个项目，当中包括我本人和另两名开发者，以及一位懂编程的图书馆电脑室管理员。我们每周会在 Discord 进行数次讨论，以确保课程顺利进行、学生们都在进进步。我觉得 3-5 个人就可以组成一个不错的团队，但还是需要增加人手以处理一些专项的事情，例如“社区管理员”或“志愿者管理员”等。</li><li><strong>授课人</strong>——这些人主要是授课或主持通常在周末进行的特别支持环节。这是最难管理的志愿者类型。我们项目的课程时间通常为 1.5-2 小时，一共有 24 次课程，所以每一次课程都需要有清晰的重点，并且与其他课程衔接起来。一些很热心的志愿者并不是非常适合给毫无基础的初学者讲课。你希望学员在这堂课中掌握什么，落实到每一个知识点和学习成果，都需要给学员讲得很清楚，这非常重要。我们也给授课人提供统一的幻灯片模版，确保课程都能衔接起来。</li><li><strong>导师</strong>——学生们不只是会有关于编程的问题，他们还会有关于职业与社交之类的问题。导师就是来为学生们解答这类疑惑的人。目前我们正在安排志愿者导师至少每周一次与学生交流，以确保学生们保持在正确的学习轨道上，并回答学生们的问题。我们延迟这项安排的其中一个原因是我们正在开发一个体系，以处理学生和导师在一对一交流时出现的关于不当言辞或行为的投诉。</li><li><strong>实验室助理</strong>——助理的主要工作就是在直播课程的时候给予帮助，通常是处理电脑软件运行和代码错误。上实体课的时候，我们会安排更多的助理。上远程授课的时候，我们不能直接看到学生的电脑屏幕，所以需要几位助理能够及时在聊天室回答学生们的问题。</li><li><strong>协助者</strong>——他们负责在聊天室回答学生们的问题，审核学生们写的项目和作品集。他们帮助学生了解自己的不足，并给予学生们鼓励。</li></ul><h3 id="--14">志愿者手册</h3><p>我们制作了 2 页的手册，详细说明对志愿者的期望与行为要求。这个手册目前包含基本的内容，我们会不断修改更新。</p><p>我们也把 <a href="https://www.freecodecamp.org/news/code-of-conduct/" rel="nofollow">freeCodeCamp 的行为原则</a>发给志愿者，因为它很简洁到位，例如提到善意、包容等等。</p><h3 id="--15">确保员工拥有取得成功的条件</h3><p>我们当然也犯了不少错误，包括我们让授课人自己制作幻灯片，在最后一刻才告诉他需要更换，所以课程效果就没有很好。我们本来应该向授课人清楚说明希望他做什么。</p><p>现在，每位授课人都会收到我们准备的教学模板和他们需要讲解的知识点列表。我们也会和他们联系几次，了解授课进展，以确保项目稳步推进。</p><p>目前为止，我们有了志愿者手册、课程计划、幻灯片模板、导师规范，以及 Google Drive 文件夹（储存项目的所有文档、学生的进度、课程资料和未来的计划）。最近我们重新整理了所有资料，以方便所有人快速找到需要的资料。</p><p>随着项目发展，我们会需要更多志愿者甚至员工。通过记录各项工作进展，我们可以帮助未来的参与者更便捷地了解这个项目。</p><h3 id="--16">社区合作伙伴</h3><p>我们目前正在合作伙伴，给我们提供资金赞助和捐赠设备。</p><p>虽然图书馆提供了良好的环境与设备，但远程教学就会遇到不少困难，因为有些学生没有良好的设备和稳定的网络通讯。</p><p>另外，图书馆的开放有时间限制，对于有工作和家庭的学生来说，在白天安排出时间上所有的课程会比较困难。这就是为什么合作伙伴的赞助对于我们的课程来说非常重要。</p><p>未来，我们希望能够为有需要的学生提供网络通讯和手提电脑。</p><h2 id="--17">组织方式</h2><h3 id="--18">营销</h3><p>我们的团队并没有营销专家，所有的营销策略主要是确保品牌风格保持一致，以及时常在社交媒体上分享动态。</p><p>幸运的是，我自己在 <a href="https://www.youtube.com/c/FaradayAcademy" rel="nofollow">YouTube</a>、LinkedIn 和其他平台上有些粉丝，我在上面招募志愿者，激发人们对我们项目的兴趣。</p><p>公共图书馆也帮助我们在各类人群中宣传，招募学生，有的人群是我们的渠道触及不到的。</p><p>随着项目推进，我们可能会在社交媒体上扩大宣传，但目前由于预算有限，我们只是让项目有机增长。</p><h3 id="--19">远程直播</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2020/08/image-10.png" class="kg-image" alt="image-10" width="600" height="400" loading="lazy"><figcaption>Discord 上分享屏幕</figcaption></figure><p>远程直播教学有不少挑战，比如网络连接有时候会断开，学生们需要时间掌握软件的使用。</p><p>Discord 是一个不错的选择，因为我们不仅可以在同一个平台里直播授课，还可以同时有聊天室和其他的一些功能，这样学生只需熟悉一款软件的操作就够了。</p><p>不仅如此， Discord 还允许我们在同一个聊天室同时给最多 50 个人分享屏幕，而且还是免费的！我们也了解过 ZOOM 和其他工具，但只有 Discord 是我们负担得起的又有适合我们需要的功能。</p><h3 id="--20">注册 &amp; 筹款</h3><p>我们想向一些公司和个人筹款，因此我们去年注册成为非营利组织。在美国，这个过程需要花大约 6 个月的时间。我们必须先在所属州注册成为公司，然后才能向联邦政府申请成为非营利组织。</p><p>我们终于在今年年初成功注册成为 501c3 非营利组织！目前我们正在寻找接受筹款和捐助的方法，将会在网站上增加“捐款”按钮，让更多人能够有机会帮助我们。我们内部也正在讨论众筹是否是个好方法。</p><p>如果你有任何的提议，欢迎给我们发邮件 <a href="mailto:contact@freecodeschoolindy.com">contact@freecodeschoolindy.com</a> 。</p><h2 id="--21">通讯工具</h2><h3 id="--22">论坛</h3><p>就如之前所说的，我们有一个论坛，但发现它非常难维护，并且不符合我们的需求。人们发现论坛难以使用，尤其是在移动端。让员工和学生时常登录论坛，也挺麻烦的。所以我们团队才会最终选择把整个项目搬到 Discord 上。</p><h3 id="discord">Discord</h3><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/08/image-11.png" class="kg-image" alt="image-11" width="600" height="400" loading="lazy"></figure><p>现在我们有自己的 Discord 平台！我们在这里直播上课——可以同时连线 50 位同学分享电脑屏幕。这个平台可以管理学生，组织志愿者活动，培训授课人，回答问题，完成小组报告，点评作品集等等。</p><p>将所有的东西集合在同一个地方是我们做出最正确的决定，不只是减少开销，也把管理工作变得更加简单。</p><h2 id="--23">毕业</h2><p>我们本来打算组织一个毕业典礼，不幸的是由于疫情的关系，这个计划被影响了。我们需要将毕业证书邮寄给完成课程的学生。</p><p>第二期课程是远程授课，我们希望为即将在八月底毕业的学生增加一些有趣的环节。如果你有任何想法，欢迎告诉我们。</p><h2 id="--24">总结</h2><p>推动这个项目是我做过最困难的事情之一，工作量非常大，但非常值得——可以改变学生的人生。</p><p>这不仅仅是我一个人的努力，当然还有整个团队的互相帮忙才能促成这个项目。</p><p>在这里我特别感谢 <a href="https://thejaredwilcurt.com/" rel="nofollow">Jared Wilcurt</a>、Casssandra Bautista、Marianne Mckenzie、<a href="https://www.indypl.org/">印第安纳波利斯图书馆</a>、freeCodeCamp 和志愿者，有了你们的参与才有这个项目。</p><p>我们目前正准备把使用的教学资料开源，包括幻灯片、项目、freeCodeCamp 的编程挑战、补充资料等等。我们花费时间和精力去整理这些资料，请耐心等待，稍后我们会把这些资料分享给感兴趣的人们:)</p><p>如果你对于我们的课程有任何建议，欢迎告诉我们。</p><p>推特账号: <a href="https://twitter.com/gwen_faraday" rel="nofollow">@gwen_faraday</a></p><p>YouTube 账号: <a href="https://www.youtube.com/c/FaradayAcademy" rel="nofollow">Faraday Academy</a></p><p>课程网址: <a href="https://freecodeschoolindy.com/" rel="nofollow">freecodeschoolindy.com</a></p><p>原文：<a href="https://www.freecodecamp.org/news/how-we-created-a-free-coding-school-with-the-freecodecamp-curriculum/">We Created a Local Free Coding School Using the freeCodeCamp Curriculum. Here's What We Learned</a>，作者：Gwendolyn Faraday</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
