Часть I - Ядро языка

1. Введение

 
Язык программирования Euphoria имеет следующие преимущества перед другими языками:

  • исключительно простое, гибкое и мощное определение ядра, которое легко поддаётся изучению и дальнейшему использованию.

  • динамическое распределение памяти. Переменные изменяются, не доставляя программисту забот о выделении под них и высвобождении участков памяти. Объекты любой размерности могут быть присвоены элементу ряда (массива) Euphoria.

  • уникальный высокопроизводительный интерпретатор, который в 30 раз быстрее обычных интерпретаторов вроде Perl или Python.

  • оптимизирующий транслятор с Euphoria на Си, ещё более разгоняющий вашу программу, часто от 2-х до 5-ти раз прибавляя ей скорости по сравнению с интерпретатором, и без того необыкновенно быстрым.

  • широкая проверка правильности хода программы: контролируются индексы вне диапазона, неинициализированные переменные, неверные величины параметров библиотечных подпрограмм, недопустимые типы данных, присваиваемых переменным и т.п. Здесь практически не бывает загадочных машинных исключений -- вы всегда получаете полное описание на человеческом языке того, что случилось с вашей программой во время её прогона, плюс распечатку последовательности вызовов подпрограмм и значений всех переменных программы. Программа отлаживается быстро, просто и более досконально.

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

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

  • программы Euphoria работают на платформах Linux, FreeBSD, 32-битной Windows и DOS любой версии, не имея никаких ограничений на объем доступной для использования памяти, в том числе, пресловутых 640K. Вы можете создавать программы, которые автоматически используют всю много-мегабайтную оперативную память вашей машины, плюс дисковый файл памяти, если оперативной оказывается недостаточно.

  • вы можете трансформировать исходный код ваших программ в самостоятельные двоичные исполняемые файлы разнообразных типов и форматов.

  • подпрограммы Euphoria естественным образом универсальны. Пример программы, который вы найдете чуть ниже, демонстрирует единственную подпрограмму, которая одинаково успешно сортирует данные любого типа : целые числа, числа с плавающей точкой, строки и т.д. При этом Euphoria не является "объектно-ориентированным" языком, а достигает многих преимуществ этих языков значительно более простым путём.

  • система программирования Euphoria полностью свободна и открыта.



1.1 Пример программы

Здесь представлен пример завершённой программы Euphoria.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 sequence list, sorted_list

 function merge_sort(sequence x)
 -- сортирует x в порядке возрастания методом рекурсивного слияния
     integer n, mid
     sequence merged, a, b

     n = length(x)
     if n = 0 or n = 1 then
         return x  -- тривиальный случай
     end if

     mid = floor(n/2)
     a = merge_sort(x[1..mid])       -- сортируется первая половина x
     b = merge_sort(x[mid+1..n])     -- сортируется вторая половина x

     -- слияние двух отсортированных половинок
     merged = {}
     while length(a) > 0 and length(b) > 0 do
         if compare(a[1], b[1]) < 0 then
             merged = append(merged, a[1])
             a = a[2..length(a)]
         else
             merged = append(merged, b[1])
             b = b[2..length(b)]
         end if
     end while
     return merged & a & b  -- слитые данные плюс остатки
 end function

 procedure print_sorted_list()
 -- генерирует sorted_list из list
     list = {9, 10, 3, 1, 4, 5, 8, 7, 6, 2}
     sorted_list = merge_sort(list)
     ? sorted_list
 end procedure

 print_sorted_list()     -- эта команда запускает программу


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Данный пример содержит 4 отдельные команды, которые выполняются последовательно. Первая объявляет две переменные: list и sorted_list как ряды (sequence) (гибкие массивы). Вторая определяет функцию merge_sort(). Третья определяет процедуру print_sorted_list(). Четвёртая и последняя команда вызывает процедуру print_sorted_list() на исполнение.

Программа печатает на экране:
    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

merge_sort() так же легко отсортирует {1.5, -9, 1e6, 100} или {"oranges", "apples", "bananas"} .

Данный пример имеется в каталоге Euphoria -- euphoria\tutorial\example.ex. Это не самый быстрый из методов сортировки, доступных в Euphoria. Перейдите в каталог -- euphoria\demo -- и введите команду "ex allsorts", чтобы проверить хронометраж различных алгоритмов сортировки при возрастании числа сортируемых объектов. Быстрый учебный пример программирования аналогичной функции на Euphoria вы можете также найти в -- euphoria\demo\bench\filesort.ex.



1.2 Установка

Чтобы установить систему Euphoria на своей машине, сначала прочтите инструкцию в файле install_r.doc. Установка заключается в простом копировании файлов euphoria на ваш жесткий диск в каталог (директорию) с именем "euphoria", и последующей модификации вашего файла autoexec.bat с таким расчётом, чтобы включить каталог euphoria\bin в путь поиска, а переменную окружения EUDIR установить на каталог euphoria.

После установки каталог euphoria на вашей машине будет выглядеть примерно так:

\euphoria
readme.doc
readme.htm
License.txt
\bin
Интерпретаторы ex.exe и exw.exe. Трансляторы ec.exe и ecw.exe. Или на Linux/FreeBSD, интерпретатор exu и транслятор ecu. Здесь также будут служебные программы, такие как ed.bat, guru.bat и т.д.
\include
стандартные библиотеки, т.е. graphics.e и т.п.
\source
полный исходный код (интерпретатор, транслятор, биндер)
\doc
refman.doc, library.doc и другие файлы документации в простом текстовом формате
\html
файлы формата HTML, соответствующие каждому из файлов .doc в каталоге doc
\tutorial
небольшие учебные программы, которые помогут вам в изучении Euphoria
\demo
общие демо-программы, которые работают на всех платформах
\dos32
демо-программы, специфические для DOS32 (может не быть)
\win32
демо-программы, специфические для WIN32 (может не быть)
\linux
демо-программы, специфические для Linux/FreeBSD (может не быть)
\langwar
игра language war (пиксельно-графическая версия для DOS или текстовая версия для Linux/FreeBSD)
\bench
программы оценки производительности

Подкаталог Linux не включается в пакет для DOS/Windows, а dos32 и win32 подкаталоги не включаютя в пакет для Linux/FreeBSD. В данном Руководстве каталоги показаны с использованием обратной косой черты. (\). Пользователи Linux/FreeBSD должны помнить, что там действует обычная косая черта(/).



1.3 Запуск программы

Программы Euphoria запускаются из командной строки вводом команды ex, exw или exu, сопровождаемой именем главного файла программы Euphoria. Вы также можете вводить здесь дополнительные слова (известные как аргументы командной строки). Ваша программа может вызывать встроенную функцию command_line(), чтобы прочесть всю введённую вами командную строку. Версия интерпретатора Euphoria для DOS32 называется ex.exe. Версия для WIN32 называется exw.exe. Версия для Linux/FreeBSD называется exu. Как это здесь принято, главные файлы программ Euphoria имеют расширения .ex, .exw или .exu. Другие файлы Euphoria, предназначенные для включения в главную программу, имеют расширения .e или иногда .ew или .eu. Чтобы сократить команду, вы можете опускать ".ex", и интерпретатор ex будет подставлять это расширение для вас автоматически. exw.exe будет подставлять ".exw", а exu -- ".exu". Каждый из интерпретаторов перебирает и другие возможные расширения, если файл с основным расширением не нашёлся. Если файла с заданным именем, но ни с одним из условленных расширений, нет в текущем каталоге, проверяются каталоги из переменной окружения PATH (сначала с использованием основного расширения, а затем остальных).

Вы можете перенаправлять стандартные ввод и вывод из программы Euphoria, например:

        ex filesort.ex < raw.txt > sorted.txt
или просто,
        ex filesort < raw.txt > sorted.txt

В отличие от многих других компиляторов и интерпретаторов, здесь нет аргументов командной строки, предназначенных для изменения режима собственно интерпретаторов ex, exw или exu. Интерпретатор реагирует только на имя вашей программы Euphoria, и если вы не указали это имя, он пригласит вас к его вводу.

Для часто используемых программ под DOS/Windows вам могут пригодиться маленькие пакетные .bat файлы, к примеру, myprog.bat, содержащий пару команд наподобие показанных ниже:

        @echo off
        ex myprog.ex %1 %2 %3
Первая команда выключает отображение собственно команд на экране. Вторая - запускает ex myprog.ex с тремя или менее аргументами командной строки. Просмотрите описание функции command_line(), там есть пример, как можно читать эти аргументы по ходу вашей программы. Если вашей программе требуется большее число аргументов, нужно добавить %4 %5 и т.д. Наличие .bat-файла сэкономит вам несколько нажатий на клавиши при наборе ex (или exw) каждый раз, когда вы запускаете свою любимую программу, т.е. вы можете просто ввести:
        myprog
вместо:
        ex myprog
К сожалению, DOS не позволяет перенаправление стандартных ввода и вывода, если вы используете .bat-файл.

Под Linux/FreeBSD, вы можете задать путь к интерпретатору Euphoria в первой строчке вашего главного файла. То есть, если ваша программа называется, например, foo.exu:

        #!/home/me/euphoria/bin/exu
        
        procedure foo()
            ? 2+2
        end procedure

        foo()
Затем вы делаете ваш файл исполняемым:
        chmod +x foo.exu
А затем просто вызываете его на исполнение:
        foo.exu 
чтобы запустить свою программу. Вы можете даже укоротить имя программы до простого "foo". Интерпретатор Euphoria игнорирует первую строку, если она начинается с #!. А командный интерпретатор ОС Linux трактует такую строку как путь к программе (т.е. интерпретатору Euphoria), предназначенной для открытия (запуска) данного файла. Но будьте внимательны - эта первая строка должна заканчиваться в стиле Linux/FreeBSD символом перевода строки \n, а не в стиле DOS/Windows символами возврата каретки - перевода строки \r\n, иначе командный интерпретатор Linux/FreeBSD может сбиться. Если ваш файл окутан, вы должны указывать путь к backendu, а не к exu.

Что касается связанных файлов, их можно получить, запустив bind.bat (DOS32) или bindw.bat (WIN32), или bindu
(Linux/FreeBSD), чтобы связать вашу программу Euphoria с ex.exe, exw.exe или exu в единый самостоятельный двоичный исполняемый файл (типа .exe для DOS/Windows). С таким самостоятельным .exe-файлом вы можете уже и перенаправлять стандартные ввод и вывод. Окутывание и связывание подробно обсуждаются в разделе 1.5 Распространение программы.

Используя транслятор с Euphoria на Си, вы можете получить другой вариант самостоятельного .exe-файла, который обычно будет исполняться значительно быстрее, чем связанная программа.

exu или ex.exe и exw.exe находятся в каталоге euphoria\bin, который должен быть в пути поиска. Переменная окружения EUDIR должна указывать на главный каталог Euphoria, т.е. c:\euphoria.


1.3.1 Запуск под Windows

Вы можете запускать программы Euphoria прямо из окружения Windows или из оболочки DOS, которую вы открыли из Windows. Ассоциируя .ex-файлы с интерпретатором ex.exe, а .exw-файлы с интерпретатором exw.exe, вы можете затем просто сделать двойной щелчок мышью на .ex- или .exw-файле, чтобы запустить их на исполнение. Под Windows вам следует задать новый тип файла для расширения .ex, последовательно щёлкнув на значке My Computer и опциях / view / options / file types. Несколько программ Euphoria могут исполняться одновременно в разных окнах. Если вы преобразовали свою программу в .exe-файл, вы можете запускать её двойным щелчком мыши на её значке - как и любую другую программу Windows.


1.3.2 Использование файла памяти

Если ваша программа Euphoria исполняется под Linux/FreeBSD или Windows (или в оболочке DOS под Windows) и ей недостаточно свободной оперативной памяти, она начинает использовать "виртуальную память". Операционная система предоставляет такую память вашей программе автоматически, выгружая часть менее актуального кода и данных из оперативной памяти на диск, в системный файл памяти (его ещё называют файлом "подкачки" или своп-файлом). Чтобы изменить размер файла памяти под Windows, щёлкните Control Panel / 386 Enhanced / "virtual memory...". Под OS/2 вы можете подстроить величину "DPMI_MEMORY_LIMIT", щёлкнув на значке виртуальной DOS-машины, "DOS Settings", чтобы выделить больше расширенной памяти для своей программы.

Под чистой DOS, вне Windows, системный файл памяти отсутствует, поэтому расширитель DOS, встроенный в интерпретатор ex.exe (DOS32), создаёт свой собственный файл памяти для использования вашей программой. Прочтите файл platform_r.doc, там есть кое-какие подробности на этот счёт.



1.4 Редактирование программы

Вы можете использовать любой текстовый редактор, предназначенный для программистов, чтобы редактировать программы Euphoria. Тем не менее, Euphoria поставляется со своим собственным специальным редактором, который написан полностью на Euphoria. Введите: ed, добавив полное имя файла, который вы желаете редактировать (расширения .ex/.exw/.exu также необходимо указывать). Вы можете здесь редактировать и любые другие файлы обычного текстового формата. Когда вы редактируете файл Euphoria, доступны некоторые преимущества, такие как цветное подсвечивание правильного синтаксиса и автозавершение ряда типовых конструкций языка - чтобы сделать вашу работу полегче.

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

Под Windows вы можете ассоциировать ed.bat с разнообразными типами файлов обычного текстового формата, которые вам приходится редактировать. Цветная подсветка синтаксиса будет работать с файлами типов .ex, .exw, .exu, .e, .ew, .eu, и .pro (файлы профиля).

Редактор работает в режиме вставки символов в курсорную позицию. Клавиша Esc открывает строку меню со специальными командами. Клавиши со стрелкам и Insert/Delete/Home/End/PageUp/PageDown также активны. Под Linux/FreeBSD некоторые служебные клавиши могут быть недоступны, но для них назначены альтернативные клавиши с той же функциональностью. Прочтите инструкцию euphoria\doc\ed_r.doc (euphoria\html\ed_r.htm) по управлению редактором. Esc h (help) откроет для вас эту инструкцию (ed.doc) в отдельном окне во время сеанса редактирования.

Если вы захотите получше понять работу или изменить функционирование этого редактора по своему вкусу, вы можете в нём же редактировать файл программы редактора ed.ex, расположенный в каталоге euphoria\bin, (не забудьте сделать резервную копию, чтобы не потерять работоспособный редактор при неудачном его изменении). Если имя ed конфликтует с некоторой другой командой на вашей системе, просто переименуйте файл euphoria\bin\ed.bat на что-нибудь ещё. Поскольку этот редактор написан на Euphoria, его код замечательно краток и лёгок для понимания. Такой же по функциональности редактор, но воплощённый на языке вроде C, потянул бы намного больше строк кода.

ed -- это простой редактор текстового режима, который работает на консолях DOS, Linux, FreeBSD и Windows. Поинтересуйтесь также превосходным редактором ee.ex Дэвида Куни для DOS и Linux/FreeBSD. Вы можете получить ee.ex на сайте Euphoria. Имеются также редакторы для Windows, ориентированные на Euphoria. Их тоже можно здесь найти.



1.5 Распространение программы

Euphoria предлагает 4 различных пути распространения программы.

По первому методу вы просто снабжаете своих пользователей файлом ex.exe или exw.exe, или exu в совокупности со своим главным файлом Euphoria (.ex, .exw, или .exu) и любыми библиотечными файлами (.e), которые необходимы для работы вашей программы (включая любые стандартные из каталога euphoria\include). Если файлы исходного кода Euphoria размещены все вместе в одном каталоге, а ex.exe, exw.exe или exu находятся там же или где-то по пути поиска, то ваш пользователь может запустить вашу программу, введя команду ex, (exw) или (exu) и сопроводив её путём к вашему главному файлу .ex, .exw, или .exu. Вы можете также сделать маленький .bat-файл, так чтобы люди не набирали при вводе лишнюю команду ex (exw). Этот метод предполагает, что вы не возражаете против того, чтобы поделиться исходным кодом своей программы со своими пользователями.

Биндер даёт вам ещё два метода распространения программы. Вы можете окутать свою программу, или вы можете связать свою программу. Окутывание объединяет все библиотечные .e-файлы, которые нужны вашей программе, вместе с вашим главным файлом в единственный .il-файл. Связывание объединяет вашу окутанную программу с backend.exe, backendw.exe или backendu в единственный, отдельный исполняемый (.exe) файл. Например, если ваша программа называется "myprog.ex", вы можете создать "myprog.exe", которая будет исполняться точно так же как и исходная. Прочтите подробные инструкции по окутыванию и связыванию -- bind_r.doc.

И, наконец, четвертый метод реализуется с помощью транслятора с Euphoria на Си, который транслирует вашу программу Euphoria на язык C, а затем компилирует результирующий код C компилятором C, создавая отдельный скоростной исполняемый файл (.exe), отличающийся от того, который производится посредством связывания.


1.5.1 Лицензия

Система программирования Euphoria является свободной и открытой и вобрала в себя труд многих людей. Вы имеете полное право распространять любую программу Euphoria, которую вы разработали, без каких бы то ни было авторских отчислений. Вы можете также распространять файлы ex.exe, exw.exe и exu, если они необходимы для запуска вашей программы. То же самое относится и к исполнительным блокам интерпретатора: backend.exe, backendw.exe и backendu. Вы можете окутывать или связывать ваши программы и распространять результирующие файлы также без авторских отчислений.

Вы можете присоединить любой файл исходного кода Euphoria, имеющийся в данном пакете, к своей программе "как есть", либо со своими модификациями. (Вам, вероятно, понадобится несколько стандартных файлов из каталога euphoria\include для создания любой большой программы).

Нам будет приятно, если вы скажете людям, что разработали свою программу с использованием Euphoria, и дадите им адрес http://www.RapidEuphoria.com нашего узла Web, но мы не требуем подобного рода изъявлений благодарности.

Файлы значков, такие как euphoria.ico из каталога euphoria\bin, могут распространяться с вашими изменениями или без них.

Высокоскоростная версия исполнительного блока интерпретатора Euphoria написана на ANSI C, и может быть откомпилирована с помощью многих различных компиляторов Си. Полный исходный код имеется в каталоге euphoria\source, вместе с execute.e, альтернативной версией написанного на Euphoria исполнительного блока. Наша весьма щедрая Лицензия открытого кода позволяет и персональное, и коммерческое использование кода, и, в отличие от многих других лицензий открытого кода, ваши изменения в этом коде не должны быть обязательно также открытыми.

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

 

... продолжение
2. Определение языка