Страна Радостных Программистов

Трэвис В. Беати





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

Легкость изучения


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

extern const int* fubar(void);


Итак, что бы это могло, в конце-то концов, означать?  В книжке по C, которую я сейчас изучаю, есть целый раздел, посвященный всего лишь точному переводу этого объявления на простые человеческие слова.  Можно ли поверить, что в этом объявлении описана функция и ее сцена?  Что эта фукция не имеет параметра?  Какого вида эта функция?  Как к ней добраться из другого файла?  Что она вырабатывает целочисленный указатель?  Но что же, этот указатель постоянен?  Или константа содержит адрес целочисленного указателя?

Посмотрим теперь на строку аналогичного назначения в Euphoria.
 

global function fubar()


Первое, что бросается в глаза - Euphoria не имеет указателей; действительно, в них нет первостепенной необходимости, в С же без них просто не обойтись, хотя они и расширяют список путей, на которые программа может вдруг свернуть с намеченного вами единственно верного пути.  В Euphoria не требуется никакой "слепой веры" в то, что действительно эта строка относится к определяемой ею ... функции, именно так, как это и сказано.  И просто читая, каждый может видеть, что функция имеет "глобальную" сцену, которая интуитивно легко воспринимается как доступная из любой точки программы.  Далее, каждому немедленно видно, что функция не требует подачи в нее параметров -- в отличие от предыдущего случая с функцией C, так как C - это язык, который требует от вас идиотской писанины именно тогда, когда писать, собственно, и не о чем. Вы должны написать для компилятора что-то о том, что вашей функции не надо ничего.  И наконец, никому не нужно объявлять функцию как константу, а достаточно поместить в константу величину, выданную функцией.

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

Продолжим, возьмем еще другой пример сравнения C против Euphoria:  программу "hello world".  Ниже приведен код C, который будет просто печатать на чистом экране DOS, в верхней строчке, в левом углу текст "Hello World! - Привет, Вселенная!". 1
 

#include <stdio.h>
#include <conio.h>
int main(argc, argv[]) {
        clrscr();
        puts("Hello World!");
        return 0;
}
А теперь труднодоступная длинная версия Euphoria:
clear_screen()
puts(1, "Hello World!\n")
Наиболее примечателен факт, что Euphoria намного более человеческий и понятный язык, чем его противник С.  Не нужны никакие библиотеки для этого основного классического примера, а код не требует его размещения в функции только для того, чтобы запустить этот же код на исполнение. 2

Намного легче изучать язык, если простое чтение текста на нем не является первейшей из всех других задач, которые должен решить новичок.  Попробуйте еще раз прочитать этот обычный пример, написанный на C и на Euphoria - версия Euphoria намного легче читается, не так ли?  Эта "легкость чтения" становится даже еще более заметной, когда программа усложняется, достигая точки, где код C уже перегружен указателями, а Euphoria еще и не обращалась к этому оружию, которое может оказаться катастрофическим и для того, кто его применил. 3

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

Словами Роберта Крейга, создателя Языка Программирования Euphoria, " ... ваш пакет C/C++ имеет 57 различных процедур для выделения памяти и 67 различных процедур для манипулирования строками и блоками памяти."4  В Euphoria выделение памяти осуществляется интерпретатором, а не программистом.  И есть еще одна материя, как и в любом другом языке - манипулирование строками.  В C программист-новичок (в группу которых вхожу я) должен выбирать из массы раличных функций, которые во многом очень похожи и имеют минимальные различия.  Такие функции C как strcat() и strcpy(), конечно, достаточно просты.  Но может кто-нибудь сразу же рассказать, что делает strtoll()?  Как насчет strcspn()?  В чем различия между strcat() и strncat(), кроме очевидного факта наличия лишней буквы в наименовании одной из этих функций (попробуйте эту лишнюю букву углядеть после всенощного программирования)?  Если вы ошибетесь в этой букве, как минимум, вы не поймете, почему у вас результат не тот, а если не повезет, вы можете и обнулить всю память, что потребует, как минимум, перезапуска машины.  Шуршание многими сотнями страниц документации C - это обычная участь новичка, особенно под угрозой того, что применение неверной функции может иметь очень плохие последствия.

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

Могут возразить, что BASIC так же легок в изучении и даже близко не стоит рядом с C по сложности.  Да, правда, он не может так сбивать с панталыку как C.  Тем не менее, именно с точки зрения легкости изучения я убедился, что Euphoria еще легче в изучении, особенно для начинающего программиста.  Как и C, BASIC имеет ряд своих особенностей, каждая из которых отличается от других только своими собственными трудностями.  Эти трудности далеки от области изучения и все они говорят против BASIC; таким образом, имеется множество других факторов, которые обусловливают громадное превосходство Euphoria.
 
 

Интерпретирующий И Быстрый


Хотя это и звучит как "горячий лед" (окс'юморон), язык Euphoria является и очень быстрым, и интерпретирующим.  Во-первых, насколько же быстра Euphoria?  Можно, конечно, прочитать, что написано об этом в документации, но это чтение не избавит вас от ощущения, что мистер Крейг представляет эту информацию лишь для того, чтобы продавать свой продукт каждому простаку в Internet, который клюнет на эту наживку.  Правда же заключается в том, что Euphoria намного быстрее, чем все другие интерпретирующие языки программирования, которые исследовал я.  В свободную версию пакета входят тесты производительности, которые каждый может запустить сам и лично проверить результаты мистера Крейга.  Основываясь на том, что видел я, Euphoria основательно быстрее чем Liberty Basic, QBasic и Visual Basic, впечатляюще быстрее чем Python, и абсолютно опережает Java5.  И это факт, что иногда она может конкурировать по скорости с компилируемыми языками, такими как Free Pascal и C.  Я не видел, где она отстает заметно, кроме случаев при сравнении с C, когда это действительно может показаться проблемой ... если проблема существует на самом деле, так как код C ведь может быть откомпилирован в библиотеку DLL, к которой имеет доступ Euphoria для тех случаев, когда необходимо выполнение критичных к скорости операций6.

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

Безопасность


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

Какие другие аспекты делают Euphoria безопасным языком?

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

Основой потребности в указателях является выделение памяти.  Чтобы разместить информацию в областях памяти вне стека, кто-то может вручную выделить такую память -- сказать операционной системе, "Эта память моя.  Никому ее не трогать."  Когда программист выделяет такую память, он получает от выделяющей функции указатель на первую ячейку выделенного ему блока (адрес), который он может затем использовать как вход в свою область памяти, только что ему выделенную.  В этом месте возможны две проблемы.  Во-первых, некоторая ошибка в коде может изменить величину указателя ... это приведет к промаху в отношении того самого входа в свою область.  И пользователь хотя и будет посылать свою информацию в ОЗУ, но совсем не туда, куда ему на самом деле хотелось бы, да и нужно бы.  Вторая проблема заключается в том, что пользователь может забыть "освободить" память, когда закончил с ней работать.  Если память не освобождать, операционная система продолжает держать ее в неприкосновенности для всех других программ.  Если такое случается неоднократно или область памяти велика, это явление начинает называться утечкой памяти и в конце концов может привести к исчерпанию памяти, доступной для программы.

В Euphoria указатели не нужны, так как программист не обременен заботой о выделении памяти для своей программы и ее подпрограмм, равно как и заботами об освобождении и другом обслуживании памяти.   Обо всем этом заботится интерпретатор.  Подобная система избавляет программиста от решения задачи, где хранить переменную - в стеке, в куче или даже в регистре.  Программист просто объявляет переменную и использует ее.  Аналогично, когда программа больше не нуждается в переменной, интерпретатор очищает стек и освобождает любую память, которая теперь стала не нужна программе.  И в отличие от некоторых других языков этот процесс, известный как сбор мусора, приборка, выполняется непрерывно -- не только тогда, когда грязи невпроворот (что может потребовать приостановки программы).   И великолепие данной системы в том, что эти манипуляции с памятью полностью прозрачны для программиста, он не видит, что ненавязчиво и незаметно для него делается громадная работа. 7
 
 

Легкость отладки


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

Перво-наперво, обсудим некоторые возможности, которыми Euphoria обладает, чтобы хватать ошибки до того, как они случились.  Обычная коварная ошибка в C связана со строками.  Конец строки в C определяется с помощью нуль-терминатора, который в памяти представляет собой ячейку с нулевым содержимым.  Если программист сделает что-то, удаляющее нуль-терминатор, или другое что-то заставит указатель на строку перепрыгнуть через эту ячейку, строка станет бесконечной.  Техническое название для такого недоразумения тоже есть - "чтение за концом массива".  Вспомним, что в С строка это ни что иное, как массив символов.  Тот самый 0 просто обозначает конец этого массива.  Итак, поскольку компилятор так задуман, он не достигнет знаков нуль-терминатора.  Но, если вы читаете после последнего элемента массива, C не скажет вам об этом:  он просто будет считать, что именно вы именно ведаете о том, что творите, и будет нестись по этой дорожке, никогда не задаваясь вопросом, как это вдруг массив, объявленный как содержащий три целочисленные величины, разросся до размеров в 20M.

В Euphoria, в техническом смысле, "строка" это также ни что иное, как массив символов (в терминах Euphorian "строка" является рядом целочисленных элементов).  Важное различие имеет две стороны.   Во-первых, пока программист так не решит, нуль-терминаторов просто нет.  О конце ряда заботится интерпретатор, а не какой-то маркер, который может быть нечаяно стерт программистом.  И во-вторых, что более важно, интерпретатор не разрешает программисту читать после конца ряда!  Попробуй программист сделать это, тут же программа будет остановлена с сообщением об ошибке, информирующим, что могло быть бо-бо.  То же самое касается попыток чтения перед началом ряда.

Продолжая наше гонение на C и добавляя несколько пинков BASIC, мы должны сказать и о другой поистине чертовской ошибке:  получении переменной значения, которое абсолютно бессмысленно.  Обычно это случается, когда вы объявляете переменную, а затем пытаетесь читать ее, не придавая ей первоначальной величины.  Когда C создает переменную для вас, он дает ей место в памяти.  Таким образом, данные, которые находятся на этом месте в памяти, становятся величиной этой только что созданной переменной, до тех пор, пока вы не присвоите этой переменной вполне определенного начального значения.  Так, если вы объявили, например, целочисленную переменную под именем Var, а затем немедленно прочитали эту переменную, ее значение может оказаться равным 26, 3500, -422 или 0, в зависимости от того, что было в памяти по адресу этой новой вашей переменной.

С другой стороны, наибольшее из достоинств BASIC на деле может оказаться той же самой ошибкой, но на ином уровне уродства.  Предположим, в C, находясь в ошибочной уверенности, что ваша вновь объявленная переменная Var имеет величину, равную 1, вы вычисляете выражение:
 

Result = Var + 10


Если результат окажется равным -350, одно из первых ваших предположений будет, что переменная не имела начального значения.   Но BASIC имеет на этот случай "крутую фичу" автоматической инициализации для вас объявляемых вами переменных.  В случае с целочисленными переменными эта особенность сделает вашу переменную сразу же после объявления равной 0.  Прекрасный жест помощи и экономия времени, не так ли?.  Но если вы пойдете тем же самым путем, проделав тот же самый опыт на BASIC, как и выше на C, результат будет иметь величину 10.  Ошибка на единицу может быть до поры до времени совершенно незаметна в некоторых случаях, вы можете буквально очуметь, не понимая, почему ваш графический алгоритм вычерчивает линию на один пиксел длиннее, как вы не бьетесь. Могут пройти часы безуспешной трассировки, пока до вас дойдет, "Черт бы меня побрал!  Я же забыл инициализировать ту ... пустую ... переменную!"

Теперь обратимся к Euphoria.  Euphoria, подобно C, не инициализирует для вас переменные.  Но, в отличие от C, Euphoria не разрешает вам читать неинициализированные переменные!  Этот пустячок очень важен.  Если вы попытаетесь проделать тот же самый опыт выше, на этот раз с Euphoria, у вас не будет ни малейшего шанса прочитать значение результата:  программа будет остановлена и вы получите сообщение, что пытаетесь прочесть то, чего на самом деле просто еще нет - пытаетесь прочесть неинициализированную переменную.  Это сохранит вам, буквально, часы трассировки -- охоты на блох.

И всего пару слов о другом роде ошибки, которая проявляется во многих языках:  о "выкатывании".  Это происходит, когда величина переменной превосходит максимальное значение, которое эта переменная может принимать.  Во многих языках переменная будет "выкатываться" в точности как автомобильный счетчик километров сбрасывается на ноль, когда пробег вашего авто превысил тот максимум, на который счетчик расчитан.  К примеру, если максимальная величина переменной типа x составляет 255, и переменная уже равна 255, добавление к ней 1 приводит к тому, что переменная молча становится 0.  Или еще хуже.  В Euphoria ситуация "выкатывания" обозначается автоматически.  Если вы манипулируете с целочисленными величинами, вас предупредят об ошибке при проверке типов.  Если вы работаете с переменной, имеющей тип, известный как "атом", вы получите специальную величину, обозначающую +/-бесконечность.

К сожалению, даже с такими специальными возможностями языка вы будете время от времени попадать в ситуацию, когда дела пошли не по вашему плану.  (Большей частью, такие ситуации в Euphoria являются значительно менее опасными, чем в других языках.)  Если ваш ошибочный код схвачен во время обработки интерпретатором ... читай - "те вещи, которые иногда отлавливает и компилятор в других языках" ... вы получите содержательное сообщение об ошибке, решающее проблему.  Если в вашей программе случится ошибка "времени прогона", ... то есть, проблема, которая не видна, пока программа не запущена на исполнение ... вы также получите содержательное сообщение, информирующее вас об ошибке8.  В похожей ситуации на C программа просто остановится (или ваш компьютер просто "повиснет"), или, если вы работаете под Windows, вы увидите чудесный диалог "Exception" с кнопочкой, который не скажет вам абсолютно ничего полезного.

Знание о наличии проблемы - это одна вещь, решение же проблемы - это нечто совершенно другое.  В некоторых языках получить сведения о том, что делают ваши переменные во время прогона программы, очень трудно.  В большинстве случаев программист вынужден вводить добавочные операторы для немедленной печати переменных в различных частях своей программы с целью получения хотя бы каких-нибудь сведений.  Некоторые другие языки, такие как C, C++ и Visual Basic, имеют приспособления для "трассировки" программ, то есть, еще одну программу, по большей части только добавляющую еще забот об адекватности или настолько сложную, что вы проводите больше времени за отладкой отладчика, чем за отладкой с помощью отладчика вашей программы.

Euphoria, с другой стороны, имеет полностью адекватную и простую в использовании систему трассировки, которая работает и в бесплатной, и в зарегистрированной версиях!  Используя режим трассировки, программист может исполнять строки кода поочередно и наблюдать и переменные, и что более важно, величины, которые эти переменные принимают в любой точке во время исполнения программы.  К тому же, ошибка времени прогона вызывает полную распечатку в файле переменных и их значений, а также листинга строк программы, предшествовавших остановке программы по ошибке, файл называется ex.err.  Может быть полезной даже особая тактика отладки, когда вы намеренно вызываете остановку своей программы по искусственной ошибке, чтобы получить файл с этой распечаткой.  (Мой любимый саморазрушающий код
? 1/0 
Он работает безотказно.)
 
 

Размеры


Еще одной причиной симпатии к Euphoria является размер файлов собственно языка.  Не сомневайтесь, бесплатная версия вполне поддается загрузке, включая все системные стандартные библиотеки и документацию, все это гораздо меньше 1M в размере, это сюрприз, особенно, при почти неправдоподобной мощности языка.  (Размер файлов, добавляемых в полной редакции, не изменит значительно этот подсчет)  Размер не является одной из определяющих особенностей Euphoria, но он очень важен при некоторых условиях.  Во-первых, от него зависит время и возможность загрузки из сети, особенно, если вы хотите программировать на машине, которая не подключена или не может быть подключена к Internet.  Большинство из языков "public domain" выглядит как монстры.  Воплощения C++ занимают в любом случае не менее 5M, 20M - обычное дело.  Варианты C, имеющие некоторые ограничения, в типовом случае потянут около 2M.  Python потребует загрузить 9M, без документации.  Java и Perl, если принять в расчет документацию и все другие "штучки", которые необходимы, достигают 30M.  А демонстрационная версия Delphi?  80M!9  Размер необходимых основных файлов языка также очень важен и с более старыми машинами, которые не имеют современных многогигабайтных жестких дисков.
 
 

Цена


Есть еще одна очень привлекательная особенность Euphoria - цена.  Предложения Microsoft, такие как Visual Basic и Visual C++, стоят $300, и это урезанные модели.  За "профессиональные" версии с вас могут без всякого стеснения запросить $1,000 и более.  Но по моему мнению, ни один из этих языков не может делать то, что не может быть сделано с помощью Euphoria.  Цена пакета Euphoria зависит от того, какой именно пакет вы получаете, а также хотите вы получить дискету или вам достаточно электронной копии; в любом случае цена за платный пакет не превышает $50.

Но к цене пакета относится не только то, сколько стоит собственно язык программирования, как таковой.  Имеется ведь и другой код, который всегда под рукой и доступен.  Вам нужен мощный редактор (не тот простой, который входит в бесплатную версию), который ориентирован на Euphoria?  Вам нужен некоторый код, который делает x или делает y?  Или вы хотите учебник?  Алгоритм компрессии?  Графическую библиотеку?  А может, библиотеку для объектно-ориентированного программирования на Euphoria?  Игры, написанные на Euphoria?  Или, возможно, вам растрепал волосы ветерок скифских степей и вы хотите взглянуть на русскую документацию Euphoria ?  Da?

Во многих языках этот сорт вещей влетит вам в коппеечку.  В Euphoria эти вещи (в подавляющем большинстве случаев) бесплатны, и могут быть получены из официальных архивов Euphoria.  Эти файлы могут быть использованы в ваших программах независимо от того, какой версией языка (бесплатной или полной) вы располагаете.  И это не какие-нибудь наскоро слепленные примеры кода, а настоящие, документированные, исключительно полезные библиотеки.  Многие наиболее популярные библиотеки "промаркированы", так что не влияют на подсчет операторов в бесплатной версии, то есть на те самые ваши родные 300 операторов  .. так как они получили специальное благословение создателя языка!
 
 

Добро пожаловать в семью


Следующее, что я склонен относить к светлой славе Euphoria, и чего не мог бы сделать собственно язык.  Это изумительное сообщество, которое образовалось вокруг языка, которое создалось и развивает самое себя в двух различных направлениях:  список почтовой рассылки и архив готовых кодов, отмеченный выше.  Это сообщество невозможно назвать иначе, чем семьей в Internet, это яркие индивидуальности, каждая со своим жизненным путем и каждая из своего местечка на целой планете.  Это профессиональные программисты, кодеры-ковбои, игроки, сетевые эксперты, специалисты по компьютерной графике, любители, наконец.  Здесь пятнадцатилетние юнцы и убеленные сединами деды.  Но, как и во всякой настоящей семье, есть и такие, единственной целью в жизни которых является зрелище, на сколько людей сразу они могут сделать пи-пи одним-единственным своим сообщением.  Но это та самая семья, и я верю в это, которая составляет особую изысканную сияющую грань того самоцвета, которым является Euphoria.  В этой семье обсуждаются темы о языке, поддерживаются его сильные стороны, особое внимание уделяется тем особенностям, которые воспринимаются как его слабости, и дебатируются вопросы о том, что Euphoria должна или не должна в будущем иметь.  Некоторые хотят, чтобы Euphoria была более объектно-ориентированной, некоторые категорически против этого.  Другие хотят иметь воплощенным оператор goto (прим.перев. - без которого Euphoria прекрасно обходится).  Третьи считают, что этот оператор будет концом света.  И, как в вашей семье или в моей семье, случаются и короткие кошачьи драчки, и россказни побасенок.  Тем не менее, вопросы новичков приветствуются, и, временами, один вопрос может иметь результатом полный почтовый ящик ответов, каждый из которых дает свой собственный подход к проблеме, хотя и с небольшими, но отличиями.

Эта семья имеет также свое глубокое влияние на язык и на курс его развития.  Сама по себе Euphoria первоначально являлась языком, ориентированным на DOS.  Однако под влиянием одного из членов семьи, Дэвида Куни, программирование приложений Windows в Euphoria стало изумительно легким.  Его библиотека, названная win32lib.ew, теперь сплотила внутри семьи команду разработчиков, которые продолжают на добровольной основе улучшать эту жизненно важную библиотеку и добавляют в нее все новые возможности.
 
 

Поговорите с создателем, он выслушает вас


Завершая, нельзя не отметить, что, в отличие от почти всех авторов языков программирования, создатель Euphoria занимается не только компоновкой файлов и разработкой спецификаций языка, выбрасывая их потом толпе.  Создатель, Роберт Крейг, вполне доступен и по персональной электронной почте, и через список рассылки почты.  Он ответит на ваши вопросы, не сомневайтесь, его присутствие в семье Euphoria совершенно очевидно.  Могли бы вы запросто дать и-мэйл Биллу Гейтсу и достать его, чтобы он ответил вам по вопросу о Visual Basic?

Я думаю, что язык программирования Euphoria доказывает теперь свою возможность быть знаменитым, так как у него уже нет необходимости доказывать, что он лучший.  Пока многие из программистов придерживаются точки зрения, что "чем больше денег вы вгрохаете за язык, тем он будет лучше", Euphoria предлагает более безопасную, более легкую, более дешевую и, по большей части, более быструю альтернативу, я убежден в этом, за исключением некоторых уж очень специализированных программистских задач.  Программы, созданные с помощью Euphoria, могут быть в каждом своем бите так же профессиональны как и аналогичные программы, написанные на языках более почтенного возраста.  И хотя это может занять еще несколько лет, я совершенно убежден, что настанет день, когда вы увидите пакет "Euphoria" на одной полке с Visual Basic или C++ у вашего местного продавца программного обеспечения.
 
 



1. Этот обычный пример был написан и откомпилирован с использованием LCC-Win32.  В отличие от Euphoria, в которой имеется только единственный язык Euphoria, язык C имеет избыток диалектов -- код C, написанный для одного компилятора, может не работать корректно с другим.  Временами, требуется не только изучить C, но и знать другие диалекты для каждого из нескольких компиляторов, которыми располагает программист.
 

2.  Наиболее важно, с моей точки зрения, что в Euphoria нет необходимости завершать операторы точкой с запятой.  Хотя, на первый взгляд, это может показаться незначительным вопросом, но это лишь до тех пор, пока длительная компиляция у вас не прервется из-за единственного неправильно проставленного знака препинания, который на деле-то вовсе и не нужен!

3.  Хотя я и обращаюсь здесь только к C, но это далеко не единственный язык, на котором нужно писать такой замороченный, если не абсолютно дрянной, код.  Я рассмотрел примеры из двух языков глазами человека, который не имеет никаких знаний о языке, не может даже найти с определенностью команду, которая будет "печатать" строку!

4.  "Важное сообщение для всех программистов C/C++", из документации языка программирования Euphoria, версия 2.2, написанное Робертом Крейгом.

5.  Другим фактором, который нужно учесть, говоря о накладных расходах интерпретатора, является вопрос о том ... как долго интерпретатор размышляет, прежде чем начать исполнять ваш код.  Я заметил несколько случаев (некоторое время назад я пытался изучить и понять Java), в которых программа Euphoria уже заканчивалась, когда ее противник, программа Java, на деле еще только стартовала!

6.  Rapid Development Software сейчас выпустила Транслятор с Euphoria на C, переводящий код Euphoria в код C, который затем может быть откомпилирован компилятором C.  Это позволяет программисту Euphoria писать свои программы на Euphoria, а затем перевести их на C способом, который намного менее подвержен ошибкам и который значительно более эффективен, чем если бы кодирование на C было непосредственным.

7.  Если вы действительно хотите получить участок памяти в свое распоряжение для некоторых целей, Euphoria вам подыграет.  В ее библиотеке machine.e имеются функции, которые понравятся программистам C, это allocate(), mem_set(), mem_copy(), и free(), и они-то и выдают адрес, который может быть использован как указатель.   Тем не менее, в документации Euphoria есть предупреждение:
 

Некоторые из процедур ... небезопасны, в том смысле, что Euphoria не может держать вас за руки, если вы решили использовать эти процедуры некорректно. Вы можете подвесить программу или даже операционную систему. Если вы под DOS32 обратитесь не к тем адресам памяти, это еще может быть безопасно отловлено расширителем DOS CauseWay, и вы получите сообщение об ошибке и на экране, и в распечатке, выводимой в файл cw.err. Под WIN32 операционная система обычно будет выводить диалог о прекращении исполнения вашей программы и диагностическое сообщение с информацией о содержимом регистров. Под Linux обычно это будет нарушение сегментации.
В Euphoria имеется вторая библиотека, названная safe.e, которая хотя и работает медленнее, но позволяет предотвратить большее число проблем, когда слон вторгается в посудную лавку.
 

8.  Имеется одно главное отличие между бесплатной и полной версиями Euphoria.  В бесплатной версии вы получаете развернутое содержательное сообщение об ошибках времени прогонаn, пока размер вашей программы не превысил 300 операторов.  (Имеется также несколько библиотек, которые "промаркированы" и объем которых не влияет на подсчет операторов.)  После того, как вами пройден этот предел, вслед за остановкой программы по ошибке выводится простое сообщение без расшифровки существа ошибки.  Тем не менее, вы будете знать, что "Во время прогона вашей программы случилась ошибка ...", а не что-то другое.  Я могу сказать из своего опыта, что информация о существе ошибки в программах любого размера является отличным вложением для тех $40, которые вы отдаете, чтобы получить полное издание!

9.  Имейте в виду, что речь здесь идет о сжатых инсталляционных файлах.  Будучи разархивированы, они могут только увеличиться.  Сейчас у меня столько дополнительных библиотек, программ и т.д. в моем каталоге Euphoria, что я не уверен, что мог бы правильно экстраполировать размер основных несжатых файлов.  Тем не менее, я не могу не видеть, что они заметно не превышают абсолютный максимум в 2M.  Сколько же займет инсталляция 80M Delphi после декомпрессии?

Перевод с английского Качан И.Н.
Translation from English into Russian by Igor N. Kachan
kinz@peterlink.ru
http://www.private.peterlink.ru/kinz/