Clojure

Rationale

客户和利益相关者对JVM之类的行业标准平台进行了大量投资,并对其性能,安全性和稳定性感到满意. 尽管Java开发人员可能会羡慕动态语言的简洁性,灵活性和生产率,但他们对在客户认可的基础架构上运行,访问其现有代码库和库以及性能感到担忧. 此外,他们还面临使用本机线程和锁定处理并发的持续问题. 在这种情况下,Clojure致力于实用的动态语言设计. 它努力成为适合Java的领域的通用语言. 它反映了这样一个现实:对于并发编程的未来,无处不在的,无节制的变异就必须存在.

Clojure通过以下方式实现其目标:拥抱行业标准的开放平台-JVM; 现代化一种古老的语言-Lisp; 通过不可变的持久数据结构促进功能编程; 并通过软件事务存储器和异步代理提供内置的并发支持. 结果是健壮,实用和快速的.

Clojure对状态和身份具有独特的处理方式.

Why Clojure?

为什么还要编写另一种编程语言? 基本上是因为我想要:

  • 一缕

  • 用于函数式编程

  • 与既定平台共生

  • 为并发设计

找不到一个. 这是Clojure背后一些激励思想的概述.

Lisp is a good thing

  • 经常被模仿/被盗,仍然不被复制

  • Lambda演算产生的核极小

  • 几乎没有语法

  • 核心优势仍然是代码编码和语法抽象

  • 标准的Lips(通用Lisp和Scheme)呢?

    • 标准化后缓慢/没有创新

    • 核心数据结构可变,不可扩展

    • 规格没有并发

    • JVM的良好实现已经存在(ABCL,Kawa,SISC等)

    • 标准Lisps是他们自己的平台

  • Clojure是一个Lisp,不受向后兼容性的限制

    • 将数据编码范式扩展到地图和矢量

    • 默认为不变性

    • 核心数据结构是可扩展的抽象

    • 拥抱平台(JVM)

Functional programming is a good thing

  • 不变的数据+一流的功能

  • 总是可以通过纪律/惯例在Lisp中完成

    • But if a data structure can be mutated, dangerous to presume it won’t be

    • 在传统的Lisp中,只有列表数据结构在结构上是递归的

  • 纯函数语言倾向于强静态类型

    • 不适合所有人,也不适合每个任务

  • Clojure是一种动态强调的功能性语言

    • 所有数据结构都是不变且持久的,支持递归

    • 异构集合,返回类型

    • 动态多态

Languages and Platforms

  • 虚拟机而非操作系统是未来的平台,可提供:

    • 类型系统

      • 动态执法与安全

    • Libraries

      • 提取操作系统

      • 庞大的设施

      • 内置和第三方

    • 内存和其他资源管理

      • GC是平台,而不是语言,设施

    • 字节码+ JIT编译

      • 摘走硬件

  • 语言作为平台与语言+平台

    • 旧方法-每种语言都定义自己的运行时

      • GC,字节码,类型系统,库等

    • 新方法(JVM,.Net)

      • 不受语言限制的通用运行时

  • 为平台构建的语言与移植到平台的语言

    • 许多新语言仍采用"语言作为平台"方法

    • 移植时,存在平台平台问题

      • 内存管理,类型系统,线程问题

      • 库复制

      • 如果基于C的原始语言,那么用C编写的某些扩展库就不会出现

  • 平台由客户决定

    • "必须在JVM上运行"或.Net与"必须在Unix上运行"或Windows

    • JVM已建立跟踪记录和信任级别

      • 现在也开源

    • 与其他代码互操作

      • 这几天C联动不足

  • Java / JVM 语言+平台

    • 不是最初的故事,而是JVM的其他语言一直存在,现在被Sun所接受

    • Java可能很乏味,表达能力不足

      • 缺乏一流的功能,没有类型推断等

    • 调用/使用Java的能力至关重要

  • Clojure是语言,JVM是平台

Object Orientation is overrated

  • 天生的模拟,即使在不合适的情况下也可以用于一切

    • 在所有情况下,由于Java / C#缺乏对其他内容的(惯用的)支持,因此受到鼓励

  • 可变状态对象是新的意大利面条代码

    • 难以理解,测试,原因

    • 并发灾难

  • 继承不是实现多态的唯一方法

  • "让100个功能对一种数据结构进行操作比让10个功能对10种数据结构进行操作更好." -Alan J. Perlis

  • Clojure将其数据结构建模为由接口表示的不可变对象,否则不提供其自己的类系统.

  • 在很少的主要数据结构(seq,map,vector,set)上定义了许多功能.

  • 用Java编写Java,从Clojure使用和扩展Java.

Polymorphism is a good thing

  • 开关语句,结构匹配等会产生脆弱的系统

  • 多态产生可扩展的灵活系统

  • Clojure多方法将多态与OO和类型分离

    • 支持多种分类法

    • 通过静态,动态或外部属性,元数据等进行调度

Concurrency and the multi-core future

  • 不变性使大部分问题消失了

    • 在线程之间自由共享

  • 但是改变状态对于模拟和程序外代理来说是现实的

  • 锁定太难了,无法一遍又一遍

  • Clojure的软件事务存储和代理系统是最困难的部分

简而言之,我认为Clojure作为具有强大并发支持的JVM功能Lisp占据着独特的位置. 查看一些功能开始使用Clojure .