Но во многих программах забота о каких-то новых типах данных не приносит значительных преимуществ, и вам может вполне хватить четырёх имеющихся предопределённых типов. В отличие от других языков, механизм типов Euphoria даёт вам более свободный выбор. А с типом object вы можете и не вспоминать о наличии остальных трёх.
Тем не менее, для крупных программных проектов определение более конкретных типов может помочь в процессе отладки. Со строго конкретными типами данных логические ошибки отлавливаются вблизи места их зарождения и их распространение по скрытным путям в другие части программы пресекается. Более того, всегда проще размышлять о причинах неправильного поведения некоторого небольшого участка кода, когда у вас есть гарантия, что используемые здесь переменные всегда имели законную величину, а вот требуемый результат отсутствует.
Типы также дают возможность получить осмысленную, проверенную на машине документацию о вашей программе, делая более простым понимание вашего кода другими, да и вами тоже, по прошествии некоторого времени. Комбинирование проверки индексов, проверки инициализации пременных и других обязательных проверок, которые всегда действуют, с продуманной ограниченной проверкой заданных типов делает отладку в Euphoria значительно более простой, чем в большинстве других языков. Повышается и надёжность программы, так как многие скрытые ошибки, проскакивающие фазу тестирования в других языках, здесь практически полностью отлавливаются.
Анекдот 1:Перенеся большую программу C на Euphoria, мы обнаружили ряд скрывавшихся ранее ошибок. Хотя данная программа C и заслужила большое доверие как якобы тотально "корректная", мы нашли: ситуацию, где считывалась неинициализированная переменная; место, где элемент номер "-1" одного из массивов беспрепятственно записывался и считывался; ситуацию, где что-то выводилось как раз мимо экрана. Эти проблемы вели к ошибкам, которые были не слишком заметны для не очень внимательного наблюдателя, и код C успешно прошёл тестирование. Анекдот 2:Алгоритм Quick Sort, представленный на странице 117 "Написания эффективных программ" Джона Бентли, имеет ошибку индексирования! Этот алгоритм будет иногда считывать элемент из памяти непосредственно перед началом сортируемого массива, и будет считывать из памяти элемент непосредственно после конца массива. Хотя и читается какой-то мусор, оставшийся от другой программы, алгоритм всё ещё работает - вероятно, поэтому ошибка никогда и не была обнаружена. Но что, если бы по тем адресам вне массива не было никакой (виртуальной) памяти? Бентли позже модифицировал алгоритм так, что эта ошибка уходит -- но он представлял и раннюю версию как правильную. Даже экспертам нужна проверка правильности индексирования! Примечания о производительности:Когда программист широко применяет свои собственные типы, их проверка интерпретатором добавляет ко времени исполнения программы всего 20..40 процентов. Оставляйте проверку включенной, если вам не нужна действительная экстра-скорость. Вы можете также предусмотреть её выключение только для нескольких особенно сильно загруженных вычислениями подпрограмм. Профилирование может помочь в принятии правильного решения.
В 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 нулей
Читать дальше