Euphoria (язык программирования): различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Опечатка "типам"
Метки: через визуальный редактор с мобильного устройства из мобильной версии
 
(не показано 79 промежуточных версий 21 участника)
Строка 1: Строка 1:
{{Значения|Euphoria}}
{{Значения|Euphoria}}
{{Карточка языка программирования
{{Карточка языка программирования
|name = Euphoria
| name = Euphoria
|logo = [[Файл:OpenEuphoria logo.png|OpenEuphoria logo|Логотип openEuphoria]]
| logo = OpenEuphoria logo.png
|paradigm = [[Процедурное программирование|процедурный]]
| paradigm = [[Процедурное программирование|процедурный]]
|semantics = [[Императивное программирование|императивный]]
| semantics = [[Императивное программирование|императивный]]
|class = [[интерпретация]], интерпретация [[байт-код]]а, [[Транслятор|трансляция]] в [[Си (язык программирования)|Си]]
| class = [[Интерпретатор|интерпретация]], интерпретация [[байт-код]]а, [[Транслятор|трансляция]] в [[Си (язык программирования)|Си]]
|year = 1993
| year = 1993
|designer = Роберт Крейг (создатель) и Джереми Ковгар, Мэтт Льюис, Дерек Парнелл (разработчики версии 4)
| designer = Роберт Крейг (создатель) и Джереми Ковгар, Мэтт Льюис, Дерек Парнелл (разработчики версии 4)
|developer = [http://openeuphoria.org/ openEuphoria Group]
| developer = [http://openeuphoria.org/ openEuphoria Group]
| latest_release_version = 4.15.2<ref>{{Cite news|title=EuGTK 4.15.2 posted|url=https://openeuphoria.org/news/390.wc|accessdate=2022-04-05|archivedate=2021-01-30|archiveurl=https://web.archive.org/web/20210130014238/https://openeuphoria.org/news/390.wc}}</ref>
|latest_release_version = 4.0.3
|latest_release_date = 23 июня 2011 года
| latest_release_date = {{start date and age|2019|08|15}}
|latest_preview_version = 4.1.0
| latest_preview_version = 4.1 Beta 2
| typing = [[Статическая типизация|статическая]], [[Динамическая типизация|динамическая]]
|latest_preview_date = 8 мая 2011 года
| extension = .e, .ex, .exw, .edb
|typing = [[Статическая типизация|статическая]], [[Динамическая типизация|динамическая]]
| implementations =
|extension = .e, .ex, .exw, .edb
| dialects = RDS Euphoria, openEuphoria
|implementations =
| influenced_by = [[BASIC]], [[Си (язык программирования)|Си]]
|dialects = RDS Euphoria, openEuphoria
| influenced = [[Phix]]
|influenced_by = [[BASIC]], [[Си (язык программирования)|Си]]
| license = [[Открытое программное обеспечение|открытая]]
|influenced = [[Phix]]
|website = [http://openeuphoria.org/ openeuphoria.org]
| website = http://openeuphoria.org/
}}
}}


[[Файл:Mascot-200px.png|frame|[[Мангусты|Мангуст]] — талисман проекта openEuphoria]]
[[Файл:OpenEuphoria mascot 200px.png|frame|[[Мангусты|Мангуст]] — [[Персонаж-талисман|талисман]] проекта openEuphoria]]


'''Euphoria''' ({{IPA|[ju:ˈfɔ:riə]}}, юфо́ри, также [[Русский язык|рус.]] эйфори́я, ра́дость) — [[язык программирования]], созданный Робертом Крейгом (Rapid Deployment Software)<ref name=rehomepage /> в Канаде, [[Торонто]]. Первоначально язык был разработан (но не публиковался) для [[Atari ST]]<ref name=atari1 />. Первый публичный выпуск<ref name=firstversion /> предназначался для 32-битных машин (i386) с [[MS-DOS]] и был [[Проприетарное программное обеспечение|проприетарным]] (1993 год). В 2006 году с выходом версии 3<ref name=opensource /> проект Euphoria стал [[Открытое программное обеспечение|открытым]], и развивать его начало сообщество OpenEuphoria <ref name=oehomepage />, которое в декабре 2010 года выпустило 4-ю версию<ref name=oedownload /> с новым логотипом и талисманом<ref name=mascot />. В настоящий момент пакет OpenEuphoria доступен для [[Microsoft Windows]], [[Linux]], [[Mac OS X]] и трех BSD-систем ([[FreeBSD]], [[NetBSD]], [[OpenBSD]]).
'''Euphoria''' ({{IPA|[ju:ˈfɔ:riə]}}, юфо́ри, также [[Русский язык|рус.]] эйфори́я, ра́дость) — [[язык программирования]], созданный Робертом Крейгом (Rapid Deployment Software)<ref name=rehomepage /> в Канаде, [[Торонто]]. Название Euphoria это [[акроним]] для «End-User Programming with Hierarchical Objects for Robust Interpreted Applications».


Первый публичный выпуск<ref name=firstversion /> предназначался для 32-битных машин (i386) с [[MS-DOS]] и был [[Проприетарное программное обеспечение|проприетарным]] (1993 год). В 2006 году с выходом версии 3<ref name=opensource /> проект Euphoria стал [[Открытое программное обеспечение|открытым]], и развивать его начало сообщество OpenEuphoria <ref name=oehomepage />, которое в декабре 2010 года выпустило 4-ю версию<ref name=oever4news /> с новым логотипом и [[Персонаж-талисман|талисманом]]<ref name=mascot />. В настоящее время пакет OpenEuphoria версий 4.* выпускается для [[Microsoft Windows]], [[Linux]], [[Mac OS X]] и трёх BSD-систем ([[FreeBSD]], [[NetBSD]], [[OpenBSD]]).
Euphoria — [[Интерпретируемый язык программирования|интерпретируемый]] [[Императивное программирование|императивный]] язык [[Высокоуровневый язык программирования|высокого уровня]] общего назначения. C помощью [[транслятор]]а из исходного кода на Euphoria может быть сгенерирован исходный код на языке [[Си]], который далее подаётся в какой-либо из ряда доступных компиляторов, включая [[GCC]], [[OpenWatcom]] и др., для получения исполняемого файла или динамически подключаемой библиотеки. Программа Euphoria может также быть «связана»<ref name=binding /> с интерпретатором для получения самостоятельного [[Исполняемый файл|исполняемого файла]]. Поддерживается несколько [[GUI]]-библиотек, включая Win32lib<ref name=win32lib /> и [[Обёртка библиотеки|оберток]] для [[wxWidgets]]<ref name=wxeuphoria />, [[GTK+]]<ref name=GTK /> и [[IUP]]<ref name=IUP />. Euphoria имеет встроенную простую систему [[База данных|баз данных]]<ref name=database /> и [[Обёртка библиотеки|обертки]] для работы с другими типам баз данных<ref name=oedatabases />.


Euphoria — [[Интерпретируемый язык программирования|интерпретируемый]] [[Императивное программирование|императивный]] язык [[Высокоуровневый язык программирования|высокого уровня]] общего назначения. C помощью [[транслятор]]а из исходного кода на Euphoria может быть сгенерирован исходный код на языке [[Си (язык программирования)|Си]], который в свою очередь может быть скомпилирован в исполнияемый файл или динамическую библиотеку при помощи таких компиляторов, как [[GCC]], [[OpenWatcom]] и др. Программа Euphoria также может быть «связана»<ref name=binding /> с интерпретатором для получения самостоятельного [[Исполняемый файл|исполняемого файла]]. Поддерживается несколько [[GUI]]-библиотек, включая Win32lib<ref name=win32lib /> и «оберток» для [[wxWidgets]]<ref name=wxeuphoria />, [[GTK+]]<ref name=GTK /> и [[IUP]]<ref name=IUP />. Euphoria имеет встроенную простую систему [[База данных|баз данных]]<ref name=database /> и «обертки» для работы с другими типами баз данных<ref name=oedatabases />.
=== Обзор ===

Euphoria — [[Процедурное программирование|процедурный]] язык общего назначения, отличительными особенностями которого являются простота, удобочитаемость, быстрое развертывание и производительность.
== Обзор ==
Euphoria — [[Процедурное программирование|процедурный]] язык общего назначения, отличительными особенностями которого являются простота, удобочитаемость, быстрое развертывание и высокая производительность.
; Простота
; Простота
* Язык использует только четыре встроенных типа данных (см. ниже).
* Язык использует только четыре встроенных типа данных (см. ниже).
* Автоматическая [[сборка мусора]].
* Автоматическая [[Сборка мусора (программирование)|Сборка мусора]].
; Удобочитаемость
; Удобочитаемость
* Для отделения синтаксических конструкций используются простые ключевые слова из английского языка, а не знаки пунктуации.
* Для отделения синтаксических конструкций используются простые ключевые слова из английского языка, а не знаки пунктуации.
Строка 38: Строка 40:
* Euphoria [[Интерпретируемый язык программирования|интерпретируемый]] язык, что облегчает прототипирование и инкрементальную разработку.
* Euphoria [[Интерпретируемый язык программирования|интерпретируемый]] язык, что облегчает прототипирование и инкрементальную разработку.
; Производительность
; Производительность
* Euphoria использует эффективный [[Сборка мусора|сборщик мусора]] подсчитывающий ссылки, и корректно обрабатывающий циклические ссылки.
* Euphoria использует эффективный [[Сборка мусора (программирование)|сборщик мусора]] подсчитывающий ссылки, и корректно обрабатывающий циклические ссылки.


== История ==
== История ==
Разработка языка Euphoria началась с опытов Роберта Крейга<ref name=rehomepage /> на [[Atari ST|Atari Mega-ST]]<ref name=atari1 />. Многие идеи дизайна языка пришли из магистерской диссертации Крейга, защищённой им в [[Университет Торонто|Университете Торонто]]<ref name=renotes />. Диссертация была написана под влиянием работ [[Джон Бэкус|Джона Бэкуса]] по [[Функциональное программирование|функциональным]] языкам программирования<ref name=renotes />.
Разработка языка Euphoria началась с опытов Роберта Крейга<ref name=rehomepage /> на персональном компьютере [[Atari ST|Atari Mega-ST]]<ref name=atari1 />. Многие идеи дизайна языка пришли из магистерской диссертации Крейга, защищённой им в [[Университет Торонто|Университете Торонто]]<ref name=renotes />. Диссертация была написана под влиянием работ [[Джон Бэкус|Джона Бэкуса]] по [[Функциональное программирование|функциональным]] языкам программирования<ref name=renotes />.

Затем Крейг портировал оригинальную реализацию языка для Atari на 32-битную платформу машин с процессором 386 под управлением [[MS-DOS|Microsoft MS-DOS]] и выпустил первый пакет (версия 1.0) в июле 1993 года<ref name=firstversion /> под [[Проприетарное программное обеспечение|проприетарной]] лицензией, основав собственную компанию Rapid Deployment Softawre (RDS) по разработке и продаже интерпретатора Euphoria в варианте DOS32. Первоначальную реализацию для Atari Крейг называет «примитивной»<ref name=atari2 /> и не издавал ее публично. До 2006 года Крейг продолжал развивать и издавать Euphoria в своей компании (сайт rapideuphoria.com<ref name=rehomepage />), выпустив более десятка версий в сериях 1.* и 2.*. В октябре 2006 года RDS начала 3-ю<ref name=opensource /> серию Euphoria и объявила, что в дальнейшем Euphoria будет свободно распространяться по [[Открытое программное обеспечение|открытой]] лицензии. Итогом проприетарных серий 1 и 2 является
наличие зарегистрированных пользователей в 67 странах мира.


Затем Крейг портировал оригинальную реализацию языка для Atari на 32-битную платформу машин с процессором 386 под управлением [[MS-DOS|Microsoft MS-DOS]] и выпустил первый пакет (версия 1.0) в июле 1993 года<ref name=firstversion /> с [[Проприетарное программное обеспечение|проприетарной]] лицензией, основав собственную компанию Rapid Deployment Softawre (RDS) по разработке и продаже интерпретатора Euphoria в варианте DOS32. Первоначальную реализацию для Atari Крейг называет «примитивной»<ref name=atari2 /> и не публиковал её. До 2006 года Крейг продолжал развивать и издавать Euphoria в своей фирме (сайт rapideuphoria.com<ref name=rehomepage />), состоявшей из него самого и его жены Джанко Миура, выпустив более десятка версий в двух сериях, 1.* и 2.*. В октябре 2006 года RDS начала 3-ю<ref name=opensource /> серию Euphoria и объявила, что в дальнейшем Euphoria будет свободно распространяться по [[Открытое программное обеспечение|открытой]] лицензии. Итогом работы с проприетарными сериями 1 и 2 является сообщество зарегистрированных пользователей в 67 странах мира, включающее множество программистов, точное число которых известно только RDS, но на момент выпуска версии 2.5 значительно превышало тысячу.
Под непосредственным руководством RDS сообщество продолжало выпускать Euphoria, включая версию 3.1.1 (август 2007 года)<ref name=renotes /><ref name=renews />. После этого RDS постепенно отошла от руководства разработкой Euphoria, и дальнейшие усовершенствования и изменения вносятся сообществом OpenEuphoria<ref name=oehomepage /> под коллегиальным руководством. В декабре 2010 года<ref name=oenotes /> сообщество выпустило версию 4.0, положив начало 4-ой серии, теперь с новым логотипом, и учредив талисман проекта<ref name=mascot />.


Под непосредственным руководством RDS сообщество продолжало выпускать Euphoria, доведя пакет до версии 3.1.1 (август 2007 года)<ref name=renotes /><ref name=renews />. После этого RDS постепенно отошла от руководства разработкой Euphoria, и дальнейшие усовершенствования и изменения вносятся сообществом OpenEuphoria<ref name=oehomepage /> под коллегиальным руководством. В декабре 2010 года<ref name=oenotes /> сообщество выпустило версию 4.0, положив начало 4-й серии, теперь с новым логотипом и талисманом проекта<ref name=mascot />.
Версия 3.1.1 является важной вехой в развитии языка, так как это последняя версия, официально поддерживающая платформу DOS32 для машин с [[MS-DOS|Microsoft MS-DOS]]<ref name=oeplatform />, хотя и в версии 4 уже имеется множество наработанных новых решений для этой платформы. Версия 3.1.1 пока остаётся последней версией строгого классического направления, без goto и других "вольностей", появившихся в 4-ой.


Версия 3.1.1 является важной вехой в развитии языка, так как это последняя версия, официально поддерживающая платформу [[MS-DOS]]<ref name=oeplatform />. Версия 3.1.1 пока остаётся последней версией строгого классического направления, без "вольностей", появившихся в 4-й.
Версия 2.5 имеет интересную для русскоязычных пользователей подверсию с русскими и английскими ключевыми словами и неограниченным алфавитом для идентификаторов, разработанную с участием Крейга. Эта двуязычная версия развивается в России, где уже имеются интерпретаторы альфа-стадии версии 3.2ru классического направления. Необходимо отметить, что эти интерпретаторы работают и на русских версиях DOS, и на FreeDOS 1.0.


Краткий список новшеств, появившихся начиная с версии 4.0.0<ref name=whatsnew>{{citeweb|title=Что нового в версии 4.0|url=http://openeuphoria.org/docs/whatsnew4_0.html#_18_whatsnewin40|access-date=2012-08-17|archive-date=2012-01-10|archive-url=https://web.archive.org/web/20120110072939/http://openeuphoria.org/docs/whatsnew4_0.html#_18_whatsnewin40|deadlink=no}}</ref>:
Название Euphoria — это [[акроним]] для «End-User Programming with Hierarchical Objects for Robust Interpreted Applications».
* Добавлены директивы [[условная компиляция|условной компиляции]]
* Значительно расширена библиотека стандартных подпрограмм
* Добавлена возможность использовать подпрограммы выше их объявления в тексте ("ссылка вперед")
* Возможность инициализации переменной при её объявлении
* Многострочные комментарии
* Возвращаемое значение функции может быть проигнорировано (ранее возвращаемое значение должно было быть явно использовано, иначе выдавалась ошибка)
* Циклы с постусловием, со входом в середину тела цикла
* Оптимизированные встроенные подпрограммы для выполнения операций над рядами
* Метки, оператор goto
* Оператор switch
* [[Пространство имён (программирование)|Пространства имен]]
* Дополнительные модификаторы [[Область видимости|области видимости]]
и многое другое.


Интерпретатор языка Euphoria первоначально был написан на [[Си (язык программирования)|]]. Начиная с версии 2.5<ref name=renotes /> выпущенной в ноябре 2004 года, интерпретатор был разделен на две части: [[фронт-энд]]-[[Синтаксический анализатор|парсер]] и [[бэк-энд]]-интерпретатор. Фронт-энд (который также используется транслятором Euphoria-to-C и Binder’ом) в данный момент написан на Euphoria. В то же время главный бэк-энд и [[рантайм]]-библиотека написаны на [[Си (язык программирования)|Си]].
Интерпретатор языка Euphoria первоначально был целиком написан на [[Си (язык программирования)|Си]]. Начиная с версии 2.5<ref name=renotes />, выпущенной в ноябре 2004 года, интерпретатор был разделен на две части: [[Синтаксический анализатор|парсер]], написанный на Euphoria, и интерпретатор байт-кода, написанный на Си.


== Отличительные черты ==
== Отличительные черты ==
'''Euphoria''' задумывался и разрабатывался со следующими целями и отличительными чертами:
'''Euphoria''' задумывался и разрабатывался со следующими целями и отличительными чертами:


* Легкость в изучении и простота [[Высокоуровневый язык программирования|высокоуровневых]] конструкций (даже большая, чем например в языке [[BASIC]])
* Лёгкость в изучении и простота [[Высокоуровневый язык программирования|высокоуровневых]] конструкций
* Реализация «плоской» 32-битной модели памяти для [[MS-DOS]]-версии, для того чтобы избежать сложностей управления памятью и ограничения объектов по размеру и адресации
* Реализация «плоской» 32-битной модели памяти для [[MS-DOS]]-версии, позволяющая избежать сложностей управления памятью и ограничения объектов по размеру и адресации
* Поддержка отладки и обработки ошибок во время выполнения
* Поддержка отладки и обработки ошибок во время выполнения
* Контроль индексов и [[Типизация данных|проверка типов]]
* Контроль выхода за границы массивов
* Динамическая и строгая типизация переменных
* Динамическая и строгая типизация переменных
* Интерпретируемость с автоматическим управлением памяти и [[Сборка мусора (программирование)|сборкой мусора]]
* Программирование с помощью объектов как типов (определяемых пользователем или встроенных)
* Интерпретируемость с автоматическим управлением памяти и [[Сборка мусора|сборкой мусора]]
* Неоднородные динамические массивы ('''sequence''')
* Неоднородные динамические массивы ('''sequence''')
* Графическая библиотека [[DOS]] (Версии языка Euphoria вплоть до версии 3.1.1 включительно)
* Графическая библиотека [[DOS]] (Версии языка Euphoria вплоть до 3.1.1 включительно)
* Отладчик
* Отладчик
* Встроенная система баз данных
* Встроенная система баз данных
* Возможность низкоуровневого управление памятью (обычно используется при взаимодействии с кодом, находящимся в динамических библиотеках)
* Низкоуровневое управление памятью
* Простое и понятное [[Обёртка библиотеки|оборачивание библиотек]]
* Простое и понятное оборачивание библиотек


== Режимы выполнения ==
== Режимы выполнения ==
* [[Интерпретатор|Интерпретация]]
* [[Интерпретатор|Интерпретация]]
* Трансляция программы на язык [[Си (язык программирования)|Си]] с последующей компиляцией в самостоятельный исполняемый модуль или [[динамическая библиотека|динамическую библиотеку]]
* Трансляция программы на язык [[Си (язык программирования)|Си]] с последующей компиляцией в самостоятельный исполняемый модуль или [[динамическая библиотека|динамическую библиотеку]]
* Компилятция в [[байт-код]] ({{lang-en|shrouding}}, буквально — окутывание)<ref name=binding /> и последующая интерпретация
* Компиляция в [[байт-код]] ({{lang-en|shrouding}}, буквально — окутывание)<ref name=binding /> и последующая интерпретация
* Связывание [[байт-код]]а с интерпретатором ({{lang-en|binding}}, буквально — связывание)<ref name=binding /> для получения исполняемого файла
* Связывание [[байт-код]]а с интерпретатором ({{lang-en|binding}}, буквально — связывание)<ref name=binding /> для получения исполняемого файла
* Интерактивное выполнение ([[REPL]]) — в планах сообщества openEuphoria<ref name=repl />
* Интерактивное выполнение ([[REPL]]) — в планах сообщества openEuphoria<ref name=repl />
Строка 86: Строка 97:
'''Euphoria''' имеет четыре встроенных типа данных:
'''Euphoria''' имеет четыре встроенных типа данных:
;atom (атом): число, реализованное как 31-битное [[Целое число|целое]] со знаком или 64-битное [[IEEE 754-2008|число с плавающей запятой стандарта IEEE]]. Euphoria динамически переключается между представлением числа как целого или числа с плавающей запятой в зависимости от его текущего значения.
;atom (атом): число, реализованное как 31-битное [[Целое число|целое]] со знаком или 64-битное [[IEEE 754-2008|число с плавающей запятой стандарта IEEE]]. Euphoria динамически переключается между представлением числа как целого или числа с плавающей запятой в зависимости от его текущего значения.
;sequence (ряд, последовательность): набор, состоящий из нескольких элементов. Каждый элемент набора может быть как '''атомом''', так и '''рядом'''. Количество элементов ряда не фиксировано (не требует обязательного объявления). Программа в любое время может при необходимости добавлять или удалять элементы. Выделение/освобождение памяти обрабатывается автоматически с помощью подсчета ссылок. Доступ к отдельным элементам происходит с помощью значения индекса, заключенного в квадратные скобки. Индекс первого элемента равен [1]. Доступ к элементам вложенных рядов происходит при помощи дополнительных индексов в квадратных скобках, таким образом X[3][2] ссылается на второй элемент вложенного ряда, который является третьим элементом ряда X. Каждый элемент ряда имеет тип '''object (объект)''' (см. ниже).
;sequence (ряд, последовательность): набор, состоящий из нескольких элементов. Каждый элемент набора может быть как '''атомом''', так и '''рядом'''. Количество элементов ряда не фиксировано (не требует обязательного объявления). Программа в любое время может при необходимости добавлять или удалять элементы. Выделение/освобождение памяти обрабатывается автоматически с помощью подсчета ссылок. Доступ к отдельным элементам происходит с помощью значения индекса, заключённого в квадратные скобки. Индекс первого элемента равен [1]. Доступ к элементам вложенных рядов происходит при помощи дополнительных индексов в квадратных скобках, таким образом X[3][2] ссылается на второй элемент вложенного ряда, который является третьим элементом ряда X. Каждый элемент ряда имеет тип '''object (объект)''' (см. ниже).
;integer (целое) : атом, значения которого могут быть только [[Целое число|целыми числами]] от −1073741824 до 1073741823 (от −2^30 до 2^30-1). Тип '''целое''' часто более эффективен в операциях, чем тип '''атом''', но не может содержать того же диапазона значений. Символы хранятся как числа, например в кодировке [[ASCII]] 'A' то же самое, что и 65.
;integer (целое): атом, значения которого могут быть только [[Целое число|целыми числами]] от −1073741824 до 1073741823 (от −2<sup>30</sup> до 2<sup>30</sup>-1). Тип '''целое''' часто более эффективен в операциях, чем тип '''атом''', но не может содержать того же диапазона значений. Символы хранятся как числа, например в кодировке [[ASCII]] 'A' то же самое, что и 65.
;object (объект) : общий тип данных, который может содержать данные любого из перечисленных типов ('''atom''', '''sequence''' или '''integer'''), изменяющихся во время выполнения программы.
;object (объект): общий тип данных, который может содержать данные любого из перечисленных типов ('''atom''', '''sequence''' или '''integer'''), изменяющихся во время выполнения программы.


В Euphoria нет специального типа данных для [[Строковый тип|символьных строк]]. Интерпретатор работает со строками как с '''рядами''' '''целых''' чисел, преобразуя в них символы, заключенные в двойные кавычки. Таким образом, в программе Euphoria
В Euphoria нет специального типа данных для [[Строковый тип|символьных строк]]. Строка представляет собой '''ряд''' '''целых''' чисел, однако для строк используется привычная запись в двойных кавычках. Таким образом, в программе Euphoria
<code>"ABC"</code>
<code>"ABC"</code>
эквивалентно:
эквивалентно:
Строка 97: Строка 108:
<code>{65,66,67}</code>
<code>{65,66,67}</code>


Кроме встроенных типов, программа Euphoria может работать с неограниченным числом пользовательских типов данных, определяемых программистом и задающих более узкий диапазон значений переменной внутри пределов встроенных типов.
Кроме встроенных типов, программа Euphoria может работать с типами данных, определяемых программистом, и задающих более узкий диапазон значений переменной внутри пределов встроенных типов. Пользовательские типы данных используются в основном при отладке программы, по её окончании проверка этих типов может быть отключена директивой <code>without type_check</code>, при этом проверка встроенных типов всегда остается включенной.


== Примеры ==
== Примеры ==
=== Hello World ===
=== Hello World ===
<code>puts(1,"Hello World!\n")</code>
<code>puts (1,"Hello World!\n")</code>
=== Работа с рядами ===
=== Работа с рядами ===
Следующий код ищет элемент '''x''' в группе элементов. Если такой элемент найден, он удаляется при помощи [[Конкатенация|конкатенации]] всех элементов группы стоящих перед ним со всеми элементами после него. Заметьте, что первый элемент ряда имеет индекс один [1], а знак доллара $ в качестве индекса обозначает номер последнего элемента ряда.
'''Примечание:''' комментарии начинаются с двойного дефиса и продолжаются до конца строки.


<font color="#0000ff">function</font> delete_item (<font color="#ff00ff">object</font> x, <font color="#ff00ff">sequence</font> group)
Следующий код ищет элемент '''x''' в группе элементов. Если такой элемент найден, он удаляется при помощи [[Конкатенация|конкатенации]] всех элементов группы стоящих перед ним со всеми элементами после него. Заметьте, что первый элемент ряда имеет индекс один [1], а знак доллара $ обозначает длину ряда (общее количество его элементов) и может использоваться только как индекс.

<font color="#0000ff">global function</font> delete_item( <font color="#ff00ff">object</font> x, <font color="#ff00ff">sequence</font> group )
<font color="#ff00ff">integer</font> pos
<font color="#ff00ff">integer</font> pos
<font color="#ff0000">-- Начало кода --</font>
pos = <font color="#ff00ff">find</font>( x, group )
pos = <font color="#ff00ff">find</font>( x, group )
<font color="#0000ff">if</font> pos > 0 <font color="#0000ff">then</font>
<font color="#0000ff">if</font> pos > 0 <font color="#0000ff">then</font>
Строка 116: Строка 124:
return</font> group
return</font> group
<font color="#0000ff">end function</font>
<font color="#0000ff">end function</font>

Строка кода

<code>group = group[1 .. pos-1] & group[pos+1 .. $]</code>

показывает один из способов работы с рядами<ref>Этот код удаляет элемент ряда с номером pos. Начиная с версии 4.0.0 для выполнения этой операции в Euphoria используется специальная встроенная процедура remove().</ref>. Ряд может содержать группу элементов любого типа, и они могут быть выделены, а потом объединены ([[Конкатенация|конкатенированы]]) с другим рядом при помощи встроенных операторов. Операция выделения элементов ряда называется сечением ряда.


Следующая модификация предыдущего примера заменяет старый элемент новым. Поскольку переменные '''old''' и '''new''' объявлены как объекты, то они могут быть как атомами, так и рядами. Проверка типов не требуется, так как функция может работать с любыми типами данных.
Следующая модификация предыдущего примера заменяет старый элемент новым. Поскольку переменные '''old''' и '''new''' объявлены как объекты, то они могут быть как атомами, так и рядами. Проверка типов не требуется, так как функция может работать с любыми типами данных.


<font color="#0000ff">global function</font> replace_item( <font color="#ff00ff">object</font> old, <font color="#ff00ff">object</font> new, <font color="#ff00ff">sequence</font> group )
<font color="#0000ff">function</font> replace_item( <font color="#ff00ff">object</font> old, <font color="#ff00ff">object</font> new, <font color="#ff00ff">sequence</font> group )
<font color="#ff00ff">integer</font> pos
<font color="#ff00ff">integer</font> pos
<font color="#ff0000">-- Начало кода --</font>
pos = <font color="#ff00ff">find</font>( old, group )
pos = <font color="#ff00ff">find</font>( old, group )
<font color="#0000ff">if</font> pos > 0 <font color="#0000ff">then</font>
<font color="#0000ff">if</font> pos > 0 <font color="#0000ff">then</font>
Строка 128: Строка 141:
return</font> group
return</font> group
<font color="#0000ff">end function</font>
<font color="#0000ff">end function</font>

Более того, здесь не используются указатели и значения индексов проверяются автоматически, то есть функция не может выйти за пределы ряда. Не нужно явно выделять или освобождать память, что могло бы привести к ее [[Утечка памяти|утечке]].

Строка кода

<code>group = group[1 .. pos-1] & group[pos+1 .. $]</code>

показывает один из способов работы с рядами. Ряд может содержать группу элементов любого типа, и они могут быть выделены, а потом объединены ([[Конкатенация|конкатенированы]]) с другим рядом при помощи встроенных операторов. Операция выделения элементов ряда называется сечением ряда.


== Передача [[Параметр (программирование)|параметров]] ==
== Передача [[Параметр (программирование)|параметров]] ==
Параметры в подпрограмму всегда передаются по значению, однако первоначально передается только ссылка на объект, а его копия создается только если подпрограмма пытается его изменить, и далее подпрограмма работает уже с копией, а не с самим объектом (так называемый метод «[[копирование при записи]]»). Таким образом, параметр может измениться внутри подпрограммы, исходный же объект останется неизменным. При необходимости измененную копию объекта можно передать как возвращаемое значение функции.
Аргументы (параметры) подпрограмме всегда передаются по значению. Однако любой аргумент может быть изменён «локально», что реализовано очень эффективно с помощью метода «[[копирование при записи]]». Другими словами, когда вы передаёте подпрограмме ряд, первоначально передаётся только ссылка на него, но как только подпрограмма пытается изменить этот ряд, автоматически создается его копия, подпрограмма меняет только эту копию и в дальнейшем работает только с ней, оставляя ряд-аргумент в неизменном виде.


== Основные [[Диалект (программирование)|диалекты]] Euphoria ==
== Основные модификации и [[Диалект (программирование)|диалекты]] Euphoria ==
=== Двуязычная версия Euphoria ===
{{В планах}}
Существует модификация 2.5 версии Euphoria с английскими и русскими ключевыми словами (в кодировке [[CP866]]) и неограниченным алфавитом для идентификатров, разработанная с участием Крейга<ref name="bilingual"/>. Также ведётся разработка двуязычной модификации для Euphoria версии 3, в данный момент на стадии альфа.
=== Phix ===
Phix<ref>{{Cite web |url=http://www.phix.isgreat.org/ |title=Phix |access-date=2022-05-08 |archive-date=2016-03-12 |archive-url=https://web.archive.org/web/20160312205656/http://www.phix.isgreat.org/ |deadlink=no }}</ref> — разрабатываемый Питом Ломаксом [[компилятор]] языка программирования, базирующегося на синтаксисе RDS Euphoria, но имеющий следующие отличия<ref name="phixdiffs"/><ref name="phixeu4"/>:
* Улучшенный механизм подключения файлов
* Специальный строковый тип
* Сравнение рядов с помощью операторов сравнения
* Возможность присвоения сечению ряда произвольной длины (пример: <code>s="food" s[2..3]="e";</code> s теперь равно «fed»)
* Отрицательные индексы для индексирования с конца ряда
* Поддержка вложенных блочных комментариев
* {{не переведено|Сокращенное вычисление||en|Short-circuit evaluation}} всех [[Логическое выражение|логических выражений]]
* Дополнительная проверка типов во время компиляции
* Директивы <code>with/without</code> <code>console/gui</code>
* Конструкция <code>for</code> может использовать уже существующую локальную переменную в качестве счётчика
* Вывод ассемблерного листинга при компиляции
* Поддержка ассемблерных вставок
На данный момент текущая 0.6.2 версия компилятора, выпущенная 10 июля 2011 года имеет статус бета.


== Похожие языки программирования ==
== Похожие языки программирования ==
Строка 148: Строка 169:
* [[REBOL]]
* [[REBOL]]
* [[Ruby]]
* [[Ruby]]

== Литература ==
{{статья|автор=Juliet Kemp|заглавие=Joyous coding with OpenEuphoria |ссылка=http://www.linuxformat.com/includes/download.php?PDF=LXF176.code_oeuphoria.pdf|издание=[[LinuxFormat]] (english version)|год=November 2013|номер=176}}


== Ссылки ==
== Ссылки ==
Строка 153: Строка 177:
** [http://openeuphoria.org/wiki/view/home.wc Вики OpenEuphoria]{{ref-en}}
** [http://openeuphoria.org/wiki/view/home.wc Вики OpenEuphoria]{{ref-en}}
** [http://openeuphoria.org/forum/index.wc Форум OpenEuphoria]{{ref-en}}
** [http://openeuphoria.org/forum/index.wc Форум OpenEuphoria]{{ref-en}}
* [http://www.rapideuphoria.com/ Сайт RapidEuphoria]{{ref-en}}
* [https://web.archive.org/web/20120711213426/http://www.rapideuphoria.com/ Сайт RapidEuphoria]{{ref-en}}
** [http://rapideuphoria.com/russian/index_r.htm Русский раздел сайта RapidEuphoria]{{ref-ru}}
** [http://rapideuphoria.com/russian/index_r.htm Русский раздел сайта RapidEuphoria]{{ref-ru}}
*** [http://rapideuphoria.com/russian/refman_r.htm Перевод документации Euphoria 3.1 на русский язык]{{Недоступная ссылка|date=февраля 2021 |bot=InternetArchiveBot }}{{ref-ru}}
** [http://pl-euphoria.narod.ru/ Сайт русскоязычных программистов Euphoria]{{ref-ru}}
* [http://www.usingeuphoria.com/ Сайт UsingEuphoria]{{ref-en}}
* [http://pl-euphoria.narod.ru/ Сайт русскоязычных программистов Euphoria]{{ref-ru}}
* [https://web.archive.org/web/20080509094445/http://www.usingeuphoria.com/ Сайт UsingEuphoria]{{ref-en}}


== Примечания ==
== Примечания ==
{{Reflist|refs=
{{Reflist|2|refs=


<ref name=rehomepage>
<ref name=rehomepage>
{{cite web|url=http://www.rapideuphoria.com/|title=Сайт RapidEuphoria|lang=en}}
{{cite web|url=http://www.rapideuphoria.com/|title=Сайт RapidEuphoria|lang=en|archiveurl=https://www.webcitation.org/699sAUP4B?url=http://www.rapideuphoria.com/|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=atari1>{{cite web|url=http://www.rapideuphoria.com/cgi-bin/esearch.exu?fromMonth=9&fromYear=7&toMonth=9&toYear=7&keywords=atari|title=RapidEuphoria forum, 2002-09-10 by Robert Craig|lang=en|deadlink=403|archiveurl=https://web.archive.org/web/20110716180721/http://www.rapideuphoria.com/cgi-bin/esearch.exu?fromMonth=9&fromYear=7&toMonth=9&toYear=7&keywords=atari|archivedate=2011-07-16}}</ref>
<ref name=atari1>
{{cite web|url=http://www.rapideuphoria.com/cgi-bin/esearch.exu?fromMonth=9&fromYear=7&toMonth=9&toYear=7&keywords=atari|title=RapidEuphoria forum, 2002-09-10 by Robert Craig|lang=en}}
</ref>


<ref name=firstversion>{{cite web|url=http://www.rapideuphoria.com/cgi-bin/esearch.exu?toMonth=A&toYear=B&keywords=BBS*|title=RapidEuphoria forum, 2006-10-18 16:44 by Robert Craig|lang=en|deadlink=403|archiveurl=https://web.archive.org/web/20110716180543/http://www.rapideuphoria.com/cgi-bin/esearch.exu?toMonth=A&toYear=B&keywords=BBS%2A|archivedate=2011-07-16}}</ref>
<ref name=firstversion>
{{cite web|url=http://www.rapideuphoria.com/cgi-bin/esearch.exu?toMonth=A&toYear=B&keywords=BBS*|title=RapidEuphoria forum, 2006-10-18 16:44 by Robert Craig|lang=en}}
</ref>


<ref name=opensource>{{cite web|url=http://www.rapideuphoria.com/cgi-bin/esearch.exu?fromMonth=A&fromYear=B&toMonth=A&toYear=B&keywords=oct+18+1%3A19|title=RapidEuphoria forum, 2006-10-18 1:19 by Robert Craig|lang=en|deadlink=403|archiveurl=https://web.archive.org/web/20110716180705/http://www.rapideuphoria.com/cgi-bin/esearch.exu?fromMonth=A&fromYear=B&toMonth=A&toYear=B&keywords=oct+18+1%3A19|archivedate=2011-07-16}}</ref>
<ref name=opensource>
{{cite web|url=http://www.rapideuphoria.com/cgi-bin/esearch.exu?fromMonth=A&fromYear=B&toMonth=A&toYear=B&keywords=oct+18+1%3A19|title=RapidEuphoria forum, 2006-10-18 1:19 by Robert Craig|lang=en}}
</ref>


<ref name=oehomepage>
<ref name=oehomepage>
{{cite web|url=http://openeuphoria.org|title=Сайт сообщества openEuphoria|lang=en}}
{{cite web|url=http://openeuphoria.org|title=Сайт сообщества openEuphoria|lang=en|archiveurl=https://www.webcitation.org/699sBDE90?url=http://openeuphoria.org/|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=oever4news>{{cite web|url=http://openeuphoria.org/news/16.wc|title=Сообщение о выходе openEuphoria версии 4.0.0|archiveurl=https://www.webcitation.org/699sC7a3d?url=http://openeuphoria.org/news/16.wc|archivedate=2012-07-14|deadurl=yes}}</ref>
<ref name=oedownload>
{{cite web|url= http://openeuphoria.org/wiki/view/DownloadEuphoria.wc|title=Страница скачивания openEuphoria|lang=en}}</ref>


<ref name=binding>
<ref name=binding>
{{cite web|url=http://openeuphoria.org/docs/bind.html|title=openEuhporia manual, Binding and Shrouding|lang=en}}
{{cite web|url=http://openeuphoria.org/docs/bind.html|title=openEuhporia manual, Binding and Shrouding|lang=en|archiveurl=https://www.webcitation.org/699sCaeoZ?url=http://openeuphoria.org/docs/bind.html|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=win32lib>
<ref name=win32lib>
{{cite web|url=http://sourceforge.net/projects/win32libex|title=Euphoria проект Win32Lib на Sourceforge|lang=en}}</ref>
{{cite web|url=http://sourceforge.net/projects/win32libex|title=Euphoria проект Win32Lib на Sourceforge|lang=en|archiveurl=https://www.webcitation.org/699sDFFXp?url=http://sourceforge.net/projects/win32libex|archivedate=2012-07-14|deadurl=yes}}</ref>


<ref name=wxeuphoria>
<ref name=wxeuphoria>
{{cite web|url= http://wxeuphoria.sourceforge.net|title=Euphoria проект wxEuphoria на Sourceforge|lang=en}}
{{cite web|url=http://wxeuphoria.sourceforge.net|title=Euphoria проект wxEuphoria на Sourceforge|lang=en|archiveurl=https://www.webcitation.org/699sDkK6a?url=http://wxeuphoria.sourceforge.net/|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=GTK>
<ref name=GTK>
{{cite web|url=http://sourceforge.net/projects/eugtk|title=Euphoria проект GTK+ на Sourceforge|lang=en}}
{{cite web|url=http://sourceforge.net/projects/eugtk|title=Euphoria проект GTK+ на Sourceforge|lang=en|archiveurl=https://www.webcitation.org/699sEJoLZ?url=http://sourceforge.net/projects/eugtk|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=IUP>
<ref name=IUP>
{{cite web|url=http://jeremy.cowgar.com/euiup|title=Euphoria проект IUP Джереми Ковгара|lang=en}}
{{cite web|url=http://jeremy.cowgar.com/euiup|title=Euphoria проект IUP Джереми Ковгара|lang=en|archiveurl=https://www.webcitation.org/699sEm0kQ?url=http://jeremy.cowgar.com/euiup|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=database>
<ref name=database>
{{cite web|url=http://openeuphoria.org/docs/database.html|title=openEuphoria manual, Database|lang=en}}
{{cite web|url=http://openeuphoria.org/docs/database.html|title=openEuphoria manual, Database|lang=en|archiveurl=https://www.webcitation.org/699sFATDS?url=http://openeuphoria.org/docs/database.html|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=oedatabases>
<ref name=oedatabases>
{{cite web|url=http://openeuphoria.org/wiki/view/EuphoriaDatabaseInterfaces.wc|title=openEuphoria wiki, Database Interfaces|lang=en}}
{{cite web|url=http://openeuphoria.org/wiki/view/EuphoriaDatabaseInterfaces.wc|title=openEuphoria wiki, Database Interfaces|lang=en|archiveurl=https://www.webcitation.org/699sFdBc5?url=http://openeuphoria.org/wiki/view/EuphoriaDatabaseInterfaces.wc|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=renotes>
<ref name=renotes>
{{cite web|url=http://www.rapideuphoria.com/relnotes.htm|title=RapidEuphoria webiste, release notes|lang=en}}
{{cite web|url=http://www.rapideuphoria.com/relnotes.htm|title=RapidEuphoria webiste, release notes|lang=en|archiveurl=https://www.webcitation.org/699sG6hPP?url=http://www.rapideuphoria.com/relnotes.htm|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=atari2>{{cite web|url=http://www.rapideuphoria.com/cgi-bin/esearch.exu?fromMonth=3&fromYear=3&toMonth=3&toYear=3&keywords=13%3A04|title=RapidEuphoria forum, 2 Mar 1998 13:04 by Robert Craig|lang=en|deadlink=403|archiveurl=https://web.archive.org/web/20110716180757/http://www.rapideuphoria.com/cgi-bin/esearch.exu?fromMonth=3&fromYear=3&toMonth=3&toYear=3&keywords=13%3A04|archivedate=2011-07-16}}</ref>
<ref name=atari2>
{{cite web|url=http://www.rapideuphoria.com/cgi-bin/esearch.exu?fromMonth=3&fromYear=3&toMonth=3&toYear=3&keywords=13%3A04|title=RapidEuphoria forum, 2 Mar 1998 13:04 by Robert Craig|lang=en}}
</ref>


<ref name=renews>
<ref name=renews>
{{cite web|url=http://www.rapideuphoria.com/news.htm|title=RapidEuphoria news|lang=en}}
{{cite web|url=http://www.rapideuphoria.com/news.htm|title=RapidEuphoria news|lang=en|archiveurl=https://www.webcitation.org/699sGYWws?url=http://www.rapideuphoria.com/news.htm|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=oenotes>
<ref name=oenotes>
{{cite web|url=http://openeuphoria.org/docs/relnotes|title=openEuphoria release notes|lang=en}}
{{cite web|url=http://openeuphoria.org/docs/relnotes|title=openEuphoria release notes|lang=en|archiveurl=https://www.webcitation.org/699sH1E32?url=http://openeuphoria.org/docs/relnotes|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=oeplatform>
<ref name=oeplatform>
{{cite web|url=http://openeuphoria.org/docs/platform.html|title=openEuhporia manual, Platform Specific Issues|lang=en}}
{{cite web|url=http://openeuphoria.org/docs/platform.html|title=openEuhporia manual, Platform Specific Issues|lang=en|archiveurl=https://www.webcitation.org/699sHU4FI?url=http://openeuphoria.org/docs/platform.html|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=repl>
<ref name=repl>
{{cite web|url=http://openeuphoria.org/wiki/view/EuphoriaRoadmap.wc|title=openEuphoria roadmap|lang=en}}
{{cite web|url=http://openeuphoria.org/wiki/view/EuphoriaRoadmap.wc|title=openEuphoria roadmap|lang=en|archiveurl=https://www.webcitation.org/699sHx6f3?url=http://openeuphoria.org/wiki/view/EuphoriaRoadmap.wc|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=mascot>
<ref name=mascot>
{{cite web|url=http://openeuphoria.org/wiki/view/logo.wc|title=Логотип и талисман openEuphoria|lang=en}}
{{cite web|url=http://openeuphoria.org/wiki/view/logo.wc|title=Логотип и талисман openEuphoria|lang=en|archiveurl=https://www.webcitation.org/699sIQ6jr?url=http://openeuphoria.org/wiki/view/logo.wc|archivedate=2012-07-14|deadurl=yes}}
</ref>
</ref>


<ref name=bilingual>
{{cite web|url=http://www.rapideuphoria.com/cgi-bin/asearch.exu?dos=on&win=on&lnx=on&gen=on&keywords=ru_eu_11|title=Двуязычная версия Euphoria в архиве сайта RapidEuphoria.com|lang=en|archiveurl=https://www.webcitation.org/699wtAABE?url=http://www.rapideuphoria.com/cgi-bin/asearch.exu?dos=on|archivedate=2012-07-14|deadurl=yes}}
</ref>

<ref name=phixdiffs>
{{cite web|url=http://edita.is-great.org/phpBB2/viewtopic.php?f=13&t=4#p18|title=Сообщение Пита Ломакса об отличиях Phix от Euphoria|lang=en|archiveurl=https://www.webcitation.org/699wtfQe0?url=http://edita.isgreat.org/phpBB2/viewtopic.php?f=13#p18|archivedate=2012-07-14|deadurl=yes}}
</ref>

<ref name=phixeu4>
{{cite web|url=http://openeuphoria.org/forum/m/117059.wc|title=Сообщение Пита Ломакса на форуме OpenEuphoria об отличиях Phix от Euphoria 4.0|lang=en|archiveurl=https://www.webcitation.org/699wu5zvi?url=http://openeuphoria.org/forum/m/117059.wc|archivedate=2012-07-14|deadurl=yes}}
</ref>
}}
}}


Строка 244: Строка 271:


[[Категория:Свободные компиляторы и интерпретаторы]]
[[Категория:Свободные компиляторы и интерпретаторы]]

{{Link FA|pt}}

[[cs:Euphoria (programovací jazyk)]]
[[de:Euphoria (Programmiersprache)]]
[[en:Euphoria (programming language)]]
[[es:EUPHORIA (lenguaje de programación)]]
[[fr:Euphoria (langage)]]
[[gl:Euphoria]]
[[ja:Euphoria (プログラミング言語)]]
[[pl:Euphoria (język programowania)]]
[[pt:Euphoria (linguagem de programação)]]

Текущая версия от 09:50, 11 июня 2024

Euphoria
Изображение логотипа
Семантика императивный
Класс языка процедурный
Тип исполнения интерпретация, интерпретация байт-кода, трансляция в Си
Появился в 1993
Автор Роберт Крейг (создатель) и Джереми Ковгар, Мэтт Льюис, Дерек Парнелл (разработчики версии 4)
Разработчик openEuphoria Group
Расширение файлов .e, .ex, .exw, .edb
Выпуск 4.15.2[1] (15 августа 2019; 5 лет назад (2019-08-15))
Тестовая версия 4.1 Beta 2
Система типов статическая, динамическая
Диалекты RDS Euphoria, openEuphoria
Испытал влияние BASIC, Си
Повлиял на Phix
Лицензия открытая
Сайт openeuphoria.org
ОС кроссплатформенность
Логотип Викисклада Медиафайлы на Викискладе
Мангуст — талисман проекта openEuphoria

Euphoria ([ju:ˈfɔ:riə], юфо́ри, также рус. эйфори́я, ра́дость) — язык программирования, созданный Робертом Крейгом (Rapid Deployment Software)[2] в Канаде, Торонто. Название Euphoria — это акроним для «End-User Programming with Hierarchical Objects for Robust Interpreted Applications».

Первый публичный выпуск[3] предназначался для 32-битных машин (i386) с MS-DOS и был проприетарным (1993 год). В 2006 году с выходом версии 3[4] проект Euphoria стал открытым, и развивать его начало сообщество OpenEuphoria [5], которое в декабре 2010 года выпустило 4-ю версию[6] с новым логотипом и талисманом[7]. В настоящее время пакет OpenEuphoria версий 4.* выпускается для Microsoft Windows, Linux, Mac OS X и трёх BSD-систем (FreeBSD, NetBSD, OpenBSD).

Euphoria — интерпретируемый императивный язык высокого уровня общего назначения. C помощью транслятора из исходного кода на Euphoria может быть сгенерирован исходный код на языке Си, который в свою очередь может быть скомпилирован в исполнияемый файл или динамическую библиотеку при помощи таких компиляторов, как GCC, OpenWatcom и др. Программа Euphoria также может быть «связана»[8] с интерпретатором для получения самостоятельного исполняемого файла. Поддерживается несколько GUI-библиотек, включая Win32lib[9] и «оберток» для wxWidgets[10], GTK+[11] и IUP[12]. Euphoria имеет встроенную простую систему баз данных[13] и «обертки» для работы с другими типами баз данных[14].

Euphoria — процедурный язык общего назначения, отличительными особенностями которого являются простота, удобочитаемость, быстрое развертывание и высокая производительность.

Простота
  • Язык использует только четыре встроенных типа данных (см. ниже).
  • Автоматическая Сборка мусора.
Удобочитаемость
  • Для отделения синтаксических конструкций используются простые ключевые слова из английского языка, а не знаки пунктуации.
Быстрое развертывание
  • Euphoria интерпретируемый язык, что облегчает прототипирование и инкрементальную разработку.
Производительность
  • Euphoria использует эффективный сборщик мусора подсчитывающий ссылки, и корректно обрабатывающий циклические ссылки.

Разработка языка Euphoria началась с опытов Роберта Крейга[2] на персональном компьютере Atari Mega-ST[15]. Многие идеи дизайна языка пришли из магистерской диссертации Крейга, защищённой им в Университете Торонто[16]. Диссертация была написана под влиянием работ Джона Бэкуса по функциональным языкам программирования[16].

Затем Крейг портировал оригинальную реализацию языка для Atari на 32-битную платформу машин с процессором 386 под управлением Microsoft MS-DOS и выпустил первый пакет (версия 1.0) в июле 1993 года[3] с проприетарной лицензией, основав собственную компанию Rapid Deployment Softawre (RDS) по разработке и продаже интерпретатора Euphoria в варианте DOS32. Первоначальную реализацию для Atari Крейг называет «примитивной»[17] и не публиковал её. До 2006 года Крейг продолжал развивать и издавать Euphoria в своей фирме (сайт rapideuphoria.com[2]), состоявшей из него самого и его жены Джанко Миура, выпустив более десятка версий в двух сериях, 1.* и 2.*. В октябре 2006 года RDS начала 3-ю[4] серию Euphoria и объявила, что в дальнейшем Euphoria будет свободно распространяться по открытой лицензии. Итогом работы с проприетарными сериями 1 и 2 является сообщество зарегистрированных пользователей в 67 странах мира, включающее множество программистов, точное число которых известно только RDS, но на момент выпуска версии 2.5 значительно превышало тысячу.

Под непосредственным руководством RDS сообщество продолжало выпускать Euphoria, доведя пакет до версии 3.1.1 (август 2007 года)[16][18]. После этого RDS постепенно отошла от руководства разработкой Euphoria, и дальнейшие усовершенствования и изменения вносятся сообществом OpenEuphoria[5] под коллегиальным руководством. В декабре 2010 года[19] сообщество выпустило версию 4.0, положив начало 4-й серии, теперь с новым логотипом и талисманом проекта[7].

Версия 3.1.1 является важной вехой в развитии языка, так как это последняя версия, официально поддерживающая платформу MS-DOS[20]. Версия 3.1.1 пока остаётся последней версией строгого классического направления, без "вольностей", появившихся в 4-й.

Краткий список новшеств, появившихся начиная с версии 4.0.0[21]:

  • Добавлены директивы условной компиляции
  • Значительно расширена библиотека стандартных подпрограмм
  • Добавлена возможность использовать подпрограммы выше их объявления в тексте ("ссылка вперед")
  • Возможность инициализации переменной при её объявлении
  • Многострочные комментарии
  • Возвращаемое значение функции может быть проигнорировано (ранее возвращаемое значение должно было быть явно использовано, иначе выдавалась ошибка)
  • Циклы с постусловием, со входом в середину тела цикла
  • Оптимизированные встроенные подпрограммы для выполнения операций над рядами
  • Метки, оператор goto
  • Оператор switch
  • Пространства имен
  • Дополнительные модификаторы области видимости

и многое другое.

Интерпретатор языка Euphoria первоначально был целиком написан на Си. Начиная с версии 2.5[16], выпущенной в ноябре 2004 года, интерпретатор был разделен на две части: парсер, написанный на Euphoria, и интерпретатор байт-кода, написанный на Си.

Отличительные черты

[править | править код]

Euphoria задумывался и разрабатывался со следующими целями и отличительными чертами:

  • Лёгкость в изучении и простота высокоуровневых конструкций
  • Реализация «плоской» 32-битной модели памяти для MS-DOS-версии, позволяющая избежать сложностей управления памятью и ограничения объектов по размеру и адресации
  • Поддержка отладки и обработки ошибок во время выполнения
  • Контроль выхода за границы массивов
  • Динамическая и строгая типизация переменных
  • Интерпретируемость с автоматическим управлением памяти и сборкой мусора
  • Неоднородные динамические массивы (sequence)
  • Графическая библиотека DOS (Версии языка Euphoria вплоть до 3.1.1 включительно)
  • Отладчик
  • Встроенная система баз данных
  • Возможность низкоуровневого управление памятью (обычно используется при взаимодействии с кодом, находящимся в динамических библиотеках)
  • Простое и понятное оборачивание библиотек

Режимы выполнения

[править | править код]
  • Интерпретация
  • Трансляция программы на язык Си с последующей компиляцией в самостоятельный исполняемый модуль или динамическую библиотеку
  • Компиляция в байт-код (англ. shrouding, буквально — окутывание)[8] и последующая интерпретация
  • Связывание байт-кода с интерпретатором (англ. binding, буквально — связывание)[8] для получения исполняемого файла
  • Интерактивное выполнение (REPL) — в планах сообщества openEuphoria[22]

Использование

[править | править код]

Euphoria задуман как готовое решение для облегчения обработки динамических коллекций данных различных типов и в частности удобен для обработки строк и изображений. Euphoria используют для экспериментов с искусственным интеллектом, изучения математики, обучения программированию и для создания шрифтов, состоящих из тысяч символов. Достаточно большая часть интерпретатора Euphoria написана на Euphoria.

Типы данных

[править | править код]

Euphoria имеет четыре встроенных типа данных:

atom (атом)
число, реализованное как 31-битное целое со знаком или 64-битное число с плавающей запятой стандарта IEEE. Euphoria динамически переключается между представлением числа как целого или числа с плавающей запятой в зависимости от его текущего значения.
sequence (ряд, последовательность)
набор, состоящий из нескольких элементов. Каждый элемент набора может быть как атомом, так и рядом. Количество элементов ряда не фиксировано (не требует обязательного объявления). Программа в любое время может при необходимости добавлять или удалять элементы. Выделение/освобождение памяти обрабатывается автоматически с помощью подсчета ссылок. Доступ к отдельным элементам происходит с помощью значения индекса, заключённого в квадратные скобки. Индекс первого элемента равен [1]. Доступ к элементам вложенных рядов происходит при помощи дополнительных индексов в квадратных скобках, таким образом X[3][2] ссылается на второй элемент вложенного ряда, который является третьим элементом ряда X. Каждый элемент ряда имеет тип object (объект) (см. ниже).
integer (целое)
атом, значения которого могут быть только целыми числами от −1073741824 до 1073741823 (от −230 до 230-1). Тип целое часто более эффективен в операциях, чем тип атом, но не может содержать того же диапазона значений. Символы хранятся как числа, например в кодировке ASCII 'A' то же самое, что и 65.
object (объект)
общий тип данных, который может содержать данные любого из перечисленных типов (atom, sequence или integer), изменяющихся во время выполнения программы.

В Euphoria нет специального типа данных для символьных строк. Строка представляет собой ряд целых чисел, однако для строк используется привычная запись в двойных кавычках. Таким образом, в программе Euphoria

"ABC"

эквивалентно:

{'A', 'B', 'C'}

и эквивалентно:

{65,66,67}

Кроме встроенных типов, программа Euphoria может работать с типами данных, определяемых программистом, и задающих более узкий диапазон значений переменной внутри пределов встроенных типов. Пользовательские типы данных используются в основном при отладке программы, по её окончании проверка этих типов может быть отключена директивой without type_check, при этом проверка встроенных типов всегда остается включенной.

 puts (1,"Hello World!\n")

Работа с рядами

[править | править код]

Следующий код ищет элемент x в группе элементов. Если такой элемент найден, он удаляется при помощи конкатенации всех элементов группы стоящих перед ним со всеми элементами после него. Заметьте, что первый элемент ряда имеет индекс один [1], а знак доллара $ в качестве индекса обозначает номер последнего элемента ряда.

function delete_item (object x, sequence group)
   integer pos
   pos = find( x, group )
   if pos > 0 then
       group = group[1 .. pos-1] & group[pos+1 .. $]
   end if
   return group
end function

Строка кода

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

показывает один из способов работы с рядами[23]. Ряд может содержать группу элементов любого типа, и они могут быть выделены, а потом объединены (конкатенированы) с другим рядом при помощи встроенных операторов. Операция выделения элементов ряда называется сечением ряда.

Следующая модификация предыдущего примера заменяет старый элемент новым. Поскольку переменные old и new объявлены как объекты, то они могут быть как атомами, так и рядами. Проверка типов не требуется, так как функция может работать с любыми типами данных.

function replace_item( object old, object new, sequence group )
   integer pos
   pos = find( old, group )
   if pos > 0 then
       group[pos] = new
   end if
   return group
end function

Параметры в подпрограмму всегда передаются по значению, однако первоначально передается только ссылка на объект, а его копия создается только если подпрограмма пытается его изменить, и далее подпрограмма работает уже с копией, а не с самим объектом (так называемый метод «копирование при записи»). Таким образом, параметр может измениться внутри подпрограммы, исходный же объект останется неизменным. При необходимости измененную копию объекта можно передать как возвращаемое значение функции.

Основные модификации и диалекты Euphoria

[править | править код]

Двуязычная версия Euphoria

[править | править код]

Существует модификация 2.5 версии Euphoria с английскими и русскими ключевыми словами (в кодировке CP866) и неограниченным алфавитом для идентификатров, разработанная с участием Крейга[24]. Также ведётся разработка двуязычной модификации для Euphoria версии 3, в данный момент на стадии альфа.

Phix[25] — разрабатываемый Питом Ломаксом компилятор языка программирования, базирующегося на синтаксисе RDS Euphoria, но имеющий следующие отличия[26][27]:

  • Улучшенный механизм подключения файлов
  • Специальный строковый тип
  • Сравнение рядов с помощью операторов сравнения
  • Возможность присвоения сечению ряда произвольной длины (пример: s="food" s[2..3]="e"; s теперь равно «fed»)
  • Отрицательные индексы для индексирования с конца ряда
  • Поддержка вложенных блочных комментариев
  • Сокращенное вычисление[англ.] всех логических выражений
  • Дополнительная проверка типов во время компиляции
  • Директивы with/without console/gui
  • Конструкция for может использовать уже существующую локальную переменную в качестве счётчика
  • Вывод ассемблерного листинга при компиляции
  • Поддержка ассемблерных вставок

На данный момент текущая 0.6.2 версия компилятора, выпущенная 10 июля 2011 года имеет статус бета.

Похожие языки программирования

[править | править код]

Литература

[править | править код]

Juliet Kemp. Joyous coding with OpenEuphoria // LinuxFormat (english version). — November 2013. — № 176.

Примечания

[править | править код]
  1. "EuGTK 4.15.2 posted". Архивировано 30 января 2021. Дата обращения: 5 апреля 2022. {{cite news}}: |archive-date= / |archive-url= несоответствие временной метки; предлагается 30 января 2021 (справка)
  2. 1 2 3 Сайт RapidEuphoria (англ.). Архивировано из оригинала 14 июля 2012 года.
  3. 1 2 RapidEuphoria forum, 2006-10-18 16:44 by Robert Craig (англ.). Архивировано 16 июля 2011 года.
  4. 1 2 RapidEuphoria forum, 2006-10-18 1:19 by Robert Craig (англ.). Архивировано 16 июля 2011 года.
  5. 1 2 Сайт сообщества openEuphoria (англ.). Архивировано из оригинала 14 июля 2012 года.
  6. Сообщение о выходе openEuphoria версии 4.0.0. Архивировано из оригинала 14 июля 2012 года.
  7. 1 2 Логотип и талисман openEuphoria (англ.). Архивировано из оригинала 14 июля 2012 года.
  8. 1 2 3 openEuhporia manual, Binding and Shrouding (англ.). Архивировано из оригинала 14 июля 2012 года.
  9. Euphoria проект Win32Lib на Sourceforge (англ.). Архивировано из оригинала 14 июля 2012 года.
  10. Euphoria проект wxEuphoria на Sourceforge (англ.). Архивировано из оригинала 14 июля 2012 года.
  11. Euphoria проект GTK+ на Sourceforge (англ.). Архивировано из оригинала 14 июля 2012 года.
  12. Euphoria проект IUP Джереми Ковгара (англ.). Архивировано из оригинала 14 июля 2012 года.
  13. openEuphoria manual, Database (англ.). Архивировано из оригинала 14 июля 2012 года.
  14. openEuphoria wiki, Database Interfaces (англ.). Архивировано из оригинала 14 июля 2012 года.
  15. RapidEuphoria forum, 2002-09-10 by Robert Craig (англ.). Архивировано 16 июля 2011 года.
  16. 1 2 3 4 RapidEuphoria webiste, release notes (англ.). Архивировано из оригинала 14 июля 2012 года.
  17. RapidEuphoria forum, 2 Mar 1998 13:04 by Robert Craig (англ.). Архивировано 16 июля 2011 года.
  18. RapidEuphoria news (англ.). Архивировано из оригинала 14 июля 2012 года.
  19. openEuphoria release notes (англ.). Архивировано из оригинала 14 июля 2012 года.
  20. openEuhporia manual, Platform Specific Issues (англ.). Архивировано из оригинала 14 июля 2012 года.
  21. Что нового в версии 4.0. Дата обращения: 17 августа 2012. Архивировано 10 января 2012 года.
  22. openEuphoria roadmap (англ.). Архивировано из оригинала 14 июля 2012 года.
  23. Этот код удаляет элемент ряда с номером pos. Начиная с версии 4.0.0 для выполнения этой операции в Euphoria используется специальная встроенная процедура remove().
  24. Двуязычная версия Euphoria в архиве сайта RapidEuphoria.com (англ.). Архивировано из оригинала 14 июля 2012 года.
  25. Phix. Дата обращения: 8 мая 2022. Архивировано 12 марта 2016 года.
  26. Сообщение Пита Ломакса об отличиях Phix от Euphoria (англ.). Архивировано из оригинала 14 июля 2012 года.
  27. Сообщение Пита Ломакса на форуме OpenEuphoria об отличиях Phix от Euphoria 4.0 (англ.). Архивировано из оригинала 14 июля 2012 года.