tag:blogger.com,1999:blog-8596733192274108952.post5719143255948794420..comments2024-03-12T06:00:18.305+02:00Comments on Programming stuff: Контракты и удаленный кодSergey Teplyakovhttp://www.blogger.com/profile/14300835272589262297noreply@blogger.comBlogger21125tag:blogger.com,1999:blog-8596733192274108952.post-24531106869562470012015-12-28T13:51:06.296+02:002015-12-28T13:51:06.296+02:00Насколько я знаю, сейчас Roslyn вообще расширения ...Насколько я знаю, сейчас Roslyn вообще расширения компилятора не поддерживает, т.е. даже C# в C# переписать не выйдет. Если нет - поправьте меня, буду очень рад увидеть обратное.<br />ИМХО, единственый шанс для code contracts, это даже не включение в язык контактов, а создание расширения языка и компилятора, после чего уже можно будет все детали продумывать, типа ситуации с async, про которую вы говорили.Anonymoushttps://www.blogger.com/profile/15250598780136090440noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-35641643644778099012015-12-15T00:18:19.746+02:002015-12-15T00:18:19.746+02:00Ага. Прокомментировал. К сожажалению, вот эта фраз...Ага. Прокомментировал. К сожажалению, вот эта фраза очень четко определяет качество кода Code Contracts:<br /><br />It is a medium-sized project (~ 4000 source files), which is actively developing: <b>it contains quite a number of code fragments that are not finished and sometimes incorrectly written.</b> This stage is perfect for implementing a static code analyzer.Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-30285239242162283702015-12-14T20:39:47.856+02:002015-12-14T20:39:47.856+02:00Сергей, тут http://habrahabr.ru/company/pvs-studio...Сергей, тут http://habrahabr.ru/company/pvs-studio/blog/273111 обсуждают CodeContracts. Прокомментируешь?Anonymoushttps://www.blogger.com/profile/15522521123295904583noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-88975895126594734722015-11-16T03:49:20.074+02:002015-11-16T03:49:20.074+02:00Игорь, с переписыванием на базе Розлина есть неско...Игорь, с переписыванием на базе Розлина есть несколько открытых проблем/вопросов.<br /><br />1. Розлин не предоставляет точку расширения перед эмиттингом IL-а. Т.е. придется городить огород - переписывать C# в C#, а потом что-то хитрое делать, чтобы сгенерированный C# не мешал отладке. Как это сделать нормально - не ясно.<br /><br />2. Даже если решить первый вопрос, остается несколько вопросов. Например, поведение контрактов для конструкторов наследников - проверка должна выполняться до вызова конструкторов базового класса. Или, в случае с async методами и блоками итераторов. Там простого синтаксического преобразования будет недостаточно, поскольку важно выбрасывать нарушение контракта как можно раньше. Сейчас ccrewrite делает разные трюки по вытаскиванию контрактов из сгенерированного конечного автомата в исходный метод. <br /><br />Ну и последнее, пока никто не хочет вкладывать в это дело существенных средств, которые, явно для этого потребуются...Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-78739440278853686722015-11-15T23:44:38.376+02:002015-11-15T23:44:38.376+02:00А есть хотя бы обсуждение, что CC надо бы переписа...А есть хотя бы обсуждение, что CC надо бы переписать с нуля? С использованием Roslyn теперь уже. Я так понимаю, что обсуждение встраивания контрактов в язык, есть, но на очень базовом уровне. https://github.com/dotnet/roslyn/issues/119<br />Я бы предпочел использовать тулу, которая перестраивает C# код, а не IL.Anonymoushttps://www.blogger.com/profile/05202812632999806619noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-69600233074717226082015-11-09T19:12:22.466+02:002015-11-09T19:12:22.466+02:00Ну, там история у проекта довольно интересная.
Пос...Ну, там история у проекта довольно интересная.<br />Поскольку он начинался как ресерч проект, то других вариантов просто не было. Обычно после того, как было доказано, что идея стоящая, все текущее творение выбрасывается и тула переписывается с нуля. Но, к сожалению, второго (переписывания) так и не произошло((Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-88660345940129292232015-11-09T19:10:55.344+02:002015-11-09T19:10:55.344+02:00А мне даже возразить нечего:) Ни по поводу MikesAr...А мне даже возразить нечего:) Ни по поводу MikesArchitecture, ни по поводу переписывания... :((<br /><br />Ну, с хорошим дизайном и модульностью эту адскую сложность можно было бы еще держать под контролем, но в текущем варианте это сделать довольно сложно...Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-67455031222015851902015-11-09T19:09:32.927+02:002015-11-09T19:09:32.927+02:00Да, этот вопрос очень похож на тот, что поднял Анд...Да, этот вопрос очень похож на тот, что поднял Андрей в предыдущем комментарии. Нужно будет попробовать что-то такое сделать.Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-86231636405202698192015-11-09T19:09:00.830+02:002015-11-09T19:09:00.830+02:00Андрей, очень дельный совет, спасибо.
Я только не...Андрей, очень дельный совет, спасибо.<br /><br />Я только не уверен, что в природе существует разумный способ понять, какой метод Pure, а какой - нет. Но, в любом случае, даже с текущими знаниями о pure/impure это будет полезно.<br /><br />Я бы сказал, что можно даже усилить это прваило и выдавать предупреждение каждый раз, когда в контракте используется non-pure метод, не зависимо от того, удаляется этот вызов или нет (ведь раз этот вызов есть, то он МОЖЕТ быть удален).Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-88724482986750370522015-11-09T19:06:23.562+02:002015-11-09T19:06:23.562+02:00Этот вариант кажется вполне разумным. тут нужно оп...Этот вариант кажется вполне разумным. тут нужно определиться с дефолтом. Я склоняюсь к тому, что новый вариант должен быть дефолтом, а старый в опциях можно будет вернуть.Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-28975277280077759322015-11-09T19:05:20.669+02:002015-11-09T19:05:20.669+02:00В моем проекте есть пара мест с таким поведением, ...В моем проекте есть пара мест с таким поведением, но их реально пара. Так что я склоняюсь к первому варианту, поскольку, как ты правильно заметил, есть кучас способов удалить дорогостоящий метод, но понять, что твой код перестал рабоать из-за удаления нужного - очень сложно.Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-60589090502106855612015-11-09T19:04:21.813+02:002015-11-09T19:04:21.813+02:00@Анатолий: да, сжигают:)) Но как теперь объяснить ...@Анатолий: да, сжигают:)) Но как теперь объяснить семантику Contract.Assert-а? Если код удаляется, то хорошо. Но он может удалить не то, что нужно и тогда вполне валидная программа станет работать неверно. И что делать - хз:(<br /><br />@Disparity: кажется в этом случае CQS не поможет. Или я не вижу, как он может помочь.Sergey Teplyakovhttps://www.blogger.com/profile/14300835272589262297noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-51136112470073350162015-11-09T18:19:32.090+02:002015-11-09T18:19:32.090+02:00Благодоря этому "класссному" архетиктурн...Благодоря этому "класссному" архетиктурному решению - офигенная библиотека превратилась в шлак, который никто не использует.<br />Большенству непонятно как её настраивать, у кого-то проблемы с подписанными сборками, всех бесит что это НЕ встроенно в студию а надо доставлять, допиливать, донастраивать.<br />А такая классная тема была!Anonymoushttps://www.blogger.com/profile/03999939535124861861noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-83785924982798047112015-11-09T17:16:47.157+02:002015-11-09T17:16:47.157+02:00Выстрелить в ногу можно на любом языке; при коррек...Выстрелить в ногу можно на любом языке; при корректном разделении на Command/Query в ассертах никогда не должно быть вызовов, меняющих состояние.Disparityhttps://www.blogger.com/profile/09846288417575827445noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-44510360091696428492015-11-09T15:31:04.099+02:002015-11-09T15:31:04.099+02:00Переписывание IL-кода может и выглядеть вполне лог...Переписывание IL-кода может и выглядеть вполне логичным решением, но позволить некой софтине внутри которой есть метод MikesArchitecture переписывать IL - ну, скажем так, наш тимлид первым делом спросил переписывает ли оно IL, и, узнав, что переписывает навсегда зарубил контракты в такой реализации. И это можно понять, потому что просто страшно.Anonymoushttps://www.blogger.com/profile/16283148488172554093noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-30043554727642218022015-11-09T13:09:02.772+02:002015-11-09T13:09:02.772+02:00Есть вариант оставить обе стратегии и выбирать из ...Есть вариант оставить обе стратегии и выбирать из них. При этом ОГРОМНЫМИ буквами писать, что второй вариант - на свой риск и страх. Может кто-то хочет выгадать что-то по производительности? Но вообще - первый вариант - 99%. И еще, надо чтобы выбрать второй вариант - было как-то ОЧЕНЬ сложно :). Чтобы случайно не получилось...eugenehttps://www.blogger.com/profile/00368111825500921630noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-71632771350842433592015-11-09T10:47:23.773+02:002015-11-09T10:47:23.773+02:00Нет ли возможности определить, есть ли в выражении...Нет ли возможности определить, есть ли в выражении побочные эффекты?<br /><br />Напр. отсутствие аттрибута [Pure] в методе HastSet.Add, должно подсказывать, что побочные эффекты все же могут быть.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-22430346785428645982015-11-09T10:43:27.766+02:002015-11-09T10:43:27.766+02:00Как пояснил Сергей, assert с побочным эффектом мож...Как пояснил Сергей, assert с побочным эффектом может возникнуть как результат оптимизации компилятора. В том и проблема. Компилятор сжигать на костре не хочется.Anonymoushttps://www.blogger.com/profile/03302586833773610231noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-29393187310717091412015-11-09T10:41:51.780+02:002015-11-09T10:41:51.780+02:00А нельзя выдавать ворнинг если ccrewrite удаляет п...А нельзя выдавать ворнинг если ccrewrite удаляет потенциально важный вызов (например, не-pure метод)? В качестве компромиссного фикса в ответ на такой ворнинг можно было бы предусмотреть какую-то дополнительную конструкцию (или параметр метода, такого как Assert), указывающую, что следующий кусок надо оставить. Самая близкая аналогия, которая приходит на ум - GC.KeepAlive - метод, который ничего не делает, но заставляет думать JIT, что ссылка нужна до указанного момента.Anonymoushttps://www.blogger.com/profile/03302586833773610231noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-44000161477932933532015-11-09T10:20:20.163+02:002015-11-09T10:20:20.163+02:00Первый вариант конечно лучше, есть куча других спо...Первый вариант конечно лучше, есть куча других способов удалить вызовы дорогостоящих методов.<br />Also. Вот сколько я имел дело с code contracts, ни разу у меня не было чего нить типа<br /><br />Contract.Assert(CheckSomeAssumptionThatHasNoSideEffectsButTakesForever)<br /><br />не могу аргументировано подтвердить, но мой скромный опыт подсказывает, что при нормальном дизайне в пред/постусловиях нет дорогостоящх вызововAnonymoushttps://www.blogger.com/profile/18135346862806747795noreply@blogger.comtag:blogger.com,1999:blog-8596733192274108952.post-9858054432451262512015-11-09T10:11:59.292+02:002015-11-09T10:11:59.292+02:00работу Debug.Assert очень просто объяснить "н...работу Debug.Assert очень просто объяснить "новому" разработчику...<br />А за assert'ы с побочными эффектами разве на костре не сжигают?Anonymoushttps://www.blogger.com/profile/08487458460734515606noreply@blogger.com