Статические типы и преобразования
Предположим, у меня есть язык, похожий на algol, со статическими типами и следующим фрагментом кода:
a := b + c * d;
где a
это поплавок, b
целое число, c
двойной и d
вместе. Затем язык будет конвертировать d
долго работать с c
, а также b
удвоить, чтобы оперировать c*d
результат. Итак, после этого, двойной результат b+c*d
будет преобразован в число с плавающей точкой, чтобы присвоить результат a
, Но когда это происходит? Я имею в виду, все ли преобразования происходят во время выполнения или во время компиляции?
И если у меня есть:
int x; //READ FROM USER KEYBOARD.
if (x > 5) {
a:= b + c * d;
}
else {
a := b + c;
}
Приведенный выше код имеет условия. Если компилятор преобразует это во время компиляции, некоторая часть может никогда не запуститься. Это правильно?
1 ответ
Вы не можете выполнять преобразование во время компиляции больше, чем вы можете делать сложение во время компиляции (если только компилятор не может определить значение переменной, возможно, потому что она на самом деле является постоянной).
Компилятор может (и делает) генерировать программу с инструкциями, которые добавляют и умножают значение переменных. Он также генерирует инструкции, которые преобразуют тип сохраненного значения в другой тип до вычисления, если это необходимо.
Языки, которые не имеют фиксированных типов переменных во время компиляции, должны выполнять проверки во время выполнения и условно преобразовывать значения в различные типы. Но я не верю, что это имеет место с любым из языков, включенных в общую категорию "Алголоподобный".