球拍(编程语言)
![]() | |
![]() Linux上的Drracket
| |
范例 | 多范式:功能,命令,逻辑,元,模块化,面向对象,反射性 |
---|---|
家庭 | Lisp |
设计 | PLT Inc. |
开发人员 | PLT Inc. |
首先出现 | 1995年1月28日 |
稳定版本 | 8.11.1 ![]() |
打字学科 | 动态,静态,强 |
平台 | X86 , PowerPC , SPARC , MIPS , ARM |
作业系统 | 跨平台 |
执照 | MIT或Apache 2.0 |
文件名扩展 | .rkt |
网站 | 球拍lang .org |
主要实施 | |
球拍,球拍球拍到JavaScript(ES6)编译器,使用Rpython的球拍实现。 | |
方言 | |
打字球拍,frime,懒惰的球拍,涂鸦 | |
被影响 | |
艾菲尔,计划 | |
受影响 | |
clojure ,生锈,方案(R6RS) |
球拍是一种通用,多范式编程语言和一个多平台发行版,包括球拍语言,编译器,大型标准库, IDE ,开发工具,以及一组其他语言,包括打字球拍(包括球拍的姐妹语言)带有静态类型检查器),Swindle,Frime,Lazy Concet,R5RS和R6RS方案,涂鸦,Datalog,Racklog, Algol 60和几种教学语言。
球拍语言是LISP的现代方言,也是方案的后代。它被设计为编程语言设计和实施的平台。除了核心球拍语言外,球拍还用于参考编程语言的家族和一组支持球拍开发的工具。球拍还用于脚本,计算机科学教育和研究。
球拍平台提供了球拍语言的实现(包括运行时系统,库和编译器,支持多种编译模式:机器代码,机器独立,解释和JIT)以及Drracket集成的开发环境(IDE)(IDE) 。 “球拍”由ProgramByDesign Outreach计划使用,该计划旨在将计算机科学变成“文科课程中必不可少的一部分”。
核心球拍语言以其广泛的宏观系统而闻名,该系统可以创建嵌入式和特定领域的语言,类或模块等语言构造以及带有不同语义的球拍的单独方言。
该平台分发是根据Apache 2.0和MIT许可证分配的免费和开源软件。社区编写的扩展和包裹可以上传到球拍的包装目录。
历史
发展
Matthias Felleisen在1990年代中期创立了PLT Inc.,首先是一个研究小组,不久之后是一个专门为新手程序员生产教学材料的项目(讲座,练习/项目,软件)。 1995年1月,该小组决定根据方案开发一个教学的编程环境。马修·弗拉特( Matthew Flatt)从libscheme, wxwidgets和其他一些免费系统中拼凑了Mred Mred Mred Mred。在随后的几年中,包括Flatt, Robby Findler , Shriram Krishnamurthi ,Cormac Flanagan和许多其他团队制作了新手计划程序员的编程环境以及用于软打字的研究环境。 Drscheme支持的主要开发语言被命名为PLT计划。
同时,团队开始为高中教师开展研讨会,培训他们在计划设计和功能编程中进行培训。与这些老师及其学生一起进行现场测试提供了指导发展的重要线索。
在接下来的几年中,PLT添加了教学语言,代数步进,透明的读取 - eval-print循环,基于构造函数的打印机以及许多其他创新,为Drscheme Drscheme提供了一种,从而产生了应用质量的教学计划开发环境。到2001年,核心团队(Felleisen,Findler,Flatt,Krishnamurthi)还根据其教学理念编写并出版了他们的第一本教科书《如何设计计划》 。
球拍宣言详细介绍了推动球拍发展的原则,介绍了设计过程背后的评估框架,并详细介绍了未来改进的机会。
版本历史记录
第一代PLT方案修订介绍了用于大型模块和类的大型编程的功能。版本42引入的单元 - 一流的模块系统 - 以补充大规模开发的类。类系统获得了功能(例如Java式接口),并且在这些版本中也丢失了几个功能(例如多个继承)。该语言在许多连续的版本中演变,并在53版中获得了里程碑的流行,从而导致了广泛的工作和以下版本100,这将等同于当前流行版本系统中的“ 1.0”版本。
下一个主要修订版名为200版,该版本引入了与宏合作的新默认模块系统。特别是,模块系统可确保分开运行时和编译时计算以支持“语言塔”。与单元不同,这些模块不是一流的对象。
版本300向类系统引入了Unicode支持,外国库支持和改进。后来,300系列通过添加JIT编译器和切换到默认的世代垃圾集合,提高了语言运行时的性能。
到下一个主要版本,该项目已切换到更常规的基于序列的版本编号。版本4.0介绍了#lang
速记,以指定模块所编写的语言。此外,修订引入了不变的对和列表,对细粒并行性的支持以及静态类型的方言。
2010年6月7日,PLT计划更名为球拍。重命名与版本5.0的发行版相吻合。随后,使用所有平台上的本机UI工具包,在5.1版中的C ++中重写了图形用户界面(GUI)后端。版本5.2包括一个背景语法检查工具,一个新的绘图库,数据库库和新的扩展替补。版本5.3包括一个新的supdule功能,可选加载的模块,新的优化工具,一个JSON库和其他功能。版本5.3.1引入了Drracket的重大改进:默认情况下打开了背景语法检查器,并添加了新的文档预览工具。
在6.0版中,球拍发布了其第二代软件包管理系统。作为此开发的一部分,重新组织了主要的Drracket和球拍存储库,并将其分成大量的小软件包,使得可以安装最小的球拍并仅安装所需的软件包。
球拍的第7版已发布,新的宏观扩展器用球拍编写,这是支持迁移到Chez Schemementime系统系统并支持多个运行时系统的准备工作。 2019年11月19日,球拍7.5发布。球拍7.5的许可证不太限制。他们现在使用Apache 2.0许可证或MIT许可证。
2021年2月13日,球拍8.0发布。球拍8.0标志着第一个发行版,其中带有CHEZ计划运行时系统的球拍(称为球拍CS)是默认实现。球拍CS更快,更易于维护和开发,与现有的球拍程序向后兼容,并且具有更好的并行垃圾收集。
特征
球拍的核心语言包括宏,模块,词汇封闭,尾巴呼叫,划界连续性,参数(流体变量),软件合同,绿色线程和操作系统线程等。该语言还带有原语,例如事件空间和托管人,这些语言控制资源管理,并使该语言像加载和管理其他程序的操作系统一样起作用。该语言的进一步扩展是使用强大的宏系统创建的,该系统与模块系统一起,自定义解析器可以控制语言的所有方面。球拍中的大多数语言构造以基本语言的宏实现。其中包括一个Mixin类系统,一个像ML模块系统中不透明属性的组件(或模块)系统以及模式匹配。
此外,该语言具有高阶编程语言的第一个合同系统。球拍的合同系统灵感来自Eiffel合同工作的设计,并将其扩展到高阶值,例如一流的功能,对象,参考单元等。例如,可以确保通过合同检查的对象最终调用合同检查。
球拍包括字节码和JIT (JIT)编译器。字节码编译器会产生由球拍虚拟机运行的内部字节码格式,并且JIT编译器在运行时将字节码转换为机器代码。
自2004年以来,该语言还与Planet一起发货,Planet是一个集成到模块系统的软件包管理器,以便可以透明地导入和使用第三方库。此外,Planet还具有内置版本控制策略,可防止依赖地狱。
在2014年底,球拍的大部分代码已移至与主代码库分开的新包装系统。这个新的包装系统由名为RACO的客户程序服务。新的软件包系统提供的功能少于行星。杰伊·麦卡锡(Jay McCarthy)在“球拍博客”上的博客文章解释了更改的理由以及如何复制较旧的系统。
综合语言可扩展性和宏
LISP家族中最清楚地区分球拍的功能是其集成的语言扩展性功能,这些功能支持构建新的领域特定和通用语言。球拍的可扩展性功能内置在模块系统中,以允许对语法的上下文敏感和模块级的控制。例如,可以覆盖#%app
句法形式以更改功能应用程序的语义。同样, #%module-begin
形式允许对整个模块进行任意静态分析。由于任何模块都可以通过#lang
符号用作语言,因此这实际上意味着可以对语言的任何方面进行编程和控制。
模块级的可扩展性功能与类似方案的卫生宏系统相结合,该系统提供的功能比LISP的S-表达操纵系统更多的功能,该方案84的卫生扩展Syntax Macros或R5RS的语法规则。确实,可以说宏系统是编译器扩展程序的精心调整的应用程序编程接口(API)。使用此编译器API,程序员可以以使其与内置语言构造完全没有区别的方式添加功能和整个域特定语言。
球拍中的宏系统已用于构建整个语言方言。这包括键入的球拍,这是一个逐渐键入的球拍方言,可以将迁移从未型到键入代码,懒惰的球拍(一种带有懒惰评估的方言)和Hackett,将Haskell和球拍结合在一起。教学编程语言Pyret最初是在球拍中实现的。
其他方言包括FRTIME(功能性反应性编程),涂鸦(文档语言),幻灯片(演示语言)和多种教育语言。
球拍的核心分布提供了库,以帮助开发编程语言。此类语言不仅限于基于S-表达的语法。除了常规的基于可读取的语法扩展外,指令#lang
还可以调用任意解析器,可以使用解析器工具库来实现。有关这种语言的示例,请参见球拍逻辑编程。
编程环境
该语言平台提供了一个自我托管的IDE ,名为Drracket,基于延续的Web服务器,图形用户界面和其他工具。作为带有库(如常见脚本语言)库的可行脚本工具,它可用于拼写脚本。它可以解析命令行参数并执行外部工具。
Drracket IDE
Drracket(以前是Drscheme)被广泛用于教授计划或球拍的入门计算机科学课程中,并因其简单性和吸引初学者程序员而受到称赞。 IDE最初是为了与Teacheme一起使用的!东北大学的推广工作(现为programbydesign ),以及许多附属大学,以吸引高中生进入大学一级的计算机科学课程。
编辑器为语法和运行时错误,括号匹配,调试器和代数步进提供了突出显示。它的学生友好功能包括对多个“语言级别”的支持(初学者,中级学生等)。它还为高级程序员提供了集成的库支持和复杂的分析工具。此外,模块浏览器支持面向模块的编程,轮廓视图,集成的测试和覆盖范围测量以及重构支持。它提供了集成的,上下文敏感的访问权限,以访问名为“帮助台”的广泛的超链接帮助系统。
drracket可用于Windows , MacOS , Unix和Linux ,其中X Window System和程序在所有这些平台上都相似。
代码示例
这是一个微不足道的Hello World节目:
#lang racket
"Hello, World!"
运行此程序会产生输出:
- “你好世界!”
这是一个略微琐碎的程序:

#lang racket
(require 2htdp/image)
(let sierpinski ([n 8])
(if (zero? n)
(triangle 2 'solid 'red)
(let ([t (sierpinski (- n 1))])
(freeze (above t (beside t t))))))
该程序取自球拍网站,绘制了一个嵌套到深度8的Sierpinski三角形。
使用#lang
指令,可以用不同的方言来编写源文件。这是类型球拍中的阶乘程序的一个示例,这是一个静态打字的球拍方言:
#lang typed/racket
(: fact (Integer -> Integer))
(define (fact n)
(if (zero? n) 1 (* n (fact (- n 1)))))
实施
球拍目前有两个实现。在各种体系结构上都支持Linux,Windows和MacOS,并在第8.8版(2023)中得到支持。默认实现使用CHEZ方案增量编译器和运行时。替代实现会生成无独立的字节码,并使用即时汇编来生成加载机器代码。 [1]
此外,还有实验实现:
- congetscript是JavaScript(ES6)编译器的实验球拍。它允许程序员同时使用JavaScript和球拍的生态系统,并旨在使这种互操作性尽可能平滑。
- Pycket是使用Rpython框架生成的球拍实现。
应用和实际用途
除了具有编程语言理论的基础之外,球拍还设计为生产系统的通用语言。因此,球拍发行版具有涵盖系统和网络编程的广泛库,网络开发,基础操作系统的统一接口,动态的外部功能接口,正则表达式的几种口味,lexer/parser生成器,逻辑编程,逻辑编程和一个完整的GUI框架。
球拍具有一些对商业语言有用的功能,其中包括在Windows,Macos和Unix下编译独立可执行文件,该功能, MACOS和UNIX(集成开发环境(IDE)(IDE))以及单元测试框架中包含的探险仪和调试器。
球拍已用于商业项目和Web应用程序。一个值得注意的例子是黑客新闻网站,该网站在ARC上运行,该网站是在球拍中开发的。顽皮的狗在几种视频游戏中都将其用作脚本语言。
球拍被用来通过Bootstrap计划中的游戏设计来教学学生代数。