Язык программирования Euphoria | страница 29



Алгоритм Quick Sort, представленный на странице 117 "Написания эффективных программ" Джона Бентли, имеет ошибку индексирования! Этот алгоритм будет иногда считывать элемент из памяти непосредственно перед началом сортируемого массива, и будет считывать из памяти элемент непосредственно после конца массива. Хотя и читается какой-то мусор, оставшийся от другой программы, алгоритм всё ещё работает - вероятно, поэтому ошибка никогда и не была обнаружена. Но что, если бы по тем адресам вне массива не было никакой (виртуальной) памяти? Бентли позже модифицировал алгоритм так, что эта ошибка уходит -- но он представлял и раннюю версию как правильную. Даже экспертам нужна проверка правильности индексирования!Примечания о производительности: Когда программист широко применяет свои собственные типы, их проверка интерпретатором добавляет ко времени исполнения программы всего 20..40 процентов. Оставляйте проверку включенной, если вам не нужна действительная экстра-скорость. Вы можете также предусмотреть её выключение только для нескольких особенно сильно загруженных вычислениями подпрограмм. Профилирование может помочь в принятии правильного решения.


2.5 Команды

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

* команда присваивания

* вызов подпрограммы

* команда if (если)

* команда while (пока)

* команда for (для, от)

* команда return (выдать, вернуться)

* команда exit (выйти)

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


2.5.1 команда присваивания

В Euphoria команда присваивания служит для придания величины, полученной при вычислении выражения, простой переменной или элементу ряда, или отрезку ряда, то есть,


>x = a + b


>y[i] = y[i] + 1


>y[i..j] = {1, 2, 3}


По этой команде предыдущая величина переменной или элемента(ов) ряда, или отрезка ряда аннулируется, а новая вступает в действие. Например, предположим, что x был 1000-элементным рядом, который мы инициализировали следующим образом:


>object x


>x = repeat(0, 1000) -- ряд, состоящий из 1000 нулей


а затем мы присвоили x значение атома:


x = 7


Такое действие полностью законно, так как мы объявили x как object. Предыдущая величина x, а именно, 1000-элементный ряд, просто исчезнет. Одновременно то пространство, которое занимал в памяти 1000-элементный ряд, будет автоматически возвращено в резерв вашей программы, благодаря динамическому распределению памяти, работающему в Euphoria.