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 的首字母縮寫詞，儘管有人懷疑這是不一個縮略詞。date=August 2013
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 已被用於人工智能、數學研究、編程教學以及實現涉及數千個字符的字體date=June 2015。Euphoria 解釋器的很大一部分是用 Euphoria 編寫的。

**數據類型**
Euphoria 有兩種基本數據類型：
 Atom – 一個數字，用 31 位有符號整型或 64 位IEEE 浮點型實現。 Euphoria 根據當前值在整數和浮點表示之間動態變化。
 Sequence – 具有零個或多個元素的數組，每個元素可能是一個Atom或另一個Sequence。Sequence中元素的數量不是固定的（即不必聲明數組的大小）。程序可以在運行時根據需要添加或刪除元素。內存分配-釋放由引用計數自動處理。使用方括號括起來的索引值引用單個元素。Sequence中的第一個元素的索引為1。嵌入Sequence中的元素由附加帶括號的索引值引用， X32指的是作為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 = group1 .. pos-1 & grouppos+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
grouppos = new
end if
return group
end function
此外，它不包含指針並能夠自動檢查下標，因此不存在函數越界訪問。另外，Euphoria不需要顯式分配或釋放內存，因此沒有內存洩漏的機會。
group = group1 .. pos-1 & grouppos+1 . . $
這行顯示了一些Sequence處理特性。一個Sequence可能包含一組任何類型的數據，這個Sequence可以被切片（以獲取Sequence中數據的子集），Sequence可以在表達式中鏈接並不需要特殊函數。

**參數傳遞**
程序中的參數總是值傳遞；不提供引用傳遞的特性。但是，參數允許在內部修改（例如函數內調用）。由於Sequence有自動寫入時複製語法，因此可以非常有效地實現這一點。換句話說，當Sequence傳遞給函數時，最初只傳遞對它的引用，但在函數修改此Sequence時，會複製該Sequence，並且函數僅在副本更新數據。

**類似的語言**
 Lua-  Phix date=20210305092727 - Python- REBOL- Ruby

**參考文獻**

**外部鏈接**
免費下載適用於各種平臺、軟件包、Windows IDE、Windows API 庫、Linux 和 Windows 的跨平臺 GTK3 包裝器、圖形庫（DOS、OpenGL 等）的 Euphoria。 - openeuphoria.orgOpenEuphoria- www.rapideuphoria.comRapidEuphoria-  openEuphoria Wiki date=20210225112039 -  openEuphoria 論壇 date=20210723033941 -  OpenEuphoria · GitHub date=20210719112742 開發存儲庫。-  Using Euphoria