Scala语言会取代Java的吗?-程序员宅基地

技术标签: scala  

  曾经有人问Java的创始人高斯林这样一个问题,“除了Java语言以外,您现在还使用JVM平台上的哪种编程语言?”他毫不犹豫的说是Scala。

 

  Scala到底是什么?在目前众多的JVM语言当中,Scala无疑是最引人注意的语言之一。Scala是一个静态语言,更适合大型工程项目,Scala直接编译成Java字节码,性能接近Java。Scala是一个多范式的语言,你可以混合使用函数式和面向对象编程,混合使用可变类和不变类,混合使用Actor和传统的Java并发库。

 

  短短一个月的时间,Scala于本月冲进了TIOBE的前五十名。一个 Twitter 的开发人员说过,Scala 将会成为现代 Web2.0 的发起语言。LinkedIn 也用这种语言。同样许多其他大的公司如 Sony Picture, EDF, SAP 也开始使用这种语言。为什么Scala发展这么迅猛,可以获得如此热烈的社区支持。

 

  曾冠东还表示,Scala不是Java的杀手,它无法取代Java的地位,也突破不了JVM的限制、Java实现不了的功能它也实现不了。我们可以将Scala形象的理解成大量语法糖的Java。

 

  Scala 开发团队发布了最新的2.9.2稳定版本,Scala 语言的特性有许多,例如高阶函数和对象、抽象类型绑定,actor 使得函数在 Scala 中能是一个子类成为可能,Scala 中的设计模式使得面向对象和函数编程无缝结合。Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。它已经成功运用在电信行业。Spark 是一种可扩展的数据分析平台,它整合了内存计算的基元,因此,相对于 Hadoop 的集群存储方法,它在性能方面更具优势。Spark 是在 Scala 语言中实现的,并且利用了该语言,为数据处理提供了独一无二的环境。

 

Scala 编译器可以生成字节码,直接运行在使用JVM上。该语言(它实际上代表了可扩展语言)被定义为可直接集成到语言中的简单扩展。

 

  Scala作为一门静态语言,它的主要特性有哪些?

 

  · Scala是面向对象的

  Scala是一个纯面向对象语言,在某种意义上来讲所有数值都是对象。对象的类型和行为是由class和trait来描述的。Class的抽象可由子类化和一种灵活的基于mixin的组合机制(它可作为多重继承的简单替代方案)来扩展。

 

  · Scala是函数式的

  Scala还是一个函数式语言,在某种意义上来讲所有函数都是数值。Scala为定义匿名函数提供了一种轻量级的语法,它支持高阶(higher-order)函数、允许函数嵌套、支持局部套用(currying)。Scala的case类及其内置支持的模式匹配模型代数类型在许多函数式编程语言中都被使用。

 

  · Scala是静态类型的

  Scala配备了一套富有表现力的类型系统,该抽象概念以一种安全的和一致的方式被使用。

 

  · Scala是可扩展的

  Scala的设计承认了实践事实,领域特定应用开发通常需要领域特定语言扩展。Scala提供了一个独特的语言组合机制,这可以更加容易地以类库的形式增加新的语言结构:任何方式可以被用作中缀(infix)或后缀(postfix)操作符闭包按照所期望的类型(目标类型)自动地被构造两者结合使用可方便地定义新语句,无需扩展语法,也无需使用类似宏的元编程工具。

 

  · Scala可与Java和.NET进行互操作

  Scala设计时就考虑了与流行编程环境良好交互,如Java 2运行时环境(JRE)和 .NET框架(CLR)。特别是与主流面向对象语言,如Java和C#尽量无缝交互。Scala有像Java和C#一样的编译模型(独立编译,动态装载类),允许访问成千上万的高质量类库。

 

  在并发性方面,与 Scala 在 .NET 领域中的姐妹语言 F# 相似,Scala 是针对 “并发性问题” 的解决方案之一,让开发人员能够更加轻松地专注于问题的实质,而不用考虑并发编程的低级细节。Actor 编程模式让高度并行应用程序的开发更加简单。Scala把Erlang风格的基于actor的并发带进了JVM。我们可以利用Scala的actor模型在JVM上设计具伸缩性的并发应用程序,以自动获得多核心处理器带来的优势,而不必依照复杂的Java线程模型来编写程序。

 

Scala 为并发性提供了两种级别的支持,这与其他与 Java 相关的主题极为类似:

 

  首先,对底层库的完全访问(比如说 java.util.concurrent)以及对 “传统” Java 并发性语义的支持(比如说监控程序和wait()/notifyAll())。其次,这些基本机制上面有一个抽象层 Scala 提供了在稳定的高性能平台(Java 虚拟机)上生成的能力同时也是一门敏捷性语言。这一类型的语言也有其他的选择,例如 Jython, JRuby, Groovy 和 Clojure, 但是这些都是运行在 JVM 上的动态类型语言。Open Class 的效果让大家会觉得Scala是动态语言,但它是选择隐式转换来实现的,这也正好证明了Scala是静态语言。隐式转换(Implicit conversion)使 Scala 具有类型安全性,正如扩展方法(extension method)之于 C#,开放类(open class)之于 ruby。即:向未曾定义的类型添加方法(如字符串、列表、整数)。这是使得 Scala 符合 DSL(特定领域语言)模型的特性之一。

 

  Scala结合了面向对象和函数编程的优势,函数编程的一个好处就是你能够像运用一个数据那样运用函数,可以用来定义真正高层级的库,或者去定义新的领域特殊语言(DSL)。

 

  在谈及Java与Scala的对比时,曾冠东表示,Scala能调用绝大部分的Java,而Java调用Scala独有的东西会比较难。Java 拥有非常强的概念规范,因此任何一个 Java 程序之间具有非常多的相似之处,并且这样能够方便的进行程序员交替。但是 Scala 并没有这样的统一性,因为这是一门很有表现力的语言。现场曾冠东为我们演示了实际案例,如下图所示:

 

  正所谓,金无足赤,人无完人。Scala对二进制不兼容,语法也越来越复杂,不能突破Bytecode的限制、编译速度有所缓慢。当它被广泛用于单元测试、开发工具、Socket开发、以及面对多核挑战的并发应用。总而言之,Scala是一种函数式面向对象语言,它融汇了许多前所未有的特性,而同时又运行于JVM之上。正如JRuby 创建者之一Charles Nutter 所宣称的那样Scala就是 Java 王位的合法继承人。随着开发者对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为广大软件工程师手上一件必不可少的工具。更多精彩内容,请关注专题:http://www.it168.com/remen/qcon/。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dengkane/article/details/84714512

智能推荐

Yolov8如何在训练意外中断后接续训练_yolov8 resume-程序员宅基地

文章浏览阅读8k次,点赞12次,收藏82次。在训练YOLOv8的时候,因为开太多其他程序,导致在100多次的时候崩溃,查询网上相关知识如何接着训练,在yolo5中把resume改成True就可以。在yolov8中也这样尝试,将ultralytics/yolo/cfg/default.yaml中的resume改成True发现并没有作用,感觉yolov8代码还是有很多bug。_yolov8 resume

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path_caused by: javax.net.ssl.sslhandshakeexception: su-程序员宅基地

文章浏览阅读440次。问题描述presto-examples-1.0-SNAPSHOT-jar-with-dependencies.jar在集群内节点运行时正常,但在集群外节点运行PrestoJDBCExample连接开启Kerberos认证的集群缺少证书,报错如下:java.sql.SQLException: Error executing query atcom.facebook.presto.jdbc.PrestoStatement.internalExecute(PrestoStatement.ja_caused by: javax.net.ssl.sslhandshakeexception: sun.security.validator.valid

在Ubuntu16.04上安装tvm踩坑-程序员宅基地

文章浏览阅读1.1k次。服务器的各种BUG

linux man使用方法和centos安装中文man包- 转载-程序员宅基地

文章浏览阅读147次。什么是man手册 首先,man是manual的简称,中文说法可以是手册。在Linux世界中,许多新手请教某条命令的用法时, 好多不耐心的老手通常会用一条命令来回答这位无助的新手,而这条命令通常就是man开头。无助的新手敲上这条命令一看究竟,在终端上顿时显示出来了一屏幕的英文,老手的意思是,自己看看手册吗,可是看手册也是有学问的,无助的新手甚至不知道怎么退出..._man 中文包

ping 命令:指定源IP_ping指定源ip目的ip-程序员宅基地

文章浏览阅读1.9w次,点赞7次,收藏20次。Windows:用法: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS] [-r count] [-s count] [[-j host-list] | [-k host-list]] [-w timeout] [-R] [-S srcaddr] [-c compartment] [-p] [-4] [-6] target_name选项: -t _ping指定源ip目的ip

随便推点

设计模式练习(11)——代理模式_5. 在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为-程序员宅基地

文章浏览阅读4.5k次,点赞3次,收藏19次。代理模式 一、题目:在某应用软件中,需要记录业务方法的调用日期,在不修改现有业务类的基础上,为每一个类提供一个日记记录代理类,在代理类中输出日志,如在业务方法Mehtod()的调用之前,输出“Method方法被调用,调用时间2016.11.18 11:11:11”,调用之后没有抛出异常则输出“Mehtod方法调用成功”,否则输出“Mehtod方法调用失败”,在代理类中调用真实业务类的业务方法,使用代_5. 在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为

shardingjdbc 5.0.0 oracle数据库insert Sql无效_shardingjdbc5.0对oracle的支持-程序员宅基地

文章浏览阅读743次。在shardingjdbc中解析oracle sql时区分了大小写,特别是关键字,小写时会无法匹配。_shardingjdbc5.0对oracle的支持

[渝粤教育] 中国地质大学 机械电气安全技术 复习题-程序员宅基地

文章浏览阅读5.3k次。《机械电器安全》模拟题一.单选题1.成年男性的平均摆脱电流约为()毫安.A.160B.16C.1.6D.0.162.保护接地电阻不宜大于().A.2Ω;B.4Ω;C.8Ω;D.10Ω;3.测量相-零线回路阻抗是为了检验()是否符合规定的速断要求.A.保护接地系统B.保护接零系统C.工作接地系统D.重复接地系统4.爆炸危险物质在()遇到火源会引起爆炸.A.低于爆炸下限B.高于爆炸上限C.爆炸上限与爆炸下限之间5.在不妨碍机器使用功能前提下机器的外形设计应尽量避免尖棱利

Mybatis遇到的形形色色的错误_mybatis unresolved untyped expression-程序员宅基地

文章浏览阅读210次。org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)外在表现上,target文件没有加载xml,这是因为我把Dao类放在了java文件夹下的dao/front中,而其对应的xml只是放在resources的front中,并不一致,因此造成了这个错误这就说明Myabtis的映射配置文件的命名空间、类、变量名称、文件夹位置都要与Dao类完全一直才可以..._mybatis unresolved untyped expression

vue3 下载router之后,路由未生效及控制台警告问题_vue3导航栏直接访问router没生效-程序员宅基地

文章浏览阅读1.1k次。在控制台页面会报出警告" Failed to resolve component: router-link"无法识别router-linkimport { createApp } from 'vue'import App from './App.vue'import router from "./router/index"; //引入routerimport './index.css'// 挂载 路由const app = createApp(App)app.use(router) app._vue3导航栏直接访问router没生效

java 动态编译-程序员宅基地

文章浏览阅读105次。在Sun JDK 1.2及后续版本中,包含了一组可在程序运行时刻编译和执行Java代码的API。这些API被包含在tools.jar类库中。这个功能允许Java程序在运行时动态编译、执行小的代码块,在有些情况下这个功能会让Java应用程序的架构更加灵活、开放。 本文假定读者已经在计算机中安装并配置好了Sun JDK 1.2或更高的版本,并对javac编译器命令有所了解。在Java程..._java 编译动态指定主类

推荐文章

热门文章

相关标签