《深入理解Scala》——第1章,第1.4节与JVM的无缝集成

简介:

本节书摘来自异步社区《深入理解Scala》一书中的第1章,第1.4节与JVM的无缝集成,作者[美]Josh Suereth,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.4 与JVM的无缝集成
深入理解Scala
Scala的吸引力之一在于它与Java和JVM的无缝集成。Scala与Java有很强的兼容性,比如说Java类可以直接映射为Scala类。这种紧密联系使Java到Scala的迁移相当简单,但在使用Scala的一些高级特性时还是需要小心的,Scala有些高级特性是Java里没有的。在Scala语言设计时已经小心地考虑了与Java无缝交互的问题,用Java写的库,大部分可以直接照搬(as-is)到Scala里。

1.4.1 Scala调用Java
从Scala里调用Java库是透明的,因为Java惯用法直接对应到Scala惯用法。Java类变成Scala类,Java接口变成Scala抽象特质(trait),Java静态成员被加入Scala伪对象(pseudo Scala object)。以上结合Scala的包导入机制和方法访问机制,使Java库感觉就像原生Scala库一样。虽然有过度简化之嫌,但一般情况下是直接就能用。举例来说,我们有个Java类,它有构造器,有一个成员方法和一个静态辅助方法。


78a3ee4862f177867fdcbce67e2088c1b8736e47

现在我们在Scala里用这个Java类。


e8d49682d2f2defb8b811063361464833f78ee12

这种映射非常自然,使用Java类库成为用Scala做开发时很自然的事。除了有这种紧密集成,你通常还能找到Java库的瘦Scala包装(thin Scala wrapper),提供一些Java API无法提供的高级特性。尝试在Java中使用Scala库时,这些特性就变得很凸显。

1.4.2 Java调用Scala
Scala尝试以最简单的方式把其特性映射到Java。大部分Scala特性可以一对一地简单映射为Java特性,比如类、抽象类、方法等。Scala有些相当高级的特性就难以简单的映射了,包括对象、一等函数和隐式转换等。
Scala对象映射到Java
虽然Java的静态(statics)映射为Scala对象,但Scala对象实际上是个单例类(singleton)的实例,在编译时此单例类命名为对象名后加个$符号。这个单例类里有个Module$静态成员,指向其唯一实例。Scala还提供了转发静态方法的能力,这些静态方法位于伴生类里(一个与object同名的类)。虽然Scala本身并没有使用静态方法,但是它们给从Java里调用Scala提供了便利的语法。


5ee433db2f36d6a6f3dc68f5f891adc99f1942ca

Scala函数映射到Java
Scala鼓励使用作为对象的函数(function as object),或称一等函数。到Java1.6为止,Java语言(和JVM虚拟机)都还没有这样的概念。因此Scala创造了函数特质符号(notion of Function traits),一共有23个特质代表0到22个参数的函数。当编译器碰到需要把方法当做函数传递的场景时,就构造一个(参数数量)合适的特质的匿名子类。由于特质无法映射到Java,从Java中传递一等函数到Scala也就很难实现,但也不是完全没办法。


e9a78500f51418d0ed466e897b3fcffd817adc8c

我们在Scala里构造了一个抽象类,这样Java实现起来就比function特质要容易。虽然这稍微简化了Java端的实现,但还是没百分百地简化问题。Java类型系统和Scala对类型的编码中间还是存在不匹配,我们还是需要在调用Scala时对函数类型做强制转换。


a5fc1c4347758a1594b220ec9254d1e8d60386a8

所以在组合使用Scala和Java时,使用一等函数和更函数式的编程方法是可能的。但是还存在其他的手段来达到这个目的。这方面更详细的讨论以及其他Java/Scala交互相关的问题请见第10章。如你所见,Scala可以很好地集成现有的Java程序,也可以和Java代码一起使用。Java/Scala交互并非在JVM上跑Scala的唯一好处,JVM本身也带来了巨大的好处。

1.4.3 JVM的优越性
前文曾经提过,Java的很多好处是JVM提供的。通过字节码,可以几乎原封不动地把库分发到很多不同的平台。JVM在很多平台上经过仔细的测试,而且经过了大规模的企业部署。不仅测试完善,还在Java平台的性能方面投入了极大关注。HotSpot编译器能在运行时对代码进行各种优化。用户可以简单地升级JVM,然后立刻体验到性能提升,而无需打补丁或重编译。
HOTSPOT-ING
在JVM上运行Scala的首要好处是HotSpot运行时优化器。它会对程序进行运行时分析,自动对JVM字节码进行调优。Scala运行于JVM上,自然就免费得到了这些优化。JVM每次发布都提升了HotSpot编译器,也就连带着提升了Scala的性能。HotSpot编译器使用了多种技术,包括以下这些。
• 方法内联(Method inlining)。
• 栈替换(On Stack Replacement)。
• 逃逸分析(Escape Analysis)。
• 动态去优化(Dynamic De-optimization)。
方法内联是指HotSpot能够判断是否能在调用点直接把被调的小方法的内容嵌入进去。这是C++里我很喜欢的一项技术,而HotSpot能够动态判断这样做是否对性能有优化。栈替换指HotSpot能够判断一个变量应该放在栈(Stack)里还是堆(Heap)里。我记得用C++的时候一个大问题就是在声明变量的时候应该把它放在栈里还是堆里。现在HotSpot可以为我回答这个问题。逃逸分析是指HotSpot分析判断各种东西是否逸出(escape)了特定作用域。这项技术主要用来在同步方法调用限定于某个作用域时减少锁开销,但也可以用于其他情况。动态去优化是HotSpot的一个关键特性,它有能力判断一个优化是否事实上没有提升性能,然后取消该优化,改用其他优化。以上特性的组合构成了很有吸引力的图景,这就是为什么各种新/旧语言(比如Ruby)都很渴望在JVM上运行。

相关文章
|
2天前
|
数据采集 Java Scala
淘宝图片爬虫:Scala与Curl的高效集成
淘宝图片爬虫:Scala与Curl的高效集成
|
5月前
|
数据采集 Web App开发 XML
爬虫进阶:Selenium与Ajax的无缝集成
爬虫进阶:Selenium与Ajax的无缝集成
|
5月前
|
人工智能 并行计算 语音技术
fasterWhisper和MoneyPrinterPlus无缝集成
fasterWhisper是一款优秀的语音识别工具,现在它可以和MoneyPrinterPlus无缝集成了。
fasterWhisper和MoneyPrinterPlus无缝集成
|
6月前
|
人工智能 移动开发 IDE
安利几款与钉钉平台无缝集成打通账号认证的企业文档管理系统
钉钉是很多中小企业都爱用的产品,开通账号就能直接使用了,应用生态非常丰富,尤其是AI技术的应用,走在行业前列。但仍有很多企业对于全面拥抱SaaS服务充满了顾虑,尤其在内部资料的管理这块,即使钉钉在线文档已经提供了非常优秀的协作体验,不少客户仍更偏爱私有部署在局域网里面的企业文档管理系统。那么能将企业内部部署的文档管理系统集成到钉钉平台上面,和钉钉文档并行使用呢?市面上又有哪些企业文档管理系统软件支持与钉钉的集成呢?这也是很多企业客户的疑问。
安利几款与钉钉平台无缝集成打通账号认证的企业文档管理系统
|
5月前
|
数据采集 存储 NoSQL
Redis 与 Scrapy:无缝集成的分布式爬虫技术
Redis 与 Scrapy:无缝集成的分布式爬虫技术
|
5月前
|
供应链 Oracle 中间件
ERP系统与电子商务集成:实现无缝业务流程
【7月更文挑战第29天】 ERP系统与电子商务集成:实现无缝业务流程
190 0
|
6月前
|
Java API Scala
Java一分钟之Scala与Java集成
【6月更文挑战第12天】本文探讨了Scala与Java的集成实践,强调两者在包导入、类型推断和重载方法解析上的差异。为避免问题,建议Scala中明确导入、显式标注类型,并了解重载规则。示例展示了如何在Scala中调用Java静态方法。另一方面,Java调用Scala时需注意Scala特性的不可见性、命名约定和伴生对象。为保持兼容性,应遵循Java友好原则,使用Java兼容命名,并暴露静态方法接口。通过理解这些问题和采取相应措施,可实现高效的跨语言工作。
93 2
|
5月前
|
传感器 算法 机器人
ROS for LabVIEW:实现LabVIEW与ROS的无缝集成
ROS for LabVIEW:实现LabVIEW与ROS的无缝集成
93 0
|
5月前
|
消息中间件 Java Spring
实现Spring Boot与RabbitMQ消息中间件的无缝集成
实现Spring Boot与RabbitMQ消息中间件的无缝集成
|
6月前
|
消息中间件 Java Spring
实现Spring Boot与RabbitMQ消息中间件的无缝集成
实现Spring Boot与RabbitMQ消息中间件的无缝集成