OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 24 Апрель, 2024 22:51

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 28 Апрель, 2006 13:20 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Halega писал(а):
Я также попался на том, что забыл инициализировать переменную:


Если честно - это для меня большой сюрприз. Неинициализированные переменные - старинные сишные грабли, почему Вирт от них не избавился?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 28 Апрель, 2006 14:49 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Не буду говорить точно, но это, скорее всего, определено не стандартом языка, а реализацией (ББ). Инициализируется в 0 только динамическая память и указатели. Если смотреть дизассемблированный код, то видно, как при старте процедуры инициализатор аккуратно затирает все локальные указатели, перепрыгивая через остальные поля...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 28 Апрель, 2006 21:34 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Vlad писал(а):
Неинициализированные переменные - старинные сишные грабли, почему Вирт от них не избавился?

А как?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Суббота, 29 Апрель, 2006 00:10 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Сергей Губанов писал(а):
Vlad писал(а):
Неинициализированные переменные - старинные сишные грабли, почему Вирт от них не избавился?

А как?


В смысле как? Ошибка компиляции при попытке использования непроиниченной переменной (в идеале). Ну или обязательное забивание значениями по умолчанию (нулями) со стороны компилятора (если не хочется заморачиваться с анализом потока данных). Не, ну это ж просто дикость оставлять такой undefined behavior (так любимый С++'ми) в ЯВУ, претендующего на максимальную безопасность и простоту использования. В С/С++ это сделано умышленно из соображений эффективности с одной стороны и проблемами с определением факта использования неинициализированной переменной (адресная арифметика все карты путает) с другой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 11:31 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Vlad писал(а):
проблемами с определением факта использования неинициализированной переменной

Вот где собака зарыта...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 11:37 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Кстати, анализатор DevAnalizer выяляет такие косяки, как и многие другие...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 11:41 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Сергей Губанов писал(а):
Vlad писал(а):
проблемами с определением факта использования неинициализированной переменной

Вот где собака зарыта...


И? Все нормальные ЯВУ (та же жаба, которая якобы калька с оберона) такого безобразия не позволяют.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 11:45 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Кстати, анализатор DevAnalizer выяляет такие косяки, как и многие другие...


Это уже костыли. Такие же, как и всякие отладочные примочки к сишным программам. А насколько трудно доточить компилятор, чтобы он инитил не только ссылки?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 12:06 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да не должно быть трудно. Не знаю, почему Ominc решили этого не делать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 14:11 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Vlad писал(а):
И? Все нормальные ЯВУ (та же жаба, которая якобы калька с оберона) такого безобразия не позволяют.

Это какие такие нормальные ЯВУ? Java и C# что ли? Так там нулями забивают, а это жуткая потеря производительности.
Вот смотрите: 6.119 секунд супротив 35.932 секунды:
Код:
MODULE TestPenalty;

  IMPORT Log, Services;
 
  TYPE
    Data* = RECORD
      x*, y*, z*, u*, v*, w*, p*, q*, r*: REAL
    END;

  PROCEDURE Do (VAR a: Data; level: INTEGER);
    VAR b: Data;
  BEGIN IF level > 0 THEN Do(b, level-1); Do(b, level-1) END
  END Do;

  PROCEDURE Main*;
    VAR t: LONGINT; a: Data;
  BEGIN
    t := Services.Ticks();
    Do(a, 28);
    t := Services.Ticks() - t;
    Log.Int(SHORT(t))
  END Main;

END TestPenalty.


Код:
namespace ValueTypePenalty
{
  public struct Data
  {
    public double x, y, z, u, v, w, p, q, r;
  }

  class Program
  {
    static void Do (ref Data a, int level)
    {
      Data b = new Data(); // здесь структура b, зачем-то, забивается нулями, отсюда тормоза...
      if (level > 0)
      {
        Do(ref b, level-1);
        Do(ref b, level-1);
      }
    }

    static void Main (string[] args)
    {
      int t = System.Environment.TickCount;
      Data a = new Data();
      Do(ref a, 28);
      t = System.Environment.TickCount - t;
      System.Console.WriteLine("t = " + t);
      System.Console.ReadLine();
    }
  }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 14:40 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Сергей Губанов писал(а):
Вот смотрите: 6.119 секунд супротив 35.932 секунды:


Опять подтасовываем результаты? Здесь меряется скорость "GC vs стэк". Кстати, в такой постановке у шарпа очень приличный результат.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 14:47 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
> static void Do (ref Data a, int level)
> {
> Data b = new Data();
> ...

А не корректней ли тут делать просто "Data b;" вместо "Data b = new Data()"?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 14:51 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Сергей Губанов писал(а):
TYPE
Data* = RECORD
x*, y*, z*, u*, v*, w*, p*, q*, r*: REAL
END;


Кстати, хотелось бы узнать хоть один осмысленный пример существования такой структуры с мусором внутри. В обероне нельзя создавать и возвращать из функций структуры (только передавать по ссылке и инитить)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 15:28 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Vlad писал(а):
Опять подтасовываем результаты? Здесь меряется скорость "GC vs стэк".

Ну что Вы, ни в коем случае. Сравнение честное. В языке C#, struct - является value-типом. А следующий синтаксис объявления и инициализации:
Код:
Data b = new Data();

похож на синтаксис объявления и создания reference-типа для "однообразия" - так решили разработчики языка. Таким образом, в данном случае new Data() - это не создание объекта типа Data в динамической памяти, а размещение соответствующего количества нулей в переменной b находящейся на стеке. Просто синтаксис такой.

Vlad писал(а):
Кстати, хотелось бы узнать хоть один осмысленный пример существования такой структуры с мусором внутри.

Не понимаю о каком ещё мусоре Вы говорите.

Vlad писал(а):
В обероне нельзя создавать и возвращать из функций структуры (только передавать по ссылке и инитить)?

Да, в оберонах процедура-функция может возвращать только переменные базовых типов (в т.ч. указатели). Ввод и вывод переменных комплексных типов данных делается посредством VAR, IN, OUT ссылок.

Alexey Veselovsky писал(а):
А не корректней ли тут делать просто "Data b;" вместо "Data b = new Data()"?

Это невозможно. Ведь переменная b не только объявляется, но и используется. А перед использованием, переменная b должна быть проинициализирована - таково требование языка C#. Если написать так как предлагаете Вы, то программа не скомпилируется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 16:04 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Сергей Губанов писал(а):
В языке C#, struct - является value-типом. А следующий синтаксис объявления и инициализации:


OK, возражение принимается.

Сергей Губанов писал(а):
Vlad писал(а):
Кстати, хотелось бы узнать хоть один осмысленный пример существования такой структуры с мусором внутри.

Не понимаю о каком ещё мусоре Вы говорите.


Непроиниченные мемберы.

Сергей Губанов писал(а):
Vlad писал(а):
В обероне нельзя создавать и возвращать из функций структуры (только передавать по ссылке и инитить)?

Да, в оберонах процедура-функция может возвращать только переменные базовых типов


А в шарпе?

Сергей Губанов писал(а):
(в т.ч. указатели). Ввод и вывод переменных комплексных типов данных делается посредством VAR, IN, OUT ссылок.


В таком случае это прореха в дизайне языка, которую пытаются решить еще одной прорехой. Если бы язык позволял возвращать структуры, то непроиниченные структуры не имели бы смысла (а, следовательно, в случае правильного использования не было бы никакого реального perfomance fault).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 18:32 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
Если бы язык позволял возвращать структуры

... то их возвращали бы везде, где не лень, потому что форма записи действительно удобнее. Отсюда лишние тормоза, т.к. безобидная запись
a := GetSomeRec() (а таковые в той же Дельфе пишутся обычно сплошь и рядом) вызывает два лишних копирования - сначала в стек внутри процедуры, потом из стека в ту переменную, которой присваивается...
Так что такая "прореха в дизайне языка" сделана сознательно и вполне логична.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 18:35 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Забивание нулями - действительно не лучший вариант. Однако сделать на уровне компилятора отлов хотя бы самых явных обращений к переменным до присваивания им значения было бы можно и нужно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 20:01 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
... то их возвращали бы везде, где не лень, потому что форма записи действительно удобнее. Отсюда лишние тормоза,


Такие рассуждения не выдерживают никакой критики. Premature optimization и все такое. А если цепляться за эффективность, то непонятна позиция с контролем типов и прочими выходами за границу.

Илья Ермаков писал(а):
т.к. безобидная запись
a := GetSomeRec() (а таковые в той же Дельфе пишутся обычно сплошь и рядом) вызывает два лишних копирования - сначала в стек внутри процедуры, потом из стека в ту переменную, которой присваивается...
Так что такая "прореха в дизайне языка" сделана сознательно и вполне логична.


Как в дельфе не знаю, но в нормальных компиляторах С++ никаких лишних копирований не происходит. Так что это именно прореха, причем с банальным объяснением: "все в жертву простоте компилятора" (и это в 21 веке).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 20:19 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
но в нормальных компиляторах С++ никаких лишних копирований не происходит.

А куда же их, пардон, девают?
Есть инструкция return, которая убирает из стека входные параметры и копирует туда структуру. Есть инструкция присваивания в вызывающем коде, которая копирует возвращенное значение из стека в переменную. Таким образом, за лишнее удобство платим накладными расходами. А поскольку удобство мы все любим, то платим постоянно. Чего стоят одни строковые операции типа Copy из стандартной библиотеки Дельфе, которые возвращают строку по копированию... Был пример, когда заменой стандартных процедур на процедуры, написанные в стиле Оберона, удалось увеличить производительность программы в 5 раз...
Конечно, в С++ за счет перегрузки операций можно обеспечить и удобство, и быстроту. Ну так это уже другой разговор...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 02 Май, 2006 20:33 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Есть инструкция return, которая убирает из стека входные параметры и копирует туда структуру. Есть инструкция присваивания в вызывающем коде, которая копирует возвращенное значение из стека в переменную.


Включи фантазию. Можно, например, делать все так же как в обероне - передавать указатель на непроиниченную структуру. Только делать это будет компилятор. Принципиальную разницу объяснять не надо?

Илья Ермаков писал(а):
Был пример, когда заменой стандартных процедур на процедуры, написанные в стиле Оберона, удалось увеличить производительность программы в 5 раз...


Пример я и сам могу придумать. А для практики давно есть профайлеры.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB