Re[3]: Синтаксический оверхед
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 22.06.05 07:11
Оценка:
Здравствуйте, Mr. None, Вы писали:

AVC>>То же относится к циклам REPEAT UNTIL ~p и do {} while (p).

MN>В данном примере в случае C++ проверяется истинность исходного условия. Для Оберона выполняется проверка его отрицания

А теперь всё наоборот:

REPEAT UNTIL q

и

do {} while (!q).

(я заменил q = ~p)

q — условие останова цикла

Читается так: Выполнять цикл до тех пор пока условие останова цикла не станет истинным.

Всё логично.

В цикле WHILE p DO ... END, p — это условие выполнения цикла (естественно, пишется в начале; отвечает на вопрос: выполнять или не выполнять?)
В цикле REPEAT ... UNTIL q, q — это условие останова цикла (естественно, пишется в конце; отвечает на вопрос: остановить или не остановить?)

n := 100;
WHILE n > 0 DO ...; DEC(n) END;
ASSERT(n <= 0)


n := 100;
REPEAT ...; DEC(n) UNTIL n = 0
ASSERT(n = 0)
Re[6]: Синтаксический оверхед
От: Sergey J. A. Беларусь  
Дата: 22.06.05 07:17
Оценка: :)
Здравствуйте, Сергей Губанов, Вы писали:

SJA>>То есть Вы допускаете, то не все циклы


СГ>Почему же не все. Абсолютно все циклы WHILE и абсолютно все циклы REPEAT.


Да, кстати. Вы знаете, что циклов вего 3 типа ? Так вот, иначе говоря, только WHILE и REPEAT, но не LOOP.
Т.е. оберон на 66% структурен.
Я — свихнувшееся сознание Джо.
Re[4]: Керниган & Ритчи
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 22.06.05 07:17
Оценка:
Здравствуйте, Privalov, Вы писали:

P>Авторы не закрывают глаза на недостатки своего создания, а работают над их преодолением.


Совершенно верно, авторы языка Си (и операционной системы UNIX) "признали свои ошибки" и создали safe язык Limbo (со сборкой мусора) и операционную систему Inferno написанную на нем. Так что и Вам пора отказаться от Си, раз уж сами авторы от него отошли. Чего Вы за него цепляетесь?

P>И от них не слышно о языке, позволяющем создавать правильные "по определению" программы. Это третье.


На Си их и невозможно создавать. А любителей языка Limbo я еще не встречал. Кто знает, может и появятся в будущем.
Re[3]: Синтаксический оверхед
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 22.06.05 07:21
Оценка:
Здравствуйте, Mr. None, Вы писали:

MN> которая как ни парадоксально, в свою очередь взяла от этой теоремы только название и не включила сам принцип программирования без goto


Кто взял, а кто и не взял. В оберонах goto нету.
Re[9]: Синтаксический оверхед
От: Oleg A. Bachin Украина  
Дата: 22.06.05 07:27
Оценка:
Здравствуйте, moudrick, Вы писали:

OAB>>и т.д... и посмотрю на того кто осмелится такое писать в одну строку!

OAB>> Понимаю что процедуры на 2-3 экрана это не нормально, но иногда без них не обойтись

M>Если надо — обойтись всегда можно. Надо привыкать делать из хорошего кода еще более лучший, если это себя оправдывает.

M>Рефакторинг рулит. Паттерн Выделение метода (Extract Method). Примерчик там, правда, галименький, но ничего лучшего я не нашел. Применяем его с одновременным применением паттерна добавление параметра (Add Parameter).

M>Сокращаем текст длинного метода на ~5 строк. Заодно если называем только что выделенный метод правильно, не нужно тратить лишние строки на поясняющие комментарии (самодокументированность).


это все хорошо, но как я уже сказал ИНОГДА без этого не обойтись.
1. я сам не приемлю работать с рекордами, но когда нужна скорость при выделении/освобождении памяти блоками, скорость доступа и т.д — я их использую, а так предпочитаю классы.
(итак мне нужна была скорость)
2. вы как минимум забыли в процедуру передать 1 параметр — this. да, он не попал в увиденом блоке, но он есть. один параметр конежно же мелочь, если... если у нас не будет глубоких вложенных рекурсий, а они тоже есть.
так что если добавить к этому, что inline появилась только в D9... это то самое иногда.

PS код кстати приводился по сабджу
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[6]: Синтаксический оверхед
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 22.06.05 07:33
Оценка:
Здравствуйте, Курилка, Вы писали:

СГ>>
СГ>>n = ...
СГ>>while(n --> 0)
СГ>>{
СГ>>  ...
СГ>>}
СГ>>use(n); // теперь n на 1 меньше чем надо (а иногда нет)
СГ>>

СГ>>Мне стыдно за такую глупость, поддался "моде" на --> 0 оператор...

К>Моде? Может просто не потрудился прочитать документацию и выяснить разницу между постфиксным и префиксными -- и ++? Просто, на мой взгляд, если не удосужился подумать, то никакая верификация тут не поможет


Ну вот. Я не одинок. Вы тоже совершили ту же самую ошибку что и я. Ведь здесь нет ошибки связанной с постфиксной или префиксной записью оператора --.

Придется объяснить.
1) По условию задачи, цикл должен выполнятся только если n > 0.
2) Запись n-- > 0 действительно сначала проверяет n > 0, а потом уменьшает n, тут ошибки нет.
3) Ошибка в том, что уменьшение n производится в любом случае, даже тогда, когда n и так уже равно нулю.


n = 100;
while(n > 0)
{
  ...;
  n--;
}
assert(n <= 0);



n = 100;
while(n-- > 0)
{
  ...;
}
assert(n <= -1);
Re[5]: Керниган & Ритчи
От: Sergey J. A. Беларусь  
Дата: 22.06.05 07:35
Оценка: 1 (1)
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Совершенно верно, авторы языка Си (и операционной системы UNIX) "признали свои ошибки" и создали safe язык Limbo (со сборкой мусора) и операционную систему Inferno написанную на нем.


А синтаксис-то С-шный

З.Ы. Сергей, немного поясняю для Вас. Синтаксис Limbo похож на синтаксис С (и не похож на Обероновский).
Я — свихнувшееся сознание Джо.
Re[6]: Синтаксический оверхед
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 22.06.05 07:40
Оценка:
Здравствуйте, moudrick, Вы писали:

СГ>
  if(условие2);
      return ЧтоТо2(......);


M>1. Будьте внимательны.


Если использовать язык с правильным синтаксисом, то таких "зевков" не будет. Их отловит копилятор.

M>2. Соблюдайте Coding standards. Они рулез.


О чем я и говорил. А мне не верили. Фигурные скобки надо писать всегда в любом случае и без исключений и еще с новой строки, да и то, даже в этом случае некоторые "зевки" останутся не отлавливаемыми компилятором.

  if(условие2); /* <-- "зевок" остался не уловимым для компилятора */
  {
      return ЧтоТо2(......);
  }
Re[7]: Синтаксический оверхед
От: Mamut Швеция http://dmitriid.com
Дата: 22.06.05 07:44
Оценка:
SJA>Да, кстати. Вы знаете, что циклов вего 3 типа ? Так вот, иначе говоря, только WHILE и REPEAT, но не LOOP.
SJA>Т.е. оберон на 66% структурен.

Wikibooks:Control:Loops

loops

Loops allow you to have a set of statement repeated over and over again.

endless loop

The endless loop is a loop which never ends and the statements inside are repeated forever. Never is meant a relative term here — if the computer is switched off then even endless loops will end very abruptly.

loop :

  Do_Something;   

repeat


loop with condition at the beginning

this loop has a condition at the begin. The statements are repeated as long as condition is met. If the condition is not met at the very beginning then the statements inside the loop are never executed.
while (X < 5) :

  let X := Calculate_Something

repeat


loop with condition at the end

This loop has a condition at the end and the statements are repeated until the condition is met. Since the check is at the end the statements are at least executed once.
loop

    X := Calculate_Something

until (X > 5)


loop with condition in the middle

Sometimes you need to first make a calculation and exit the loop when a certain criteria as met. However when the criteria is not met there is something else to be done. Hence you need a loop where the exit condition is in the middle.
loop

   X := Calculate_Something

   if X > 5 : exit

   Do_Something (X)

repeat


for loop

Quite often one needs a loop where a specific variable is counted from a given start value up or down to a specific end value. You could use the while loop here — but since this is a very common loop there is an easier syntax avaialable.
for I := 1 to 10 :
 
   Do_Something (I)

repeat


for loop on arrays

Another very common situation is the need for a loop which iterates over every element of an array. The following sample code shows you how to archive this:
for-each I in X :

    X [I] := Get_Next_Element;

repeat



Немаловажное но:
Wikipedia:Control flow:Minimal Structured Control Flow

In May 1966, Bohm and Jacopini published an article in Communications of the ACM which showed that any program with gotos could be transformed into a goto-free form involving only choice (IF THEN ELSE) and loops (WHILE condition DO xxx), possibly with duplicated code and/or the addition of Boolean variables (true/false flags). Later authors have shown that choice can be replaced by loops (and yet more Boolean variables).

The fact that such minimalism is possible does not necessarily mean that it is desirable; after all, computers theoretically only need one machine instruction (subtract one number from another and branch if the result is negative), but practical computers have dozens or even hundreds of machine instructions.



dmitriid.comGitHubLinkedIn
Re[4]: Синтаксический оверхед
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 22.06.05 07:44
Оценка: +2
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Читается так: Выполнять цикл до тех пор пока условие останова цикла не станет истинным.

Нет это читается так: Выполнять пока условие не станет истинным... Чистое IMHO в большинстве случаев циклы крутятся до тех пор, пока некоторое условие не станет ложным...

СГ>Всё логично.


Я бы усомнился... см. ниже.

СГ>n := 100;
СГ>WHILE n > 0 DO ...; DEC(n) END;
СГ>ASSERT(n <= 0)

СГ>n := 100;
СГ>REPEAT ...; DEC(n) UNTIL n = 0
СГ>ASSERT(n = 0)


Ага — условие по сути одно и то же, но вот записывается оно по разному — в первом случае само условие, во втором его отрицание... Я когда-то давно писал на паскале и постоянные ошибки у меня возникали как раз в результате замены WHILE DO на REPEAT UNTIL. Чтобы не ошибиться в результате такой замены приходится сначала некотрое время подумать и фактически инвертировать условие. А если условие не совсем тривиальное, то можно и на граблю встать... Кстати вы как раз допустили ошибку инвертируя условия для преобразования цикла в REPEAT UNTIL. Вот так правильно:
REPEAT ...; DEC(n) UNTIL n >= 0


Только в этом случае множество значений n, на которых срабатывает условие останова цикла совпадате с первым вариантом. И в частности при n < 0 не происходит зацикливания... Или Оберон позволяет вычислять бесконечные циклы за разумное время?

А теперь сравните это с плюсовым:
while(n > 0)
{
}

do
{
}
while(n > 0);


Условие останова одно и записано одинаково и при преобразовании одного цикла к другому ничего мудрить и думать не надо... И даже новичку очевидно — в любом случае цикл завершается, когда условие становится ложным, всегда ясно, понятно и запомнить легко. В случае Паскаля (сейчас Оберона) мне всегда приходилось всякие таблицы вычерчивать, чтобы понять как repeat until отработает, если был нужен именно он.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[7]: Синтаксический оверхед
От: Пацак Россия  
Дата: 22.06.05 07:45
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>О чем я и говорил. А мне не верили. Фигурные скобки надо писать всегда в любом случае и без исключений и еще с новой строки, да и то, даже в этом случае некоторые "зевки" останутся не отлавливаемыми компилятором.


СГ>
СГ>  if(условие2); /* <-- "зевок" остался не уловимым для компилятора */
СГ>


Сишного компилера под рукой нет, но что-то мне кажется, что он в этом случае должен warning'ом изругаться. Народ, проверьте кто-нибудь, а?
Ку...
Re[3]: Синтаксический оверхед
От: Oleg A. Bachin Украина  
Дата: 22.06.05 07:47
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Всем этим может заниматься человек, не отличающий главное от второстепенного. Вот сколько в разработке ПО или языков/компиляторов проблем, но автор озаботился количеством лексем на оператор. Очень важная видать проблема с её решением разрабатывать софт сразу станет легче. Идеал — создать программу, ничего не сделав


угу, только так, потому как есть основание удверждать что языка он не знает. (сужу из приведенного им кода)
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Best regards,
Oleg A. Bachin
Re[4]: Синтаксический оверхед
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 22.06.05 07:48
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, Mr. None, Вы писали:


MN>> которая как ни парадоксально, в свою очередь взяла от этой теоремы только название и не включила сам принцип программирования без goto


СГ>Кто взял, а кто и не взял. В оберонах goto нету.


О ВЕЛИКАЯ И МОГУЧАЯ ПАРАДИГМА ПРОГРАММИРОВАНИЯ ДЛЯ ОБЕРОНОВ — МЫ ВСЕ ДОЛЖНЫ МОЛИТЬСЯ НА ТЕБЯ, НЕ ИНАЧЕ!
Вы вообще читать умеете? Прочтите внимательно на какой вопрос я отвечал. И если вам нечего сказать по сути вопроса, то лучше молчите!
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[7]: Синтаксический оверхед
От: xBlackCat Россия  
Дата: 22.06.05 07:49
Оценка: -1
Здравствуйте, Сергей Губанов, Вы писали:

СГ>3) Ошибка в том, что уменьшение n производится в любом случае, даже тогда, когда n и так уже равно нулю.


Это Ваша ошибка. Если Вы читали документацию или описание постфикной операции, до должны били знать, что эта операция уменьшает значение переменной и возвращает значение ДО измения. Другими словами — эквивалентно:
n = n - 1;
return n + 1;

То, что значение n должно уменьшится только при n > 0 — это лично Ваши домыслы, ничем не подкреплённые.

PS: извините, что обращаюсь на Вы — попробую исправиться.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Rojac &mdash; Rsdn Offline JAva Client
Анонсы и обсуждение здесь
Автор: xBlackCat
Дата: 08.02.10
Re[5]: А эхо в ответ: мать...мать...мать...
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 22.06.05 07:50
Оценка: :)
Здравствуйте, Mamut, Вы писали:

M>Тьфу блин. Я сейчас материться начну. Реально.


Не, не стоит. Тут за это
Автор: Mamut
Дата: 21.06.05
сами знаете что бывает...

M>Сергей. Вы, как самый ярый сторонник Оберона, можете внятно и с фактами на руках показать преимущество Оберона?


Конечно могу. Но только это не тема данной ветки форума. Тема этой ветки форума: 235% и 700%. Ваша ошибка в том, что Вы делаете далеко идущие выводы из этих чисел. В этой ветке я ни чего доказывать не собираюсь. Просто демонстрирую числа 235% и 700%. Признаться, мне трудно сдерживать себя от того чтобы полезть чего-то доказывать. Здесь речь исключительно только о синтаксисе.
Re[6]: А эхо в ответ: мать...мать...мать...
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 22.06.05 07:57
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Здравствуйте, Mamut, Вы писали:


M>>Сергей. Вы, как самый ярый сторонник Оберона, можете внятно и с фактами на руках показать преимущество Оберона?


СГ>Конечно могу. Но только это не тема данной ветки форума. Тема этой ветки форума: 235% и 700%. Ваша ошибка в том, что Вы делаете далеко идущие выводы из этих чисел. В этой ветке я ни чего доказывать не собираюсь. Просто демонстрирую числа 235% и 700%.


- Петька приборы!
— 30!
— Что "30"?!
— А что "приборы"?!!!


Ну продемонстрировали вы числа... И что? Я тоже много чисел знаю... ООЧЕНЬ много... могу их все продемонстрировать... А смысл в чём?
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[8]: Синтаксический оверхед
От: Кодт Россия  
Дата: 22.06.05 07:59
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Вот если бы были клавиатуры, на которых каждая клавиша — это готовая лексема, тогда, возможно, что-то изменилось бы.


ZX Spectrum, БК-001, ещё какие-то модели микрош-ириш такой фичей обладали. Одна кнопка — одна лексема васика. У БК и Спектрум они даже подписаны были (соответственно, имели несколько шифт-клавиш ).
МИР (Машина Инженерных Расчётов), насколько я слышал, тоже (свой собственный язык программирования).
Перекуём баги на фичи!
Re[6]: Open source
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 22.06.05 07:59
Оценка:
Здравствуйте, moudrick, Вы писали:

M>Что, и сборку мустора будем на Оберонах писать? Успехов... покажите только потом исходники, посмеемся вместе.


Известно, что BlackBox Component Builder 1.5 от Oberon Microsystems распространяется с открытыми исходными текстами на языке Component Pascal (наследник Оберона 2). В том числе модуль Kernel тоже написан на нем. Поскольку проект является open source, то я не понимаю, что до сих пор удерживало Вас от того чтобы посмотреть исходники самостоятельно? Что значит покажите? Берите и смотрите сами, они доступны любому без ограничений! Ваше отношение тем более не понятно в свете того, что известно, что подсистема управления динамической памятью (выделение памяти + освобождение ее сборщиком мусора) в BlackBox работает в несколько раз быстрее чем в .NET.
Re[9]: А эхо в ответ: мать...мать...мать...
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 22.06.05 08:03
Оценка: 1 (1)
Здравствуйте, Mamut, Вы писали:

M>Ааа. Понял То есть — а на чем же написан рантайм Оберона? Боюсь, на ассемблере. Вернее, того Оберона, что BlueBottle. BlackBox вполне себе на C наверное написан


Почему Си, а не Паскаль (1970), а почему не Модула 2 (1979), а почему не сам Оберон?

Ученье свет:
http://www.uni-vologda.ac.ru/oberon/infoart/proj0.htm
Re[6]: А эхо в ответ: мать...мать...мать...
От: Пацак Россия  
Дата: 22.06.05 08:04
Оценка:
Здравствуйте, Сергей Губанов, Вы писали:

СГ>Конечно могу. Но только это не тема данной ветки форума. Тема этой ветки форума: 235% и 700%. Ваша ошибка в том, что Вы делаете далеко идущие выводы из этих чисел. В этой ветке я ни чего доказывать не собираюсь. Просто демонстрирую числа 235% и 700%. Признаться, мне трудно сдерживать себя от того чтобы полезть чего-то доказывать. Здесь речь исключительно только о синтаксисе.


Относительно синтаксиса и [высосанных из пальца] 235% и 700%. Может все-таки потрудитесь и приведете обероновский эквивалент для неоднократно упоминавешгося здесь

while (dest[i++] = src[j++]);


... а потом посмотрим и посчитаем строчки/лексемы.
Ку...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.