《深入理解 Scala》第一章 — Scala 一种混合式编程语言

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 的一个关键特性,它有能力判断一个优化是否事实上没有提升性能,然后取消该优化,改用其他优化。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.