Euphoria语言

Euphoria是由加拿大安大略省多伦多Rapid Deployment Software公司Robert Craig开发的编程语言。最初在Atari ST平台上开发但是没有公布，第一个商业版本是在 16 位DOS平台的运行的，并且是专有软件。2006 年，随着版本 3 的发布， Euphoria 成为开源软件。openEuphoria Group 继续管理和开发该项目。2010 年 12 月，openEuphoria Group 发布了 openEuphoria 的第 4 版和它的吉祥物以及新的特性。OpenEuphoria 目前支持Windows、 Linux、 macOS和伯克利软件包（BSD）的三种版本。

Euphoria 是一种通用的指令式解释型高级语言。翻译器生成C源代码，并且支持GNU 编译器套装(GCC) 和Watcom C/C++ 编译器。而且，Euphoria 程序可以创建独立的可执行文件。支持包括 Win32lib、wxWidgets、 GTK+ 和IUP 在内的众多图形用户界面(GUI) 库。Euphoria 有一个简单的内置数据库和各种其他数据库的包装库。

## 概述

Euphoria 是一种通用的过程式编程，它通过多种方式努力使语言简洁、易读、适应快速开发、高效。

- 简洁——它仅使用四种内置数据类型（见下文）并能够实现垃圾回收。
- 易读——它的语法倾向于使用简单的英语关键字表示结构而不是用标点符号来表示。
- 快速开发——解释器有利于原型设计和增量开发。
- 高效——高效的引用计数正确处理循环引用。

## 历史

Euphoria 是Robert Craig 作为一种从零开始开发编程语言的个人项目在Atari Mega-ST上创建的编程语言。该语言的许多设计思想都来自于 Craig 在多伦多大学的计算机科学的硕士论文。Craig 的论文深受John Backus在函数式编程(FP) 语言方面工作的影响。

Craig 将他最初的 Atari 实现移植到 16 位DOS平台，并于 1993 年 7 月作为专有软件首次发布Euphoria 1.0。最初的 Atari 实现被 Craig 描述为“原始” 并且尚未公开发布。Euphoria 由 Craig 通过他的公司快速部署软件 (RDS) 和网站 Rapideuphoria.com 继续开发和发布。2006年10月，RDS 发布Euphoria 3版，并宣布今后 Euphoria 将在开源软件许可下免费分发。

RDS 继续开发 Euphoria，并于2007 年 8 月发布了 3.1.1 版。随后，RDS 单方面停止了 Euphoria 的开发，openEuphoria Group 接管了正在进行的开发。openEuphoria Group 于 2010 年 12 月发布了版本 4，并公布了 openEuphoria 项目的新徽标和吉祥物。

3.1.1 版仍然是一个重要的里程碑版本，是 Euphoria 支持DOS的最后一个版本。

Euphoria 是End-User Programming with Hierarchical Objects for Robust Interpreted Applications 的首字母缩写词，尽管有人怀疑这是不一个缩略词。

Euphoria 解释器最初是用C编写的。在2004年11月发布的Euphoria 2.5中，解释器分为两部分：前端解析器和后端解释器。前端现在是用 Euphoria 编写的（并与 Euphoria-to-C 转换器和 Binder 一起使用）。主要的后端程序和运行时库是用 C 编写的。

## 特征

Euphoria 的设计和开发实现以下设计目标和特性：

- 易于学习且具有一致的高级结构（比BASIC语言更容易）
- 实现 32 位内存以避免复杂的内存管理和大小寻址限制
- 支持Debugging和运行时错误处理
- 下标和类型检查
- 松散和严格的变量类型
- 面向对象编程（用户定义或其他）
- 解释型语言，具有自动内存管理和垃圾回收
- 异构集合类型（序列）
- DOS图形库（Euphoria 直到版本 3.1.1一直支持）
- 调试器
- 综合数据库
- 低级内存处理
- 直接包装（或访问） C库

## 执行模式

- 解释型语言
- 用于独立可执行文件或动态链接C 语言翻译器(E2C)
- 字节码编译器和解释器（shrouder）
- Binder将 Euphoria 源代码绑定到解释器以创建可执行文件。
- 读取-求值-输出循环(REPL) 版本在 openEuphoria计划中。

## 使用

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]`，`$`表示序列的长度（即元素总数）。

```
<span style="color:blue;">global</span> delete_item（<span style="color:magenta;">object</span> old，<span style="color:magenta;">Sequence</span> group）
  <span style="color:magenta;">integer</span> pos
      <span style="color:red;">-- 代码开始 --</span>
  pos =<span style="color:magenta;">find</span>(old,group)
  <span style="color:blue;">if</span> pos > 0 <span style="color:blue;">then</span>
    group = group[1 .. pos-1] & group[pos+1 .. $]
  <span style="color:blue;">end if
  return</span> group
<span style="color:blue;">end function</span>
```

对上述示例的以下修改将实现旧项目替换为新项目。由于变量old和new已被定义为Object，它们可以是Atom或Sequence。不需要类型检查，因为该函数可以处理Sequence中任意类型的任意数据，并且不需要外部库。

```
<span style="color:blue;">global</span> replace_item（<span style="color:magenta;">Object</span> old,<span style="color:magenta;">Object</span> new,<span style="color:magenta;">Sequence</span> group）
  <span style="color:magenta;">integer</span> pos
      <span style="color:red;">-- 代码开始 --</span>
  pos =<span style="color:magenta;">find</span>(old,new)
  <span style="color:blue;">if</span> pos > 0 <span style="color:blue;">then</span>
    group[pos] = new
  <span style="color:blue;">end if
  return</span> group
<span style="color:blue;">end function</span>
```

此外，它不包含指针并能够自动检查下标，因此不存在函数越界访问。另外，Euphoria不需要显式分配或释放内存，因此没有内存泄漏的机会。

```
group = group[1 .. pos-1] & group[pos+1 . . $]
```

这行显示了一些Sequence处理特性。一个Sequence可能包含一组任何类型的数据，这个Sequence可以被切片（以获取Sequence中数据的子集），Sequence可以在表达式中链接并不需要特殊函数。

## 参数传递

程序中的参数总是值传递；不提供引用传递的特性。但是，参数允许在内部修改（例如函数内调用）。由于Sequence有自动写入时复制语法，因此可以非常有效地实现这一点。换句话说，当Sequence传递给函数时，最初只传递对它的引用，但在函数修改此Sequence时，会复制该Sequence，并且函数仅在副本更新数据。

## 类似的语言

- Lua
- Phix
- Python
- REBOL
- Ruby

## 外部链接

免费下载适用于各种平台、软件包、Windows IDE、Windows API 库、Linux 和 Windows 的跨平台 GTK3 包装器、图形库（DOS、OpenGL 等）的 Euphoria。

- openeuphoria.orgOpenEuphoria
- www.rapideuphoria.comRapidEuphoria
- openEuphoria Wiki
- openEuphoria 论坛
- OpenEuphoria · GitHub 开发存储库。
- Using Euphoria

## 基本资料

- 日语原文：Euphoria
- 编程范型：指令式编程
- 发行日期：1993年
- 设计者：Jeremy Cowgar, Robert Craig (original), Matt Lewis, Derek Parnell
- 开发者： openEuphoria Group
- 软件版本周期：4.0.5
- 软件版本周期：2012年10月19日
- 类型系统：static, dynamic
- 操作系统：Cross-platform: Win32, Linux, macOS, FreeBSD, NetBSD, OpenBSD
- 许可证：BSD
- 文件扩展名：.e, .ex, .exw, .edb
- 受影响于：BASIC
- 施影响于： Phix