Scala与Clojure函数式编程模式:Java虚拟机高效编程 PDF 完整版

  • 更新时间:
  • 2927人关注
  • 点击下载

给大家带来的一篇关于Java虚拟机相关的电子书资源,介绍了关于Java虚拟机、函数式编程、Clojure、Scala方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小34 MB,贝维拉夸林编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:9.8分

资源详情相关推荐
Scala与Clojure函数式编程模式:Java虚拟机高效编程
  • 出版社:人民邮电出版社
  • 作者:贝维拉夸林
  • 大小:34 MB
  • 类别:Java虚拟机
  • 热度:824
  • Java虚拟机精讲
  • 深入解析Java虚拟机HotSpot
  • 深入Java虚拟机:JVM G1GC的算法与实现
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)
  • Scala与Clojure函数式编程模式:Java虚拟机高效编程

    Scala与Clojure函数式编程模式:Java虚拟机高效编程封面

    读者评价

    发现clojure要比scala简洁,拖着一个静态类型系统就是麻烦。有好多限制,感觉静态类型的代价太大了。
    看过一遍第四章,大多例子很简单,也有启发性。第三章需要先熟练设计模式,因为书中很少解释模式的原型和使用场景。
    还不错,讲得比较浅,算是扫盲。从oo的角度出发还是值得一看,一天就扫完了。最大的收获就是闭包与函数生成器
    看这本书之前需要对面向对象的设计模式有所了解,书主要是为面向对象的人了解函数式用的。但如何转变思维,作者并没有写太深。不过作者在字里行间也穿插着提供了一些个人的经验。
    对于学过scala 的人来说,此书就略显冗余。不过结合各个编程模式,让新手熟悉scala 和 clojure 还不错。clojure 也有其独特之处,还是值得学习。

    内容介绍

    StackOverflow刚刚发布了2015开发者调查,最受程序员喜爱的开发语言中,Clojure和Scala分别位列第五和第六。排名第一的是Swift,而Swift相比原先的Objective-C最重要的优点之一,就是对函数式编程提供了更好的支持。同时,新一代分布式计算系统Spark不仅在实现中选择了Scala,其提供的首选编程语言也是Scala。
    所有迹象都显示,诞生50多年后,函数式编程却焕发了青春,越来越受到关注和青睐,从边缘地带步入了主流,除了Scala和Clojure这些新生函数式编程语言大行其道之外,Java等老牌面向对象的编程语言也开始支持匿名函数。函数式编程能简化开发过程,尤其是大型知识管理系统应用程序从中受益良多。
    本书向读者展示了如何采用函数式方案来替代或简化面向对象编程中使用的诸多通用模式,同时还介绍了一些在函数式世界中广泛使用的模式。如果你是一名Java程序员,希望了解函数式编程能为你的工作效率带来多大的提升,或者你是一名刚刚开始使用Scala和Clojure的新手,尚不能玩转函数式的问题解决方案,那么本书就是为你而准备的。

    目录

    • 第1章 模式和函数式编程  1
    • 1.1 什么是函数式编程  2
    • 1.2 模式词汇表  4
    • 第2章 TinyWeb:让模式协同工作  7
    • 2.1 TinyWeb简介  7
    • 2.2 采用Java来编写TinyWeb  7
    • 2.3 采用Scala来编写TinyWeb   17
    • 2.4 采用Clojure来编写TinyWeb  25
    • 第3章 替代面向对象模式  35
    • 简介  35
    • 模式1 替代函数式接口  35
    • 模式2 替代承载状态的函数式接口  42
    • 模式3 替代命令模式  48
    • 模式4 替代生成器模式来获得不可变对象  55
    • 模式5 替代迭代器模式  64
    • 模式6 替代模板方法模式  73
    • 模式7 替代策略模式  81
    • 模式8 替代空对象  87
    • 模式9 替代装饰器模式  95
    • 模式10 替代访问者模式  99
    • 模式11 替代依赖注入  113
    • 第4章 函数式模式  121
    • 简介  121
    • 模式12 尾递归模式  121
    • 模式13 相互递归模式  128
    • 模式14 Filter-Map-Reduce模式  136
    • 模式15 操作链模式  139
    • 模式16 函数生成器模式  146
    • 模式17 记忆模式  159
    • 模式18 惰性序列模式  163
    • 模式19 集中的可变性  172
    • 模式20 自定义控制流  180
    • 模式21 领域特定语言  191
    • 第5章 结束语  201
    • 参考文献  202
    展开阅读
    精选笔记:作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    22小时43分钟前回答

    Java虚拟机一直是比较重要的知识点,是Java高级开发必会的。本文为你总结了关于JVM的22个重点、难点,图文并茂的向你展示和JVM有关的重点知识。全文共7000字左右。

    概念

    虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box,Java Virtual Machine(Java虚拟机,简称JVM)。

    Java虚拟机阵营:Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、Azul VM、Apache Harmony、Google Dalvik VM、Microsoft JVM…

    启动流程

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    基本架构

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    Java运行时编译源码(.java)成字节码,由jre运行。jre由java虚拟机(jvm)实现。Jvm分析字节码,后解释并执行。

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    JVM由三个主要的子系统构成:

    1. 1.类加载器子系统
    2. 2.运行时数据区(内存)
    3. 3.执行引擎

    类加载器子系统

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    类装载包括了加载,连接(验证、准备、解析(可选)),初始化。其中类加载工作由ClassLoader及其子类负责。

    1. 加载:在硬盘上查找并通过IO读入字节码文件
    2. 连接:执行校验、准备、解析(可选)步骤
    3. 校验,校验字节码文件的正确性
    4. 准备,给类的静态变量分配内存,并赋予默认值
    5. 解析,将符号引用转为直接引用,类装载器装入类所引用的其他所有类
    6. 初始化:对类的静态变量初始化为指定的值,执行静态代码块

    类加载器体系结构

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    1.启动类加载器:负责加载JRE的核心类库,如jre目标下的rt.jar,charsets.jar等.

    2.扩展类加载器:负责加载JRE扩展目录ext中JAR类包

    3.系统类加载器:负责加载ClassPath路径下的类包

    4.用户自定义加载器:负责加载用户自定义路径下的类包

    类加载机制(双亲委派)

    全盘负责委托机制。全盘负责,当一个ClassLoader加载一个类时,除非显示的使用另一个ClassLoader,该类所依赖和引用的类也由这个ClassLoader载入。委托机制:指先委托父类加载器寻找目标类,在找不到的情况下采用自己的路径中查找并载入目标类

    运行时数据区

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    堆(Java堆)

    虚拟机启动时创建,用于存放对象实例,几乎所有的对象(包含常量池)都在堆上分配内存,当对象无法再该空间申请到内存时将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域。可通过 -Xmx –Xms 参数来分别指定最大堆和最小堆。线程共享。

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

     栈(Java栈)

    是java方法执行的内存模型,为虚拟机执行java方法,每个方法在执行的同时都会创建一个栈帧(用于存储局部变量表,操作数栈,动态链接,方法出口等信息)。线程独占。

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    Jvm对该区域规范了两种异常:

    1. 1,线程请求的栈深度大于虚拟机栈所允许的深度,将抛出StackOverFlowError异常。
    2. 2,若虚拟机栈可动态扩展,当无法申请到足够内存空间时将抛出OutOfMemoryError。通过jvm参数–Xss指定栈空间,空间大小决定函数调用的深度。

    本地方法栈

    为虚拟机执行native方法,其他规范与java栈类似。不同类型的虚拟机对该区域可自由实现。线程独占。

    PC寄存器(程序计数器)

    用来存储待执行指令的地址。分支,循环,跳转,异常处理,线程恢复等功能都需要依赖pc寄存器。线程独占。

    若线程执行的是一个java方法,则pc寄存器中保存的是待执行指令的地址。若执行的是一个native方法,则pc寄存器中为空。

    元数据区

    元数据区取代了永久代,本质和永久代类似,都是对JVM规范中方法区的实现,区别在于元数据区并不在虚拟机中,而是使用本地内存。元数据区在频繁使用,也会发生OutOfMemory异常。

    元数据区的动态扩展,默认–XX:MetaspaceSize值为21MB的高水位线。一旦触及则Full GC将被触发并卸载没有用的类(类对应的类加载器不再存活),然后高水位线将会重置。新的高水位线的值取决于GC后释放的元空间。如果释放的空间少,这个高水位线则上升。如果释放空间过多,则高水位线下降。

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    执行引擎

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    执行引擎读取运行时数据区的字节码并逐个执行

    (1) 解释器:解释器更快地解释字节码,但执行缓慢,解释一句执行一句。

    (2) JIT编译器:JIT编译器消除了解释器的缺点。执行引擎通过解释器转换字节码,当它发现重复的代码时,将使用JIT编译器,它编译整个字节码并将其更改为本地代码。这个本地代码将直接用于重复的方法调用,这提高了系统的性能。

    JIT的构成组件为:

    1. 中间代码生成器(Intermediate Code Generator):生成中间代码 。
    2. 代码优化器(Code Optimizer):负责优化上面生成的中间代码 。
    3. 目标代码生成器(Target Code Generator):负责生成机器代码或本地代码 。
    4. 分析器(Profiler):一个特殊组件,负责查找热点(被多次调用的方法)

    (3) 垃圾收集器:收集和删除未引用的对象。程序可调用System.gc()触发垃圾收集,但不能保证执行。

    1. 本地方法接口(JNI):JNI将与本机方法库进行交互,并提供执行引擎所需的本机库。
    2. 本地方法库:执行引擎所需的本机库的集合。

    垃圾收集(GC:Garbage Collection)

    1,如何识别垃圾,判定对象是否可被回收?

    引用计数法:给每个对象添加一个计数器,当有地方引用该对象时计数器加1,当引用失效时计数器减1。用对象计数器是否为0来判断对象是否可被回收。缺点:无法解决循环引用的问题

    根搜索算法:也称可达性分析法,通过“GC ROOTs”的对象作为搜索起始点,通过引用向下搜索,所走过的路径称为引用链。通过对象是否有到达引用链的路径来判断对象是否可被回收(可作为GC ROOTs的对象:虚拟机栈中引用的对象,方法区中类静态属性引用的对象,方法区中常量引用的对象,本地方法栈中JNI引用的对象)

    2,Java 中的堆是 GC 收集垃圾的主要区域,GC 分为两种:Minor GC、Full GC ( 或称为 Major GC )。

     Minor GC:新生代(Young Gen)空间不足时触发收集,由于Java 中的大部分对象通常不需长久存活,新生代是GC收集频繁区域,所以采用复制算法。

    Full GC:老年代(Old Gen )空间不足或元空间达到高水位线执行收集动作,由于存放大对象及长久存活下的对象,占用内存空间大,回收效率低,所以采用标记-清除算法。

    GC算法

    按照回收策略划分为:标记-清除算法,标记-整理算法,复制算法。

    1.标记-清除算法:分为两阶段“标记”和“清除”。首先标记出哪些对象可被回收,在标记完成之后统一回收所有被标记的对象所占用的内存空间。不足之处:1.无法处理循环引用的问题2.效率不高3.产生大量内存碎片(ps:空间碎片太多可能会导致以后在分配大对象的时候而无法申请到足够的连续内存空间,导致提前触发新一轮gc)

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    2.标记-整理算法:分为两阶段“标记”和“整理”。首先标记出哪些对象可被回收,在标记完成后,将对象向一端移动,然后直接清理掉边界以外的内存。

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    3.复制算法:把内存空间划为两个相等的区域,每次只使用其中一个区域。gc时遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。不足之处:1.内存利用率问题2.在对象存活率较高时,其效率会变低。

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    按分区对待可分为:增量收集算法,分代收集算法

    1. 1.增量收集:实时垃圾回收算法,即:在应用进行的同时进行垃圾回收,理论上可以解决传统分代方式带来的问题。增量收集把对堆空间划分成一系列内存块,使用时先使用其中一部分,垃圾收集时把之前用掉的部分中的存活对象再放到后面没有用的空间中,这样可以实现一直边使用边收集的效果,避免了传统分代方式整个使用完了再暂停的回收的情况。
    2.  2.分代收集:(商用默认)基于对象生命周期划分为新生代、老年代、元空间,对不同生命周期的对象使用不同的算法进行回收。

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    按系统线程可分为:串行收集算法,并行收集算法,并发收集算法

    1. 1.串行收集:使用单线程处理垃圾回收工作,实现容易,效率较高。不足之处:1.无法发挥多处理器的优势 2.需要暂停用户线程
    2. 2.并行收集:使用多线程处理垃圾回收工作,速度快,效率高。理论上CPU数目越多,越能体现出并行收集器的优势。不足之处:需要暂停用户线程
    3. 3.并发收集:垃圾线程与用户线程同时工作。系统在垃圾回收时不需要暂停用户线程

    GC收集器

    垃圾收集算法是内存回收的理论基础,而垃圾收集器就是内存回收的具体实现。

    1.Serial 收集器主要针对新生代的收集,是最基本最古老的收集器,它是单线程收集器,工作时必须暂停所有用户线程。该收集器采用复制算法。      

    Serial Old收集器主要针对老年代收集,采用标记-整理算法,实现简单高效,但会停顿。

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    2.ParNew收集器是Serial的多线程版本,针对新生代采用复制算法使用多线程进行垃圾收集(并行收集器,响应优先)。

    3.Parallel Scavenge采用复制算法针对新生代的多线程收集器(并行收集器,吞吐优先)。可控制吞吐量和停顿时间,即吞吐量 = 运行用户代码时间 / (运行用户代码时间+垃圾收集时间)。

     Parallel Old收集器是Parallel Scavenge收集器的老年代版本(并行收集器),使用多线程和标记-整理算法。

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    4.CMS(Current MarkSweep)收集器针对老年代,是一种以获取最短回收停顿时间为目标的收集器,它是一种并发收集器,采用的是标记-清除算法。

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    5.G1的新生代类似于ParNew,采用复制算法算法,当新生代占用达到一定比例的时候,开始收集。老年代类似于CMS,不同点是采用标记-整理算法。

    G1因此它是一款并行与并发收集器,能充分利用多CPU、多核环境。并且它能建立可预测的停顿时间模型。

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    与CMS收集器相比G1收集器有以下特点:

    1. 1. 空间整合,G1收集器采用标记-整理算法,不会产生内存空间碎片。分配大对象(直接进Humongous区,专门存放短期巨型对象,不用直接进老年代,避免Full GC的大量开销)不会因为无法找到连续空间而提前触发下一次GC。(年青代拷贝、老年代转移对象无空闲分区、巨型对象无连续分区时触发Full GC,开销极大应该避免)
    2. 2. 可预测停顿,降低停顿时间是G1和CMS的共同关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为N毫秒的时间内,消耗在垃圾收集上的时间不得超过N毫秒,几乎达到Java实时系统(RTSJ)级的垃圾收集器。
    3. 3.G1将Java堆划分为多个大小相等的独立区域(Region),虽保留新生代和老年代的概念,但不再是物理隔阂了,它们都是(可以不连续)Region的集合。

    收集器常用组合

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    JVM性能调优思路

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    理解GC日志

    作为程序员必须掌握的Java虚拟机中的22个重难点(推荐0

    [GC [PSYoungGen: 8192K->1000K(9216K)] 16004K->14604K(29696K), 0.0317424 secs] [Times: user=0.06 sys=0.00, real=0.03 secs][GC [PSYoungGen: 9192K->1016K(9216K)] 22796K->20780K(29696K), 0.0314567 secs] [Times: user=0.06 sys=0.00, real=0.03 secs][Full GC [PSYoungGen: 8192K->8192K(9216K)] [ParOldGen: 20435K->20435K(20480K)] 28627K->28627K(29696K), [Metaspace: 8469K->8469K(1056768K)], 0.1307495 secs] [Times: user=0.50 sys=0.00, real=0.13 secs][Full GC [PSYoungGen: 8192K->8192K(9216K)] [ParOldGen: 20437K->20437K(20480K)] 28629K->28629K(29696K), [Metaspace: 8469K->8469K(1056768K)], 0.1240311 secs] [Times: user=0.42 sys=0.00, real=0.12 secs]

    常见异常

    StackOverflowError:(栈溢出)OutOfMemoryError: Java heap space(堆空间不足)OutOfMemoryError: GC overhead limit exceeded (GC花费的时间超过 98%, 并且GC回收的内存少于 2%)

    GC参数

    堆栈设置

    -Xss:每个线程的栈大小-Xms:初始堆大小,默认物理内存的1/64-Xmx:最大堆大小,默认物理内存的1/4-Xmn:新生代大小-XX:NewSize:设置新生代初始大小-XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。-XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。-XX:MaxMetaspaceSize:设置元空间最大允许大小,默认不受限制,JVM Metaspace会进行动态扩展。

    垃圾回收统计信息

    -XX:+PrintGC-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xloggc:filename

    收集器设置

    -XX:+UseSerialGC:设置串行收集器-XX:+UseParallelGC:设置并行收集器-XX:+UseParallelOldGC:老年代使用并行回收收集器-XX:+UseParNewGC:在新生代使用并行收集器-XX:+UseParalledlOldGC:设置并行老年代收集器-XX:+UseConcMarkSweepGC:设置CMS并发收集器-XX:+UseG1GC:设置G1收集器-XX:ParallelGCThreads:设置用于垃圾回收的线程数

    并行收集器设置

    -XX:ParallelGCThreads:设置并行收集器收集时使用的CPU数。并行收集线程数。-XX:MaxGCPauseMillis:设置并行收集最大暂停时间-XX:GCTimeRatio:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)CMS收集器设置-XX:+UseConcMarkSweepGC:设置CMS并发收集器-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。-XX:ParallelGCThreads:设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数。-XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收-XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况-XX:ParallelCMSThreads:设定CMS的线程数量-XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理

    G1收集器设置

    -XX:+UseG1GC:使用G1收集器-XX:ParallelGCThreads:指定GC工作的线程数量-XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的幂),默认将整堆划分为2048个分区-XX:GCTimeRatio:吞吐量大小,0-100的整数(默认9),值为n则系统将花费不超过1/(1+n)的时间用于垃圾收集-XX:MaxGCPauseMillis:目标暂停时间(默认200ms)-XX:G1NewSizePercent:新生代内存初始空间(默认整堆5%)-XX:G1MaxNewSizePercent:新生代内存最大空间-XX:TargetSurvivorRatio:Survivor填充容量(默认50%)-XX:MaxTenuringThreshold:最大任期阈值(默认15)-XX:InitiatingHeapOccupancyPercen:老年代占用空间超过整堆比IHOP阈值(默认45%),超过则执行混合收集-XX:G1HeapWastePercent:堆废物百分比(默认5%)-XX:G1MixedGCCountTarget:参数混合周期的最大总次数(默认8)

    性能分析和监控工具

    Jps:虚拟机进程状况工具

    Jstat:虚拟机统计信息监视工具

    Jinfo:虚拟机配置信息工具

    Jmap:内存映像工具

    Jhat:虚拟机堆转储快照分析工具

    Jstack:堆栈跟踪工具

    JConsole:java监视与管理控制台

    VisualVM:故障处理工具

    以上所述是小编给大家介绍的Java虚拟机中22个重难点详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

    展开阅读

    资源下载

    相关资源

    • Java虚拟机规范:Java SE 8版

      Java虚拟机规范:Java SE 8版

      书是Oracle官方发布,Java虚拟机技术创建人撰写,国内资深Java技术专家翻译,是深度了解Java虚拟机和Java语言实现细节的必读之作,它完整地讲述了由JavaSE8所引入的新特性 Java虚拟机规范(Jav

      大小:161.2 MBJava

      立即下载
    • 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)

      深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)

      大小:253 MBJava虚拟机

      立即下载
    • 自己动手写Java虚拟机

      自己动手写Java虚拟机

      Java虚拟机非常复杂,要想真正理解它的工作原理,最好的方式就是自己动手编写一个! 本书是继《深入理解Java虚拟机》之后的又一经典著作,它一方面遵循《Java虚拟机规范》,一方面又独辟

      大小:4.27 MBJava

      立即下载
    • Java虚拟机基础教程

      Java虚拟机基础教程

      概述JVM及其特性,介绍了Java、Scala、Clojure、Kotlin和Groovy这5种基于JVM的语言,分别探讨它们的特性和用例,适合所有Java开发人员以及对JVM感兴趣的读者

      大小:78.6 MBjava

      立即下载
    • 揭秘Java虚拟机:JVM设计原理与实现

      揭秘Java虚拟机:JVM设计原理与实现

      《揭秘Java虚拟机》Java工程师高质量成长的必读本,谷歌官方认可的android开发语言Kotlin的基石。看透JVM设计思想与原理,彻底领悟JAVA编程精髓,以不变应万变!

      大小:186.2 MBJava虚拟机

      立即下载

    学习笔记

    19小时40分钟前回答

    了解java中的Clojure如何抽象并发性和共享状态

    前言 在所有 Java 下一代语言中,Clojure 拥有最激进的并发性机制和功能。Groovy 和 Scala 都为并发性提供了改善的抽象和语法糖的一种组合,而 Clojure 坚持了它始终在 JVM 上提供独一无二的行为的强硬立场。在本期 Java 下一代 中,我将介绍 Clojure 中众多并发性选项的一部分。首先是为 Clojure 中易变的引用提供支撑的基础抽象:epochal 时间模型。 Epochal 事件模型 或许 Clojure 与其他语言最显著的区别与易变的状态和值 密切相关。Clojure 中的值 可以是任何用户感兴趣的数据:数字 42、映射结构 {:first-name "Neal :last-name "Ford"} 或某些更大型的数据结构,比如 Wikipedia。基本来讲,Clojure 语言对待所有值就像其他语言对……

    网友NO.31202
    网友NO.31202

    都试图利用成熟的 JVM,并可以使用 JVM 平台上现存的代码和广泛的库,同时避免 Java 语言表达上的一些弱点。 两者都试图将函数编程 (FP) 引入到原本是为纯 OO 语言 Java 定制的 JVM 上。因此,它们都具有 FP 的特征:函数是头等公民,可以作为参数传递,可以作为返回值返回。 但两种语言的设计哲学截然不同: Clojure 是历史悠久的 Lisp 的一种方言,它需要尊重 Lisp 的传统:包括臭名昭著(对 Lisp 爱好者是香味扑鼻)的括号海洋。当然 Clojure 做了很多不同传统 Lisp 的处理,如引入了 Vector,map 等基本类型,而不只是 List。而 Scala 是全新设计的语法,它不受过往语法的限制;它深受 Haskell 的影响,有抽象数据类型 ADT、 模式匹配等鲜明特征。 Scala 是强类型语言,编译器积极检查数据类型,有类型推断等新类型语言的先进特征。Clojure 是鸭子类型语言,编译器不检查类型,这责任在于程序员自己(目前 core.typed 库试图把强类型检查作为可选项加入到 Clojure 语言中,不过还远远不到成熟的地步)。 Scala 认为 OO 和 FP 都是非常有效的表达方法,因此在语言中同时支持它们。Clojure 则强烈不鼓励使用 OO 编程,尽管从与 Java 互通等方面出发有一些支持。它强烈倾向于 FP 编程。带来的后果是 Scala 的程序风格可能会非常多样,而 Clojure 则相对统一。 Scala 是传统的语言开发方式:有相当多的关键字和语法糖,都需要核心开发者支持。虽然加入了元编程能力,但其元编程与普通编程区别很大,难以被一般开发者使用。 Clojure 从 Lisp 处继承的代码即数据的核心,则保证了极为自然和强大的元编程能力,任何开发者都很容易用宏来定义自己的语法,因此基于 Clojure 定义自己的领域语言(DSL)非常容易。

    网友NO.48878
    网友NO.48878

    Scala 认为 OO 和 FP 都是非常有效的表达方法,因此在语言中同时支持它们。Clojure 则强烈不鼓励使用 OO 编程,尽管从与 Java 互通等方面出发有一些支持。它强烈倾向于 FP 编程。带来的后果是 Scala 的程序风格可能会非常多样,而 Clojure 则相对统一。