Lush手册——第一章 简介

吃可爱长大的小学妹 提交于 2019-12-06 21:23:27

简介

本章将展示Lush及其能力与特性。

1.1 Lush展示

    Lush是一门面向对象的编程语言,是为对大规模数值运算与图形化应用感兴趣的研究人员、实验人员和工程师设计的。Lush用于以下场景,即想要将高级的、弱类型的解释性语言的灵活性,强类型的、本地编译型的语言的高效性,还有与C、C++等语言编写的代码容易结合这些特性组合在一起。

    在与解释型语言(如Python、Perl、Matlab、S+甚至BASIC)和使用编译型语言(例如C语言)结合的相关工程上,Lush的优势尤其意义重大。通过使用Lush,我们将获得解释型和编译型编程世界里的最好的部分,并最终合而为一:

  1. 一个拥有简单的类Lisp语法的、带松散类型的、带垃圾回收机制的、动态作用域的解释型语言;
  2. 一个带有类Lisp语法的、带有强类型、词法作用域的编译型语言;
  3. C语言可以自由地混合到Lush代码里,该Lush代码可以是一段单独的程序或者一个单独的函数。

这听起来有点复杂,其实不然。事实上,Lush的设计原则就是易学易用。

Lush的主要特征有以下几点:

  • 一个整洁的、简单的和易学的类Lisp语法;
  • 一个非常高效的本地编译器(由C语言实现);
  • 一个与C函数与库对接的容易的方式,联通对用其它语言编写的对象文件的强大的动态加载能力;
  • 自由地将Lisp代码与C代码混合到一个函数里能力;
  • 一个包含向量、矩阵和张量操作的强大的集合;
  • 一个庞大的数值方法库,包括GSL、LAPACK和BLAS;
  • 一个图形方法的扩展集(包括一个面向对象的GUI工具包和针对OpenGL和SDL的接口);
  • 声音和视频抓取(通过ALSA和Video4Linux);
  • 一个影像和信号处理方法库;
  • 一些针对机器学习、神经网络和统计估计的库。

    这么一个集灵活性、高效性和扩展性于一身的组合,使得Lush成为针对人工智能、生物信息学、计算机视觉、数据挖掘、影像处理、机器学习、信号处理和统计学研究和开发的理想平台。其运行速度与可扩展的库使得它在很多领域得到试用,比如实时音频、影像和视频处理。一些用户将它作为万能脚本语言,还有一个将它作为主开发语言引入到工作中。一些用户用Lush开发2D或3D游戏而被知晓。还有一些用户甚至用Lush开发用于嵌入式处理器的商业软件。

    与Matlab相比,Lush是一个真正的面向对象语言,它具有数据结构、类型矩阵、简单的语法和一个本地编译器。与Python相比,Lush有一个高效的本地编译器(编译过的数值代码与C一样快),并且提供函数式编程范式。在Lush里,容易地调用C库和自由地混合C与Lisp代码的能力也是独一无二的。

    如果你有如下需求,那么Lush就是为你准备的:

  • 想要一门简单的解释型语言,它可以快速实践你的想法,或实现高效数值运算,或编写基于GUI应用的原型程序;
  • 用C编写了一个软件,并想从一个简单的解释型的脚本语言调用它;
  • 自己写了一个脚本语言解释器,想要让它成为一个充分扩展的编程语言;
  • 使用一个解释型的类脚本语言,比如Perl、Matlab、Mathematics、Tcl、Python或BASIC,想让编译器产生高效的代码,并且易于调用C方法;
  • 使用脚本语言编写程序,就像前边提到的那些语言,然后据此想要产生轻便的、脱机的应用;
  • 或者想要为你的工程使用两种语言的组合:用于底层实现的高效的、可编译的、只包含基本元素的语言,例如C\C++,还有用语上层实现和用户接口的语言,它们是解释型的、带有智能内存管理的弱类型的语言,比如Lisp。

    很多软件工程,尤其是研究性的项目,都需要两种语言:用于实现底层或者有计算功能的可扩展函数,比如C\C++;还有就是用于顶层控制的、脚本化的、实验性质的和具有修补功能的灵活的语言,这样的语言多数是解释型语言。流行的面向研究的解释型语言,比如说Matlab,有一点低效,又很少或没有复杂数据结构支持,不提供完备的面向对象编程的能力,缺少与C及其它编译型语言的简单接口功能。

    Lush的语法是简单的Lisp形式,如果"Lisp"这个字给你毛骨悚然的感觉,那么请注意它的方言Lush实现是极其简单易学的,Lush可能是现有可用的语法里最简单的。大多数学习了Lush的科学家,工程师和软件开发人员都可以在几天内熟练地使用它,尽管他们以前没有接触过lisp。真的,Lush非常简单。实际上,Lush已经用于教授儿童编程!

    Lush编译器有一些有趣的特性(还有一些限制)。它的主要的优势是它可以产生非常高效的C代码,它是使用所有考虑的机器里可用的最好的C编译器编译的。

    Lush当前运行于各种Unix平台上,包括Linux/x86,Solaris和SGI/Irix;它也可以运行于Mac OS X和Windows(安装了Cygwin的)上。

1.2 特性

    Lush是一个由C编写,围绕紧凑、轻便和有意简单的Lisp解释器。它有所有的常用功能和结构,这些在正经的面象对象语言里都有,比如传统的句式,循环,局部变量,函数,宏,对象,类,方法和继承。除此之外,Lush还提供了大量的用于处理列表、字符串(包括正则表达式匹配和替换)、矢量、矩阵和张量的函数。

    Lush与1980年代中期的某些lisp相当相似,比如Le_Lisp和UCI_Lisp。Lush明显比Common Lisp简单,与Scheme差别较大。

    Lush有一些不同寻常的特性,它们是转换为C的编译器、动态加载器和与现存的C函数和已经实现的C库的便利的接口,其中一个最不同寻常的特性就是其提供的在一个单独的函数内交叉混合C与Lisp源码的能力。

    Lush的矢量与矩阵操作引擎也非常强大和高效,这使得它在计算强度极高的数值和信号与图像处理方面的应用非常理想。这些函数包含对矢量、矩阵和张量高达8维的操作,可以进行创建、改变大小和转换。一些基本的矩阵操作,比如说标量操作(对矩阵上的所有元素)、内积、外积、转置、高度优化的1维与2维卷积等都包含其中。Lush提供的迭代操作符可以获得矩阵的任意元素而不需要开销较大的边界检查。

    作为一门面向对象语言,Lush提供了定义和编译类的功能,这里的类是由槽和方法组成的,对于派生类还包含从其父类继承来的槽和方法(与C++语法相似)。

    Lush包含了Lisp狂们熟悉的所有的函数。它们有:list函数、list迭代符、物理列表操作符(矢量、矩阵、张量等)、宏、剪切宏和符号操作符等等。大多数临时用户宁愿远离比这些更复杂的操作符。

    Lush提供了一些易用的图形函数来绘制直线、多边形、矩形、图像和带颜色的文本,这些函数带自动刷新和双缓冲功能(针对简单的动画)。图形可以绘制到X视窗系统中,也可以绘制到PostScript文件里。Lush提供的底层的绘图函数可以用来构建高级功能,比如说函数绘图。

   Lush还有一个非常简洁和易用的面象对象的GUI生成器,叫做Oger,它使用上面提到的底层绘图函数,完全使用Lisp语言编写的。包含对按钮、滑块、单选按钮、菜单、字符串编辑器等等的预定义类。Oger包含一个用来在窗体里放置对象的自动化机制,因此极大地简化了GUI程序的设计与实现,简单的GUI程序可以在极短的时间内编写完成,并且非常简洁。

    针对输入与输出,Lush提供了两个模块。一个模块是面象Lisp的函数集,允许容易地进行ASCII数据、lisp表达式、lisp对象和矩阵的输入输出,还有一些特别吸引人的东西,比如说管道和socket;另一个模块从根本上提供了对标准C语言I/O库的访问,包括fopen、popen、fprintf、fscanf、fgetc、fputc、fgets和一些读写矩阵的函数,通过使用这些函数,大规模矩阵可以映射到虚拟地址空间中,而不需要明确地加载到内存中,这就允许对非常大的数据库的高效访问。

1.3 库

    在Lush里,对于用户来说,有大量的库和实用函数集合可用,它们中有些使用Lisp编写的,有些是由C编写的然后接口到Lush中,还有一些是已经植入到Lush中的预存库。

    对于倾向于数值应用的朋友,Lush有一个针对GNU Scientfic Library(GSL)、LAPACK和BLAS现行代数库的完整的接口。这给予Lush访问一个可扩展的数值和统计函数集(事实上有几千个函数)的能力。

    拥有对工业标准OpenGL库的完整接口,使得Lush能够创建3D图形和动画,该接口本身包括对GLUT、OpenGLU和OpenRM(场景制图渲染引擎)的接口。该特性使得Lush成为编写可交互虚拟现实应用和计算机游戏的优秀平台。

    Lush提供接口的另一个库是Simple Directmedia Layer(SDL)视频游戏API,它由一个高级库进行功能增强,该库允许简易的舞台控制和可移动屏幕对象,该屏幕对象是带像素精度级别碰撞检测的。该库与Lush的简单语法组合,是开发简单视频游戏和儿童编程教育的理想方法。

    还有一个图像处理库是受用户支配的,这个库的函数可以用来装载、保存、改变大小和采样、卷积、滤波和分析图像。数学形态学操作,比如联通量分析、距离变换、腐蚀和膨胀,对于黑白影像都是可用的。为了使用Video4Linux API容易地抓取视频,还包含了相关的类与函数。

    还有一个包含在Lush里的库,它提供了图的功能,允许语法树和有限元状态机结构,图转导和组合,viterbi搜索算法。

    Lush还包含一个用来进行基于梯度的机器学习的可扩展库,这里的基于梯度的机器学习包括神经网络、径向基函数、支持向量机(SVM)和一些其他算法。该库基于一个富有创新精神的面向对象设计,该设计会促进从多学习机和合作学习机训练到大型学习机的构造。使用该库的商用光识别系统已经建立完毕。

    此外,Lush还提供了各种多媒体库接口,包括Video4Linux(视频抓取)和ALSA(音频录制与播放)。

1.4 应用领域

    对于多种应用来说,Lush都是一个好工具。起初,Lush的开发是作为一个用来实验和开发机器学习、神经网络和模式识别应用的环境,但是经过几年的发展,它已经成长为一个成熟的语言和快速开发环境。

    关于Lush的使用情况,这里有一些实例:

  • 一个用于神经网络和机器学习实验的模拟环境
  • 一个用于数值计算、信号处理、影像处理、统计估计等等的类Matlab原型工具
  • 一个用于软件工程的控制/脚本语言
  • 一个用于大型应用的调试器和分析工具
  • 一个用于GUI应用的快速原型工具
  • 一个用于快速hack的脚本语言

    下边是使用Lush完成的研究项目的一个小型子集:

  • 数量庞大的手写识别项目
  • 神经网络、机器学习和统计估计的很多项目
  • 数据挖掘、错误探测和数据库行销项目
  • 图像处理研究

    一些成熟的商业应用也是用Lush构建的,包括:

  • 一个完整的支票金额读取器,现在它被组合到NCR公司的自动出纳机和大型结算室的支票读取机上(Lush产生的代码运行在DSP板上)。这是极其的复杂代码段(60000行Lush Lisp代码自动地转换为C代码
  • 一个用于DjVu影像压缩系统的前景/背景分段模块的早期版本
  • 一个神经网络模拟器和神经网络训练工具
  • 一个带手写识别功能的笔触数据输入系统

1.5 实现

    Lush编程语言已经作为Lisp的一个变种而被实现。

    在软件工业发展的某些时间段里,有时人们将Lisp理解为本质上是学术兴趣的怪物,它的理论计算机科学遗产也会让人引起对Lisp的常见误解,比如人们认为它效率低并且难学。那为什么我们选择Lisp呢?原因是与常见的偏见相反的,Lisp非常易学,还很灵活、高效和便利。Lisp有非常简单、整洁和灵活的语法,这个语法可能是我们学过的最简单的语法(相反的,Per是另一个极端)。我们教授C开发者使用Lush的经历是他们在几天内就可以熟练使用Lush。脚本语言的设计者经常会犯一些错误,不仅在语言功能设计上,还有在他们语言语法的设计上,相关的例子包括Matlab、Mathematica、S+,还有一些其它语言,为什么有Lisp这样好的语法存在我们还要法宠一个新的呢?Lish就是这样的一门语言,它是Lisp的一个面向对象版本的方言,它将所有精力集中于易用和高效上,应用场景是数值操作(这与很多Lisp的传统实现时不同的),尽可能贴近这样的效果,即不费什么力气就可以与现存的C编写的代码对接。

    另一个jin仅Lisp才有的优势是Lisp是一门可编程的编程语言。在Lisp里,程序仅仅是一个数据结构,程序员可以创建或操作这种结构,就像操作数据一样。换句话说,Lisp程序可以创建其它Lisp程序,该特性允许用户(不仅是语言设计者)无限制地扩展语言本身。该特性也使编写语法转化、自优化程序、编译器、自动微分器等等程序成为可能。大多数用户都将远离编写这些程序的工作,但是他们仍会在这些领域得益于他人的工作成果(比如CLush编译器)。

1.6 历史

    Lush是SN系统的直接后代,该系统原本是由Leon Bottou和Yann LeCun开发的,它是某个神经网路模拟器的终端机。自从1987年,人们不断地开发出各种SN的系统,在法国,有些被Neuristique S.A.以商业方式售卖,事实上,它已发展成为一个成熟的原型环境和开发环境。

    AT&T贝尔实验室、然后是AT&T实验室和NEC研究院等的版本开发,已经用来构建很多成功的件数和产品,最著名的有:

  • 世界上很多银行使用的用来自动读取指标的手写识别系统。事实上,一些NCR制造(可以读取支票)的ATM机就在嵌入式DSP主板上运行这编译后的SN代码
  • DjVu影像压缩系统的原型
  • 从1988年开始,由AT&T卡饭的,多的数不清的机器学习算法,包括进化神经网路的LeNet族和支持向量机(SVM)算法的早期实现

    SN主要在AT&T贝尔实验室内部使用,用于很多研究项目,包括机器学习、模式识别和影像处理。但是它的各种前身是用在AT&T实验室、朗讯科技(Lucent)、萨克生物研究院(the Salk Institute)、多伦多大学、蒙特利尔大学、加利福尼亚大学伯克利分校,还有很多其他研究机构。SN的商业版本用在一些大型公司,作为原型工具使用:发过汤姆逊半导体公司、法国国家航天航空研究中心、.....

    贡献者有:Leon Bottou、Yann LeCun,Jie Huang Fu、Patrice Simard、Yoshua Bengio、Jean Bourrelly、Patrick Haffner、Pascal Vincent、Sergey loffe等等。

    2001年,AT&T和Neuristique在GPL许可证下发布了各自的版本,允许Lush的开发与发行。Yann LeCun、Leon Bzottou和Jie Huang-Fu在NEC研究院完成了将SN变为Lush的工作。

    下边是SN和Lush的各个前身的家族图谱书:

1.7 Lush代表什么?

    Lush应该代表“Lisp Universal SHell”(Lisp通用解释器)或者一些类似的东西。但是英语词典告诉我们另一个故事。根据世纪大词典1914版的说法,Lush在英语里有4个主要的意思:

    对于我们中的一些人,Lush当然看起来是新鲜的、华丽的、有趣的、有活力的、灵活的、成熟的和令人激动不已的。

    对其他人,它看起来可能是不活跃的、没有活力的和值得怀疑的。

    怎么看由你。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!