Личный кабинет

Информатика-21

Александр Чернов ( Пользователь )
(Руслан Богатырёв @ 08.09.2007, 10:25) <{POST_SNAPBACK}>
А зачем заниматься такой мелкозернистой задачей? Асинхронность надо вводить скорее не внутри процедур. И соответственно сами процедуры (и их взаимодействие) по-иному формировать. Просто многие привыкли, что вся работа в императивных языках строится через процедуры (методы) с их синхронными вызовами. В результате возникает очень жесткая схема.


Да я, в-общем, о том же и написал smile.gif
Руслан Богатырёв ( Пользователь )
(cher @ 08.09.2007, 07:43) <{POST_SNAPBACK}>
Проблема путаницы присваивания (=) и сравнения (==) существует только для тех, кто предварительно имел опыт программирования на Паскале.


Если мы проблемы Си-синтаксиса сводим преимущественно к оператору присваивания, это будет слишком упрощенный взгляд. Проблемы и в построении выражений, и в операторах, и в объявлениях сущностей, да почти везде... Кстати, проблемы и виртовском синтаксисе, и о них также можно поговорить.

Но прежде надо понять не детали, а существенную разницу в подходах: Си-синтаксис заточен на удобство синтеза исходного текста (экономит время написания); виртовский синтаксис -- на удобство анализа исходного текста (экономит время на понимание программы -- с целью проверки и модификации).

С позиции этого критерия (удобство быстрой записи) Си-синтаксис (я сюда включаю не только Си, но C++, Java, C#) ) вполне достиг своей цели (хотя есть и более изощренные в этом плане языки). Однако проблема в том, что человек должен заниматься не только и не столько синтезом, сколько анализом программы. При этом это может быть как ее автор, так и посторонний человек (для промышленного, некустарного программирования это крайне важно). Более того, сам автор, обратившийся к своей же программе спустя длительный период, сам попадает в позицию постороннего человека. И для него анализ становится много важнее синтеза. Вот тут-то и всплывают проблемы. Чем компактнее запись, чем плотнее она упаковывает конструкции, тем сложнее заниматься распаковкой (в голове). В этом и есть глубинные проблемы Си-синтаксиса.

К чему подталкивает желание экономить время при наборе текста? К неаккуратности. Причем неаккуратности даже не внешней, а смысловой. Меня не удивляет то, что работа с отладчиками и системами тестирования -- это норма для современных языков. Мир Модулы-2 мне открыл совсем иной подход. Я стал не кодировать (как при работе на Фортране, Си или даже том же классическом Паскале -- с этих языков я начинал), а конструировал. При этом меня не интересовало желание побыстрее скомпилировать что-нибудь и запустить. Зачем? Я конструировал здание (модуль, совокупность модулей) методично. Шаг за шагом. И спокойно анализировал исходный текст. Не один день. На этом не экономил. При таком подходе для меня крайне важен синтаксис, позволяющий постоянно работать в режиме анализа. Я вообще не пользовался никаким отладчиком (хотя в той же TopSpeed Modula-2 или в Logitech Modula-2 отладчики по своему уровню превосходили ведущие отладчики для других языков). Мне не нужен был и посмертный отладчик. Это качественно иной подход к программированию. И он дает результат такого качества, которого очень трудно добиться в мире языков с Си-синтаксисом.

Рассмотрим теперь частность, которая почему-то больше всего приковывает к себе внимание -- оператор присваивания ("=" в Си). Если человек немного знаком с математикой, он уверен, что знаком равенства обозначается что-то симметричное. Откуда возникла эта идея использования знака равенства в качестве оператора присваивания? Из желания сэкономить время написания программы (ее синтеза программистом). Да этот критерий -- экономии при написании -- пропитал весь Си-синтаксис (и фигурные скобки -- из той же оперы). Более того, он стимулировал к такому мышлению и программиста.

Вариант, восходящий к Алголу-60 (а виртовские языки лежат в русле этой традиции), отдает предпочтение записи ":=". Она лишена недостатка Си, но вряд ли является идеалом. Известны и другие подходы. В первом языке программирования (Plankalkul), созданного Конрадом Цузе в 1940-х годах, для присваивания использовалась запись "=>" (при этом что присваивают -- слева, а чему присваивают -- справа). Именно это вариант хотел пробить проф. Рутисхаузер в конце 1950-х годов в Алголе-60, но его предложение отклонили. Есть вариант "<-" (так записывался оператор присваивания в языке Mesa).

Позиция Вирта по вопросам ситаксиса изложена в его статье "Хорошие идеи, взгляд из Зазеркалья", в разделе "Особенности языков программирования": http://www.citforum.ru/programming/digest/wirth/
Эта статья служила основой для большинства его выступлений, с которыми он проехал по нашей стране в ходе своего Большого турне 2005 г.
Михаил Густокашин ( Пользователь )
(cher @ 08.09.2007, 07:43) <{POST_SNAPBACK}>
Проблема путаницы присваивания (=) и сравнения (==) существует только для тех, кто предварительно имел опыт программирования на Паскале.

То, что присваивание является выражением, было, как я понимаю, осознанным решением при разработке языка. В сочетании со слабой типизацией это действительно ведет к ошибкам типа if (a = 0), без сомнения, это тоже является проблемой C.

Конкретно в этом случае, я рассказываю детям, что нужно писать if (0 == a). тогда такого рода ошибки ловятся при компиляции.
Виталий Потопахин ( Пользователь )
(Михаил Густокашин @ 08.09.2007, 12:11) <{POST_SNAPBACK}>
Конкретно в этом случае, я рассказываю детям, что нужно писать if (0 == a). тогда такого рода ошибки ловятся при компиляции.


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

Кроме того хочу добавить к реплике Руслана Богатырева о отладчиках. Сам лично ни разу в жизни не пользовался и по себе заметил, что средствами логического анализа лично мне в Си - программах находить ошибки сложнее чем в Паскаль - программах, а опыт программирования на Паскалях и на Си - семействе у меня примерно одинаков. Решил проверить свои наблюдения на учениках. Сам я им никогда про отладчики не рассказываю, но некоторые узнают о них из других источников и естественно пытаются воспользоваться. Так вот однозначно, та же закономерность, работая с Си они куда как чаще порываются использовать отладчик, а Си для моих ребят это второй язык и опыта логического анализа уже достаточно.
Илья Ермаков ( Пользователь )
(cher @ 07.09.2007, 20:27) <{POST_SNAPBACK}>
Эх... Извините, Илья, но судя по Вашим репликам, я могу сделать вывод, что Ваша проблема в том, что Вы считаете себя умнее всех и слишком легко скатываетесь на такой уровень ведения дискуссии...

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

Трепаться надоело, нужно работать - народ ждёт ББ под Линукс, да и спецкурсы в новом году опять запускать надо.
С наилучшими пожеланиями...
Александр Чернов ( Пользователь )
(Руслан Богатырёв @ 08.09.2007, 11:08) <{POST_SNAPBACK}>
Позиция Вирта по вопросам ситаксиса изложена в его статье "Хорошие идеи, взгляд из Зазеркалья", в разделе "Особенности языков программирования": http://www.citforum.ru/programming/digest/wirth/


Прочитал... Мда... Особенно "Остапа понесло", конечно же, когда речь зашла о языке Си.

Уродство конструкции обычно проявляется в комбинации с другими средствами языка. На языке C программист может написать конструкцию x+++++y, загадку, а не выражение, представляющую проблему даже для сложного синтаксического анализатора.


Уж Вирт-то точно знает, что такие и даже более сложные выражения легко разбираются даже рекурсивным спуском, не говоря уж про более мощные методы синтаксического анализа. Почему он здесь пишет про "загадку", "проблему даже для сложного синт. анализатора", если это явная неправда?

Во-вторых, как ни странно, но такое выражение допустимо в языке Паскаль smile.gif Семантика его - сумма x и y.

В-третьих, это выражение _не допустимо_ в языке Си!

#include <stdio.h>

int main(void)
{
        int x = 1, y = 2, z;
        z = x+++++y;
        printf("%d\n", z);
        return 0;
}


1.c: In function 'main':
1.c:6: error: lvalue required as increment operand


Вот и коротенький абзац, в котором Вирт один раз врет и один раз ошибается.
Александр Чернов ( Пользователь )
(Илья Ермаков @ 08.09.2007, 17:29) <{POST_SNAPBACK}>
Нет, Александр, я ни в коем случае не считаю себя ни "умнее всех", ни "опытнее всех". Извините, если где-то затронул Вас лично. И "слишком легко скатываетесь", заметьте, произошло после многодневного толчения воды в этой ветке, когда каждый новый приходящий тут же начинает с уже обсуждённых вопросов...


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

Аргументация сторонников и противников оберона обращена отнюдь не к друг другу (все равно мы друг друга не переубедим), а именно к тем незнающим и сомневающимся. Я буду считать, что писал в эту тему не зря, если они будут критически относиться к посулам "вечного счастья в блекбоксе", которые вы раздаете.

(Илья Ермаков @ 08.09.2007, 17:29) <{POST_SNAPBACK}>
Ещё что касается "умнее всех", то я действительно считаю швейцарскую школу гораздо умнее американского мейнстрима. На основе конкретного опыта и наблюдений, что ряд проблем, от которых страдает последний, при использовании технологий, разработанных первой, просто не возникает. А ряд задач, которые решены либо проработаны вплотную к решению первой, вторым даже близко не затрагивались (в первую очередь из области компонентного программирования, расширяемых и переносимых систем). И грустно наблюдать, как народ ломится в открытую дверь...


При ближайшем рассмотрении оказывается, что задачи, вобщем-то, и не совсем решены... А неудобные для оберона вопросы замалчиваются и не обсуждаются.
Руслан Богатырёв ( Пользователь )
(cher @ 08.09.2007, 19:17) <{POST_SNAPBACK}>
Прочитал... Мда... Особенно "Остапа понесло", конечно же, когда речь зашла о языке Си.


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

Давайте спокойно и обстоятельно разберемся в данной ситуации. Обратите внимание на каналы возможного искажения информации. Это важно.

Итак, Вы приводите цитату из перевода статьи Вирта, на которую я дал ссылку. Перевод этот делал Сергей Дмитриевич Кузнецов, профессор кафедры системного программирования ВМиК МГУ, главный научный сотрудник Института системного программирования РАН. Ваш старший коллега по кафедре. Мне известны два варианта этого перевода (я их, правда, не сличал): на сайте Центра информационных технологий (CITForum) и в RSDN. Я привел вариант с первого сайта, "родного" для С.Д.Кузнецова. Поэтому, думаю, редакционных искажений при публикации (в отличие от журнала) там нет.
Уродство конструкции обычно проявляется в комбинации с другими средствами языка. На языке C программист может написать конструкцию x+++++y, загадку, а не выражение, представляющую проблему даже для сложного синтаксического анализатора.


Посмотрим в оригинал у Вирта. Источник: "Good Ideas, through the Looking Glass" (2005) -- http://www.europrog.ru/paper/nw2005-01e.pdf
The ugliness of a construct usually appears in combination with other language features. In C, we may write, for example, x+++++y, a riddle rather than an expression, and a challenge for a sophisticated parser!


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

Читаем Вашу реакцию:
(cher @ 08.09.2007, 19:17) <{POST_SNAPBACK}>
Уж Вирт-то точно знает, что такие и даже более сложные выражения легко разбираются даже рекурсивным спуском, не говоря уж про более мощные методы синтаксического анализа. Почему он здесь пишет про "загадку", "проблему даже для сложного синт. анализатора", если это явная неправда?


Слово "загадка" (riddle) Виртом используется в отношении человека (программиста), а не компилятора, иначе он не использовал бы союз and. Для человека это действительно загадка, и Вирт дальше по тексту привел иллюстрацию этого, задав соответствующий вопрос. Я бы перевел то предложение Вирта несколько иначе: "В Си можно написать, например, x+++++y -- скорее загадку, нежели выражение, и это проблема для изощренного синтаксического анализатора".

Обратите внимание: "скорее загадку, нежели выражение" и "проблема для" (а не "проблема даже для") гораздо точнее. Хотя суть от этого сильно не меняется, и перевод Кузнецова в данном месте нельзя признать совсем некорректным. Но лишние краски переводчика подтолкнули Вас сказать в отношени Вирта "явная неправда". Думаю, корректнее было бы (если Вы заподозрили Вирта в лукавом замалчивании реальной сложности проблемы) сказать много дипломатичнее. И оставить себе пути к отступлению (ведь прозвонить все каналы искажения на пути от автора к читателю не всегда легко).

(cher @ 08.09.2007, 19:17) <{POST_SNAPBACK}>
Во-вторых, как ни странно, но такое выражение допустимо в языке Паскаль smile.gif Семантика его - сумма x и y.


Не могли бы Вы уточнить, в отношении какого Паскаля была Ваша реплика? Я посмотрел каноническое описание классического Паскаля Вирта и не нашел там подтверждения Ваших слов. Возможно, был невнимателен. Если не трудно, приведите, пожалуйста, ссылку и укажите формальные конструкции синтаксиса соответствующего описания, которые подтверждают Ваши слова. Вот ссылка на каноническое описание Паскаля: Niklaus Wirth "The Programming Language Pascal" (1972) -- http://www.europrog.ru/book/panw1972e.pdf

(cher @ 08.09.2007, 19:17) <{POST_SNAPBACK}>
В-третьих, это выражение _не допустимо_ в языке Си!


В качестве подтверждения своего утверждения Вы приводите исходный текст и сообщение какого-то компилятора (кстати, какого?). У меня есть определенные сомнения в отношении того, что тут вновь возник канал искажения информации, который Вы могли упустить из вида. Как Вы понимаете, в подобной дискуссии ссылки на любую реализацию языка (даже на каноническую, сделанную автором языка) не совсем корректны. Нужно смотреть описание языка. Именно оно является основой разрешения подобных сомнений.

Выражение x+++++y должно быть допустимо в языке, ибо это x++ + ++y. Сумма двух допустимых операндов. Я посмотрел три описания языка Си и не нашел там подтверждения Ваших слов. Как раз-таки лишний раз убедился в справедливости слов Вирта. Хотя мог быть невнимателен, так что посмотрите сами и дайте точную ссылку на соотв. "норму" в "законе".

1. Dennis Ritchie "C Reference Manual" (1975) -- http://www.europrog.ru/book/cmdr1975e.pdf
2. B.Kernighan, D.Ritchie “C Programming Language” – Second Edition, 1988 -= http://www.europrog.ru/paper/kr_c.pdf
3. "C Language. ISO/IEC 9899:1999" -- http://www.europrog.ru/doc/doc-iso1999-009899e.pdf

Собственно, это авторское описание, ANSI C, а также ISO-стандарт языка.

(cher @ 08.09.2007, 19:17) <{POST_SNAPBACK}>
Вот и коротенький абзац, в котором Вирт один раз врет и один раз ошибается.


А теперь давайте спокойно разберемся, врет ли Вирт, ошибается, говорит ли явную неправду...
Руслан Богатырёв ( Пользователь )
(cher @ 08.09.2007, 20:25) <{POST_SNAPBACK}>
Аргументация сторонников и противников оберона обращена отнюдь не к друг другу (все равно мы друг друга не переубедим), а именно к тем незнающим и сомневающимся.


Простите, что вмешиваюсь, но я являюсь сторонником Оберона и свою аргументацию направляю не "зрителям" (хотя и им тоже), а конкретному оппоненту. У меня нет желания доказать. Есть желание разобраться в сути, что и стараюсь делать.

Что касается "противников", то не могу понять, почему у языка могут быть противники. Любой язык программирования имеет право на существование. И у него могут быть сторонники, которым он нравится (полезен). Противники могут быть в отношении конкретной сферы применения языка (тут, как я понимаю, речь идет о сфере среднего и высшего образования). Честно говоря, подавляющее большинство претензий адресовалось не к языку Оберон, а к сторонним факторам -- его реализациям, его сообществу, способам его продвижения. В чем тут виноват Оберон? В чем его неуместность в сфере среднего и высшего образования?

(cher @ 08.09.2007, 20:25) <{POST_SNAPBACK}>
При ближайшем рассмотрении оказывается, что задачи, вобщем-то, и не совсем решены... А неудобные для оберона вопросы замалчиваются и не обсуждаются.


Проблемы Оберонов не один год подробнейшим образом разбираются на специализированных форумах: на OberonCore и в "Королевстве Delphi". Там этим вопросам посвящено несколько тысяч сообщений. Но если у Вас есть конкретные вопросы (по языку применительно к образованию, а не к самому проекту "Информатика-21") -- задавайте. По возможности постараюсь на них ответить. Просьба только не выходить за рамки тематики данного форума.
Александр Чернов ( Пользователь )
Ваш прием - замыливать суть в потоке иррелевантной информации smile.gif
Например, спасибо за информацию об авторе перевода и занимаемой им должности... Для меня было очень интересно узнать, кто такой С. Д. Кузнецов smile.gif

(Руслан Богатырёв @ 08.09.2007, 22:08) <{POST_SNAPBACK}>
Читаем Вашу реакцию:
Слово "загадка" (riddle) Виртом используется в отношении человека (программиста), а не компилятора, иначе он не использовал бы союз and. Для человека это действительно загадка, и Вирт дальше по тексту привел иллюстрацию этого, задав соответствующий вопрос. Я бы перевел то предложение Вирта несколько иначе: "В Си можно написать, например, x+++++y -- скорее загадку, нежели выражение, и это проблема для изощренного синтаксического анализатора".


Отлично, то есть в Вашей версии перевода Вирт утверждает, что это выражение - проблема для изощренного синтаксического анализатора. Такие "изощренные" синтаксические анализаторы пишут студенты 2 курса. Студенты третьего курса, взяв какой-нибудь antlr, напишут такой "изощренный" синтаксический анализатор примерно за день. Понимает ли это Вирт? Как автор книги по конструированию компиляторов не может не понимать. Почему он утверждает что это проблема?

(Руслан Богатырёв @ 08.09.2007, 22:08) <{POST_SNAPBACK}>
Не могли бы Вы уточнить, в отношении какого Паскаля была Ваша реплика? Я посмотрел каноническое описание классического Паскаля Вирта и не нашел там подтверждения Ваших слов. Возможно, был невнимателен.


Действительно, я перепроверил, в стандарте Паскаля такая ситуация невозможна. Возражение снимается.

(Руслан Богатырёв @ 08.09.2007, 22:08) <{POST_SNAPBACK}>
Выражение x+++++y должно быть допустимо в языке, ибо это x++ + ++y.


Нет, это x++ ++ + y. При лексическом анализе выделяется лексема максимальной длины.
ISO/IEC 9899:1999 6.4 (Lexical elements), EXAMPLE 2.

(Руслан Богатырёв @ 08.09.2007, 22:08) <{POST_SNAPBACK}>
А теперь давайте спокойно разберемся, врет ли Вирт, ошибается, говорит ли явную неправду...


Соврал ли Вирт про "изощренный транслятор"? Может и не соврал, но передернул совершенно точно. Почему он это сделал, лично мне достаточно понятно, но обсуждать это я не буду.
Ошибся в примере? Да, ошибся. Соответственно весь дальнейший полет его мысли про новую алгебру и все такое прочее подвисает в воздухе.

footer logo © Образ–Центр, 2020. 12+