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

```
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，並且函數僅在副本更新數據。

## 類似的語言

* Lua
* Phix （頁面存檔備份，存於網際網路檔案館）
* Python
* REBOL
* Ruby

## 參考文獻

## 外部連結

免費下載適用於各種平台、軟體包、Windows IDE、Windows API 庫、Linux 和 Windows 的跨平台 GTK3 包裝器、圖形庫（DOS、OpenGL 等）的 Euphoria。

* 官方網站 OpenEuphoria
* 官方網站 RapidEuphoria
* openEuphoria Wiki （頁面存檔備份，存於網際網路檔案館）
* openEuphoria 論壇 （頁面存檔備份，存於網際網路檔案館）
* OpenEuphoria・GitHub （頁面存檔備份，存於網際網路檔案館）開發存儲庫。
* Using Euphoria