战斗机的操作系统的编程语言
找到差异和相似之处,以及学习技巧和技巧以学习编程语言 无论是在工作中(可能是在软件工程师那里工作)还是业余爱好,总有一段时间人们会努力选择“正确的” 编程语言。
尽管没有一个快速简便的答案(当然,不是“一种语言能胜过一切”),但我们可以研究一些关键指标来帮助我们进行反思。 在此过程中,我们还将遍历涵盖各种编程语言的概念,以及一些使您发现自己比预期更快地学习编程语言的方式-无论您是对编程的兴趣还是经验丰富的人已经编程多年的资深人士。
让我们不要太兴奋! (鸣谢toggl.com) 比较指标 在3个不同级别上查看当今的编程语言可能会有所帮助-尽快构建用于原型设计应用程序的“快速构建”编程语言,有助于以性能为中心/用例特定部分的应用程序的“基础结构”编程语言最后,“系统”编程语言可用于嵌入式硬件和需要绝对控制内存使用情况的用例。 当然,沿着这样的水平线在现实中往往会变得更加模糊和泥泞,但它有助于我们形成如何处理问题的思维导图! 建议:如果您刚开始开发应用程序,则强烈建议使用“快速构建”编程语言。 他们让您更快地看到要构建的任何产品的最终结果。
“快速构建”编程语言 -您可以将诸如PHP,Javascript,Ruby和Python之类的语言整合到这个阵营中。 即时,他们让您无需阻碍就可以进行大量建设,进入的门槛更低,而且开发人员社区往往是最大的。 它们的标准库与用于高级问题(从网络和多线程/多处理以及线程和进程之间的同步到典型的操作系统操作,包括与文件系统的交互)的默认语言实现打包在一起,还提供了许多现成的功能-让您无需环顾四周或自己实施即可完成工作。 该阵营中的编程语言通常倾向于解释。
“基础架构”编程语言-您可以将基于JVM的语言(Java,Kotlin,Scala,Clojure等)以及生产二进制语言(如GoLang,Swift和Haskell)集成到该阵营中。 这些语言倾向于以性能为目标,以换取便利(强类型输入,标准库中较少的现成组件,“较重”的冗长性等)而不会损失太多以及施加规则以使事情变得更糟,更难。 它们通常可以根据您的执行环境进行手动调整(通过允许您传递可能影响运行时代码性能的参数)。 如果您的应用程序中有一部分需要提高性能-特别是如果它在Web上运行,则可以考虑使用其中之一来增加性能。
“系统”编程语言-您可以将C,C ++和Rust集成到这个阵营中。 这些语言为您提供了对应用程序的最大控制权,并在需要时提供了显式的内存处理。 它们还倾向于与嵌入式设备(可编程微控制器,具有非标准处理器体系结构的计算机)和硬件(没有太多软件支持)(例如,通过其OBD端口访问汽车的信息)一起很好地工作。 随着WebAssembly的兴起,这种“低级”语言也证明对执行支持Web应用程序的计算密集型工作很有用。
语法和数据结构- 语言充当计算机和程序员之间的通信工具。 利用语言的语法。 了解一种语言中最常用的数据结构,以及它们对于插入/删除/修改的底层实现的时间复杂性。
运行时环境- 熟悉应用程序相对于计算机的“工作方式”。 是否需要语言解释器(如Python,NodeJS,PHP等)? 它会产生特定于体系结构的二进制文件(如Swift和GoLang)吗? 它是否同时使用了两者-在某些虚拟机(例如Java,Scala,Clojure等)上编译并运行? 由于这些需求,我们强烈建议学习和使用Docker –在此过程中,您将学到很多有关Linux管理的知识。
图书馆和成熟度- 每种语言都非常适合某些用例,主要基于其周围社区支持的项目类型。 Java在满足许多业务流程和基于网络物流的需求方面表现出色,它通过JDBC接口标准化提供数据库支持,而Apache Foundation下的项目等项目则可以帮助Java实现此目的。 Python,数据分析和统计数据也是如此,Haskell的语法,正则表达式和编译器也是如此。 一种语言的采用率和社区规模也很好地表明了人们是否应该拥护使用这种语言的项目-较小的语言社区意味着当事情破裂时,来自外界的帮助会减少。
垃圾收集
垃圾回收 是程序自己回收内存空间的行为,而无需开发人员明确地这样做(就像使用C和Rust等“系统语言”那样)。 在像Python,PHP和Swift这样的编程语言中,是否要取消分配对象取决于引用计数(引用计数的思想)。 但是,即使共享这种相似性,它们在各自的实现上也有所不同-特别是在处理经典内存泄漏方面(对象没有来自外界的有用引用,但仍阻止垃圾收集器清理它们!) 。
Python在垃圾收集器暂停程序执行,启动并继续进行垃圾收集的同时,与“停止世界”的世代垃圾收集器一起实现引用计数-“停止世界”,然后继续执行程序并作为垃圾回收“世代”收集器拥有3个独立的“世代”-3组堆。 第0代堆的检查最多,包含最多的“新鲜”对象,其后是第1代和第2代。
使用Python 2.7.12执行上述程序的结果 PHP(自PHP5.3起)在引用计数的基础上实现了并发垃圾收集器,该垃圾收集器在需要且已本地化的情况下与程序执行一起运行-无需遍历整个内存空间即可通过构造引用图来搜索循环引用对象。 从根无法到达的子图可以安全地消除。
Swift还使用引用计数,但是没有其他垃圾收集机制,将其留给开发人员以确保通过语言原语清除周期性引用的对象。 下面,我们演示了弱指针的使用-当对象的“强”引用计数一直下降到0时, Person
将被清理(因为Apartment
仅弱引用了该对象)。 这使Swift可以添加关于何时何地进行垃圾收集代码的编译时决策,从而使其能够保存起来以拥有实际的运行时垃圾收集器。
归功于https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html 还有许多其他编程语言实现的其他垃圾收集机制。 它们可能会根据用例广泛影响应用程序的性能,因此请了解您用例所选择的编程语言的内存模型!
重复概念 习惯于保持/跟踪依赖关系的机制以及维护“构建”信息(程序包描述,如何运行单元测试,设置/环境准备等)的方式。 Python结合使用pip和requests.txt 文件来管理依赖关系,并使用setup.py来管理环境设置 ,Haskell同时使用Cabal ,Java具有Maven和Gradle ,Scala具有SBT ,PHP具有Composer ,NodeJS具有npm-以及列表继续。
寻找本地化您的开发环境的方法也是必须的–根据项目,您可能希望运行不同版本的编程语言。 像phpbrew for PHP, pyenv for Python和nvm for NodeJS这样的项目使您能够做到这一点。
pyenv使您可以在系统上使用不同版本的Python! 当您安装要在一个项目中使用的库时,您可能也可能不希望将其安装在另一个项目中(这对于像Python和Haskell这样倾向于相对于当前解释器/工具全局安装依赖项的语言来说是一个问题) 。 习惯使用Python的virtualenv / venv ,PHP的virtphp和Haskell的Cabal Sandboxes之类的工具。
virtphp允许您将PHP本地化到您的特定项目-允许您锁定语言扩展以及特定于以PHP为中心的应用程序的语言版本。 异步I / O使我们能够从应用程序中获得更多的I / O绑定性能。 与线程很像,异步I / O使我们能够在执行I / O密集型操作时让程序的另一部分“运行”,无论是发出HTTP请求,建立数据库还是其他涉及外部世界(处理器进行的纯计算领域之外)可能需要花费大量时间。 与线程不同,异步I / O可以根据其实现来实现恒定的内存空间使用,因为创建线程在保留大量元数据方面仍然会花费一些内存。
每个线程都有自己独立的一组寄存器(主要用于跟踪我们在当前线程中的执行情况)和堆栈信息(主要用于函数执行-传递的参数,局部变量等)。
归功于https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/4_Threads.html
函数式编程是一种能力,可以从较高的角度告诉您的计算机您想做什么。 考虑到当今大多数应用程序都处理某种数据提取,转换和加载的事实,尤其是以多线程/多处理方式(以使计算机获得更多性能),因此遵循功能编程可确保提供许多保证。 虽然它们是仅归因于函数式编程(Haskell)的语言,但大多数语言仍保持对程序员的遵守程度。 当今,大多数语言都具有用于函数式编程的最基本的原语-通过映射,过滤器,简化列表,允许像其他任何值一样传递函数(作为值的函数)以及接受其他函数或返回像其他函数一样的函数其他值(高阶函数)。
学习计算 第一步 -浏览短片资源并建立一个迷你项目,以激发您的胃口 在此阶段,诸如在Y分钟内学习X之类的资源使您可以快速浏览给定语言中会遇到的各种语言原语。 此外,对于任何给定的编程语言,通常都有“游览”和“ [x]示例”页面以及交互式练习-一些示例是“ GoLang和GoLang漫游”示例 (对于GoLang), NodeSchool命令行练习 (对于Javascript —特别是NodeJS), Scala练习 (用于Scala), Python Koans(用于Python)等等。
构建小型应用程序(例如命令行应用程序),“脚本工作”(例如下载网站HTML内容,对其进行解析并寻找有趣的东西,甚至是类似于“操场”的实验代码的应用程序)也是必须的。 编写少量的应用程序,通常要低于300-400行代码。
这个阶段的诀窍是加快使用70-80%的时间的编程语言机制的速度,并使您对特定语言本身感到满意(同时让您有信心可以学习一种新语言)通过能够完成某些工作,同时让您领会到该语言的适用方式或位置。
由于我们的大脑渴望满足,所以我们希望能够尽快为我们的大脑提供奖励,以保持我们的动力!
第二步 -查看更多特定于语言的资源,并构建一个完整的项目,从而为您提供更多的语言见解 在这个阶段,您将不得不查阅编程语言的“官方”文档,以对事物的工作方式进行内省的了解。 对于Javascript,有Mozilla开发人员文档 ,对于Swift,有Swift官方文档 ,对于Java,有Java Learning Trails ,对于Python,还有Python Official Docs –随手可得。 也有很棒的在线课程页面,其中充满了讲义,幻灯片和作业。 例如,UPenn 开设了很棒的Haskell课程(CIS 194),而ScFL的发源地EPFL 开设了很棒的Scala入门课程 。
查看其他项目-开源代码库就是一个很好的例子。 事情是这样的注释jQuery的源或注释BackboneJS源 (用于基于Javascript的启示和看到的Javascript如何工作的新语法增加绒毛后面)到Python的Redis的客户端 (得到的是如何单元测试和一般体面的感代码库是用Python构建的),可让您深入了解如何在给定的编程语言上维护代码库。
这将有助于编写完整的应用程序,例如,编写完整的RESTful后端API,桌面应用程序,Web应用程序或移动应用程序。 尝试在需要时使用外部库(由其他开发人员编写),并对您的语言的工具(如何管理依赖项,如何将其部署到生产环境中-无论是在虚拟机上运行还是独立运行)充满信心二进制或在给定的语言解释器上,如何编写测试等)。 您应该努力处理非语言依赖性,例如数据库(例如Postgres或MySQL)以及与外部HTTP API的联系。
我的基于Scala的实习项目使我对Scala充满信心,并与基于Scala的库一起使用Java库(Scala是一种JVM语言,为其提供了完整的基于Java的互操作性)。 它使用了Scala Build Tool(用于构建在JVM上执行的JAR文件),具有体面的代码库,使用了Postgres和Redis并通过Docker进行了容器化! 恭喜-您选择了一种编程语言,并对自己的能力充满信心!
现在是反思和思考的时候了,研究可以从代码库重构为通用思路的内容。 考虑一下应用程序的性能(因此,涉及诸如多线程/多处理以及数据结构和时间/空间复杂性之类的事情)。 查看给定应用程序的核心算法的有趣方式,并查看如何改进它(并深入研究图论,组合论,计算和优化论)。 强烈建议您使用诸如卡内基·梅隆(Carnegie Mellon)的“并行编程”课程,斯坦福大学的“机器学习入门”和/或开源软件大学这样的资源 (这些课程是计算机科学领域的完全免费和自学成才的课程清单)。
它还可以帮助您查看过去或当前的作品,例如,如何在后台执行Web浏览器以及相应HTML / CSS渲染和动画,或者研究Apollo制导计算机的机制。 可能性无穷无尽-所有这些都使您认识到所有编程语言都有其用例,没有一种语言能胜过一切并提高了您的技能,从而使您的下一个项目(也许是您的下一个编程语言经验)更加完善。
你做到了! 您到达了终点! 无论是因为学习了新知识而感到高兴,还是仅仅是因为没有关注范围就读完本文而感到高兴,您都很棒! 这是一个包装! 我们讨论了编程语言之间的差异,因此,在给定用例的情况下,如何分类和选择一种语言之上。 然后,我们讨论了跨编程语言的普遍概念,随着我们学习越来越多的语言,我们可以将其移植。 最后但并非最不重要的一点是,我们了解了学习新语言时的学习方法!
请毫不犹豫地告诉其他读者您在下面从事的工作。 另外,如果您在GitHub上,请注意psst-我也在GitHub(github.com/alastairparagas)上 ! 如果您喜欢这篇文章,请别忘了给它鼓掌👏(如果您真的喜欢它,请粉碎那个鼓掌按钮并给它鼓掌👏👏👏👏👏)! 如果您不喜欢该文章或其相关内容,请在下面发表评论!
翻译自: https://hackernoon.com/pick-your-battles-choosing-and-learning-the-right-programming-language-731973698385
战斗机的操作系统的编程语言