Scala 的预期目标是将面向对象、函数式编程和强大的类型系统结合起来,同时仍然要能写出优雅、简洁的代码。
Scala 视图将以下三组对立的思想融合到一种语言中:
- 函数式编程和面向对象编程
- 富有表达力的语法和静态类型
- 高级的语言特性同事保持与 Java 的高度集成
面向对象编程
面向对象编程是一种自顶向下的程序设计方法,将代码以名词(对象)做切割,每个对象有某种形式的标识符(self/this)、行为(方法)和状态(成员变量)。识别出名词并且定义出它们的行为后,再定义出名词之间的交互。实现交互时,必须将这些交互放在其中一个对象中(而不能独立存在)。现代面向对象设计倾向于定义出”服务类“,将操作多个领域对象的方法集合放在里面。这些服务类虽然也是对象,但通常不具有独立状态,也没有与它们所操作的对象无关的独立行为。
函数式编程
函数式编程方法通过组合和应用函数来构造软件。函数式编程通常倾向于将软件分解为其需要执行的行为或操作,而且通常采用自底向上的方法。函数式编程:对不可变性的强调有助于编写并发程序,视图将副作用推迟到尽可能晚,提供了非常强大的对事物进行抽象和组合的能力。消除副作用使得对程序进行推理(reasoning)变得容易。
对比:
面向对象编程 | 函数式编程 |
对象的组合(名词) | 函数的组合(动词) |
封装有状态的交互 | 推迟副作用 |
迭代算法 | 递归算法 |
命令流 | 延迟计算 |
… | 模式匹配 |
… |
协变,Convariance,+T or ? extends T
:类型可以强制转换为子孙类;
逆变,Contravariance, -T or ? super T
:类型可以强制转换为祖先类;
不变,Invariance :类型完全不能被强制转换。
函数式编程的精髓在于尽可能地推迟副作用。
Scala 做了以下几个设计决策来提高代码表达力:
- 把类型标注(type annotation)换到变量右边;
- 类型推断;
- 可扩展的语法;
- 用户自定义的隐式转换。
操作符(operation notation)是 Scala 的一个能力,可以把方法当作操作符。无参数的方法可以用作后缀操作符,只有一个参数的方法可以当作中缀操作符;方法名的最后一个字符如果是冒号 ”:“,则方法的调用方向反转。
在定义匿名函数时(又称 lambda),Scala 提供了占位符语法。可以用 “_” 关键字作为函数参数的占位符。如果使用多个占位符,每个相应位置的占位符对应于相应位置的参数。
用好隐式转换是操纵 Scala 类型系统的关键。隐式转换的基础应用场景是按需自动地把一种类型转换为另一种,但它也可以用于有限形式的编译时元编程。要使用隐式转换必须把它关联到某个作用域,可以通过伴生对象或明确导入来做关联。
HotSpot
HotSpot 编译器的优化技术:
- 方法内联(method inlining):HotSpot 能够判断是否能在调用点直接把被调用的小方法的内容嵌入进去。
- 栈替换(On Stack Replacement):指 HotSpot 能够判断一个变量应该放在栈里还是堆里。
- 逃逸分析(Escape Analysis):HotSpot 分析各种东西是否逸出了特定作用于,这项技术主要用来在同步方法调用限定于某个作用域时减少锁开销。
- 动态去优化(Dynamic De-optimization):是 HotSpot 的一个关键特性,它有能力判断一个优化是否事实上没有提升性能,然后取消该优化,改用其他优化。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。