Euphoria语言
Euphoria是由加拿大安大略省多伦多Rapid Deployment Software公司Robert Craig开发的编程语言[2]。最初在Atari ST平台上开发但是没有公布[3], 第一个商业版本是在 16 位DOS平台的运行的[4],并且是专有软件。 2006 年,随着版本 3 的发布, Euphoria 成为开源软件[5]。 openEuphoria Group 继续管理和开发该项目[6]。 2010 年 12 月,openEuphoria Group 发布了 openEuphoria 的第 4 版[7]和它的吉祥物以及新的特性。 OpenEuphoria 目前支持Windows 、 Linux 、 macOS和伯克利软件包(BSD)的三种版本。
![]() | |
编程范型 | 指令式编程 |
---|---|
設計者 | Jeremy Cowgar, Robert Craig (original), Matt Lewis, Derek Parnell |
實作者 | openEuphoria Group |
发行时间 | 1993年 |
当前版本 |
|
型態系統 | static, dynamic |
操作系统 | Cross-platform: Win32, Linux, macOS, FreeBSD, NetBSD, OpenBSD |
許可證 | BSD |
文件扩展名 | .e, .ex, .exw, .edb |
網站 | openeuphoria |
啟發語言 | |
BASIC | |
影響語言 | |
Phix |
Euphoria 是一种通用的指令式解释型高级语言。翻译器生成C源代码,并且支持GNU 编译器套装(GCC) 和Watcom C/C++ 编译器。而且,Euphoria 程序可以创建独立的可执行文件[8]。支持包括 Win32lib [9]、wxWidgets[10] 、 GTK+ [11]和IUP [12]在内的众多图形用户界面(GUI) 库。 Euphoria 有一个简单的内置数据库[13]和各种其他数据库的包装库[14]。
概述
历史
Euphoria 是Robert Craig 作为一种从零开始开发编程语言的个人项目在Atari Mega-ST上创建的编程语言[2] [3]。 该语言的许多设计思想都来自于 Craig 在多伦多大学的计算机科学的硕士论文[15]。 Craig 的论文深受John Backus在函数式编程(FP) 语言方面工作的影响[15]。
Craig 将他最初的 Atari 实现移植到 16 位DOS平台,并于 1993 年 7 月作为专有软件首次发布Euphoria 1.0[4]。最初的 Atari 实现被 Craig 描述为“原始”[16] 并且尚未公开发布。 Euphoria 由 Craig 通过他的公司快速部署软件 (RDS) 和网站 Rapideuphoria.com 继续开发和发布[2]。2006年10月,RDS 发布Euphoria 3版,并宣布今后 Euphoria 将在开源软件许可下免费分发[5]。
RDS 继续开发 Euphoria,并于2007 年 8 月发布了 3.1.1 版[15][17]。随后,RDS 单方面停止了 Euphoria 的开发,openEuphoria Group 接管了正在进行的开发[6]。 openEuphoria Group 于 2010 年 12 月发布了版本 4,并公布了 openEuphoria 项目的新徽标和吉祥物[18]。
3.1.1 版仍然是一个重要的里程碑版本,是 Euphoria 支持DOS的最后一个版本[19]。
Euphoria 是End-User Programming with Hierarchical Objects for Robust Interpreted Applications 的首字母缩写词,尽管有人怀疑这是不一个缩略词。[來源請求]
Euphoria 解释器最初是用C编写的。在2004年11月发布的Euphoria 2.5中[15],解释器分为两部分:前端解析器和后端解释器。前端现在是用 Euphoria 编写的(并与 Euphoria-to-C 转换器和 Binder 一起使用)。主要的后端程序和运行时库是用 C 编写的。
特征
Euphoria 的设计和开发实现以下设计目标和特性:
执行模式
使用
Euphoria 旨在迅速促进不同类型的动态数据集处理,它尤其适用于字符串和图像处理。 Euphoria 已被用于人工智能、数学研究、编程教学以及实现涉及数千个字符的字体[來源請求]。Euphoria 解释器的很大一部分是用 Euphoria 编写的。
数据类型
Euphoria 有两种基本数据类型:
- Atom – 一个数字,用 31 位有符号整型或 64 位IEEE 浮点型实现。 Euphoria 根据当前值在整数和浮点表示之间动态变化。
- Sequence – 具有零个或多个元素的数组,每个元素可能是一个Atom或另一个Sequence。Sequence中元素的数量不是固定的(即不必声明数组的大小)。程序可以在运行时根据需要添加或删除元素。内存分配-释放由引用计数自动处理。使用方括号括起来的索引值引用单个元素。Sequence中的第一个元素的索引为
[1]
。嵌入Sequence中的元素由附加带括号的索引值引用,X[3][2]
指的是作为X的第三个元素的Sequence中包含的第二个元素。序列的每个元素都是一个Object类型(见下文) .
Euphoria 有两种额外的预定义数据类型:
- Integer – 一种atom ,31位有符号整数,取值范围是 -1073741824 到 1073741823(即-230到230-1)。Integer数据类型比Atom数据类型更有效率,但和Atom的取值范围不同。字符存储为整数,例如,在编码ASCII中
'A'
编码为65。 - Object – 一种通用数据类型,它可能包含上述任何一种(即atom、sequence或integer ),并且可以在运行时更改为另一种类型。
没有字符串数据类型。字符串由Integer的Sequence表示。由于文字字符串在编程中非常常用,Euphoria 将双引号括起来的字符解释为整数序列。因此
"ABC"
在解释器看来是与下列代码相同:
{'A', 'B', 'C'}
这与以下相同:
{65, 66, 67}
Hello, World!
puts(1, "Hello, World!\n")
例子
程序注释以双连字符--
开头并直至行尾。
以下代码在一组项目中查找旧项目。如果找到,它将移除这一结果并将后一个元素连接上前一个元素。请注意,Sequence中的第一个元素的索引为[1]
,$
表示序列的长度(即元素总数)。
global delete_item(object old,Sequence group) integer pos -- 代码开始 -- pos =find(old,group) if pos > 0 then group = group[1 .. pos-1] & group[pos+1 .. $] end if return group end function
对上述示例的以下修改将实现旧项目替换为新项目。由于变量old和new已被定义为Object,它们可以是Atom或Sequence。不需要类型检查,因为该函数可以处理Sequence中任意类型的任意数据,并且不需要外部库。
global replace_item(Object old,Object new,Sequence group) integer pos -- 代码开始 -- pos =find(old,new) if pos > 0 then group[pos] = new end if return group end function
此外,它不包含指针并能够自动检查下标,因此不存在函数越界访问。另外,Euphoria不需要显式分配或释放内存,因此没有内存泄漏的机会。
group = group[1 .. pos-1] & group[pos+1 . . $]
这行显示了一些Sequence处理特性。一个Sequence可能包含一组任何类型的数据,这个Sequence可以被切片(以获取Sequence中数据的子集),Sequence可以在表达式中链接并不需要特殊函数。
参数传递
程序中的参数总是值传递;不提供引用传递的特性。但是,参数允许在内部修改(例如函数内调用)。由于Sequence有自动写入时复制语法,因此可以非常有效地实现这一点。换句话说,当Sequence传递给函数时,最初只传递对它的引用,但在函数修改此Sequence時,會复制該Sequence,并且函数仅在副本更新数据。
类似的语言
参考文献
- ^ OpenEuphoria: 4.1.0 Latest Mar 1, 2021. 2021年3月1日 [2023年4月13日].
- ^ 2.0 2.1 2.2 RapidEuphoria homepage. [2010-12-30]. (原始内容存档于2012-07-11).
- ^ 3.0 3.1 RapidEuphoria forum, 2002-09-10 by Robert Craig. [2010-12-30]. (原始内容存档于2011-07-16).
- ^ 4.0 4.1 RapidEuphoria forum, 2006-10-18 16:44 by Robert Craig. [2010-12-30]. (原始内容存档于2011-07-16).
- ^ 5.0 5.1 RapidEuphoria forum, 2006-10-18 1:19 by Robert Craig. [2010-12-30]. (原始内容存档于2011-07-16).
- ^ 6.0 6.1 openEuphoria group homepage. [2010-12-30]. (原始内容存档于2012-07-18).
- ^ openEuphoria download page. [2010-12-30]. (原始内容存档于2012-06-18).
- ^ 8.0 8.1 8.2 openEuhporia manual, Binding and Shrouding. [2011-01-07]. (原始内容存档于2012-04-16).
- ^ Euphoria Win32Lib project at Sourceforge. [2010-12-30]. (原始内容存档于2012-01-14).
- ^ Euphoria wxEuphoria project at Sourceforge. [2010-12-30]. (原始内容存档于2012-06-24).
- ^ Euphoria GTK+ project at Sourceforge. [2010-12-30]. (原始内容存档于2012-07-08).
- ^ Euphoria IUP Project by Jeremy Cowgar. [2010-12-30]. (原始内容存档于2012-07-23).
- ^ openEuphoria manual, Database. [2010-12-30]. (原始内容存档于2012-03-14).
- ^ openEuphoria wiki, Database Interfaces. [2011-01-02]. (原始内容存档于2012-03-14).
- ^ 15.0 15.1 15.2 15.3 RapidEuphoria website, release notes. [2010-12-30]. (原始内容存档于2012-07-14).
- ^ RapidEuphoria forum, 2 Mar 1998 13:04 by Robert Craig. [2010-12-30]. (原始内容存档于2011-07-16).
- ^ RapidEuphoria news. [2010-12-30]. (原始内容存档于2010-12-16).
- ^ openEuphoria release notes. [2010-12-30]. (原始内容存档于2011-07-27).
- ^ openEuhporia manual, Platform Specific Issues. [2010-12-30]. (原始内容存档于2012-04-16).
- ^ openEuphoria roadmap. [2010-12-30]. (原始内容存档于2012-03-14).
外部链接
免费下载适用于各种平台、软件包、Windows IDE、Windows API 库、Linux 和 Windows 的跨平台 GTK3 包装器、图形库(DOS、OpenGL 等)的 Euphoria。
- 官方网站OpenEuphoria
- 官方网站RapidEuphoria
- openEuphoria Wiki (页面存档备份,存于互联网档案馆)
- openEuphoria 论坛 (页面存档备份,存于互联网档案馆)
- OpenEuphoria · GitHub (页面存档备份,存于互联网档案馆)开发存储库。
- Using Euphoria