Cтраница 2
Кроме основного синтаксического анализа, особо трудными для процесса трансляции являются задачи получения эффективных команд для ввода-вывода, доступа к данным и преобразований типа. Вследствие разнообразия допустимых структур файлов и большого количества различных операций, с помощью которых можно осуществлять доступ к файлам, получить эффективный код для этих операций трудно. Аналогичные проблемы возникают и в случае неявных преобразований типов, так часто происходящих в Кобол-программах. Большое разнообразие допустимых спецификаций типов приводит к чрезвычайно сложному множеству возможных преобразований, которые могут встретиться в программе и для которых необходимо сгенерировать эффективный код. Доступ к данным внутри записей и массивов затрудняется машинной независимостью описаний данных в программе; это часто приводит к тому, что индивидуальные элементы данных не укладываются в естественных границах слов машинной памяти. Например, элемент данных может попасть частично в одно слово, а частично в другое. Генерация кода для эффективного доступа к таким элементам данных часто затруднительна, но она чрезвычайно важна для эффективности выполнения программы. [16]
С таким подходом резко контрастирует подход, используемый в языке Си, при котором любые неявные преобразования типов либо разрешены, либо не диагностируются трансляторами с языка Си. Например, используемый автором транслятор с языка Си, работающий на ЭВМ Interdata 8 / 32, диагностирует лишь одну ошибку в программе, написанной на языке Си и приведенной ниже. На практике трудно встретить программу, написанную на языке Си и не использующую неявных преобразований типов. При этом наиболее часто встречаются неявные преобразования от символьного типа к целому. [17]
Операции связаны с типами, а не наоборот. При выполнении операции необходимо обеспечить, чтобы ее операнды и результат отвечали определенному типу. В некоторых случаях C выполняет неявное преобразование типов; в других используется приведение ( casting), или явное преобразование типов. [18]
В языке Паскаль разрешены только такие неявные преобразования типов, которые не приводят к потере информации. Для проведения преобразований типов, приводящих к потере информации, в языке Паскаль предусмотрены соответствующие функции преобразования типов, которые должны быть вызваны явно. В языке Си в отличие от языка Паскаль допускается неявное преобразование типов для всех базовых типов и указателей. Однако Мобильный Транслятор с языка Си выводит предупреждение о каждом встретившемся в программе случае неявного преобразования типов, в котором участвует указатель. [19]
В языке Паскаль разрешены только такие неявные преобразования типов, которые не приводят к потере информации. Для проведения преобразований типов, приводящих к потере информации, в языке Паскаль предусмотрены соответствующие функции преобразования типов, которые должны быть вызваны явно. В языке Си в отличие от языка Паскаль допускается неявное преобразование типов для всех базовых типов и указателей. Однако Мобильный Транслятор с языка Си выводит предупреждение о каждом встретившемся в программе случае неявного преобразования типов, в котором участвует указатель. [20]
Тип данных переменной определяет род информации, диапазон представления и множество допустимых операций. Языки МЭК используют идеологию строгой проверки типов данных. Это означает, что любую переменную можно использовать только после ее объявления. Присваивать значение одной переменной другой можно, только если они обе одного типа. Допускается также присваивание значения переменной совместимого типа, имеющей более широкое множество допустимых значений. В этом случае происходит неявное преобразование типа без потерь. Неявные преобразования типов данных с потерями запрещены. [21]
Тип данных переменной определяет род информации, диапазон представления и множество допустимых операций. Языки МЭК используют идеологию строгой проверки типов данных. Это означает, что любую переменную можно использовать только после ее объявления. Присваивать значение одной переменной другой можно, только если они обе одного типа. Допускается также присваивание значения переменной совместимого типа, имеющей более широкое множество допустимых значений. В этом случае происходит неявное преобразование типа без потерь. Неявные преобразования типов данных с потерями запрещены. [22]