Фя & цикл vs рекурсия [Re: ИТ-образование]
Далеко от жизни. Радость от написания вычислительных программ получают только фрики, у которых и так не будет проблем с обучением в сфере IT.
Ничего подобного. Нормальный, не отягощенный несколькими семестрами университетского образования ребенок, не сможет сделать ровным счетом ничего.
> образования ребенок, не сможет сделать ровным счетом ничего.
Скажем так, ребёнка, который действительно совсем не сможет, я бы назвал умственно отсталым, а не нормальным. Другое дело, что у многих может не быть никакого стимула пробовать - очень уж нежизненные эти задачи.
Я учился в одной из двух лучших школ в городе. Наш город(Саров) - один из немногих научных городов(а это значит что образование у нас одно из лучших в стране, если не самое лучшее, во всяком случае отношение числа учащихся в МГУ к числу жителей города уж точно). Так вот. В моем классе кроме меня НИКТО бы не смог написать программу на ML. В остальных классах думаю тоже. Еще человек 10-15 во всем городе из моей параллели и старше тоже смогли бы. Все. Значит остальные - умственно отсталые? А что тогда говорить про остальную страну?
Твой пример на Паскале переводится в ML заменой ключевых слов и библиотечных функций. Получается, и его никто из твоего класса никто не смог бы написать.
ML - функциональный язык?
фпоискнах
Существующие методики обучения программированию в академической среде неоптимальные, но достаточно эффективные. Сужу по себе, пришедшему на ВМК с мизерным навыком программирования.
В общем, людям надо преподавать АСМ (чтобы знать, что всё что есть сейчас, надо ценить Си (чтобы понять, что Асм есть Асм, в какую обёртку его не заверни) и Си++ (ООП по самые гланды, чтобы ночью снилось остальное познаётся через этих зубров.
... остальное познаётся через этих зубров.А я считаю, что всё сложное познаётся через простое гораздо эффективнее, чем наоборот.
---
Power of simplicity.
Автоматическое управление памятью, строгая динамическая типизация, программирование без отладчика, очень быстрый компилятор, хорошо продуманный синтаксис => программы пишутся быстро и без ошибок. После этого я не понимаю, почему пишут на C++.
Системное программирование - это уже отдельная тема. Даже в этой области оберон используется эффективно (http://bluebottle.ethz.ch/)
Я не очень хорошо разбираюсь в программировании (потому что не учусь на ВМК и если у вас будут какие-нибудь сложные вопросы по оберону, можно спросить здесь: http://www.delphikingdom.com/asp/talktopic.asp?ID=285&Order=0&Count=10&pNo=1
Q: Вы все тут так расхваливаете оберон а чем он лучше Дельфи, Явы и С++ ? Только обьясните попростому на кой ляд им заниматься
.
A: Если уж совсем по простому, то есть ремесленный подход к программированию и есть научный подход к программированию. Дельфи, Явы и С++-сы - это, как бы, представители ремесленного подхода. Обероны - это, как бы, представители научного подхода. Спрашивается чем ремесленный подход хуже научного? Есть гипотеза, что научный подход дает:
.
1) ощутимый рост производительности коллективов программистов и повышение надежности программ измеряемое не процентами, а разами;
.
2) что хорошо подготовленные профессионалы должны быть гораздо эффективнее, чем вдохновенные любители. В их производительности должно быть различие, и притом существенное.
.
И эта гипотеза скорее верна чем не верна.
Вот эта вот цифра 20 (и 21 в следующем ассерте) демонстрирует, что научный подход сосёт. Потому что сосут его подвижники. Потому что язык (включая внутренние установки программиста - типа стиля) должен быть таким, чтобы можно было подправить кусок кода через три года, и всё продолжило бы работать. Никакие "верифицируемые программы" этого не дадут, это появляется только с опытом и в результате ффтыкания в код других хороших программистов.
Гипотеза прекрасная, конечно. Только джава даёт прирост производительности, поэтому на ней пишут, а на обероне что-то я ни одной большой проги не встречал.
ИМХО фишка в том, что для Научного Познания нужны опытные факты, и много. А у Научных Программистов, в большинстве своём, с опытными фактами очень плохо. Поэтому появляются разнообразные сферические языки в вакууме, на которых можно написать гарантированно работающее красно-чёрное дерево, и это, пожалуй, единственное их достоинство.
>> программирование без отладчика
Это как, простите?
>> хорошо продуманный синтаксис
Синтаксиса лучше чем у С не бывает. Вот эта запись -
BEGIN (*Postfix*)
In.Open;
GetSym; Expression;
Log.Ln
END Postfix;
Показывает, что синтаксис сосёт. Потому что приходится писать неуставные комментарии. Точки с запятой нет на последней строчке. А вот "IF zzz OR xxx OR yyy DO ... END" - это вообще человек с больной психикой придумал. Я понимаю - в паскале, BEGIN/END это операторные скобки, даже довольно последовательно они эту концепцию воплотили. Или в модуле2 (кажется) если уж END соответствует IF, то он так и называется - ENDIF. Но вот такое... Уххх!
Все эти штуки - чрезвычайно абстрактные математические конструкции, детям их понять очень сложно. Бесполезно учить детей ML - не поймут.
Компилятор конечно может отловить ошибки типа опечаток, несоотвествия типов. Но большинство ошибок гораздо более сложные. Например, нарушение инвариантов (массив должен быть всегда отсортирован, а в него вставили элемент который нарушает это). Еще типичными являются ошибки типа race-condition при не mulithread-safe code. Такие ошибки можно найти только в отладчике и никак по-другому.
Ух ты. Лично я убежден что такие ошибки в отладчике не найти.
Вот я здесь сделал одну ошибку. Интересно, как этот Научный Кодер её найдёт?
Сравнивать с оригинальным - нечестно.
MODULE Kurs2004ComplexStack;
IMPORT Math;
CONST depth = 10;
TYPE Complex* = RECORD x, y: REAL END;
VAR
stack: RECORD
l: INTEGER; (* level; first unused *)
a: ARRAY depth OF Complex;
END;
PROCEDURE Push* ( IN a: Complex );
BEGIN
ASSERT( ( stack.l >= 0 ) & ( stack.l < depth 20 );
stack.a[ stack.l ] := a;
INC( stack.l )
END Push;
PROCEDURE Pop* ( OUT a: Complex );
BEGIN
ASSERT( ( stack.l > 0 ) & ( stack.l <= depth 21 );
DEC( stack.l );
a := stack.a[ stack.l ];
END Pop;
PROCEDURE Add*;
PROCEDURE Add0 ( VAR a: Complex; IN b: Complex );
BEGIN
a.x := a.x + b.x;
a.y := a.y + b.y;
END Add0;
BEGIN
ASSERT( stack.l >= 2, 20 );
DEC( stack.l );
Add0( stack.a[ stack.l ], stack.a[ stack.l - 1] )
END Add;
По хорошему, их вообще никак не найти. Диагностические мессаги могут помочь, да, но такое ищется ффтыканием, причём даже не в код, а в что-то типа блоксхемы.
Ну не могут нормальные дети понять ни qsort, ни gui-библиотеки, ни обход дерева в глубину - туда им и дорога, тем быстрее значит погибнет человечество.
Я, если кто до сих пор не заметил, за то, чтобы отложить изучение языков на попозже.
1) поставить breakpoint на определенное место, пустить программу до нее
2) в этом месте посмотреть содержимое некоторых структур и поставить определенный hardware watchpoint
3) ждать пока этот watchpoint сработает в другом треде
А если такое случается примерно раз в месяц работы программы?
Нужно ставить watchdog, спроси у Глебиуса
Так ведь в том то и дело, что все эти функциональные языки завязаны на рекурсии. Убери рекурсию из ML - и получишь что-то типа Pascal.
> на рекурсии.
Я предлагал их всем сразу изучать?
Или пустить все в screen + gdb и ждать, ждать, ....
Я не говорю что такие ошибки обязательно можно отловить в отладчике. Я хочу сказать, что при наличии отладчика можно хоть как-то попытаться их отловить, а без него - вообще никак.
Я предлагал их всем сразу изучать?Это я предлагал. Однако я считаю, что если не объяснять, а дать пощупать, что такое рекурсия, то дети это отлично поймут. И в ML нужно совершенно минимум всего, почти как в ранних BASIC-ах, чтобы начать щупать.
P.S. Это как унификация в прологе - въехать по книжке невозможно, пока сам не попробуешь (только унификация концептуально сложнее рекурсии).
Крутить краны на нефтяных трубах можно без рекурсии.
Крутить краны на нефтяных трубах можно без рекурсии.Крутить краны на нефтяных трубах будут китайцы
Так ведь в том то и дело, что все эти функциональные языки завязаны на рекурсии. Убери рекурсию из ML - и получишь что-то типа Pascal.А вот. Наоборот не получится - из паскаля ML. Зато в ML есть как строго функциониальное подмножество языка, так и поддержка императивного стиля - кому как больше ндравицца. Хотя, конечно, императивные конструкции идут немного вразрез с логикой языка.
Имхо, ML ближе к научному базису, чем к практике.
Но обучение обычно начинают с практики, а потом уже подводят теоретический базис:
сначала рассказывают что такое 1+1, а уже много позже рассказывают теорию поля.
Рекурсия сложнее, чем цикл - т.к. в цикле сохраняется равноправие элементов - они все одиннаково располагаются на одном уровне.
В рекурсии - же появляется глубина - и второй, третий и т.д. элемент - уже получаются намного менее равноправны, чем первый.
ps
Самое главное - не совсем понятно - зачем рассказывать про циклы и рекурсию - для объяснения действий:
взять элементы слева и положить их направо
взять все красные элементы и изменить их цвет на зеленый
Взять тот же sql - его даже многие менеджеры понимают и используют - при этом они умеют главное - умеют управлять информацией и они не задумываются (им не надо задумываться что есть какие-то циклы, рекурсии и т.д. - они просто сообщают компьютеры, что они хотят получить в итоге.
Взять тот же sql - его даже многие менеджеры понимают и используют - при этом они умеют главное - умеют управлять информацией и они не задумываются (им не надо задумываться что есть какие-то циклы, рекурсии и т.д. - они просто сообщают компьютеры, что они хотят получить в итоге.Вообще-то в SQL-е как раз нет ни циклов ни рекурсий. Собственно поэтому на нем проще программировать. Кто-то умеет проводить доказательства по индукции, а кто-то в принципе не может такие доказательства понять и уж тем более придумать. Рекурсия это в точности то же самое. Вобщем это я к тому, что человеку, уже знакомому с математикой, понять рекурсию проще чем цикл. Вообще математика и программирование связаны гораздо теснее чем кажется на первый взгляд, взять хотя бы изоморфизм Карри-Ховарда.
>> ASSERT( ( stack.l >= 0 ) & ( stack.l < depth 20 );Можно и не писать 20 и 21. Тогда эти номера будут назначаться компилятором автоматически. В Си тоже есть макрос - assert (assert.h)
Вот эта вот цифра 20 (и 21 в следующем ассерте) демонстрирует, что научный подход сосёт. Потому что сосут его подвижники. Потому что язык (включая внутренние установки программиста - типа стиля) должен быть таким, чтобы можно было подправить кусок кода через три года, и всё продолжило бы работать. Никакие "верифицируемые программы" этого не дадут, это появляется только с опытом и в результате ффтыкания в код других хороших программистов.
Синтаксис языка как раз такой, что можно без проблем подправить кусок кода через 3 года - в C++ перед исправлением много времени уходит на то, чтобы разобраться в написанном ранее коде (из-за сложности синтаксиса).
>> хорошо продуманный синтаксисВ этом случае для удобочитаемости желательно (но не обязательно) указать с помощью комментария то место, где начинается процедура Postfix, т.к. у неё есть несколько вложенных процедур. Вообще вложенные процедуры используются редко, т.к. способствуют появлению side-effects.
Синтаксиса лучше чем у С не бывает. Вот эта запись -
BEGIN (*Postfix*)
In.Open;
GetSym; Expression;
Log.Ln
END Postfix;
Показывает, что синтаксис сосёт. Потому что приходится писать неуставные комментарии.
Но после каждого END нужно указывать имя процедуры / модуля. В Си этого нет, и, если не вставлять комментарии, нужно больше времени для того, чтобы отличить то место, где заканчивается функция, от того, где заканчивается другая конструкция.
Точки с запятой нет на последней строчке. А вот "IF zzz OR xxx OR yyy DO ... END" - это вообще человек с больной психикой придумал. Я понимаю - в паскале, BEGIN/END это операторные скобки, даже довольно последовательно они эту концепцию воплотили. Или в модуле2 (кажется) если уж END соответствует IF, то он так и называется - ENDIF. Но вот такое... Уххх!В конструкциях IF-THEN-ELSIF-ELSE-END, WHILE-DO-END, CASE-OF-ELSE-END после END не указывается, какую конструкцию они закрывают, потому что это было бы не так эффективно, как кажется, и только бы усложнило синтаксис. Тело этих конструкций редко занимает больше одного экрана по высоте исходного кода, в отличие от тела процедур.
В Modula-2 нет ENDIF-ов. Если они и были в Modula (в чём я не уверен то, думаю, их убрали как раз по этой причине.
Точку с запятой не нужно ставить перед END-ом, потому что ей там нечего разделять.
По поводу IF-THEN-END.
Если условия между IF-THEN не укладываются в одну строчку исходного кода (что бывает не так часто то можно писать и так:
IF
THEN
ELSE
END;
Я считаю, что конструкция
IF a THEN
b
ELSIF c THEN
d
ELSE
e
END;
более удобная, чем аналогичная в Си:
if (a)
{
b;
}
else if (c)
{
d;
}
else
{
f;
}
Гипотеза прекрасная, конечно. Только джава даёт прирост производительности, поэтому на ней пишут, а на обероне что-то я ни одной большой проги не встречал.Р. Богатырёв:
ИМХО фишка в том, что для Научного Познания нужны опытные факты, и много. А у Научных Программистов, в большинстве своём, с опытными фактами очень плохо. Поэтому появляются разнообразные сферические языки в вакууме, на которых можно написать гарантированно работающее красно-чёрное дерево, и это, пожалуй, единственное их достоинство.
Согласен, что Oberon-сообщество очень небольшое, его активность у нас в стране стала проявляться лишь в последние 1-2 года. Если говорить об интересе к Oberon в остальном мире -- то сейчас он более чем сдержанный. Те, кто разобрались, в чем его плюсы, -- особенно не афишируют, используя его как конкурентное преимущество в своем бизнесе.
Одна из серьезнейших ошибок ETH была в том, что язык Oberon и его семейство в массы активно не продвигались. Ни финансы, ни время в это всерьез не инвестировали. Язык Oberon взращивался внутри системы Oberon, прелесть и своеобразие которой массовой аудитории понять непросто. Автономные IDE были коммерческими и на пиратских дисках не выходили. Пользоваться ими могли только единицы. Книг появилось мало (на русском языке -- так вообще нет собственные СМИ практически отсутствовали (если не считать сайтов из Oberon Ring).
ИТ-индустрия Oberon продвигать и не собиралась. Университеты попали сразу под две волны конца 1990-х – начала 2000-х годов: (1) сращивание с ИТ-индустрией (превращение вузов по сути в ремесленные училища, где выпускник готовится едва ли не под конкретное производство) и (2) искусственно взращенная всемирная Java-эйфория.
Для выхода языка на рынок требуется пройти следующие фазы.
I. Детство (5-10 лет):
1) пилотный проект создания инструментария (компилятор, IDE);
2) разработка библиотек, первые прикладные проекты, формирование ядра сообщества, собственные СМИ (user groups, бюллетени, сайты и т.п.).
II. Юность (5-10 лет):
3) создание первых коммерческих версий инструментария для массовой аудитории;
4) появление критической массы книг и статей;
5) расширение сообщества пользователей, начало стандартизации.
Затем наступает период рыночной зрелости языка.
На каждый из этапов в этих фазах требуется в среднем 2-4 года. Получается, что выход языка на рынок в нормальном случае происходит примерно через 15-20 лет после его появления на бумаге (первого препринта с описанием). В ненормальном (Java) -- за 3 года.
Вот мои прикидки по четырем самым известным языкам.
1. Паскаль: 1970-1980 (детство 1981-1988 (юность http://www.osp.ru/pcworld/2001/04/058.htm
2. Си: 1971-1977 (детство 1978-1988 (юность
http://www.osp.ru/pcworld/2001/08/126.htm
3. С++: 1983-1989 (детство 1990-1994 (юность http://www.osp.ru/pcworld/2003/01/144.htm
4. Java: 1994-1995 (детство 1996-1997 (юность http://www.osp.ru/pcworld/2002/09/144.htm
Как видно, язык Java толкали вперед так, что бедный ‘акселерат’ едва поспевал за своими опекунами (Sun и IBM) и теми авансами, которые ему выдавали. Он не успел созреть, а его, толком еще не окрепнувшего, бросили в горнило рыночных войн. При этом Java только сейчас пытается подойти к той задаче, ради которой его создавали -- микромиру встроенных систем для бытовых устройств.
У языка Oberon 1988-1995 гг. пришлись на детство, затем началась полоса юности, в которой отсутствовали многие важные элементы, не позволявшие технологически зрелому языку стать рыночно зрелым.
Можно смело говорить, что именно язык Java сыграл роль ‘могильщика’ Оберона. Java-волна накрыла Oberon, едва тот начал набирать силу. Более того, практически все лучшие кадры, занимавшиеся Oberon, вынужденно ‘переметнулись’ в лагерь Java, поскольку основные финансовые потоки в сфере образования и исследований, не говоря уже об индустрии, переключились на Java. Из-за этого в рыночном отношении последнее десятилетие для Oberon во многом было потерянным.
Если брать нынешнюю ситуацию, то основными промышленными языками в обозримом будущем видятся C++ и Java. Первый продвигается корпорацией Microsoft, второй -- IBM (в меньшей степени -- Sun). Язык Си благодаря огромному пласту UNIX-культуры, моды на Linux и роли высокоуровневого ассемблера свои позиции не потеряет...
Угу. В 98 году может оно так и было
Java - что это за язык такой, который всё время меняется ?
Для эффективного программирования нужно следить за тем, что нового там появляется, и что становится deprecated.
for each (цикл по перечисляемым коллекциям) в этих языках есть?
WhileStatement = WHILE Expression DO StatementSequence END.
ForStatement =
FOR ident ":=" Expression TO Expression [BY ConstExpression]
DO StatementSequence END.
Из языка для упрощения синтаксиса и для получения более эффективного компилятора были исключены даже такие средства, как типы-диапазоны (вместо них можно использовать один из стандартных целых типов) и перечисляемые типы (вместо них можно использовать целые константы)
Вирт хотел даже цикл FOR убрать, только WHILE оставить
Из языка для упрощения синтаксиса и для получения более эффективного компилятора были исключены даже такие средства, как типы-диапазоны (вместо них можно использовать один из стандартных целых типов) и перечисляемые типы (вместо них можно использовать целые константы)теоретики, что с них взять
Вирт хотел даже цикл FOR убрать, только WHILE оставить
не знаю как у других, но я просто умерал пока for each и дженерики в Джава не появились
Специально нашёл пост в инете. http://www.delphikingdom.com/asp/talktopic.asp?ID=285&Order=0&Count=10&pNo=4 Мне чисто было интересно, когда он был написан. Я тааак удивился, когда увидел дату "08-06-2005 06:26"...
В сочетании со абзацем
Если брать нынешнюю ситуацию, то основными промышленными языками в обозримом будущем видятся C++ и Java. Первый продвигается корпорацией Microsoft, второй -- IBM (в меньшей степени -- Sun). Язык Си благодаря огромному пласту UNIX-культуры, моды на Linux и роли высокоуровневого ассемблера свои позиции не потеряет...Образ Сферического Программиста Сферических Программ в Вакууме становится более чем реальным. Чувак, забивай на эту херню, Б-г с ними, с недостатками языка, тут же чудовищная атмосфера. Ты в ней потусуешься ещё, и тоже превратишься в вечного МНСа, с производительностью в полторы отдебаженных строчки в день, десятилетним отставанием от новостей ИТ, и кучей Умных Мыслей про Научное Программирование.
умир бы, зачем мучался?
Не понимаю, откуда у тебя такие выводы, ты слишком всё обобщаешь. Есть области, где всё это нужно.
не умер, жил обещанием, что в следующей версии появятся, и не обманули
Fj одну из таких описал
Ну короче, я это к тому, что M$ уже года четыре С++ никуда не продвигает, а продвигает наоборот С# и .НЕТ, а аффтар этого не знает, но ему и не нужно, он весь в своём выдуманном мире, в котором ему легко и приятно от того, что его язык "научный". Ну то есть прям видишь его - в свитере, очёчках, сидит в каком-нибудь институте, переписывает двадцатилетней давности досовскую прогу Ведения Бухучета на своём обероне, причём именно с той эффективностью - полторы отдебаженных строчки в день. Зато у него много времени на перекуры и попиздеть на форумах.
Не тусуйся в такой компании, это ещё сильнее разрушает мозг чем бейсик!
Да, а ещё я не ффтыкаю, в чём "научность" языка, собственно? В шарпе/жаве/ВБ автоматический менеджмент памяти есть (а в плюсах не очень сложно делается ассерты тоже присутствуют. В приведённых примерах я заметил разве что несколько более развитую модульность (по сравнению с шарпом/жавой). И то хз, нужна ли она. В чём понтовость-то?
Да, а ещё я не ффтыкаю, в чём "научность" языка, собственно?я так понимаю в том, что пользователи этого языка занимаются наукой, а не программированием.
.NET, C#, Delphi, QNX, а также идеи по встраиванию многопоточности в язык - также обсуждаются в той ветке форума, если у тебя есть какие-нибудь вопросы, можешь задать их там.
Я не понимаю, откуда эти выводы про сферический вакуум. Технологии существуют, ими реально занимаются, но в силу своей специфики обероны не популярны. Почему - см. выше.
Я специально ничего не писал про C# и про .NET. C# - хороший язык. Но тут всё решает Microsoft. Ни в их интересах, ни в интересах Sun способствовать развитию оберона, каким бы хорошим он не был. Всё, что им нужно было от оберона (который появился в середине 80-х) при разработке своих языков, они взяли (у Java это получилось хуже).
Основные преимущества оберона перед другими технологиями в том, что он остаётся простым и не подвержен влиянию со стороны той же Microsoft, у которой свои интересы на счёт средств разработки.
Если автор ничего не пишет про C#, то это не значит, что он про него ничего не знаетзачем же он тогда распространяет заведомо неверную информацию?
Посмотрел. Выше написано, что обероны непопулярны в силу отсутствия рекламы. Какая специфика у языка я что-то не уловил.
> Основные преимущества оберона перед другими технологиями в том, что он остаётся простым
Аххх. У меня времени нет, а вот ты можешь чисто по приколу найти таки ЕБНФ С и своего Оберона, и сравнить. Я почти уверен в результате. И если результат окажется таким, как думаю я, можешь ещё найти ЕБНФ шарпа. Конкретно по синтаксису они С почти не усложнили, хотя семантика стала несколько более загадочной (в основном из-за оверлоадинга).
> и не подвержен влиянию со стороны той же Microsoft, у которой свои интересы на счёт средств разработки.
А ещё Микрософт выкрали бортовой компьютер из летающей тарелки, потерпевшей крушение в Розуэлле в 1947 году, и вытаскивают из него технологии, не желая делиться с остальной общественностью.
математический софт, физика (CERN, Optech)
В Oberon Microsystems разрабатывали Java JIT-компилятор для Borland
Система управления каскадом ГЭС на Амазонке (Alstom Power федеральная система управления дорожным движением в Швейцарии.
другие - малоизвестны.
зачем же он тогда распространяет заведомо неверную информацию?Он не распространяет заведомо неверную информацию. Он эту ниформацию просто не распространяет
А ещё Микрософт выкрали бортовой компьютер из летающей тарелки, потерпевшей крушение в Розуэлле в 1947 году, и вытаскивают из него технологии, не желая делиться с остальной общественностью.очень интересно...
ну большинство техноголий оберонов общедоступны
а аффтар этого не знает, но ему и не нужно, он весь в своём выдуманном миреТо, что тебе совершенно неизвестно - не выдумано. У него вполне реальный свой мир, про который ты ничего не знаешь.
Большая часть участников этого раздела нашего форума не видят дальше своей тарелки. И ты, Fj, один из самых ярких
представителей этой проблемы. Из-за этой ограниченности многие ваши споры бесполезны и бесконечны.
Аххх. У меня времени нет, а вот ты можешь чисто по приколу найти таки ЕБНФ С и своего Оберона, и сравнить. Я почти уверен в результате. И если результат окажется таким, как думаю я, можешь ещё найти ЕБНФ шарпа. Конкретно по синтаксису они С почти не усложнили, хотя семантика стала несколько более загадочной (в основном из-за оверлоадинга).Синтаксис компонентного паскаля в EBNF занимает 1 страницу печатного текста. Полное описание языка - 30 страниц. web-страница
Всмысле, ботай кванты, сегодня тебе это понадобится больше, чем паскаль, из скольки компонентов он бы не состоял!
Для начала конец поста, который AIX_D не запостил (и я, кажется, знаю, почему):
Если брать нынешнюю ситуацию, то основными промышленными языками в обозримом будущем видятся C++ и Java. Первый продвигается корпорацией Microsoft, второй -- IBM (в меньшей степени -- Sun). Язык Си благодаря огромному пласту UNIX-культуры, моды на Linux и роли высокоуровневого ассемблера свои позиции не потеряет. Что касается C#, то из-за провала планов блиц-крига Microsoft с повсеместным насаждением .NET (в лице Longhorn) его время еще не пришло (если вообще придет).Так вот, у аффтара мир, в котором M$ продвигает С++, а проект C# провалился. Этот мир к реальному миру имеет очень слабое отношение. И то, что он живёт в нереальном мире, его достаточно хорошо характеризует. В некотором смысле, я полагаю, это характеризует всех любителей языков, придуманных Никлаусом Виртом.
Что касается языка и среды Delphi, то их судьба более чем тревожная, прежде всего в силу превращения Borland в вотчину Microsoft. Java-инструментарий Borland (JIT-компилятор Java для Borland делался в Oberon microsystems) перспективы для развития имеет. Но Borland не без участия Microsoft все больше превращается в компанию, которая специализируется на системах поддержки жизненного цикла ПО (аналогично Rational для IBM). С уходом Delphi огромная армия Паскаль-программистов будет вынуждена искать альтернативы.
Но дело не только в более чем реальном уходе Delphi с рынка. Уже сейчас специалисты по Delphi остаются в индустрии невостребованными. А поскольку университеты стремительно сращиваются с индустрией, то Delphi будет вымываться из учебного процесса. Разумеется, если продолжать спокойно взирать на такое развитие событий.
Консерватизм отечественных преподавателей и защитная инертность России во многом спасает положение. Россия осталась, пожалуй, единственной страной в мире, где культура Паскаля (в том числе благодаря огромной многолетней популярности Turbo Pascal и Delphi) сохранилась в наибольшей степени. Было бы здорово, если бы мы смогли осознать, что в этом и состоит наше конкурентное преимущество.
Ещё он очень забавно удивляется, как это так - жава стала широко используемым языком не за тридцать лет, а за пять. Выводов, правда, он сделать не может.
По поводу синтаксиса - да, у оберона он действительно проще. За счёт
а) отсутствия дополнительных слов типа register, static и т.д., которые нужны любому уважающему себя высокоуровневому ассемблеру;
б) вот тут я много смеялся. В обероне 3 уровна precedence of operators (сравнение, сложение, умножение 8(!) бинарных операторов: "+ - OR * / DIV MOD &" и 8 операторов сравнения. Нет, я тоже считаю, что 16 уровней приоритета операций в С - это немного многовато, их не очень просто запомнить, да. Но как люди могут жить без встроенного ксора, шифтов и инкремента - я не понимаю. Это неэффективно. Это замедляет работу программиста и УСЛОЖНЯЕТ восприятие кода: "if (a ^ b)" выглядит намного понятнее, чем "IF 0 # a & ~b) OR (~a & b THEN".
Вообще все паскалеподобные языки сосут из за своей многословности. Там где достаточно одного универсального символа "{" приходится писать разнообразные BEGIN, DO, THEN. А ещё Вирт, по ходу, вообще не знает слова "ортогональность". Ну как можно было сделать "OR" и "&" одновременно?
Если сравнивать оберон с С#, то у него нет шансов вообще. Ну вот пусть мне хоть один плюс оберона скажут!
ЗЫ: Я вижу дальше своей тарелки. Я вижу, что оберон, как и паскаль, - это язык подходящий для обучения студентов программированию. Очень странно видеть, что его пытаются использовать для решения реальных задач. Развитие Computer Science привело к появлению гораздо более удобных языков, которые и стОит использовать. Именно они в десятки и сотни раз повышают скорость написания высококачественного кода, а не "простота синтаксиса" (йоб йоб йоб твою мать, кто вообще такой бред придумал? Пишите на brainfuck, там ещё проще синтаксис бля. Объёмистый но логичный синтаксис рулит).
И я немножко нервничаю, когда вижу конец поста этого дяди. Потому что он означает, что этот дядя, ему подобные дяди и читающие тот форум легковнушаемые люди очень стремятся оказаться в роли преподавателей в школах и университетах и трахнуть детям мозги своей поебенью, от чего потом детям будет очень тяжело оправиться.
PS: А в чём "научность" языка, объясните мне кто-нибудь? В том, что его придумал профессор?
PPS: Да, двадцать лет назад была маза писать на обероне, наверное. Типа, он безопасней чем С конечно же. Хотя ада по слухам круче.
А вы, батенька, пиздун. Извинитесь, что ли...
Я вот в предложил прикольный чаллендж. Я внёс в исходный текст программы одну ошибку (вполне реальную и хочу посмотреть, как Апологет Программирования Без Дебаггера её найдёт. Сравнивать код с исходным - неспортивно. Ну-ка?
Так вот, у аффтара мир, в котором M$ продвигает С++, а проект C# провалился.Ну почему же, я считаю как раз наоборот. Откуда у тебя получаются такие странные выводы ? Я не запостил конец того поста, потому что мнение автора не совсем совпадает с моим и не относится к обсуждению твоего сообщения.
Ещё он очень забавно удивляется, как это так - жава стала широко используемым языком не за тридцать лет, а за пять. Выводов, правда, он сделать не может.Я не забавно удивляюсь, я просто цитирую факт. Вообще, целью помещения той цитаты в тред был ответ на вопрос, почему оберон не популярен.
а) отсутствия дополнительных слов типа register, static и т.д., которые нужны любому уважающему себя высокоуровневому ассемблеру;Оберон - не высокоуровневый ассемблер. Если нужен ассемблер - есть возможность писать в машинных кодах.
Code procedures
Code procedures make it possible to use special code sequences not generated by the compiler. They are
declared using the following special syntax:
ProcDecl = PROCEDURE "[" SysFlag "]" IdentDef [FormalPars]
[ConstExpr {"," ConstExpr}] ";".
The list of constants declared with the procedure is interpreted as a byte string and directly inserted in the
code ("in-line") whenever the procedure is called. If a parameter list is supplied, the actual parameters are
pushed on the stack from right to left. The first parameter however is kept in a register. If the type of the first
parameter is REAL or SHORTREAL, it is stored in the top floating-point register. Otherwise the parameter (or
in the case of a VAR/IN/OUT parameter its address) is loaded into EAX. For function procedures the result
is also expected to be either in the top floating-point register or in EAX, depending on its type. Be careful
when using registers in code procedures. In general, the registers ECX, EDX, ESI, and EDI may be used.
Parameters on the stack must be removed by the procedure.
Examples
PROCEDURE [codе] Sqrt (x: REAL): REAL (* Math.Sqrt *)
0D9H, 0FAH; (* FSQRT *)
PROCEDURE [codе] Erase (adr, words: INTEGER) (* erase memory area *)
089H, 0C7H, (* MOV EDI, EAX *)
031H, 0C0H, (* XOR EAX, EAX *)
059H, (* POP ECX *)
0F2H, 0ABH; (* REP STOS *)
б) вот тут я много смеялся. В обероне 3 уровна precedence of operators (сравнение, сложение, умножение 8(!) бинарных операторов: "+ - OR * / DIV MOD &" и 8 операторов сравнения. Нет, я тоже считаю, что 16 уровней приоритета операций в С - это немного многовато, их не очень просто запомнить, да. Но как люди могут жить без встроенного ксора, шифтов и инкремента - я не понимаю. Это неэффективно. Это замедляет работу программиста и УСЛОЖНЯЕТ восприятие кода: "if (a ^ b)" выглядит намного понятнее, чем "IF 0 # a & ~b) OR (~a & b THEN".Встроенный ксор и шифт нужны только для системного программирования. И эти средства есть, но они заключены в модуль SYSTEM.
Module SYSTEM contains certain procedures that are necessary to implement low-level operations. It is
strongly recommended to restrict the use of these features to specific low-level modules, as such modules
are inherently non-portable and usually unsafe. SYSTEM is not considered as part of the language
Component Pascal proper.
Function procedures
Name Argument types Result type Description
ADR(v) any INTEGER address of variable v
ADR(P) P: PROCEDURE INTEGER address of Procedure P
ADR(T) T: a record type INTEGER address of Descriptor of T
LSH(x, n) x, n: integer type* type of x logical shift (n > 0: left, n < 0: right)
ROT(x, n) x, n: integer type* type of x rotation (n > 0: left, n < 0: right)
TYP(v) record type INTEGER type tag of record variable v
VAL(T, x) T, x: any type T x interpreted as of type T
* integer types without LONGINT
Для бинарных операций над числами используются множества.
Инкремент / декремент есть - INC(a[, b]) / DEC(a[, b])
Насчёт "a & ~b) OR (~a & b" сейчас написать не могу
Вообще все паскалеподобные языки сосут из за своей многословности. Там где достаточно одного универсального символа "{" приходится писать разнообразные BEGIN, DO, THEN.Спорное утверждение, что символы "{" и "}" лучше. Большую часть времени уходит на обдумывание алгоритма, а не на его кодирование. Поэтому на скорости написания это в конечном итоге не сказывается. Зато удобочитаемость лучше.
Ну как можно было сделать "OR" и "&" одновременно?Это сделали для того, чтобы подчеркнуть, что у логического И более высокий приоритет (как и у отрицания, которое обозначается символом "~", а не "NOT").
> Если автор ничего не пишет про C#, то это не значит, что он про него ничего не знает, и что развитие оберона стоит на местеМожно поподробнее с этого места ?
А вы, батенька, пиздун. Извинитесь, что ли...
Я вот в этом посте предложил прикольный чаллендж. Я внёс в исходный текст программы одну ошибку (вполне реальную и хочу посмотреть, как Апологет Программирования Без Дебаггера её найдёт. Сравнивать код с исходным - неспортивно. Ну-ка?Делаю простой тест:
PROCEDURE Do*;
VAR a, b, c: Complex;
BEGIN
a.x := 1;
a.y := 4;
b.x := 2;
b.y := 9;
Push(a); Push(b); Add; Pop(c);
StdLog.Real(c.x); StdLog.Real(c.y); StdLog.Ln
END Do;
Запускаю. Вижу, что выводит всё время число a. Смотрю код процедур Add, а так же тех, которые она вызывает. Вижу, что Pop и Push написаны правильно (тестировать их бессмысленно). Понимаю, что ошибка в Add. Вспоминая логику работы, вижу, что значение суммы записывается не туда, куда нужно. Нахожу ошибку. Если бы было что-нибудь посложнее, использовал бы ASSERTы.
P.S.: Зная логику работы этого простейшего алгоритма, я бы не сделал такой ошибки. Я не считаю эту ошибку вполне реальной. Надо писать так, чтобы весь код состоял из небольших процедур / функций, и каждую нужно тестировать или вставлять ASSERTы для сохранения инвариантов там, где это не очевидно или когда уж совсем лень думать (дополнительные ASSERTы никогда не помешают).
Если ты надеялся на какие-то чудеса, то ты их не увидишь.
PPS: Да, двадцать лет назад была маза писать на обероне, наверное. Типа, он безопасней чем С конечно же. Хотя ада по слухам круче.Спрашивается, на сколько C# лучше, чем оберон 20-летней давности ?
Смотря, какие задачи.
На практических - в разы.
ps
Попробуй, например, на обероне написать browser расшаренных файлов.
А теперь представь, что у тебя Word при какой-нибудь операции - налетел на Assert и вышел, вместе со всем текстом, который ты набирал несколько часов.
Как ощущения?
Как ты собираешься с этим бороться на Обероне?
Попробуй, например, на обероне написать browser расшаренных файлов.А какое это имеет отношение непосредственно к C#? Просто в .NET богатая библиотека классов. Появится этот самый Zonnon (кажется так называется Oberon .NET?) и это все станет доступно из Oberona...
Просто C# настолько криво спроектированный язык, что никто не может отделить сам язык от библиотек, даже его создатели. Вроде бы IDisposable обычный библиотечный интерфейс, но нет, это часть языка (foreach, using). Также как и IClonable, IEnumerable, ISerializable, Object, ValueType, Exception,... Можно продолжать до бесконечности. У кого-то потом еще язык поворачивается говорить, что синтаксис C# записывать на одной странице. В итоге доходит до того, что уже всю библиотеку классов называют C#-ом. Хорошо хоть у C# всего одна реализация, а то вот бы комитет по стандартом ломал бы голову, какая реализация достойна называться C#-ом, а какая нет.
Зачем это надо?
Такой "синтактический сахар" сильно сокращает кол-во кода, увеличивает читабельность и уменьшает кол-во ошибок.
Ты видел код без использования foreach-а и using-а?
Тебе такой код нравится?
Где они используются в языке?
В языке только используется IEnumerable и IDisposable.
а в throw можно кидать любые объекты или только инстансы потомков Exception?
в CLR любые вроде, в С# кидать только Exception, а ловить можно любые, используя catch без .
Какие проблемы. Так и надо. Все исключительно из прагматических соображений.
Какие проблемы. Так и надо. Все исключительно из прагматических соображений.Проблемы такие, что вот захотели юниксоиды написать свой компилятор C#, а не могут понять, что программировать-то надо. У языка должно быть ядро, компиляцию которого и должен обеспечивать компилятор, и должны быть библиотеки, то что потом скомпилируется "само". А пока этого не будет, так и будем иметь один единственный C# от M$, который сам является своим определением.
А какая разница-то? Грубо говоря, если штука ведет себя как надо, то значит все правильно. Пусть делают как угодно, лишь бы это согласовывалось с MS реализацией.
Где они используются в языке?ISerializable и IClonable, насколько я понимаю компилятор имплементирует самостоятельно, так что это не "обычные" интерфейсы. Object и ValueType автоматически подставляются в предки для class-а и struct-уры, так что это тоже не "обычные" классы. Что еще?..
Mono уже больше, как полгода, зарелизен.
> не "обычные" интерфейсы. Object и ValueType автоматически подставляются в предки для class-а и struct-уры,
> так что это тоже не "обычные" классы.
Какое отношение это имеет к языку C#?
Не гони, все понятно. Есть довольно четкое определение ядра CLI, которое покрывается стандартами. Есть референс реализация с доступными исходниками. Остальные фишки заточены под виндовую платформу, поскольку основная задача, которая ставится перед .NET -- это решение основноных проблем текущей платформы, плюс сделать программирование под винду более продуктивной. Да и с этим проблем особых нет, конечно что-то сложно портировать на линух, но в Mono вполне успешно с этим справляются.
Java - что это за язык такой, который всё время меняется ?Опять на Java наезжаешь?
Для эффективного программирования нужно следить за тем, что нового там появляется, и что становится deprecated.
1. Java не меняется, а расширяется (потихоньку)
2. Давай-ка вспомним... э-э...
- BASIC. Сколько их сейчас диалектов? Кто-нибудь считал?
- PASCAL. Можно возразить, что язык не менялся, это какой-нибудь Borland то Assign(file, filename то constructor, то ${I добавит. Только ведь без этого ничего особо интересного [широкой публике] не напишешь.
- C/C++. Кто-нибудь помнит, что такое auto? ОК, все помнят. А кто-нибудь видел? А overload? А исключения и RTTI с самого начала были? А ведь это относится к самому языку, а не к библиотечным функциям или классам, к которым относятся пометки "deprecated"
// Для эффективного программирования нужно...
Для эффективного программирования нужно, чтобы сам процесс программирования был оперативным. Возьмём Eclipse, а лучше - IDEA. Переименовать переменную/класс/функцию? Не вопрос. Переместить код из одного места в другое? Один раз моргнуть. Дать совет по улучшению программы? Дай-ка секунду, ща обсудим твоих баранов...
Для такой работы IDE необходимо хорошее понимание того, как устроена программа. Ну, не когда остановится (или не остановится) на заданном входе , но хоть что-то. C++-у в этом смысле до Java пахать и пахать, и всё равно не допахать (из-за сравнительной простоты Java). Ну и нафига тогда столько универсальности?
ОК, давайте не наезжать на языки, а помнить, что для каждой задачи - свой инструмент.
Ага. И называется он С++.
Просто C# настолько криво спроектированный язык, что никто не может отделить сам язык от библиотек, даже его создатели. Вроде бы IDisposable обычный библиотечный интерфейс, но нет, это часть языка (foreach, using). Также как и IClonable, IEnumerable, ISerializable, Object, ValueType, Exception,...Бред. Все там ясно (при желании разобраться, конечно что такое CLR, где язык и как он ложится на CLR. Все очень прозрачно. Так и задумывалось, и не только для C#. Наоборот основная идея, что есть вполне определенная CLR с библиотеками, а есть языки, каждый со своим синтаксисом. Языки с оригинальными конструкциями и особенной семантикой, но это вполне реально выразить в CLR, и, что более важно, ужить с CLI. Короче есть выбор, либо реализуй свой супер язык как супер дотнет язык (причем так, как ты этого хочешь, ограничений нет либо приводи его к виду, чтобы можно было взаимодействовать с другими языками. Все зависит о того, какие цели ты преследуешь. MS разработала CLS, как ориентир для создателей библиотек и языков, тебе решать как близко ты хочешь ей соответствовать.
Ага, согласен. Сегодня вообще важен общий экспириенс, теперь уже не только увязка языка с библиотеками, но и с IDE. По-настоящему чувствуешь разницу от использования дженериков при работе с коллекциями, когда работаешь в IDE уровня IDEA. Или взять к примеру partial classes в C# 2.0 -- сама фича бесполезная, но насколько проще код генерировать в отдельный файл.
>
В ответ на:
--------------------------------------------------------------------------------
Так вот, у аффтара мир, в котором M$ продвигает С++, а проект C# провалился.
--------------------------------------------------------------------------------
Ну почему же, я считаю как раз наоборот. Откуда у тебя получаются такие странные выводы ? Я не запостил конец того поста, потому что мнение автора не совсем совпадает с моим и не относится к обсуждению твоего сообщения.
>
А мне пох как ТЫ считаешь. Я говорю про автора оригинального поста. Вы же разные люди, правильно? То, что ты не запостил конец его поста, а потом начал утверждать, что "автор не говорит о С# но знает о нём" - это пример наябывания общественности. Автор говорит о С#, причём такую херню, что лучше бы он не молчал. Автор и ты - разные люди!
----
> Спорное утверждение, что символы "{" и "}" лучше. Большую часть времени уходит на обдумывание
> алгоритма, а не на его кодирование. Поэтому на скорости написания это в конечном итоге не сказывается.
Когда решаешь олимпиадную задачку - да, иногда, особенно если ты идиот. В реальной жизни это не так совершенно. В реальной жизни зачастую обдумывают и кодируют вообще разные люди. Обдумывание, конечно, занимает своё время, но аргументировать этим то, что кодирование может быть и медленнее - это бред. Welcome to the real world!
> Зато удобочитаемость лучше.
Нет. Не лучше. Когда вообще все операторные скобки выглядят одинаково, а все остальные резервированные слова состоят из _одного_ слова, а не выглядят как "IF .. THEN .. ELSE .. ELIF .. THEN .. END", удобочитаемость лучше. Ну блиа, после пяти лет паскалепроганья и одной недели проганья на С мне стало это понятно.
> Встроенный ксор и шифт нужны только для системного программирования.
Да ну! У тебя просто опыта программирования нет, чувак.
Намного. То, что оберон имеет возраст 20 лет - это его недостаток а не плюс, между прочим. Ну и зачем вообще его использовать?
А, чуть не забыл:
> Это сделали для того, чтобы подчеркнуть, что у логического И более высокий приоритет (как и у
> отрицания, которое обозначается символом "~", а не "NOT").
У & такой же приоритет как у "* / DIV MOD". Выше чем у "+ - OR". Отрицание - вообще унарная операция. Чо-то я ваще не вижу систему
ЗЫ: Ну в чём же научность оберона, скажите мне!
System namespace входит в стандарт. Некоторые его части - такие как System.Reflection, базовый тип Object, String, ValueType, Type, IDisposable, IEnumerable (и интерфейс для самого энумератора) просто нельзя оттуда выкинуть. Ну вот как ты Object выкинешь? Или Int32 хотя бы?
У & такой же приоритет как у "* / DIV MOD". Выше чем у "+ - OR". Отрицание - вообще унарная операция. Чо-то я ваще не вижу систему
Logical operators:
OR logical disjunction
& logical conjunction
~ negation
Arithmetic operators:
+ sum
- difference
* product
/ real quotient
DIV integer quotient
MOD modulus
Set operators:
+ union
- difference (x - y = x * (-y
* intersection
/ symmetric set difference (x / y = (x-y) + (y-x
String operators:
+ string concatenation
Relations:
= equal
# unequal
< less
<= less or equal
> greater
>= greater or equal
IN set membership
IS type test
Всё.
Нет, видимо, под двум причинам:
1) редко встречаются такие приложения, где эта операция постоянно нужна.
2) в отличие от OR и & ошибиться с ней гораздо легче.
(~a & b) OR (a & ~b)
эквивалентно
a # b
похоже, мозги у меня совсем отсутствуют
Darkgray:
Попробуй, например, на обероне написать browser расшаренных файлов.
Darkgray:Ну вот, опять примеривание к своей тарелке. На свете есть другие задачи!
А теперь представь, что у тебя Word при какой-нибудь операции - налетел на Assert и вышел, вместе со всем текстом, который ты набирал несколько часов.
OS Oberon написана на обероне. Там даже http-browser и ftp-client есть.
То есть практическими задачами считаем только задачи из своей тарелки?
С этой точки зрения задача организации работы с расшаренными папками практическая.
Практическими задачами считаем те, что встречаются чаще.Встречаются чаще тебе?
Приведи примеры. Пока мне кажется, что ты говоришь про каких-то сферических коней в вакууме.
Какое кол-во задач позволяет иметь пользователя и программиста в одном месте и в одно время?
Что происходит, если программа налетела на assert, и программиста нет в этот момент под рукой?
Ps
До сих пор вспоминаются проблемы с космической техникой, когда отказы компьютеры были вызваны переполнением в каких-то левых модулях, с последующей выдачей assert-ов и полным остановом программ.
pps
Приведи, пожалуйста, области - где полный останов программы лучше, чем какое-то хромание дальше?
Назови, пожалуйста, области в которых программист и пользователи находятся в одной флаконе.
Такое пример я знаю только один - offline расчеты - когда пользователь сам же и программирует расчет - после аварийного останова он может быстро увидеть ошибку, исправить ее и запустить расчет заново.
Берем всех программистов. Смотрим, кто из них решал такую задачу. Делим на число программистов. Получаем то, насколько задача часто встречается.
Я думаю это число будет == 0.
Ты не прав. Я такую задачу решал, значит нулю число уже не равно
Что происходит, если программа налетела на assert, и программиста нет в этот момент под рукой?Какое может быть "хромание" дальше ? Ни о какой надёжности тогда речи быть не может.
...
Приведи, пожалуйста, области - где полный останов программы лучше, чем какое-то хромание дальше?
А вообще есть возможность отключить все ASSERTы. Но нужно хорошо подумать перед тем, как это делать.
Берем всех программистов.Каким образом?
Смотрим, кто из них решал такую задачу. Делим на число программистов. Получаем то, насколько задача часто встречается.Скорее всего в лидерах задач будут веб-магазин или форум на php. Означает ли это что остальные задачи менее важны? Означает ли это, что все остальные языки не нужны?
1/10^x == 0, x > 6.
Скорее всего в лидерах задач будут веб-магазин или форум на php. Означает ли это что остальные задачи менее важны? Означает ли это, что все остальные языки не нужны?Получаем лишь то, что веб-магазин и форум являются практическими задачами.
Положительное и отличное от нуля. Это означает, что данные язык востребован.
> Что происходит, если программа налетела на assert, и программиста нет в этот момент под рукой?
core dumped
> Приведи, пожалуйста, области - где полный останов программы лучше, чем какое-то хромание дальше?
Ядро операционной системы.
> Назови, пожалуйста, области в которых программист и пользователи находятся в одной флаконе.
Научные рассчеты. Системное администрирование.
Получаем лишь то, что веб-магазин и форум являются практическими задачами.Продолжи мысль. Остальные задачи не являются практическими?
А мне вот интересно про оберон. Ты бы не мог назвать пару фич языка, которые, ты считаешь, делают его лучше других популярных языков.
Продолжи мысль. Остальные задачи не являются практическими?Продолжаю. Среди остальных задач тоже дофига практических.
Там нет фич. Ничего лишнего.
Это означает, что ты не ботал теорию.
Есть ряд направлений, которые как раз занимаются тем, что изучают как проектировать надежное ПО, которое работает в ненадежном окружении.
Системное администрированиевот она, твоя тарелка. и ты из нее не вылазишь даже упрямее остальных.
Продолжаю. Среди остальных задач тоже дофига практических.А как же: ?
согласен.. и где это можно почитать?
Что в этом хорошего для пользователя?
> Ядро операционной системы.
Драйвер мышки тоже должен assert-ы выкидывать?
> Научные рассчеты. Системное администрирование.
Ок, согласен. В этих областях assert-ы уместны.
Каким образом должно быть спроектировано ПО в других областях? и можно ли там использовать assert-ы?
Пиздеж.
вот именно с такой аргументацией
Но кто нас просил останавливаться на топ-2? Возьмем, например, топ-10000. Или топ-100000. Как ты понимаешь, четкой границы установить нельзя, есть только, как говорят физики, "характерная граница спектра".
Согласись, что задача, которую решает один человек на миллион назвать практической нельзя. Также очевидно, что задача, которую решает каждый из сотни - практическая.
и это зависит от языка ?
Для него это меньшее зло, чем потерянные данные или вход программы в бесконечный цикл.
> Драйвер мышки тоже должен assert-ы выкидывать?
Конечно. Лучше падать, чем записывать данные по испорченному указателю.
Наверное мы говорим о разных вещах. Ты о проверке входных данных, а я об ошибках программирования. Возможность ловить assertы приводит к привычке использовать их для проверки валидности внешних данных. В моей тарелке assertы нельзя ловить, она все вызывают core dump. Они используются только для ловли багов. Конечно, это не отменяет необходимости проверки внешних данных, это даже увеличивает необходимость проверки. Только проверка делается классическими методами: число сравнивается с нулём перед тем, как на него делить, вместо того что бы делить и потом ловить assert.
Согласись, что задача, которую решает один человек на миллион назвать практической нельзя. Также очевидно, что задача, которую решает каждый из сотни - практическая.Не соглашусь. Возьмём к примеру программу - DNS сервер. Таких программ написано очень мало - можно пересчитать по пальцам. Их пишет ничтожно малое количество человек, в сравнении с сообществом веб-программистов. Это не практическая задача?
За файловой системой UFS по большому счёту стоит 1 человек. Она (или её аналоги написанные еще горсткой людей) используются во множестве операционных систем.
Но эти вещи лежат на поверхности. Мы про них знаем потому, что ими пользуемся. А сколько лежит вне нашего поля зрения? Управление промышленными процессами. Метеопрогнозы. И т.д., и т.п.
Почему ты думаешь, что данные теряеются только во время работы, а не во время останова?
Что мешает дополнить программу самодиагностикой? Которая отслеживает, и первые, и вторые проблемы, и как-то их решает?
Ты постянно забываешь про внешний мир.
Представь, что эта программа чем-то управляет (машиной, насосом, светом, водой, деньгами, безопасностью, сердцем и т.д.).
Что произойдет с этим управлением, если программа встанет?
Или программа, наоборот, собирает какие-то данные.
Что просходит со сбором данных, если программа стоит?
Что произойдет, если программа встает из-за того, что какой-то левый датчик отказал и начал выдавать данные за непредусмотренным диапазоном?
Давай возьмем совокупный параметр:
f(как много людей пользуются программой, как много людей пишут такие программы)
Таким критерием можно пользоваться?
И там и там теряются.
> Что мешает дополнить программу самодиагностикой? Которая отслеживает, и первые, и вторые проблемы, и как-то их решает?
Ни что не мешает. Я ведь не спорю с тем, что программа должна проверять все возможные проблемы. Я снова замечу, что мы вкладываем разные смыслы в понятие assert. Если я не ошибаюсь, ты имеешь в виду ошибку во внешних данных. Я же имею ввиду ошибку в логике программы. Я не спорю с тем, что все внешние данные надо тщательно проверять, и что нахождение ошибки в них не должно быть критическим событием.
Ты постянно забываешь про внешний мир.Пиздец произойдёт.
Представь, что эта программа чем-то управляет (машиной, насосом, светом, водой, деньгами, безопасностью, сердцем и т.д.).
Что произойдет с этим управлением, если программа встанет?
Или программа, наоборот, собирает какие-то данные.Опять пиздец. Не надо меня убеждать, что это плохо когда программа стоит. Я знаю.
Что просходит со сбором данных, если программа стоит?
Что произойдет, если программа встает из-за того, что какой-то левый датчик отказал и начал выдавать данные за непредусмотренным диапазоном?Наверное возьмут за яйца автора драйвера(модуля) левого датчика. За то, что он допустил в драйвере ошибку - вся программа стопится, если отказал датчик.
Давай возьмем совокупный параметр:Таким наверное можно. Вот только сложно входные данные найти. Сколько людей пользуются программным обеспечением, которое управляет АЭС? Сколько людей пользуются программой управляющей светофорами в центре Москвы?
f(как много людей пользуются программой, как много людей пишут такие программы)
Таким критерием можно пользоваться?
Сколько людей пользуются программой на редком языке, которой выполняется какой-то квантовый расчёт? Ноль. А если через 5 лет, будет найдено новое лекарство или новый материал? А если найдёт не эта программа, а программа которая писалась в соседней лабе? Можно ли первую считать бесполезной и не практической?
из простейшего - например, транзакции - можно легко показать, что assert-ы (в виде останова) и транзакции не совместимы
Не соглашусь. Возьмём к примеру программу - DNS сервер. Таких программ написано очень мало - можно пересчитать по пальцам. Их пишет ничтожно малое количество человек, в сравнении с сообществом веб-программистов. Это не практическая задача?Отличные примеры.
За файловой системой UFS по большому счёту стоит 1 человек. Она (или её аналоги написанные еще горсткой людей) используются во множестве операционных систем.
Актуальные - да. Т.к. ими пользуются много людей.
"Задача проектирования и реализации файловой системы UFS" - непрактическая, т.к. с ней столкнулся всего один человек. А вот "задача реализации файловой системы" - практическая. Ею занимается дофига народу.
Про dns-сервер.
Редкий мутант сможет пересчитать количество реализаций dns-серверов по пальцам - их больше полусотни. Т.е задача достаточно практическая. Пусть и менее практическая, нежели тот же форум.
если действительно интересно - можешь установить, например, BlackBox (ftp://netinfo.hackers/pub/aix/blackbox15beta.exe) и посмотреть, что это такое.
"Задача проектирования и реализации файловой системы UFS" - непрактическая, т.к. с ней столкнулся всего один человек.У тебя извращенное определение слова "практический". Ознакомься с толковым словарём:
ПРАКТИЧЕСКИЙ прил.
1. Соотносящийся по знач. с сущ.: практика, связанный с ним.
2. Занимающийся применением каких-л. знаний на деле, развивающий умения, знания, опыт в сфере какой-л. деятельности.
3. Необходимый для практики в какой-л. области деятельности.
4. Относящийся к сфере жизненного опыта, связанный с реальными потребностями быта.
5. Хорошо разбирающийся в делах, интересах и потребностях быта; деловитый, опытный.
6. Легко применяемый на деле, на практике; экономный, удобный, практичный.
Где здесь "количество людей", черт возьми?
Редкий мутант сможет пересчитать количество реализаций dns-серверов по пальцам - их больше полусотни. Т.е задача достаточно практическая. Пусть и менее практическая, нежели тот же форум.Полусотни? Я вот только пять знаю и то, у двух название одинаковое. Ты наверное любую попытку считаешь программой? Тогда наверное число шеллов тоже очень велико - сколько студентов с ВМК выпустилось, т.к. каждый пытался шелл писать.
У меня зашибись понятие практической задачи. Возьмем, например, задачу, которая является непрактической в моем определении. Из этого следует, что на практике я скорее всего с ней не столкнусь (определение 1). Значит, мне не обязательно обладать знаниями и опытом в области, относящейся к этой задаче. (определения 3-4).
Я погуглил, у меня получилась цифра в районе полусотни. Сколько из них популярно - не знаю. Но с этой задачей столкнулось довольно много народу, это факт.
У меня зашибись понятие практической задачи. Возьмем, например, задачу, которая является непрактической в моем определении. Из этого следует, что на практике я скорее всего с ней не столкнусь (определение 1). Значит, мне не обязательно обладать знаниями и опытом в области, относящейся к этой задаче. (определения 3-4).Молодец. Ты прекрасно проиллюстрировал то, что я называю "не видеть дальше своей тарелки".
Я погуглил, у меня получилась цифра в районе полусотни. Сколько из них популярно - не знаю. Но с этой задачей столкнулось довольно много народу, это факт.Гуглил по запросу "DNS server"? Не понимаю, как с помощью поисковика можно оценить число софта реализующего DNS сервер.
Значит, мне не обязательно обладать знаниями и опытом в области, относящейся к этой задаче.Добавлю для ясности. Если такая задача все-таки встретится, в этот момент и произойдет пополнение багажа знаний. Lazy learning
http://freshmeat.net/browse/149/
Можно еще ls /usr/ports/dns.
Только это далеко не всё сервера, из тех что сервера, далеко не всё полноценные сервера, и далеко не все полноценные сервера пригодны к использованию.
> Можно еще ls /usr/ports/dns.
Только это далеко не всё сервера, из тех что сервера, далеко не всё полноценные сервера, и далеко не все полноценные сервера пригодны к использованию.
Сразу скажу, что это невозможно.
Допустим у нас есть N-функциональных точек, правильное прохождение (при отсутствии ошибок) - это один вариант,
вариантов же прохождения при наличии ошибок - это 2^N.
Ошибки - это и нехватка памяти, и отсутствие места на винте, и отказ датчиков, и нехватка ресурсов процессора, и ошибки в других модулях и т.д.
Резюмирую:
1. Все проблемы на этапе разработки предусмотреть нельзя (просто потому, что их кол-во растет экспонециально)
2. Поэтому программа должна вести себя адекватно, даже при наличии незапланированных ошибок.
соответственно core dump, assert - это утопическая полумера, т.к. эти средства не борются с незапланированными ошибками, а просто опускают руки при их наличии.
> Я же имею ввиду ошибку в логике программы.
Как ты отличаешь ошибку в логике программы от ошибки во внешних данных?
int a = b/c;
если 'c' может принимать значение 0 - это ошибка в логике, или во внешних данных?
если памяти перестало хватать - это ошибка в логике, или во внешних данных?
Потому, что 2^N это много? Ты наверное хотел сказать, что это тяжело.
> 2. Поэтому программа должна вести себя адекватно, даже при наличии незапланированных ошибок.
А вот это как раз не возможно.
если 'c' может принимать значение 0 - это ошибка в логике, или во внешних данных?Если может, то ошибка в логике.
если памяти перестало хватать - это ошибка в логике, или во внешних данных?Во внешних данных. Поэтому её наличие надо всегда проверять.
У меня в простенькой программе - функциональных точек больше 1000-чи.
Сколько будет 2 в степени 1000?
Это обозримое число?
> Во внешних данных. Поэтому её наличие надо всегда проверять.
Ну, проверил, памяти нет и что дальше?
Проблема в не самой проверке, а в том какое решение надо принять, если памяти нет?
Где-то можно задачу отложить, где-то можно использовать другое решение (может быть менее точное, но зато менее ресурсоемкое где-то можно попробовать повторить еще раз на удачу, где-то можно попросить пользователя высвободить память, где-то можно прервать текущую задачу, где-то можно приостановить задачу до лучших времен и т.д.
Для правильного решения - и необходимо расмотреть все 2^N вариантов
Где-то можно задачу отложить, где-то можно использовать другое решение (может быть менее точное, но зато менее ресурсоемкое где-то можно попробовать повторить еще раз на удачу, где-то можно попросить пользователя высвободить память, где-то можно прервать текущую задачу, где-то можно приостановить задачу до лучших времен и т.д.И решение - завершить программу (core dumped) - самое простое и самое "детское" (внешний мир меня обидил, поэтому я больше ничего делать не буду).
И решение - завершить программу (core dumped) - самое простое и самое "детское" (внешний мир меня обидил, поэтому я больше ничего делать не буду).Не так. "Во мне ошибка, я могу упасть от неправильного инпута, я больше ничего делать не буду."
У меня в простенькой программе - функциональных точек больше 1000-чи.Ты мне заморочил голову. 2^N - это количество code path, но не количество проверок. Количество проверок - N.
Сколько будет 2 в степени 1000?
Это обозримое число?
Ну, проверил, памяти нет и что дальше?Спасибо я знаю. В чём ты пытаешься убедить меня? В том, что какая то волшебная технология выберет решение за меня?
Проблема в не самой проверке, а в том какое решение надо принять, если памяти нет?
В том, что отказавшись от core dumped, можно внешним образом запрограммировать несколько моделей поведения во время ошибки.
Например, возьмем desktop-приложения, одна из стратегий - откатить действие до момента нажатия пользователем на кнопку.
В том, что отказавшись от core dumped, можно внешним образом запрограммировать несколько моделей поведения во время ошибки. Например, возьмем desktop-приложения, одна из стратегий - откатить действие до момента нажатия пользователем на кнопку.Программа записала мусором какой-то пойнтер, произошел segment violation, ты его поймал. Решил откатить действие. Но оказалось, что программа записала мусором и ту структуру, в которой ты хранил всю информацию для отката. Получился не откат, а переход в какое-то другое состояние.
кстати, когда уже это будет просто?
microsoft ничего не обещает по этому поводу?
просто - это типа такого:
и на выходе a==1
a = 1;
transaction {
a = 2;
rollback;
}
Кстати, о таком языке я мечтаю уже давно (только не надо про SQL)
Есть мнение, что это не очень хорошо ложится на ООП, вот и приходится изобретать transaction servers всякие, к которым слово "просто" уже никак не применимо.
А почему? Где об этом подходе вообще можно почитать?
Поэтому и идет речь о том, что надо выбирать такие языки, которые защищают от segment violation
На open ООП нормально ложится, на закрытый ООП - да, хуже.
Ты вроде haskell собирался ботать. Наверняка там это просто сделать монадами.
Нет, именно 2^N.
Допустим у нас есть задача - для нормального ее выполнения ей нужна память, винт, датчик.
Хороший - вариант один.
Ошибочных же вариантов - 2^N -1
1) Что делать если не хватает памяти?
2) Что делать если не хватает винта?
3) Что делать, если идет отказ датчика?
4) ЧТо делать, если одновременно не хватило памяти и отказал датчик?
5) ЧТо делать, если одновременно не хватило винта и отказал датчик?
и т.д.
варианты 1 и 3, 2 и 5 - не одиннаковы
т.к. если мы время отказа датчика - формируем сообщение и выводим его на винт.
то если мы не предусмотрели варианты 4 и 5, то будет все "плохо".
ps
Еще раз напоминаю, что ошибку мало диагностировать - необходимо еще сформировать адекватный выход из ошибки.
и если диагностик действительно N, то ситуаций требующих решения - 2^N
По-моему я и описал случай такой защиты, не так ли?
Ошибочных же вариантов - 2^N -1Если их комбинировать, то да. Но не могу представить себе случай, когда нужно действительно рассматривать все комбинации.
Это просто потому, что ты привык при малейшей ошибке завершать программу - в этом случае действительно никаких комбинаций не возникает.
Простейший пример - возникновения комбинаций - это когда пишется парсер, который выдает все ошибки, а не только первую. В такой задаче часто приходится поломать голову - как лучше всего восстановится после ошибки.
Сложного там тоже ничего нет, применение скорее громоздкое, чем сложное.
Что может быть сложно в реализации интерфейса из трем методов - выполнение, фиксация, откат?
ps
На сколько я понимаю, ООП поэтому и рулит, что благодаря ООП - большая задача рубится на кучу мелких, которые решаются по отдельности.
В итоге, решение получается громоздкое, но зато каждый отдельный кусочек - сам по себе простой, и может быть легко реализован.
> выполнение, фиксация, откат?
Собственно необходимость реализации.
Если ты умный и бедный (не можешь нанять себе помощников) - то да - это проблема.
Если ты глупый, но богатый (можешь нанять себе помощников) - то проблемы - нет.
Да, и второй путь - еще к тому же лучше масштабируется.
Почему-то для трансляции из C в маш.код не нанимают помощников, а используют компилятор.
С другими задачами - пока не везде так радужно.
> много, и она оказалось настолько простая
Средства для перевода из C# в IL и далее в маш.код были придуманы раньше, чем появились люди, которым это "надо". Аналогично с Java.
Задачи эти тоже не простые, если принять во внимание необходимость оптимизации.
Поэтому я и спросил, не обещает ли Microsoft и про транзакции что-нибудь?
Транзакции намного сложнее, чем генерация кода.
Транзакции очень тяжело резать на независимые части.
Как ты собираешься автоматически восстанавливать состояние?
А какие проблемы?
Ну например если ты послал пакет в сеть, то обратно его будет сложно получить.
Это не зависит от того, вручную ты откатываешь или автоматически.
На высоком уровне можно сделать вид что пакет не был отправлен вообще. И применить механизм, который "логически" отменяет отправку пакета.
Проблема в том, что для правильного отката необходимо знать, что именно мы меняем.
Этим знанием обладает только программист, а программа этим знанием не обладает.
ps
Если в генерации кода все однозначно, то в транзакциях - нет, т.к. обратное действие можно делать разными способами, получая при этом разное поведение
В генерации кода - если написано a=2, то это всегда означает, что в переменную a надо положить 2.
Простенький пример:
a = 2
b = 3;
Откатывать мы можем так:
a = old_a;
b = old_b;
или так:?
b = old_b;
a = old_a;
или так:
world = old_world;
Равнозначны ли эти откаты?
Кто кроме программиста знает как правильно сделать откат в данном случае?
Зависит.
Если возможно ручной откат, то это не означает автоматом, что можно запрограммировать автоматический откат.
При ручных действиях - есть, например, человек - который имеет полную информацию о проблеме, может проводить анализ, может принимать решение.
Каждый из этих трех пунктов проблематично реализовать в коде.
> запрограммировать автоматический откат.
В ряде случаев автоматический откат тривиален.
В частности, если если не было i/o.
А если было, то в общем случае придётся процедуру отката описывать явно (но во многих важных частных случаях можно надеятся на автоматическую (либо скрытую в библиотеке) генерацию).
Таких случаев очень и очень мало.
Для такого отката - на этапе компиляции(принятия решения) должен быть доступен весь код (чтобы можно было гарантировать отсутствие побочных эффектов).
На практике - это очень сложно сделать:
во-первых, потому что реальная программа собирается из большого кол-ва модулей (в том числе и закрытых, и чужих, на других языках и т.д.
во-вторых, входной объем для анализа может быть очень большим,
в-третьих, при малейших изменениях надо заново проводить полный анализ
в-четвертых, накладываются серьезные ограничения на используемые модули
и т.д.
Это просто потому, что ты привык при малейшей ошибке завершать программу - в этом случае действительно никаких комбинаций не возникает.Не правда. Еще раз повторю (который, уже раз? что я привык завершать программу при ошибке, которой "не может произойти", то есть при сбое логики программы. При малейшей ошибке в инпуте, я привык его отбрасывать.
Простейший пример - возникновения комбинаций - это когда пишется парсер, который выдает все ошибки, а не только первую. В такой задаче часто приходится поломать голову - как лучше всего восстановится после ошибки.Ошибки, которые находит парсер, не являются ошибками в программе, так что это вообще не корректный пример.
Т.е. при любой незапланированной ошибке ты завершаешь программу?
например, при нехватке памяти или отвале винта?
при чем даже, если это были вспомогательные действия?
> Ошибки, которые находит парсер, не являются ошибками в программе, так что это вообще не корректный пример.
Какая разница? Проблемы те же, действия те же...
например, при нехватке памяти или отвале винта?
при чем даже, если это были вспомогательные действия?
Лично мне не видится причин, по которым необходимо продолжать исполнение. Первый случай, по-моему, вообще классический bof.
Т.е. при любой незапланированной ошибке ты завершаешь программу?Чёрт возьми, неужели я так не понятен? Нет, нет и нет. При логической ошибке. При ошибке, которая никогда не произойдёт в идеальной программе, написанной без ошибок. Нехватка памяти или отвал винта, как ты понимаешь могут произойти.
например, при нехватке памяти или отвале винта?
при чем даже, если это были вспомогательные действия?
Какая разница? Проблемы те же, действия те же...Нет. Проблемы не те же. Когда ты находишь ошибку в инпуте, то ты уверен в консистентности инвариантов программы. Когда же находишь ошибку в последних, то нет.
Рассмотрим такой пример:
Редактируем картинку в photoshop-е, долго редактируем, несколько часов редактируем, но при вставке еще одного слоя - память кончилась - и photoshop зачем-то аварийно завершается, вместо того, чтобы просто откатить последнюю команду?
Нормальное ли это поведение с точки зрения пользователя?
Или другой пример:
У программы управления заводом, ракетом, автомобилем - при выдаче команды "включить насос" - кончилась память (или произошел обрыв цепи) - программа завершилась.
Насколько тяжелы последствия?
Что мешало заводу/ракете/автомобилю продолжать жить без этого насоса?
Я до сих пор не понимаю, почему и как ты отделяешь логические ошибки от других ошибок.
И как программа у тебя понимает, когда произошла логическая ошибка, а когда - нет?
Допустим нам надо было выполнить следующию последовательность действий:
A
B
C
Действие B, по тем или иным причинам, не выполнилось, хотя мы изначально предполагали, что оно должно всегда выполняться. Это логическая ошибка или нет?
> Нет. Проблемы не те же. Когда ты находишь ошибку в инпуте, то ты уверен в консистентности инвариантов программы. Когда же находишь ошибку в последних, то нет.
Вспоминая Фон Неймана - сама программа - это такие же входные данные, как и инпут.
Что мешает исправить программу, и ее состояние - на ходу?
Почему, например, живые организмы - правят себя на ходу - а не вылетают в кору?
Для такого отката - на этапе компиляции(принятия решения) должен быть доступен весь код (чтобы можно было гарантировать отсутствие побочных эффектов).Разве в .Net нельзя принять такое решение на этапе инсталляции приложения, когда анализируется код (в MSIL) всех библиотек?
В общем случае - нет, конечно, т.к. как минимум - часть кода можно сгенерить в runtime-е, или получить с другого компьютера, и самое главное - на этапе компиляции - никто не знает - какой кусок кода какой другой кусок кода будет вызывать.
Ключевая особенность .Net-а - это то что работа происходит через определенный виртуальный интерфейс, за которым может быть все что угодно.
И уже только при реальном исполнении, при чем только в самый последний момент мы можем понять - с каким кодом мы будем реально работать.
> будем реально работать.
И, самое позднее, в этот момент можно понять, пригоден ли код для транзакций.
Программа, умеющая транзакции, может грузить "левую" библиотеку со специальным флагом, означающим, что процедуры отката пустые - в большинстве случаев этого будет достаточно. Или можно указать явно, в тексте программы, используя опубликованный интерфейс.
Всё, исходя из моих слов, можно расширение C#, поддерживающее транзакции, сделать.
Поддерживающие транзакции - да, можно сделать.
но автоматический откат сделать нельзя - по крайней мере, в реальной жизни.
возвращаясь к десктопному приложению с кнопкой, после нажатия на которую следует неудача, придётся как-то сказать, что надо перерисовать окна после отката объектов, связанных с ними
автоматически это не сделать без модификации оконной библиотеки
В мультиагентной системе - где окна это отдельные агенты - это будет сделано "само".
> сделано "само".
сейчас это делается?
button.setColor(BLACK);
transaction {
...
button.setColor(RED);
...
rollback;
...
}
нет, не делается - потому что окна сейчас не являются агентами.
десктопные приложения покроются почти полностью
Глебиус мастерски перевёл тему на "распространённые задачи" и "транзакционное программирование".
1) "Распространённых задач" не бывает. Но это не важно.
2) Я лично видел работающую схему откатов. В OpenGL она реализуется через glPushXXX/glPopXXX. Конечно, на ООП она плохо ложится, и жрёт дофига памяти и кода. Ещё можно писать все классы как Serializable и делать контрольные точки, это намного проще. Если как следует подумать, то это совсем просто.
3) Ваще-то мы обсуждаем недоязык Оберон. Я читал подиагонале, конечно, но! Я не заметил ответа на прямой вопрос: в какой конкретно задаче Оберон лучше чем С# ?
4) Ещё я не увидел комментариев к моему заявлению что простой синтаксис сосёт. Синтаксис должен быть ортогональным, логичным, но вот простым ему быть вовсе не обязательно, и даже наоборот - наличие большого количества синтактик шугара существенно упрощает и ускоряет как написание, так и понимание программы. Все согласны?
5) Так на чём всё-таки основывается заявление, что "оберон - это научный подход, а С - ремесленный"?
Хочу знать, почему Оберон научный и клёвый.
Хочу знать, почему Оберон научный и клёвый.
Хочу знать, почему Оберон научный и клёвый.
Я до сих пор не понимаю, почему и как ты отделяешь логические ошибки от других ошибок.Проверки инвариантов. Проверка того, что сумма элементов в списке равна длине списка прописанной в его заголовке. Проверка того, что вход в функцию, осуществляющую неатомарное редактирование структуры происходит с взятым мьютексом. Проверка того, что мы не держим мьютексов когда блокируемся.
Допустим нам надо было выполнить следующию последовательность действий:A B CКак это не выполнилось? Если B вернуло ошибку, то это не логическая ошибка, такое нужно обрабатывать. Если же B вернулось без ошибок, но не сделала что-то жизненно важное для C то надо падать, т.к. в программе ошибка.
Действие B, по тем или иным причинам, не выполнилось, хотя мы изначально предполагали, что оно должно всегда выполняться. Это логическая ошибка или нет?
Вспоминая Фон Неймана - сама программа - это такие же входные данные, как и инпут.Мне даже лень отвечать серьёзно на этот вопрос. Если бы программа могла себя сама исправить, то почему бы программистам не писать наброски программ, а дальше они уже сами будут совершенствоваться. А что мешает программе написать себя самой?
Что мешает исправить программу, и ее состояние - на ходу?
Почему, например, живые организмы - правят себя на ходу - а не вылетают в кору?
> дальше они уже сами будут совершенствоваться. А что мешает программе написать себя самой?
Если ты не умеешь писать самовосстанавливающиеся программы - это не означает, что никто не умеет.
Если ты не умеешь писать самовосстанавливающиеся программы - это не означает, что никто не умеет.А кто умеет?
заниматься, например, самолечением сейчас IBM начинает
http://www.google.ru/search?hl=ru&ie=UTF-8&q=self+healing+ibm&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=
http://www.internetnews.com/ent-news/article.php/3090091
И? Почему нельзя восстановится после сбоя инвариантов?
Что мешает восстановить правильность инвариантов?
> Проверка того, что сумма элементов в списке равна длине списка прописанной в его заголовке
Что мешает исправить ошибку и востановить заголовок?
Что мешает исправить ошибку и востановить заголовок?И получить неисправимую ошибку через некоторое время, анализировать которую будет в тысячу раз сложнее.
Во-первых, что тебе мешает сбросить дамп, а также предупредить пользователя - что программа начала хромать.
В-вторых, все опять же зависит от того, как у тебя написана программа.
ps
Самое главное - ты уверен, что пользователь так уже рад, что ты стопнул программу для того, чтобы тебе было проще искать ошибку - причем даже тогда, когда пользователь до тебя - ну, никак достучаться не может - потому что, например, летит по трассе на скорости 200 км?
Например, scrubbing для ecc memory считается полезной фичой.
Если у тебя в программу заложена мощная самодиагностика - то серьезные ошибки скорее всего так и не возникнут (т.к. благодаря самодиагностики - проблемы будут правиться на ранних этапах) - просто программа будет хромать с определенным видом ошибок.
Пользователю намного проще работать с программой - которая может быть хорошо работающей, мало хромающей, сильно-хромающей, полностью остановленной,
чем с программой - которая либо хорошо работает, либо, вообще, не работает.
В первом случае, остается возможность - что пользователь, сама программа или другие программы как-то приспособятся к этому хроманию.
Вообще говоря я не согласен. Кто будет проверять на правильность код, который исправляет ошибки? Еще один такой же код? И так до бесконечности? ИМХО надо делать autosave. А не придумывать мифические схемы исправления ошибок.
Например, если ядро в случае неустранимой ошибки перегружает компьютер - это вроде и останов, но не совсем, так?
Тот же, кто сейчас проверяет правильность обычной программы
ps
Ты уверен - что в тебе, как в живом организме - все работает правильно?
но благодаря, самодиагностике и самовостановлению - ты продолжаешь жить и развиваться.
> ИМХО надо делать autosave
И что дальше?
В desktop-ных приложениях - это может быть поможет.
Как быть с управлением чего-либо, особенно если учесть, что save - это такая же часть программы, и в них тоже могут быть ошибки?
Да, я надеюсь - тебя не смущает, что текущие desktop-ные программы занимаются самолечением save-ов?
хуже всего, когда в сохранённых данных уже заложена ошибка, проявляющаяся не сразу
Когда как. В зависимости от того, как между собой коррелирует состояние до и после.
И что не было обслужено во время перезагрузки.
Причем, что самое интересное, что после такого останова при загрузке - и файловая система, и БД-сервер - будут заниматься самолечением - восстанавливая или откатывая транзакции.
Программы управления чем-либо обычно очень маленькие и компактные, и к тому же для них можно рассчитать все необходимые ресурсы заранее(кстати в подавляющем большинстве случаев так и делается). И вообще: как ты представляешь себе самолечение в RT? ИМХО самолечение никак не укладывается в O(1 так как надо прочекать и проверить множество управляющих структур, а представь себе что прога по управлению реактором занялась самолечением, и в этот момент пошла неуправляемая ядерная реакция?(я конечно немного преувеличиваю, обычно такие вещи детектируются на аппаратном уровне)
Сейчас так делают, в основном, только аварийные и резервные контуры, а также самый-самый нижний уровень.
Основным управлением часто занимается обычная "персоналка" - просто потому, что сложное управление - маленьким и компактным не сделаешь.
Нет. И за такое и посадить могут. Особенно на предприятии с повышенной опасностью. На персоналке разве что графики рисовать будут и команды отдавать. Но именно управление - будет на встроенном софте.
Значит надо ставить компьютер, который может без напрягов рассчитать O(n) для n, например, меньше 1e7
Нет. Нельзя. Так как такой комп заведомо очень сложен. И в опасную зону НИКТО не будет ставить такой комп. Так как риск очень велик. В таких системах до сих пор очень популярны процы класса 86 - 386.
Это если нет аварийных контуров.
Да, и контроллеры маленькими и компактными сейчас не назовешь.
Последнее время используются, в том числе, и 486-е с 16 метрами памяти.
ps
Из практики :
охлаждение внешнего контура реактора, охлаждение ТЭЦ, управление климат-контролем, управление мелкими заводами (дрожжевыми, сахарными, другими c/х - производством) - делается в том числе и на персоналках - просто потому, что разработка намного дешевле.
Да, на западе - в банкоматы, на автомобили, на корабли - также обычно ставится, в том числе, и обычный windows.
Помню, помню, было дело
в метро мадридском, например, винда стоит. А иногда висит.
Число Ингве.
5. Читать про различие американской и европейской
конструкторской школы.
---
...Я работаю антинаучнымм аферистом...
вот людей и считается,
что цикл проще рекурсивного соотношения.
Объяснить школьнику, знающему основы алгебры,
что такое рекурсия, труда не составляет.
В частности, именно таким образом вводят те же числа Фибоначчи.
Если кто захочет пример покруче, легко:
пусть напишет функцию Аккермана без рекурсии.
---
...Я работаю антинаучным аферистом...
Из-за таких что цикл проще рекурсивного соотношения.
Объяснить школьнику, знающему основы алгебры,
что такое рекурсия, труда не составляет.
В частности, именно таким образом вводят те же числа Фибоначчи.
Если кто захочет пример покруче, легко:
пусть напишет функцию Аккермана без рекурсии.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
А можно узнать пример практического применения функции Аккермана.(Это я не ради спора, а из любопытства спрашиваю)
те, кто не знает про рекурсию.
---
...Я работаю антинаучным аферистом...
Э... то есть это вещь в себе? Или просто не более чем учебный пример?
Займись рефакторингом чего-нибудь круто навороченного,
хотя бы в качестве учебного примера.
Там увидишь, как лучше.
---
...Я работаю антинаучным аферистом...
Слово "рефакторинг" тут для красного словца, или есть виды рефакторинга, которые лучше делать с помощью функции Аккермана. И как это делается?
Есть какие-то свидетельства, что это не так?
> Объяснить школьнику, знающему основы алгебры,
> что такое рекурсия, труда не составляет.
Рекурсию надо долго объяснять, цикл -- понятен интуитивно.
> В частности, именно таким образом вводят те же числа Фибоначчи.
Те же числа Фибоначчи легко и просто считается циклом за линейное время. В то же время, рекурсия занимает экспоненциальное время, и какие-то способы ее сворачивания гораздо сложнее, чем цикл.
Рекурсия хороша для построения математических моделей. Но для практики, в частности, для написания работающих программ, она обычно непригодна. Не путайте написание программ и построение математических моделей - это 2 большие разницы!
> Если кто захочет пример покруче, легко:
> пусть напишет функцию Аккермана без рекурсии
Пример абсолютно бесполезной функции. Точнее, единственное ее применение - конструктивный пример рекурсивной, всюду определенной, но не примитивно-рекурсивной функции.
Объяснить школьнику, знающему основы алгебры,А вот прикинь, был у меня ученик (или ученица, уже не помню которому оказалось проще сделать подсчет факториала через рекурсию, чем через цикл. Это же к Фибоначчи относится.
> что такое рекурсия, труда не составляет.
Рекурсию надо долго объяснять, цикл -- понятен интуитивно.
Рекурсия хороша для построения математических моделей. Но для практики, в частности, для написания работающих программ, она обычно непригодна. Не путайте написание программ и построение математических моделей - это 2 большие разницы!А QuickSort без рекурсии сделать - каково? А ведь алгоритм простой и эффективный.
> обычно непригодна.
Парсер методом рекурсивного списка понять очень просто, в результате чего этот метод популярен.
Обход дерева в глубину - очень распространённая задача, опять же понятнее всего решается рекурсией.
В глубине ОО-GUI-библиотек часто скрыта рекурсия: элемент, отрисовывающее все свои подэлементы рекурсивным вызовом метода draw - нередкое явление.
Можно и без рекурсии. Для этого достаточно хранить дерево в виде (самый левый потомок, правый сосед). Очень просто и понятно
А вообще рекурсия хороша далеко не везде. Иногда она действительно очевидна и красива, а иногда просто извращенный бред любителей функциональных языков итд.
Все это конечно верно. Есть алгоритмы, которые по своей природе существенно рекурсивны, и их естественно писать (и надо писать) через рекурсию.
Однако, есть некоторые граждане, пытаются упихать рекурсию абсолютно везде, например рекурсивное определяется функции типа map, length, foldr, обход списка -- вещи которые гораздо более естественно делать через цикл. Мне как раз это не нравится -- пытаться использовать рекурсию не как редкий специализированный механизм, а пытаться выдавать чуть ли не за основную конструкцию программирования. Особенно это касается функциональных языков - там такое очень любят.
Но скажем в том же quicksort-e -- рекурсию нужно явно разворачивать руками, иначе очень быстро получим stack overflow. Вообще, в рекурсии очень много подводных камней. Нужно постоянно следить насколько глубоко она может уйти. Иногда приходится организовать очередь руками (пример: smbclient, там много гемора из-за этого). И тогда она становится отнюдь не простой конструкцией.
> А вот прикинь, был у меня ученик (или ученица, уже не помню которому оказалось проще сделать
> подсчет факториала через рекурсию, чем через цикл. Это же к Фибоначчи относится.
Верю. Но скажи, сколько у тебя было учеников, которые поняли цикл, и которые испытывали проблемы с рекурсией?
Не согласен. В специальных случаях, когда дерево сбалансировано, может работать. На произвольных деревьях - верный способ получить stack overflow.
Ахуеть. Или мне изменяет склероз, или глубина рекурсии не может быть больше чем log(n и если ты будешь утверждать что сортируешь массивы порядка 2^1000 элементов, то я первый брошу в тебя камень
В приведенных тобою случаях рекурсия удобна для построения некой модели "в голове" для понимания в целом что и как происходит. Однако, после того как такое базовое понимание достигнуто, наступает этап реализации. И тут, как правило, рекурсия пишется не просто так - нужно явно ее разворачивать и/или сворачивать и прочий геморрой. В результате получается большая сложная навороченная конструкция, в которой сложно угадать исходное простое рекурсивное соотношение.
ИМХО не очень популярен. Большинство парсеров пишутся далеко не вручную.
> работать. На произвольных деревьях - верный способ получить stack
> overflow.
если дерево не влезает в память, всё усложняется конечно
я, вообще-то, говорил про самый понятный способ, а не пригодный для самых больших деревьев произвольного вида
Если тебе каждый раз не везет и выбираешь элемент, который равен крайнему. В результате у тебя каждый раз массив длины n разделяется на 1 и n-1. Глубина будет O(N). Это получается только на специально тщательно подобранных массивах. На практике, такое редко встречается, но в надежных программах к этому надо быть готовым.
Самый понятный - да. Но это не тоже самое, что "пригодный к использованию в реальной жизни".
По-моему, простой парсер быстрее написать руками, чем юзать yacc.
Генераторы нужны, если язык сложен, и рекурсивным спуском не разобрать.
Ты забыл как это решается? Один из подмассивов обрабатывается нерекурсивно(грубо говоря через goto всегда можно выбрать наибольший массив для этого.
Человек не машина, он просматривает листок значительно быстрее, чем умножает.
Если рекурсия хороша для построения модели,
то она столь же хороша и для написания работающих программ.
Если для программы нет модели, то она чаще оказывается плохо работающей.
И кто тебе сказал, что постоение модели и написание программы
это такая разница? Это --- _одно_ _и_ _то_ _же_.
Откуда, по-твоему, у железки возьмётся модель мира,
если у неё самой никаких мозгов нету?
Из каких таких соображений она будет действовать, да ещё и правильно?
---
"...Разве было бы плохо перевернуть перевёрнутый мир?"
То есть, для ряда распространённых задач, рекурсия - самый понятный способ решения, и нельзя говорить об обучении программированию без её объяснения.
Я как раз про это и говорю. Чтобы рекурсивный алгоритм работал, его приходится явно разворачивать, в данном случае - через goto. Чистая рекурсия бы содержала 2 рекурсивных вызова и не работала.
> разворачивать и/или сворачивать и прочий геморрой.
Разве что из любви к искусству разворачивания
На практике как раз нормально всё
практически любой парсер проще написать через lex/yacc. Хочешь я тебе покажу свой конечный автомат для разбора ini файлов на 500 строк? Что-либо сложнее писать вручную уже ОЧЕНЬ сложно.
Ну это же не совсем разворачивание... Это рекурсия без увеличения стека. Я бы так сказал
> На практике как раз нормально всё
Почему ты так считаешь? Я как раз видел программы, в которых это делается "не от хорошей жизни", например, тот же smbclient.
tail call спасёт ситуацию
преобразовать "наивный" quick sort к варианту с хвостовой рекурсией проще, чем вводя цикл
> то она столь же хороша и для написания работающих программ.
Обоснуй. В реальной жизни нужно учитывать ограниченный объем памяти, кэша, стека, диска, конечный размер int и double и ряд других ограничений. В модели ничего такого нет. Поэтому выводы в модели могут не совпадать с тем что происходит в программе.
> И кто тебе сказал, что постоение модели и написание программы
> это такая разница? Это --- _одно_ _и_ _то_ _же_.
Обоснуй это утверждение.
ну в квиксорте бывают всякие вариации со случайным выбором порога. Поэтому случай когда у него получается O(N^2) вместо O(N*log(N - это скорее курьез, ну или хитрая атака.
> например, тот же smbclient.
Случаев, где жизнь хороша, побольше будет.
А по поводу плохой жизни, даже в ядре со стеком в 8K есть места, где без рекурсии трудно.
программы получаются, по меньшей мере, вдвое короче, а в добавок,
выявляется до кучи ошибок из тех, о которых не скажет тестирование.
---
...Я работаю антинаучным аферистом...
Такое тоже нужно учитывать. Вдруг мы пишем программу которая работает в банке и считает деньги в режиме 24x7. Злобный хакер Вася, изучив программу может понять механизм выбора порога и попытаться ее уронить подсунув специально сконструированный (другой программой) файл с входными данными. По мне так - вполне реальная ситуация.
> программы получаются, по меньшей мере, вдвое короче, а в добавок,
> выявляется до кучи ошибок из тех, о которых не скажет тестирование.
Маза, если потом перепишешь обратно, можно будет ещё сократить размер и найти ещё несколько ошибок
> программы получаются, по меньшей мере, вдвое короче, а в добавок,
Просто ради интереса: приведи пример какой нибудь реальной программы, в обычном варианте и после переписывания в функциональном стиле. Чтобы мы смогли вживую заценить все эти бонусы.
Так же представляет интерес сведения о скорости работы (до и после).
А там, где мало памяти, используют совершенно другие приёмы программирования.
Кстати, правильно написанные программы получаются ещё и заметно короче ---
отыгрыш, если вообще --- не выигрыш.
Насчёт второго утверждения прочитай исходное сообщение до конца.
Тогда и обоснование увидишь.
---
"...Разве было бы плохо перевернуть перевёрнутый мир?"
Одно дело память, а другое дело стек. Который в некоторых случаях просто невозможно увеличить(треды).
Рекурсивный алгоритм, не использующий системный стек, не перестаёт быть рекурсивным.
Упомянутого явления не наблюдал.
---
...Я работаю антинаучным аферистом...
А надо было 'а попросить, а не самому делать.
А что тогда по твоему рекурсия?
Синтаксис должен быть ортогональнымКогда человек говорит про BEGIN/END/{/} а потом называет это "вопросами ортогональности синтаксиса", то это лишь вызывает сострадательную улыбку, вот такую
Лео я ещё поверю, тебе --- нет.
---
...Я работаю антинаучным аферистом...
Стек - это детали реализации.
Никогда не приходилось заниматься внешней сортировкой? Или обсчитывать данные объемом 80 Гб?
> А там, где мало памяти, используют совершенно другие приёмы программирования.
Мало памяти - это ОЧЕНЬ типичная ситуация.
> Насчёт второго утверждения прочитай исходное сообщение до конца.
> Тогда и обоснование увидишь.
Не уходи от ответа, напиши явно. Без всяких разглагольствований про "модель мира" и "мозги у железки".
Ты даже не удосужился проверить о чем я? Однажды выделенный стек уже нельзя увеличить в размерах. Так как куда его увеличивать? Понятие адресного пространства и тредов тебе знакомо?
Для внешней сортировки замечательно сработает сортировка слиянием, определённая рекурсивно.
В очень узких кругах.
Это и есть явно.
Камню совершенно безразлично, в каком порядке давать импульсы,
соответственно правильность работы программы определяется человеком.
Человек, пока пишет программу, описывает какие-то отношения
внешнего мира, то есть, _создаёт_ _модель_ этого внешнего мира.
Будешь утверждать, что импульсная техника не имеет никакого
отношения к числам?
---
"Студенту надо повторять всё три раза, Ганс. Три раза. Запомни, Ганс: три раза."
---
...Я работаю антинаучным аферистом...
Два стека? Жесть
Настоящая жесть - это когда треды юзают. Дофига стеков становится
нееее.... Два стека в одном треде - вот это жесть А про то что ты сказал - это всем известно(кроме похоже КОНТРЫ) и никому не интересно
Волею судеб столкнулся с таким Могу подтвердить - действительно, жесть.
Имелось ввиду: много стеков на 1 тред.
Тред - это тоже абстракция.
Процессоров-то в машине конечное и довольно постоянное число.
А то, что yacc заводит свой стек, тебя не смущает?
---
...Я работаю антинаучным аферистом...
А про то что ты сказал - это всем известноКстати большая заслуга Явы в том, что в ней стек не привязан к определенному месту. На Ява-стеке могут храниться ссылки и примитивы, но не объекты, соответственно на стек нельзя сослаться (сравнить с .NET!) Поэтому JVM могла бы расширять стеки тредов когда вздумается, почему тем не менее в Яве размер стека ограничен - для меня полнейшая мистика...
> тем не менее в Яве размер стека ограничен - для меня полнейшая мистика...
Ладно Ява. А вот почему такая же фигня в ocaml?
А разве явовские треды не отображаются один в один в системные треды?
А разве явовские треды не отображаются один в один в системные треды?Какое-то бессмысленное утверждение... В какой-то тебе известной JVM? Ну и что?
Их не так уж много
>синтаксиса", то это лишь вызывает сострадательную улыбку, вот такую
Дурилка картонная =) С чего ты взял, что я _это_ называю вопросами ортогональности синтаксиса? Ну вот не знаю, с чего ты это взял, но ты ошибся. Если забыть про & и OR, то у оберона довольно ортогональный синтаксис, правда, чудовищно бедный. Правда, ELSEIF говно, по моему, ну да ладно.
> На Ява-стеке могут храниться ссылки и примитивы, но не объекты, соответственно на стек нельзя
> сослаться (сравнить с .NET!) Поэтому JVM могла бы расширять стеки тредов когда вздумается,
Никак не уловлю, а в чём проблема с указателями на стек? Сборщик Мусора прекрасно умеет указатели патчить. бтв, а что, в жаве структуры это не value types?
2 Контра:
>Нет. Сосёт сложный синтаксис.
Нет, сосёт бедный синтаксис. Если добавить в Оберон операторы "<< >> & | ^ ++ --" и операторные присваивания, то он станет легче для восприятия. Потому что вместо методов будут операторы.
>Число Ингве.
А что такое Число Ингве? У меня щаз инета нет.
> Читать про различие американской и европейской конструкторской школы.
Да мне как-то насрать на это различие. Ты мне вот скажи, где в языке научность-то? Или, может быть, она в стандартных библиотеках?
Ну, я думаю что в Мобильном Телефоне "системных тредов" нет вообще, а вот JVM есть. К чему бы это?
бтв, а что, в жаве структуры это не value types?Издеваешься?
Как ты, наверно, догадываешься, Java более простой по сравнению с C#. Структур там просто нет.
ГЫ ГЫ ГЫ.
На Ява-стеке могут храниться ссылки и примитивы, но не объекты, соответственно на стек нельзя сослаться (сравнить с .NET!)А что c .NET? Двигать стек при желании и иам можно (ссылки всегда можно подправить).
Ну и как, двигают?
Двигают. Лично на это напарывался, когда получал адрес массива, передавал его в API-шную функцию (буфер для асинхронной операции а он потом уползал Пока не объявил как fixed - не заработало.
А глубокая рекурсия получается?
Вообще, ссылки сборщик двигает, насколько я знаю...
может мы о разных вещах говорим?
---
ЗЫ на stack overflow напарывался. Значит не получается?
В отличии от Java в .NET могут быть указатели на (логический) стэк, но в случае verifiable IL такие указатели могут сидеть только в стэке. В каждом фрейме стека каждого метода есть указательно на структу, где описываются все указатели в этом фрейме в каждый момент выполнения метода. Поэтому довольно легко пробежаться по фреймам и найти все указатели на стэк, переместить стэк и подправить указатели.
Можно ещё не двигать, а использовать фрагментированный стек, выделяемый кусками при необходимости.
Это наверное очень медленно будет. При каждой операции со стеком надо будет решать перейти ли на предыдущий/создать следующий кусок...
Для ускорения можно попробовать возможности проца использовать: ставить защитные страницы на границах кусков, и обрабатывать исключения.
Правда мне кажется, что с точки зрения работы GC длинный стек не очень хорошо.
microsoft ничего не обещает по этому поводу?
просто - это типа такого:
code:
a = 1;
transaction {
a = 2;
rollback;
}
и на выходе a==1
>>>>>>>>>>>>
Это уже есть. Можно такое реализовать с помощью call with current continuation в Схеме, например. Или вообще в любом приличном языке типа Лиспа или ОКамла пользуясь CPS.
> continuation в Схеме, например. Или вообще в любом приличном языке типа
> Лиспа или ОКамла пользуясь CPS.
Это непросто и неэффективно.
А без такого отката обычные исключения получатся.
Поэтому стек надо увеличивать не на константу, а в 2 раза. Тогда затраты на перемещение каждого элемента в среднем будут невелики и равны O(1).
>Для ускорения можно попробовать возможности проца использовать: ставить защитные страницы на границах кусков, и обрабатывать исключения.
Интересно. Но только грамотно реализовать это довольно сложо. Нужно толковое взаимодействие user space и kernel space...
Видишь ли, проверка при каждом создании и удалении фрейма - это тоже O(1 причём не в среднем, а по-настоящему.
> Но только грамотно реализовать это довольно сложо.
Ничего особенного, многие так делают.
Как мне кажется, ветвление в современных процах намного большее зло чем обращение памяти.
PS: причем проверка не только при создании/удалении, но и при каждом обращении.
>Ничего особенного, многие так делают.
Кто?
> Кто?
Отладочные библиотеки, сборщики мусора (кажется даже в некоторых JVM).
Если подобная техника будет внедрена в чём-то вроде .Net, то в следующем поколении процессоров можно будет ожидать оптимизаций, направленных на ускорение таких проверок.
Да ну? И что же в этом сложного и неэффективного?
Про неэффективность там же сказано.
Если забыть про & и OR, то у оберона довольно ортогональный синтаксис, правда, чудовищно бедный. Правда, ELSEIF говно, по моему, ну да ладно.Еще раз повторяю - про ЕРУНДУ пишешь. Вот то что в С нельзя переменную типа void завести, это вот неортогональность, очень мешает макросы писать, да и шаблоны вечно специализировать приходится. То что шаблонных typedef-ов нет, наподобие
template<class T> typedef x<T,T> y<T>;
тоже неортогональность. Напомню еще про эту дурость
Class object(double(argument;
Куча еще разных мелочей имеется. А && или OR разве не пофиг? Кстати в Си работает and и or.
Двигают. Лично на это напарывался, когда получал адрес массива, передавал его в API-шную функцию (буфер для асинхронной операции а он потом уползалТак массив же в heap-е или как? То что heap двигают - это понятно.
вообще-то объекты все в heap-е создаются вроде... В стеке только ValueType
здесь. Как я понимаю, чтобы легче было поддерживать и добавлять новые возможности.
FYI, в gcc переписаны парсеры С++ (с 3.4.х) и С (с 4.1) вручную, методом рекурсивного спуска. Почему это сделано для С, можно узнать Слова, делающие << >> & | ^ называются, соответственно,
lshift rshift and or xor, ++ -- делают, если кому-то надо.
Научность подхода как раз и состоит в учёте восприимчивости всех
этих << >> & | ^ ++ и --. Если первые три знака воспринимаются
прилично, смысл следует из написания, то ни | , ни ^, ни ++ или
-- этими свойствами нисколько не обладают.
Кстати, "xor" никому нафиг не нужен, и при научном подходе это
очень хорошо видно.
Системные, требующие поразрядного доступа, вещи не рассматриваем,
для этих задач можно держать особо выделенные функции.
---
...Я работаю антинаучным аферистом...
вообще-то объекты все в heap-е создаются вроде... В стеке только ValueTypeНу так вот мы с Крёстным и интересуемся двигается ли в .NET-е стек, а ты про массивы...
У форта, например, нет вообще никакого синтаксиса --- только семантика.А сделайте тред - ликбез по форту. Читать какую-то документацию по нему у меня, например, не хватит терпения, а в ненапряжной форумской обстановке может и осилил бы? Только хорошо бы там был еще кто-то кроме КОНТРы
2. а) http://forth.org.ru/
б) http://dmoz.org/Computers/Programming/Languages/Forth/
искать Marcel Hendrix, размещающего у себя новую "Starting
Forth" after Leo Brodie.
---
...Я работаю антинаучным аферистом...
Стековый язык, так что гораздо лучше изучить JVM (или CLR). В сети есть книга Programming for Java Virtual Machine, там кстати есть глава Compiling Scheme - может быть полезно.....
Да не двигается там стек. Зачем? Там и так проблем выше крыши.
---
"...Так завещал великий и мудрый Сун."
Короче в общем случае также непросто как для простого unmanaged кода. Хотя по идее можно сделать разрывный стек, т.е. когда при вызове случается переполнение стека, то новый фрейм вызываемого метода просто помещается в начало выделеного нового фрагмента стека.
очевидно, религия.
Разрывный стек --- тоже.
---
"...Так завещал великий и мудрый Сун."
> очевидно, религия.
Этому мешает падение скорости работы, а также невозможность работы с внешним кодом.
Ты постоянно забываешь, что .Net (в отличии от других песочниц) - это не вещь в себе, а лишь один из способов создания приложений под Windows.
А зачем? В С++ стек двигают?
Тем более --- на винтеле.
Внешний код вдруг забыл про сегментированность памяти,
о которой тут недавно так вещал ПэЖэ?
С каким внешним кодом невозможно работать?
С тем, который не расчитан на винду?
Так винда с внешним кодом из *никсов всё равно не работает.
Не довод.
---
...Я работаю антинаучным аферистом...
в 8 Кбайт, которое может повлиять и в случае нерекурсивных
алгоритмов, учитывая стиль, в котором пишут некоторые насильники.
---
...Я работаю антинаучным аферистом...
А ты подумай как ты собираешься делать указатели относительно начала стека. Потом тогда нужно делать доступным указатель на начало стека, плюс кода будешь передавать внешнему коду, то он захочет нормальный указатель.
P.S. В CLR сейчас занимаются корректным поведением при нехватке памяти, может и до стека доберутся.
Узнай про сегментацию памяти.
Если тебе так важно вызывать небезопасный внешний код,
то можно какой-то участок запереть, если же код вообще
небезопасный, его следует править или отправлять в мусорку.
---
...Я работаю антинаучным аферистом...
Для простых сей принципиальных препятствий
(за исключением грязного хака с setjmp/longjmp)
не вижу.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
1) нужно вводить отделный вид указателя, который будет правильно джититься в код использующий правильный сегмент. Потом опять проблема с конвертацией в нормальные указатели. Плюс опять проблема с отслеживанием состояния, когда существуют обычные указатели на стек.
2) Потом не представляю, как можно при такой архитектуре повесить потоки на нити (получается с SQL Server, например, не будет работать)
P.S. Возможно я чего и подзабыл из системных дел
Про безопасный код я писал, что видимых проблем нет. Мы обсуждаем общий случай, т.к. в .NET он распространен.
вообще говоря, различаются. Соответственно, "обычного" указателя
на стек ты никак не получишь, если только не сделаешь
UNCHECKED_CONVERSION, которое осуществляется "AS IS WITHOUT ANY
WARRANTY, EXPRESSED OR IMPLIED."
Не вижу ничего принципиально сложного.
---
...Я работаю антинаучным аферистом...
сферической лошади, спокойно переносящей вакуум.
А код должен быть безопасным, чтобы не было вышеупомянутого
core dump вместе с большим набранным текстом.
---
...Я работаю антинаучным аферистом...
А зачем?Еще раз повторяю, стек надо двигать, если хочешь, чтобы стеки тредов были неограниченными. А то вечно - памяти вроде дофига, а стек одного треда уперся в стек другого и дальше расти не может. Выставление параметра "размер стека" тоже не очень-то помогает, ведь тред треду рознь. А в том же моделировании постоянно возникает желание дать каждому моделируемому объекту свой тред, это очень удобно и очень ускоряет разработку, но всегда от этого в итоге отказываются, потому что и объектов много и стек _некоторым_ из них нужен большой.
В С++ стек двигают?А вот у меня в калькуляторе вообще стека нету, так и надо?
>> программирование без отладчикаТочнее, так:
Это как, простите?
When a run-time error occurs, e.g., a division by zero, a "trap text" is opened which displays the procedureНадо было написать "без пошагового отладчика"
call chain. It is possible to use this text to navigate through data structures. Several other commands are
useful when analyzing the state of the system.
Note that debugging is done completely within BlackBox; there is no separate debugger environment.
Debugging occurs "post mortem" with respect to commands, i.e., a command produces a run-time error, is
aborted, and then debugged. However, the run-time error usually does not affect the loaded modules and
the data structures which are anchored there, nor the open documents. In other words, debugging occurs
"run-time" with respect to the application as a whole.
web-страница
web-страница
Не совсем понятно. Можно пояснить, какой отладчик пошаговый, а какой - нет. Рассмотреть, к примеру, gdb, SoftIce.
Не вполне корректно. У чистой форт-машины - да. Но таких в природе не существует, потому что нафиг не нужно. Как только у тебя появляются слова ":" и ";", которые надлежит использовать вот так ": <identifier> <definition> ;" и никак иначе - у тебя появляется синтаксис. Вот он, я его написал.
В форте _программируемый_ синтаксис. Чем он меня и поразил, собственно.
=====
Научность подхода как раз и состоит в учёте восприимчивости всех
этих << >> & | ^ ++ и --. Если первые три знака воспринимаются
прилично, смысл следует из написания, то ни | , ни ^, ни ++ или
-- этими свойствами нисколько не обладают.
=====
Ха ха три раза. Человек, не знакомый с программированием, символ "<<" не сможет воспринять никак. Человек, знакомый и с паскалем, и с С, нормально воспринимает как "i++", так и "inc(i)". Но "i++" короче, и может использоваться в сложных выражениях.
Говорить "я плохо воспринимаю символы !"№;, и не вижу как их смысл следует из написания => они плохо воспринимаемы и их смысл не следует из описания" - это не научный, это мудаческий подход. Привет!
"Расширь своё сознание."
> которые надлежит использовать вот так
: later r> r> swap >r >r ;
Это новый синтаксис?
"[" используется не только в паре с "]".
> Человек, не знакомый с программированием, символ "<<" не сможет воспринять никак.
Человек, хоть чуть знакомый с ПДД, воспримет легко.
> это не научный
Прочитай, как создают знаки для разного рода вокзалов и проч.
---
"Расширь своё сознание!"
> "Расширь своё сознание."
Форт-машина, в которой не определён некоторый минимальный набор слов, не пригодна для программирования, потому что не соответствует по мощности машине Тьюринга. Например, если в ней не определена конструкция для определения новых слов (": ... ;") - а она, к твоему сведению, определяется и не является частью языка.
> Это новый синтаксис?
Да.
> "[" используется не только в паре с "]".
Ну и что?
>> Человек, не знакомый с программированием, символ "<<" не сможет воспринять никак.
> Человек, хоть чуть знакомый с ПДД, воспримет легко.
Чувак. "<<" означает "много меньше". Ещё евреи записывают числа слева-направо (наверное поэтому с их точки зрения вот такой шифт - "<<" должен _уменьшать_ число.
> это не научный
Прочитай, как создают знаки для разного рода вокзалов и проч.
В Японии белый цвет обозначает смерть а не чистоту, как в европейской культуре. Поэтому "знаки для разного рода вокзалов" в Японии должны отличаться от европейских как минимум по цветовой гамме.
Универсальных знаков не бывает.
К любой системе, обладающей внутренней логикой, можно привыкнуть, поняв эту логику.
Оставить комментарий
VTISHKOV
Мне вот кажется, что если брать тот же ML, рассказывать про то, что такое значение на конкретных примерах, затем объяснять, что такое функция и основные средства управления порядком вычислений, а затем пускать в более-менее свободное плавание с встроенным интерпретатором, то у детей всё получится довольно быстро (что не исключает рассказов про процессоры, операционные системы, ...)