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

第1章 Scala——一种混合式编程语言
Scala是一种将其他编程语言中的多种技巧融合为一的语言。Scala尝试跨越多种不同类型的语言,给开发者提供面向对象编程、函数式编程、富有表达力的语法、静态强类型和丰富的泛型等特性,而且全部架设于Java虚拟机之上。因此开发者使用Scala时可以继续使用原本熟悉的某种编程特性,但要发挥Scala的强大能力则需要结合使用这些有时候相互抵触的概念和特性,建立一种平衡的和谐。Scala对开发者的真正解放之处在于让开发者可以随意使用最适合手头上的问题的编程范式。如果当前的任务更适合用命令式的设计实现,没什么规定禁止你写命令式的代码,如果函数式编程和不可变性(immutability)更符合需要,那程序员也可以尽管用。更重要的是,面对有多种不同需求的问题领域(problem domain),你可以在一个解决方案的不同部分采用不同的编程方法。

1.1 Scala的设计哲学
深入理解Scala
为了理解Scala的哲学,我们需要理解产生Scala的环境:Java生态圈Java(TM)语言在1995年左右进入计算机科学领域,产生了巨大的影响。Java和运行Java的虚拟机开始慢慢地变革了我们的编程方法。在那时候,C++正如日中天,开发者正在从纯C风格的编程转而开始学习如何有效地使用面向对象编程方法。尽管C++有很多的优点,但它也有一些痛点,比如难以分发库(distributing libraries)以及其面向对象实现的复杂度。
Java语言通过提供限制了部分能力的面向对象特性和使用Java虚拟机,同时解决了这两个痛点。Java虚拟机(JVM)允许代码在一个平台上编写和编译后,几乎不费多大劲就能分发到其他的平台上。尽管跨平台问题并没有就此消失,但是跨平台编程的成本极大地降低了。
随着时间的推移,JVM的执行效率越来越高,同时Java社区不断成长。HotSpot(TM)优化技术被发明出来,这样就可以先探测运行环境再进行针对性的代码优化。虽然这使得JVM启动速度变慢,但是之后的运行时性能则变得很适合于运行服务器之类的应用。尽管最初并非为企业服务器领域设计的,JVM开始在此领域大行其道。于是人们开始尝试简化企业服务器应用开发,Enterprise Java Beans(TM)和较新的Spring Application Framework(TM)出现,帮助程序员更好地利用JVM的能力。Java社区发生了爆炸式的成长,创造出成百万的易于使用的库。“只要你能想到的,基本都能找到Java库”成为一个职场口号。Java语言持续地缓慢进化,努力维持住其社区。
与此同时,部分开发者开始延展他们的羽翼,触及了Java本身设计上的局限之处。Java简化了一些(编程元素),而社区中的部分成员需要增加一些复杂的,但是可控的元素。第二波创造JVM语言的浪潮掀起并持续至今。Groovy、JRuby、Clojure和Scala等语言开始将Java程序员带入一个新时代。我们不再局限于一种语言,而是可以有多种选择,每一种语言都有不同的优点和弱点。Scala是其中较为流行的一种。
Scala语言创造者Martin Ordersky是javac编译器的作者,也是他将泛型引入Java语言中。Scala语言衍生自Funnel语言。Funnel语言尝试将函数式编程和Petri网结合起来,而Scala的预期目标则是将面向对象、函数式编程和强大的类型系统结合起来,同时仍然要能写出优雅、简洁的代码。将以上多种概念混合的目的是创造出一种既能让程序员真正用起来,同时又能用来研究新的编程范式的语言。事实上它取得了巨大的成功—它作为一种可行的有竞争力的语言已经开始被产业界采用。
要想掌握Scala,你需要理解多种混合在一起的概念。Scala试图将以下三组对立的思想融合到一种语言中。
• 函数式编程和面向对象编程。
• 富有表达力的语法和静态类型。
• 高级的语言特性同时保持与Java的高度集成。
我们来看一下这些特性是如何融合在一起的。先从函数式编程和面向对象编程概念开始。

时间: 2024-10-25 14:03:37

《深入理解Scala》——第1章,第1.1节Scala一种混合式编程语言的相关文章

Scala入门到精通——第二十六节 Scala并发编程基础

作者:摇摆少年梦 视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 Scala并发编程简介 Scala Actor并发编程模型 react模型 Actor的几种状态 Actor深入使用解析 1. Scala并发编程简介 2003 年,Herb Sutter 在他的文章 "The Free Lunch Is Over" 中揭露了行业中最不可告人的一个小秘密,他明确论证了处理器在速度上的发展已经走到了尽头,并且将由全新的单芯片上的并行 &quo

Scala入门到精通——第三十节 Scala脚本编程与结束语

本节主要内容 REPL命令行高级使用 使用Scala进行Linux脚本编程 结束语 1. REPL命令行高级使用 在使用REPL命令行时,有时候我们需要粘贴的代码比较大,而普通的粘贴可能会些一些问题,比如中文粘贴会出现乱码.多行代码粘贴时会出错,此时需要用到REPL的高级功能.在日常开发过程中,我们粘贴多行代码的时候会遇到下列问题: //本意是要粘贴下面两行代码 class Person(val name:String,val age:Int) val p=new Person("摇摆少年梦&q

Scala入门到精通——第二十九节 Scala数据库编程

本节主要内容 Scala Maven工程的创建 Scala JDBC方式访问MySQL Slick简介 Slick数据库编程实战 SQL与Slick相互转换 本课程在多数内容是在官方教程上修改而来的,官方给的例子是H2数据库上的,经过本人改造,用在MySQL数据库上,官方教程地址:http://slick.typesafe.com/doc/2.1.0/sql-to-slick.html 1. Scala Maven工程的创建 本节的工程项目采用的是Maven Project,在POM.xml文件

《快学Scala》第二章 控制结构和函数

本文转自博客园xingoo的博客,原文链接:<快学Scala>第二章 控制结构和函数,如需转载请自行联系原博主.

《Scala机器学习》一一1.5 使用Scala和Spark的Notebook工作

1.5 使用Scala和Spark的Notebook工作通常,这五种数字汇总方式不足以对数据形成初步认识.描述性统计(descriptive statistics)的术语非常通用,并且可以采用非常复杂的方法来描述数据.分位数和帕雷托图(Pareto chart)都是描述性统计的例子,当分析一个以上的属性时,相关性也是.在大多数情况下都能查阅到这些数据汇总的方法,但通过具体的计算来理解这些方法也很重要.Scala或者Spark Notebook(https://github.com/Bridgew

Scala入门到精通——第二十四节 高级类型 (三)

作者:摆摆少年梦 视频地址:http://blog.csdn.net/wsscy2004/article/details/38440247 本节主要内容 Type Specialization Manifest.TypeTag.ClassTag Scala类型系统总结 在scala中,类(class)与类型(type)是两个不一样的概念.我们知道类是对同一类型数据的抽象,而类型则更具体.比如定义class List[T] {}, 可以有List[Int] 和 List[String]等具体类型,

Scala入门到精通——第二十五节 提取器(Extractor)

作者:摇摆少年梦 视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 apply与unapply方法 零变量或变量的模式匹配 提取器与序列模式 scala中的占位符使用总结 1. apply与unapply方法 apply方法我们已经非常熟悉了,它帮助我们无需new操作就可以创建对象,而unapply方法则用于析构出对象,在模式匹配中特别提到,如果一个类要能够应用于模式匹配当中,必须将类声明为case class,因为一旦被定义为case class,

Scala入门到精通—— 第二节Scala基本类型及操作、程序控制结构

本节主要内容 Scala基本类型 基本类型操作 Scala程序控制结构 Scala基本类型 Scala中的基本数据类型如下图: (来源:Programming in Scala) 从上表中可以看出,Scala的基本数据类型与Java中的基本数据类型是一一对应的,不同的是Scala的基本数据类型头字母必须大写,本节以Int.Long.String.Char.Double及Float类型为例介绍Scala的基本类型定义 整数类型变量定义: //16进制定义法 scala> val x=0x29 x:

Scala入门到精通——第十六节 泛型与注解

本节主要内容 泛型(Generic Type)简介 注解(Annotation)简介 注解常用场景 1. 泛型(Generic Type)简介 泛型用于指定方法或类可以接受任意类型参数,参数在实际使用时才被确定,泛型可以有效地增强程序的适用性,使用泛型可以使得类或方法具有更强的通用性.泛型的典型应用场景是集合及集合中的方法参数,可以说同java一样,scala中泛型无处不在,具体可以查看scala的api 1 泛型类 //单个泛型参数的使用情况 class Person[T](var name: