Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - Comdiv

Страницы: [1] 2
1
возможно на устройствах, где работа с динамически выделяемой памятью связана с естественными трудностями (дольше, прожорливей по памяти, избыточно)?

2
Не замечал раньше, что в Компонентном Паскале ";" можно ставить подряд сколько угодно.

3
Так в Обероне же нет DEF-файлов :-) Их синтаксис не определен.
Если нужно просто ориентироваться в импортированных сущностях, то это и не важно. Если же нужно использовать как полноценные сущности, то конечно - доопределить. А в самом описании Оберона этого может и не быть, как и описания поведения при выходе за границы массива, стандартной библиотеки и т.д. Это может содержаться в более объемлющем стандарте.

Не понял  -как можно сделать болванку из дефа (в XDS) автоматом?
Скорее всего никак, я всего лишь, ссылаясь на потенциальное желание Алексея всё переписать, предлагал возможный путь.

4
Скорее перепишу все что есть с нуля самостоятельно так, чтобы экспортируемые сущности были сгруппированы отдельно. Благо исходников на Обероне-7 кот наплакал, можно вообще все переписать безболезненно совершенно :-)
Просто добавьте DEF-файлы, и в зависимости от задач и предпочтений решайте - генерируются они автоматически из модулей или наоборот - из них автоматически генерируются болванки модулей. Так что то, как сделано в Обероне - хорошо, надо только увидеть это.

5
По пустякам и конструкторов не надо.
Вы это к тому, что Оберон - язычек на пустячек?  ;)
В качестве шутки сойдёт, но из контекста разговора понятно, что нет.

6
По пустякам и конструкторов не надо.

7
Как ? я говорю про обеспечение непротиворечивого СОЗДАНИЯ экземпляра (переменной) составного типа - такой фокус могут обеспечить только конструкторы (а фабричные функции вы можете использовать для этой цели ,а можете и не  использовать).Т.е ничто вам не помешает инициализировать переменную так , как это сделал Игорь (имея при этом в загашнике прекрасную фабричную функцию).
Непротиворечивость можно обеспечить известным архитектурным приёмом:
наружу выставляется абстрактный тип, тип наследник - скрыт, фабрика типа возвращает
экземпляр наследника под видом абстрактного.

8
В циклах - это будут локальные переменные цикла. При этом, как мы выяснили, даже в случае структур никаких проблем с производительностью не будет. Если же речь идет о внешней (по отношению к циклу) переменной-структуре, то мне очень трудно представить пример, когда на каждом шаге цикла надо будет ее присваивать новому значению.
Ну представьте себе, к примеру, любой циклический алгоритм нахождения числа(пусть Фибоначчи), для длинных чисел. Можете пофантазировать на тему, когда массивы в числах динамические и статические.

Цитировать
Это не провокация. Это желание показать, что это не настолько принципиальная проблема. Да, я признаю, что такой подход не всегда будет удобен и конечно у него есть свои недостатки. Но я говорю о том, что он менее "проблемный" (по моему мнению), чем существующий сейчас в обероне (отдельная секция VAR, неинициализированные переменные).
Так и я не спорю с тем, что Ваш подход невозможен, а как раз с тем, что он менее проблемный, в особенности для языка уровня Оберон.

9
Общий раздел / Re:Грани цензуры.
« : Март 30, 2011, 06:11:07 pm »
Есть две равноправные школы математики, в одной из которых ноль входит в натуральный ряд чисел, а в другой -- не входит. Так какую из этих математик использовать при определении НОДа, и почему именно её?
Ту, которая ближе автору. А уж если говорят про алгоритм Евклида, то несложно понять... (шучу, если было бы не сложно, появилась бы такая супер дискуссия о применимости чисто учебного примера на основе алгоритма, изобретенного давным-давно?)
Хотя и цитируется Geniepro, но такое чувство, что ответ мне.
Подмена сущности вопроса - в обсуждении шла речь о том какое ОПРЕДЕЛЕНИЕ НОДа ПРАВИЛЬНО использовать в целях образования (если речь идет об учебниках общего назначения)... Тут ответ прост -первое (с нулем) - основные причины:
Это обсуждение, видимо, шло у Вас в голове, поскольку озвучено было совсем другое. Не исключаю, конечно, что просто быдло не поняло элиту.
Цитировать
Разумеется, ваш пример (который на форуме) в расчет не берется - там речь о СУЩНОСТИ нод'а вообще не шла (по сути дела речь шла о куске кода иллюстрирующем проблему), однако вы снабдили его комментарием - о принадлежности Вирту, что меня , признаться , сильно позабавило.  :D
Не знаю, какой именно фрагмент Вы имеете ввиду, но я писал о сообщении Алексея Веселовского со ссылкой на книгу "Programming in Oberon", которую как известно написал

10
Общий раздел / Re:Грани цензуры.
« : Март 25, 2011, 06:21:26 pm »
Вроде бы уже пытались "намекнуть", но всё же.
Главному виртухаю (с латинского - Вирта хаять) стоило бы обратить внимание, что согласно цитате, приведённой Алексеем, Вирт дал учебный пример нахождения НОД для натуральных чисел по алгоритму Евклида. А согласно, например, аксиомам Пеано 0 не входит в натуральные числа.
Но раза мужик сказал, что код - говно, значит - говно.
  ;) Точно (именно ЭТО я и сказал, в ОПРЕДЕЛЕННОМ и ОЗВУЧЕННОМ чуть ранее констексте )...  :D :D :D :D :D
Это вообще типично - брать чужие слова, сказанные в одном контексте, переносить их в ОПРЕДЕЛЕННЫЙ другой, а затем делать громогласные выводы. Это, конечно, выгодно отличает элиту ума от зомби-эпигонов.

А согласно, например, аксиомам Пеано 0 не входит в натуральные числа.
http://ru.wikipedia.org/wiki/Аксиомы_Пеано
Цитировать
Формализация арифметики включает в себя аксиомы Пеано, а также вводит число 0 и операции сложения и умножения с помощью следующих аксиом:
То есть ноли всё-таки следует учитывать...
Нет разницы, что в арифметике, если сказано, что в параметрах - натуральные числа.

11
Не, ну здесь просто классический случай для туплы...
Из-за задержки с моим предыдущим ответом Вы, похоже, выпали из контекста. Иначе сложно объяснить, почему Вы, будто бы возражая, сами написали то, к чему я и вёл.
Цитировать
С чего вдруг? У меня в коде как раз минимум повторных присваиваний. Повторные присваивания возникают, как правило, при желании экономить временные переменные. Потому что после повторного присваивания переменная, скорее всего, будет иметь уже другой смысл. А желание такое возникает от отдельной секции VAR - поэтому такая секция есть зло :)
С того, что повторные присваивания возникают в основном в циклах и некоторых других алгоритмах, а не из-за секции VAR (за собой такого не припомню). Но Вы-то циклов не пишите.

Цитировать
Ну блин. В крайнем случае - напишите вторую функцию, которая будет принимать существующую структуру и переинициализировать ее. Делов-то. Закроете тот жалкий 1% случаев, когда это действительно надо. Вообще не понимаю откуда такая боязнь скопировать структуру, тем более на стеке. В C++ копируется направо и налево. Не помню ни одного раза, когда это приходилось бы оптимизировать (убирать лишние копирования).
Это чень удобно иметь по 2-а экземпляра почти одинаковых функций, что особо актуально для функций, доступных только в исполняемых кодах. Хорошо хоть, что это жалкий % случаев.
Цитировать
Ну да, массив, хитро инициализируется. Говорил же уже. Дайте реальный пример, когда "это" будет тормозить задачу.
Тут я больше хотел обратить внимание на то, что часть массива (длины его измерений) используются до того, как инициализируется его тело. Подобное можно отнести и к некоторым структурам, но как мы уже абсолютно точно выяснили, это всего лишь грязный хак уровня SYSTEM.

Ваша просьба предоставить реальный пример, где вылезали бы проблемы с производительностью не более чем провокация на бессмысленные действия :) , поскольку ответ на самый крайний случай был уже озвучен.
Цитировать
напишите вторую функцию, которая будет принимать существующую структуру(массив) и переинициализировать ее. Делов-то. Закроете тот жалкий 1% случаев, когда это действительно надо.

12
Общий раздел / Re:Грани цензуры.
« : Март 24, 2011, 06:12:49 pm »
Вроде бы уже пытались "намекнуть", но всё же.
Главному виртухаю (с латинского - Вирта хаять) стоило бы обратить внимание, что согласно цитате, приведённой Алексеем, Вирт дал учебный пример нахождения НОД для натуральных чисел по алгоритму Евклида. А согласно, например, аксиомам Пеано 0 не входит в натуральные числа.
Но раза мужик сказал, что код - говно, значит - говно.

13
Цитировать
Мне кажется, что в подобных случаях изначальная проблема в правильной декомпозиции.
int a, b;
if (условие)
   int a = ...
   f();/*общий код*/
   a;
else
   int b =...
   f();/*общий код*/
   b;
Пример немного странный, потому что либо а и б не используются в общем коде, либо они взаимозаменяемые переменные, что очень частный случай, либо в общем коде есть дополнительные проверки и его естественность теряется, либо общий код не такой уж и общий. А имел ввиду я что-то совсем банальное как, например
int a, b;
if условие
   a = ...
   b = ...
else
   a = ...
   b = ...
f(a, b);//общий код, не функция

Цитировать
Цитировать
Цитировать
Если, конечно, не пытаться повторять плюсовую семантику с конструкторами копирования и т.д.
Потому я и написал, что можно обойти. А теперь про шутки, которые неизбежно вылезут.
Цитировать
struct S {int a,b};
s = S{s.b, s.a};
Хе-хе. А вот здесь мы имеем не инициализацию, а присваивание. Сильно разные вещи. Здесь всегда будет копирование. Оно здесь будет даже если вы напишите на оригинальном обероне по всем правилам - с объявлением временной структуры, ее инициализацией и последующим копированием.
Цитировать
s = f(s);//А вот тут даже умный компилятор не знает как без накладных расходов не допустить ошибок в общем случае, прийдётся выдумывать другие хитрые механизмы.
Аналогично. Это присваивание.
Цитировать
S f(S s, int i) { return {s.b + 1, s.a / (i - 1)} }
S s = S{1, 2};//1
try {
  s = f(s, 1);//2
} catch {
    s = f(s, 2);//программист вправе ожидать, что до присваивания s всё ещё имеет 1-е значение.
}
Аналогично. Это присваивание.
Значит, я неправильно понял Вашу мысль. Думал, что Вы имели ввиду, что X x = f()-> X x;_f(x) будет всегда, в том числе и для повторного присваивания, а на самом деле будет так  X y;_f(y); x = y;
Да только это мало чего меняет в плане производительности, потому как кол-во повторных присваиваний может сильно превысить кол-во первых.
И понятно, что в приведённых примерах будет копирование в любом случае. Дело-то не в этом, а том, что при новой фишке, копирование и перерасход памяти должны выполняться вообще всегда при присваивании для простого компилятора без подвохов. А при явных механизмах программист сможет избежать этого там, где это нужно и возможно. Для циклов разница может быть большой.


Цитировать
Цитировать
Потому что несколько переменных могут зависеть от общих временных данных.
Ну и объявите эти временные данные здесь же, не в секции. В чем проблема-то?
В том, что временные переменные не должны делать вид, что они глобальные и занимать место там, где они не нужны.


Цитировать
бывает нужен более сложный алгоритм чем однострочник, и тут уж нужна процедура, объявленная до переменной, и, следовательно, появляется возможность размазывания.
Цитировать
Ну правильно. Все процедуры будут объявлены до переменной и до секции. Где размазывание? Тут на самом деле более интересная проблема: если инициализировать вызовом функции, то как обеспечить, чтобы функция не обратилась к этой же переменной модуля.
Я, конечно, имел ввиду более привычную схему. Конечно, можно всё перевернуть вверх дном, но как Вы сами заметили, это не решение, а только замена задачи.

Цитировать
Цитировать
struct Stack {int count, int s[N]};
Stack s;
s.count = 0;
;
Структура инициализирована или нет?
Ошибка компиляции. Должна быть проинициализирована в точке объявления.
Разумеется, вопрос не об этом, а о смысле.

Цитировать
Да, не надо писать такие процедуры. Если надо установить новое значение уже объявленной - пожалуйста, пишите a = f(). Да, в данном случае для a (объявление/инициализация/присваивание) накладные расходы при прочих равных будут больше, согласен. Зато есть гарантия, что структура не останется проинициализированной наполовину.
Иногда и бывает нужно проинициализировать наполовину, а то и практически на нуль, как со стэком или, например, при чтении из потока, к которому возвращаешься время от времени, да ещё при этом используешь прочитанную ранее часть структуры. И правильнее говорить не о гарантиях инициализации, а о гарантиях заполненности чем-то.

Или вот ещё пример
f(int a[][]) {
    for (int i = 0; i < len(a, 0); i++) {
      for (int k = 0; k < len(a, 1); k++) {
          a[k] = i + k;
      }
 }
}
И ещё раз спрошу, если скорость не важна, зачем вообще статические данные?

14
Нет ничего экстремального в инициализации по одному условию нескольких переменных и по смыслу не объединяемых в одну сущность.
Ну вот не знаю. В моем коде таких ситуаций (инициализация разных переменных по условию с последующим использованием этих переменных по другому условию) - не встречается. Хотите верьте - хотите нет. И я считаю такой код трудным для чтения - вместо плавного перетекания от одного к другому имеем рваные условия с возможностью запутаться - что, откуда и куда.[/quote]Обратите внимание, в цитируемом сообщении не было сказано про использование по разным условиям, поскольку в обсуждаемом вопросе важна лишь необходимость инициализации нескольких переменных по 1-му условию, не более.


Цитировать
Цитировать
Как, что? Для функций, возвращающих большие структуры, возникают большие накладные расходы на копирование. То же касается и массивов. Это можно обойти, но неизбежно вылезут другие шутки.
Не, не понимаю, о каком копировании речь? Код "X x = f();" всегда может быть автоматически сведен к "X x; f(x);". Если, конечно, не пытаться повторять плюсовую семантику с конструкторами копирования и т.д.
Потому я и написал, что можно обойти. А теперь про шутки, которые неизбежно вылезут.

struct S {int a,b};

s = S{s.b, s.a};//Прийдётся компилятор сделать шибко умным, чтобы правильно обрабатывать такие ситуации без ошибок и без накладных расходов

s = f(s);//А вот тут даже умный компилятор не знает как без накладных расходов не допустить ошибок в общем случае, прийдётся выдумывать другие хитрые механизмы.

S f(S s, int i) { return {s.b + 1, s.a / (i - 1)} }
S s = S{1, 2};//1
try {
  s = f(s, 1);//2
} catch {
    s = f(s, 2);//программист вправе ожидать, что до присваивания s всё ещё имеет 1-е значение.
}
Мне лениво писать ещё, просто пофантазируйте на эту тему. Например, когда параметр может оказаться частью возвращаемого значения и наоборот. Накладные расходы - это невинные шалости по сравнению с побочными эффектами подобного автоматического сведения.
Смотрю, Вы уже и в другую тему по этому поводу успели написать. Ничего, что-нибудь придумаете. Предупреждая ответ, что в случае VAR - параметров этих эффектов тоже не избежать, отвечу, что ...

Цитировать
Да, и всё-таки, как поможет функция-конструктор для большой структуры, если инициализировать всё-равно одной операцией?
Не, не понимаю в чем проблема...

Лень объяснять. Пусть проблемы не будет.

Цитировать
Цитировать
Нет, я имел ввиду ситуацию, когда нужно инициализировать именно в секции модуля, но мы знаем точно, что она там происходит, тем не менее везде нужно будет использовать проверку об инициализации.
Какая-то надуманная ситуация. Почему именно в секции модуля?
Потому что несколько переменных могут зависеть от общих временных данных.

Цитировать
Да никто ж не заставляет размазывать. Пропишите непосредственно перед секцией. Можно даже потребовать на уровне компилятора.
Как бы не так. Для того, чтобы проинициализировать осмысленным значением, бывает нужен более сложный алгоритм чем однострочник, и тут уж нужна процедура, объявленная до переменной, и, следовательно, появляется возможность размазывания. Но я не подумал в прошлый раз, что можно обойтись опережающим объявлением процедуры и минимизировать размазывание. Т.е. надо ввести возможность таких объявлений и в секции переменных.

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

Цитировать
Ну я же говорил - можно порешать, если сильно парит. Например - функция конструктор для элементов или еще чего. В любом случае - я точно не хочу иметь большой массив структур с мусором. В безопасном строгом языке. Если хочу - то пожалуйста в SYSTEM. Реальный пример сильно помог бы.
Структуры и массивы - дело тонкое, а мусором является  любое не осмысленное значение, даже если оно прописано в присваивании, а иногда само присваивание становится мусором.
Цитировать
struct Stack {int count, int s[N]};
Stack s;
s.count = 0;
;
Структура инициализирована или нет?

Цитировать
Опыт говорит, что функции в конце-концов бьются. Как раз потому, что в условиях множественного RETURN сопровождать большие функции - неприятно. Отсутствие множественного RETURN - только оттягивает конец :)
В качестве шутки - сойдёт. Вы умеете переворачивать с ног на голову.

Вспомнил о ещё одной неудобности. В Обероне значение переменных можно менять, передавая их через параметры в процедуры. Легко представить ситуацию, когда такими процедурами можно также инциализировать, но при таком подходе получится это только с накладными расходами.

Опять же - поясните, что за накладные расходы такие. В каком месте.
[/quote]

f(a);//устанавливаем значение уже объявленной

T b = {...};//мусорное присваивание, оно же накладные расходы
f(b)// ах, да - просто не надо создавать такие процедуры( так может и VAR-параметры удалить; + ещё 1 изменение ), но я уже написал про ваш хитрый автоматический механизм, так что надо.

15
Общий раздел / Re:Тезис про Oberon, C, CP и ObjC.
« : Март 03, 2011, 03:57:41 pm »
У меня такого ощущения не возникло. С одной стороны в КП по сравнению с Обероном добавлено намного меньше, чем в Obj-C по сравнении с C, а с другой стороны КП не является надмножеством предка, а Obj-C - является.

Страницы: [1] 2