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