Выбор языка програмирования для задачи.

uaha1979

Задача:
Есть устройство, которое соединяется с ПК через n портов, через одни порты мы получаем инфу от устройства - состояние среды (ветренно, влажно, координаты, итд через другие порты - управляем устройством.
Когда мы получили инфу, мы рассчитываем какой move сделать (тут матстат, тервер, и прочая математика). Далее смотрим, успешен ли move был (стоит ли наше устройство или уже перевернулось). Если move успешен, то мы записываем в базу, что при таких условиях такой-то move успешен, далее эта база будет помогать рассчитывать следующий move.
Все это будет крутиться на linux.
Как связать устройство с ПК, я напишу на "С" - создам n файлов, в которые можно записывать управляющий код или с которых можно считывать инфу.
На каком языке _лучше и проще_ реализовать принятие решений?
Еще вопрос: существен ли дистрибутив linux или нет?

kill-still

Еще вопрос: существен ли дистрибутив linux или нет?
При отсутствии гуёв - без разницы. И если иксы, то скорее всего как раз си было бы логично выбрать + библиотеки для бд и ком порта, чтобы меньше мараться.
З.Ы. ты уверен, что при таких познаниях в программировании у тебя выйдет что-то стоящее? //просто спросил, ничего личного

elenangel

пиши на питоне

kataich

Все это будет крутиться на linux.
Как связать устройство с ПК, я напишу на "С" - создам n файлов, в которые можно записывать управляющий код или с которых можно считывать инфу.
Не очень понял, ты драйвер для устройства тоже пишешь? Или только userspace?
Просто, наверное, передавать управляющие команды через файл не очень хорошо, можно, например, подумать в сторону символьных устройств и соответствующих ioctl.

yroslavasako

На каком языке _лучше и проще_ реализовать принятие решений?
ну посмотри на AI challenge, на чём там пишут. Если у тебя встроенное устройство со слабым процессором и много дифуров - то лучше ограничиться быстрыми языками: си, плюсы, CL, java. Иначе фантазия может тебя завести ещё дальше, ко всяким скриптам и тому подобному.

chriselwart

я бы общение с ком-портом и все остальное тоже на нем написал бы :)

val63


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

uaha1979

Да, драйвер я сам пишу. Подумаю над символьными устройствами. =)
Спасибо всем отписавшимся =)

elenangel

я ж и говорю - питон. подо все можно найти либу. в особо геморойных случаях он вроде-бы легко сочетается с C/C++

VitMix

Тут важный вопрос: цена ошибки. Есть ли риск в случае ошибки потерять ценный аппарат?

chriselwart

Ну как бы вставки из сишного кода в питоне никто не отменял. Вроде как настоящие пацаны так скорость выполнения на высоких нагрузках в разы поднимают.

val63


я ж и говорю - питон. подо все можно найти либу. в особо геморойных случаях он вроде-бы легко сочетается с C/C++
То же самое верно и почти для всего остального, собственно. Все упирается в личные предпочтения

chriselwart

что то я пока в треде ни одного фаната VBA не заметил :grin:

uaha1979

Есть ли риск в случае ошибки потерять ценный аппарат?
Нет.
А С# не вариант?

chriselwart

А С# не вариант?
ага, и вдоволь потрахаться с недомоно

ppplva

в особо геморойных случаях он вроде-бы легко сочетается с C/C++
С другой стороны, сочетание с C/C++ может оказаться тем самым особо геморройным случаем. Дуализм-с.
Я бы прикинул требования к скорости обработки данных и задержке, и, может быть, сразу начал бы на C++. Ходят слухи, что если грамотно заюзать фишки из C++11, получается фактически тот же питон, только быстрый. Сам не пробовал.

okis

Сам не пробовал.
на питоне писать быстрее. кроме, разве что, случая, если ты и так пишешь на C++ все время.

val63


ага, и вдоволь потрахаться с недомоно
А ему чо, WPF или ASP.NET надо?
Впрочем, под линупс никакого удовольствия юзать, конечно.

chriselwart

Ну какой смысл под линуксом юзать мелкософтовский фактически проприетарный язык, когда сть стопицот адекватных альтернатив.
Я не буду спорить, что шарп хороший язык (сам я его не знаю, но прислушиваюсь к мнению многих знакомых разработчиков но он создан для своей среды и своих задач.

bleyman

Пиши на Петоне, действительно.
pyserial для работы с ком-портами. Работает, я проверял.
numpy и прочее для математики. Питон в этом смысле дичайше продвинут, его очень много людей используют для вычислительно-тяжёлых задач. Никакого парадокса в этом невозможно усмотреть, ибо если твой алгоритм не векторизирован, то он будет сосать по любому, а если векторизирован, то совершенно неважно на каком языке ты его выражаешь — Mathematica, Python, или C++, всё упирается в производительность низкоуровневой библиотеки (и удобство её интерфейса и numpy/scipy/sage очень хороши в этом смысле.

chriselwart

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

6yrop

сть стопицот адекватных альтернатив.
назови альтернативу со статической типизацией и с IDE уровня ReSharper?

kill-still

а под какой популярный язык нельзя найти подо всё либу? :grin:

kill-still

А как же Флося? :ooo:

elenangel

под дельфи найди либу для директ икс 9

kill-still

Зачем тебе либа под либу? Да и делфи на этом форуме не принято называть популярным, а наоборот - гнобить и хейтить. :)

val63


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

6yrop

я не понял, минусов понаставили, а на вопрос никто не ответил

Maurog

я не понял, минусов понаставили, аа на вопрос никто не ответил
статическая типизация и "IDE уровня ReSharper" далеко не решающие факторы при выборе языка под задачу, поэтому никто на этот вопрос и не хочет давать ответ имхо

val63

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

elenangel

ок, либа есть. биндинги под дельфю найди для нее.

kill-still

Ты настолько безрукий что ли, что сам из TLB не можешь pas сгенерить?

elenangel

а ты пробовал перед тем как говорить сделать это конкретно для директ иксовских dll?

kill-still

ну а я что ли виноват, что они мидл не блюдут?
[21133965]{tlib140.bpl } tlberror.Error (Line 124, "tlberror.pas" + 1) + $E
[211339E3]{tlib140.bpl } tlberror.OleError (Line 143, "tlberror.pas" + 4) + $3
[21137553]{tlib140.bpl } TlbUtils.LoadTypeLibrary (Line 404, "TlbUtils.pas" + 11) + $2
[21137641]{tlib140.bpl } TlbUtils.LoadAndRegisterTypeLibrary (Line 427, "TlbUtils.pas" + 1) + $7
[5110D27A]{comcore140.bpl} ImportTLB.TTypeLibSelectionManager.OnAdd (Line 188, "ImportTLB.pas" + 9) + $E
З.Ы. глянул в дркб, есть как и заголовки, так и библиотеки-оболочки для заголовков:
Eric Unger's JEDI DirectX
DelphiX author Hiroyuki Hori
с ними тоже какой-то подвох?

elenangel

Eric Unger's JEDI DirectX
насчет этого не знаю погуглил - это тоже под делфи 5 и дх7, древность короче
DelphiX author Hiroyuki Hori
а это под Delphi 3,4,5 и для директ икса 7, что то типа того

6yrop

статическая типизация и "IDE уровня ReSharper" далеко не решающие факторы при выборе языка под задачу
для многих задач статическая типизация и статический анализ кода крайне важная вещь

6yrop

труъ-линуксоид
тк речь про религиозных фанатиков, тогда понятно

doublemother

для многих задач статическая типизация и статический анализ кода крайне важная вещь
Ну тогда тем более окамл или хотя бы F#, а никак не C# :p

6yrop

окамл или хотя бы F#,
для них есть среды с полноценной:
1. навигацией по коду,
2. авторефакторингом,
3. интелесенсом,
? (VS естественно такой не является)
Если нет, то программист должен это проделывать в голове, а это неэффективное использование головы программиста, поскольку можно поручить эту работу машине.

Dimon89

назови альтернативу со статической типизацией и с IDE уровня ReSharper?
Eclipse в качестве IDE для Java/C++ - чем не альтернатива?

chriselwart

Ну вот кстати в который уже раз укажу всю линейку продуктов джетбрейнса. У питона может типизации и нет статической, зато есть пишарм :p

doublemother

? (VS естественно такой не является)
Обоснуйте.
intellisense, как вы его называете, студия умеет. Что такое навигация по коду, и зачем её выделять в отдельный пункт требований, страшно даже представить. Подозреваю, что это переход к определениям классов, методов и т.п.
Авторефакторинг — это что-то, что википедия предлагает исправить на «автотракторного», но, судя из названия, это что-то такое, за что программиста надо бить ссаной тряпкой по лицу. Лично я не хотел бы, чтобы редактор по-тихому где-то менял мой код, но если говорить о вечно приводимом любителями рефакторинга примере: «вынести кусок кода в отдельную функцию», то сама идеология кодирования на ml-языках подразумевает сильное дробление кода на нано-функции. Если потребуется уже и так раздробленный метод раздробить ещё чуть-чуть, но руками, я готов на это пойти, в обмен на то, что код полностью статически анализируется компилятором при сборке (не знаю, не сломали ли это в F#, в окамле всё это есть). И анализируется заведомо качественнее, чем эти ваши до-диезы.
Я раньше думал, что у тебя майкрософт головного мозга, но теперь вижу, что нет, сишарп МНУ.

elenangel

Авторефакторинг
вообще-то это когда, к примеру, переименовываешь класс и он автоматически переименовывается по всему проекту. от автозамены отличается учетом контекста и синтаксиса.

doublemother

ахвотоночо. Ну про это хз. Учитывая, что для c# в студии это вроде как было искаропке, наверное, и для f# запилили.
Мне, впрочем, редко в своей жизни приходилось переименовывать классы.

zorin29

IntelliSense умеет, но у решарпера подстановка лучше.
Например, тебе надо поменять свойство объекта, которое называется LastUpdateTimestamp. Но ты в упор не помнишь название, а знаешь, что тебе нужен timestamp.
Vanilla VS: идешь к описанию объекта в соответствующем файле (или достаешь из метаданных) и ищешь нужное свойство.
Resharper VS: набираешь Times... и тебе предлагается нужное свойство (ну и еще UpdateTimes, CreateTimestamp и т.д.)
А вот пример авторефакторинга, который так тебе противен. Разработчик плохо знает английский, и в его коде тип называется не Strategy, а Stratagy. Ты хочешь переименовать этот тип, затронув при этом все 300 файлов, где он используется, все комментарии, а также все его переменные stratagy, которые он завел. Решарпер позволяет это сделать за время, равное времени обработки всех файлов плюс эпсилон.
Что такое навигация по коду? Вот задача: ты используешь метод интерфейса IRepository и хочешь перейти к XML-реализации этого интерфейса. В vanilla студии тебе придется делать Find All References этого интерфейса и отсеивать все классы, его реализующие от других результатов поиска, которых тысячи. Решарпер же для этого предусматривает одну кнопку "перейти к реализациям интерфейса", по нажатию которой ты видишь список всех классов, реализующих данный интерфейс.

zorin29

P.S. не говоря уже о том, что решарпер отслеживает использование IDisposable без Dispose, предупреждает об access to modified closure и possible null reference exception, а также, наоборот, о лишних проверках на null объектов, которые не могут быть null.

doublemother

Во, это уже по существу. Про большую часть перечисленного в студии и f#, увы, сказать ничего не могу.
Расширенный автокомплит есть в виме, но шурик никогда не признает вим за нормальный редактор :)
Про авторефакторинг идею понял, хотя согласись, что:
1. когда разработчик бесконтрольно наплодил вызовов с ошибкой на 300 файлов, а его за это время никто не стукнул линейкой по пальцам — это странно;
2. Для данного случая достаточно просто заменить вообще все вхождения stratagy в проекте, потому что stratagy нам не нужен, а случай, когда и мы в проекте опечатались, и есть какое-то внешнее апи, которое не исправить, и в котором тоже есть stratagy — он фантастический :)
Навигация к определению в виме тоже есть (не для сишарпа, понятно, хотя может и для него уже запилили но см. отсылку к шурику.
А то что всё это есть в емаксе, да ещё и с искусственным интеллектом (правда самому печатать нельзя, надо окошко с вимом открыть я вообще уверен на 146%.

val63


пишарм
До решарпера не дотягивает кстати

salamander

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

Dimon89

предупреждает об access to modified closure и possible null reference exception, а также, наоборот, о лишних проверках на null объектов, которые не могут быть null.
В Эклипсе это (и ещё тысяча проблем) решается плагином FindBugs.

zorin29

Решарпер реально экономит время на монотонные задачи, это я говорю как человек, поработавший два года в VS без решарпера и полгода в VS с решарпером. К удобствам привыкаешь. Но я не говорю, что без него никак.
А что касается великолепного vim-а, то я с ним работал мало и с уверенностью утверждать не могу. Однако я помню, что тогда половину времени за компом у меня занимало знакомство с vim-ом, а вторую половину - программирование. Learning Curve решарпера намного короче.
Ну и да, пока в проекте еще нет мегабайта исходников, все равно, в чем его писать.

zorin29

Ну бывают случаи. Раньше это было сообщением об ошибке и называлось ErrorMessage, а теперь мы это поле используем для любого сообщения и это называется UserMessage. Это всего лишь один пример, когда есть надобность в глобальном переименовании.
А когда у тебя есть удобный механизм рефакторинга, то позволяешь себе такие вольности, которые раньше не позволял.
Раньше я не шел на некоторые косметические улучшения кода, т.к. подсознательно представлял себе, сколько монотонной работы оно влечет, и придумывал отмазку. А теперь - иду, т.к. монотонной работы нет. Итог - мой код мне нравится больше, спасибо решарперу за это
А то что всё это есть в емаксе, да ещё и с искусственным интеллектом (правда самому печатать нельзя, надо окошко с вимом открыть я вообще уверен на 146%.
Ну мы с тобой тут в разных положениях, согласись. Я говорю с позиции 2.5-летнего опыта, а ты - уверен, но сам не пробовал. Я тебе верю, конечно, но осадок остался :)
Это как с Selenium-ом. До сегодняшнего дня я думал, что вот он, удобный framework для тестирования веб-интерфейса. А сегодня попробовал, и внезапно выяснил, что в него встроен только файрфокс, что он открывает реальное ОКНО файрфокса, в котором реально открывает страницу, и что для запуска IE или Chrome-а через Selenium требуются определенные танцы с бубном.
Не то чтобы это меня отвратило от Селениума совсем, но это неожиданные и неприятные особенности.

pilot

Это как с Selenium-ом. До сегодняшнего дня я думал, что вот он, удобный framework для тестирования веб-интерфейса. А сегодня попробовал, и внезапно выяснил, что в него встроен только файрфокс, что он открывает реальное ОКНО файрфокса, в котором реально открывает страницу, и что для запуска IE или Chrome-а через Selenium требуются определенные танцы с бубном.
breaking news!

doublemother

Ну мы с тобой тут в разных положениях, согласись. Я говорю с позиции 2.5-летнего опыта, а ты - уверен, но сам не пробовал. Я тебе верю, конечно, но осадок остался :)
Не, мы с тобой в равных положениях. Я не спорю, что для C# студия с решарпером — это мегакруто и кончить можно, а F# ни ты, ни я не использовали.
Меня больше умиляет то, что ни я, ни шурик не кодили на F#. Только я как минимум открыл MSDN и увидел, что intellisense для f# в студии есть, потом открыл поиск и обнаружил, что в емаксе даже запилили какую-то отдельную fsharp-mode (к слову, я емаксом вообще никогда не пользовался). В виме я работал с окамлом и знаю возможности вима и уровень поддержки окамла в нём.
В общем, на самом деле основная идея моего поста была не в том, что F# лучше, чем что бы то ни было подходит под задачу (в конце концов ТС, я так понимаю, пишет под линуксы а в том, что шурик — долбоёб :) Он кодит на C#, не умеет ни другие языки, ни IDE, но загодя для разработки математического софта требует не качество и сопровождаемость кода, а какие-то совершенно ненужные плюшки в IDE, и язык выбирает исключительно по принципу "есть IDE или нет".
P.s. Селениум — это ужасно, да. По 40 минут на набор тестов и кривое апи меня страшно вымораживали.

zorin29

Я не спорю, что для C# студия с решарпером — это мегакруто и кончить можно
А-а, ну так бы и сказал сразу :) А то твой исходный пост, из-за которого я и влез в топик, говорит практически обратное.
Наверно, ты имел в виду не "докажите мне, что решарпер не говно", а "докажите мне, что для данной задачи нужен IDE". Тогда я зря влез :)
P.s. Селениум — это ужасно, да. По 40 минут на набор тестов и кривое апи меня страшно вымораживали.
То есть меня ждут и другие неприятные открытия :) А может, сразу в топку селениум, и есть альтернативы?

val63


Тогда я зря влез :)
Ты вообще кормишь троллей:)

zorin29

У меня, вероятно, другое определение троллей, и я тут пока вижу только одного тролля, это , чье сообщение не несет смысловой нагрузки вообще, но как бы намекает, что собеседник туп.
Ну еще Shurick, но он ИМХО добросовестно заблуждается.

pilot

сообщение не несет смысловой нагрузки вообще, но как бы намекает, что собеседник туп.
Там написано: "многоуважаемый , предложите вариант лучше".

pilot

Ну еще Shurick, но он ИМХО добросовестно заблуждается.
Он это делает в каждом первом треде.

hiper-hoper

к многоуважаемому это тоже относится :smirk:

pilot

к многоуважаемому это тоже относится :smirk:
Ну вот, опять бестолковый хомячок :(
Давай ссылки ищи.

hiper-hoper

на что? на то что многоуважаемый , в каждом первом треде намекает своим собеседникам, что они тупы? так откройте же список своих сообщений да возрадуйтесь.

pilot

многоуважаемый , в каждом первом треде намекает своим собеседникам, что они тупы?
Точно! Сравни с "добросовестно заблуждается" и устыдись! :grin:

6yrop

Ну еще Shurick, но он ИМХО добросовестно заблуждается.
собственно я влез в этот тред, поскольку было свежо впечатление о вчерашнем прочтении статей Hejlsberg-а. Вчера случайно набрел вот на эту парочку статей: ref1, ref2. Во время прочтения несколько раз отмечал про себя “о это полностью совпадает с моим виденьем”. Ребят, а вы как дети, точнее вчерашние студенты :).

doublemother

собственно я влез в этот тред, поскольку было свежо впечатление о вчерашнем прочтении статей Hejlsberg-а.
А я думал, вы с No в каждый тред приходите пропагандировать каждый свой любимый язык :) Я ошибся? OH SHI~~~

6yrop

А я думал, вы с No в каждый тред приходите пропагандировать каждый свой любимый язык Я ошибся? OH SHI~~~
Не, я с другой целью: я ищу замену сишарпа на более удобный язык, поскольку есть ощущение, что такой язык возможен (может быть Kotlin, но надежда не очень большая). Ну и вбрасываю в надежде услышать что-либо убедительное, а тут предлагают текстовую замену :confused: .
А я так понимаю, вообще, не программер, а что-то типа обычного манагера-пастуха обезьянок.

FRider

я ищу замену сишарпа на более удобный язык, поскольку есть ощущение, что такой язык возможен
и __но__ тебе его может подсказать, да ты непослушаешь :grin:
PS кто использовал пишарм от жетбрейнс - скажите, там есть уровень решарпера?

agaaaa

PS кто использовал пишарм от жетбрейнс - скажите, там есть уровень решарпера?
Если он по уровню похож на WebStorm для JS, то нет.
Вообще, у меня сложилось впечатление, что качество их продуктов пропорционально стоимости :)

Alena_08_11

PS кто использовал пишарм от жетбрейнс - скажите, там есть уровень решарпера?
Ну в питоне все таки динамическая типизация, и мне кажется это сразу ставит крест на многих плюшках.
У меня например не работает автокомплит, когда в коде экземпляр класса инстанцируется фабричным методом. Соответственно переименование методов/полей тоже на этом спотыкается.
Перемещение классов в другие файлы часто косячит.
Для питона это конечно best ide, но до уровня reSharper не дотягивает. Да собсно и пох.

yroslavasako

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

karkar

> окамл или хотя бы F#,
для них есть среды с полноценной:
1. навигацией по коду,
2. авторефакторингом,
3. интелесенсом,

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

6yrop

ни одна автоматика полностью распарсить код не сумеет
если код под статической типизацией, то сумеет. В этом и есть вся фишка! На динамически типизированном языке ты пишешь source code, который не является structured data, на статически типизированном языке наоборот ты пишешь source code, который является structured data.

6yrop

PS кто использовал пишарм от жетбрейнс - скажите, там есть уровень решарпера?
Это невозможно в принципе, . Обработка неструктурированных данных всегда будет проигрывать обработке структурированных данных.

salamander

На динамически типизированном языке ты пишешь source code, который не является structured data, на статически типизированном языке наоборот ты пишешь source code, который является structured data.
Что ты подразумеваешь под "код является structured data"? А то выглядит как полная ахинея, но может я все же чего-то не так понял...

6yrop

Что ты подразумеваешь под "код является structured data"? А то выглядит как полная ахинея, но может я все же чего-то не так понял...
может вот этого достаточно для пояснения: The Roslyn Project 4 Working with Semantics. API ReSharper-а по сути делает тоже самое.
Если совсем на пальцах попытаться объяснить, то получается следующее. Когда программист пишет source code на статически типизированном языке, он создает набор ссылок (link-ов). Линк определяется так: на одном конце определение элемента языка (метод, класс, field класса, интерфейс, лямбда и т.д. на другом конце использование этого элемента (возможно неявное через inference). В случае статически типизированного языка мы можем получить весь набор ликов. В случае динамической типизации весь набор линков, вероятно, доступен только через рантайм, т.е. практически недоступен.
Для более точного и детального понимания упомянутого мной термина structured data отсылаю к таким API как ReSharper, Roslyn и т.п.

sergeikozyr

До решарпера не дотягивает кстати
и в принципе дотянуть не может
вообще, мне странно, что этим кто-то пользуется
-а (извращенцы юзают vim, и только они :D) за глаза. Плюс у меня постоянная справка по объектам в виде открытого ipython

salamander

По ссылке, которую ты привел термин "structured data" вообще ни разу не встречается. Так же как и слово "link". Так что не понятно, почему мне должно было внезапно стать понятнее.
Про объяснение "на пальцах": у тебя получилось почти определение DU-цепочек, за тем лишь исключением, что ты, кажется, понимаешь несколько другие вещи под определением и использованием, чем в DU-цепочках. Так?
Чтобы совсем не удаляться в философские рассуждения по поводу возможности "полного распарсивания кода" (ибо не ясно, что есть полное, а что неполное распарсивание небольшой пример на C для иллюстрации того, о чем говорил Айвенга:
get.h:
int glue(get_, FIELDstruct bar *bar)
{
return bar->FIELD;
}

bar.c:
#define xglue(x, y) x ## y
#define glue(x, y) xglue(x, y)

struct bar {
int first;
int second;
};

#define FIELD first
#include "get.h"
#undef FIELD

#define FIELD second
#include "get.h"
#undef FIELD

Язык с самой что ни на есть статической типизацией. Вопрос: какие изменения должен внести авторефакторер, если я хочу переименовать поле структуры first в thefirst. Допвопросы: как он должен это понять и почему он ничего не сломает внеся такое изменение.

okis

Строго говоря, тут не один язык, а два, один из них, конечно, статически типизированный, к другому же вообще это понятие неприменимо.

salamander

Ну почему же два разных:
- описаны они в одном стандарте (стандарт языка C ISO9899 часть 6.10 описывает синтаксис препроцессора
- использования препроцессора без C или C без препроцессора практически не бывает.
Их комбинация очень даже статически типизированная: типы проверяются во время компиляции, а не в рантайме, все ок.

okis

Но при компиляции выполняется два прохода: препроцессинг и, собственно, компиляция, причем они независимы, т.е. компилятор о том, как там отработал препроцессор ничего не знает.

salamander

Ага, а потом во время собственно компиляции компилятор тоже делает несколько проходов. Общая схема: исходный код -{парсер}-> внутреннее представление 1 -{оптимизации}-> внутреннее представление 2 -{кодогенератор}-> машинный код. Но ведь эти внутренние представления за языки программирования не считают (потому что непосредственно на них никто не пишет :) ) и все это рассматривают как один процесс. Почему же тогда делать исключение для препроцессинга?
Вообще, идея классификации языков на основании того, как устроен компилятор данного языка мне кажется неудачной: компиляторов может быть несколько и устроены они могут быть различным образом.
Тем более, что для примера это не так и важно: даже если мы предположим что наш супер-мега-умный авторефакторинг во всем разобрался и нашел использование поля first через define и include, вопрос что же он должен изменить останется.

okis

> вопрос останется
и правильно, потому что у языков как был один синтаксис (пишется-то все в одном файле но семантика разная, поэтому когда ты хочешь поменять название поля в структуре (в приведенном случае нужно выполнить полностью препроцессинг, сохранив привязку к исходному коду, а далее определить семантическую связь (неочевидную машине) что first в дефайне и в коде — про одно и то же. А для этого уже информации недостаточно. Собственно, поэтому всякие рефакторинги и появились сначала у языков без препроцессора (в смысле макросов C, а не просто подстановки констант и условной компиляции) вроде java и c#.

yroslavasako

если код под статической типизацией, то сумеет.
Код был на скале. Не сумел

salamander

Да даже если определили: как код изменять?
1. Можно добавить костыль:
#if FIELD == first
return bar->thefirst;
#else
return bar->FIELD;
#endif

2. Можно изменить дефайн
#define FIELD thefirst

Тут все зависит от того, что же хотел программист, а вот это вот уже из кода не восстанавливается.
Если так не нравится препроцессор, можно соорудить пример с классами (множественным) наследованием и переименованием виртуальной функции. Куда должны распространяться изменения по дереву наследования?

salamander

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

Maurog

Строго говоря, тут не один язык, а два, один из них, конечно, статически типизированный, к другому же вообще это понятие неприменимо
строго говоря, здесь один язык C

elenangel

строго говоря, тут два языка, описанные в одном стандарте. механическое объединение двух разных синтаксисов в один стандарт не делает их одним языком.

6yrop

Так же как и слово "link".
ну как же нет, во втором предложении "is being referenced.".
Про объяснение "на пальцах": у тебя получилось почти определение DU-цепочек, за тем лишь исключением, что ты, кажется, понимаешь несколько другие вещи под определением и использованием, чем в DU-цепочках. Так?

да, сходство есть. Только там говориться о variable, а я рассматриваю и другие элементы языка: "метод, класс, field класса, интерфейс, лямбда и т.д. ".
Чтобы совсем не удаляться в философские рассуждения по поводу возможности "полного распарсивания кода" (ибо не ясно, что есть полное, а что неполное распарсивание небольшой пример на C для иллюстрации того, о чем говорил Айвенга:
get.h:
bar.c:
Язык с самой что ни на есть статической типизацией. Вопрос: какие изменения должен внести авторефакторер, если я хочу переименовать поле структуры first в thefirst. Допвопросы: как он должен это понять и почему он ничего не сломает внеся такое изменение.

Да, статическая типизация не является достаточным условием. Я имел в виду, что статическая типизация является необходимым условием. Т.е. при динамической типизации у нас пропадает возможность работать с кодом как с structured data.
На текущий момент упомянутый мной термин понятен?

6yrop

Да, статическая типизация не является достаточным условием.
Например, при анонсе языка Kotlin JetBrains писала, что для Scala сложно построить хороший инструмент. А вы в треде показали, что и С/C++ не являются toolable.

6yrop

языков ... вроде java и c#.
вот и получается, если хочется язык, в котором код представим как structured data, то из всех "" пока доступны только Java и C#. Ну а какой лучше среди этих языков, все знают. Еще надеемся на Kotlin.

okis

Там написано, что эти языки созданы для своих задач. Из сказанного неявно следует, что если код представлен как structured data (я пока так и не понял, что это, видимо, некоторого рода синтаксическое дерево с полной информацией о типах то на нём можно выполнять рефакторинг и это хорошо. Сама по себе, мысль верная, но какова предпосылка? У ЯП может быть много других полезных свойств кроме refactor-ability, да и это требование порождено хаотически меняющимся окружением и задачами в бизнес-софте.
А структурно (точнее, грамматически — это более понятный мне термин) какой-нибудь lisp ещё проще, чем c# или ява.

6yrop

какова предпосылка? У ЯП может быть много других свойств кроме refactor-ability, да и это требование порождено хаотически меняющимся окружением и задачами в бизнес-софте.
я вроде как тоже хотел в этом треде спозиционироваться на "бизнес-софте". Но потом подумал, весь мир меняется :D .

okis

Первый пост в треде вообще про относительно низкоуровневое программирование. Меняющиеся требования могут присутствовать и там, хоть и в меньшем объеме.

6yrop

какова предпосылка?
да и это требование порождено хаотически меняющимся окружением и задачами
 
помимо меняющегося окружения, возможность хорошей навигации и рефакторинга важна и в процессе самой разработке:
1. Такая возможность позволяет как бы путешествовать во времени. Возвращаться в прошлое с информацией из настоящего. Менять решения, которые принимались в прошедшие моменты времени.
2. Откладывать принятие решения на момент, когда (в голове или еще где) будет достаточно информации для принятия правильного решения.
3. Помогает взаимодействию между членами команды..

salamander

Так же как и слово "link"
ну как же нет, во втором предложении "is being referenced.".
Ну ты конечно можешь говорить что угодно, но в этом твоем втором предложении
"Although this information alone is enough to describe all the declarations and logic in the source, it is not enough information to itify what is being referenced."
слова "link" нет. Сколько бы ты не фантазировал.
да, сходство есть. Только там говориться о variable, а я рассматриваю и другие элементы языка: "метод, класс, field класса, интерфейс, лямбда и т.д. ".
Что я от тебя хотел, так это следующее:
ты говоришь про
definition (пример: "x = 5;") и use (пример: "return x;")
или про
declaration (пример: "int x;") и reference (примеры: "x = 5;" "return x;")
Видимо, второе.
Да, статическая типизация не является достаточным условием. Я имел в виду, что статическая типизация является необходимым условием.

ты утверждал обратное: что статической типизации достаточно. Слив засчитан.
На текущий момент упомянутый мной термин понятен?
С чего бы это он должен был стать понятен? Ты так не разу и не попытался даже сформулировать его. Ведешь рассуждения на смежные темы и даешь ссылки на пространные тексты. На меня что, должно было внезапно снизойти божественное озарение?

salamander

помимо меняющегося окружения, возможность хорошей навигации и рефакторинга важна и в процессе самой разработке:
1. Такая возможность позволяет как бы путешествовать во времени. Возвращаться в прошлое с информацией из настоящего. Менять решения, которые принимались в прошедшие моменты времени.
2. Откладывать принятие решения на момент, когда (в голове или еще где) будет достаточно информации для принятия правильного решения.
3. Помогает взаимодействию между членами команды..
Какие-то ты прямо волшебные возможности рефакторингу приписываешь. При том, что в теме пока вспомнили только про одно его применение: переименование всего подряд. Может примерчики?.. По каждому пункту...
Вообще ты так говоришь, словно авторефакторинг - это цель существования языка программирования. Все-таки ЯП создан для того, чтобы на нем писать программы. И как мы тут выяснили, возможность хорошего авторефаткоринга требует отказа от ряда других возможностей. А дальше уже идет логичный вопрос: что же мы получаем и что теряем? И в каких случаях оно того стоит, а в каких нет.

salamander

С/C++ не являются toolable.
Чем-чем они не являются? Беглый гуглинг подсказывает, что ты скорее всего этот термин сам только что выдумал.

6yrop

Чем-чем они не являются? Беглый гуглинг подсказывает, что ты скорее всего этот термин сам только что выдумал.
вот web page
когда читал про XAML тоже встречал это слово, но это как раз негативный пример :grin:

6yrop

Ну ты конечно можешь говорить что угодно, но в этом твоем втором предложении
"Although this information alone is enough to describe all the declarations and logic in the source, it is not enough information to itify what is being referenced."
reference и link это синонимы.

ты говоришь про
definition (пример: "x = 5;") и use (пример: "return x;")
или про
declaration (пример: "int x;") и reference (примеры: "x = 5;" "return x;")
Видимо, второе.

Оба, и еще много чего.
Ранее ты утверждал обратное: что статической типизации достаточно. Слив засчитан.

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

Спасибо, за ответ. (без стеба)

okis

А вы в треде показали, что и С/C++ не являются toolable.
Кстати, если понимать toolable как наличие hooks into compiler internals, то у c++ возможностей хинтинга побольше, чем у C#. В другом месте, где я нашел это слово (презентация по языку Dart) рядом со словом был скриншот эклипса (что, видимо, означало удобство преобразования кода как текста). Скорее, это про возможность извлечения какой-то дополнительной информации из кода.
Короче, наиболее близким русскоязычным аналогом мне кажется слово "управляемый", хоть и не совсем то же самое, что и managed.

6yrop

Короче, наиболее близким русскоязычным аналогом мне кажется слово "управляемый", хоть и не совсем то же самое, что и managed.
нет же. От слова tool — инструмент.
(что, видимо, означало удобство преобразования кода как текста). Скорее, это про возможность извлечения какой-то дополнительной информации из кода.

Это же можно сказать и о, например, javascript-е. Тот же ReSharper и с javascript-ом работает. Но отличие качественное.

6yrop

От слова tool — инструмент.
т.е. возможность обрабатывать код инструментом, а не только человеком.

6yrop

Может примерчики?.. По каждому пункту...
Вот недавно писал я читалку CSV файлов (почему я это делал это отдельный вопрос). Могу описать эволюцию кода.
CSV файл это строки со списком значений в каждой, поэтому первый вариант интерфейса был таким:

public static IEnumerable<List<StringBuilder>> ReadCsv(this TextReader reader)

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

public static IEnumerable<List<CsValue>> ReadCsv(this TextReader reader) {...}

public class CsValue
{
public readonly StringBuilder Value;
public readonly Number LineNumber;
public readonly Number PositionInLine;

public CsValue(StringBuilder value, Number lineNumber, Number positionInLine)
{
Value = value;
LineNumber = lineNumber;
PositionInLine = positionInLine;
}
}

Для большинства ошибок этого оказалось достаточно. Но еще надо было обработать ситуацию, когда в первой строке есть заголовок столбца, а в какой-нибудь n-ой csv-строке значение в соответствующей позиции отсутствует. В интерфейс добавляем номер строки для csv-сроки (дело в том, что csv-строка может содержать разрывы строк и поэтому строки в текстовом файле не совпадают с csv-сроками):
public static IEnumerable<CsvRow> ReadCsv(this TextReader reader) {...}

public class CsvRow
{
public readonly List<CsValue> CsValues;
public readonly Number LineNumber;

public CsvRow(List<CsValue> csValues, Number lineNumber)
{
CsValues = csValues;
LineNumber = lineNumber;
}
}

public class CsValue
{
public readonly StringBuilder Value;
public readonly Number LineNumber;
public readonly Number PositionInLine;

public CsValue(StringBuilder value, Number lineNumber, Number positionInLine)
{
Value = value;
LineNumber = lineNumber;
PositionInLine = positionInLine;
}
}

Мне надо было просчитывать это всё заранее? Зачем? При использовании C#/ReSharper-а это всё делается последовательно и без увеличения времени разработки. Мозги разработчика освобождаются от таких расчетов и могут использоваться более эффективно. Когда возникает потребность, тогда и делаем, а время нам сохраняет ReSharper :).

salamander

т.е. возможность обрабатывать код инструментом, а не только человеком.
Ты хочешь сказать, что C/C++ нельзя обрабатывать инструментами? А как же компиляторы (чем не инструмент)? А подсветка синтаксиса в текстовых редакторах? А тот же cscope (позволяет, в частности, находить в C-шном коде по функции ее объявление и использования) был написан в начале 80-х, когда слово рефакторинг еще не придумали.
Тем более что:
toolable (e.g. offering a lot of hooks into the compiler's internals)

т.е. это свойство компилятора, а не языка.

val63


Ты хочешь сказать, что C/C++ нельзя обрабатывать инструментами?
Он хочет сказать, что для сей не придумали решарпера, и ведь действительно не придумали.

salamander

Мне тут видится обычная инкрементальная разработка. Используется повсеместно и особых проблем не вызывает. А были обещаны путешествия во времени и помощь в общении с коллегами!
Я надеюсь ты не будешь утверждать, что без авторефакторинга модифицировать однажды написанный код нельзя?

6yrop

Я надеюсь ты не будешь утверждать, что без авторефакторинга модифицировать однажды написанный код нельзя?
весь вопрос во временной стоимости

Dasar

Какие-то ты прямо волшебные возможности рефакторингу приписываешь.
intellisense и автоматический рефакторинг - это больше, чем подсветка синтаксиса и переименование метода.
Фактически, под этим понимается два набора инструментов над кодом: один для просмотра, другой для изменений: первый позволяет для программиста за O(1) посмотреть что-нибудь для кода, второй - за O(1) поменять.
Посмотреть обычно требуется для конкретной "точки кода":
1. набор поддерживаемых операций
2. согласованность (в частности, типов)
3. корректность
4. неиспользуемость
5. все места использования
6. рекомендуемый(нерекомендуемый) вариант использования
7. что же это такое на самом деле?
и т.д.
Поменять обычно требуется:
1. Изменить название (типа, переменной, метода и т.д.)
2. Расщепить код на несколько (в частности, вынести часть метода в отдельный метод)
3. Перенести код из одного места в другой (например, перенести метод из одного класса в другой)
4. Преобразовать код в аналогичный, но имеющий доп. свойство
и т.д.
и это не особо необходимо в проектах на 1 человеко-месяц (который держится в голове одного человека но если в код уже вгрохано 30 человеко-лет (а это лишь 5 лет работы одной группы программистов или 3 смены версий для простого коробочного софта; тот же Word я оцениваю в 300 человеко-лет (это сколько в код вложено, а не сколько необходимо чтобы сделать с нуля то всё это становится критично: все эти задачи решаются для программиста за O(1) или за O(кол-во кода или что еще хуже за O(кол-во трасс работы кода)
также автоматический рефакторинг есть подмножество произвольных автоматических преобразований над кодом: и если код позволяет над собой делать автоматический рефакторинг, то скорее всего над этим кодом можно и делать и другие автоматические преобразования.
Виды автоматических преобразований:
1. доказательство корректности кода (например, что нет обращений к не присвоенной переменной)
2. автоматическое преобразование кода под другой способ исполнения (например, преобразование последовательного кода в "код с продолжениями", или преобразование кода для исполнения поверх JS)
3. краткость записи - восстановление однозначности использования термов из контекста (например, контекстно-зависимые ключевые слова, или extention-ы)
4. высокоуровневые оптимизации кода
5. преобразование кода в более простой вариант для частных случаев входных данных (или для частного исполнения)
для C#, кроме двух последних пунктов, всё есть и используется.
для того же python-а всего этого нет, для C/C++, в целом, тоже.

Dasar

под "O(1) для программиста" понимается кол-во действий (нажатий клавиш, движений мыши) необходимо сделать для выполнения конкретной задачи.
идеальное решение для одиночной задачи (когда есть один вопрос для одной точки кода): курсор переводится на код, вызывающий вопрос, и ответ возникает автоматически с парой нажатий для уточнения вопроса.
зы
для передвижения курсора и нажатий, может использоваться произвольный способ ввода (мышь, клава, touch приоритетный способ ввода может определяться другими условиями использования

6yrop

и это не особо необходимо в проектах на 1 человеко-месяц
Эта байка тоже не верна (типа динамическая типизация лучше подходит для прототипов и т.п.). Полноценная навигация по коду и авторефакторинг проявляют себя уже на объеме в сотни строк кода (заметны уже на десятках строк). Я это хорошо наблюдаю, когда вижу как с кодом работают те, у которых не стоит ReSharper. Более того, с людьми, которые работают с ReSharper-ом, обсуждения задач идет на другом уровне.

Dasar

тот же cscope (позволяет, в частности, находить в C-шном коде по функции ее объявление и использования) был написан в начале 80-х, когда слово рефакторинг еще не придумали.
некорректное сравнение
 необходимо чтобы он умел гарантировать, что он нашел все использования (и не нашел лишнего) для реального кода, использующего одновременно макросы, шаблоны, виртуальное наследование и т.д.
в C# еще добавляются: замыкания, автовывод типов, extension-ы, yield-ы(cps)

salamander

заметны уже на десятках строк
Ну это ты уже точно преувеличиваешь. 50-60 строк на экран нормального размера помещаются.

salamander

А гарантирует ли это решарпер, вот в чем вопрос и первоначальное сомнение, из которых весь этот спор и пошел.

Dasar

Ну это ты уже точно преувеличиваешь. 50-60 строк на экран нормального размера помещаются.
задачи от этого проще не становятся

module Control.Monad.Trans.Same (
Same,
runSame,
SameT(..
runSameT,
same
) where

import Control.Applicative (Applicative(..<*>
import Control.Monad.IO.Class (MonadIO(..
import Control.Monad.Trans.Class (MonadTrans(..

import Data.Functor
import Data.Functor.Itity

type Same r = SameT r Itity

runSame :: Same r r
-> r
runSame = runItity . runSameT

newtype SameT r m a = SameT { unwrapSameT :: m (Either (SameT r m r) a) }

instance Applicative m => Applicative (SameT r m) where
pure = SameT . fmap Right . pure
(SameT m) <*> (SameT x) = SameT fmap h m) <*> x)
where
h (Left g) = const (Left g)
h (Right f) = either Left (Right . f)
instance Functor m => Functor (SameT r m) where
fmap f = SameT . fmap (either Left (Right . f . unwrapSameT
instance Monad m => Monad (SameT r m) where
return = SameT . return . Right
(SameT m) >>= f = SameT $ m >>= either (return . Left) (unwrapSameT . f)
instance MonadIO m => MonadIO (SameT r m) where
liftIO = lift . liftIO
instance MonadTrans (SameT r) where
lift = SameT . (>>= return . Right)

runSameT :: Monad m
=> SameT r m r
-> m r
runSameT (SameT m) = m >>= either runSameT return

same :: Monad m
=> SameT r m r
-> SameT r m a
same = SameT . return . Left

что такое h (в строке "(SameT m) <*> (SameT x) = SameT fmap h m) <*> x)")? и какого оно типа? какие операции над ним можно сделать?

Dasar

А гарантирует ли это решарпер
в целом, да.
зы
более полный ответ на твой вопрос: а что же будет - если замена не однозначна, невозможна или некорректна?
Resharper об этом предупредит, и предложит варианты "а что же делать дальше..."

Dasar

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

salamander

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

salamander

Я никогда не сомневался, что специально запутать можно и 20-строчный код.
Также я никогда не сомневался, что запутанный код не нужно писать в реальных проектах, кроме самых крайних случаев, коих должно быть крайне мало.
ЗЫ: данный язык программирования мне не знаком, так что сказать, что там написано, я не могу.

6yrop

Нужно ли это понимать как
"у меня всегда работало, но сколь либо обоснованного утверждения, что оно всегда работает корректно я не встречал"
?
это надо понимать так: "у меня всегда работало, но полным строгим обоснованием я не интересовался, мне это не сильно нужно, но предполагаю, что такое доказательство вполне можно сделать".
Ты математик?

salamander

Ты математик?
Я программист. Но я глубоко убежден, что каждый программист должен быть еще и немного математиком.
Ладно, с тобой в общем все понятно: ты веришь, в то, что решарпер работает, всегда правильно и вообще обладает чудодейственными свойствами (позволяет и ).

6yrop

Я программист. Но я глубоко убежден, что каждый программист должен быть еще и немного математиком.
одно дело "немного" другое дело требовать всегда строго доказательства.
Ладно, с тобой в общем все понятно: ты веришь, в то, что решарпер работает, всегда правильно и вообще обладает чудодейственными свойствами (позволяет путешествовать во времени и повышает интеллект).

не путай веру и наблюдения в реальном мире :).

Dasar

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

Dasar

Также я никогда не сомневался, что запутанный код не нужно писать в реальных проектах, кроме самых крайних случаев,
не стоит смешивать запутанный код с выразительным кодом.
может так оказаться, что тот код, который ты привык записывать в виде 30-50 строчек на самом деле соответствует 3-5 операторам выразительного кода, и при такой избыточности в 10-50 раз действительно многие задачи становятся много проще (например, при венгерской записи нет необходимости в утилите, которая выдает тип каждой переменной)

salamander

А, ну в такой формулировке - охотно верю.

6yrop

повышает интеллект
интеллект (человека) не повышается, он просто не расходуется попусту на те задачи, которые можно поручить машине.

salamander

Это поэтому
с людьми, которые работают с ReSharper-ом, обсуждения задач идет на другом уровне
?

6yrop

да, потому что ReSharper снимает многие ограничения.

6yrop

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

doublemother

интеллект (человека) не повышается, он просто не расходуется попусту
Бедный. Много интеллекта уже израсходовал? Сколько процентов осталось?

6yrop

понятно, мозги отключились, остался только батхерт :)

doublemother

понятно, мозги отключились, остался только батхерт :)
Не тупи, я последние 60 постов вообще тут не отмечался, но ты так вкусно кормишь, что я не удержался)

6yrop

решарпер отслеживает использование IDisposable без Dispose
Я такого не замечал. Что надо включить?
Вот тут менеджер проекта ReSharper говорит, что анализ IDisposable не имеет смысла делать
http://stackoverflow.com/questions/101664/can-resharper-be-s...
Оставить комментарий
Имя или ник:
Комментарий: