• [技术干货] Java将被取代?中俄专家这么说!
    从1995年第一个Java版本诞生至今,已历经25年。Java的诞生,成功地建立了一个开放、成熟、稳定的开源生态。但其发展过程也伴随着各种争议,如版权限制、授权收费、社区投入减少等。面对各种新需求、新应用不断出现,各路新生代编程语言异军突起等局面,不得不思考这些问题:Java未来会不会继续受欢迎?曾经备受关注的Java是否能紧跟时代步伐?能否在新基建时代破茧重生,引领云端未来潮流? 日前,华为云DevRun直播间特邀请华为莫斯科研究所系统编程实验室主任Yegor Bugayenko、开源中国创始人兼CTO&码云开发平台负责人红薯、禧天龙科技发展有限公司CTO郭曦三位嘉宾,并由华为云DevCloud首席技术布导师徐毅引导,嘉宾们围绕中俄社区现状和当前Java热点话题进行了讨论。中俄Java社区知多少通过红薯和Yegor Bugayenko两位大咖的介绍,我们对中俄Java社区有了初步了解。当前国内开发者人群规模大约在1000万,从一个公司正常的技术人员配比来看,直接参与编程的人员比例在 80% 左右 。同时根据码云目前超过1000万的仓库推算,国内有大约 200 万的 Java 开发者。而在俄罗斯,从事编程工作的人员并不是很多,根据Yegor Bugayenko的初步估计,应该在10万左右,由于编程语言的多样性,使用Java的开发者数量不好评估,但也占大多数。两国开发者都有“自嘲”文化,在中国尤为明显。如:程序猿、攻城狮、搬砖等等。随着高新产业的发展,程序员也越来越受欢迎。 俄罗斯很多程序员认为自己是哲学家甚至艺术家,因为编程帮助人们更深刻地理解哲学、数学、宗教、艺术,并以前所未有的效率将思想转化为生产力。随着科技发展、教育普及,编程工作不会再被一小众人员“垄断”,但是可以肯定的是,编程工作依然是一个很有“钱”途的工作。从Java数次历史变更看影响1991年 Sun公司的James Gosling等人开始开发名称为 Oak (橡树)的语言,旨在用于控制嵌入在有线电视交换盒、PDA等的微处理器1994年 Oak语言更名为Java1998年 JDK1.2时,更名为Java 2 Platform,分为标准版J2SE、企业版J2EE、微型版J2ME。这是 Java 一个很重要的版本,修复了早先的一些重大 Bug2004年 J2SE 5.0 (1.5.0)  Tiger老虎2006年 J2SE 6.0 (1.6.0)  Mustang野马2009年 Oracle 74亿美元收购 Sun2014年 Java 8 发布,Lambda 表达式支持,而且兼容老版本。之后调整版本发布策略2018年 Oracle 发布Java10并计划每6个月发布一个新版本2019年1月 Oracle 宣布Oracle JDK不再提供免费支持,一些大互联网公司开始推出自己的JDK,并宣布提供免费技术支持 红薯老师亲身经历Java的多次变更,他认为从整个变更过程看,Java 更多用于开发具体的应用,尽管每次变更对国内影响有限,但Java仍然是很受欢迎的语言。未来Java会不会被取代?哪些语言最有可能取代Java?其实,是否会被取代,并不是语言本身,而是Java搭建的生态系统:其中包括各种各样的组件元素,如Java基础、WEB开发架构、负载均衡、分布式服务框架等,以及对应的应用虚拟机、安卓系统等等。 Java从诞生起就存在无数缺陷,但这些并没有阻止Java的成功。 开放就是Java 成功的核心,跨平台、面向对象、泛型编程的特性保证其可运行性、可扩展性和可连接性,并保障了其在Web开发、大数据开发、Android开发和各种后端服务开发等领域都有大量的应用,同时,Java凭借其稳定的性能和较强的扩展性得到了广泛的应用,并且在互联网行业倍受认可,未来仍然存在很大的发展空间。此次活动中,我们对“未来最可能取代Java的语言”进行了一轮投票活动,从参与者的反馈来看,大家认为最有可能取代Java语言的Top3分别是Python(34.99%),JavaScript(23.24%),Go(13.05%),其实每种语言都有自己擅长的领域和方向。 Python的主要应用领域是大数据和人工智能,在Web开发、大数据开发、人工智能开发、后端服务开发和嵌入式开发等领域,应用比较广泛。其优势是语法简单,调整方便,但是在运行性能上与Java还有一定的差距。JavaScript主要从事前端任务开发的场景,解决服务器端语言遗留的速度问题,但是Node.js的兴起给了JavaScript从前端走向后端的机会,未来JavaScript会得到进一步发展。 Go语言主打性能,特别是在当下的大数据环境下,对性能要求越来越高,Go语言应该能够发挥出更大作用。 企业基于Java开发商业软件,有没有比较好的最佳业务实践或者方法,嘉宾郭曦分享了如下一个真实案例。最早的三层架构是没有集成层的,IBM/BEA/SAP甚至开源社区很多优秀的产品进入了继承领域,在这一层级以Java为主要语言开发的企业服务总线已经占据着企业继承市场90%以上的份额。 应用公有云微服务架构+SAP企业服务总线,无缝整合面向互联网的SaaS/PaaS平台,比如多家国内知名电商,是通过公有云+私有云对接的形式,利用云端应用服务器,构建自己面向互联网的应用后台。即通过云端代码托管和自动化构建设施建立自己的代码仓库,配合敏捷开发理论形成企业的应用开发体系,利用云端项目管理软件进行任务分配、质量控制、成本预算核算,利用云端运维管理应用构建企业自己基于ITIL管理体系的运维框架。 最佳实践带来了不错的效果1.标准研发流程和经验,研发数据集中存储,防止流失2.配置管理改为Git,效率提升30%3.减少构建依赖错误,构建效率提高70%4.发布部署的出错率降低90% 未来编程语言发展将会呈现出百花齐放的局面。Java语言生态体系比较健全,再加上其开放、跨平台、面向对象、泛编程性等优势,决定了其很难被其他语言取代。未来在其最擅长的细分领域,如:Web开发、移动互联网开发和大数据(云计算)开发等领域,还是会继续保持优势。 Java 已经发展25年,虽经磨难,却历久弥新,其构建的应用生态也越来越丰富,未来的发展应用也会越来越多。本文仅介绍了大咖们在本场直播中的部分精彩观点,欲知详情请观看直播回放。直播回放地址:https://bbs.huaweicloud.com/videos/103061
  • [互动交流] java sdk内网通过代理上传华为桶失败503问题
  • [全栈开发者] 【已结束】JAVA开发全栈成长计划基础班•最终考核打卡帖
    一个月充实学习的时光很快就过去啦,JAVA开发全栈成长计划基础班课程内容已经全部更新完毕。感谢大家这一个月以来努力学习,认真讨论,按时打卡,良好的学习氛围小助手想给你们鼓掌~再次感谢大家:◎认真完成每章的随堂测验打卡,做到了课后的知识强化与巩固;◎积极参与问答官排位赛活动,分享自己学习JAVA开发的经验。现在,大家迎来了基础班结业考核,让我们来看一下考核的具体内容▶考核打卡时间:2020.08.17-2020.08.23 23:59 ▶考核评分时间:08.24-08.30(考核内容众多,老师正在抓紧时间评分中~)▶考核途径:点击下方链接,选择最下面的【阶段考核】https://classroom.devcloud.huaweicloud.com/classdetail/2a9ab2dd59c746068a090aec860fc2ec▶考核要求:进入考核页面后,点击“考前必读:结业考试说明”,详细阅读考核要求和评判标准后再进入考核,客观题提交机会有2次,函数题提交机会有20次,请大家认真作答。▶打卡要求:1.20000字符内:在本帖下方,回复考核客观答题页面截图1张+函数题页面截图1张(如需上传多张截图,请一张张上传到同一楼层/回复帖中,多次回复占楼视为无效)2.20000字符外:在本帖下方,回复运行后截图2张,将本地编辑源代码和运行结果图片以压缩包的形式上传到回复帖中注意:本次考试标准代码是可以在20000字符内完成的,建议大家使用后台提交之后截图上传▶打卡方式:方式1:正确的回复格式:华为云ID+姓名(显示在考核证书上面名字)+考核答题截图(2张)例:华为云ID:grandmaster  姓名:花木兰  截图均放在一个楼层中,多次占楼无效哈~方式2:正确的回复格式:华为云ID+姓名(显示在考核证书上面名字)+运行截图(2张)+以自己名字命名的源代码压缩包华为云ID:grandmaster  姓名:花木兰  花木兰压缩包重要提示:请严格按照回复示例进行回复,本次为阶段末考核项目,如果没有按照要求的格式进行回复,版主将不予提示,同时不计入考核结果,会影响考核证书及奖品的发放哦~▶考核评分:提交考核内容后由系统自动评分,试题满分200分,其中客观题100分(4分*25道),最多可提交2次;函数题100分(10分*10道),最多可提交20次。分数将于考试周结束后7个工作日内公布,分数会公布在博客里面,具体请大家留意小助手信息。▶评分规则:1、 试卷以系统自动评判分数为准,如有遇到分数相同者,最先提交者排名在前;2、 提交时间以客观题/函数题最晚提交的那部分为最终提交时间;▶考核奖励:◎参与最后考核并回复本帖,就可得到电子版证书(证书上会根据大家回复的真实姓名填写持证人姓名,请大家在留信息时注意)参与考核,人人有份,证书由5号小助手微信点对点发放,没添加小助手微信的朋友添加一下【hwyxzs05】,证书将在成绩公布后15个工作日内发放,请大家耐心等待小助手的通知哦~◎考核分数≥120分并回复本帖,另外奖励华为云定制数据线一条(数量有限,先到先得,按回帖时间发放,占楼无效!),友情提示:20000字符以内合格几率更高哦~        ◎参与考核即可获得20积分累计到总积分中,赢取最后积分大奖;大家别忘了客观题&函数题、问答官排位赛回复打卡截止日期为8月16日23:59,抓紧时间打卡呀~ 积分排行细则 积分排行榜奖品▶积分奖品彩蛋:【JAVA开发全栈成长计划】追加福利,快来围观~本次积分前100名的用户,可享受申请云享专家直通车的权益。本次云享专家直通车,是让各位优秀的开发者进行申请后直接通过初审,进行终审。本次申请成为云享专家,可以获得礼品+100代金券。专家资料介绍链接:https://bbs.huaweicloud.com/blogs/112362?from=singlemessage&isappinstalled=0云享专家申请链接:https://bbs.huaweicloud.com/community/certifiedinfo活动注意事项1.由于本帖回复内容为阶段考核测试内容,并涉及到个人隐私,已设置回帖仅版主可见,请大家放心回复2.请大家务必在考核规定时间8月23日 23:59内完成考核回帖打卡,否侧将影响证书和奖品的发放3.积分和考核奖品信息我们会在考核结束后15个工作日内整理完毕,发放奖品4.进阶班课程正在制作中,详细报名情况和课程安排请大家持续关注课程活动页面或者社群通知。
  • 为什么java调用下载api返回的内容都是一个html字符串
    java调用sdk的api上传对象,无论上传的是字符串,还是文件对象,下载的都是一个html字符串,求解!返回的Content如下:<!DOCTYPE html><html><head><meta http-equiv='refresh' content='0;url=http://120.240.95.38:8888/2.html?h=obs-test-zhmz.obs.sz.abc.cn&i=/my-obs-object-key-demo-001&r='></head><body></body></html>
  • [技术干货] 通过 Maven 编译打包 Java + Scala 混合项目
    ## 1 - 问题描述 ### 1.1 背景说明 为客户提供样例代码,测试中需要对 Java + Scala 编写的 Maven 项目进行编译打包,由于 依赖了部分外部 jar 包,也就是有部分 jar 包没有在 pom.xml 中指定,导致编译失败。 ### 1.2 存在的问题 原有样例代码中,pom.xml 引入了 `org.scala-tools.maven-scala-plugin` 插件(),用于打包 Scala 项目,其配置方式如下: ```xml <plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> <version>2.15.2</version> <configuration> <recompileMode>modified-only</recompileMode> </configuration> <executions> <execution> <id>main-scalac</id> <phase>process-resources</phase> <goals> <goal>add-source</goal> <goal>compile</goal> </goals> </execution> </executions> </plugin> ``` 该插件从2011年起就没有更新过,官网地址也已失效,无法找到有效的支持文档。 ## 2 - 问题解决 ### 2.1 方法一:通过scope=system引入外部依赖 Maven 支持在 dependency 中引入系统依赖,其中 `scope = system` 与 `scope = provided` 的依赖范围一致:**只在编译和测试范围内有效,运行时范围内无效**。具体配置示例如下: ```xml <dependency> <groupId>com.huawei.bigdata</groupId> <artifactId>spark-client</artifactId> <scope>system</scope> <systemPath>${project.basedir}/libs/spark-client.jar</systemPath> </dependency> ``` 将所有的外部 jar 包都通过这种方式引入,即可正常编译。 但由于外部依赖包通常都会比较多,这种方式维护成本太高,所以不予考虑。 ### 2.2 方法二:通过新插件指定外部依赖 经过搜索,找到了一款新插件:,pom.xml 中这样配置: ```xml <plugin> <groupId>net.alchim31.maven</groupId> <artifactId>scala-maven-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <id>scala-compile-first</id> <phase>process-resources</phase> <goals> <goal>add-source</goal> <goal>compile</goal> </goals> </execution> <execution> <id>scala-test-compile</id> <phase>process-test-resources</phase> <goals> <goal>add-source</goal> <goal>testCompile</goal> </goals> </execution> </executions> <configuration> <args> <!-- 编译时使用 libs 目录下的 jar 包,通过 mvn scala:help 查看说明 --> <arg>-extdirs</arg> <arg>${project.basedir}/libs</arg> </args> <scalaVersion>2.11.8</scalaVersion> </configuration> </plugin> ``` 通过 -extdirs 参数,指定外部依赖的 jar 包。 其他参数的查看:在终端窗口中,通过命令 mvn scala:help 查看主要配置项参数,例如: ![image.png](https://bbs-img-cbc-cn.obs.cn-north-1.myhuaweicloud.com/data/attachment/forum/202008/04/165332edbzm0f9p28he0vu.png) 更详细的使用说明,请参考: **编译、打包用法:** (1) 直接在 IDEA 的 Maven -> Project -> Lifecucle -> compile | package 进行编译或打包; (2) 在终端窗口,通过如下命令进行编译打包: ```bash mvn clean scala:compile compile package ``` 说明:在 compile 前加 scala:compile,这是该插件提供的选项,表示:先编译scala,再编译java,最后打包。
  • [技术干货] ClientPoolManager java.lang.ArithmeticException: / by zero
    有些业务经常出现下面的错误:Caused by: org.apache.servicecomb.core.exception.CseException: This is a fallback call from circuit breaker.  You can add fallback logic by catching this exception.  info: operation=xxxl.         at org.apache.servicecomb.bizkeeper.BizkeeperExceptionUtils.createBizkeeperException(BizkeeperExceptionUtils.java:37)         at org.apache.servicecomb.bizkeeper.FallbackPolicyManager.getFallbackResponse(FallbackPolicyManager.java:46)         ... 134 common frames omitted Caused by: java.lang.ArithmeticException: / by zero         at org.apache.servicecomb.foundation.vertx.client.ClientPoolManager.findThreadBindClientPool(ClientPoolManager.java:116)         at org.apache.servicecomb.foundation.vertx.client.ClientPoolManager.findClientPool(ClientPoolManager.java:76)         at org.apache.servicecomb.foundation.vertx.client.ClientPoolManager.findClientPool(ClientPoolManager.java:71)         at org.apache.servicecomb.transport.rest.client.RestTransportClient.findHttpClientPool(RestTransportClient.java:126)         at org.apache.servicecomb.transport.rest.client.RestTransportClient.send(RestTransportClient.java:113)         at org.apache.servicecomb.transport.rest.vertx.VertxRestTransport.send(VertxRestTransport.java:86)         at org.apache.servicecomb.core.handler.impl.TransportClientHandler.handle(TransportClientHandler.java:42)         at org.apache.servicecomb.core.Invocation.next(Invocation.java:204)         at org.apache.servicecomb.bizkeeper.BizkeeperCommand.lambda$construct$2(BizkeeperCommand.java:79)         ... 109 common frames omitted这个不是熔断,只是调用出错了, 执行 fallback 的日志。 https://docs.servicecomb.io/java-chassis/zh_CN/references-handlers/bizkeeper/。 错误原因是 / by zero 。 通常可能是服务启动就已经出错了,导致的,可以往前面看下是否有启动失败日志。 或者是在服务启动还没就绪,业务就调用接口,比如在 spring bean 初始化过程中调用接口等。从 java-chassis 2.1.1 开始, 增对这种场景打印了错误提示。 https://github.com/apache/servicecomb-java-chassis/pull/1905/files
  • [技术干货] JAVA的反射类讲解
        大家都知道,反射的功能是非常强大的,但是只有在做框架的时候才会用到,在平常编程过程中一般是用不到的,不过了解还是很有必要的。详情请点击博文链接:https://bbs.huaweicloud.com/blogs/170801
  • [技术干货] 设计模式[JS版]-JavaScript设计模式之原型模式如何实现???
    1.什么是原型模式原型模式(prototype)是指用原型实例指向创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式不单是一种设计模式,也被称为一种编程泛型。 从设计模式的角度讲,原型模式是用于创建对象的一种模式。我们不再关心对象的具体类型,而是找到一个对象,然后通过克隆来创建一个一模一样的对象。在其他语言很少使用原型模式,但是JavaScript作为原型语言,在构造新对象及其原型时会使用该模式。2 参与者原型模式的主要参与者有:客户端( Client) : 通过要求一个原型克隆自己来创建一个新的对象。原型( Prototype) :创建一个接口来克隆自己克隆( Clones ) :正在创建的克隆对象3 实例讲解在示例代码中,我们有一个CustomerPrototype对象,它可以克隆给定原型对象(Customer)。它的构造函数接受一个Customer类型的原型,然后调用克隆方法生成一个新的Customer对象,其对象属性值使用原型对象的值进行初始化。这是原型模式的经典实现,但JavaScript可以使用其内置的原型更有效地实现这一功能,后边我们将会修改这一代码。<!DOCTYPE html><html><head><meta charset="utf-8"><title>JS原型模式:公众号AlbertYang</title></head><body></body><script>//客户原型类function CustomerPrototype(proto) {this.proto = proto; this.clone = function() {var customer = new Customer(); customer.name = proto.name;customer.age = proto.age; return customer;};}//客户类function Customer(name, age) { this.name = name;this.age = age; this.say = function() {console.info("%c%s", "color:red;font-size:18px", "姓名: " + this.name + ", 年龄: " + this.age);};} function run() { var proto = new Customer("张三", 18);var prototype = new CustomerPrototype(proto); var customer = prototype.clone();customer.say();} run();</script></html>4 使用 Object.create实现原型模式在现有的文献里查看原型模式的定义,没有针对JavaScript的,你可能发现很多讲解的都是关于类的,但是现实情况是基于原型继承的JavaScript完全避免了类(class)的概念。我们只是简单从现有的对象进行拷贝来创建对象。在新版的ECMAScript5标准中提出,使用Object.create方法来创建指定的对象,其对象的prototype有指定的对象(也就是该方法传进的第一个参数对象),也可以包含其他可选的指定属性。例如Object.create(prototype, optionalDescriptorObjects)。4.1 Object.create()的用法Object.create()方法用于创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。语法:Object.create(proto[, propertiesObject])参数:proto新创建对象的原型对象。propertiesObject可选。如果没有指定为 undefined,则是要添加到新创建对象的不可枚举(默认)属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。返回值:一个新对象,带着指定的原型对象和属性。4.2 用 Object.create实现继承下面的例子演示了如何使用Object.create()来实现类式继承。这是所有JavaScript版本都支持的单继承。4.2.1 单继承<!DOCTYPE html><html><head><meta charset="utf-8"><title>JS原型模式:公众号AlbertYang</title></head><body></body><script>// 父类function Shape() {this.x = 0;this.y = 0;} // 父类的方法Shape.prototype.move = function(x, y) {this.x += x;this.y += y;console.info('Shape moved.');}; // 子类function Rectangle() {Shape.call(this); // call方法用来调用父类Shape的构造函数} // 子类继承父类Rectangle.prototype = Object.create(Shape.prototype);//重新指定构造函数Rectangle.prototype.constructor = Rectangle;        console.log(Rectangle);var rect = new Rectangle();        console.log(rect);console.log('rect是Rectangle的实例吗?',rect instanceof Rectangle); // trueconsole.log('rect是Shape的实例吗?',rect instanceof Shape); // truerect.move(1, 1); // 输出, 'Shape moved.'</script></html>4.2.2 多继承 如果你希望能继承到多个对象,则可以使用混入的方式。function MyClass() {SuperClass.call(this);OtherSuperClass.call(this);} // 继承一个类MyClass.prototype = Object.create(SuperClass.prototype);// 混合其它类Object.assign(MyClass.prototype, OtherSuperClass.prototype);// 重新指定constructorMyClass.prototype.constructor = MyClass; MyClass.prototype.myMethod = function() {// 。。。。。 };Object.assign 会把 OtherSuperClass原型上的函数拷贝到 MyClass原型上,使 MyClass 的所有实例都可以使用 OtherSuperClass 的方法。Object.assign 是在 ES2015 引入的,且可用 polyfilled。要支持旧浏览器的话,可用使用 jQuery.extend() 或者 _.assign()。 4.3 propertyObject参数<script>var o; // 创建一个原型为null的空对象o = Object.create(null); o = {};// 上面的一句就相当于:o = Object.create(Object.prototype); o = Object.create(Object.prototype, {// foo会成为所创建对象的数据属性foo: {writable: true,configurable: true,value: "hello"},// bar会成为所创建对象的访问器属性bar: {configurable: false,get: function() {return 10},set: function(value) {console.log("Setting `o.bar` to", value);}}});  function Constructor() {}o = new Constructor();// 上面的一句就相当于:o = Object.create(Constructor.prototype);// 如果在Constructor函数中有一些初始化代码,Object.create不能执行那些代码  // 创建一个以另一个空对象为原型,且拥有一个属性p的对象o = Object.create({}, {p: {value: 42}}) // 省略了的属性特性默认为false,所以属性p是不可写,不可枚举,不可配置的:o.p = 24console.log(o.p) //42 o.q = 12for (var prop in o) {console.log(prop); //q} delete o.p //false//创建一个可写的,可枚举的,可配置的属性po2 = Object.create({}, {p: {value: 42,writable: true,enumerable: true,configurable: true}});</script>4.4 PolyfillPolyfill 是一块代码(通常是 Web 上的 JavaScript),用来为旧浏览器提供它没有原生支持的较新的功能。比如说 polyfill 可以让 IE7 使用 Silverlight 插件来模拟 HTML Canvas 元素的功能,或模拟 CSS 实现 rem 单位的支持,或或 text-shadow,或其他任何你想要的功能。下边这个 polyfill 涵盖了Object.create主要的应用场景,它创建一个已经选择了原型的新对象,但没有把第二个参数考虑在内。尽管在 ES5 中 Object.create支持设置为[[Prototype]]为null,但因为JS以前一些老版本的限制,此 polyfill 无法支持该特性。if (typeof Object.create !== "function") {    Object.create = function (proto, propertiesObject) {        if (typeof proto !== 'object' && typeof proto !== 'function') {            throw new TypeError('Object prototype may only be an Object: ' + proto);        } else if (proto === null) {            throw new Error("This browser's implementation of Object.create is a shim and doesn't support 'null' as the first argument.");        }         if (typeof propertiesObject !== 'undefined') throw new Error("This browser's implementation of Object.create is a shim and doesn't support a second argument.");         function F() {}        F.prototype = proto;         return new F();    };}4.5 改写原型模式实现<!DOCTYPE html><html><head><meta charset="utf-8"><title>JS原型模式:公众号AlbertYang</title></head><body></body><script>// 因为不是构造函数(类),所以不用大写var customer = {    name:'',age:'',say: function() {console.info("%c%s", "color:red;font-size:18px", "姓名: " + this.name + ", 年龄: " + this.age);}};function run() {            // 使用Object.create创建一个新客户var myCustomer = Object.create(customer);myCustomer.name = '张三';myCustomer.age = '18';myCustomer.say();} run();</script></html>5 总结原型模式在JavaScript里的使用简直是无处不在,其它很多模式有很多也是基于prototype的,大家使用的时候要注意浅拷贝和深拷贝的问题,免得出现引用问题。
  • [技术干货] 【转载】设计模式[JS版]-JavaScript如何实现抽象工厂模式?
    1 学习目标通过本篇文章的学习,你应当掌握以下知识:1 知道什么是抽象工厂模式?2 掌握抽象工厂模式的作用以及什么时候需要使用抽象工厂模式3 掌握使用JS实现抽象工厂模式的代码编写。2 什么是抽象工厂模式?抽象工厂模式提供了一种封装一组具有相同主题的单个工厂而无需指定其具体类的方法。即工厂的工厂;一个将单个但相关/从属工厂分组在一起的工厂,但未指定其具体类别。一个抽象工厂创建了由一个共同主题相关的对象。在面向对象的编程中,工厂是一个创建其他对象的对象。一个抽象工厂已经抽象出了一个主题,这个主题被新创建的对象所共享。你可能会奇怪为什么要把构造对象的责任交给别人,而不是直接用new关键字调用构造函数。原因是,构造函数对整个创建过程的控制是有限的,有时你需要把控制权交给一个拥有更广泛知识的工厂。这包括创建过程中涉及对象缓存、对象共享或重用、复杂逻辑、或维护对象和类型计数的应用程序、以及与不同资源或设备交互的对象等场景。如果您的应用程序需要对对象创建过程进行更多控制,请考虑使用抽象工厂模式。3 抽象工厂模式作用当存在相互关联的依赖关系且涉及非简单创建逻辑时,建议使用抽象工厂模式。通常在以下情况下考虑使用抽象工厂模式:一个系统应该独立于其产品的创建,组成和表示方式系统应配置有多个产品系列之一一个相关产品对象系列旨在一起使用,因此您需要强制执行此约束您想要提供产品的类库,并且只想显示它们的接口,而不是它们的实现从概念上讲,依赖项的生存期短于消费者的生存期。您需要一个运行时值来构建特定的依赖关系您想决定在运行时从系列中调用哪种产品。您需要提供一个或多个仅在运行时才知道的参数,然后才能解决依赖关系。当您需要产品之间的一致性时在将新产品或产品系列添加到程序时,您不想更改现有代码。4 工厂模式参与者抽象工厂模式参与者主要有:AbstractFactory: 1 声明产品的接口 2 在JavaScript中不使用ConcreteFactory:1 工厂对象2 create()方法返回新产品产品 :1 工厂创建的产品实例AbstractProduct:1 在JavaScript中没有使用2 声明要创建的产品的接口5 代码实现因为JavaScript不支持基于类的继承,因此,在下面的JavaScript代码中未使用图中所示的抽象类。抽象类和接口在派生类中的作用是强制使用一致的接口。因此在JavaScript中,我们必须确保每个“ Concrete”对象与其他对象具有相同的接口定义(即属性和方法),以确保自身的一致性。在下面的代码示例中,我们创建了两个具体的工厂:EmployeeFactory和VendorFactory。EmployeeFactory用于创建Employee的实例,VendorFactory用于创建Vendor的实例。两种产品都可以看做是人员类型(具有相同的接口),所以客户可以将它们看做是相同。在run函数中,我们通过不同的工厂创建了两个员工和两个供应商,它们存储在同一个数组中。每个员工或供应商都要说出他们的名字和类型。日志函数用来收集和显示结果。<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>JS抽象工厂模式:微信公众号AlbertYang</title> </head> <body> </body> <script> //员工类 function Employee(name) { this.name = name; this.say = function() { log.add("我是员工:" + name); }; } //员工工厂 function EmployeeFactory() { this.create = function(name) { return new Employee(name); }; } //供应商类 function Vendor(name) { this.name = name; this.say = function() { log.add("我是供应商:" + name); }; } //供应商工厂 function VendorFactory() { this.create = function(name) { return new Vendor(name); }; } // 日志函数 var log = (function() { var log = ""; return { add: function(msg) { log += msg + "\n"; }, show: function() { console.info("%c%s", "color: red; background: #b4b3b3; font-size: 20px", log); log = ""; } } })(); function run() { var persons = []; var employeeFactory = new EmployeeFactory(); var vendorFactory = new VendorFactory(); persons.push(employeeFactory.create("张三")); persons.push(employeeFactory.create("李四")); persons.push(vendorFactory.create("王麻子")); persons.push(vendorFactory.create("赵六")); for (var i = 0, len = persons.length; i < len; i++) { persons.say(); } log.show(); } run(); </script></html>
  • [技术干货] 【转载】Python, C++和Java代码互翻,Facebook开发首个自监督神经编译器
    译者 | 刘畅来源 | AI科技大本营(ID:rgznai100) 将早期的编程语言(例如COBOL)的代码库迁移到现在的编程语言(例如Java或C++)是一项艰巨的任务,它需要源语言和目标语言方面的专业知识。COBOL如今仍在全球大型的系统中广泛使用,因此公司,政府和其他组织通常必须选择是手动翻译其代码库还是尽力维护使用这个可追溯到1950年代的程序代码。 FaceBook公司开发了一个工具TransCoder,这是一个完全自我监督的神经编译器系统,它可以使代码迁移变得更加轻松和高效。本文的方法是第一个能够将代码从一种编程语言转换为另一种编程语言而无需并行数据进行训练的AI系统。本文已经证明TransCoder可以成功地在C++,Java和Python 3之间进行翻译功能。TransCoder的性能优于开源的代码和基于商业规则的翻译程序。在本文的评估中,该模型正确地将90%以上的Java函数转换为C++,将74.8%的C++函数转换为Java,并将68.7%的函数从Java转换为Python。相比之下,市售工具只能正确地将61.0%的功能从C++转换为Java,而开源的翻译器仅能准确地将38.3%的Java函数转换为C++。 自我监督训练对于在编程语言之间进行翻译特别重要。传统的有监督学习方法依赖于大规模的并行数据集进行训练,但是对于COBOL到C++或C++到Python来说,这些数据根本不存在。TransCoder只依赖于仅用一种编程语言编写的源代码,而不需要源代码和目标语言中的相同代码示例。它不需要编程语言方面的专业知识,并且可以很容易地将TransCoder的方法推广到其他编程语言中。本文还创建了专门为此领域设计的新的评估指标。 TransCoder对于将遗留代码库更新为现代编程语言可能很有用,现代编程语言通常更高效且易于维护。它还展示了一个神经机器翻译技术应用的新领域。与Facebook AI以前使用神经网络解决高级数学方程式的工作一样,本文认为NMT可以帮助完成通常与翻译或模式识别任务无关的其他任务。特意为编程语言建立序列到序列模型 在自然语言中,即使在越来越依赖自动化机器翻译系统的专业翻译人员群体中,神经机器翻译的最新结果也被广泛认可。但是,由于代码翻译领域中缺少并行数据,因此它们在该方面的应用受到了限制。程序员仍然依赖于基于规则的代码转换工具,这需要专家复查和调试输出,或者手动翻译代码。TransCoder通过利用无监督机器翻译到编程语言翻译取得的成功来克服这些挑战。 本文构建了一个带有注意力机制的序列到序列(seq2seq)模型,该模型由具有转换结构的编码器和解码器组成。TransCoder使用单个共享模型,部分基于Facebook AI以前在XLM上针对所有编程语言所做的工作。本文按照Facebook AI先前的研究中详细介绍的无监督机器翻译的三个原则进行了训练:初始化,语言建模和反向翻译。本文首先利用开源GitHub项目中的源代码使用蒙版语言模型(MLM)对本文的模型进行了预训练。就像自然语言处理中的上下文一样,这种预训练会创建跨语言的嵌入:在相似上下文中使用来自不同编程语言的关键字在嵌入空间(例如catch和except)中非常接近。这些嵌入的跨语言性质来自存在于多种语言中的大量通用的标记(锚点)。锚点的示例包括C++,Java和Python通用的关键字(例如,for,while,if,try),以及源代码中出现的数学运算符,数字和英语字符串。 使用MLM进行预训练使TransCoder可以生成输入序列的高质量表示。然而,由于从未训练过解码器基于源表示对序列进行解码,因此解码器缺乏翻译能力。为了解决此问题,本文训练了该模型使用降噪自动编码(DAE)对序列进行编码和解码。DAE的工作方式类似于有监督的机器翻译算法,在该算法中,模型被训练为在给定序列存在损坏的情况下预测该序列。作为输入给解码器的第一个符号是指示输出编程语言的特殊标记。在测试时,该模型可以对Python序列进行编码,并使用C++起始符号对其进行解码以生成C++翻译器。C++翻译的质量将取决于模型的“跨语言”:如果编码器将Python函数和有效的C++翻译映射到相同的潜在表示,则解码器将成功翻译成C++。 仅预训练的跨语言模型和自动降噪就足以进行翻译。但是,这些翻译的质量往往很低,因为从未训练过该模型在测试时应该完成什么样的工作,即从一种语言翻译为另一种语言的功能。为了解决此问题,本文使用反向翻译,这是在弱监督的情况下利用单语数据的最有效方法之一。对于每种目标语言,本文使用一个模型和一个不同的开始标记。它经过训练可以从源到目标以及从目标到源并行转换。目标到源版本用于将目标序列翻译成源语言,从而产生与标记目标(GT)序列相对应的嘈杂源序列。然后以弱监督的方式训练模型,让模型可以从嘈杂的源序列中重建目标序列,并学习从源到目标的转换。直到收敛为止。 为了评估该模型,以前对源代码翻译的大多数研究都依赖于自然语言中使用的度量标准,例如BLEU分数或其他基于标记之间相对重叠的方法。但是,这些类型的指标不太适合编程语言。语法差异小的两个程序在执行代码时可能会获得很高的BLEU分数,但会产生非常不同的结果。相反,具有不同实现方式的语义等效程序将具有较低的BLEU分数。另一种度量标准是参考匹配,或与GT完全匹配的翻译百分比,但这通常会低估翻译的质量,因为它无法识别语义上等效的代码。 为了更好地衡量TransCoder和其他代码翻译技术的性能,本文创建了一个称为计算精度的新指标,该指标可评估假设函数在给定相同输入时是否生成与参考相同的输出。我们还将发布测试集以及用于计算该指标的脚本和单元测试。下面的示例显示了TransCoder如何将示例代码从Python转换为C++。我们使用以上的代码作为模型输入:TransCoder成功将Python输入函数SumOfKsubArray转换为C++。它还可以推断参数的类型,返回类型和函数的参数。该模型将Python dequeue()容器附加到C++实现dequeue <>。下面是该模型在C++中的输出:最新研究并在实际应用中提供的帮助 自动代码翻译有可能使在公司或开源项目中工作的程序员更加高效,因为他们可以更轻松地集成公司内其他团队或其他开源项目的各种代码,还可以大大减少更新用早期语言编写的代码库的工作量和成本。 反编译的进步可能会促使公司和其他机构更新到最新的语言并促进未来的创新,这可能让使用服务的人们以及机构本身受益。编程语言机器翻译的进步也可以帮助那些没有时间学习多种语言编程的人。 更广泛地说,人工智能有潜力帮助其他编程任务。例如,Facebook AI以前共享了神经代码搜索,这是一种在查询代码中使用自然语言的方法。以及Getafix,该工具可学习自动为编码错误提供建议修复。虽然TransCoder并非旨在帮助调试或提高代码质量,但它可以帮助工程师迁移旧代码库或使用以其他语言编写的外部代码。 为了促进使用深度学习进行代码翻译的研究,本文还发布了一个测试集,该测试集使其他研究人员可以使用计算精度而不是语义盲模型来评估代码翻译模型。我们期待看到其他人如何在我们与TransCoder的合作基础上继续前进,并为新的翻译任务推进自我监督学习。转载自:CSDN论坛
  • 【求助】看到JAVASDK不支持批量下载上传
    请问怎样通过内网将OBS上面的文件下载并打包,然后再通过内网打包再上传到OBS上
  • [技术干货] 多云架构下,JAVA微服务技术选型实例解析
    【摘要】 本文介绍了基于开源自建和适配云厂商开发框架两种构建多云架构的思路,以及这些思路的优缺点。微服务生态微服务生态本质上是一种微服务架构模式的实现,包括微服务开发SDK,以及微服务基础设施。目前比较成熟的 JAVA 微服务生态包括 servicecomb(华为), spring-cloud (Pivotal), dubbo(阿里), tsf(腾讯)等。gRPC、Thrift 等也用于内部服务之间的通信,但是微服务基础设施比较欠缺。核心的微服务基础设施包括:注册中心、配置中心、应用网关。此外,分布式事物管理、计划任务、调用链跟踪系统等也是微服务基础设施的组成部分。完整的微服务基础实施还包括开发使能工具,包括接口管理工具、灰度发布管理、代码生成等,这部分主要由云厂商提供,比较少开源方案。微服务生态的核心是 SDK,而 SDK 的核心是 RPC 框架,这个是不同微服务生态的本质区别。在基础设施方面,不同的微服务生态是可以相互选择的,比如 spring-cloud 生态可以采用 spring-cloud-huawei 接入servicecomb 提供的注册中心 servicecomb-service-center、配置中心 servicecomb-kie,也可以通过 spring-cloud-alibaba 接入阿里的配置中心;servicecomb 也可以通过引入扩展,使用其他的配置中心。一些基础的开发组件,比如 spring、spring boot,这些微服务开发 SDK 都支持集成。对微服务生态进行比较是一个很难的课题。下面的表格仅对一些核心功能进行比较。使能工具、核心基础设施、可选基础设施等方面,不同的微服务生态是可以相互使用的,这里的比较只针对该生态原生提供的来说,并不代表某个微服务生态缺少这块功能,该生态的开发者用不了这方面的能力。对于开源生态应该采用一个大生态的眼光来看待,每个生态的设计者也会尽可能融入其他生态,继承和复用其他生态的能力。但是在商业选型上,需要考虑技术支持等因素。对微服务生态的比较的另外一个视角就是如何构建微服务应用架构。 一般的微服务应用架构会包括应用网关、业务微服务和静态页面。静态页面的部署相对比较灵活,可以放到应用网关内部,也可以放到应用网关,还可以放到应用网关外面。其中放到网关里面的方式最灵活,比如可以通过配置网关的负载均衡策略,将请求转发到用户最近的region,也可以对部分静态页面进行访问控制。增加应用网关可以增强应用系统的弹性,能够支撑系统的持续演进(参考分析文章),同时可以结合网络基础设施,更好的实现应用系统的能力开放。比如如果接入层使用 API Gateway 挂载,可以很好的实现内部系统的能力开放和计费;使用LVS接入,只可以提高转发性能,比较适合访问量大的应用,接入网关逻辑少,应用网关可以弹性扩容;使用DNS则对于网站很有用,屏蔽用户访问的地址差异,并且可以使用DNS将请求转发到不同区域的应用网关。Servicecomb, spring-cloud 都能够很好的支持这种架构,而 dubbo 对这种架构支持的不是很好,很多 dubbo 开发者都是通过在业务服务之外增加一个接入层,使用 spring-cloud 的应用网关来搭建这个应用架构。多云微服务架构的两种方案采用开源微服务框架很多业务系统的构建,都是从选择一个开源方案开始。 一般会首先选择一个微服务开发 SDK, 然后选择其他的微服务基础设施。 对于自主研发的情况,微服务基础设施也会选择开源方案。 比如选择 ServiceComb 微服务开发 SDK 的场景,可以通过在不同的云上部署开源服务,来实现一套系统,多个云上运行。 云厂商如果存在微服务基础设施的商业版本, 可以在云上购买使用, 使用云产商提供的基础设施服务,通常可以降低自己运维的成本,并能够得到更好的性能优化和可靠性支持。另外一个开源解决方案是部分集成云产商提供的组件,尽可能多的使用云产商的基础设施。 比如选择 Spring Cloud 微服务解决方案, 可以使用 spring-cloud-huawei, spring-cloud-alibaba 等云产商提供的扩展,使用云上的基础设施。下面对开源解决方案的评估点做一个总结:1. 只需要维护一套代码和熟悉一个开发框架,多云运行。不同云的运行体验存在差异,可以部分使用云厂商的中间件。 如果其他云没有对应的中间件,需要自行安装和维护中间件。2. 微服务框架选型之前,需要考虑“基础设施”是否也开源。比如微服务基础设施最重要的中间件“配置中心”、“注册中心”和“应用网关”。开源可获得性是一套代码,多云运行的前提。适配多供应商开发框架每个云产商都存在一个主打的微服务开发框架, 使用主打微服务开发框架能够最好使用云产商提供的微服务基础设施。 为了在不同的云上, 获得最佳的微服务管理能力,需要尽可能使用对应云的主打框架。 但是维护多套代码是困难的。 适配多供应商的开发框架, 需要对核心业务做好分离,避免重复开发,然后将适配层做薄,只实现简单适配,降低开发难度。 大部分 JAVA 微服务开发框架都支持 Spring, 因此可以采用下面的设计模式,实现一套核心代码,编译成多个云产商开发框架的可执行程序的多云版本。上图是一个微服务的内部结构,一个微服务可能包含如下几个目录:* application-core* application-runtime-servicecomb* application-runtime-hsf下面对适配多供应商开发框架方案的评估点做一个总结:1. 需要做好业务抽象,并熟悉多个开源微服务开发框架,相对于开源自建方案维护成本高。2. 不需要考虑自行安装和维护基础中间件的问题,云厂商自己的微服务框架,一般针对这个框架提供了各种中间件支持,使用和接入开发成本低。3. 这种方案是优秀代码架构设计。在开源方案中,也建议做好核心业务逻辑分离和接口抽象,每个方案适配不同云厂商非微服务基础设施(比如数据库、对象存储、EI等功能)也都是需要的。转载自:华为云开发者论坛
  • [热门活动] 没错,华为云又对前端下手了!
    面对IT行业快速革新的理论与技术攻城狮朋友们需要把大量时间用于技术的学习与应用长期面对冰冷代码的攻城狮不禁要问新理论要哪里学习新技术该怎么应用可以一起成长的小伙伴在哪里针对以上问题,华为特别推出【WEB前端全栈成长计划】不玩虚的不挖坑,只为帮你解决实际问题3个月,限时全程免费参与为你构建前端全栈技能体系基础班课程已全部更新进阶班JavaScript & Ajax的深度内容正在招募,限时免费报名~                                                                                                                                             01.什么是【WEB前端全栈成长计划】0费用,3个月为你构建前端全栈技能体系,HTML/JavaScript/Node.js等web前端课程全覆盖,用华为经验帮助大家快速提升前端技能,快速向全栈工程师迈进!◎适合人群:阶段一适合:0基础想要进阶的开发者(学生/0基础开发者皆可)阶段二/三适合:想要全面完善前端技术框架,学习华为开发技术的开发者。02.课程安排时间表◎L1:前端基础入门(06/08-07/12)课程已更新完毕,报名“课程”“阶段一”可参与◎L2:迈入脚本及框架开发(07/13-08/16)javascript&ajax课程,报名见下方◎L3:全栈化进阶(08/17-09/20)待开启◎考试进阶:练习考核认证(1周)03.第二阶段课程报名全栈成长计划已经开课本公众号用户限时免费参与名额先到先得,招满即停识别下方二维码马上报名本阶段为web前端全栈新开始,如有参加过一阶段的同学需再重新报名才可获得免费学习的机会,报名课程即送300码豆,先到先得!04.活动奖品及奖励报名参与课程打卡积分活动,得到积分越高,最后累计的奖品级别越高,幸运抽奖和分享有礼等着大家!实物奖品百万码豆05.注意事项◎温馨小提示:根据自己能力报名不同阶段课程,参与每阶段考核后都会有阶段证书!◎温馨小提示:根据自己能力报名不同阶段课程,参与每阶段考核后都会有阶段证书!◎参加过一阶段学习的同学需重新报名,已在一阶段学习群的伙伴不需要再次添加新群,信息同步更新。◎一二阶段课程均可学,请详细阅读报名页面,其他要求详见各活动帖细则。另外华为JAVA全栈成长计划即将开课,想要学习JAVA课程的同学不要错过点击左下角“阅读原文”报名java课程
  • [热门活动] JAVA面试技巧,7月23日19:00-20:30免费直播,中奖名单公布~
    《JAVA面试技巧》来了,鲍老师带你跳开JAVA面试的坑,顺利通过面试直播时间:7月23日19:00-20:30直播地址: https://huawei.vhallyun.com/fe/watch/4664讲师:鲍老师-华为高级培训专家 十二年IT行业、教育行业工作经验,擅长Java后端开发,技术栈涉及Python/PHP/Android/IOS、爬虫、大数据、图像识别、机器学习等;业务领域涉及造船、汽车销售、政务、航空、电商、多品类分销等。在多个项目中任职项目经理,主要负责人。工作及研究领域涉及需求调研、项目管理、软件开发、测试、交付、运维等。期间为企业员工的软件开发、项目管理等方面能力提升提供专业的指导。 收看直播,和讲师互动即有机会获得JAVA学习助力礼品,经典JAVA书籍或芒果TV月卡。     想学习更多求职入职相关课程,快来学习毕业季-暑期成长计划课程,现在加入活动还有机会赢取5G手机哦!获奖名单:芒果TV月卡: hw10996515JAVA编程思想(第四版):HW-QGS深入理解Java虚拟机:kkwl_a12448
  • [技术干货] 【转载】从C、C++、Java到Python,编程入门到底学什么语言好?
    【转载华为云社区】最近,TIOBE更新了7月的编程语言榜单,常年霸榜的C、Java和Python依然蝉联前三位。万万没想到的是,R语言居然冲到了第八位,创下了史上最佳记录。而且后续随着业内对数据统计和挖掘需求的上涨,R语言热度颇有些势不可挡的架势然而作为程序员吃饭的工具,编程语言之间也形成了某种鄙视链,各大论坛里弥漫着剑拔弩张的气氛,众口难调。也难怪有很多初学者会有疑惑,为什么会有这么多编程语言,我到底应该学什么语言?回顾编程语言几十年来的兴衰起伏,似乎也折射了整个信息产业的变迁消亡,想要在技术的洪流里激流勇进,找准并学精一两门编程语言更加显得至关重要。编程语言的黄金时代“有人不喜欢花括号,开发了Python;有人在一个周末设计了出了JavaScript;有人因为上班太无聊,于是发明了C语言”。关于编程语言的八卦轶事很多,但归根结底,一个编程语言的诞生一定是需求的推动。从面向机器的语言、面向过程的语言到面向对象的语言,编程语言的历史也经历了由繁到简。而互联网崛起的90年代,无疑也是编程语言的黄金时代。套用维基百科的总结,“1990年代未见到有什么重大的创新,大多都是以前构想的重组或变化。”但就是这样的一个时代,却是各种编程语言大放异彩的开始。彼时最主流的编程语言是贝尔实验室两位大佬发明的C/C++语言,互联网的载体计算机的基础设施,都是用这套语言来编写的,包括Linux操作系统、数据库、编译器等等。这也奠定了C语言在IT领域的地位,只要有计算机的存在,C/C++肯定会有它们的一席之地。但后来者居上的故事也随时在发生,这里的主角是已经落幕的昔日巨头网景和Sun。1994年,网景发布了一款真正的网络浏览器Navigator,但受限于当时的技术限制,Navigator更像是一个本地展示页面,不具备任何交互功能。巧的是,Sun公司在1995年正式向市场推出他们开发的Java(即Oak语言),特点是“一次编写,到处运行”,网景看中了这个潜力股,选择与Sun结盟。当时的Java可以作为脚本嵌入到网页中实现交互功能,即我们所熟知的Java Applet。然而,网景认为Java作为网页脚本还是过于复杂,程序员Brendan Eich就在10天内,集百家之长,开发了Javascript,如今所有浏览器前端库都需要基于JavaScript实现。计算机的普及、互联网的崛起,Web应用的出现,Ruby、PHP等语言也悉数登场。如知乎作者“强哥学堂”述,“这段时间,虽然没有创造编程语言,但是由于大量企业的参与,编程语言得到了空前的发展,形成了今天的编程语言的基本形态。也使得软件开发越来越标准化,规模化。”与此同时,还有一些“小众”的编程语言,正蓄势待发中,等待着“爆红”的机会。苹果的搅局,生态很关键2010年iPhone 4问世,乔布斯用智能手机改写了之后的互联网发展轨迹。iOS和Android支撑起的智能手机市场,让移动互联网成为绝对的舞台主角。苹果开创了一个全新的生态,作为iOS的应用开发语言,始于1984年的Objective-C从籍籍无名走向声名大噪,依托各种iPhone、iPad应用程序的开发,Objective-C曾一度挺进TIOBE排行榜的Top 3。不过,苹果在2014年的WWDC上推出了新的编程语言Swift,支持编写macOS/OS X、iOS、iPadOS、watchOS和tvOS的软件应用,并在第二年宣布开源、支持Linux。自此之后,Objective-C的市场份额逐年递减,从2014年的12%下降到2016年的1%。从下图也可以看出,新语言Swift从0开始,这几年一直处于稳定增长中,今年1月也冲进了TIOBE榜单的第九位。虽然一门计算机语言从编译器、语法、基础库到在程序员的圈子中普及,并不是短时间可以一蹴而成,但苹果仍然以一己之力将Objective-C和Swift带入了编程语言的主流市场,由此可见,编程语言和一个产品的生态规模息息相关。微软和Visual Basic的关系也是如此,移动互联网时代之前,VB曾经依靠可视化的开发环境,成为最炙手可热的桌面开发工具,并一度拥有300万开发者。而且借助Windows操作系统市场优势,VB如今也一直保持着居高不下的热度(遗憾的是,微软表示不打算继续演化 Visual Basic了)。回到移动互联网时代,另一边的Android选择的是Java,随着Android阵营的越来越庞大,Java一直是TIOBE榜单上的第一,成绩最差也能拿个第二。一个编程语言的长盛不衰,除了它本身的优势之外,其生态的建设也至关重要,毕竟用的人多了,也就能自成一派,这一点在Python的流行中体现的淋漓尽致。大数据+AI时代,Python一骑绝尘当学Python要从娃娃抓起的口号开始流行时,编程语言从IT圈子进入到大众圈。大数据、AI的时代,Python可以说是一骑绝尘,从数据分析、机器学习、Web开发到爬虫开发都可以在Python的帮助下非常轻松的解决。统计分析人员可以用Python解决数据爬取和分析的问题,大学生可以用Python解决租房的问题……最关键的是,Python的学习门槛比C++,Java都要低,简洁的语法、成熟的第三方库,即使是非程序员群体,也能在短时间内速成。用于统计分析、绘图、数据挖掘的R语言也是如此,赶上了数据应用分析的潮流,自然能从众多编程语言中脱颖而出。针对今年7月榜单R语言创纪录的成绩,TIOBE的 CEO Paul Jansen 明确表示有两大趋势起着关键作用:一是商业统计语言和软件包(如 SAS、Stata 和 SPSS)的时代已经结束,大学和研究机构采用Python和R进行统计分析;二是与COVID-19相关的研究需要进行大量统计和数据挖掘,所以易于学习和使用的统计编程语言热度上升。再比如诞生于2010年,由Mozilla主导开发的Rust语言,其更加强调安全性、存储器配置、以及并发处理等特性。去年Facebook推出的区块链项目Libra,就选择了Rust语言来构建,因为它足够安全。Rust的排名也从2012年的200名开外,在最新一期TIOBE榜单上冲进了Top20。我们以互联网的崛起为分界线,可以看到各个编程语言的此消彼长,必然伴随着新的产品和技术。顺应新技术发展的编程语言,即便时隔几十年,也可以重新焕发光彩。而且随着开源社区的壮大,一门优秀的编程语言可以博采众家之长,成长为后起之秀。结语如果你想以编程语言立生,建议你先学习Java,然后是Python和C++,因为这三种编程语言,基本上可以解决我们工作中遇到的大部分问题。所以,不妨先试试华为云推出的Java开发全栈成长计划,让你0基础入门,构建Java技能体系,向全栈工程师迈进!最后,如C#之父Anders Hejlsberg曾总结:如果要我概括在未来十年编程语言会变成什么样,首先,我认为编程语言应该变得更加“声明式”,我们需要设法为语言引入一些如元编程,函数式编程的能力,同时可能也要寻找让用户有办法扩展语法,使他们可以构造领域特定语言等等。不过总体来说我想强调的是,对于编程语言,新的范式则是“多范式”编程语言。本文部分内容有参考以下文章:1、《IT行业激荡30年->编程语言变迁史》https://zhuanlan.zhihu.com/p/1068080452、《计算机和编程语言的发展历史》https://blog.csdn.net/abc6368765/article/details/83990756
总条数:2301 到第 页
上滑加载中