关于编程语言:MoonBit-新增-运算符引入-super-trait-和-List-字面量机制

MoonBit更新1. 增加了 += 系列语句包含+=、-=、*=、/=,反对运算符重载: fn init { let array = [1,2,3,4] array[2] *= 10 println(array) // [1, 2, 30, 4]}fn init { let mut a = 1 a += 20 println(a) // 21}struct Foo { data : Array[Int]} derive(Debug)fn op_set(self : Foo, index : Int, value : Int) { self.data[index] = value}fn op_get(self : Foo, index : Int) -> Int { self.data[index]}fn init { let foo : Foo = { data: [0,0,0,0] } foo[2] -= 10 debug(foo) // {data: [0, 0, -10, 0]}}2. 当初 toplevel 如果没有顶格会报错如下图所示: ...

March 4, 2024 · 2 min · jiezi

关于编程语言:PythonCSwift或任何其他语言会取代Java吗为什么

很难预测Python,C ++,Swift或任何其余编程语言是否会取代Java作为最受欢迎的语言,但在不久的未来不太可能.以下是一些起因: 受欢迎水平并建设的用法:Java曾经存在了25年以上,并且领有大型且已建设的用户群.它被宽泛用于企业软件开发,Android利用程序开发以及许多其余畛域,这使得它很难替换.只管其余语言在某些畛域可能变得更加风行,但任何繁多语言都不太可能齐全替换Java已建设的用法. 跨平台兼容性:在任何中央"(WORA)办法容许开发人员创立能够在任何平台上运行的应用程序,而无需特定于平台的代码.对于Java来说,这是一个次要劣势,并且依然是开发人员的现实性能.只管其余语言可能更适宜特定平台,但很少有人具备Java的跨平台性能. 继续更新和改良:Java持续倒退并适应一直变动的技术和技术和技术须要.该语言具备一个大型开发社区,该社区始终在致力改善它并增加新性能.这使得任何语言都难以齐全替换Java,因为它持续改善并放弃相关性. 总结,而其余语言可能会取得遍及并成为在某些畛域应用更宽泛的应用,因为其建设的用法,跨平台兼容性以及继续的更新和改良,任何语言都不可能在不久的未来齐全替换Java. 文章转载自:IT宝库

March 6, 2023 · 1 min · jiezi

关于编程语言:KCL-语言-v045-版本发布-更好的编写便利性改进稳定性体验提升与多平台支持

简介KCL 团队很快乐地发表 KCL v0.4.5 版本当初曾经可用!本次公布次要为 KCL 语言编写便利性和稳定性晋升,错误信息改良以及更多平台包含 windows 版本反对以及更多下载方式反对。在 KCL v0.4.5 版本中,用户能够通过编写更少的 KCL 代码打消更多的配置模版;在新版本中提供了初步的 KCL Playground 反对可用于在线免装置编写并运行 KCL 代码;此外此次更新还蕴含多项编译器报错信息优化和谬误修复。 您能够在 KCL v0.4.5 发布页面 或者 KCL 官方网站 取得 KCL 二进制下载链接和更多具体公布信息。 KCL 是一个开源的基于束缚的记录及函数语言,冀望通过成熟的编程语言技术和实际来改良对大量繁冗配置和策略的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简略的逻辑编写,以及更快的自动化集成和良好的生态延展性。 本文将会介绍 KCL v0.4.5 版本的更新内容以及 KCL 社区的近期动静。 语言更新KCL 语言编写便利性改良反对 Schema 非空属性惰性校验在之前的 KCL 版本中,咱们曾经反对了 schema 属性相互援用(蕴含继承)以及 check 校验表达式的惰性求值与校验能力,在此次版本更新中,咱们反对了更多的 schema 惰性求值能力: Schema 属性非空惰性校验。比方对于下述的 KCL 的代码: schema Spec: id: int value: strschema Config: name?: str spec: Spec = Spec { id = 1 } # 在 KCL v0.4.5 版本之前,这个语句会报属性非空谬误,v0.4.5 版本之后,反对 Schema 非空属性惰性校验能力config = Config { spec.value = "value"}在 v0.4.5 之前的 KCL 版本中,间接执行上述代码会在 schema Config 语句块的 spec: Spec = Spec { 处抛出一个 spec 的 value 属性不能为空的谬误,因为在该处只对 spec 的 id 属性赋值为 1,而没有对 spec 的 value 属性赋值。 ...

February 27, 2023 · 4 min · jiezi

关于编程语言:各个编程语言的优缺点你适合哪个

TIOBE 编程语言排行前10中,各个编程语言的优缺点如下:Python: 长处:易学易用,具备大量的第三方库和工具反对,实用于数据分析、人工智能等畛域。 毛病:运行速度绝对较慢,不适用于须要高性能计算的应用程序。 Java: 长处:具备较好的跨平台性能,实用于大型应用程序的开发,提供了弱小的面向对象编程能力。 毛病:绝对较为繁琐的语法,开发效率绝对较低。 C: 长处:具备很高的性能和可靠性,宽泛用于操作系统和嵌入式零碎等畛域。 毛病:绝对较为底层,编写代码绝对较为繁琐,容易呈现内存透露和指针谬误等问题。 C++: 长处:具备很高的性能和可靠性,宽泛用于游戏和高性能计算等畛域。 毛病:绝对较为简单的语法和编译过程,容易呈现内存透露和指针谬误等问题。 C#: 长处:具备很好的跨平台性能,实用于 Windows 利用程序开发,提供了弱小的面向对象编程能力。 毛病:绝对较为繁琐的语法和编译过程,不适用于其余平台上的利用程序开发。 PHP: 长处:实用于 Web 开发,易于学习和应用,具备大量的第三方库和工具反对。 毛病:绝对较为凌乱的语法,容易呈现安全漏洞。 JavaScript: 长处:实用于 Web 前端开发,易于实现交互性和动态效果,具备大量的第三方库和工具反对。 毛病:在大型项目中保护较为艰难,存在跨浏览器兼容性问题。 R: 长处:实用于数据分析和科学计算,提供了丰盛的统计分析和可视化工具。 毛病:运行速度较慢,不适用于须要高性能计算的应用程序。 Swift: 长处:实用于 iOS 和 macOS 利用程序开发,易于学习和应用,提供了弱小的函数式编程和面向对象编程能力。 毛病:在其余平台上的利用反对绝对较少。 Go: 长处:具备很好的并发性能,实用于网络编程和高并发利用程序开发。 毛病:绝对较为新的语言,不足大量的第三方库和工具反对,不适用于一些较为简单的利用程序开发。 10种编程语言适宜不同类型的人学习Python: 适宜初学者和数据科学家,以及心愿疾速创立原型和小型应用程序的开发者。Java: 适宜企业级应用程序和大型零碎的开发者,以及想要理解面向对象编程的开发者。C: 适宜对底层编程有趣味的开发者,如操作系统和嵌入式零碎开发。C++: 适宜对游戏开发、高性能计算和嵌入式零碎有趣味的开发者。C#: 适宜 Windows 利用程序开发、游戏开发和 Web 开发的开发者,以及想要理解面向对象编程的开发者。PHP: 适宜 Web 开发和服务器端编程的开发者。JavaScript: 适宜 Web 前端开发的开发者,以及想要理解动静网页设计和交互性的开发者。R: 适宜数据科学家和钻研人员,以及须要进行数据分析和可视化的开发者。Swift: 适宜 iOS 和 macOS 利用程序开发的开发者,以及对函数式编程有趣味的开发者。Go: 适宜网络编程和高并发利用程序开发的开发者

February 14, 2023 · 1 min · jiezi

关于编程语言:百度搜索业务交付无人值守实践与探索

作者 | 刘道伟 导读基于危险驱动的交付是百度实际智能测试——感知智能阶段十分重要的钻研方向,基于危险驱动的交付,源于三个现状: 一、不是所有的我的项目都有危险,80%以上的我的项目无任何的关联bug和线上问题。 二、不是所有的测试工作都可能揭错,有效的品质行为(有bug发现的品质行为/所有品质行为)占比十分高。 三、测试人员也有误判的可能,漏测始终存在。 通过以上三个现状,可见如果可能有办法迫近:测该测的我的项目、做该做的品质行为、评危险评得准,那么对测试效力和召回都有极大的帮忙。 接下来咱们将继续登载三篇文章,来揭秘百度实际基于危险驱动的交付的冰山一角: 1、百度搜寻业务交付无人值守实际与摸索:从具体业务实际的角度介绍危险评估在交付无人值守畛域的关键作用。 2、AI技术在基于危险测试模式转型中的利用:从测试全过程的角度介绍各环节以危险思维+AI技术加持的各种利用场景。 3、品质评估模型助力危险决策程度晋升:从思路、计划和模型的角度介绍品质度模型的实现和挑战。 本文先介绍第一篇:百度搜寻业务交付无人值守实际与摸索。 01 引子提起交付无人值守概念,大部分人应该都比拟生疏,呈现上面这些疑难: 什么是交付无人值守?怎么做到交付无人值守?交付无人值守能带来哪些益处?本文就从以上几方面动手,具体介绍一下百度搜寻业务在交付无人值守上一些摸索及实际。 02 无人值守的源起在介绍无人值守之前,能够先理解下交付模式的倒退历程,如下图所示,随着工程能力的一直倒退,交付过程中的测试逐渐从纯手工测试变为半自动化测试或自动化测试。同时在互联网行业麻利开发模式继续倒退,继续集成也随之发展起来,通过将自动化测试工具集成到流水线中,质效工作逐渐左移,大部分的需要研发人员能够通过流水线实现测试、上线工作。咱们把这类研发人员不再须要通过测试人员手工测试,应用流水线即可实现全副测试过程的模式称为研发自主测试,在搜寻业务中,DevOps已成为最次要的交付模式,局部业务需要自主测试比例达到了90%以上。 现实状态下,既然大部分需要已实现自主测试,整个交付过程中应该是不须要消耗测试人员人力,然而现实很饱满,事实却很骨感。下图是在自主测试模式下,测试人员的工作日常,能够看到在整体过程中测试人员工作量仍然比拟大: 1)研发人员流水线执行测试失败,须要测试人员进行问题排查、修复工作稳定性问题、定位是否与代码无关、与研发重复沟通; 2)研发流水线执行实现后,测试人员还须要确认研发的自主测试报告,剖析需要危险,判断是否可准入; 3)交付过程中,存在很多环节须要研发人员和测试人员的沟通及手工操作,如需要的报备、拉分支、公布版本等工作。 是否有技术手段,把交付过程中这些消耗测试人员大量人力的工作由机器代替呢?这就是咱们明天要介绍的无人值守出发点。 03 无人值守的计划在以后交付过程中,次要有以下几个环节对测试人员的依赖水平较大: 决策依赖人:CI代码后须要执行哪些测试工作是动态配置的或齐全人工决策决定的。流程依赖人:交付各环节流程流转依赖研发或测试人员,沟通交互老本高。论断依赖人:流水线无风险剖析能力,测试工作无0/1化论断,准入准出的危险判断依赖集体教训。因而要实现无人值守必须要通过技术手段解决这三个依赖问题,一句话概括就是 “通过智能执行和危险评估能力,实现失败智能运维,过程主动流转,危险智能揭发,整个交付过程无需测试人员人工干预 ”。要真正实现这个指标,首先要满足三个必要的条件:齐备的测试能力、稳固的构建能力以及精准的评估能力,在这些能力的根底上,建设数据采集、危险辨认、危险管制、危险决策等智能化机制,最终实现全环节的无人化。 因为篇幅所限,本文上面先重点介绍三个依赖的根底能力。 3.1 齐备的测试能力 齐备的测试能力是无人值守的根底,齐备即要求流水线的测试工作是全面且无效的。 怎么了解全面?不同类型业务对于测试工作的需要是不同的,全面就是具备对应的业务类型须要的各种测试工作,以百度的工程能力地图服务端要求为例,全面的测试能力即要求下图所示的服务端的各环节的测试工作都具备,能够依据业务的理论需要进行一些变动。 全面测试能力的根底上进一步是无效的,有很多状况下流水线尽管具备了某类型的测试工作,然而这个测试工作是不是可能拦挡问题还依赖测试工作的危险揭发能力,或者依赖测试人员对于测试报告的剖析解读能力。 以搜寻业务的DIFF测试类型为例,DIFF测试就是针对基线版本和测试版本,发送同样的数据,比照返回的数据的字段的不同,判断测试版本是否合乎预期,曾经是以后接口测试和大数据测试中比拟常见的形式。然而DIFF测试工作存在有效性问题,测试工作产出了diff的后果,可能是『乐音』导致的不稳固,可能是代码变动的预期内的,也可能是bug导致的非预期后果,这个危险的判断齐全依赖研发和测试的人工剖析。因而要晋升DIFF测试有效性要解决乐音烦扰的随机diff问题和diff后果0/1剖析问题,随机diff的打消通过后端mock、环境数据一致性、随机diff智能辨认与过滤策略等机制解决,本文不具体开展阐述,重点介绍下diff测试的拟人化剖析能力。 拟人化剖析就是把人工分析测试后果的能力转化的自动化过程,因而要实现拟人化剖析首先要分明人在看到diff测试后果的时候是如何判断的,通过理论调研发现,研发和测试人员在剖析diff测试后果的时候,首先会看批改的代码是否与产出的diff后果字段相关联,如果是关联比拟大就认为是代码导致的,接着会剖析这些字段的业务影响面是否是需要内预期的以及影响面大小,如果是预期内的影响且危险可控即可认为通过,因而拟人化剖析也从上面两个方面进行判断: 1)依据白盒数据+模型+业务逻辑剖析字段是否合乎预期; 2)依据联合业务的数据分析,评估字段影响面危险。 这其中最重要的一点是如何将白盒数据与后果相关联,目前次要采纳了两个伎俩,一个是比拟惯例的业务知识库积淀,通过对业务的常识的梳理及积淀,将研发和测试的集体教训转化为可主动判断的规定,如某些函数的变动可能引起某类的diff,长处是与业务关联比拟严密,准确度更高,毛病是依然过于依赖各个业务的人员的梳理,积淀的效率较低,因而咱们摸索了第二个伎俩,通过工作执行的历史数据,剖析代码变动与字段变动之间的关联关系,离线的建设代码及字段的关联模型,在线阶段通过模型判断字段变动是否是代码导致,再联合字段的业务危险判断最终给出diff测试论断。 通过上述一些伎俩,可能大大的晋升DIFF测试的有效性,也缩小了DIFF测试的人工剖析老本,相似的工作也在性能测试等其它场景发展,即通过技术手段晋升测试工作的危险揭发能力和后果的剖析能力,从而晋升测试工作有效性。 3.2 稳固的构建能力 如果说齐备的测试能力是实现无人值守的根底,稳固的构建能力就是实现无人值守的保障。如果流水线构建频繁失败,就会导致在自主测试过程中,测试人员须要不停的进行失败问题的定位,修复,以及与研发人员的重复的沟通,因而稳固的构建至关重要。如何建设的稳固的构建能力呢?其实能够用线上服务的稳定性建设作为参考,线上服务通常有研发、运维的各种稳定性及监控建设,稳定性可能达到几个9以上,然而线下服务的稳定性通常只有百分之八九十,那为什么不应用线上稳定性建设的规范来进行线下测试能力的建设呢,因而咱们以线上运维的规范,全面晋升了线下构建的稳定性,次要蕴含以下次要工作: 根底依赖治理:流水线稳定性离不开根底依赖的稳定性,这些依赖蕴含机器、实例、测试代码、测试数据、第三方服务等各个方面,因而要晋升稳定性首先要治理这些依赖,如机器的对立治理,测试代码和数据用线上代码的规范治理,第三方服务的SLA保障及容灾等措施。全环节的稳定性保障:全环节即预防、发现、定位、复原、闭环各个环节均建设对应的稳定性能力,如在预防环节,针对构建须要的环境、数据等进行监控,如呈现不可用或缺失等问题提前报警,防止测试工作构建时才发现导致失败;定位环节标准错误码,针对错误码建设主动定位机制,如果定位问题可能主动复原即触发自愈的策略主动触发复原伎俩,缩小失败的人为干涉。构建数字化:通过对构建数据的数字化,实现构建的稳定性度量、刻画、倡议等工作。 3.1 精准的评估能力 有齐备的测试能力和稳固的构建能力,交付的无人值守还有最初的环节须要解决:准入准出的危险如何判断?传统的流程上通常都是由人工评审测试报告的形式对危险进行把控,不仅消耗人力老本,而且判断精确水平齐全依赖集体的教训,新人研发和测试同学常常会呈现判断谬误导致漏测。如何实现主动的危险评估能力呢,咱们采纳了基于品质度模型及规定联合的办法建设评估能力,品质度模型就是将可能影响危险的数据都形象为特色,通过人工标记的历史数据训练为模型,在准入准出阶段通过调用品质度模型的后果给出危险得分,再联合基于业务的规定判断进行综合判断危险,如果危险低则能够主动准入不再须要人工剖析,如果危险为高,再引入人工。 通常特色的蕴含交付过程中的各种数据如代码白盒数据、研发人员画像、研发过程数据、测试工作后果、覆盖率等,如下图所示通过特色的形象、模型训练、模型评估等过程最终实现精准的评估能力,评估能力的准确性依赖于品质度模型选取的特色丰盛水平以及人工标记的数据的准确性。 04 无人值守的收益通过测试能力的继续建设,搜寻业务90%以上的需要都可通过研发自主测试实现,极大晋升测试吞吐的能力。在自主测试的根底上,通过上述的无人值守工作发展,需要无人值守比例曾经达到40%以上,让更多的测试人员的人力从日常的交付工作中释放出来,投入到其它价值更高的工作中,也进一步升高了单需要的交付老本。 ————END————

October 25, 2022 · 1 min · jiezi

关于编程语言:豆瓣评分-90总销量超-17-万册的-R-语言实战书带你轻松掌握数据处理

《R 语言实战》的前言中援用了这样两句话。 要是一本书里没有图画和对话,那还有什么意思呢?——爱丽丝,《爱丽丝梦游仙境》它太神奇了,满载瑰宝,能够让那些聪慧刁滑和粗野胆大的人失去充沛满足;但并不适宜胆大者。——Q,“Q Who?”,《星际迷航:下一代》 第一句想要示意当今统计分析的潮流——一个摸索、展现和了解的交互式过程。第二句话反映了大部分人对 R 的认识:难学。 大数据时代,基于数据和剖析去发现问题,并作出迷信、主观的决策越来越重要。常常听到一个说法:如果你问两个统计学家该如何剖析一个数据集,那你可能会失去三个答案。不过,每个答案都能让你更好地了解数据集。 其实对于一个问题,没有说某种剖析形式是最好的,或者是惟一的。咱们应该本人入手去剖析数据,看看都能失去什么。开源软件 R 曾经成了统计、预测剖析和数据可视化的全球通用语言,能够装置并运行于所有支流平台。它提供了各种用于剖析和了解数据的办法,从最根底的到最前沿的,无所不包,是咱们从大数据中获取有用信息的绝佳帮手! 因为 R 很弱小,利用宽泛,所以泛滥的剖析和绘图函数(超过50 000个)很容易让人望而生畏。但实际上,学习 R 并非无规律可循,只有有适合的领导,你就能够畅游其中!这本《R 语言实战(第2版)》是你熟练掌握 R 的最快路径之一。本书重视实用性,全面而粗疏,既提供了有针对性的教程,又给出了深度解说的示例。新版做了大量更新和修改,新增了近 200 页内容,介绍数据挖掘、预测性剖析和高级编程。有读者评估:周五购买,你在下周一就能写出可运行的程序! 作者介绍写作由来的时候,这点失去了印证。 最出色 R 网站作者的故事多年前,我在申请一个统计征询职位时,第一次遇到了 R。 雇主在正式面试前,发来的资料中问我是否相熟 R。依据猎头的倡议,我立马答复“是的,我很相熟”,而后开始恶补 R。我在统计方面有丰盛的教训,对各种编程语言也不生疏,学习R能有多难?但大失所望。 因为要面试,我要尽可能快的把握这门语言,可是过程中我发现,无论是底层的构造还是各种高级的统计办法,都是由各具体畛域的专家为同行专家编写的。看在线帮忙几乎就是折磨,那不是教程,都是参考手册! 每当我感觉本人曾经对R的构造和性能有足够把握时,就会发现一些闻所未闻的新货色,它们让我感觉本人很渺小。为了解决这些问题,我开始以数据科学家的角度学习R。我开始思考如何能力胜利地解决、剖析和了解数据,包含:获取数据(从各种数据源将数据导入程序);整顿数据(编码缺失值、修复或删除谬误数据、将变量转换成更不便的格局);正文数据(以记住每段数据的含意);总结数据(通过描述性统计量理解数据的详情);数据可视化(一图胜千言);数据建模(解释数据间的关系,测验假如);整顿后果(创立具备出版程度的表格和图形)。 而后,我试图用 R 来实现这些工作。通过传授他人来学习是最好的形式,所以我创立了一个网站(www.statmethods.net),一直把我学到的货色放在下面。 大略一年后,Marjan Bace(Manning的出版人)打电话给我,问我是否写一本对于R的书。那时我曾经写了50篇期刊文章、4份技术手册,以及大量章节的内容,还写了一本对于钻研办法的书,所以我想,写一本对于R的书能有多难? 后果仍然是大失所望。第1版出版一年后,我开始编写第2版。R的平台在不断完善,我想始终跟进。我也想在本书中笼罩更多无关预测性剖析及数据挖掘的内容——这都是大数据时代很火的主题。 最初,我还想加一些对于数据可视化、软件倒退以及动静报告撰写的章节。你当初捧着的这本书是我多年来梦寐以求的。我的初心就是给大家提供一份 R 指南,让你能尽快感触到 R 的弱小以及开源的魅力,不再感到丧气和忧愁。来吧,一起抉择所需的工具,用最优雅、最简洁、最高效的形式来实现工作——那真的很酷! 作者介绍R语言社区驰名学习网站 Quick-R (statmethods.net)的维护者,现为全球化开发与征询公司Management钻研团体研发副总裁。此前,Kabacoff博士是佛罗里达诺瓦东南大学的传授,讲授定量办法和统计编程的研究生课程。Kabacoff还是临床心理学博士、统计参谋,善于数据分析,在衰弱、金融服务、制造业、行为科学、政府和学术界有20余年的钻研和统计征询教训。 互动工夫读了“最出色 R 网站作者的故事”,有没有感觉“面试前的恶补”很相熟?你的面试产生过什么乏味的故事吗?作者说:通过传授他人来学习是最好的形式,你怎么认为呢?在你的技术精进之路上,有没有更好的学习办法分享给大家?欢送在评论区与小伙伴们互动,咱们将选出两位侥幸的小伙伴送出《R语言实战(第2版)》1本! 目前,R 是世界上最风行的数据分析、统计计算及制图语言,是数据挖掘、数据分析人才的必备技能。想要成为备受高科技企业追捧的数据分析师吗?想要科学分析数据并正确决策吗?无妨从本书开始,挑战大数据,用R开始炫酷地统计与剖析数据吧!“清晰而又吸引人,这无疑是学习R最乏味的形式!”——Amos A.Folarin,伦敦大学学院

September 13, 2022 · 1 min · jiezi

关于编程语言:编程语言中索引签名是什么

撰稿:宗喆原文:https://mp.weixin.qq.com/s/Jl...KusionStack: https://github.com/KusionStack/kusionKCLVM: https://github.com/KusionStack/KCLVM1. 背景最近在参加 KusionStack 内置的畛域语言 —— KCL配置语言编译器 的开发,语言的语法中包含一个“索引签名”的概念,在参加社区探讨的时候发现很多小伙伴不明确这个“索引签名”是什么,于是本人也想了一下,发现自己也只是晓得是什么样子,然而不晓得“索引签名”残缺的定义,因而,决定写一篇贴子来梳理一下“索引签名”到底是什么。 2.见名知意首先,索引签名的想法并不神秘陈腐。晚期Windows开发中应该见过相似的编程标准: bool(BOOL) 用b结尾 bIsParentbyte(BYTE) 用by结尾 byFlagshort(int) 用n结尾 nStepCountlong(LONG) 用l结尾 lSumchar(CHAR) 用c结尾 cCount只有看到变量和类成员的名字就晓得其类型,进步了代码类型方面的可读性。然而这种约定并没有积淀到C++语言中,如果语言可能反对定义以b结尾的成员是BOOL类型这种个性就厉害了——这其实就是索引签名的浮夸目标。 先从字面意义上看,“索引签名(index signature)” 蕴含 “索引(index)” 和“签名(signature)”两局部。 2.1 索引(index)从开发人员的角度来看,索引,相似于C语言中指针,它像一个箭头一样能够指向一个特定的事物,出于某些起因咱们可能无奈间接拜访这个事物,或者这个事物与其余的货色混合在一起,间接拜访这个事物可能要在很多其余事物中寻找很久。因而,咱们应用索引指向这个事物,能够了解为咱们在咱们须要的事物上绑了一根线,并且留了一个线头在身边,每当咱们想要应用这个事物的时候,咱们不须要再从一堆事物中去寻找它,只须要拿起这个线头,并顺着这根线就能找到这个特定的事物,这个线头就是"索引 index",并且很显著,一根线不容许分叉绑定两个事物,所以通常大家默认某个事物的"索引 index"是不会再指向另一个事物的。 因而,在开发的过程中,“索引 index”最次要的应用场景就是“在一堆事物中,查找特定的事物”。例如:最常见的数据结构-数组,就是“索引”的一个优良案例。在数组中,索引是一个整形的数字,这个数字是数组中每个元素的地位信息,通过地位,疾速的定位某个数组元素。 int a[3] = [1, 2, 3];// 应用索引0,就能够在1,2,3三个数字中,疾速的找到排在最后面的元素。assert a[0] = 1;assert a[1] = 2;assert a[3] = 3;除了数组,另一个应用索引的数据结构是咱们常见的Hash表,只不过在有些编程语言中将哈希表中的索引叫做key。 hashtable<string, string> a;// "Jack" 就能够视作一个索引,通过名字字符串作为索引,// 在不思考重名的状况下,它指向了一个构造实例 Person("Jack")。a.put("Jack", new Person("Jack"))a.put("Tom", new Person("Tom"))a.put("Lee", new Person("Lee"))再举一个例子,很多编程语言中都存在的构造struct或者类class,也应用到了索引的思维。 // 能够看做是String和Integer的汇合// 如果没有索引,咱们就只晓得Person外部有两个属性,// 一个类型为String示意名字,// 一个为Integer示意年龄。struct Person{ name: String, age: Integer,}Person p = new Person(name: "Jack", age: 10);// 通过索引name咱们可能轻松的获取到Person的名字Jack。assert p.name == "Jack"// 通过索引age咱们可能轻松的获取到Person的年龄10。assert p.age == 10综上,索引能够被看作一个指针,没有具体的格局束缚,只有能惟一的指向一个事物即可,不能具备二义性,即不能指向A的同时又指向B。或者索引也能够看作一个办法,以索引值为参数,返回索引指向的事物。 ...

August 24, 2022 · 3 min · jiezi

关于编程语言:许式伟Go-演进之路

7 月 10 日,一年一度的 ECUG Con 2022 在线上圆满举办。许式伟作为七牛云 CEO、ECUG 社区发起人、Go+ 语言发明人,为大家来带了《Go+ 演进之路》的主题演讲。以下内容依据演讲实录整顿。 大家好,欢送来到 ECUG Con 2022。ECUG 大会从 2007 年开始,到明天曾经第 15 个年头了,我根本每年都会为大家带来演讲。继上届大会之后,往年我想和大家持续分享 Go+ 的相干内容,聊聊 Go+ 的演进之路。咱们会谈谈 Go+ 过来都产生了什么?咱们当初正在做什么?以及咱们将来会怎么持续去进行迭代?  一、Go+ 历史的要害节点纵观 Go+ 的倒退历程,咱们大略会分四个要害的节点。 首先是 v0.5 版本及以前的「史前版本」。因为它过后叫做 qlang,其实和 Go+ 没有关系,所以叫「史前版本」。咱们当初把 qlang 的代码,从 Go+ 移到我集体的 GitHub 上面了。之后是 v0.6 到 v0.7 的原型版本,次要是为了让大家看到 Go+ 到底长什么样,因为它和之前的  qlang 有十分大的不同,qlang 是一个脚本语言,Go+ 实际上是一个动态类型的语言。尔后,咱们从这个原型版本登程,让它可能更加靠近工程的应用。比拟重要的里程碑就是去年 v1.0 版本的公布,Go+ 的指标和代码格调被正式确定下来。尔后,咱们基本上是连续这个指标和它的代码格调继续前进。往年上半年咱们公布了 Go+ 的 1.1 版本,它实际上是 Go+ 的第一个工程化版本,它能够正式用于生产环境。  从 Go+ 1.0 开始,咱们首先提出了「三位一体」的概念,即面向工程,STEM 教育和数据迷信。 实际上咱们谈的是全民编程,也就是人人都能够学编程。在明天咱们能够看到,编程教育在将来,肯定有越来越多的人会把它看作基础学科,和数学、语文、英语没有什么本质区别。这也是为什么 Go+ 会把 STEM 教育作为十分重要的支撑点。 那么 Go+ 1.0 都做到了什么呢?首先是确定了 Go+ 的代码格调,它是以命令行格调为根底,极尽可能去实现低门槛化。咱们心愿 7 到 8 岁的小朋友,就有能力学 Go+。 另外一个很重要的点,是咱们实现了类文件 Beta 版。它实际上试图实现面向对象、畛域常识表白的低门槛化,也就是当初比拟火的低代码畛域。实际上面向对象尽管是好的货色,有助于对世界的形象,然而它也带来了了解上的难度。因而如何去让这些高阶的工程概念低门槛化,Go+ 类文件是在这方面最重要的摸索。 另外 Go+ 1.0 在兼容 Go 语法方面获得了突破性的停顿,这也是它最初被标为 1.0 的起因。咱们在这个版本上,把大部分 Go 语法都实现了比拟好的兼容性,基本上做到了在 Go 根底下来做扩大这样一个最底线的指标。 谈到 Go+ 的指标,大家可能会有十分多的疑难,实际上从方才的指标也能够看出,咱们十分关注低门槛化。那谈到低门槛化,就不得不提 Python 这个语言。Python 的胜利,到底通知人们什么事件呢?  首先第一个重要的点在于,它通知咱们性能并不是最重要的。尽管大家都比拟看重性能,但单从性能来看的话,Python 在脚本语言外面我认为只能算二流,它其实并不快。因为性能其实是能够靠工夫去解决的。语言的生命周期都十分长,Python 到往年曾经有 32 年的历史了,它的性能问题是有机会能够靠工夫来一直迭代解决的。但语言的个性并不能,每一步语言个性的抉择都是将来的包袱。所以从这个视角来看,也心愿大家看待语言,尽量避免唯性能论吧。 第二个点在于,它揭示了对语言来说最重要的是什么?或者说 Python 为什么能胜利?其实我感觉,指标人群的抉择是十分根因的货色。语言的个性跟指标人群的抉择无关,所以语言个性的抉择最重要。Python 从诞生之初,并没有给本人数据迷信语言的定位,它认为应该让语言尽量精简,容易被了解、被学习。它其实是一个少有的低门槛语言,因为在我看来,真正能够称为低门槛的语言并不多。 咱们想一下大家熟知的语言,比如说 Ruby,大家都说它很简洁,然而其实它有十分多的语言魔法。所以它可能很弱小,然而不能称之为易学习。所以在我心目中,能称得上是低门槛的语言 BASIC 算一个,面向教学畛域的 Scratch 算一个,也就是说其实在低门槛畛域进行摸索的语言并没有那么多,但正因为 Python 面向了低门槛,所以它尽管没有将本人定位成数据迷信语言,却成了数据迷信的王者。这其实蛮讥刺的,因为有十分多专一于数据迷信的语言都没有 Python 这么胜利,我认为这背地有十分粗浅的情理。 从全民编程这个大的趋势来说,其实低门槛化是将来语言支流的发展趋势,Python 恰好适应了这个大潮流,使得它明天可能比最后咱们看到的还要胜利。 那么 Python 到底还差什么?  首先从工程的视角来说,Python 这方面比拟弱。谈 Python 有些人会想到 Go,因为从 Python 转向 Go 的程序员也不少,起因就在于 Go 是设计思维最靠近 Python 的工程语言,使用者的心智累赘也是非常低的。然而 Go 语言的设计者心中根本只有工程,大家看 Go 的官网就晓得,它最关怀的一个词是 scale。也就是如何实现一个大型的工程,实现一个代码量十分宏大,然而依然在工程师掌控之中的工程。所以它没有在意低门槛,它在意的是如何去实现工程上的 scale。 所以从这两方面去看, Go+ 既然是面向全民的编程,那么咱们天然会去关注如何把 Go 和 Python 的劣势融在一体,把 Go 的工程能力和 Python 的低门槛化联合。 咱们晓得工程很宏大,去实现更宏大、更简单的零碎也是咱们所关注的,然而 STEM 教育也好,数据迷信也好,更关注的还是如何实现低门槛化。所以工程、STEM 教育、数据迷信三位一体,理论是工程和低门槛的交融,这就是 Go+ 的指标。  它们交融之后的样貌,咱们能够通过上面 Go+ 的代码范例来理解。 上面的这个示例大家可能会想到 Shell 编程,很多程序员可能会感觉 Shell 脚本是比拟低门槛的。它尽管在实现简单工作上比拟难用,然而它从了解上是大家最相熟的,咱们会看到 Go+ 的语法与 Shell 的十分靠近。  咱们再看另外一个例子,就是用 Go+ 去做游戏。下图实际上是两个角色的对话,一个非常简单的游戏,它的代码也是十分简洁的。这里咱们会看到命令行的影子,比方 onStart 这样的语句,是说在程序开始的时候,咱们应该做什么。onMsg 是我收到一个音讯当前要做什么。基本上有 onStart 和 onMsg 这样的事件机制,以及咱们看到外面的代码有 say、有 broadcast(播送音讯)。整个程序的流程,其实是通过事件加上 say 还有播送音讯,这样几个很根底的元素组成。  咱们能够看到这是两个角色的对话。第一个角色在程序开始的时候,说你来自哪里,而后紧接着播送音讯 1。另一个角色收到了音讯 1 后,他就会说我来自英国。而后他再播送音讯 2。角色一收到音讯 2 当前,他就会说你们国家的天气怎么样。这样,整个时序就由音讯驱动,两个角色之间的对话就造成了。这个程序十分简洁,通过它咱们能够看到 Go+ 在表白天然的语义上,有人造劣势,它的代码是十分通俗易懂的。 从这两个例子中咱们也能够看到,Go+ 尽管实际上是 Go 兼容的产物,但它的语法或者说倡议的最佳实际格调,和 Go 是有十分大差别的。它甚至比 Python 还要简洁,因为它抉择了命令行的格调。 这里咱们能够从工程的几个概念来了解。一是命令,它是一段代码的抽象化,最晚期的语言如 FORTRAN,它的命令其实是和函数离开的。当然起初所有的高级语言,基本上都把命令和函数合为一体。但在 Go+ 里,命令和函数从代码格调上来说是有差异的,然而它们背地都是函数。  所以在 Go+ 的代码格调上,咱们抉择了以命令格调为主体。因为命令的了解难度是最低的,小学生就能了解。其次是函数,这个概念初中生根本也就开始接触,比方三角函数。那联合计算机和数学中的函数,将两者相互印证,对初中生而言了解起来难度也不算高。基本上只有了解形参和实参的概念就能够了。 在面向对象中,类、办法这些概念,尽管它的确有助于形象世界,但实际上面向对象编程的了解门槛是最高的。所以 Go+ 其实在竭力防止让程序员用面向对象的写法。实际上在背地咱们会应用面向对象的一些思维,但在语言语法上,咱们尽量避免太过于面向对象化。所以 Go+ 1.0 中咱们看到了它根本奠定了 Go+ 的代码格调和指标。  既然指标和格调都定了,基本上咱们心愿的第一件事件,就是可能实现工程,成为第一个能够用于理论生产环境的版本。为了实现这个指标,从优先级来说最重要的有两件事件。一个是对模块 Module 的反对,大家都晓得 Go 对 Module 反对是很晚的,而 Go+ 在 1.1 版本基本上就兼容了 Go 的模块概念。咱们实现了对模块比拟齐备的反对,和 Go 用起来的体验是十分统一的。另外一个很重要的个性是,咱们实现了 Go 和 Go+ 的混合工程。这对用于生产环境是有十分大的帮忙的。因为大部分程序员面临的第一个问题,就是 Go+ 用来做什么?历史的工程可能是 Go 写的,那如何把它转化成 Go+ 呢?其实不必转,因为你的 Go 工程,就是 Go+ 的工程,你只须要在下面写一些 Go+ 的函数就行了。这样一来,咱们就能够十分轻松地去把 Go+ 用于生产环境。 接下来是提供 c2go 的预览,这是为后续版本服务的,它是一个十分难啃的骨头。咱们也在 Go+ 1.1 版本根本把它实现了。Go+ 反对 C,实际上是援用了 c2go 这个我的项目。咱们在这个版本实现了 c2go 最根底的能力。  咱们看 Go+ 的版本演进,如果说 Go+ 1.0 版本是明指标、定格调,那么 1.1 版本是为了进生产环境。模块也好,Go/Go+ 混合编程也好,其实都是在为进入生产环境打基础。  Go/Go+ 的混合编程,正如我方才提到的,任何一个 Go 工程,只有在其中增加几个 Go+ 的源代码,而后去把 go 的命令换成 gop,就能够失常地去做 Go+ 开发了。这实际上把 Go+ 的应用门槛降到了最低。 二、Go+ 以后节点:v1.2.x  以上是 Go+ 的过来,上面我想和大家分享以后 Go+ 正在做的事件,也就是 Go+ v1.2  版本。这个版本我是把它定义为 Go+ 特色化造成的过程。咱们预计在往年十二月份将 Go+ v1.2 版本正式公布。 咱们说这个版本是特色化造成的过程,次要有这样几个起因。首先是咱们在 1.0 版本中引入的类文件会转正,完结 Beta 过程。类文件是 Go+ 里十分重要的概念。第二个是 c2go,它对 Go+ 后续倒退起着至关重要的作用。咱们心愿 Go+ 的 v1.2 版本可能让 c2go 进入工程化,它的实现标记是至多实现了 sqlite3 的迁徙。 除了这两个很特色的性能外,Go/Go+ 混合编程也将失去加强。目前,Go/Go+ 的混合编程还不反对调用 Go 的泛型。咱们晓得 Go 的 v1.18 版本,引入了十分重要的个性就是泛型,但当初 Go+ 还不反对 Go 的泛型。那咱们在 v1.2 版本也会去反对。咱们不是在 Go+ 里去定义泛型,而是调用 Go 的泛型。 基于这样形式,咱们是让 Go+ 可能对泛型概念有最小化的能力,因为泛型是一个比较复杂的概念,但咱们并不心愿 Go+ 变得特地简单。从久远来看,Go+ 对泛型实际上持十分凋谢的态度,兴许有一天会全面反对泛型,但咱们不会把它看成优先级很高的货色。如果真须要用泛型,咱们心愿是通过和 Go 的混合工程来达到。 咱们接下来重点讲讲这两个特色性能,类文件和 c2go。 先聊类文件。类文件最直白的一个解释,就是咱们用一个文件去定义一个类。下图右侧就是用 Go 去写类的办法,想必大家十分相熟。  咱们先定义一个叫 Rect 的构造体,它有长度和宽度两个成员,那咱们再定义面积的成员办法,那就是长度和高度的乘积,这就是一个非常简单的程序。 用类文件来实现这个能力的话,代码能够见上图左侧。咱们基本上看不到任何面向对象的暗藏。咱们定义了两个全局变量,一个叫宽度,一个叫高度,而后定义一个全局的办法叫面积,它是这两个全局变量的乘积。那这个代码比失常的面向对象代码看起来要简洁很多,非常容易被了解。但实际上它这两个文件是等价的。因为类文件最间接的能力,就是负责把一个看起来像是面向过程的代码,主动变成一个面向对象的办法。因为它没有引入任何新的语法,所以其实对中小学生也绝对容易,不必去学新的常识。  但类文件做的并不只这些。实际上它还可能自定义基类,可能自定义整个程序执行的框架。咱们最近 Go+ 的公众号也重点在谈类文件,大家能够去看一看。Go+ 类文件:DSL vs. SDFGo+ 类文件:ClassFile 机制详解  提到类文件,就须要提到 Go+ 的一个设计哲学:Go+ 不反对畛域专用语言,也就不是不反对 DSL,但 Go+ 却对业余畛域敌对(Specific Domain Friendly)。 为什么说它是业余畛域敌对呢?从上文咱们的举例中来看,第一个例子是 Shell 编程,或者叫 DevOps 的畛域编程。咱们能够看到 Go+ 的代码看起来十分靠近于 Shell 编程。  实际上 Shell 编程更像是 DevOps 的 DSL,咱们很少在 Shell 之外去用这个语言,它只用于十分根底的一些自动化(automation)。然而咱们能够看到,Go+ 实际上是能够让语言自身的代码十分靠近于 DSL,但实际上它却不是 DSL,它是十分正宗的 Go+ 语法。 同样的情理,咱们能够看到在更简单的游戏编程中,Go+ 也是十分的简洁的。而且它不仅简洁,更重要的是它同时也十分弱小,它可能去做相似于《动物大战僵尸》这样比较复杂的游戏。当然咱们没有去做 3D 游戏的引擎,如果要做,那么它仍然是十分精简的 3D 游戏的引擎。  正是因为 Go+ 引入了类文件,让它的语法看起来十分畛域化。这意味着 Go+ 十分长于联合畛域的特色去提炼畛域常识。从而使得 Go+ 利于畛域的开发。 当然咱们类文件当初还在 Beta 的阶段,以后曾经在 2D 的游戏、DevOps 这些畛域做了一些实际。然而毕竟畛域是十分多的,对类文件这个概念来说,最大的挑战是畛域十分多,在无限的几个畛域里试验是不够的,须要有更多的畛域来验证类文件机制的普适性,判断它是否适应各个领域。  另外,咱们还须要革除 Beta 版本类文件外面的一些不必要的束缚。比如说,咱们以后一个业余的畛域只容许有一种工作类,在一些业余畛域里显然很有可能会须要突破这个束缚。所以咱们接下来在 v1.2 版本,会去打消掉相似这样的不必要束缚。咱们心愿可能让一个业余畛域有多种工作类,如此一来它的普适性就会更强。 v1.2 版本的第二个特色性能,就是方才提到 c2go。c2go 的语法可能看起来有点像 cgo,然而它和 cgo 齐全不可同日而语,cgo 用起来大家吐槽十分多,然而用 c2go 会感觉十分爽,因为咱们根本做到了无缝对接 C 语言。 首先,C 语言的代码是不须要通过额定包装的,间接就能够由 Go+ 来调用。其次,咱们让 C 和 Go+ 的类型零碎尽可能统一,极大化地升高了 C 和 Go+ 的对接老本。这样的话两者互相操作,类型上根本不必做转化。比如说在 C 语言外面的 void,就是无返回值、无参数的一个函数,到了 Go+ 里,基本上是一个 func()。那这样一个类型的映射,其实在 cgo 外面是做不到的。因为 cgo 须要做必要的函数调用约定转化,能力实现这样的调用。最初,咱们把 C 翻译之后,它的数据结构内存布局和程序语义尽可能放弃不变。也就是说 C 程序员,对 C 的代码的惯例语义了解依然是正确的。比如说字符串,它是以 '\x00',就是以 0 为结尾的,这些概念到了 Go+ 这边翻译当前,其实它依然是正确的。这样也会有助大家不至于在语义上出现分歧。 从下图的例子中咱们能够看出,通过 c2go 的形式,咱们实现了 C 的简洁调用。  咱们能够看到第一句是 import C,然而它和 Go 的语义是齐全不同的,在 Go+ 里它其实是 C/github.com/goplus/libc 的缩写。那咱们能够看出,这个例子中咱们调用了 2 个 C 函数:printf 和 fprintf,应用了一个 C 变量 stderr。另外还有一个比拟有意思的中央,是字符串,咱们看到在 Go+ 的规范字符串后面写一个 C 前缀,就代表 Go+ 里传入 C 的字符串常量,这实际上是一个 Go+ 的语法。然而有了这个语法当前,会使得在 Go+ 里调用 C 的代码会十分精简,不至于像 cgo 一样,会有一个从 Go 字符串转化成 C 的字符串,并且最初还要开释它这样一个过程。 这是一个十分小的例子,然而咱们能够看到 c2go 在表白上,是可能让大家感觉到如同 C 和 Go 的包是没有区别的。咱们引入 C 的包和引入 Go 的包,根本应用上大差不差。而且在所有的细节上,都会让大家感觉 C 的模块如同就是 Go 的模块,当然同时也是 Go+ 的模块,这是咱们心愿可能达到的最终成果。这也是咱们在 Go+ 里无缝兼容 C 的一个逻辑。 当然以后 c2go 还是一个预览版,它连 Beta 版都算不上。c2go 以后曾经实现了 C 语法 99% 以上的兼容,它没有实现的局部,次要在于规范 C 库的迁徙,它的完成度可能只有 5%,处在十分晚期的阶段。对 c2go 来说,它最次要挑战首先在于跨平台。一方面是 C 规范库(libc)的跨平台,另一方面如何让 c2go 对所有的 C 工程都能够轻松实现跨平台能力,同样是十分重要的能力建设工作。  单从 libc 自身来说,其实无论是 syscall、pthread,都有比拟大的工作量。syscall 当初咱们曾经反对了 mac 版本,但 Linux 和 Windows 还没有反对,那 pthread 就更不用说了,这是咱们接下来工作量最大的一个板块。所以 c2go 接下来最重要的是整个规范 C 库的迁徙,它自身就是比拟宏大的工作。 以上就是以后 Go+ v1.2 版本想要解决的事件,当然还有反对 Go 模板调用的小细节,咱们就不开展了。根本以上几个点形成了 Go+ 的特色能力,无论是类文件,还是对 C 的兼容,以及 Go 和 Go+ 的混合工程,都使得 Go+ 有了十分好的底子。 三、Go+ 将来布局 那么从 Go+ 的将来布局来说,大家都晓得 Go+ 在谈工程和 STEM 教育、数据一体化,实际上到 v1.2 为止,Go+ 在数据迷信畛域做的事件是绝对少的。会有一些十分无限的能力去实现,比方列表解析、range 表达式等等,但谈不上体系化,实际上 Go+ 的数据科学技术栈还是没有的。 所以在 v1.7 这个十分重要的大版本外面,咱们心愿 Go+ 本身数据迷信的技术栈可能造成。而后到 v2.0 又做了一个大的版本越级,咱们心愿 v2.0 这个阶段,要可能反对 Python 语法。当然,不是说在 Go+ 外面去写 Python。实际上跟反对 C 比拟相似,可能让 Go+ 无缝地去 import Python 的包,这样就使得 Python 数据迷信畛域历史的积攒,都能够无缝变成 Go+ 的数据迷信能力。  实际上这两个内容,都是面向数据迷信的。起因在于,从工程和低门槛化的大方向来说,到 v1.2 版本基本上能力曾经齐备。Go+ 基本上不太会去在语法上花很多精力,这一点 Go+ 和 Go 是有十分类似的哲学,咱们认为语法越少越好,而不是越多越好。所以,基本上到了 v1.2 版本当前,Go+ 的语法比拟定型了,咱们不太会加各种稀奇古怪的语法。 然而数据迷信是 Go+ 最初的攻坚战,它并不是简略的一个语法翻新上可能解决的问题。Go 的数据迷信根底能力是比拟薄的,当然也是因为 Go 自身衰亡的工夫比拟短,所以它在服务端的工程实际居多。 那么数据迷信底子这么薄的话,应该怎么办呢?v1.2 版本把 c2go 能力去工程化当前,为最初的数据迷信攻坚战打下了重要根底。因为 Python 的根底是 C,咱们如果对 C 做好了兼容,兼容 Python 就变得更加简略了。  v1.7 版本咱们会关注什么?它的指标实际上是 Go+ 数据科学技术栈的造成,打造 Go+ 本身的数据迷信能力,比方向量、矩阵等一些方面的摸索。实际上即便有了这样的根底能力,它依然还是比拟薄弱的。  如何真正解决这个问题,让本人站在伟人的肩膀上?咱们的构想是通过 c2go 来反对 Python 的数据迷信底座(也就是 C 库那局部),v1.7 版本咱们心愿可能把 Python 的 C 库局部进行兼容,从而走上 Go+ 和 Python 数据迷信能力生态交融的路线。然而这个阶段咱们对 Python 自身不会去做太多思考,次要还是关注 Python 的 C 库局部。  然而到了 v2.0 版本,咱们就开始思考把 Python 的语法也引入进来,让 Python 的包天然地成为 Go+ 生态的一部分。咱们构想在 v2.0 版本,至多要反对 CPython、NumPy、pandas 这三个工程。第一个是 Python 自身,其余两个是最出名的 Python 数据迷信工程,有了它们当前,咱们认为 Go+ 就具备了对数据迷信的根底生态能力。 这里为大家展现这三个工程的代码,列一下代码行的构造。咱们看 Python 自身,大部分底座的代码是 C,然而有 65% 的 Python 的代码其实次要是一些规范库,这个是很容易了解的。然而最外围的能力都是 C 实现的,占 30% 多。  第二个就是 NumPy,NumPy 其实也是一样的做法,它最外围的能力就是 C 写的,还有大量的 C++。然而在这个根底上迭加了一个工具包,是用 Python 本人写的。从这个代码行能够看到,占比根本在 6:3、6:4 的样子。  pandas 构造有十分大的差别,它自身大部分代码是 Python 写的,C 的局部比拟少。基本上到了 v2.0 版本能力比拟好地反对 pandas,v1.7 版本基本上还不太能反对 pandas,但曾经能够反对 NumPy 了。  总结一下 Go+ 的演进之路,咱们的指标是实现工程、STEM 教育、数据迷信的三位一体。这次要还是因为咱们将来的语言,支流趋势是面向全民编程,也就是人人都能够学编程。实际上这个指标很难,但它是将来语言倒退的支流趋势。目前鲜有语言在面向这样的趋势致力,Go+ 能够认为是第一个。  往年内,Go+ 在工程化和低门槛交融的摸索就将告一段落。从明年开始,咱们将对数据迷信发动最初的攻坚战。大家都晓得,Go+ 诞生之初咱们就在谈数据迷信。然而理论真正去执行的时候,数据迷信反而放到最初一点。 起因在于数据迷信真的是比拟难的一件事件,对 Go 来说它的间隔比拟远。然而咱们基本上有了 c2go 的根底,就会发现它对咱们日后去做好数据迷信,会产生很重要的撑持作用。 最初,我置信有了数据迷信的撑持,Go+ 会是举世无双的。它的将来,值得咱们独特期待。  ...

July 15, 2022 · 4 min · jiezi

关于编程语言:2022-年编程语言趋势SwiftKotlin-热度持续增长收入最高的-5-种编程语言竟是它们

随着低代码和无代码平台的衰亡,2022 年编程语言的世界正在悄悄产生着变动。现在,大多数开发人员对最罕用的惯例编程语言有着透彻的理解,但把握不常见的编程语言也能帮忙开发者取得高薪的工作。特地是如软件开发、WEB 开发、利用程序开发等需要一直增多,对于开发者而言一些编程语言热度榜单也值得参考。 近日,不少外网都对 2022 年编程语言各个维度的热度趋势及排名做了盘点,正所谓“明天热门的货色今天可能会不受欢迎”,所以新的编程语言不断涌现,且每一种都有本人的长处和毛病,因而开发人员必须理解它们。 2022 年编程语言趋势其中,一份来自 Serpwizard 的“2022 年编程语言趋势”报告备受开发者关注。该报告以“倒退”的角度来对 2022 年编程语言趋势做了盘点。一起来看看: 1、JavaScript 继续风行多年来,JavaScript 始终是最风行的编程语言之一,2022 年这种状况不太可能扭转。该语言一直倒退,新的框架和库一直公布。这使它成为心愿跟上最新趋势的开发人员的最佳抉择。 2、Python 崛起,2022 年持续风行Python 在近年来越来越受欢迎,并将在 2022 年持续风行。这种语言因其简略的语法和宽泛的规范库而深受开发人员的青睐。因为其弱小的数据分析能力,它在科学界也越来越受欢迎。 3、挪动终端的倒退带动 Swift 和 Kotlin 持续增长现在,应用智能手机和平板电脑的人数比以往任何时候都多,挪动设施市场的持续增长,意味着像 Swift 和 Kotlin 这样的专门用于开发 iOS 和 Android 应用程序的语言可能会持续增长。 4、函数式编程的风行带动 Haskell 和 Scala 成热门函数式编程是一种强调应用函数而不是对象的编程格调。像 Haskell 和 Scala 这样的语言在设计时就思考到了这种范式,并且它们越来越受到重视函数式编程(FP)益处的开发人员的欢送。 5、区块链的衰亡带动 Solidity 等语言衰亡区块链当初是一个热门话题,因为它有可能彻底改变咱们存储和共享数据的形式。尽管这项技术仍处于晚期阶段,但人们对它很感兴趣,这一趋势可能会在2022年继续下去。这可能会导致Solidity等语言的遍及,Solidity用于在以太坊区块链上开发智能合约。 6、Kotlin、Groovy 等代替 JVM 语言更风行Java 虚拟机(JVM)是一个平台,容许开发人员用多种不同的语言编写代码,并在任何有 JVM 实现的零碎上运行。这使得它成为心愿编写一次代码并在任何中央运行的开发人员的风行抉择。近年来,Kotlin、Groovy 和 Clojure 等代替 JVM 语言的风行迅速。随着越来越多的开发人员发现这些语言的益处,这种趋势可能会在 2022 年继续下去。 7、Rust 一直增长Rust 是一种重视安全性、速度和并发性的零碎编程语言。近年来,因为其平安个性变得越来越受欢迎,这使得它非常适合开发低级系统软件。随着越来越多的开发人员发现 Rust 的益处,这种趋势可能会在 2022 年继续下去。 ...

June 30, 2022 · 1 min · jiezi

关于编程语言:KusionStack-开源有感|历时两年打破-隔行如隔山-困境

文|朵晓东(花名:奕杉 ) KusionStack 负责人、蚂蚁团体高级技术专家 在基础设施技术畛域深耕,专一云原生网络、运维及编程语言等技术工作 本文 2580 字 浏览 6 分钟 |前言|本文撰写于 KusionStack 开源前夕,作者有感而发,回顾了团队从 Kusion 我的项目开发之初到现今胜利走上开源之路的艰苦历程。当中既形容了作者及其团队做 Kusion 我的项目的初心和我的项目倒退至今的成绩,也表白了作者本身对团队的由衷感谢,字里行间都散发着真情实感。 KusionStack 是什么? KusionStack 是开源的可编程云原生协定栈! Kusion 一词来源于 fusion (意为交融) ,心愿通过一站式的技术栈交融运维体系的多个角色,晋升运维基础设施的开放性、扩展性,从整体上降本增效。KusionStack 通过定义云原生可编程接入层,提供包含配置语言 KCL、模型界面、自动化工具、最佳实际在内的一整套解决方案,连通云原生基础设施与业务利用,连贯定义和应用基础设施的各个团队,串联利用生命周期的研发、测试、集成、公布各个阶段,服务于云原生自动化零碎建设,减速云原生落地。 PART. 1为了一个现实的运维体系2019 年秋,MOSN 的工作已继续了近两年,期间咱们逐渐实现了在支付宝外围链路的状态验证。整个过程中除了 MOSN 自身面对的种种技术挑战和艰难,所谓的云原生技术红利,实际上也曾经掣肘于运维零碎固化所造成的效率制约。 有一天主管找我吃饭 (下套) ,期间向我形容了他现实中的运维体系: 他心愿 SRE 能通过一种专用语言来编写需要,通过写代码来定义基础设施的状态,而不是破费极大的精力在查看、发现、修复的循环上。基础设施团队则通过提供凋谢的可编程语言和工具撑持不同诉求的 SRE 团队,达到更高的整体 ROI。 我立即意识到这和 Hashicorp 的 Terraform 神之类似 (起初 Hashicorp 在 2021 年底上市,以超过 150 亿美元的市值成为迄今为止市值最高的一次开源 IPO) 。另一方面,不同于 IaaS 交付场景,蚂蚁面对着大量更规模化、复杂度更高的云原生 PaaS 场景,又让我想到了 Google 外部使用专用语言、工具等技术凋谢 Borg[1]运维能力的实际[2],过后感觉这是一个既有意思又有挑战的事[3]。 饭桌上咱们聊了一些思路以及一些还不太确定的挑战,他问我想不想搞一个试试,搞不成也没关系。过后没想太多,饭没吃完就许可了。 PART. 2漫长的学习、摸索与实际隔行如隔山。 没有过语言设计研发的教训,也没有过凋谢自动化零碎设计的教训,我的项目发展之初,咱们就陷入了举步维艰的窘境。 经验了一段漫长工夫的学习、摸索和实际的重复循环之后,我的项目仍旧没有大的起色,更艰难的是咱们岂但要面对蚂蚁外部简单又耦合的场景和问题,还要禁受「这种高度工程化的形式在蚂蚁是否有生存土壤」的质疑。 ...

June 7, 2022 · 1 min · jiezi

关于编程语言:TIOBE-3-月榜单Python-牢据榜首Lua-重返前-20

近日,TIOBE 颁布了 2022 年 3 月的编程语言排行榜。自去年 10 月登顶后,Python 至今仍牢牢占据榜一的地位。而本月值得注意的是:脚本语言 Lua 挤掉了 Groovy ,从新回到了 TIOBE 榜单的前 20 名。 在 2011 年鼎盛时期,Lua 曾短暂进入前 10 名。目前尚不分明它是否会再次回归。但很显著的是,Lua 正在游戏开发市场致力追赶:容易学习,执行速度快,与 C 语言的接口简略,使得 Lua 成为游戏、工作的现实抉择。而其取得成功的驱动力之一来自十分受欢迎的游戏平台 Roblox,它应用 Lua 作为其次要的编程语言。 TIOBE 3 月 TOP 20 编程语言 TOP 10 编程语言 TIOBE 指数走势(2002年-2022年) 21-50 编程语言排名因为这份排名是非官方公布的,因而可能存在脱漏,故仅供参考。 第 51-100 名如下,因为它们之间的数值差别较小,仅以文本模式列出(按字母排序): ABC, ActionScript, Alice, Apex, ATLAS, Bash, bc, BCPL, Boo, Bourne shell, C shell, CL(OS/400), Clipper, CLIPS, CoffeeScript, DCL, DiBOL, Dylan, ECMAScript, Eiffel, Elm, EXEC, F#, Factor, GML, Hack, Harbour, Haxe, Icon, IDL, Io, J#, Korn shell, Ladder Logic, LiveCode, LPC, ML, Monkey, OCaml, OpenCL, Oz, Processing, Q, Racket, REXX, Ring, S-PLUS, Scheme, SPARK, Tcl本月索引中的变动 本月对索引的定义做了以下改变。 ...

March 9, 2022 · 1 min · jiezi

关于编程语言:代码的智能输入法帮你每天多写10行代码

作为有着多年教训的复制粘帖工程师,我感觉对于业务开发,参考已有代码来实现新逻辑是很实在的需要,如果能通过含糊的记忆疾速调用出相应的代码段,而不是手动全局搜寻,应该能肯定水平上进步代码输出的效率。 基于这个想法,开发了一个vscode插件 Code Finder,欢送应用。 应用成果类比中文的智能拼音输入法,咱们输出一个词组,只有通过首字母就能找到最罕用的词组。 如果用这种形式输出代码的话,成果是这样的 CodeFinder 是代码的智能输入法,输出大量字符来疾速实现一行或者多行代码。主动提取以后我的项目的所有代码片段,也能够增加自定义代码片段。反对所有编程语言,比方 Javascript, HTML, CSS, Python, Go, PHP, Vue, React ... 一些外围逻辑的实现代码片段的划分提醒的大部分代码片段来自本地我的项目,所以须要对我的项目源码进行代码片段提取。最开始想从语法和语义来进行分段,发现这是不归路。对于绝大部分编程语言,咱们都会用缩进来表白代码的段落,间接依据代码缩进划分段落就能够了。定义一个简略的规定,前缀空格数量示意层级,低层级的代码行能够和高层级的代码行组成段落。同级的代码行应该属于不同的代码片段。而后递归划分就能够失去各个代码片段了。再聚合雷同的代码片段。 索引和搜寻实质上,这是一个搜寻的问题。对于输出,能够应用Trie树的形式来索引各个代码片段。因为要在本地运行,几十毫秒的工夫内实现搜寻,在代码片段达到一定量级的时候,就可能无奈遍历了,所以引入了剪枝的逻辑,在工夫用完时,抛弃广度遍历过程中匹配状况较差的分支。 跳跃式输出为了缩小对失常输出的烦扰,就要辨别哪些是惯例输出,哪些是对输入法的调用。所以发明了“跳跃式输出”:空格分隔间断输出多个词,疏忽其余符号。如果应用这种不合乎语法规定的省略输出,阐明是用户被动发动,否则认为是惯例输出。跳跃式输出每次都会提醒,而惯例输出只有在十分匹配的状况下才会提醒。

January 17, 2022 · 1 min · jiezi

关于编程语言:搞安全开发都是用什么编程语言

很多小伙伴都在微信上问我:搞平安开发,到底开发个啥,都是用什么编程语言? 明天就来具体说说这个话题,我打算从平安公司研发的产品这个角度来切入,看看都有哪些产品,以及都用到哪些语言。 平安公司的产品研发,次要是上面这些货色,上面别离来说一下。 WAF(Web网站利用防火墙) 数据库网关 防火墙、IDS、IPS NTA(网络流量剖析)SIEM(安全事件剖析核心、态势感知、大数据安全剖析) EDR(终端设备上的安全软件) DLP(数据透露防护) UBA(用户行为剖析)杀毒软件 平安检测沙箱WAFWAF全称Web网站利用防火墙,是一种非凡的防火墙,专门用来爱护Web利用平安的平安产品,次要进攻SQL注入、XSS注入、CSRF、CC攻打之类的网络攻击。 这类产品个别有两个流派。一种是基于底层网络流量来做,一种是基于nginx/openresty这类下层WebServer来做。 基于底层流量剖析引擎的来做的,以 C/C++ 为主。 基于nginx/openresty引擎来做的,以C/C++ 和 Lua为主。 数据库网关和WAF有点相似,但爱护的指标不是Web利用,而是数据库。 毕竟,对于绝大多数互联网公司来说,WebServer和数据库是撑持他们业务中最重要的两个角色,所以守护好这两个货色是必须的! 数据库网关,次要负责进攻对数据库的攻打,检测高危操作,数据安全备份等。 用到的编程语言以C/C++ 和 Java为主。 当初云计算时代,很多公司的业务都放在了云端,这些云计算厂商相应的也都有推出本人的平安防护服务,WAF、数据库网关、DDOS云盾三大件是标准配置。 数据库网关,次要负责进攻对数据库的攻打,检测高危操作,数据安全备份等。 用到的编程语言以C/C++ 和 Java为主。 当初云计算时代,很多公司的业务都放在了云端,这些云计算厂商相应的也都有推出本人的平安防护服务,WAF、数据库网关、DDOS云盾三大件是标准配置。 杀毒软件最常见的,普通人最能间接接触的应该就是安全软件了。 次要波及到的技术有病毒木马剖析、驱动开发,应用的编程语言次要是C、C++。 NTA、防火墙、IDS、IPSNTA就是网路流量剖析的简称,IDS是入侵检测零碎,IPS是入侵进攻零碎。 这类货色,次要是基于网络流量的平安检测和进攻产品。波及到网络抓包、抓包剖析等货色。 一般来说,这类产品对性能要求特地高,因为通常须要解决十分大的流量数据,10Gbps的万兆网络流量剖析是惯例操作。 所以,这部分抓包、剖析比拟底层的引擎根本都是用 C/C++ 来开发。 SIEMSIEM全称Security Information Event Management(平安信息事件管理中心),差不多就是很多公司中的大数据安全剖析零碎、态势感知零碎之类的玩意儿。 那些看起来各种高端大气狂拽炫酷的界面,基本上都是这种产品: 这是一个平安剖析平台,通过会集多方(网络流量、日志、威逼情报、沙箱检测等)产生的数据,并对这些数据进行关联剖析,而后判断有没有平安危险,产生平安告警。 SIEM,基本上很多公司都有,但真正做得好的不多,想要做好,除了数据源的高价值,对剖析算法、算法模型都有十分高的要求,这方面的人才很难找。 这块偏重于业务层的剖析工作,波及各种解决,在我见到的各大公司产品中,次要是Java开发,毕竟Java背地的大数据生态是一大劣势,对于数据挖掘,关联剖析都是严密相干的。 EDR全称终端平安响应零碎,是运行在终端设备上的一套软件。 其实跟咱们常见的杀毒软件很像,除了具备根底的平安进攻性能,爱护主机免受攻打,还会将主机上产生的一些事件汇报到SIEM用于平安剖析。 EDR和杀毒软件相似,也是用 C/C++ 开发。 UBA全称用户行为剖析,是基于EDR、NTA等产品的产生数据之上,用来剖析用户行为的一套零碎。 简略来说,这玩意依据收集到的员工的行为(电脑上的操作、上网数据等),能够剖析出,这个用户是不是异样,有没有干什么好事。 比方某个用户工作工夫微信相干的IP产生的流量十分多,则很有可能判断这家伙下班常常群聊摸鱼~ 这套零碎是一套纯后端系统,个别也是应用Java开发。 DLP全称数据透露防护,也是运行在终端设备上的一套软件,当然也有一些不在终端而以网关模式存在。 不同于杀毒软件和EDR,DLP的次要作用是避免主机上的数据泄露。个别用在一些比拟重要的单位中,员工电脑上的数据十分重要,用于避免窃密事件产生。 次要波及的技术是驱动开发技术,流量剖析技术,用的编程语言也是C/C++。 平安检测沙箱病毒木马和Exploit的剖析,除了传统的基于特色和规定的动态剖析引擎之外,动态分析技术是另一个重要的补充。而动态分析中,则次要是以沙箱剖析为代表。 ...

December 29, 2021 · 1 min · jiezi

关于编程语言:Go语言学习查缺补漏ing-Day6

作者:ReganYue 起源:恒生LIGHT云社区 Go语言学习查缺补漏ing Day6一、构造体嵌套时领有同名办法的状况咱们来看一看上面这段代码代表的含意: package mainimport ( "fmt")type Student struct{}func (s *Student) sayHello() { fmt.Println("sayHello") s.sayBey()}func (s *Student) sayBey() { fmt.Println("sayBey")}type Teacher struct { Student}func (t *Teacher) sayBey() { fmt.Println("teacher sayBey")}func main() { t := Teacher{} t.sayBey()}在这外面有一个嵌套构造体,其中Teacher是内部类型,Student是外部类型。这样就能实现外部属性,也就是这的Student的属性办法,可能被内部类型也就是Teacher领有。当然,内部属性也能够领有本人的属性、办法,如果领有了与外部类型一样名字的办法,那么同名的外部类型的办法就会失去作用。 这个例子的输入后果是什么,我想你应该晓得了: teacher sayBey这个例子中的sayBey()办法就是同名的办法,所以外部类型Student的这个办法会失去作用,调用就是调用Teacher中定义的sayBey()办法。 二、应用defer执行函数的一个注意事项package mainimport ( "fmt")func sayHello(i int) { fmt.Println(i)}func main() { i := 888 defer sayHello(i) i = i + 8888}咱们都晓得defer是在最初执行的,那么你看一看这里输入什么? 答案是:888 为什么呢? 因为程序在运行到 defer sayHello(i)时就把函数中的参数的正本保留,这里保留的参数i的值就为888. 因而,sayHello(i)的后果并不是在主函数完结之前进行,而是在 defer关键字调用时计算的。 怎么解决这个问题呢? 很简略,在defer时应用匿名函数就行了。 ...

December 9, 2021 · 1 min · jiezi

关于编程语言:Go语言学习查缺补漏ing-Day5

作者:ReganYue 起源:恒生LIGHT云社区 Go语言学习查缺补漏ing Day5一、将切片当可变参数传递的一个问题咱们来看一段代码: package mainimport "fmt"func Myfunc(num ...int) { num[0] = 2 total := 0 for _, i := range num { total += i } num[1] = total}func Sum(num ...int) { total := 0 for _, i := range num { total += i } num[1] = total}func main() { i := []int{1, 2, 3} Myfunc(i...) fmt.Println(i) Sum(i...) fmt.Println(i)}这段代码的运行后果是: [2 7 3][2 12 3]是不是很奇怪为什么切片内的值扭转了?其实咱们将切片作为函数参数传递给函数是进行的值传递,所以咱们传递给函数的参数其实是上面这个slice的值拷贝。 type slice struct{ value *int length uint capacity uint }然而,这个slice构造体内的value是一个指针,所以这个slice就算进行了拷贝,它和它的拷贝值都是同一个value,指向同一块区域。 ...

December 8, 2021 · 1 min · jiezi

关于编程语言:字节码引用检测原理与实战

一、字节码与援用检测1.1 Java字节码本章中的字节码重点钻研Java 字节码,Java字节码(Java bytecode)是Java虚拟机执行的一种指令格局。能够通过javap -c -v xxx.class(Class文件门路) 命令来查看一个Class对应的字节码文件,如下图所示: 1.2 字节码检测字节码检测实质就是对.java或.kt文件编译后生成的Class文件进行相干的剖析和检测。在正式介绍字节码剖析在援用检测上的原理与实战前,先介绍下字节码援用检测的技术预研背景。 二、字节码检测技术的预研背景整个预研背景须要先从笔者负责的APP--外销官网APP的软件架构讲起。 2.1 外销官网APP软件架构外销官网APP目前共12个子仓,子仓分别独立编译成AAR文件供APP工程应用,软件架构图如下图所示: APP以下,下层浅蓝色为业务层,两头绿色为组件层,最上层深蓝色为根底框架层: 业务层:位于架构最上层,依据业务线划分的业务模块(比方商城、社区、服务),与产品业务绝对应。组件层:是APP的一些根底性能(比方登录、自降级)和业务专用的组件(比方分享、地址治理、视频播放),提供肯定的复用能力。根底框架层:通过跟业务齐全无关的根底组件(比方三方框架、自行封装的通用能力),提供齐全的复用能力。2.2 外销官网APP客户端开发模式官网APP目前次要分3条业务线,多业务版本并行开发是常态,所以模块化十分必要。官网APP模块化的子仓均已AAR模式供APP应用,且存在下层AAR依赖上层AAR的状况。官网APP模块化分仓优化工作穿插在各业务版本中,各业务版本并行开发,底层仓库不免有批改。官网APP各业务版本并行开发时,个别只会新拉取以后版本须要批改代码的仓库,其余仓库均持续依赖老版本的AAR。2.3 类、办法、属性援用谬误导致的运行时解体假如以下场景: 官网APP5.0版本开发过程中,因为HardWare仓没有业务批改,所以持续应用上个版本4.9.0.0的HardWare(版本开发过程中个别只会从新拉取须要批改的仓库,无需批改的仓库会持续应用老版本),但Core仓有代码批改,所以拉取了新的5.0分支,并批改了相干代码,删除了CoreUtils类中的某个fun1办法,如下图所示: 注:硬件检测模块v4.9.0.0版本AAR中用到了外围仓 CoreUtils.class中的fun1办法,其余仓包含主APP工程均未应用到该fun1办法。请大家思考下,以上场景我的项目编译是否会有问题? 答:编译无问题 APP主仓依赖的是4.9.0.0版本的HardWare仓编译后的AAR文件,这个AAR文件早在4.9版本就编好没动,所以HardWare仓没有编译问题; APP主仓依赖的是5.0.0.0版本的Core仓,HardWare依赖的是4.9.0.0版本的Core仓,最终编译会取Core仓的高版本5.0.0.0版本参加APP工程编译,App仓没有应用被删除的fun1办法,也不存在编译问题。 以上场景我的项目编译实现后运行过程中是否会有问题? 答:有问题。 在APP运行到HardWare仓调用了CoreUtils类中fun1办法的状况下就会呈现运行时解体:Method Not Found。 因为最终参加APP工程编译的是5.0.0.0版本的Core仓,该版本曾经删除了fun1办法,所以会呈现运行时谬误。 实在案例: 1)找不到办法 2)找不到类 所幸以上问题均在开发、测试阶段发现并及时修复掉了,如果流到线上,就是运行到某性能时的必崩场景,将会十分重大。 如果你负责的APP的所有module均是源码依赖,个别状况下如果存在援用问题,编译器会进行提醒,所以个别状况下无需放心(除非依赖的底层sdk存在援用问题),但如果是相似官网这样的软件架构,则须要重点留神。 2.4 现状剖析、思考本地测试过程中已呈现过援用问题导致的运行时异样,这种运行时异样的检测只靠人工是不够的,必须要有自动化的检测工具来进行查看。传统的findBugs、Lint等是代码动态检测工具,是无奈检测出这种潜在的援用问题导致的运行时异样的,动态代码检测无奈解决此问题。所以自研自动化的检测工具火烧眉毛! 三、字节码检测的解决方案如果能在APK编译期间,通过自动化工具对所有JAR、AAR包中每个类做一遍检测,检测其中调用的办法、属性的应用是否存在援用问题,将检测出疑似问题的中央在编译时进行提醒,有必要的状况下间接报错终止编译,并输入谬误日志来揭示开发人员查看,避免问题流入线上呈现运行时异样。 原理:各子仓的Java类(或Kotlin类)在编译成AAR或JAR后,AAR、JAR中会有所有类的Class文件,咱们实际上就是须要对编译后生成的Class文件进行剖析。 如何对Class文件进行字节码剖析? 这里举荐应用 JavaAssist 或 ASM,咱们晓得Android编译过程次要通过Gradle来管制的,要想剖析Class文件字节码,咱们须要实现本人的Gradle Transform,在Transform里对Class字节码进行剖析,这里咱们间接做成Gradle插件。 在编译期间主动剖析Class字节码是否存在办法援用、属性援用、类援用找不到或者以后类无权拜访的问题,发现问题进行编译,并输入相干日志,揭示开发人员剖析,并反对对插件的配置。 到这里,整个计划的主体框架就比拟清晰了,如下图所示: 3.1 办法和属性援用检测原理办法和属性援用问题的辨认: 如何辨认一个办法援用存在问题? 该办法被删除,找不到相干办法名;找不到办法签名雷同的办法,次要是指办法的入参数量、入参类型无奈匹配;办法是非public办法,以后类无权限拜访该办法。如何辨认一个属性(字段)援用存在问题? 该属性被删除,找不到相干属性、字段;属性是非public属性,以后类无权限拜访该属性。权限修饰符阐明: 办法和属性援用的字节码检测:咱们能够利用JavaAssist、ASM等反对字节码操作的库来实现对所有类中办法、属性的扫描,并分析方法调用、属性援用是否存在援用问题。 3.2 办法和属性援用检测实战以下代码均已Kotlin编写,实现Gradle Plugin、Transform具体过程省略,间接上检测性能的代码。办法、字段援用检测: // Gradle Plugin、自定义Transform的局部这里不做赘述// 办法援用检测// 遍历每个类中的 每个办法 (包含构造方法 addBy Qihaoxin)classObj.declaredBehaviors.forEach { ctMethod -> //遍历以后类中所有办法 ctMethod.instrument(object : ExprEditor() { override fun edit(m: MethodCall?) { super.edit(m) //每个办法调用都会回调此办法,在此办法中进行检测 //援用查看性能 try { //这里不是每个办法都须要校验的,过滤掉 咱们不须要解决的 零碎办法,第三方sdk办法 等等 只校验咱们本人的业务逻辑代码 if (ctMethod.declaringClass.name.isNeedCheck()) { return } if (m == null) { throw Exception("MethodCall is null") } //不须要查看的包名 if (m.className.isNotWarn() || classObj.name.isNotWarn()) { return } //method找不到,底层会间接抛异样的,包含办法删除、办法签名不匹配的状况 m.method.instrument(ExprEditor()) //拜访权限检测,该办法非public,且对以后调用这个办法的类是不可见的 if (!m.method.visibleFrom(classObj)) { throw Exception("${m.method.name} 对 ${classObj.name} 这个类是不可见的") } } catch (e: Exception) { e.message?.let { errorInfo += "--办法剖析 Exception Message: ${e.message} \n" } errorInfo += "--办法剖析异样产生在 ${ctMethod.declaringClass.name} 这个类的${m?.lineNumber}行, ${ctMethod.name} 这个办法 \n" errorInfo += "------------------------------------------------\n" isError = true; } } /** * 成员变量调用的剖析次要有: * 变量间接被删掉后找不到的问题 * private变量的只能定义该变量的类试用 * protected变量的可被类本人\子类\同包名的拜访 * */ override fun edit(f: FieldAccess?) { super.edit(f) try { if (f == null) { throw Exception("FieldAccess is null") } //不须要查看的包名 if (f.className.isNotWarn() || classObj.name.isNotWarn()) { return } //这里不必判空,如果field找不到(这个属性被删掉了),底层会间接抛异样NotFoundException val modifiers = f.field.modifiers if (ctMethod.declaringClass.name == classObj.name) { //只解决定义在本类中的办法,不然基类里的办法也会被解决到--会呈现本类理论没拜访基类里的private变量但报错的问题 if (ctMethod.declaringClass.name == classObj.name) { if (!f.field.visibleFrom(classObj)) { throw Exception("${f.field.name} 对 ${classObj.name} 这个类是不可见的") } } } } catch (e: Exception) { e.message?.let { errorInfo += "--字段剖析 Exception Message: ${e.message} \n" } errorInfo += "--字段剖析异样产生在 ${classObj.name} 该类在 ${f?.lineNumber}行,应用 ${f?.fieldName} 这个属性时\n" errorInfo += "------------------------------------------------\n" isError = true } } })}在以上代码实现中,是遍历了所有的办法,对办法内的办法调用、字段拜访进行了检测。那么全局变量如何查看呢? ...

December 7, 2021 · 3 min · jiezi

关于编程语言:Go语言学习查缺补漏ing-Day4

作者:ReganYue 起源:恒生LIGHT云社区 Go语言学习查缺补漏ing Day4一、把握iota的应用请看上面这段代码: package mainimport "fmt"const ( a = iota _ b c = "ReganYue" d d1 e = iota f = iota)func main() { fmt.Println(a, b, c, d, d1, e, f)}思考一下输入后果会是什么? 先不颁布输入后果。先来谈一谈iota,iota是用于给须要自增长常量赋值的标识符。咱们能够用下划线 _来省略掉不想要的值。而咱们两头给变量赋值了,而后如果后续的变量如果不赋值,后续的d,d1的值就会和c一样。然而如果再次给一个变量标记为iota,就又会赋值自增长的值,而且值从这里第一个变量定义时就始终在自增长。 所以输入后果是: 咱们再来看一看iota这个用法: package mainimport "fmt"const ( A, B = iota, iota + 1 C, D E, F)func main() { fmt.Println(A, B, C, D, E, F)}运行后果是: iota是在下一行才进行增长,而不是每个变量都增长。 二、哪些类型的变量能够赋nilvar ( A string = nil B int = nil C interface{} = nil D chan int = nil E float64 = nil F func() = nil G []int = nil H map[int]int = nil I *int = nil)你晓得下面哪些类型的变量能够赋nil值吗? ...

December 7, 2021 · 1 min · jiezi

关于编程语言:Go语言学习查缺补漏ing-Day2

作者:ReganYue 起源:恒生LIGHT云社区 Go语言学习查缺补漏ing Day2一、函数返回参数命名的一个注意事项请大家察看上面这个函数有什么问题吗? func fun(x, y int) (s int, error) { return x * y, nil}尽管这个谬误,在集成开发环境Goland中会有提醒,然而其余的开发工具,比方VS Code就不晓得会不会提醒了。 咱们能够看到这个提醒:函数有命名的返回参数,也有没有命名的返回参数。 这就阐明函数有多个返回值参数时,如果你给一个参数命了名,那么其余参数也必须命名。而且如果给参数命名,那么必须给参数加上括号,无论参数个数是一个还是多个。这里给第一个参数命名为s,而没有给第二个参数命名,所以有谬误。 二、new()和make()有什么不同?在Go SDK中,对new的形容是这样的: // The new built-in function allocates memory. The first argument is a type,// not a value, and the value returned is a pointer to a newly// allocated zero value of that type.func new(Type) *Type它是一个用于分配内存的内置函数,只有一个参数。如果应用这个函数,那么就会返回一个指向一块新开拓内存的指针,这块内存是第一个参数示意的类型的零值。 咱们再来看一看make: // The make built-in function allocates and initializes an object of type// slice, map, or chan (only). Like new, the first argument is a type, not a// value. Unlike new, make's return type is the same as the type of its// argument, not a pointer to it. The specification of the result depends on// the type:// Slice: The size specifies the length. The capacity of the slice is// equal to its length. A second integer argument may be provided to// specify a different capacity; it must be no smaller than the// length. For example, make([]int, 0, 10) allocates an underlying array// of size 10 and returns a slice of length 0 and capacity 10 that is// backed by this underlying array.// Map: An empty map is allocated with enough space to hold the// specified number of elements. The size may be omitted, in which case// a small starting size is allocated.// Channel: The channel's buffer is initialized with the specified// buffer capacity. If zero, or the size is omitted, the channel is// unbuffered.func make(t Type, size ...IntegerType) Type咱们能够理解,make也是分配内存的,然而只能给slice, map 或者 chan分配内存。而且这个make也不返回指针,而是返回你第一个参数代表的类型的值。 ...

December 3, 2021 · 2 min · jiezi

关于编程语言:Go语言学习查缺补漏ing-Day1

作者:ReganYue 起源:恒生LIGHT云社区 Go语言学习查缺补漏ing Day1零、前言因为笔者根底不牢,在应用Go语言的时候常常遇到很多摸不着头脑的问题,所以笔者下定决心好好对Go语言进行查漏补缺,本【Go语言查缺补漏ing】系列次要是帮忙老手Gopher更好的理解Go语言的易错点、重难点。心愿各位看官可能喜爱,点点赞、关注一下呗! 一、多个defer的执行程序package mainimport "fmt"func main() { defer fmt.Println("蠢才第一步") defer fmt.Println("雀氏纸尿裤") defer fmt.Println("战神第一步") defer fmt.Println("盖亚纸尿裤")}咱们在理论我的项目开发中,常常会遇到应用多个defer来进行延时解决的状况,这时候,理解多个defer同时存在的状况下,它们的执行程序就是非常重要的了。 这段代码的运行后果是: 盖亚纸尿裤战神第一步雀氏纸尿裤蠢才第一步也就是说,当多个defer语句并称时,它们遵循后进先出的程序。 二、defer与return的先后执行程序package mainimport "fmt"func main() { fmt.Println("主函数:", d())}func d() int { i:=0 defer func() { i+=10 fmt.Println("先来的defer语句:", i) }() defer func() { i++ fmt.Println("后到的defer语句:", i) }() return i}先看一看执行后果: 后到的defer语句: 1先来的defer语句: 11主函数: 0明确执行程序了吗? 明确的同学这里能够跳过了,我来解说一下,后面讲了defer语句的执行程序是后到先出。所以两个defer中先输入后到defer语句,再输入先来的defer语句。然而主函数输入0,这就阐明返回值是0,这就阐明是先return再执行defer语句。并且留神函数完结是defer实现之后再完结。 三、for...range...创立的是每个元素的正本package mainimport "fmt"func main() { slice := []int{0, 1, 2, 3, 4, 5} m := make(map[int]*int) for key, value := range slice { m[key] = &value } for k, v := range m { fmt.Println("key=",k,"value=",*v) }}先来看一看运行后果,再来具体讲述: ...

December 2, 2021 · 1 min · jiezi

关于编程语言:全球-10-大受欢迎的顶级编程语言与薪资水平

英文原文链接|https://codeburst.io/10-top-programming-languages-in-2019-for-developers-a2921798d652 翻译|杨小二。明天的这篇文章内容能够作为你在抉择学习何种语言时候的一个参考数据,然而不能作为惟一根据,学习编程这种货色,除了企业须要外,本人趣味也很重要,须要两者联合一起来看,这样能力让你的常识技能有用武之地。硬件和软件技术的提高是推动整个互联网技术提高的次要因素。顶尖的编程语言是古代技术与新兴技术的外围组成部分。 明天的开发人员须要学习的编程语言比以往任何时候都要多。同样,许多IT外包公司当初正在应用大量语言来构建所有不同类型的软件应用程序。 对于那些利用这些编程语言满足其需要的人(无论是集体还是企业的),都有多种语言可供选择。因为开发时候,须要把握多种编程语言,因而企业很难在软件开发我的项目时,找到适合的程序员。 而我试图找到一些最无效和最受欢迎的编程语言,供开发人员学习和企业应用。 有哪些顶级编程语言受寰球欢送 在列出针对开发人员和企业的最佳编程语言之前,我想简要介绍一下其钻研工作。因而,这里简要介绍了用于钻研的数据: 1、支出最高的顶级编程语言(摘自《StackOverflow开发人员调查报告2019》和《Indeed》)。数据起源地址:https://insights.stackoverflow.com/survey/2019#top-paying-technologies 寰球薪资程度最高的编程语言截图如下: 留神:语言的受欢迎水平并不取决于开发人员的薪资待遇。同样,为特定需要开发的语言与多少开发人员应用也没有关系。从久远来看,最重要的是开发人员如何造就技能并应用他们曾经把握的语言进行工作。 我钻研这项数据指标,更多的是思考编程语言的薪水程度,但激情同样重要。 2、基于StackOverflow数据考察来看开发人员偏好 在过来的十年中,顶级编程语言的开发越来越集中在使开发人员更容易上手。因而,偏心地将他们对编程语言的青睐作为衡量标准。 3、剖析GitHub上的开发人员流动(排名来自2019年Q1-Q4的GitHut 2.0后果,地址:https://madnight.github.io/gi...)。 自2014年第二季度以来,GitHut的第一个版本没有更新,但就剖析GitHub上的流动而言,GitHut 2.0更具备参考价值。开发人员的流动在帮忙企业确定特定语言/框架或技术堆栈的参考方面施展着巨大作用。企业会亲密关注开发人员的流动,并在此基础上抉择适合的开发语言。 4、2019年1月至2019年12月寰球Google搜寻趋势。 Google是地球上每个开发人员的最好敌人。因而,剖析搜寻趋势并找到开发人员对往年最感兴趣的编程语言的比拟这个问题上,是具备肯定参考价值的,也是绝对偏心的。以下就是,企业在软件开发我的项目时,优先选择应用的一些编程语言: JavaScriptPythonJavaGoElixirRubyKotlinTypeScriptScalaClojure这个数据,也根本与GitHut 2.0的数据统一。截图如下: 1、JavaScript有确切的数据表明,美国JavaScript开发人员的平均工资:每年为109,462美元。在2019年Stack Overflow开发者考察中被公认为最风行的顶级编程语言。GitHub上最风行的编程语言。依据Google趋势数据显示,自去年以来,JavaScript的风行度仿佛有所降落。该语言在2019年1月的评分靠近最高峰,为91分。2019年12月,咱们发现风行度有所降落,JavaScript在100分中仅取得62分。2、Python有确切的数据表明,美国Python开发人员的均匀薪酬:每年117,503美元。依据2019年Stack Overflow开发者考察,Python是最顶级的面向对象编程语言之一,在最受欢迎的顶级编程语言列表中排名第二。在StackOverflow Developer考察中也被公认为最须要的编程语言。GitHub上第二沉闷的编程语言。自2019年初以来,Python的风行度已大大降落。截至2019年12月,该语言在Google趋势中的评分为62分,100分中。而在1月份时该评分为75分。3、Java依据相干数据显示,美国Java开发人员的平均工资:每年101,929美元。作为2019年最令人恐怖的编程语言之一,Java恰好排在第十位。GitHub上排名第三的最沉闷的顶级编程语言。截至2019年1月,Java在Google趋势中取得100分中的89分。2019年12月,该数字降至59分。这一下降可能归因于Python作为代替产品的宽泛应用以及Python与Java之间的强烈竞争。4、C有数据显示,在美国,C语言的程序员,平均工资为每年104,905美元。依据2019年StackOverflow考察,C语言恰好是第四大最令人恐怖的编程语言。C语言在GitHub上排名第八,这是它间断两年放弃的地位。C的受欢迎水平在2019年达到了高峰,并且在整个一年中始终放弃着很高的用户趣味。实际上,TIOBE Index将C评为2019年最受欢迎的编程语言。5、GOGo开发人员的寰球均匀薪资:每年为109,483美元。在美国,应用这种顶级编程语言的均匀年薪为$ 136K。在2019年Stack Overflow开发者考察中,Go是寰球支出第三高的语言。Go编程语言是GitHub上第四沉闷的语言。Go语言在Google搜寻它的受欢迎水平时,在2019年放弃不变。6、SwiftSwift(iOS)开发人员的寰球均匀薪资为$ 59k。依据相干数据显示,在美国,雷同职位的均匀年薪为125,252美元。依据2019年的Stack Overflow开发人员调查报告,Swift是第六大最受欢迎的编程语言。Swift在2019年是GitHub上排名第十的最沉闷的编程语言。Swift在Google搜寻中,它的受欢迎水平在2019年6月达到了最高分,100分。然而它在全年的搜寻量放弃不变。7、Ruby寰球应用Ruby进行开发的程序员均匀薪资:7.6万美元。而美国Ruby开发人员的均匀薪水为12.3万美元。依据2019年Stack Overflow开发者调查报告,Ruby的寰球支出排行榜中,它在第六位。在GitHub最沉闷的顶级编程语言列表中,Ruby全年放弃第12位。Ruby编程语言在2019年1月至4月之间始终放弃其风行顶峰。然而,自5月以来,它开始降落,到12月,用户趣味降落到57分。8、KotlinKotlin的寰球均匀开发薪酬:5.7万美元。在美国,Kotlin开发人员的平均工资为125,000美元。只管Kotlin并不是目前支出最高的语言之一,但因为Google发表Kotlin为Android利用程序开发的官方语言,因而它的需要激增。Kotlin是GitHub上排名第15的最沉闷的顶级编程语言,自去年以来曾经回升了一位。往年Kotlin的受欢迎水平基本上放弃不变。用户对这种语言的趣味在5月份达到高峰。这可能是因为在 2019年,Google发表Kotlin被用作Android利用开发的次要语言所致。9、TypeScript应用TypeScript进行开发的程序员,他的寰球均匀薪资:6万美元。美国的TypeScript开发人员为11.5万美元。依据Stack Overflow开发人员考察,TypeScript是排名第十的最受欢迎的顶级编程语言。在GitHub上,由Microsoft培养的编程语言当初排名第七。依据Google搜寻,TypeScript的风行水平在2019年6月,7月,10月和11月的整个月份达到峰值。今年以来,TypeScript见证了用户趣味的显着增长。10、ScalaScala的寰球均匀开发工资:78k美元。Scala开发人员在美国的均匀薪水为14.3万美元。依据2019年Stack Overflow年度开发人员考察,Scala是美国支出最高的编程语言,也是寰球支出第四高的编程语言。Scala在GitHub上的受欢迎水平在2019年有所降落。它已从2018年在GitHub上排名第12的最沉闷编程语言,回升到过来一年的第17位。Scala在Google搜寻趋势中的受欢迎水平在3月和8月这一段时间达到了高峰。然而,自2019年11月以来,用户对Scala的趣味开始降落。论断编程语言的世界每年都在变动。咱们有一些顶级的编程语言,例如Java和JavaScript,它们在此类列表中简直占据永恒的地位。而后呈现了像Kotlin这样的语言,它们以惊人的速度崛起,并成为迄今为止最受欢迎的编程语言之一。 通过明天的文章的一些数据分析,能够将使你对当今的10种最相干的编程语言有所理解,并可能激发开发人员学习和促成企业应用其中一种语言。 如果你足够怯懦,能够都尝试一下!一般来说,这就是编码和计算机编程的美。你领有晋升实力所需的全副资源后,而最重要的是你在哪里以及如何使用这些编程语言常识。 逆锋起笔是一个专一于程序员圈子的技术平台,你能够播种最新技术动静、最新内测资格、BAT等大厂的教训、精品学习材料、职业路线、副业思维,微信搜寻逆锋起笔关注!

September 19, 2021 · 1 min · jiezi

关于编程语言:伤仲永看完能少走很多弯路一个高中生的自学编程经历

我有很大的钻研技术的激情,往年18。从初中开始,就曾经种下了自在管制电脑这种欲望的种子。到了高一,我第一次从信息技术课本上看到编程二字,并且书上带走一个vb写的画二次函数图像的小例子,然而家里没有电脑,我也没大器重。从高一寒假开始,我领有了一台电脑。我想学习编程,然而电脑没联网,于是我常常从他人家里下载资料软件,回家钻研。 每次都下载一堆的货色,包含网上的教程,他人的教训,大学的课件,还有pdf格局的电子书等等。那时在网上搜编程材料,最多的就是vc vb,看到人家都说vb最简略,所以就选了vb,本人在家钻研了一个月,因为没有接触过编程,一些高级术语都不懂,所以钻研过程坎坎坷坷,最终还只是会一些最根本的语句,用一些根本的控件。 最令我自豪也最令我感到可耻的是我用vb模拟推箱子这个小游戏:在窗体上拖上三个图片框,一个作为目的地,一个作为游动的箱子,一个作为被推的箱子。仅用if else 和赋值语句就根本实现了对推箱子这个游戏的模仿(让我感到可耻的是过后脑子里函数的概念,写了大量反复的代码,要害是也不会用vb写一个函数,学的很垃圾)。 我用vb始终不会调用api,尽管有一些网上的源代码能够参考,然而都看不懂,对于我来说,不懂就意味着什么也不会,什么也做不进去。离高二开学还有十几天的时候,我下载了谭浩强的c语言教程在家钻研。起初发现,用c语言尽管做不出vb那样的窗口 控件(因为一开始都是用控制台的界面学习),然而我感觉很简洁,头脑里能搞清程序的前因后果,不像vb那种面向对象的语言,一个办法就搞定所有,本人都不晓得为什么这样。我对c语言一见倾心,用了3天工夫把谭浩强300多页的ppt看完了(我是跳跃式学习的,大部分感觉都很好了解,少部分也没大弄懂),随后就是多看些例子代码,以及写一些简略的小程序。 高二上学期我利用课余时间看完了吴文虎的《程序设计根底》,这使我在算法和数据结构上有了些进步(从那以后,我才真算是迈进了编程的大门,晓得了学习编程语言最根本的是理解它的变量定义形式,各种流程管制语句,自定义函数,程序入口点,赋值语句根本都一样,还有根本的输入输出函数、库函数等等)。高二上学期我还先后读过《计算机组成原理》(大部分没看懂)《操作系统》(大部分都看懂了) 以及Charles petzold的《Windows程序设计》(初步踏入Windows应用程序编程的大门),高二暑假期间我用vc采纳sdk(也只会sdk编程)编程形式写过一个聊天程序,界面构造很简略,一个窗口,两个编辑框,加上一个发送按钮。暑假快要完结的时候,我又接触了汇编语言。 高二下学期开学前一天早晨,偶然打开了王爽老师的汇编语言教程(为什么是偶然呢?我平时都下载很多材料,这一份看不下去了,再去看另一份,就这样在各种材料的跳跃互补之间,我构建起了本人的常识网络),原本没想学习汇编的,不过看了一部分都看懂了,于是就对它产生了趣味,并且在淘宝上买了一本王爽的《汇编语言》,到学校去钻研(过后心里还一直想着,要是我再学会了汇编语言,那我离高手就又进一步了)。在学校里,我一有空就看王爽的《汇编语言》,越看越带劲,心里深深地拜服王爽老师具体透彻的常识屏蔽的解说形式,本人看齐全能看懂。纸上得来终觉浅,不真枪实弹的写点程序,是夯实不了根底的。回家后,先依照书上的例子用记事本写好了汇编程序,而后用masm等工具编译连贯,本人用Windows自带的debug进行调试,尽管只是一个黑乎乎的运行在保护模式下的一个dos窗口,什么输入也没有,不过能看到本人的数据在debug外面依照本人想的后果正确的运行进去真的很开心。(过后还看些对于编程的小说,比方《疯狂的程序员》《新生之王牌黑客》,后者外面的主人公居然能间接用debug写应用程序,从此我心里就偷偷地通知本人,未来我也要达到这样的指标。当初看来,这简直是不可能的了)起初又用16位的汇编写了个间接读取cmos来显示以后工夫的程序,和底层硬件打交道的过程真的很爽,然而书上还有很多的货色我还都没有实际过,比方间接读写硬盘扇区,开机疏导程序,装置中断程序等等,因为我又迷上了两本书:一本是罗云彬的《Windows32位环境下的汇编语言程序设计》,另一本是我在网上搞到的电子书《黑客防线2009 黑客编程vc专辑》。 【本文配套书籍PDF电子高清版】 高二下学期的下半阶段,我曾经齐全投入到技术学习中去,上课偷偷地看,下课也看,在宿舍里也看,早晨12点之前个别不睡觉,经常因睡眠不足而感到好受,达到了一种走火入魔的境界。看了这两本书,我才意识到,之前所做的货色尽管是在Windows上做的,然而和零碎一点关系都没有。也正是从那时起,我才感到本人步入了Windows的殿堂。也正是因为这,我的问题从高二一退学的班级第10名掉到了30多名。(搞技术的,问题不提也罢) 非常感谢那两本书,让我对神秘的Windows有了一个初步的理解,给了我一些理论的编程例子参考。在读这两本书的过程中,我对c语言和汇编语言的关系理解的更加透彻,这让我当前在写c代码的过程中还能设想出编译后的汇编代码,用od查看,的确是那么回事。第一次学习hook API时,在网上下了一个例子代码,是靠批改输出表来hook的,二话不说,先编译一下看看,果然一次通过(是一个dll的代码)。而后用罗云彬介绍的办法写了个注入dll的程序,拿到虚拟机上一试,果然阻止了工作管理器完结程序(hook的TerminateProcess函数)。然而在物理机上就不行了,初步狐疑是零碎的问题(虚拟机上是xp,物理机上是win7)。起初用od挂上了win7的工作管理器,发现它的输出表里基本没有TerminateProcess这一项,我想它应该不会不调用这一个函数吧,于是下断TerminateProcess,没断着。在持续跟踪调试的过程中发现它原来是间接调用了ntdll里的ZwTerminateProcess函数。既然晓得了原理,那就想对策。起初才晓得,我的办法叫做inline hook。批改机器码来hook函数是我本人想到的,只不过我还不晓得他在这个世界曾经存在而已。 高二的寒假终于到来了,自从步入Windows的殿堂后,我的趣味就多了起来,比如说加壳脱壳,游戏外挂,内核驱动等等。我看郁金香的教程,看《加密与解密》,已经用od手动脱过UPX,ASPack等一些简略的壳,用IDA剖析过论坛里的几个小程序的加密算法,写过QQ对对碰的游戏外挂,还有零散的写过几个win32汇编小程序,都是些搬不上台面的货色。总之就是什么也玩过了,然而什么也钻研的不深,始终停留在初学者的程度。玩过内核,下载的那些介绍内核编程的书也没大看上来,最终也还就是写个hello world之类的内核程序。眼看还有半月就开学了,怎么感觉什么货色也没学到。所以我决定得做点什么。那就写一个远控吧,用c语言,纯sdk编程。这个货色,我也没怎么好好的架构一下,蒙着头就开始了。首先写的是图像传输的,技术含量不高,也就是截取屏幕像素数据,压缩,传送。起初又确定了用一个大的对话框作为软件的主界面,削减了文件治理,文件传输,CMDShell以及文字对话的性能。因为没有架构好,所以每写一个性能,我都要追踪出好多bug,而后顺次毁灭,其实编码的工夫并不多,要害是调试改良上花了很多工夫。高三开学前两天,各个性能如期完成,我把管制端拷到u盘上(纯sdk编程,才大概100k!),到街坊家里去测试。(因为技术含量不够,所以不能穿透内网。而且我家里用的广电的CableModem,不能做端口映射,所以只能作为受控端测试了)。通过测试,除了图像传输有点糟糕外,其余的性能都可用,因为之前在虚拟机上都测试过了。因为是纯sdk编程,界面也很难看,看上去很不讨人喜欢。不管怎么说,这次理论的开发让我体验到了做工程师的感觉,也算是夯实了一次c语言,也为当前的开发增长了教训。 高三开学了,在家长的压力下,我决定好好学一学校内的课程,考一所好点的大学。开学后的一个星期里还能够,起初我总是为我那完好的技术感到惶恐。所以以生病的理由请了假,回家拿手机。从此,我决定利用高三的业余时间好好的钻研内核编程。一开始我看的是《Windows内核平安编程从入门到实际》,这本书介绍的范畴很广,然而都不具体,不过我不大了解的中央大部分都从张帆的《Windows驱动开发详解》以及网络上找到了答案。还有一本比拟好的书《寒江独钓...》,外面的过滤驱动例子解说的也都很具体。当然,我也不可能总是看内核的货色,我须要思维的切换。以前总是用c语言写程序,也没正儿八经的看看c++。 于是先正儿八经的看了看c++,起初在家里又学了一会的BCB,可能简略的用一些根本的控件,学这个的目标次要是疾速的解决界面。起初感觉到用c++找不到设想出汇编代码的感觉,而且在论坛里看到了《c++逆向与反汇编揭秘》这本书,于是就在网上下了一本pdf格局的电子书在手机上看。认真的看了一段时间后,总算对c++的反汇编有了根本的理解。看到网上都用mfc编程,于是我也搞到一本《深入浅出mfc》,粗略看了一段时间,对mfc的机制也有了些浅显的意识。起初到了家里,在百度文库里找了一份 vs2010 mfc教程 比书上的容易了解多了。看了一会就写出了一个基于对话框的加法计算器程序,而且界面也比以前用sdk编程的难看多了。 目前,我正在写一个拦挡窗口创立的程序。内核层hook ShadowSSDT里的NtCreateWindowEx函数,应用层用mfc设计一个基于对话框的界面,可能自定义拦挡规定(依据窗口名,类名,以及窗口大小)。写这个程序的初衷是阻止迅雷酷狗等软件的广告窗口,目标还是为了实际一下学到的货色。我感觉只有做出实用的程序来才算把握了那些常识。返校时我曾经把内核层的代码和应用层的代码都别离写好了,并做了简略的测试,还剩下内核层与应用层的通信代码没写好,下次回家先做完它。(下次回家也就放寒假了,咱们这高三个别都是一个月回家一次。不过为了学习编程,我也常常销假回家。) 这次暑假我也要做一个软件来实际我从书上学到的货色,想来想去,还是要做一个远控(除了这货色,我如同也不晓得要做什么了),不过这次要使用大量的内核编程。(给大家简略的介绍一下这个远控: 用mfc做一个基于对话框的界面,用skin皮肤库丑化界面(之前没用过,现学现用吧)。在内核层要做的有暗藏过程,绕过杀软的函数钩子,清理回调钩子,还有键盘记录。次要的性能有文件治理,文件传输,执行cmd命令,截屏。采纳邮件系统通信(这样能够通过手机发送邮件来进行管制),不要求实时传输的效率。还有,这只是一个初步的构想,用邮件系统通信我还没试过。) 如果暑假里还有足够的工夫,我还得钻研一下免杀。当前还打算本人做几个小游戏的外挂,次要是想进步一下本人的逆向剖析调试能力,然而做这些的根底还是正向的编程教训。 为了学习编程,问题降落,家长也因而而感到悲观,老师也常常找我谈话。发此帖的目标,还是要敌人们帮我顾问一下,我到底是应该持续学习编程,还是拚一年高三的生存来考一个好学校持续深造?有人说在大学里这些货色什么也学不到,然而我总感觉好大学里的学习气氛可能比拟好。我很怅惘,最近始终不能静下心来去学习校内课程。将来的路到底在哪呢?敌人们给点意见吧。

September 3, 2021 · 1 min · jiezi

关于编程语言:啥是CTF新手如何入门CTF

CTF是啥CTF 是 Capture The Flag 的简称,中文咱们叫夺旗赛,其本意是东方的一种传统静止。在较量上两军会相互抢夺旗号,当有一方的旗号已被敌军篡夺,就代表了那一方的战败。在信息安全畛域的 CTF 是说,通过各种攻打手法,获取服务器后寻找指定的字段,或者文件中某一个固定格局的字段,这个字段叫做 flag,其模式个别为 flag{xxxxxxxx},提交到裁判机就能够得分。 信息安全的 CTF 的历史能够说很长了,最早起源于 96 年的 DEFCON 寰球黑客大会 为啥要加入CTF入门浸透,那必定得各种练手对不对?但因为因为 「网络安全法」的颁布,随便扫描别人网站,或非受权浸透测试都有肯定的危险。最近也有个新闻: 说实话,这小伙只是在扫描,攻打都被防火墙拦下了,啥都没弄到,后果还是一样被判刑,堪称是偷鸡不成蚀把米了……所以记住千万不要乱扫国内的网站,尤其是教育、政府类网站。但初入门的同学学习浸透测试没有一个对应的环境也是不行的,而常见的靶机对于小白来说太过简单,很容易不知如何下手。 这个时候 CTF 就非常适合了,CTF 个别是一个题目有一个或几个知识点互相糅合,相对来说目标性比拟强。如果想要领会到平安的成就感和趣味性,促成本人边练边学,CTF 就是一个很好的抉择。 CTF 的类型CTF 题目类型个别分为 Web 浸透、RE 逆向、Misc 杂项、PWN 二进制破绽利用、Crypto 明码破译,有志于浸透测试的同学一开始倡议从 Web 浸透的题目开始,辅以 Misc 杂项和 Crypto 密码学。 CTF 次要分为两种模式,一是解题模式。对于 Web 平安来说,会要求你入侵网站或者靶机,攻打胜利后零碎会显示flag或者在某个目录 文件 数据库寻找 Flag,提交到答题零碎得分。逆向工程题目个别模式是破解注册机、动静调试、dump 内存等等。这些题目能够百度或谷歌他人的解题报告( 关键字:CTF writeup)来认识一下。 这种模式的毛病是相似于“应试教育”,以后的趋势是重视出题难、出题偏,没有思考理论,就跟奥数似的。而且这种模式只有攻打,却没有防守,而在企业中工作更多的还是思考如何防护的问题,这个时候 AWD 攻防赛模式就应运而生了。 二是攻防赛,也叫 AWD(Attack With Defense,攻防兼备)模式。你须要在一场较量里要表演攻打方和防守方,攻者得分,失守者会被扣分。也就是说,攻打他人的靶机能够获取 Flag 分数时,他人会被扣分,同时你也要爱护本人的主机不被他人得分,以防扣分。 这种模式十分强烈,筹备要十分充沛,手上要有短缺的防守计划和 EXP 攻打脚本。我第一次加入这种较量的时候就被人打惨了QWQ,不过前面参赛越多,积攒的教训就会越多。所以说,这种较量不必慌,多打多学多积攒就好了。 CTF 外面也有一血之说,谁第一个交 Flag 能取得分数加成,所以说手快也很重要。不过一般来说是没有别的大佬手快的。 ...

August 18, 2021 · 1 min · jiezi

关于编程语言:别再瞎学安全了八年安全经验分享能让你少走很多弯路

首先思考一个问题:为什么要学平安? 近几年网络安全事件层出不穷,置信大家哪怕没遇到过,但也听过不少了吧。如服务器蒙受入侵被黑,用户帐号被盗;被钓鱼、勒索病毒等,这些一旦产生,对企业而言都是不小的打击。 因而,网络安全不容忽视,同时随着时代的一直倒退,公司对于运维及网络工程师要求也越来越严格。将来越来越吃香的肯定是技能方向广的复合型人才。 网络安全能够说是一条十分好的倒退路线。 往年两会期间,全国政协委员,360团体创始人、董事长周鸿祎提交了对于网络安全行业非凡人才的提案,为宽广白帽子人员争取更好的待遇。 据统计,目前的技术人员只能填满不到1%的缺口!这种供求不均衡间接反映在平安浸透工程师的薪资上,简略来说就是:竞争压力小,薪资还很高。 学习网络安全,其实最重要的是如何能更好的防守与攻打。想要往开发零碎下面倒退,那就学C语言;想要做些厉害的桌面软件,那就学C++;如果往跨平台的企业级利用倒退,那就学Java。 所以抉择一个适宜本人的学习方向,是十分重要的,因为这将决定你接下来到底该如何学习。就像你要买鸿星尔克,后果你走进了耐克的店里,这必定是买不到你想要的优质国货嘛! 为什么学习网络安全?我当初抉择学习网络安全,其实本人也是自觉的,毕竟是转行过去,之前对编程畛域基本不理解。这还得多亏我的那位敌人指导,才少走了很多弯路。他们过后通知我要学习网络安全有以下几点起因: 1.网络安全的劣势网络安全当初都回升到国家层面了,近几年各国网络安全工夫频发,各种黑产。国家在大力发展这行,跟着大方向走准没错! 2、学完网络安全能干什么 网络安全尽管说还有很多人不是很理解,然而网络安全的影响力随着时代的倒退,曾经超过了那些前辈。目前曾经有Web平安工程师,浸透测试,等级爱护,代码审计等等。。利用堪称是十分广。 3、网络安全的薪资待遇 网络安全目前曾经回升到了国家策略级别,这个畛域产生了大量的平安技术岗位需要,就连一般二、三线城市的平安工程师都达到了10-20万的年薪,更别提北、上、广、深这样的一线大城市。 这不比你6/7K的工资香吗? 4、网络安全的行业前景随着5G时代的到来,网络安全回升到了国家策略高度,不多BB,永远跟党走 网络安全该如何学习?其实学习的办法是因人而异的,能够依据本人抉择的方向来调整。上面分享一些我集体的一些学习倡议: 1、抉择好学习指标 只有晓得了本人的学习方向,才明确本人学习网络安全是要达到什么目标,这样能力让本人学习思路更清晰。像网络爬虫、web平安、浸透测试、应急响应、自动化运维、代码审计等这些畛域,你对哪个感兴趣,就往哪方面去深耕,只有用心钻研,能力取得与这个畛域相匹配的能力! 【网络安全零碎学习路线思维导图】2、制订学习打算我集体是把网络安全学习分成了根底、高级、巨匠3个学习阶段: 根底阶段次要学习:Linux根底、系统管理、命令治理、目录常识、文件治理、网络根底、网络协议、HTML、CSS、PHP编程根底、MYSQL等等。 高级阶段次要学习: Web应用程序根底、信息安全、破绽扫描、SQL注入攻打技术、XSS跨站、上传绕过验证、文件包涵破绽、CSRF攻打技术、近程代码执行破绽、XXE原理利用进攻、编辑器破绽、暴力猜解、暴验证码平安、逻辑破绽、业务平安问题 巨匠阶段次要学习: SHELL、脱壳与逆向、区块链、免杀等等 看到这么多要学的,是不是开始头晕眼花了?其实现阶段的你,只须要理解这些是将来要学习的就好了,前面跟着打算一步一步的学,也并没有多艰难。 3、根底肯定要扎实有道是万丈高楼平地起,只有地基牢固了,能力建起万丈高楼(作为转行人员,深受根底不够扎实的苦)。所以学习网安也是一样,只有把基础知识学扎实了,能力让你更好的了解前面的常识,能力在这个畛域深耕上来。所以上面这些根底肯定要熟练掌握: 4、多入手实操 实际是测验实践的惟一形式,依据你在学习期间把握的理论知识,进行实际操作,这样能力理解你的实在能力,能力晓得本人在学习中,有哪些常识把握不够。 5、多结交些平安大佬在学习期间,你必定会遇到本人无奈解决的疑难问题,如果你能有个遇到几个喜爱乐于助人的前辈大佬,让你头疼大半天的问题,兴许他们只用两三句话,就能轻松帮你解决。这一点我本人就深受其益,不论是学习,还是前面找工作,都对我有相当大的帮忙。 最初我是一名浸透测试工程师,分享的都是一些本人的学习经验和干货,对于我的零碎学习路线,和一些实战教程,都打包整顿好了,大家能够点击下方进行白嫖。如果能对你有帮忙,还心愿能帮忙点赞、关注、珍藏,大家的激励,是我分享的能源!(给大家鞠躬了) 【白嫖】

July 31, 2021 · 1 min · jiezi

关于编程语言:TIOBE-7-月榜单发布CJava-和-Python-争夺第一TIOBE-CEO-持续看好-Python

最近,TIOBE 公布了 7 月份编程语言排行榜单,同时本月也是 TIOBE 指数诞生 20 周年。在新一期的榜单中,咱们能够看到 C、Java 和 Python 仍呈三足鼎立之势,不过在这一不变的大趋势中也存在着一些奥妙的变动。 TIOBE 指数诞生 20 年,C、Java 不变的前三TIOBE 指数诞生于 2001 年,最后作为 Paul Jansen 的个人爱好我的项目存在,旨在理解编程语言的需要情况。 在第一份 TIOBE 编程语言排行榜单中,前三甲别离为 Java、C 和 C++。20 年过后,后果惊人地类似,前三名别离是 C、Java 和 Python,C 和 Java 依然位列 top 3。乏味的是,这三种语言的差距逐步放大,第一名 C 语言和第三名 Python 的差距仅为 0.67%,这意味着接下来几个月将迎来强烈竞争。TIOBE CEO Paul Jansen 认为:Python 最有可能夺得冠军,它在数据挖掘和人工智能这些凋敝倒退的畛域占据市场领导位置。 在 TIOBE 5 月榜单中,Python 战败 Java 夺得第二。过后 Paul Jansen 就曾表态:只管与第三名 Java 的差距仅有 0.11%,但咱们有理由置信 Python 将在更长的工夫内放弃第二的地位,甚至有可能在下半年冲击冠军。只管 Python 的亚军地位仅放弃了两个月,但 Paul Jansen 对 Python 的信念仍然不减。 ...

July 6, 2021 · 1 min · jiezi

关于编程语言:5-种前途迷茫的编程语言

译文链接:http://www.codeceo.com/articl...英文原文:5 Programming Languages Marked for Death翻译作者:码农网 – 小峰当初的开发人员都趋向于应用新的编程语言,那么旧的编程语言呢?它们的前途个别是这样两种:依然能够应用,但逐步不受大家欢送;间接齐全死去。和之前的十佳最受欢迎的编程语言相同,本文咱们预测以下这几种编程语言面临着死亡威胁: Perl曾几何时,简直每个人都在应用Perl语言编程。然而那些常常应用的人缓缓地发现,对于这个Perl语言仿佛总是有点不对劲。至多我晓得有这么个叫做“piecemeal”的编程语言,它的创造者仿佛就只是将这个性能堆在另一个性能下面而已,并没有好好思考将它们联合在一起。 事实上,甚至是它的创造者也不得不抵赖这种编程语言是有问题的。通过残缺地革新之后,当初的开发工作开始偏向于应用Perl6,这个大略是在2000年的时候。至于Perl?俨然曾经匿影藏形了!所以齐全没有必要去学习它了。顺便说一句,上面这个“Goodbye World”就是用Perl写的: #!/usr/bin/perlprint “Content-type: text/html\n\n”;print “Goodbye, world!\n”;下面这个例子会进去一个网页。当初的Perl,因为能够作为CGI脚本语言,所以应用的最宽泛的是在生成web页面上。然而为了适应时代的变动,咱们最好还是将Perl语言“弃之如敝履”。 Ruby对于Ruby,能够这么唱“十年之后,我不意识你你不属于我……”。因为就在10年前,Ruby语言堪称是风行一时。它出生于1995年,5年左右达到它的鼎盛时期。如果你常常应用的话,相对会义无反顾地爱上它。然而,像咱们这些学着C语言格调长大的孩子在学习Ruby时往往会感觉有点囧。 上面是用Ruby写的“Goodbye World”: puts ‘Bye bye, Miss American Ruby! Drove my Chevy to the Levie…’puts ’2011 was the day that Ruby died, yeah…’上面是一个用于计算阶乘的例子: def fact(n) if n == 0 1 else n * fact(n-1) endendputs fact(ARGV[0].to_i)我测试了这个例子,来计算1000的阶乘。上面是后果(因为篇幅限度,两头略过了2569个数字): ruby fact.rb 100040238726007709377354370243392300…0000000从各方面来看,Ruby都很好,简直是一片赞誉声……除了Twitter。 在2011年4月,Twitter声称他们曾经将简直大部分的代码都改写过了,以便不用应用Ruby和它的web框架——Ruby on Rails,据他们所说这个平台十分之低效。不过,我想说的是,也正是那一天起,Ruby开始走下坡路,应用的人数也是越来越少。 Visual Basic.NET十年前,我应聘到一个须要重写大量代码的公司,名字我曾经遗记了,次要工作就是将VB6转换为Visual basic.NET。大略就只干了一两个月吧,我就跳槽了:真心太苦楚了。 微软钟爱于BASIC编程语言的扩大能够一路追溯到1991年,那时他们刚刚洽购了来自Alan Cooper的一个十分酷(对于那个时候而言)的可视化编程设计。Alan Cooper初期应用的是别的编程语言,然而比尔盖茨让他换成BASIC语言,因为盖茨认为那是过后最为简略的编程语言。于是乎,赫赫有名的Visual Basic,就从BASIC中衍生进去——对象这一概念以及新的编程技术问世了。 前面又产生了一些很有意思的事件。Borland Delphi的发明引领者,Anders Hejlsberg也到微软工作,并且引领创立了一个新的编程语言——C#。这种编程语言十分相似于Java语言。刚开始的学习或者有点难,然而一旦上手,你相对会对它爱不释手。C#很快就成为了微软的旗舰编程语言。当初的话,在软件行业中,有很多很多须要C#的工作岗位,不少都是高薪聘用的。 ...

June 6, 2021 · 1 min · jiezi

关于编程语言:十大编程语言选择任意一门都不吃亏

如果你是软件开发畛域的老手,那么你会想到的第一个问题是“如何开始?”编程语言有数百种可供选择,然而你怎么发现哪个最适宜你,你的趣味和职业指标又在哪里呢?抉择最佳编程语言以学习的最简略办法之一,是通过市场反应、技术趋势的倒退…浏览下文,你会发现一些用于Web开发,挪动开发,游戏开发等的优良、业余的编程语言。最初,你将分明地理解哪种编程语言能够在将来几年甚至更长时间内帮忙你的职业倒退。让咱们来看一看…… 1、JavaScript现在,如果连JavaScript都不会用,那么你不可能称之为一名合格的软件开发人员。榜单中的第一个是JavaScript,根本无法设想没有JavaScript的软件开发会是怎么的世界。从Stack Overflow的2019年开发人员考察中能够看出,JavaScript曾经间断7年成为开发人员中最受欢迎的语言。过来一年中,大概有75%的人应用了这种语言。 首先,JavaScript是轻量级的,可解释的,并且在前端开发中起着重要作用的一门语言。甚至一些次要的社交媒体平台都认为JavaScript提供了一种轻松创立交互式网页的简便办法,并且是由职业驱动的。最受青眼的是JavaScript,因为它与所有次要浏览器兼容,并且其语法的确很灵便。作为一种前端语言,JavaScript还通过Node.js在服务器端应用。 JavaScript是初学者中最可恶的编程语言。 2、Python这可能会让你感到诧异;python呈现在第二位。在许多考察中,它可能都放在第5上。然而,我肯定会让你置信,这是为什么呢?在我的list中,Python是通用的,用户敌对的编程语言之一。为什么这么说?像Java一样,Python语法清晰,直观并且简直相似于英语。Python的“基于对象”子集相似于JavaScript。依据Stack Overflow的说法,有一个局部说“被采纳或被迁徙,或者迁徙得太早”,宽泛来说,迁徙到python的人靠近42%,这表明它排名第二。 如果你有趣味从事后端开发工作,例如Django –凋谢源代码框架,则是应用python编写的,这使得它易于学习且功能丰富,但却很受欢迎。另外,python具备多种应用程序,使其功能强大。在科学计算,机器学习和工程学等畛域中,Python反对一种编程款式,该款式应用简略的函数和变量,而无需过多地查问类定义。 人生苦短,我用Python! 再者,因为人工智能这几年大热,而python尤其在大数据和人工智能畛域有宽泛的应用。 python自身面向对象语言,具备丰盛和弱小的库,轻松地应用C语言、C++、Cython来编写裁减模块,所以很多称它为“胶水语言”。当然仅仅晓得这些还是不够的。 3、Java如果有人问为什么Java,最常呈现的句子是“写一遍,哪都能够运行” – Java在过来20年来始终是统治性的编程语言。Java是99%面向对象的,并且很弱小,因为Java对象不蕴含对本身内部数据的援用。它比C ++更简略,因为Java应用主动内存调配和垃圾回收。 Java具备高度的跨平台兼容性或平台无关性。因为你能够在任何中央(我指的是所有设施)进行编码,因而能够编译为低级机器代码,最初,能够应用JVM – Java虚拟机(取决于平台)在任何平台上执行。 Java形成了Android操作系统的根底,并抉择了约90%的财产500强公司来制作各种后端应用程序。我会毫不犹豫地采纳由Amazon Web Services和Windows Azure运行的最大的Apache Hadoop数据处理。有许多充沛的理由和宽泛的业务应用程序,领有微小的灵活性,而Java始终是初学者的最爱。 4、C / C++“越老越吃香” – C用不同的形式证实了这句话。C语言于1970年代前期被引入,为编程世界做出了巨大贡献。C是少数几种语言的母语。有些是从C派生的,或者是从其语法,结构和范例(包含Java,Objective-C和C#)启发而来的。 即便在当今,能够看出,每当须要构建高性能应用程序时,C依然是最受欢迎的抉择。Linux OS是基于C的。CPP是C的混合版本。C ++是一种基于C的面向对象的编程语言。因而,在设计更高级别的应用程序时,它比其余办法更可取。 C ++比动静类型的语言具备更好的性能,因为在真正执行代码之前先对代码进行类型查看。开发的外围畛域是虚拟现实,游戏,计算机图形等。 5、PHP这个事实会让你感到十分惊奇,这种语言是为保护Rasmus的个人主页(PHP)而创立的,实际上到明天已占据了寰球83%的网站。PHP代表超文本预处理器,是一种通用编程语言。显然,PHP是一种脚本语言,可在服务器上运行,并且用于创立以HTML编写的网页。它之所以受欢迎,是因为它收费,而且易于设置并且易于新程序员应用。 对于寰球的Web开发人员来说,PHP是一个十分弱小的抉择。它被宽泛用于创立动静网页内容以及网站上应用的图像。因为应用范畴宽泛,因而排名第五。另外,PHP能够很好地用于WordPress CMS(内容管理系统)。 它位于第五的起因之一,是英文PHP升高了网站性能并影响了加载工夫。(无奈) 6、Swift接下来是是Swift。Swift就像它的名字一样晦涩,是Apple Inc.开发的一种通用、凋谢源代码的、已编译的编程语言。如果你正在寻找针对本机iOS或Mac OS应用程序的开发,则Swift就是首选。Swift受Python和Ruby的影响很深,并且被设计为对初学者敌对且易于应用。与它的前一个Objective-C相比,Swift被认为是一种更快,更平安,更易于浏览和调试的工具。 与Objective-C不同,Swift须要更少的代码,相似于天然的英语。因而,来自JavaScript,Java,Python,C#和C ++的现有技术人员能够更轻松地切换到Swift。 除此之外,人才储备无限是它面临的一个挑战。与其余开源语言相比,你四周可能找不到很多Swift开发人员。最近的考察表明,在78,000名受访者中,只有8.1%的人应用Swift,这比其他人要少。并且因为频繁的更新,Swift被认为在每个新版本中都不太稳固。 7、C#(C-shap)C-sharp是Microsoft 2000年开发的功能强大的面向对象的编程语言。C-sharp用于开发桌面应用程序和最近的Windows 8/10应用程序,并且须要.NET框架来运行。微软开发了C#作为Java的竞争对手。实际上,Sun不想让微软的烦扰来扭转Java,于是C#诞生了。 C#具备多种性能,使初学者更容易学习。与C ++相比,代码是统一且合乎逻辑的。因为C#是动态类型的语言,因而在C#中发现错误很容易,因为在将代码转到应用程序之前会先查看代码。 简而言之,它是开发Web应用程序、桌面应用程序的完满抉择,并且在VR,2D和3D游戏中也失去了证实。像Xamarin这样的跨平台工具曾经用C#编写,使其与所有设施兼容。 8、Ruby一种开源的动静编程语言,着重简略性和生产率,于1990年中在日本开发。它的设计主题是简化编程环境并减少乐趣。Ruby在全栈Web框架Ruby on Rails框架中风行。Ruby具备动静类型化的语言,它没有硬性规定,并且是一种高级语言,在很大水平上相似于英语。 简而言之,你能够应用更少的代码来构建应用程序。然而Ruby面临的挑战是动静类型化的语言,它不容易保护,并且灵活性使其运行迟缓。 9、Objective-CObjective-C(ObjC)是一种面向对象的编程语言。Apple将其用于OS X和iOS操作系统及其应用程序编程接口(API)。它开发于1980年代,并在某些最早的操作系统中失去应用。Objective-C是面向对象的通用对象。你能够将其称为混合C,因为它为C编程语言增加了性能。 10、SQLSQL(es-que-el)代表结构化查询语言,是一种用于操作数据库的编程语言。它包含存储,解决和检索存储在关系数据库中的数据。SQL保持数据的准确性和安全性,并且无论其大小如何,都有助于保护数据库的完整性。 明天,SQL已在Web框架和数据库应用程序中应用。如果你精通SQL,则能够更好地把握数据摸索和无效的决策制定。 如果你打算抉择数据库治理作为你的职业,请首先应用C或C++。SQL开发人员的需求量很大,而且薪水也不低。 总结小编举荐初学者如果没有明确的职业指标,那就抉择经得住工夫考验的java吧,无论公司大小,都有用Java之处。当有一门编程教训的根底之后,后续想转其余语言,就绝对容易多了,举荐大家微信搜寻 举荐学java 订阅号,从小白开始学习Java 。

June 5, 2021 · 1 min · jiezi

关于编程语言:50-万行-Go-代码可汗学院抛弃-Python-转向-Go

2019 年 12 月,驰名教育性非营利组织可汗学院发表了一项将后端从新设计为一系列 Go 服务的工程——Goliath,将后端最后应用的 Python 2 语言转换为 Go 语言。近日可汗学院走漏,目前已实现超过 50 万行 Go 代码。 据介绍,在 Goliath 我的项目刚启动时,除了团队运行的验证 Go 语言是更好抉择的试验以外,团队中没有人理解 Go 语言。而当初,可汗学院所有的后端和全栈工程师都应用 Go 语言,目前已有超过 50 万行 Go 代码在生产环境中运行。 为什么会从 Python 转向 Go 呢?可汗学院首席软件架构师 Kevin Dangoor 进行了剖析。 Python 2 达到 EOL 阶段2018 年,Python 团队发表 Python 2.7 的 EOL(停用)日期为 2020 年 1 月 1 日,接下来,将不会有任何更新,也不会再有源码安全补丁。这意味着应用 Python 2 的我的项目面临着迁徙。 对于应用 Python 2 作为后端服务器语言的可汗学院,如何迁徙、抉择何种语言成为事不宜迟。 他们认为从 Python 2 迁徙到 Python 3 并非易事,于是在 Kotlin、Go 等语言中进行抉择,并最终抉择了 Go。起因如下: ...

May 21, 2021 · 1 min · jiezi

关于编程语言:TIOBE-5月榜单Python-再次战胜-Java-回榜二有望冲击-C-语言

最近,TIOBE 公布 5 月份编程语言排行榜,其中最大的变动是 Python 重回第二。 Python 战败 Java 重回第二在 2020 年 11 月 TIOBE 公布的编程语言排行榜中,Python 短暂地取代了 Java 跃居第二,次月,Java 重回第二。而在 TIOBE 刚刚公布的编程语言排行榜中,Python 再次取得第二名的地位。 TIOBE CEO  Paul Jansen 示意:「只管与第三名 Java 的差距仅有 0.11%,但咱们有理由置信 Python 将在更长的工夫内放弃第二的地位,甚至有可能在下半年冲击冠军,因为当初的第一名 C 语言的风行度正在升高。」 TIOBE 5 月编程语言排行榜 top 20。 下图展现了 TOP 10 编程语言 TIOBE 指数走势(2002-2020): Rust、Dart、Julia 稳步回升除此之外,在 5 月排行榜中,Rust 正试图重返前 20(目前排名第 24),Dart 和 Julia 也在稳步前进。 第 21-50 名编程语言排行榜 此外,TIOBE 还列出了排名第 51-100 的编程语言。因为差别较小,该排名仅按字母程序列出: ActionScript, Arc, B4X, bc, Boo, C shell, CFML, Clojure, Common Lisp, Eiffel, Erlang, F#, Hack, Icon, IDL, Inform, Io, J, JScript.NET, Korn shell, Lasso, Maple, MEL, ML, MQL4, MUMPS, NATURAL, OCaml, OpenCL, OpenEdge ABL, Oz, PL/I, PostScript, Pure Data, Q, Racket, Ring, RPG, Scheme, Simulink, Smalltalk, SPARK, SPSS, Stata, Tcl, Vala/Genie, Verilog, XC, Xojo, Zig ...

May 5, 2021 · 1 min · jiezi

关于编程语言:2021Q1-编程语言排行榜JavaScript-开发者最多Rust-增长速度最快

近期,开发者畛域调研公司 SlashData 公布了其《开发者国家排名》第 20 版,其中示意在往年第一季度,JavaScript 依然是最受欢迎的编程语言,领有最多的开发者,但 Rust 已成为增长速度最快的编程语言。 2021Q1 编程语言排行榜:JavaScript 开发者最多,Rust 增长速度最快 SlashData 的考察笼罩了来自 155 个国家/地区的 19,000 多名受访者,与来自 GitHub、RedMonk、StackOverflow 和 Tiobe 的其余语言受欢迎水平排名略有不同。 SlashData 每年进行两次此考察。它的上一次考察预计 JavaScript 社区的规模为 1240 万,其中包含 TypeScript 和 CoffeeScript,它们也基于雷同的 ECMAScript 规范。截止到第一季度完结,人数已增长至 1,380 万。 开发者数量第二的是 Python,人数为 1010 万,排名第三的 Java 为 940 万。这一排名与开发者剖析公司 RedMonk 前不久基于 GitHub 和 StackOverflow 的调研数据雷同。 依据 SlashData 的说法,Python 是开发者人数增长最多的语言,其中 70% 的开发人员专一于应用它进行相干的机器学习工作,这很大水平上应该归功于 Google 的 TensorFlow、Facebook 的 PyTorch 和 NumPy 之类的机器学习库。 对于数据迷信畛域另一话题语言 Rust,SlashData 则示意目前只有 17% 的人应用 Rust,但它却是过来 12 个月中开发者比例增长幅度最高的编程语言,但因为根底数量较低,所以净增数量要低于 Python。 ...

April 28, 2021 · 1 min · jiezi

关于编程语言:自制计算器自制编程语言二

后面介绍了借助yacc和lex自制计算器。《自制计算器(借助yacc和lex)—《自制编程语言》一》本文介绍下不必yacc和lex的实现过程,其实就是本人编写词法解析器和词法分析器来代替yacc和lex。基于C语言实现文中代码为了阐明大多是截图,能够对照行号介绍,不过不必放心,源代码我都传到这里了1.自制词法分析器阐明:本计算器会将换行作为分隔符,把输出宰割成一个个算式。跨复数行的输出无奈被解析。 依据下面的阐明,词法分析器提供一下两个函数: // 将接下来要解析的行置入词法分析器中void set_line(char *line);/* * 从被置入的行中,宰割记号并返回 * 在行尾会返回 END_OF_LINE_TOKEN 这种非凡的记号 */ void get_token(Token *token); get_token()承受的入参是一个Token构造体指针,函数会宰割出记号装入Token构造体并返回。上面是下面两个函数申明和Token构造体的定义: 词法分析器的头文件如下: lexicalanalyzer.h 词法分析器的代码如下图: lexicalanalyzer.c 词法分析器的运行机制为,每传入一行字符串,就会调用一次get_token()并返回分隔号的记号。因为词法分析器须要记下set_line()传入的行,以及该行已解析到的地位,所以设置了动态变量st_line和st_line_pos(第7行和第8行)。 set_line()函数,只是单纯设置st_lin和st_line_pos的值 get_token()负责将记号理论宰割进去,即词法分析器的外围局部。 第16行开始的while语句,会逐个依照字符扫描st_line。 记号中的+、-、*、/四则运算符只占一个字符长度,一旦扫描到间接返回。 数值局部略微简单一些,因为数值由多个字符组成。应用while语句逐字符扫描时,以后扫描的字符很有可能只是一个数值的一部分,所以必须想个办法将合乎数值特色的值暂存起来。为了暂存数值,采纳一个枚举类型LexerStatus*的全局变量status(第12行) LexerStatus枚举的定义在lexicalanalyzer.h中 status的初始状态为INITIAL_STATUS,当遇到0\~9的数字时,这些数字会被放入整数局部(此时状态为为IN_INT_PART_STATUS)中(第59行)。一旦遇到小数点.,status会由IN_INT_PART_STATUS变为DOT_STATUS(第65行)。DOT_STATUS再遇到数字会切换到小数状态IN_FRAC_PART_STATUS(第61行)。在IN_INT_PART_STATUS或IN_FRAC_PART_STATUS的状态下,如果再无数字或小数点呈现,则完结,承受数值并return。 依照下面的解决,词法分析器会齐全排除.5、2..3这样的输出。而从第23行开始解决,除换行以外的空白字符全副会被跳过。 因为是用于计算器的词法分析器,所以只解决了四则远算符和数值。如果须要扩大并能够反对编程语言的话,最好留神以下几个要点1.数值与标识符(如变量名等)能够依照上例的办法通过治理一个以后状态将其解析进去,比方自增运算符就能够设置一个相似IN_INCREMENT_OPERATOR的状态,但这样一来程序会变得简短。因而对于运算符来说,为其筹备一个字符串数组会更好,例如:static char *str_operator_str[] = { "++", "--", "+", "-", // 省略};以后读入的记号能够与这个数组的元素做前向匹配,从而判断记号的品种。指针局部同样须要比特色对象再多读入一个字符用以反叛(比方输出i + 2,就须要将2也读入看看有没有是i++的可能)。做判断时,像上例这样将长的运算符放到数组后面会比拟省事。另外,像if、while这些保留字,比较简单的做法是先将其判断为标识符,之后再去对照表中查找有没有相应的保留字。2.本次的计算器是以行尾单位的,st_line会保留一行中的所有信息,但在当下的编程语言中,换行个别和空白字符是等效的,因而不应该以行尾单位解决,而是从文件中逐字符(getc()等函数)读入解析会更好。上例中用while语句逐字符读取的中央就须要替换为getc()函数来读取。2.自制语法分析器大多程序员即便没自制编程语言的背景,也能猜到词法分析器的运行机制,换成语法分析器就有点毫无脉络了。可能知觉是,只思考计算器程序,将运算符优先级最低的- 、+宰割进去,而后解决*和/,这样的思路根本正确。然而实际操作时会发现,用来保留宰割字符串的空间可能还有其余用处,而退出括号的解决也很难。 yacc版本的计算器应用上面的语法规定: expression /* 表达式的规定 */ : term /* 和项 */ | expression ADD term /* 或 表达式 + 和项 */ | expression SUB term /* 或 表达式 - 和项 */ ;term /* 和项的规定 */ : primary_expression /* 一元表达式 */ | term MUL primary_expression /* 或 和项 * 一元表达式 */ | term DIV primary_expression /* 或 和项 / 一元表达式 */ ;primary_expression /* 一元表达式的规定 */ : DOUBLE_LITERAL /* 实数的字面常量 */ ; 这些语法规定能够用下图这样的语法图来示意: ...

April 7, 2021 · 2 min · jiezi

关于golang:当红开发语言Go真的是未来的技术主流吗

摘要:文将具体介绍 Golang 的语言特点以及它的优缺点和实用场景,带着上述几个疑难,为读者剖析 Go 语言的各个方面,以帮忙初入 IT 行业的程序员以及对 Go 感兴趣的开发者进一步理解这个热门语言。本文分享自华为云社区《大红大紫的 Golang 真的是后端开发中的万能药吗?》,原文作者:Marvin Zhang 。 前言城外的人想进去,城里的人想进去。-- 钱钟书《围城》 随着容器编排(Container Orchestration)、微服务(Micro Services)、云技术(Cloud Technology)等在 IT 行业一直流行,2009 年诞生于 Google 的 Golang(Go 语言,简称 Go)越来越受到软件工程师的欢送和追捧,成为现在煊赫一时的后端编程语言。在用 Golang 开发的软件我的项目列表中,有 Docker(容器技术)、Kubernetes(容器编排)这样的颠覆整个 IT 行业的明星级产品,也有像 Prometheus(监控零碎)、Etcd(分布式存储)、InfluxDB(时序数据库)这样的弱小实用的出名我的项目。当然,Go 语言的应用领域也绝不局限于容器和分布式系统。现在很多大型互联网企业在大量应用 Golang 构建后端 Web 利用,例如今日头条、京东、七牛云等;长期被 Python 统治的框架爬虫畛域也因为简略而易用的爬虫框架 Colly 的崛起而一直受到 Golang 的挑战。Golang 曾经成为了现在大多数软件工程师最想学习的编程语言。下图是 HackerRank 在 2020 年考察程序员技能的相干后果。 那么,Go 语言真的是后端开发人员的救命良药呢?它是否可能无效进步程序员们的技术实力和开发效率,从而帮忙他们退职场上更进一步呢?Go 语言真的值得咱们花大量工夫深刻学习么?本文将具体介绍 Golang 的语言特点以及它的优缺点和实用场景,带着上述几个疑难,为读者剖析 Go 语言的各个方面,以帮忙初入 IT 行业的程序员以及对 Go 感兴趣的开发者进一步理解这个热门语言。 Golang 简介 Golang 诞生于互联网巨头 Google,而这并不是一个偶合。咱们都晓得,Google 有一个 20% 做业余我的项目(Side Project)的企业文化,容许工程师们可能在轻松的环境下发明一些具备颠覆性翻新的产品。而 Golang 也正是在这 20% 工夫中一直孵化进去。Go 语言的创始者也是 IT 界内赫赫有名的行业首领,包含 Unix 外围团队成员 Rob Pike、C 语言作者 Ken Thompson、V8 引擎外围贡献者 Robert Griesemer。Go 语言被公众所熟知还是源于容器技术 Docker 在 2014 年被开源后的爆发式倒退。之后,Go 语言因为其简略的语法以及迅猛的编译速度受到大量开发者的追捧,也诞生了很多优良的我的项目,例如 Kubernetes。 ...

March 27, 2021 · 5 min · jiezi

关于编程语言:借助yacc和lex自制计算器自制编程语言一

《自制编程语言》学习记录,内容根本是摘抄原书其实原书并不是从头讲怎么写一个计算器的,而是上来就给了代码,对着代码解说。计算器代码的名字为mycalc,外部齐全应用double进行运算。 1.根底概念介绍1.1 编程语言的语法解决个别有以下的过程:1.1.1 词法剖析 将源代码宰割成若干个记号(token)的解决。 1.1.2 语法分析 即从记号构建分析树(parse tree)的解决。分析树也叫作语法树(syntax tree)或形象语法树(abstract syntax tree, AST)。 1.1.3 语义剖析 通过语法分析生成的分析树,并不蕴含数据类型等语义信息。因而在语义分析阶段,会检查程序中是否含有语法正确然而存在逻辑问题的谬误。 1.1.4 生成代码 如果是C语言等生成机器码的编译器或Java这样生成字节码的编译器,在分析树构建结束悔恨进入代码生成阶段。 比方如下的代码: if (a == 10) { printf("hoge\n");} else { printf("piyo\n");}执行词法剖析后,将被宰割成如下图所示的记号(token):对此进行语法分析后构建的分析树如下图: 执行词法剖析的程序称为词法分析器(lexical analyzer), lex就是依据词法规定主动生成词法分析器执行语法分析的程序称为解析器(parser),yacc就是能依据语法规定主动生成解析器的程序yacc和lex在mac上曾经预装。1.2 lex: lex 是主动生成词法分析器的工具,通过输出扩大名为.l的文件,输入词法分析器的C语言代码。 词法分析器是将输出的字符串宰割成记号的程序,因而必须首先定义mycalc所用到的记号。 mycalc所用到的记号包含如下: ○ 运算符。在mycalc中能够应用四则运算,即+、-、*、\。 ○ 整数。如1、2、3等。 ○ 实数。如123.456等。 ○ 换行符。一个算式输出后,接着输出换行符就会执行计算,因而这里的换行符也应设置为记号 在lex中,应用正则表达式定义记号。 1.3 yacc: yacc是主动生成语法分析器的工具,输出扩大名为.y的文件,就会输入语法分析器的C语言代码。 2.试做一个计算器mycalc的理论运行成果如下(%是命令提示符): 2.1 为mycalc所编写的输出文件mycalc.l如下(用lex解析): 第11行%%,此行之前的局部叫作定义区块。在定义区块内,能够定义初始状态或者为正则表达式命名。第2行到第9行,应用%{和%}包裹的局部,是想让生成的词法分析器将这个局部代码原样输入。后续程序所需的头文件等都蕴含在这里。比方第3行用#include蕴含进来的y.tab.h头文件,就是之后yacc主动生成的头文件。上面的ADD、SUB、MUL、DIV、CR、DOUBLE_LITERAL等都是在y.tab.h中用#define定义的宏。 第5行到第9行定义了一个名为yywrap()的函数。如果没有这个函数的话,就必须手动链接lex的库文件。第12行到第27行是规定区块。这一部分是应用正则表达式*去形容记号。在规定区块中遵循如下的书写形式:一个正则表达式的前面紧跟若干个空格,后接C代码。如果输出的字符串匹配正则表达式,则执行前面的C代码。第12行到第16行,找到四则运算符以及换行符,而后通过return返回其特色符(就是在y.tab.h的宏定义)。下面提到很屡次记号(token),蕴含三局部含意:对于+或-这样的记号来说,只须要关注其记号品种就能够了,而如果DOUBLE_LITERAL记号,记号的品种和值都必须传递给解析器第17行的正则表达式是一个匹配“数值”的表带是。表达式匹配胜利的后果(即下面列举的记号三要素),“记号的原始字符”会在相应的动作中被名为yytext的全局变量援用。并进一步应用第19行的sscanf()解析对于第17行正则表达式的解释见这里第23行的正则表达式[ \t]是对空格以及制表符进行匹配,对应动作为空,因而能够疏忽每一行的空白字符。第24行的 .会匹配任意一个字符,这里用于检测是否输出了程序不容许的字符。第28行的%%示意规定区块的完结,这之后的代码被称为用户代码区块。用户代码区块能够编写任意的C代码。2.2 为mycalc所辨析的输出文件mycalc.y如下(用yacc解析): 第1行到第5行与lex雷同,应用%{ %}包裹了一些C代码第4行有一句#define YYDEBUG 1,这样将全局变量yydebug设置为一个非零值后会开启Debug模式,能够看到程序运行中语法分析的状态。第6行到第9行申明了记号以及非终结符的类型。非终结符是由多个记号独特形成,即代码证的line_list、line、expression、term这些局部。为了宰割非终结符,非终结符最初都会以一个非凡的记号结尾。这种记号称作终结符第10行到第11行是记号的申明。myclac所用到的记号类型都在这里定义。ADD、SUB、MUL、DIV、CR等记号只须要蕴含记号的类型就能够,而值DOUBLE_LITERAL的记号,其类型被指定为<double_value>。这里的double_value是来自下面代码中%union汇合的一个成员名(第8行)。第12行申明了非终结符的类型。第13行的%%是分界,之后的是规定区块。yacc的规定区块由语法规定以及C语言编写的相应动作两局部形成。语法规定 在yacc中,会应用相似BNF(巴克斯范式)的标准来编写语法规定。将上图的规定代码抽出并正文如下: // 语法规定代码 2-0line_list /* 多行的规定 */ : line /* 单行 */ | line_list line /* 或者是一个多行后接单行 */ ;line /* 单行的规定 */ : expression CR /* 一个表达式后接换行符 */ ;expression /* 表达式的规定 */ : term /* 和项 */ | expression MUL term /* 或 表达式 + 和项 */ | expression SUB term /* 或 表达式 - 和项 */ ;term /* 和项的规定 */ : primary_expression /* 一元表达式 */ | term MUL primary_expression /* 或 和项 * 一元表达式 */ | term DIV primary_expression /* 或 和项 / 一元表达式 */ ;primary_expression /* 一元表达式的规定 */ : DOUBLE_LITERAL /* 实数的字面常量 */ ; 为了看得更分明,能够将愈发规定简化成上面的格局: ...

March 25, 2021 · 4 min · jiezi

关于rust:实践解析丨Rust-内置-traitPartialEq-和-Eq

摘要:Rust 在很多中央应用了 traits, 从十分通俗的操作符重载, 到 Send, Sync 这种十分奥妙的个性。本文分享自华为云社区《Rust 内置 trait 解析:PartialEq 和 Eq》,原文作者:debugzhang Rust 在很多中央应用了 traits, 从十分通俗的操作符重载, 到 Send, Sync 这种十分奥妙的个性。一些 traits 是能够被主动派生的(你只须要写#[derive(Copy, Clone, PartialEq, Eq, Debug, Default, Hash, ...)] 就能失去一个神奇的实现, 它通常是对的。 PartialEq 和 Eq这两个 Traits 的名称实际上来自于抽象代数中的等价关系和部分等价关系,实际上两者的区别仅有一点,即是否在相等比拟中是否满足反身性(Reflexivity)。 PartialEq/// [`eq`]: PartialEq::eq/// [`ne`]: PartialEq::ne#[lang = "eq"]#[stable(feature = "rust1", since = "1.0.0")]#[doc(alias = "==")]#[doc(alias = "!=")]#[rustc_on_unimplemented( message = "can't compare `{Self}` with `{Rhs}`", label = "no implementation for `{Self} == {Rhs}`")]pub trait PartialEq<Rhs: ?Sized = Self> { /// This method tests for `self` and `other` values to be equal, and is used /// by `==`. #[must_use] #[stable(feature = "rust1", since = "1.0.0")] fn eq(&self, other: &Rhs) -> bool; /// This method tests for `!=`. #[inline] #[must_use] #[stable(feature = "rust1", since = "1.0.0")] fn ne(&self, other: &Rhs) -> bool { !self.eq(other) }}如果咱们想比拟某个类型的两个值 x 和 y 是否相等(不等),例如:x == y (x != y),那么咱们就必须为类型实现 PartialEq Trait。 ...

March 23, 2021 · 2 min · jiezi

关于编程语言:程序员专属灯谜大挑战答对六题算你赢

人不知;鬼不觉间,正月十五元宵节就到了,除了吃元宵外,猜灯谜,这个必备娱(zhi)乐(shang)节目,怎么能缺席? Everybody看过去!挑战程序员专属”灯谜“,考验业余能力的时候到了!01.你晓得世上最傲娇的编程语言叫什么吗?A、 Intercal B、 Java C、 C++ D、 Python 答案:A。有一种叫INTERCAL的编程语言,它是一种没有缩略词的编译型语言,被称为世界上最深奥的编程语言之一。它讥刺了其它各种编程语言的各个方面,比方有一些必须应用的关键词:PLEASE(请)、 IGNORE(疏忽)、 FORGET(遗记)……如果你在一段代码里用的“请”字不够多,程序会回绝这段代码。 02.说起404,大家都不生疏,那你晓得为什么无法访问的网站要用404来代替吗?A、 一个叫404的电话 B、 一个叫404的房间 C、一个叫404的卡车 答案:B. 相传互联网的第一架服务器,架设在欧洲核钻研组织的404号房。如果要关上网页,就得向404房的Berners-Lee提交申请,如果他没在房间内,就会呈现「404 not found」。 03.如果你喜好游戏的话,上面4款游戏大作你肯定不会生疏。但你晓得它们和Kubernetes有什么分割吗?以下哪款游戏是最早应用Kubernetes的?A、 Pokémon B、 王者光荣 C、 魔兽世界 D、 塞尔达 答案:A。Pokemon Go 是最风行的宣传 Kubernetes 能力的应用案例。在它公布之前,人们都感觉在线多人游戏会相当的失去追捧。但当它一旦公布,就像火箭一样腾飞,达到了预期流量的 50 倍。通过应用 Kubernetes 作为 Google Cloud 之上的基础设施层,Pokemon Go 能够大规模扩大以满足意想不到的需要。 04.你和你的男闺蜜正在观赏乘风破浪姐姐们的精彩舞蹈,它存储在由三个Master 节点治理的 ChubaoFS 集群中,忽然其中一台坏掉了,男闺蜜放心的问你还能流畅的看到姐姐们吗,你会怎么做?A. 通知他立即买机票,去现场观看 B. 刺激他说你也会跳,并表演给他看 C. 通知他不要放心,三个Master节点都坏掉也不会影响他看小姐姐 D. 告诉机房立即重启集群 答案:C。ChubaoFS的Master节点负责集群资的调度和治理,其实用Raft算法保证数据一致性,坏掉节点数少于总数50%则不会影响其性能,且即便所有Master节点都坏掉也只会影响到Volume的创立和扩容下线等资源调度工作,对已存在Volume上的数据读写不会产生影响。 05.在UNIX零碎中应用的目录构造是A、单级目录构造 B、二级目录构造 C、单纯树形目录构造 D、带链接树形目录构造 答案:这个答案可不能通知你~扫描下方二维码,填写你认为正确的答案,答对即可参加抽奖! 06.TCP/IP 参考模型分为四层:()、网络层、传输层、应用层A、物理层 B、流量管制层 C、会话层 D、网络接口层 答案:这个答案也不能通知你~扫描下方二维码,填写你认为正确的答案,答对即可参加抽奖! 灯谜都不对?不要紧! 扫描下方二维码 在京东云官网注册实现实名认证 ...

March 1, 2021 · 1 min · jiezi

关于编程语言:format不只是格式化

《实战Common Lisp》系列次要讲述在应用Common Lisp时能派上用场的小函数,心愿能为Common Lisp的振兴做一些渺小的奉献。MAKE COMMON LISP GREAT AGAIN。序言写了一段时间的Python后,总感觉它跟Common Lisp(下文简称CL)有亿点点像。例如,Python和CL都反对可变数量的函数参数。在Python中写作 def foo(* args): print(args)而在CL中则写成 (defun foo (&rest args) (print args))Python的语法更紧凑,而CL的语法表意更清晰。此外,它们也都反对关键字参数。在Python中写成 def bar(*, a=None, b=None): print('a={}\tb={}'.format(a, b))而在CL中则是 (defun bar (&key (a nil) (b nil)) (format t "a=~A~8Tb=~A~%" a b))只管CL的&key依然更清晰,但申明参数默认值的语法的确是Python更胜一筹。 仔细的读者可能发现了,在Python中有一个叫做format的办法(属于字符串类),而在CL则有一个叫做format的函数。并且,从下面的例子来看,它们都负责生成格式化的字符串,那么它们有相似之处吗? 答案是否定的,CL的format几乎就是格式化打印界的一股泥石流。 format的根本用法无妨从下面的示例代码动手介绍CL中的format(下文在不引起歧义的状况下,简称为format)的根本用法。首先,它须要至多两个参数: 第一个参数管制了format将会把格式化后的字符串打印到什么中央。t示意打印到规范输入;第二个参数则是本文的配角,名为管制字符串(control-string)。它领导format如何格式化。听起来很神秘,但其实跟C语言的fprintf也没什么差异。 在管制字符串中,个别会有许多像占位符个别的命令(directive)。正如Python的format办法中,有各式各样的format_spec可能格式化对应类型的数据,管制字符串中的命令也有很多种,常见的有: 打印二进制数字的~B,例如(format t "~B" 5)会打印出101;打印八进制数字的~O,例如(format t "~O" 8)会打印出10;打印十进制数字的~D;打印十六进制数字的~X,例如(format t "~X" 161)会打印出A1;打印任意一种类型的~A,个别打印字符串的时候会用到。另外,format的命令也反对参数。在Python中,能够用下列代码打印右对齐的、左侧填充字符0的、二进制模式的数字5 print('{:0>8b}'.format(5))format函数也能够做到同样的事件 (format t "~8,'0B" 5)到这里为止,你可能会感觉format的管制字符串,不过就是将花括号去掉、冒号换成波浪线,以及参数语法不一样的format办法的翻版罢了。 接下来,让咱们进入format的黑科技领域。 format的高级用法进制转换后面列举了打印二、八、十,以及十六进制的命令,但format还反对其它的进制。应用命令~R搭配参数,format能够打印数字从2到36进制的所有状态。 (format t "~3R~%" 36) ; 以 3进制打印数字36,后果为1100(format t "~5R~%" 36) ; 以 5进制打印数字36,后果为 121(format t "~7R~%" 36) ; 以 7进制打印数字36,后果为 51(format t "~11R~%" 36) ; 以11进制打印数字36,后果为 33(format t "~13R~%" 36) ; 以13进制打印数字36,后果为 2A(format t "~17R~%" 36) ; 以17进制打印数字36,后果为 22(format t "~19R~%" 36) ; 以19进制打印数字36,后果为 1H(format t "~23R~%" 36) ; 以23进制打印数字36,后果为 1D(format t "~29R~%" 36) ; 以29进制打印数字36,后果为 17(format t "~31R~%" 36) ; 以31进制打印数字36,后果为 15之所以最大为36进制,是因为十个阿拉伯数字,加上二十六个英文字母正好是三十六个。那如果不给~R加任何参数,会应用0进制吗?非也,format会把数字打印成英文单词 ...

January 30, 2021 · 3 min · jiezi

关于编程语言:OReilly-发布-2021-技术趋势报告Python-最受欢迎低代码是重要趋势

出名计算机图书出版公司 O'Reilly 近日依据其在线学习平台生成的数据公布了一份技术行业发展趋势的剖析报告。 报告指出,Python 曾经成为了最受欢迎的语言,而 JavaScript 的使用量只有 Python 的 20%。低代码和无代码编程将不可避免的扭转编程语言的性质。 另一方面,人工智能畛域和 Web 开发的增长仍在持续。无关云的应用和平安隐衷也都是重点倒退的趋势。 考察背景O’Reilly 对技术行业的趋势剖析是基于其平台生成的数据。O’Reilly 在线学习的使用量始终在稳步增长,思考到 COVID-19 的暴发对技术行业带来的变动,这样的增长趋势并不令人意外。 对技术行业发展趋势的剖析并不是从哪一技术畛域在短期内迅速受到关注和风行来看的,而是通过长期的体现失去的察看。“趋势”和“潮流”不同,潮流通常是一闪而过的,但趋势是在更长的工夫范畴内展示进去的,在这个过程中甚至可能会有倒退的体现,但趋势的倒退是不会进行的,表象的背地有更多参考因素。 从编程语言的应用状况来看,Python 的使用量是最高的,与去年相比还回升了 27%。排在第二位的是 Java,比去年降落了 3%,第三是 C++,比去年回升了 10%。第四和第五别离是 C 和 JavaScript,使用量别离回升了 12% 和 40%。 令人诧异的一点是,JavaScript 尽管排名前五,但使用量却远远落后于 Python 和 Java,只能达到 Python 的 20% 和 Java 的 33%。在前面的排名中,Rust 的增长非常明显,达到了 94%。不过,从一个较小基数开始的 Rust,增长 94% 并不是很难。 从统计数据能够看出,反而是 增长 16% 的 Go 语言曾经分明地确立了本人的位置。作为一种用于并发编程的语言,Rust很可能建设本人的“零碎编程”位置:为云操作构建新的操作系统和工具。作为一种为数学计算而设计的语言 Julia 是一个乏味的未知因素。尽管在过来的一年里,它略有降落,然而咱们对它的长期机会持乐观态度。 咱们不应该将专门用于学习编程语言的题目与利用该语言或应用基于该语言的框架的题目离开应用。毕竟,许多 Java 开发人员应用 Spring,搜寻“ Java”会脱漏内容,而题目中只有“ Spring”这个词。对于 JavaScript 也是如此,它包含 React、 Angular 和 Node.js 框架。在 Python 中,应用最多的库是 PyTorch 和 scikit-learn。下图显示了将 Python、 Java 和 JavaScript 的内容增加到这些语言最重要的框架中时所产生的状况。 ...

January 29, 2021 · 4 min · jiezi

关于编程语言:感悟篇如何写好函数式代码

最近在写代码的时候经常感觉迷茫,到底函数式语言应该如何写代码。immutable 数据结构的益处到底在哪里。为什么我写进去的代码总感觉像是命令式、过程式的。 带着这些纳闷,我又从新开始学习了史上最胜利的函数式语言 ---- SQL。是的你没看错,SQL是一门函数式语言。 在 https://www.sql-ex.ru/ 这个网站上,你能够做很多收费的 SQL 习题,还有收费的排名,十分爽。 而 SQL 外围的语句是很简略的,select, from, where 三板斧,轻轻松松地就能将需要变成查问语句。 例如这样一个问题:Find the model number, speed and hard drive capacity of PCs cheaper than $600 having a 12x or a 24x CD drive. 写进去的 SQL 答案就是: select model, speed, hdfrom PCwhere price < 600 and (cd = '12x' or cd = '24x')几乎就是大白话直译,仍然信达雅齐全。所以咱们总结进去,要写出好的函数式代码,你得设计出好的 DSL,或者是好的形象,好坏的规范就是是否够间接翻译产品的需要。而是否用自然语言形容出需要,也是很考验能力的。所以咱们进一步推出: 要成为一个好的函数式程序员,你须要成为一个好的产品经理。

January 25, 2021 · 1 min · jiezi

关于编程语言:ObjectiveC-之父-Brad-J-Cox-去世他推动了苹果软件生态的发展

据外媒报道,编程语言 Objective-C 之父 Brad J. Cox 博士已于2021 年 1 月 2 日在其家中去世,享年 77 岁。 史蒂夫·乔布斯曾在苹果开发 NeXTSTEP 操作系统时,应用了Objective-C。当初,Objective-C 仍是 OS X 和 iOS 操作系统、及与其相干的 API、Cocoa 和 Cocoa Touch 的次要编程语言。 苹果生态开发者最相熟的编程语言之一Objective-C 是一种通用、高级、面向对象的编程语言。其名称的由来是:在 C 语言主体上退出面向对象的个性。任何 C 语言程序不经批改就能够间接通过 Objective-C 编译器,在 Objective-C 中应用 C 语言代码也是齐全非法的。它扩大了规范的 ANSI C 编程语言,将 Smalltalk 式的消息传递机制退出到 ANSI C 中。目前次要反对的编译器有 GCC 和 Clang(采纳LLVM 作为后端)。 当年,史蒂夫·乔布斯为其新操作系统 NEXTSTEP 授予了 Objective-C 语言许可。Objective-C 成为了苹果生态开发者最相熟的编程语言之一。Objective-C 能够在现存 C 编译器根底上实现,而不须要编写一个全新的编译器,使得它能利用大量现存的C 代码、库、工具和编程思维等资源。 但随着编程语言的一直演进,Objective-C 的毛病也逐步裸露进去,比方不反对命名空间;不反对运算符重载;不反对多重继承;应用动静运行时类型,所有的办法都是函数点用,很多编译时的优化办法都用不到等。因而,近年来,苹果始终想让开发者放弃 Objective-C,转向 Swift。在开发语言排行榜 TIOBE 榜单中,Objective-C 的风行水平指数一路下滑,替代者 Swift 的位次逐步回升。 ...

January 25, 2021 · 1 min · jiezi

关于编程语言:为什么要学编程学习编程的方法是什么

咱们学习编程,然而不肯定要成为程序员。就像每个人都应该学习法律常识,但不是都要成为律师;像每个人都应该学习经济学,然而不是必须成为经济学家;就如同每个人都要学习数学,但不是每个人都要成为数学家。 不同的学科知识给与人们不同的思考形式,这些思维形式贯通着咱们日常生活的点点滴滴,编程自身就是造就一个思维的过程,也能够帮忙咱们把握逻辑思维的能力。上面为大家分享一下学习编程的办法: 1,给本人一个大略的思路,从什么开始?如果你连Windows都不相熟,不要紧,先把Windows操作纯熟吧,不难,只有有心,几天后你也是高手。 2,选一门语言。当初风行的编程语言有很多。见下图,你能看到目前各种语言的应用排行榜。留神,不要跟风,依据本人的状况来抉择学习。 3,重视根底。当初针对很对高级语言有了很多绝对应的IDE,使编程变得傻瓜化,但请不要在初学语言的时候依赖于它们,因为它们帮你做了很多事,其中的很多事咱们得去学习得晓得。要从根底开始,我集体倡议先学习C语言。C语言对于数据类型的描叙全面,分明,明确。  3,C语言是一门面向过程的语言。从数据类型,根本表达式,再到条件语句,循环语句,而后学习函数,再加上一些简略的数组常识,每个知识点多练习几次,这个时候千万不要贪快,肯定要了解透彻其中的原理性的货色。 4.以上的学习,大略你须要2周到一个月的工夫,接下去,你能够着手看看汇编。汇编开始的时候是很难,那些各种各样的寄存器,分段的内存地址,是很难了解,可是这些常识了解了当前,前面的内容就简略了,学习8086的那些指令,再加上一些伪操作,还有DOS和BIOS中断的调用,就可以看懂书上的汇编程序了。看汇编程序后你会深刻明确很多货色,使你更加明确计算机的工作原理。 5.有了汇编的根底,再回到C语言的学习,置信你会很有信念了。这个时候你能够 大略回顾一下C语言中学过的常识,或者是去网站上找几个例子做做,让本人胸中有竹子。而后开始学习C语言中的精髓局部也是难点--指针,学完这个,编程根底就扎实了。 6 .学习数据结构和算法。学习排序、图、树、串、队列、栈、链表、堆等。这个方面的学习很重要,如果这个学好了,对当前进一步学习有十分大的帮忙。 7.学到这里,你会发现,你曾经能够实现一些简略的使用了,比方写一个计算器等等。如果要你写一个日记本,你会吗?当然你能够了,你能够把所有的日记存储在文本中;但如果数据愈来愈大,要怎么治理呢?这个时候咱们就要想到开始学习数据库了。目前咱们用得较多的是Oracle、Sql server,见下图,咱们能够看到很多的数据库以及它们的应用排行。 8.以上常识全副学透了的话,你也算是高手一枚啦。这个时候你能够去学习一些面向对象的编程语言啦,比方C++、C#、Java、PHP等等。这个时候发现学习它们几乎是小菜一碟,因为语法根本一样。说实话,编程次要是把握思维。 学习是一个过程,有时候会很干燥寂寞,但想法是受本人管制的,你如果认为它是高兴的,那它就会是高兴的,因为当咱们成为了高手之后,咱们就能够有很多很多的Money,如下图,你也能够成为“他”。

January 6, 2021 · 1 min · jiezi

关于编程语言:关于动态类型静态类型语言对于数据的理解的一些差别的随想

不是谨严的思考, 只是梳理一下感触, 最近在动静类型动态类型之间切换有点多, 对照思考.我的教训基本上是 js, ts 和 ClojureScript 上边, 再有点 Nim 的应用教训.而后 Go 跟 Haskell 都只是简略尝试过, 没有深刻进去.这些个语言都是主动内存治理的, 所以内存往下深刻的我也不探讨了. 数据的示意动静类型, 介绍数据结构时候说数组, 说字典, 而后就是根本的操作.基本上只是有一个类型构造, 运行时能力判断具体的类型, 但这个对思维模型来说限度少.比方思考一个数组, 就是数组, 什么都能够放进去, 数字, 字符串, 对象, 正则, 嵌套数组也行.在实现层面, 我喜爱叫这个 uni-type, 因为外部就是一个构造蕴含很多信息来示意各种类型.编程的时候, 思考的就是有这么个构造, 有这么个 value, 至于 value 是什么, 动静的, 能够随便放. 动态类型, 思考就很多了, 特地是内存布局方面的,Nim 里边就是 object(相似 struct), seq, array, list, 多种的构造.每个构造会对应的到一个内存的布局的形式. 细节具体怎么布局, 我理解不彻底, 然而模糊地对应上.特地是动态类型编码的时候不同构造之间性能的差异, 比拟容易显露出来.我用错了构造的时候, 数组的中央用链表, 访问速度的差距马上就进去了.而且构造对类型限度明确, int 数组就不能有 string 了, 这个也是显著的. 从业务编码的角度来说, 用动静类型来模仿一些业务逻辑, 通常还是比拟轻易的.而要用动态类型, 常常须要有一些思考, 用怎么样的类型来示意, 受到什么样的限度.定义了构造, 还有怎么拜访怎么遍历的问题.个别说比方 js 性能优化较全面了, 个别场景都不会去思考不同写法的性能差异了,而动态类型, 示意的形式, 拜访的形式, 都比拟容易对性能造成影响.动态类型更贴近机器, 或者说用动态类型, 就更加须要相熟编码器的各种行为, 以便生成高性能代码. ...

December 1, 2020 · 2 min · jiezi

关于编程语言:2020年11月编程语言排行榜20年来-Java-首次跌落至第三

TIOBE 已颁布 2020 年 11 月的编程语言排行榜。自20年前TIOBE指数开始以来,Java和C首次不再占据前两位。 C依然是第一,但当初是Python占据了第二的地位。有人说,Python最近的风行是因为数据挖掘、人工智能和数值计算等畛域的蓬勃发展,但我有本人的认识。我置信Python的风行与个别需要无关。在过来,大多数编程流动都是由软件工程师实现的,然而当初到处都须要编程技能,而且不足优良的软件开发人员。 因而,咱们须要一些非软件工程师能够解决的简略的货色,一些容易学习的货色,疾速的编辑周期和平滑的部署。Python满足了所有这些需要。 Python真的超过了Java!这将是Tiobe编程排行榜在创建以来最大的变动,在晓得该排名从2001年开始,Java始终占据前两名未变。 依据Tiobe的首席执行官Paul Jansen所指出,在过来的20年来,C与Java始终稳剧场前两名。但到现在,已有25年倒退历史的Java普及率靠近“历史最低点”——和2019年10月相比降落4.32%个百分点。 Jansen学生在9月份就放言说,“Java确定遇到了麻烦”,因为Java在当月同比降落3.81个百分点。 而1991年创立的Python,因为受到数据科学家的宽泛应用,包含机器学习的趣味,其受欢迎度正在与日俱进的攀升。 对于TIOBETIOBE编程社区指数(The TIOBE Programming Community index)是编程语言风行度的指标,是依据互联网上有教训的程序员、课程和第三方厂商的数量,并应用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube统计出排名数据,只是反映某个编程语言的热门水平,并不能阐明一门编程语言好不好,或者一门语言所编写的代码数量多少。 TIOBE开发语言排行榜 每月更新一次,根据的指数是基于世界范畴内的资深软件工程师和第三方供应商提供,其后果作为以后业内程序开发语言的风行应用水平的无效指标。 该指数能够用来检阅开发者的编程技能是否跟上趋势,或是否有必要作出策略扭转,以及什么编程语言是应该及时把握的。察看认为,该指数反馈的虽并非以后最风行或利用最广的语言,但对世界范畴内开发语言的走势仍具备重要参考意义。 5月份编程语言前20名排行 前十名当中,除了Java 和 Python 排名呈现对调外,其余名次暂无变动。11-20 名间则呈现了较大的变动,其中排名降落的有:Perl(11→12);Ruby(13→15 );MATLAB(15→17);Objective-C(18→19)。 排名回升的有:Groovy(12→11);Go(14→13);Swift(16→14);Assembly language(17→16)。 上月别离排名第 22 和 24 的 Delphi/Object Pascal 和 Transact-SQL 别离以第 18 和 20 的名次进入榜单。Classic Visual Basic 和 PL/SQL 则再次被挤出前 20 榜单。 此前曾上榜四个月的 Rust 自上个月由第 18 名掉至第 25 名后,本月仍未再重回榜单,排名稳固在第 25 名。 TOP 10 编程语言 TIOBE 指数走势(2002-2020) ...

November 6, 2020 · 1 min · jiezi

关于编程语言:从Rust出发开启安全存储之路

疫情过后的夏天,交通开始梗塞,餐厅开始排队,街道开始冷落起来,今日让人焦躁的清静现在却带来了某种安全感,人们压抑已久的心田开始躁动,如《乐夏》第二季,就在这种安全感和躁动中“勉强上线”,让我等离音乐圈九天之外的IT人也躁动了一把……IT人玩音乐仿佛有点不靠谱,但搞技术咱们是认真的。 在竞争日益强烈的科技倒退过程中,抉择正确的计算机编程语言,对于企业和开发人员来讲,十分重要。对于由 Mozilla 开发的重视平安、性能和并发性的编程语言 Rust,门槛之高让很多学习者望而生畏,但它优雅的解决高并发和高安全性零碎问题的能力,成为泛滥开发者中最受欢迎的编程语言,曾经间断四年在 StackOverflow 开发者考察中蝉联“最受开发者青睐的编程语言”。目前谷歌、微软、亚马逊、苹果、甲骨文、三星、Mozilla、Cloudflare、Dropbox 、阿里、腾讯、百度、字节跳动等公司都在应用 Rust。 年老的时候,力量就在于挣脱套路第一个有版本号的 Rust 编译器于 2012 年 1 月公布,第一个稳固版本 Rust 1.0,于 2015 年 5 月 15 日公布。绝对其余计算机编程语言,Rust 是年老的,在性能上,Rust 怀才不遇。其设计指标是要做一门零碎编程语言,具备高安全性、良好的并行性、杰出的模块化设计,这就意味着 Rust 能够用于建造牢靠高效的零碎,因而更加强调安全性、存储器配置、以及并发解决等方面的个性,尤其是并发平安,反对函数式和命令式以及泛型等编程范式的多范式语言,在语法上和 C++ 相似,然而能够在保障性能的同时提供更好的内存平安。 做技术,要找到和他人不一样的力量从久远来看,将来5G、物联网、人工智能将是下一波科技大潮的根底,大量IOT和边缘计算的场景中会呈现巨量的边缘数据,须要满足将来海量设施的平安存储需要,对此安全性、可用性和性能的需要将会不断涌现,Rust 将会在这些场景中大有所为。 平安存储方面的技术迭代须要一门优良的编程语言来进行疾速的原型开发,最根本的如哈希算法、签名算法,到应用大量前沿密码学的成绩,如零常识证实、环签名;其次网络上,把这个带有高安全性软件运行起来,叫运行一个节点。如果寰球有十分多这样的节点,而这些节点在简单网络(公有网络、私有网络)环境下连接成大规模网络,并能够提供对立的数据存储和散发服务,那么它就造成了所谓的平安存储网络。事实中节点之间通过网络连接,环境非常复杂,会有各种路由、专用网络、防火墙、各种协定等,一个节点链接可能须要端口映射,或者应用加密通信技术,或者应用网络穿透等技术,才可能连上其它节点。这就须要 P2P 网络和 24 小时网络服务的高可靠性和高性能 。 Rust 能很好的适配以上特点,同时也具备以下劣势: 性能好,与 C++并驾齐驱;平安,编译期杜绝内存和并发问题,使得软件具备高可靠性;表达能力强,能够进行疾速原型开发,提高效率;与 C 无缝交互,解决密码学库缺失问题(因为很多密码学的库是用 C 写的);生态凋谢,编译器和绝大多数库采纳 MIT/Apache,开发沉闷,停顿快。相比起目前其余计算机语言,用 Rust 编程语言开发平安存储技术再适合不过了。正如一位驰名的程序员已经说过:Pascal 就像衣着紧身衣,C 就像在玩刀,C++就像在玩焚烧的电锯,Rust 就像是衣着爱护配备悬挂在绳子上做跑酷静止。看起来有点可笑,然而能够用它做各种很酷的动作而不挫伤本人。 从 Rust 登程,开启平安存储之路尽管 Rust 间断四年在 StackOverflow 开发者考察中蝉联“最受开发者青睐的编程语言”,但有意思的是,其中 97% 的受访者并未应用过 Rust,他们对 Rust 语言的青睐,仍停留在“想学习”的阶段,而 Netwarps 开发团队将“想学习” Rust 编程语言付诸行动,从当下登程,用 Rust 谱写平安存储技术新的篇章。 ...

August 28, 2020 · 1 min · jiezi

关于编程语言:Go语言入门系列六之再探函数

Go语言入门系列后面的文章: Go语言入门系列(三)之数组和切片Go语言入门系列(四)之map的应用Go语言入门系列(五)之指针和构造体的应用在Go语言入门系列(二)之根底语法总结这篇文章中曾经介绍过了Go语言的函数的根本应用,包含申明、参数、返回值。本文再具体介绍一下函数的其余应用。 1. 变参Go语言的函数除了反对0个或多个参数,还反对不定数量的参数,即变参。申明形式为: func foo(变参名 ...参数类型) 函数类型 { //函数体}上面是一个具体的函数,它接管不定数量的int参数,并返回和: package mainimport "fmt"func add(arg ...int) int { //变参函数 var sum int for _, value := range arg { sum += value } return sum}func main() { sum := add(1, 2, 3, 4) fmt.Println(sum) //10}arg ...int表明add函数接管不定数量的参数,且只能是int类型的。arg是咱们给该变参取的名字,它实际上是一个切片,所以在add函数中能够应用range遍历变量arg。 2. 传值和传指针当咱们调用一个有参函数时,必定会向该函数中传入参数: package mainimport "fmt"//传入一个值,打印它func printX(x int) { fmt.Println(x)}func main() { var a int = 5 printX(a) //向函数中传入参数:变量a}这里有一个问题:咱们真的是把变量a传给了printX函数吗?咱们用两个例子来阐明问题。 2.1. 例1package mainimport "fmt"func plusOne(x int) int { x = x + 1 fmt.Println("执行加一") return x}func main() { a := 5 fmt.Println("a =", a) //应该为5 理论为5 b := plusOne(a) fmt.Println("a =", a) //应该为6 理论为5 fmt.Println("b =", b) //应该为6 理论为6}plusOne函数的作用是把传进来的参数加一,并返回后果。 ...

August 11, 2020 · 2 min · jiezi

关于编程语言:Go语言入门系列五之指针和结构体的使用

Go语言入门系列后面的文章: Go语言入门系列(二)之根底语法总结Go语言入门系列(三)之数组和切片Go语言入门系列(四)之map的应用1. 指针如果你应用过C或C++,那你必定对指针这个概念不生疏。 咱们须要先介绍两个概念:内存和地址。 1.1. 内存和地址咱们写的代码都存储在外存(C盘、D盘)中,比方我存在了D:\Work\Program\go目录下。如果你想要运行你的代码,必须先把你的代码加载进内存中,而后交给CPU执行计算,而CPU计算的后果也会存到内存中。 内存的存取速度快,其中有许多存储单元用来存储数据,CPU能在内存中间接找到这些数据。这是因为内存中的每个地位都有一个举世无双的地址标识。能够把内存看成一幢有许多房间的大楼,每个存储单元是一个房间,存储的数据是房间中的物品,地址就是房间号。 所以对CPU来说,如果想找到某个房间中的物品(从内存中取数据),或者向某个房间中放物品(向内存中存数据),咱们必须晓得房间号(内存地址)。 内存地址通常是一串16进制的数字,如果写代码时存个整数1或取个整数1都须要写这么一串数字,那太麻烦了。所以高级语言为咱们提供了一个便当,用咱们人能记住的“名字”来代替这串数字。 这些“名字”就是变量名。 var a int = 1var b int = 2var c int = 333var d int = 6666变量名和地址的关联由编译器替咱们做,硬件拜访的依然是内存地址。 1.2. 什么是指针?简略地来说,指针也是一个变量,只不过这个变量中存的不是咱们平时用到的1、2、3、"Hello"、true等值,而是其余变量的地址。 之所以取名指针,是因为指针变量b中保留了变量a的地址,咱们能够通过该指针变量b找到变量a,如果画图看起来,看起来就像是指针b指向了变量a。 还能够有指针的指针: 1.3. 指针的应用申明一个指针: var p *int*int示意p是一个int类型指针,p指针中存的是一个int类型变量的地址,这意味着p中不能存其余类型变量的地址。 如何获取某个变量的地址呢?应用操作符&: var a int = 66 //a是值为66的int变量p = &a //将a的地址赋给指针p那么如何依据指针中的地址找到对应的变量呢?应用操作符*: var b = *p //依据p中的值找到a,将其值赋给bfmt.Println(b) //66*p = 99 //依据p中的值找到a,扭转a的值fmt.Println(a) //99肯定要留神指针的初始化,如果不初始化,则指针的的值是其零值——nil。对未初始化的指针赋值,则会出问题: var p *int //只申明,未初始化*p = 12 //报错:invalid memory address or nil pointer dereference起因是指针p中没值,是个nil,天然就无奈依据地址找到变量。如果你想应用指针,必须先确保你的指针中有非法的内存地址才行。该当这样写: ...

August 8, 2020 · 2 min · jiezi

关于编程语言:Go语言入门系列五之指针和结构体的使用

Go语言入门系列后面的文章: Go语言入门系列(二)之根底语法总结Go语言入门系列(三)之数组和切片Go语言入门系列(四)之map的应用1. 指针如果你应用过C或C++,那你必定对指针这个概念不生疏。 咱们须要先介绍两个概念:内存和地址。 1.1. 内存和地址咱们写的代码都存储在外存(C盘、D盘)中,比方我存在了D:\Work\Program\go目录下。如果你想要运行你的代码,必须先把你的代码加载进内存中,而后交给CPU执行计算,而CPU计算的后果也会存到内存中。 内存的存取速度快,其中有许多存储单元用来存储数据,CPU能在内存中间接找到这些数据。这是因为内存中的每个地位都有一个举世无双的地址标识。能够把内存看成一幢有许多房间的大楼,每个存储单元是一个房间,存储的数据是房间中的物品,地址就是房间号。 所以对CPU来说,如果想找到某个房间中的物品(从内存中取数据),或者向某个房间中放物品(向内存中存数据),咱们必须晓得房间号(内存地址)。 内存地址通常是一串16进制的数字,如果写代码时存个整数1或取个整数1都须要写这么一串数字,那太麻烦了。所以高级语言为咱们提供了一个便当,用咱们人能记住的“名字”来代替这串数字。 这些“名字”就是变量名。 var a int = 1var b int = 2var c int = 333var d int = 6666变量名和地址的关联由编译器替咱们做,硬件拜访的依然是内存地址。 1.2. 什么是指针?简略地来说,指针也是一个变量,只不过这个变量中存的不是咱们平时用到的1、2、3、"Hello"、true等值,而是其余变量的地址。 之所以取名指针,是因为指针变量b中保留了变量a的地址,咱们能够通过该指针变量b找到变量a,如果画图看起来,看起来就像是指针b指向了变量a。 还能够有指针的指针: 1.3. 指针的应用申明一个指针: var p *int*int示意p是一个int类型指针,p指针中存的是一个int类型变量的地址,这意味着p中不能存其余类型变量的地址。 如何获取某个变量的地址呢?应用操作符&: var a int = 66 //a是值为66的int变量p = &a //将a的地址赋给指针p那么如何依据指针中的地址找到对应的变量呢?应用操作符*: var b = *p //依据p中的值找到a,将其值赋给bfmt.Println(b) //66*p = 99 //依据p中的值找到a,扭转a的值fmt.Println(a) //99肯定要留神指针的初始化,如果不初始化,则指针的的值是其零值——nil。对未初始化的指针赋值,则会出问题: var p *int //只申明,未初始化*p = 12 //报错:invalid memory address or nil pointer dereference起因是指针p中没值,是个nil,天然就无奈依据地址找到变量。如果你想应用指针,必须先确保你的指针中有非法的内存地址才行。该当这样写: ...

August 8, 2020 · 2 min · jiezi

关于编程语言:Java不可不知的泛型使用

后面的文章: 详解Java的对象创立一文打尽Java继承的相干问题一文打尽Java抽象类和接口的相干问题本文介绍了Java的泛型的根本应用。 1. 为什么应用泛型看上面一个例子: 为了阐明问题,本类写的尽量简陋,请把眼光次要放在类型上。 /** * @author Xing Xiaoguan (xingrenguanxue) */public class MyArrayList { private int[] elementData; private int size = 0; public MyArrayList(int capacity) { elementData = new int[capacity]; } //向数组中增加元素 public void add(int i) { if (size == elementData.length) { throw new IndexOutOfBoundsException("数组已满"); } elementData[size++] = i; } //从数组中依据下标获取元素 public int get(int index) { if (index < 0 || index > size - 1) { throw new IndexOutOfBoundsException("超出范围"); } return elementData[index]; } @Override public String toString() { return "MyArrayList{" + "elementData=" + Arrays.toString(elementData) + '}'; }}该类很简略:有两个成员变量,elementData是一个数组,size是数组中元素的数量。add和get办法能增加和获取元素。 ...

August 7, 2020 · 3 min · jiezi

关于编程语言:Go语言入门系列四之map的使用

本系列后面的文章: Go语言入门系列(一)之Go的装置和应用Go语言入门系列(二)之根底语法总结Go语言入门系列(三)之数组和切片1. 申明map是一种映射,能够将键(key)映射到值(value),格局为:map[keyType]valueType。 申明一个map并初始化它,应用key:value进行初始化: var scores = map[string]int {"数学":100, "语文":90, "Go":100}如果不想间接初始化,能够先申明再应用,留神这样须要应用make函数初始化后能力应用: var scores map[string]intscores = make(map[string]int)为什么这样申明须要应用make函数? map的零值是nil map,没有键,也不能增加键。 var m map[string]int //申明一个m map,它当初默认是nilfmt.Println(m) //map[]m["A"] = 1 //报错:assignment to entry in nil map所以为了不让该map不是nil,须要应用make初始化: var m map[string]int //nilm = make(map[string]int) //初始化m["A"] = 1 //增加元素fmt.Println(m) //map[A:1]当然,不便的短变量申明形式也能用: m := map[string]int {"A":1, "B":2}或者m := make(map[string]int)m["A"] = 1m["B"] = 22. 增删改查(增)减少键值对: scores["数学"] = 100 //向scores这个map增加了键为“数学”,值为100的数据scores["语文"] = 90(删)删除键值对: delete(scores, "语文")(改)批改键值对和减少键值对的语法雷同(当key不存在时为减少,当key存在时为批改): scores["语文"] = 10(查)应用key能够查找到对应的value,会返回两个值,第一个是key对应的value,第二个是布尔值(如果key存在,是true;否则是false)。如果查找的key不存在,则会返回value类型的“零值”: ...

August 5, 2020 · 1 min · jiezi

关于编程语言:Go语言入门系列四之map的使用

本系列后面的文章: Go语言入门系列(一)之Go的装置和应用Go语言入门系列(二)之根底语法总结Go语言入门系列(三)之数组和切片1. 申明map是一种映射,能够将键(key)映射到值(value),格局为:map[keyType]valueType。 申明一个map并初始化它,应用key:value进行初始化: var scores = map[string]int {"数学":100, "语文":90, "Go":100}如果不想间接初始化,能够先申明再应用,留神这样须要应用make函数初始化后能力应用: var scores map[string]intscores = make(map[string]int)为什么这样申明须要应用make函数? map的零值是nil map,没有键,也不能增加键。 var m map[string]int //申明一个m map,它当初默认是nilfmt.Println(m) //map[]m["A"] = 1 //报错:assignment to entry in nil map所以为了不让该map不是nil,须要应用make初始化: var m map[string]int //nilm = make(map[string]int) //初始化m["A"] = 1 //增加元素fmt.Println(m) //map[A:1]当然,不便的短变量申明形式也能用: m := map[string]int {"A":1, "B":2}或者m := make(map[string]int)m["A"] = 1m["B"] = 22. 增删改查(增)减少键值对: scores["数学"] = 100 //向scores这个map增加了键为“数学”,值为100的数据scores["语文"] = 90(删)删除键值对: delete(scores, "语文")(改)批改键值对和减少键值对的语法雷同(当key不存在时为减少,当key存在时为批改): scores["语文"] = 10(查)应用key能够查找到对应的value,会返回两个值,第一个是key对应的value,第二个是布尔值(如果key存在,是true;否则是false)。如果查找的key不存在,则会返回value类型的“零值”: ...

August 5, 2020 · 1 min · jiezi

关于编程语言:RedMonk-2020-年-Q3-编程语言排行公布Python-第二Rust-进入前二十

出名软件行业剖析公司 RedMonk 公布了 2020 年第三季度半年度编程语言排行,这是 RedMonk 往年公布的第二份榜单,上一次是往年 3 月公布的第一季度编程语言排行。 RedMonk 榜单的排名过程做了一些调整,尽管具体的收集形式曾经扭转,但根本过程依然是一样的。RedMonk 从 GitHub 和 Stack Overflow 提取语言排名,并将它们联合起来进行剖析。这种排名办法要关联语言探讨和应用状况,来提取对潜在的将来采纳趋势的见解。 2020 第三季编程语言排行 前二十名排名如下: 1 JavaScript 2 Python 3 Java 4 PHP 5 C ++ 5 C# 7 Ruby 7 CSS 9 TypeScript 10 C 11 Swift 11 Objective-C 13 R 14 Scala 15 Go 15 Shell 17 PowerShell 17 Perl 19 Kotlin 20 Rust 本季度的排名总体上变动较小。 这是否是绝对语言轨迹失常起伏的一部分,目前尚不分明,但 RedMonk 曾经运行了上面探讨的一些初步数据,并将亲密关注趋势的倒退。 Python(0):本季度排名中最引人注目的“赢家”是Python,是第一个独占前两名的非 java 或 JavaScript 语言。 ...

July 28, 2020 · 1 min · jiezi

关于编程语言:Go语言基础语法总结

1. 意识HelloWorld在后面的《Go的装置和应用》这篇文章中曾经写过HelloWorld.go了,当初就来逐行认识一下它。 package mainimport "fmt"func main() { fmt.Println("Hello, World!")}第1行:咱们的Go程序是由包——package形成的,包的申明模式为:package <包名>。该行的意思是:以后HelloWorld.go文件属于main包。 第2行:如果你应用过Java或Python,那你对import必定不生疏。该行的意思是:导入一个名为fmt的包。如果须要导入多个包,有两种写法: import "fmt"import "math"或者应用分组模式同时导入多个包 import ( "fmt" "math/rand")显然第二种应用括号,以分组的模式导入更加不便。 第3行:咱们应用func关键字来申明一个函数,在这个例子中,咱们申明的是main函数。如果你有过其余语言的编程教训,必定相熟main函数的作用:程序的入口。 第4行:咱们的函数内容放在函数的{}中,在该例中,调用了fmt包中的打印办法,由此可见,Golang语言调用函数的办法和Java、Python一样应用小数点:<包名>.<函数名>。 看完这几行简略代码,咱们发现:在Go语言中,并不需要分号;来完结语句。 2. 变量2.1. 命名标准Go语言要求标识符以一个字母或下划线结尾,前面能够跟任意数量的字母、数字、下划线。不能应用关键字作为标识符 辨别大小写,变量num和变量Num是两个变量。 2.2. 申明Go语言的变量申明形式和其余语言(如C、Java、Python)不太一样。 比方,咱们申明一个为int类型的变量a: var a int能够看出,Go语言申明变量的形式为: var <变量名> <变量类型>咱们还能够同时申明多个类型雷同的变量: var <变量名1>, <变量名2>, <变量名3>, ... <变量类型>应用分组同时申明多个类型不同的变量: var ( <变量名1> <变量类型1> <变量名2> <变量类型2> <变量名3> <变量类型3> ...)上面是一个具体的例子: package mainimport "fmt"var i bool//类型在后func main() { var a, b, c int//多个 fmt.Println(i, a, b, c)}2.3. 初始化当咱们申明变量时,能够对其进行初始化。当有初始值时,咱们能够省略变量的类型,变量会依据对应的初始值获取正确的类型。见下例: ...

July 24, 2020 · 4 min · jiezi

打破常规回归直觉-Feel-语言设计

设计背景几年前我在开发多平台的 XyKey 时,因为过后的跨平台计划还未成熟,所以我没有抉择跨平台实现,而是抉择了每个平台都应用官网指定的语言进行开发,为此我接触了 Java/Kotlin(Android)、Swift/OC(iOS)、C#(UWP)。于此同时我本职工作方向是区块链技术,现有支流区块链计划也大量应用了 JS + Go 的组合开发前后端产品。 在不同语言之间来回切换学习之后,我对不同语言表达同一种性能的语法差异性产生了趣味,随后开始了语法设计方面的钻研摸索,最终诞生了 Feel 语言。 语言设计问题之一很多语言外面,函数存在不止一种表达方法。 咱们须要为同样的需要设计不同的语法吗? 以下我举一些我应用过的语言中函数的示意办法,所有的 eg 都是函数。 Go: 大部分时候函数都应用 func 结尾申明,算是一致性比拟好的设计之一,但在 interface 中还是应用了不一样的形容形式。 func eg1(x int) int { return 1}var eg2 = func(x int) int { return 1}type foo struct { eg3 func(int) int}type bar interface { eg4(int) int}C#: 大部分时候都应用了 C 式的形容形式,但在函数类型中应用了反直觉的泛型类型,并且 Lambda 语法也看不出与函数的分割。 int eg1(int x) { Func<int,int> eg2 = (int x) => { return 1; }; return 1;}interface foo { int eg3(int x);}Action<int> eg4;Kotlin: 函数定义、函数类型、Lambda 是三种格调。 ...

July 14, 2020 · 5 min · jiezi

编程语言之美在动静之态在强弱之间分解释编译之道

在很多技术文档、官方介绍,以及各种各样的编程书籍中,都免不了对编程语言做一些介绍,介绍语言的背景、发展历程,设计理念等一大堆开篇立论,在这一大堆理论中,介绍语言类型时往往会有这么几个词显得有些很不一样,比如:动态类型、静态类型、强类型,弱类型、解释型、编译型。 那么这几个类型是什么意思呢,现在市场上流行、曾经流行的编程语言又分别是哪个类型的呢,接下来就来一一看看。 动态类型动态类型语言,是指在运行期间才做数据类型检查的语言。 此类型的编程语言,变量、属性、方法的参数的数据类型以及方法的返回值类型都可以不用指定,他们的数据类型会在首次赋值时被记录下来。此类型的语言有JavaScript、Perl、PHP、Ruby 、Python和VB等等。 静态类型静态类型语言,在编译阶段就做数据类型检查的语言,这点与动态类型语言刚好相反;也就是说这种类型的语言,声明变量时在就要明确指定变量的数据类型;如果没有明确指定,程序就无法通过编译,更加无法运行。 比如:C、C++、C#、Java以及运行JVM的其他语言都是静态类型语言的典型代表。 强类型强类型语言,也称为强类型定义语言,是一种强制数据类型定义的语言。此类语言的变量的数据类型一旦确定,除非发生类型强制转换,否则其数据类型永远不会发生改变。所以,强类型定义语言也是类型安全的语言。 并且还要求所有的变量、属性必须先声明并初始化后才能使用,而且变量、属性、方法的参数以及方法的返回值必须明确指定数据类型,而且即便不同类型的变量之间的类型转换也要严格按照转换规则来执行。如Java、C# 和 Python、C、C++等都是强类型的语言。 虽然强类型定义语言运行速度上比起弱类型语言稍稍逊色一些,但加以优化,也并非不能克服;强类型定义语言由于明确指定数据类型,所有会更加严谨,从而能避免很懂逻辑和语法上的错误。 弱类型弱类型语言,数据类型可以被忽略的语言,这点与强类型定义语言相反;一个变量可以被赋不同数据类型的值。 在定义变量时可以只使用变量修饰符标识其是一个变量即可,而不用考虑其时什么数据类型;同时,一个变量可以赋不同数据类型的值,且不需要明确的数据类型。比如:变量a 首次赋值的数据类型是字符串类型,但在后期根据需要可以把数字类型的值赋给变量a。 弱类型语言如VB 、PHP、JavaScript等。 解释型解释型语言的源代码会在执行到的那一刻才会被语言解释器转换为计算机可执行文件并执行,整个的运行过程会不断的解释,执行;解释,执行...... 即便新的一次运行到已经解释过的程序,解释器也依然还会再次解释,并执行。 这个过程好比,你买了本纯英文的书,但你看不懂,然后去找了英文翻译来辅助你阅读,你想看哪行,他给你翻译哪行;如果你想回头去看之前的内容,他也依然会重新翻译一次,并给到你。 在解释型程序中,程序总是以源代码的形式出现;那么只要有解释器,一个解释型的程序就能很轻易的移植到另一个平台上。还有程序的修改也很方便,因为其是实时解释的,能够实时查看改动的效果。但也会因程序的不断扩大,减慢程序解释的响应速度,往往对计算机性能有一定的要求。 比如:Java、JavaScript、VBScript、Perl、Python等都是解释型语言。Java 因其JVM的跨平台特性,所以Java 也可算是解释型语言。 编译型是指语言的源码需要经过编译器编译,生成计算机(操作系统)的可执行文件,或者计算机指令,才能够被计算机识别,并执行。完成的过程就是:程序员根据需求写出项目源代码,然后把源代码交由编译器将所有源码文件一次性编译,得到可执行文件,这时,就可以把可执行文件通过操作系统运行起来,就能看到实际的运行效果了。 如果用英文书的例子来说明,就是:英文翻译会将整本书翻译后给到你,那么即便想回头去看之前看过的内容,也只需要自行查阅就可以了。 由于程序要经过编译后才能运行,所以其运行速度会比解释型语言要快上不少;编译过程中会进行一些必要的检查,因此也能避免不少错误的发生;但也是因为其运行机制,小小的改动也要重新编译执行,必定会浪费一定的时间。 比如:C、C++、Java,C#、Pascal/Object Pascal(Delphi)、VB等语言都可视为编译型语言。 一些常见的编程语言的类型无类型: 汇编弱类型、静态类型 : C、C++弱类型、动态类型检查: Perl、PHP、JavaScript强类型、静态类型检查 :Java、C#强类型、动态类型检查 :Python, Scheme静态显式类型 :Java、C静态隐式类型 :Ocaml、Haskell 完结,老夫虽不正经,但老夫一身的才华!关注我,获取更多编程科技知识。

July 6, 2020 · 1 min · jiezi

最近迫切应学的编程语言

作者 谢恩铭,公众号「程序员联盟」(微信号:coderhub)。转载请注明出处。原文:http://www.jianshu.com/p/08ca...编程语言之争从来不曾停止,这篇文章绝对不会去讨论哪个语言是最好的(当然了,除了“PHP 是世界上最好的语言”这句“真理”之外)。 插句题外话,不要听一些人说:“编程语言没有好差之分,只有用起来顺不顺手”。这话其实不正确,编程语言就是有好差之分。有些编程语言就是设计得不好,就是不适合一般的应用,就是无人问津。 我想谈谈最近几年我的感受: 我深刻地认识到 Python 是当下迫切应该学习的编程语言。为什么这么说呢?且听我慢慢“因式分解”: Python 很火,非常火。这和人工智能(AI :Artificial Intelligence)有关。Python 有很多优秀的库,特别适合数学运算和科学计算,而人工智能就需要很多计算和一些算法,因此 Python 的很多库比如 Numpy,Pandas,SciPy,等就有用武之地了。而且很多大公司启动了适合人工智能的库或项目,比如 Google 公司发布的开源机器学习库 TensorFlow,Tesla(特斯拉)的 OpenAI,FaceBook 开源的 PyTorch,等等。这些库上层都可以很方便地用 Python 来操作。Google 的 AlphaGo 击败了人类最强围棋(Go)玩家李世石,而 AlphaGo 是基于 Google 的 DeepMind,DeepMind 前不久宣布底层基于 TensorFlow 了。特斯拉的 OpenAI 在单人对抗中击败了人类最强的 Dota 2 影魔选手之一的 Dendi,完整对战视频。当然了,现在 AI 已经可以在星际争霸 2 中战胜人类选手了。 Python 非常容易入门。Python 号称「Battery included」。我们知道 battery 是「电池」的意思,included 是「包含」的意思,因此就是说 Python 简单到「已经包含了电池了」,功能都已经包含在语言里了,直接拿来用即可。其语法实在很简单,基本没有编程经验的孩子几天也可以学会。现在 Python 更是已经被加入幼儿园、中小学的教材中了。Python 几乎可以被应用在任何领域。人工智能、科学计算领域自然不用说,各种成熟的库调用起来极为方便;大数据领域也是 Python 大展拳脚之处;云计算领域 Python 可以发挥实力,比如著名的 Dropbox 就是 Python 写的;用 PyGame 可以进行快速游戏开发;GUI 图形界面编程也不在话下,Matplotlib 这个绘图库可以满足你;嵌入式领域,著名的树莓派(Raspberry Pi)开发板的主要开发语言是 Python;Web 应用有 Django、Flask,等这个 Web 应用框架,可以很快速地开发出绚丽无比的网站;Web 后端 Python 也不甘寂寞,知乎和豆瓣的后台就是 Python 写的;近几年新兴的职业 DevOps (development 和 operations 的组合)一般也用 Python 来写脚本;一些大型项目的构建以及一些小任务的处理,Python 的脚本也能助你快速开发;用 Python 做爬虫程序,可以轻松爬取网络上你想要的内容(当然,请不要干坏事),Python 有很多不错的爬虫库,例如 Scrapy。优越的跨平台性能,几乎所有的操作系统都可以跑起来 Python。Python 既支持面向过程函数式编程也支持面向对象的抽象编程。用 Python 语言编写程序让人很愉快,反正我学习的时候感觉写 Python 的程序有一种快感。Python 非常精简。本身的 API 封装得挺好,因此很多功能不需要我们重新造轮子,直接调用即可。再加上那么多成熟的库,用起来不要太开心。同样实现一个功能,用 C 语言,Java 或 C++ 往往要写很多行代码,Python 只需一行或者几行代码帮你搞定。Python 在 Tiobe 编程语言排行榜的最新一期榜单(2020 年 6 月)中已经位列第 3,仅次于 Java,C语言。虽说这个榜单不能涵盖全部,但也是编程界比较权威的榜单了。可以看出 Python 势头强劲。Python 是解释型语言,因此假如你要做些小测试,或者学习这门语言,将会非常省时间,因为不需要编译,直接解释就可以执行。比如我很喜欢的 Python 的 IDE(集成开发环境),由大名鼎鼎的 Jetbrains 出品的 PyCharm,就让写 Python 程序成了一种享受。Python 的可扩展性很好,开发者可以用 C 语言或者 C++ 编写 Python 的扩展模块,还能将 Python 嵌入到 C/C++ 程序中。著名的 Numpy 就是用 C语言写的。Python 的源代码写得不错。其源代码一开始是用 C 语言写的,Python 的作者使用中立的面向过程的 C 语言,实现了动态面向对象,使得 Python 具备灵活和优雅的特性。Python 的源代码也是值得学习的。推荐一本书,是中国人写的,叫《Python 源码剖析》,作者 陈儒,豆瓣评分 8.7。规范的代码。Python使用强制缩进来保证代码规范性,几乎不需要代码审查。以前学习 C++ 的时候,感觉真是挺难的,主要是 C++ 比较庞杂,东西太多,概念都能把你绕晕了,而且还要考虑指针和内存等等。很多写 C++ 的人其实并没有很好地掌握其精髓,写出来的程序往往非常丑陋,难以扩展和维护。 ...

June 17, 2020 · 1 min · jiezi