Несколько вопросов по компилятору

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Несколько вопросов по компилятору

Сообщение stix »

Здравствуйте! Заметил тут интересное выполнение откомпилированного кода:

1)
вот такой код даст мессаджи в обоих выражениях:

Код: Выделить всё

if (true or Message('wtf') = cmOk)
{
}

if (false and Message('wtf') = cmOk)
{
}
хотя в других языках высокого уровня второй аргумент не вычисляется, если первый аргумент точно определяет результат выражения

2)

Код: Выделить всё

procedure Foo;
var tmpVar;
{
   Message(tmpVar);
   tmpVar := 'Some val';
}

// Main code
Foo();
Foo();
вышеприведенный код выведет два сообщения - одно пустое, другое 'Some val'. Т.е. значения локальных переменных сохраняются у функции м/у вызовами, а хотелось бы, чтобы локальные переменные инициировались значениями по умолчанию.
Спасибо![/code]
Аватара пользователя
Screw
топ-софт
Сообщения: 73
Зарегистрирован: Пт, 14/09/2007 22:54
Имя Фамилия: Виталий Корзюк
Откуда: ТопСофт
Контактная информация:

Сообщение Screw »

1) vip всегда вычисляет логические выражения полностью. Такой метод опционально присутствует и в других языках высокого уровня, в частности, в Дельфи.

2) Время жизни локальной переменной в vip совпадает со временем жизни интерфейса. Отсюда и их способность сохранять значение даже за пределами области видимости. Значение по умолчанию устанавливается только при создании переменной. Особого смысла в чистке переменной при входе ее в область видимости нет: как и в других языках программирования локальные переменные, размещаемые в стеке, обычно содержат "мусор" и нуждаются в предварительной инициализации (чистке).
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

1) vip всегда вычисляет логические выражения полностью. Такой метод опционально присутствует и в других языках высокого уровня, в частности, в Дельфи.
Тут напрашивается оптимизация (в любом С-подобном языке такое есть). Скажем, если второе условие - это тяжелая операция, то она все равно будет выполнена, даже если это никак не повлияет на результат выражения (в случае если выражение однозначно определяется первым условием). Т.е. сейчас мне приходится все тяжелые операции проверки выносить на уровень ниже, т.е.

Код: Выделить всё

if (SomeCondition)
  if (SomeHardOperation())
    Func;
что не есть удобно, так как при увеличении количества проверок возрастает уровень вложений, код становится трудно читать и сопровождать

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

3) И кстати чем отличается (в смысле реализации и поведения) вот такие 2 функции:

Код: Выделить всё

procedure Foo;
var tmpVar;
{
} 
и

Код: Выделить всё

procedure Foo;
{
   var tmpVar;
} 
Спасибо!
Последний раз редактировалось stix Вт, 30/09/2008 14:53, всего редактировалось 1 раз.
Аватара пользователя
Screw
топ-софт
Сообщения: 73
Зарегистрирован: Пт, 14/09/2007 22:54
Имя Фамилия: Виталий Корзюк
Откуда: ТопСофт
Контактная информация:

Сообщение Screw »

1) В vip реализуется следующее правило: при выполнении условного оператора, если в логическом выражении присутствует поле невалидной таблицы, результат вычисления выражения считается равным false. Без полного разбора соблюдение этого правила было бы невозможным. Мне, как "пасквилянту", полный разбор тоже не нравится, но "тут уж тут заведено". В смысле, что так реализовано неспроста.

2) А какой язык программирования утруждает себя "очисткой" (обнулением) содержимого стека (ее путать очистку с уменьшением значения указателя стека)? Состояние (значение) локальной переменной на входе в область ее видимости в общем случае не определено. Аксиома.

3) Не готов ответить аргументированно, но мой опыт прикладного программирования показывает, что ничем.
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

2) А какой язык программирования утруждает себя "очисткой" (обнулением) содержимого стека (ее путать очистку с уменьшением значения указателя стека)? Состояние (значение) локальной переменной на входе в область ее видимости в общем случае не определено. Аксиома.
По-порядку.
1) Вы пишите, что время жизни локальных переменных процедур интерфейса совпадает с временем жизни самого интерфейса (именно по-этому сохраняются значения этих переменных м/у вызовами). Я спрашиваю - почему вы не очищаете стек после вызова?

2) Я говорю, что при вызове функции/процедуры, нужно выставлять значения локальных переменных в значения по умолчанию - это избавит от трудноуловимых ошибок и нелогичного поведения. Так, например, сделано в управляемых языках (см. C#.NET) - там в первоначальных значениях локальных переменных не мусор, а дефолтные значения (default(Type))

Так вот, если бы стек очищался (уничтожался) всегда (sic!), то тогда, по-хорошему, следовало бы делать дефолтными значения локальных переменных в момент его создания (т.е. при очередном вызове процедуры/функции)
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

Код: Выделить всё

В vip реализуется следующее правило: при выполнении условного оператора, если в логическом выражении присутствует поле невалидной таблицы, результат вычисления выражения считается равным false
Да ради бога, пусть так. Но при чем тут полный разбор. Мы вычисляем значение выражения, а не валидность полей. Так что тут я очень сильно сомневаюсь в необходимости такого подхода. Хотелось бы услышать пояснения разработчиков компилятора.

P.S. Есть ли стандарт на vip?
masygreen
партнер
Сообщения: 112
Зарегистрирован: Чт, 20/03/2008 09:10
Имя Фамилия: Максим Черепанов
Откуда: IT
Контактная информация:

Сообщение masygreen »

Необходима тема ЗА ЧТО Я ЛЮБЛЮ ВИП!!!!!!!
(простите за флуд)
masygreen
партнер
Сообщения: 112
Зарегистрирован: Чт, 20/03/2008 09:10
Имя Фамилия: Максим Черепанов
Откуда: IT
Контактная информация:

Сообщение masygreen »

не знаю как развивается компилятор и какие там есть стандарты - но на версии 5.3.24 если в конфиге указать инклудпатч с именем папки содержащей пробелы то все работает, а вот 5.3.25 уже нет :(
Аватара пользователя
Screw
топ-софт
Сообщения: 73
Зарегистрирован: Пт, 14/09/2007 22:54
Имя Фамилия: Виталий Корзюк
Откуда: ТопСофт
Контактная информация:

Сообщение Screw »

1) Вы пишите, что время жизни локальных переменных процедур интерфейса совпадает с временем жизни самого интерфейса (именно по-этому сохраняются значения этих переменных м/у вызовами). Я спрашиваю - почему вы не очищаете стек после вызова?
В випе нет стека в том виде, с каким мы обычно имеем дело - только размещенные в динамической памяти объекты-переменные.
2) Я говорю, что при вызове функции/процедуры, нужно выставлять значения локальных переменных в значения по умолчанию - это избавит от трудноуловимых ошибок и нелогичного поведения. Так, например, сделано в управляемых языках (см. C#.NET) - там в первоначальных значениях локальных переменных не мусор, а дефолтные значения (default(Type))
Не возражаю, идея неплохая. Во всяком случае, хуже от очистки не станет.
Так вот, если бы стек очищался (уничтожался) всегда (sic!), то тогда, по-хорошему, следовало бы делать дефолтными значения локальных переменных в момент его создания (т.е. при очередном вызове процедуры/функции)
Стека, повторюсь, нет. Но чистить локальные переменные можно.
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

Виталий Корзюк
Есть ли у вас возможность донести идею очистки локальных переменных функций/процедур до разработчиков компилятора? Наверняка, это не сложно в плане реализации -> как вариант, можно заворачивать все локальные переменные в структуру, в тот же record, что-то вроде:

Код: Выделить всё

function Simple : boolean;
{
   var param1 : longInt;
   var param2 : string;
   .... 
   param1 := 20;
   param2 := 'test';

   result := true;
}  

// Компилятор преобразует данный код, в следующий:
var _$SimpleFuncParams$_ : record  // Здесь объявление локальных переменных
  param1 : longInt;
  param2 : string;
  result    : boolean;
end;

function Simple : boolean;
{
   ClearAdvRecord(_$SimpleProcParams$_); // Очищаем локальные переменные перед вызовом
   
   // Работаем с локальными переменными
   _$SimpleFuncParams$_.Param1 := 20;
   _$SimpleFuncParams$_.Param2 := 'test';

  _$SimpleFuncParams$_.result := true;
}
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

В принципе есть планы сделать неполное вычисление логических выражений.

Так же есть планы сделать возможность инициализации при объявлении, т.е. что-то вроде
var i: integer = 0;
которая будет срабатывать всякий раз при вхождении в фрейм, на котором объявлена переменная.

Что же касается вопросов "почему"...
if работает так, потому что в этом случае его внутренняя реализация совершенно аналогична остальным операторам. можно сказать, что это - экономия при разработке.
локальные переменные нигде не очищаются. разве что когда локальная переменная - объект, и он при входе в область видимости инициализируется
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

Фёдор Терсин
можете добавить в планы на разработку необходимость очистки локальных переменных функций/процедур перед вызовом?
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

нет, это в принципе неправильная идея
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

deleted
Последний раз редактировалось stix Пн, 13/10/2008 11:39, всего редактировалось 1 раз.
stix
заказчик
Сообщения: 95
Зарегистрирован: Чт, 25/09/2008 07:45
Имя Фамилия: Марат Ахметзянов
Откуда: ОАО "Северо-Западные Магистральные Нефтепроводы"

Сообщение stix »

Фёдор Терсин
нет, это в принципе неправильная идея
:super:
Ответить