Выбор языка програмирования для задачи.
Еще вопрос: существен ли дистрибутив linux или нет?При отсутствии гуёв - без разницы. И если иксы, то скорее всего как раз си было бы логично выбрать + библиотеки для бд и ком порта, чтобы меньше мараться.
З.Ы. ты уверен, что при таких познаниях в программировании у тебя выйдет что-то стоящее? //просто спросил, ничего личного
пиши на питоне
Все это будет крутиться на linux.Не очень понял, ты драйвер для устройства тоже пишешь? Или только userspace?
Как связать устройство с ПК, я напишу на "С" - создам n файлов, в которые можно записывать управляющий код или с которых можно считывать инфу.
Просто, наверное, передавать управляющие команды через файл не очень хорошо, можно, например, подумать в сторону символьных устройств и соответствующих ioctl.
На каком языке _лучше и проще_ реализовать принятие решений?ну посмотри на AI challenge, на чём там пишут. Если у тебя встроенное устройство со слабым процессором и много дифуров - то лучше ограничиться быстрыми языками: си, плюсы, CL, java. Иначе фантазия может тебя завести ещё дальше, ко всяким скриптам и тому подобному.
я бы общение с ком-портом и все остальное тоже на нем написал бы
Надо замапить форумчан и языки программирования и во всех срачах просто кидать линк на этот мап.
я бы общение с ком-портом и все остальное тоже на нем написал бы
Спасибо всем отписавшимся =)
я ж и говорю - питон. подо все можно найти либу. в особо геморойных случаях он вроде-бы легко сочетается с C/C++
Тут важный вопрос: цена ошибки. Есть ли риск в случае ошибки потерять ценный аппарат?
Ну как бы вставки из сишного кода в питоне никто не отменял. Вроде как настоящие пацаны так скорость выполнения на высоких нагрузках в разы поднимают.
То же самое верно и почти для всего остального, собственно. Все упирается в личные предпочтения
я ж и говорю - питон. подо все можно найти либу. в особо геморойных случаях он вроде-бы легко сочетается с C/C++
что то я пока в треде ни одного фаната VBA не заметил
Нет.
А С# не вариант?
А С# не вариант?ага, и вдоволь потрахаться с недомоно
в особо геморойных случаях он вроде-бы легко сочетается с C/C++С другой стороны, сочетание с C/C++ может оказаться тем самым особо геморройным случаем. Дуализм-с.
Я бы прикинул требования к скорости обработки данных и задержке, и, может быть, сразу начал бы на C++. Ходят слухи, что если грамотно заюзать фишки из C++11, получается фактически тот же питон, только быстрый. Сам не пробовал.
Сам не пробовал.на питоне писать быстрее. кроме, разве что, случая, если ты и так пишешь на C++ все время.
А ему чо, WPF или ASP.NET надо?
ага, и вдоволь потрахаться с недомоно
Впрочем, под линупс никакого удовольствия юзать, конечно.
Я не буду спорить, что шарп хороший язык (сам я его не знаю, но прислушиваюсь к мнению многих знакомых разработчиков но он создан для своей среды и своих задач.
pyserial для работы с ком-портами. Работает, я проверял.
numpy и прочее для математики. Питон в этом смысле дичайше продвинут, его очень много людей используют для вычислительно-тяжёлых задач. Никакого парадокса в этом невозможно усмотреть, ибо если твой алгоритм не векторизирован, то он будет сосать по любому, а если векторизирован, то совершенно неважно на каком языке ты его выражаешь — Mathematica, Python, или C++, всё упирается в производительность низкоуровневой библиотеки (и удобство её интерфейса и numpy/scipy/sage очень хороши в этом смысле.
Я вот кстати как то ковырял на блюджине petsc и заметил, что его сборки и версии есть только для Си и для питона (ну мб еще плюсы, не помню уже точно) и это скорее правило, а не исключение. Для очень многих вещей так, а это знак
сть стопицот адекватных альтернатив.назови альтернативу со статической типизацией и с IDE уровня ReSharper?
а под какой популярный язык нельзя найти подо всё либу?
А как же Флося?
под дельфи найди либу для директ икс 9
Зачем тебе либа под либу? Да и делфи на этом форуме не принято называть популярным, а наоборот - гнобить и хейтить.
Ну если человек уже умеет прогать на сишарпе, то почему бы и нет? Питон ведь тоже учить надо, и в нем стандартная библиотека с сурпризами вроде модуля для XML и веселого флаша потоков. В моно насколько я помню только всякие гуи сейчас куцые.
Ну какой смысл под линуксом юзать мелкософтовский фактически проприетарный язык, когда сть стопицот адекватных альтернатив.
я не понял, минусов понаставили, а на вопрос никто не ответил
я не понял, минусов понаставили, аа на вопрос никто не ответилстатическая типизация и "IDE уровня ReSharper" далеко не решающие факторы при выборе языка под задачу, поэтому никто на этот вопрос и не хочет давать ответ имхо
Ну в целом есть IDEA, но думаю ты в курсе, что труъ-линуксоид должен знать штук 10 языков программирования, каждый из которых якобы хорошо заточен под свою задачу, поэтому IDE он не пользуется и пишет код в емаксе.
ок, либа есть. биндинги под дельфю найди для нее.
Ты настолько безрукий что ли, что сам из TLB не можешь pas сгенерить?
а ты пробовал перед тем как говорить сделать это конкретно для директ иксовских dll?
[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
с ними тоже какой-то подвох?
Eric Unger's JEDI DirectX
DelphiX author Hiroyuki Horiа это под Delphi 3,4,5 и для директ икса 7, что то типа того
статическая типизация и "IDE уровня ReSharper" далеко не решающие факторы при выборе языка под задачудля многих задач статическая типизация и статический анализ кода крайне важная вещь
труъ-линуксоидтк речь про религиозных фанатиков, тогда понятно
для многих задач статическая типизация и статический анализ кода крайне важная вещьНу тогда тем более окамл или хотя бы F#, а никак не C#
окамл или хотя бы F#,для них есть среды с полноценной:
1. навигацией по коду,
2. авторефакторингом,
3. интелесенсом,
? (VS естественно такой не является)
Если нет, то программист должен это проделывать в голове, а это неэффективное использование головы программиста, поскольку можно поручить эту работу машине.
назови альтернативу со статической типизацией и с IDE уровня ReSharper?Eclipse в качестве IDE для Java/C++ - чем не альтернатива?
Ну вот кстати в который уже раз укажу всю линейку продуктов джетбрейнса. У питона может типизации и нет статической, зато есть пишарм
? (VS естественно такой не является)Обоснуйте.
intellisense, как вы его называете, студия умеет. Что такое навигация по коду, и зачем её выделять в отдельный пункт требований, страшно даже представить. Подозреваю, что это переход к определениям классов, методов и т.п.
Авторефакторинг — это что-то, что википедия предлагает исправить на «автотракторного», но, судя из названия, это что-то такое, за что программиста надо бить ссаной тряпкой по лицу. Лично я не хотел бы, чтобы редактор по-тихому где-то менял мой код, но если говорить о вечно приводимом любителями рефакторинга примере: «вынести кусок кода в отдельную функцию», то сама идеология кодирования на ml-языках подразумевает сильное дробление кода на нано-функции. Если потребуется уже и так раздробленный метод раздробить ещё чуть-чуть, но руками, я готов на это пойти, в обмен на то, что код полностью статически анализируется компилятором при сборке (не знаю, не сломали ли это в F#, в окамле всё это есть). И анализируется заведомо качественнее, чем эти ваши до-диезы.
Я раньше думал, что у тебя майкрософт головного мозга, но теперь вижу, что нет, сишарп МНУ.
Авторефакторингвообще-то это когда, к примеру, переименовываешь класс и он автоматически переименовывается по всему проекту. от автозамены отличается учетом контекста и синтаксиса.
Мне, впрочем, редко в своей жизни приходилось переименовывать классы.
Например, тебе надо поменять свойство объекта, которое называется LastUpdateTimestamp. Но ты в упор не помнишь название, а знаешь, что тебе нужен timestamp.
Vanilla VS: идешь к описанию объекта в соответствующем файле (или достаешь из метаданных) и ищешь нужное свойство.
Resharper VS: набираешь Times... и тебе предлагается нужное свойство (ну и еще UpdateTimes, CreateTimestamp и т.д.)
А вот пример авторефакторинга, который так тебе противен. Разработчик плохо знает английский, и в его коде тип называется не Strategy, а Stratagy. Ты хочешь переименовать этот тип, затронув при этом все 300 файлов, где он используется, все комментарии, а также все его переменные stratagy, которые он завел. Решарпер позволяет это сделать за время, равное времени обработки всех файлов плюс эпсилон.
Что такое навигация по коду? Вот задача: ты используешь метод интерфейса IRepository и хочешь перейти к XML-реализации этого интерфейса. В vanilla студии тебе придется делать Find All References этого интерфейса и отсеивать все классы, его реализующие от других результатов поиска, которых тысячи. Решарпер же для этого предусматривает одну кнопку "перейти к реализациям интерфейса", по нажатию которой ты видишь список всех классов, реализующих данный интерфейс.
P.S. не говоря уже о том, что решарпер отслеживает использование IDisposable без Dispose, предупреждает об access to modified closure и possible null reference exception, а также, наоборот, о лишних проверках на null объектов, которые не могут быть null.
Расширенный автокомплит есть в виме, но шурик никогда не признает вим за нормальный редактор
Про авторефакторинг идею понял, хотя согласись, что:
1. когда разработчик бесконтрольно наплодил вызовов с ошибкой на 300 файлов, а его за это время никто не стукнул линейкой по пальцам — это странно;
2. Для данного случая достаточно просто заменить вообще все вхождения stratagy в проекте, потому что stratagy нам не нужен, а случай, когда и мы в проекте опечатались, и есть какое-то внешнее апи, которое не исправить, и в котором тоже есть stratagy — он фантастический
Навигация к определению в виме тоже есть (не для сишарпа, понятно, хотя может и для него уже запилили но см. отсылку к шурику.
А то что всё это есть в емаксе, да ещё и с искусственным интеллектом (правда самому печатать нельзя, надо окошко с вимом открыть я вообще уверен на 146%.
До решарпера не дотягивает кстати
пишарм
вообще-то это когда, к примеру, переименовываешь класс и он автоматически переименовывается по всему проекту. от автозамены отличается учетом контекста и синтаксиса.Я вот читаю и ужасаюсь: это проблемы отдельно взятых программистов или целых языков программирования, что там для переименования
предупреждает об access to modified closure и possible null reference exception, а также, наоборот, о лишних проверках на null объектов, которые не могут быть null.В Эклипсе это (и ещё тысяча проблем) решается плагином FindBugs.
А что касается великолепного vim-а, то я с ним работал мало и с уверенностью утверждать не могу. Однако я помню, что тогда половину времени за компом у меня занимало знакомство с vim-ом, а вторую половину - программирование. Learning Curve решарпера намного короче.
Ну и да, пока в проекте еще нет мегабайта исходников, все равно, в чем его писать.
А когда у тебя есть удобный механизм рефакторинга, то позволяешь себе такие вольности, которые раньше не позволял.
Раньше я не шел на некоторые косметические улучшения кода, т.к. подсознательно представлял себе, сколько монотонной работы оно влечет, и придумывал отмазку. А теперь - иду, т.к. монотонной работы нет. Итог - мой код мне нравится больше, спасибо решарперу за это
А то что всё это есть в емаксе, да ещё и с искусственным интеллектом (правда самому печатать нельзя, надо окошко с вимом открыть я вообще уверен на 146%.Ну мы с тобой тут в разных положениях, согласись. Я говорю с позиции 2.5-летнего опыта, а ты - уверен, но сам не пробовал. Я тебе верю, конечно, но осадок остался
Это как с Selenium-ом. До сегодняшнего дня я думал, что вот он, удобный framework для тестирования веб-интерфейса. А сегодня попробовал, и внезапно выяснил, что в него встроен только файрфокс, что он открывает реальное ОКНО файрфокса, в котором реально открывает страницу, и что для запуска IE или Chrome-а через Selenium требуются определенные танцы с бубном.
Не то чтобы это меня отвратило от Селениума совсем, но это неожиданные и неприятные особенности.
Это как с Selenium-ом. До сегодняшнего дня я думал, что вот он, удобный framework для тестирования веб-интерфейса. А сегодня попробовал, и внезапно выяснил, что в него встроен только файрфокс, что он открывает реальное ОКНО файрфокса, в котором реально открывает страницу, и что для запуска IE или Chrome-а через Selenium требуются определенные танцы с бубном.breaking news!
Ну мы с тобой тут в разных положениях, согласись. Я говорю с позиции 2.5-летнего опыта, а ты - уверен, но сам не пробовал. Я тебе верю, конечно, но осадок осталсяНе, мы с тобой в равных положениях. Я не спорю, что для C# студия с решарпером — это мегакруто и кончить можно, а F# ни ты, ни я не использовали.
Меня больше умиляет то, что ни я, ни шурик не кодили на F#. Только я как минимум открыл MSDN и увидел, что intellisense для f# в студии есть, потом открыл поиск и обнаружил, что в емаксе даже запилили какую-то отдельную fsharp-mode (к слову, я емаксом вообще никогда не пользовался). В виме я работал с окамлом и знаю возможности вима и уровень поддержки окамла в нём.
В общем, на самом деле основная идея моего поста была не в том, что F# лучше, чем что бы то ни было подходит под задачу (в конце концов ТС, я так понимаю, пишет под линуксы а в том, что шурик — долбоёб Он кодит на C#, не умеет ни другие языки, ни IDE, но загодя для разработки математического софта требует не качество и сопровождаемость кода, а какие-то совершенно ненужные плюшки в IDE, и язык выбирает исключительно по принципу "есть IDE или нет".
P.s. Селениум — это ужасно, да. По 40 минут на набор тестов и кривое апи меня страшно вымораживали.
Я не спорю, что для C# студия с решарпером — это мегакруто и кончить можноА-а, ну так бы и сказал сразу А то твой исходный пост, из-за которого я и влез в топик, говорит практически обратное.
Наверно, ты имел в виду не "докажите мне, что решарпер не говно", а "докажите мне, что для данной задачи нужен IDE". Тогда я зря влез
P.s. Селениум — это ужасно, да. По 40 минут на набор тестов и кривое апи меня страшно вымораживали.То есть меня ждут и другие неприятные открытия А может, сразу в топку селениум, и есть альтернативы?
Ты вообще кормишь троллей:)
Тогда я зря влез
Ну еще Shurick, но он ИМХО добросовестно заблуждается.
сообщение не несет смысловой нагрузки вообще, но как бы намекает, что собеседник туп.Там написано: "многоуважаемый , предложите вариант лучше".
Ну еще Shurick, но он ИМХО добросовестно заблуждается.Он это делает в каждом первом треде.
к многоуважаемому это тоже относится
к многоуважаемому это тоже относитсяНу вот, опять бестолковый хомячок
Давай ссылки ищи.
на что? на то что многоуважаемый , в каждом первом треде намекает своим собеседникам, что они тупы? так откройте же список своих сообщений да возрадуйтесь.
многоуважаемый , в каждом первом треде намекает своим собеседникам, что они тупы?Точно! Сравни с "добросовестно заблуждается" и устыдись!
Ну еще Shurick, но он ИМХО добросовестно заблуждается.собственно я влез в этот тред, поскольку было свежо впечатление о вчерашнем прочтении статей Hejlsberg-а. Вчера случайно набрел вот на эту парочку статей: ref1, ref2. Во время прочтения несколько раз отмечал про себя “о это полностью совпадает с моим виденьем”. Ребят, а вы как дети, точнее вчерашние студенты .
собственно я влез в этот тред, поскольку было свежо впечатление о вчерашнем прочтении статей Hejlsberg-а.А я думал, вы с No в каждый тред приходите пропагандировать каждый свой любимый язык Я ошибся? OH SHI~~~
А я думал, вы с No в каждый тред приходите пропагандировать каждый свой любимый язык Я ошибся? OH SHI~~~Не, я с другой целью: я ищу замену сишарпа на более удобный язык, поскольку есть ощущение, что такой язык возможен (может быть Kotlin, но надежда не очень большая). Ну и вбрасываю в надежде услышать что-либо убедительное, а тут предлагают текстовую замену .
А я так понимаю, вообще, не программер, а что-то типа обычного манагера-пастуха обезьянок.
я ищу замену сишарпа на более удобный язык, поскольку есть ощущение, что такой язык возможени __но__ тебе его может подсказать, да ты непослушаешь
PS кто использовал пишарм от жетбрейнс - скажите, там есть уровень решарпера?
PS кто использовал пишарм от жетбрейнс - скажите, там есть уровень решарпера?Если он по уровню похож на WebStorm для JS, то нет.
Вообще, у меня сложилось впечатление, что качество их продуктов пропорционально стоимости
PS кто использовал пишарм от жетбрейнс - скажите, там есть уровень решарпера?Ну в питоне все таки динамическая типизация, и мне кажется это сразу ставит крест на многих плюшках.
У меня например не работает автокомплит, когда в коде экземпляр класса инстанцируется фабричным методом. Соответственно переименование методов/полей тоже на этом спотыкается.
Перемещение классов в другие файлы часто косячит.
Для питона это конечно best ide, но до уровня reSharper не дотягивает. Да собсно и пох.
А так да, авторефакторингом не пользуюсь. Незамеченные опечатки я пропускаю редко, а если произвести какие-то манипуляции, то лучше всегда посмотреть в код самому, ни одна автоматика полностью распарсить код не сумеет. Например, в некоторых языках широко развита кодогенерация и я не представляюю что в этом случае будет делать рефаткоринг. В других случаях объеты данных как-то сериалайзятся и передаются по сети, например, и надо убедиться, что изменение кода в клиенте будет отвечать соответствующим изменениям кода на сервере.
> окамл или хотя бы F#,
для них есть среды с полноценной:
1. навигацией по коду,
2. авторефакторингом,
3. интелесенсом,
Для окамла есть OcaIDE (плагин для эклипса там и навигация, и автокомплит, и подсказки по аргументам функций, и показ выведенного типа любого выражения по наведению мыши. и пр. Про рефакторинг не скажу, может тоже что есть.
ни одна автоматика полностью распарсить код не сумеетесли код под статической типизацией, то сумеет. В этом и есть вся фишка! На динамически типизированном языке ты пишешь source code, который не является structured data, на статически типизированном языке наоборот ты пишешь source code, который является structured data.
PS кто использовал пишарм от жетбрейнс - скажите, там есть уровень решарпера?Это невозможно в принципе, . Обработка неструктурированных данных всегда будет проигрывать обработке структурированных данных.
На динамически типизированном языке ты пишешь source code, который не является structured data, на статически типизированном языке наоборот ты пишешь source code, который является structured data.Что ты подразумеваешь под "код является structured data"? А то выглядит как полная ахинея, но может я все же чего-то не так понял...
Что ты подразумеваешь под "код является structured data"? А то выглядит как полная ахинея, но может я все же чего-то не так понял...может вот этого достаточно для пояснения: The Roslyn Project 4 Working with Semantics. API ReSharper-а по сути делает тоже самое.
Если совсем на пальцах попытаться объяснить, то получается следующее. Когда программист пишет source code на статически типизированном языке, он создает набор ссылок (link-ов). Линк определяется так: на одном конце определение элемента языка (метод, класс, field класса, интерфейс, лямбда и т.д. на другом конце использование этого элемента (возможно неявное через inference). В случае статически типизированного языка мы можем получить весь набор ликов. В случае динамической типизации весь набор линков, вероятно, доступен только через рантайм, т.е. практически недоступен.
Для более точного и детального понимания упомянутого мной термина structured data отсылаю к таким API как ReSharper, Roslyn и т.п.
До решарпера не дотягивает кстатии в принципе дотянуть не может
вообще, мне странно, что этим кто-то пользуется
-а (извращенцы юзают vim, и только они ) за глаза. Плюс у меня постоянная справка по объектам в виде открытого ipython
Про объяснение "на пальцах": у тебя получилось почти определение 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. Допвопросы: как он должен это понять и почему он ничего не сломает внеся такое изменение.
Строго говоря, тут не один язык, а два, один из них, конечно, статически типизированный, к другому же вообще это понятие неприменимо.
- описаны они в одном стандарте (стандарт языка C ISO9899 часть 6.10 описывает синтаксис препроцессора
- использования препроцессора без C или C без препроцессора практически не бывает.
Их комбинация очень даже статически типизированная: типы проверяются во время компиляции, а не в рантайме, все ок.
Но при компиляции выполняется два прохода: препроцессинг и, собственно, компиляция, причем они независимы, т.е. компилятор о том, как там отработал препроцессор ничего не знает.
Вообще, идея классификации языков на основании того, как устроен компилятор данного языка мне кажется неудачной: компиляторов может быть несколько и устроены они могут быть различным образом.
Тем более, что для примера это не так и важно: даже если мы предположим что наш супер-мега-умный авторефакторинг во всем разобрался и нашел использование поля first через define и include, вопрос что же он должен изменить останется.
и правильно, потому что у языков как был один синтаксис (пишется-то все в одном файле но семантика разная, поэтому когда ты хочешь поменять название поля в структуре (в приведенном случае нужно выполнить полностью препроцессинг, сохранив привязку к исходному коду, а далее определить семантическую связь (неочевидную машине) что first в дефайне и в коде — про одно и то же. А для этого уже информации недостаточно. Собственно, поэтому всякие рефакторинги и появились сначала у языков без препроцессора (в смысле макросов C, а не просто подстановки констант и условной компиляции) вроде java и c#.
если код под статической типизацией, то сумеет.Код был на скале. Не сумел
1. Можно добавить костыль:
#if FIELD == first
return bar->thefirst;
#else
return bar->FIELD;
#endif
2. Можно изменить дефайн
#define FIELD thefirst
Тут все зависит от того, что же хотел программист, а вот это вот уже из кода не восстанавливается.
Если так не нравится препроцессор, можно соорудить пример с классами (множественным) наследованием и переименованием виртуальной функции. Куда должны распространяться изменения по дереву наследования?
Кстати да, тенденция ровно та, которая и ожидалась: мы выяснили, что препроцессор сложно анализировать и решили, что для авторефакторинга нужен не просто статически типизированный язык, но и язык без препроцессора. Сейчас еще забаним множественное наследование (ну ладно, оставим в ограниченном объеме) и адресную арифметику. И таки да, в той же джаве их нет и статически анализировать ее гораздо легче большинства других языков.
Строго говоря, тут не один язык, а два, один из них, конечно, статически типизированный, к другому же вообще это понятие неприменимострого говоря, здесь один язык C
строго говоря, тут два языка, описанные в одном стандарте. механическое объединение двух разных синтаксисов в один стандарт не делает их одним языком.
Так же как и слово "link".ну как же нет, во втором предложении "is being referenced.".
Про объяснение "на пальцах": у тебя получилось почти определение DU-цепочек, за тем лишь исключением, что ты, кажется, понимаешь несколько другие вещи под определением и использованием, чем в DU-цепочках. Так?
да, сходство есть. Только там говориться о variable, а я рассматриваю и другие элементы языка: "метод, класс, field класса, интерфейс, лямбда и т.д. ".
Чтобы совсем не удаляться в философские рассуждения по поводу возможности "полного распарсивания кода" (ибо не ясно, что есть полное, а что неполное распарсивание небольшой пример на C для иллюстрации того, о чем говорил Айвенга:
get.h:
bar.c:
Язык с самой что ни на есть статической типизацией. Вопрос: какие изменения должен внести авторефакторер, если я хочу переименовать поле структуры first в thefirst. Допвопросы: как он должен это понять и почему он ничего не сломает внеся такое изменение.
Да, статическая типизация не является достаточным условием. Я имел в виду, что статическая типизация является необходимым условием. Т.е. при динамической типизации у нас пропадает возможность работать с кодом как с structured data.
На текущий момент упомянутый мной термин понятен?
Да, статическая типизация не является достаточным условием.Например, при анонсе языка Kotlin JetBrains писала, что для Scala сложно построить хороший инструмент. А вы в треде показали, что и С/C++ не являются toolable.
языков ... вроде java и c#.вот и получается, если хочется язык, в котором код представим как structured data, то из всех "" пока доступны только Java и C#. Ну а какой лучше среди этих языков, все знают. Еще надеемся на Kotlin.
А структурно (точнее, грамматически — это более понятный мне термин) какой-нибудь lisp ещё проще, чем c# или ява.
какова предпосылка? У ЯП может быть много других свойств кроме refactor-ability, да и это требование порождено хаотически меняющимся окружением и задачами в бизнес-софте.я вроде как тоже хотел в этом треде спозиционироваться на "бизнес-софте". Но потом подумал, весь мир меняется .
Первый пост в треде вообще про относительно низкоуровневое программирование. Меняющиеся требования могут присутствовать и там, хоть и в меньшем объеме.
какова предпосылка?помимо меняющегося окружения, возможность хорошей навигации и рефакторинга важна и в процессе самой разработке:
да и это требование порождено хаотически меняющимся окружением и задачами
1. Такая возможность позволяет как бы путешествовать во времени. Возвращаться в прошлое с информацией из настоящего. Менять решения, которые принимались в прошедшие моменты времени.
2. Откладывать принятие решения на момент, когда (в голове или еще где) будет достаточно информации для принятия правильного решения.
3. Помогает взаимодействию между членами команды..
Ну ты конечно можешь говорить что угодно, но в этом твоем втором предложенииТак же как и слово "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;")
Видимо, второе.
Да, статическая типизация не является достаточным условием. Я имел в виду, что статическая типизация является необходимым условием.
ты утверждал обратное: что статической типизации достаточно. Слив засчитан.
На текущий момент упомянутый мной термин понятен?С чего бы это он должен был стать понятен? Ты так не разу и не попытался даже сформулировать его. Ведешь рассуждения на смежные темы и даешь ссылки на пространные тексты. На меня что, должно было внезапно снизойти божественное озарение?
помимо меняющегося окружения, возможность хорошей навигации и рефакторинга важна и в процессе самой разработке:Какие-то ты прямо волшебные возможности рефакторингу приписываешь. При том, что в теме пока вспомнили только про одно его применение: переименование всего подряд. Может примерчики?.. По каждому пункту...
1. Такая возможность позволяет как бы путешествовать во времени. Возвращаться в прошлое с информацией из настоящего. Менять решения, которые принимались в прошедшие моменты времени.
2. Откладывать принятие решения на момент, когда (в голове или еще где) будет достаточно информации для принятия правильного решения.
3. Помогает взаимодействию между членами команды..
Вообще ты так говоришь, словно авторефакторинг - это цель существования языка программирования. Все-таки ЯП создан для того, чтобы на нем писать программы. И как мы тут выяснили, возможность хорошего авторефаткоринга требует отказа от ряда других возможностей. А дальше уже идет логичный вопрос: что же мы получаем и что теряем? И в каких случаях оно того стоит, а в каких нет.
С/C++ не являются toolable.Чем-чем они не являются? Беглый гуглинг подсказывает, что ты скорее всего этот термин сам только что выдумал.
Чем-чем они не являются? Беглый гуглинг подсказывает, что ты скорее всего этот термин сам только что выдумал.вот web page
когда читал про XAML тоже встречал это слово, но это как раз негативный пример
Ну ты конечно можешь говорить что угодно, но в этом твоем втором предложенииreference и link это синонимы.
"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."
ты говоришь про
definition (пример: "x = 5;") и use (пример: "return x;")
или про
declaration (пример: "int x;") и reference (примеры: "x = 5;" "return x;")
Видимо, второе.
Оба, и еще много чего.
Ранее ты утверждал обратное: что статической типизации достаточно. Слив засчитан.
Ну я же не математическую теорему формулировал и не в суде отвечал, поэтому это скорее можно расценить как неточность формулировки, причем по предыдущим мои постам можно было понять контекст, а именно сравнение статической и динамической типизации. Но если тебе очень хочется засчитать мой слив, пожалуйста, да я согласен .
С чего бы это он должен был стать понятен? Ты так не разу и не попытался даже сформулировать его. Ведешь рассуждения на смежные темы и даешь ссылки на пространные тексты. На меня что, должно было внезапно снизойти божественное озарение?
Спасибо, за ответ. (без стеба)
А вы в треде показали, что и С/C++ не являются toolable.Кстати, если понимать toolable как наличие hooks into compiler internals, то у c++ возможностей хинтинга побольше, чем у C#. В другом месте, где я нашел это слово (презентация по языку Dart) рядом со словом был скриншот эклипса (что, видимо, означало удобство преобразования кода как текста). Скорее, это про возможность извлечения какой-то дополнительной информации из кода.
Короче, наиболее близким русскоязычным аналогом мне кажется слово "управляемый", хоть и не совсем то же самое, что и managed.
Короче, наиболее близким русскоязычным аналогом мне кажется слово "управляемый", хоть и не совсем то же самое, что и managed.нет же. От слова tool — инструмент.
(что, видимо, означало удобство преобразования кода как текста). Скорее, это про возможность извлечения какой-то дополнительной информации из кода.
Это же можно сказать и о, например, javascript-е. Тот же ReSharper и с javascript-ом работает. Но отличие качественное.
От слова tool — инструмент.т.е. возможность обрабатывать код инструментом, а не только человеком.
Может примерчики?.. По каждому пункту...Вот недавно писал я читалку 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 .
т.е. возможность обрабатывать код инструментом, а не только человеком.Ты хочешь сказать, что C/C++ нельзя обрабатывать инструментами? А как же компиляторы (чем не инструмент)? А подсветка синтаксиса в текстовых редакторах? А тот же cscope (позволяет, в частности, находить в C-шном коде по функции ее объявление и использования) был написан в начале 80-х, когда слово рефакторинг еще не придумали.
Тем более что:
toolable (e.g. offering a lot of hooks into the compiler's internals)
т.е. это свойство компилятора, а не языка.
Он хочет сказать, что для сей не придумали решарпера, и ведь действительно не придумали.
Ты хочешь сказать, что C/C++ нельзя обрабатывать инструментами?
Я надеюсь ты не будешь утверждать, что без авторефакторинга модифицировать однажды написанный код нельзя?
Я надеюсь ты не будешь утверждать, что без авторефакторинга модифицировать однажды написанный код нельзя?весь вопрос во временной стоимости
Какие-то ты прямо волшебные возможности рефакторингу приписываешь.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++, в целом, тоже.
идеальное решение для одиночной задачи (когда есть один вопрос для одной точки кода): курсор переводится на код, вызывающий вопрос, и ответ возникает автоматически с парой нажатий для уточнения вопроса.
зы
для передвижения курсора и нажатий, может использоваться произвольный способ ввода (мышь, клава, touch приоритетный способ ввода может определяться другими условиями использования
и это не особо необходимо в проектах на 1 человеко-месяцЭта байка тоже не верна (типа динамическая типизация лучше подходит для прототипов и т.п.). Полноценная навигация по коду и авторефакторинг проявляют себя уже на объеме в сотни строк кода (заметны уже на десятках строк). Я это хорошо наблюдаю, когда вижу как с кодом работают те, у которых не стоит ReSharper. Более того, с людьми, которые работают с ReSharper-ом, обсуждения задач идет на другом уровне.
тот же cscope (позволяет, в частности, находить в C-шном коде по функции ее объявление и использования) был написан в начале 80-х, когда слово рефакторинг еще не придумали.некорректное сравнение
необходимо чтобы он умел гарантировать, что он нашел все использования (и не нашел лишнего) для реального кода, использующего одновременно макросы, шаблоны, виртуальное наследование и т.д.
в C# еще добавляются: замыкания, автовывод типов, extension-ы, yield-ы(cps)
заметны уже на десятках строкНу это ты уже точно преувеличиваешь. 50-60 строк на экран нормального размера помещаются.
А гарантирует ли это решарпер, вот в чем вопрос и первоначальное сомнение, из которых весь этот спор и пошел.
Ну это ты уже точно преувеличиваешь. 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)")? и какого оно типа? какие операции над ним можно сделать?
А гарантирует ли это решарперв целом, да.
зы
более полный ответ на твой вопрос: а что же будет - если замена не однозначна, невозможна или некорректна?
Resharper об этом предупредит, и предложит варианты "а что же делать дальше..."
Эта байка тоже не верна Полноценная навигация по коду и авторефакторинг проявляют себя уже на объеме в сотни строк кодав целом, я с тобой согласен.
я лишь о том, что это еще не критично, и это может компенсироваться чем-то другим, например, возможностью выполнить не полностью согласованный код
в целом, да.Нужно ли это понимать как
"у меня всегда работало, но сколь либо обоснованного утверждения, что оно всегда работает корректно я не встречал"
?
Просто доказательства каких бы то ни было свойств кода - крайне нетривиальная задача, решенная только для некоторых немногочисленных случаев. Так что всякие автоматические "доказательства" корректности, упомянутые ранее, скорее всего являются просто эвристиками, которые хорошо работают на практике, но ничего не гарантируют.
Также я никогда не сомневался, что запутанный код не нужно писать в реальных проектах, кроме самых крайних случаев, коих должно быть крайне мало.
ЗЫ: данный язык программирования мне не знаком, так что сказать, что там написано, я не могу.
Нужно ли это понимать какэто надо понимать так: "у меня всегда работало, но полным строгим обоснованием я не интересовался, мне это не сильно нужно, но предполагаю, что такое доказательство вполне можно сделать".
"у меня всегда работало, но сколь либо обоснованного утверждения, что оно всегда работает корректно я не встречал"
?
Ты математик?
Ты математик?Я программист. Но я глубоко убежден, что каждый программист должен быть еще и немного математиком.
Ладно, с тобой в общем все понятно: ты веришь, в то, что решарпер работает, всегда правильно и вообще обладает чудодейственными свойствами (позволяет и ).
Я программист. Но я глубоко убежден, что каждый программист должен быть еще и немного математиком.одно дело "немного" другое дело требовать всегда строго доказательства.
Ладно, с тобой в общем все понятно: ты веришь, в то, что решарпер работает, всегда правильно и вообще обладает чудодейственными свойствами (позволяет путешествовать во времени и повышает интеллект).
не путай веру и наблюдения в реальном мире .
"у меня всегда работало, но сколь либо обоснованного утверждения, что оно всегда работает корректно я не встречал"это следует понимать как:
?
доказательство корректности преобразования делается для кода, удовлетворяющему набору условий (например, что нет частных обращений через reflection (это с чем обычно борется в примерах на форуме.
а вот проверить и гарантировать, что данный конкретный реальный код удовлетворяет всем этим условиям - не всегда возможно, и обычно это фиксируется в виде договоренности между программистами: как писать можно, а как нельзя.
Также я никогда не сомневался, что запутанный код не нужно писать в реальных проектах, кроме самых крайних случаев,не стоит смешивать запутанный код с выразительным кодом.
может так оказаться, что тот код, который ты привык записывать в виде 30-50 строчек на самом деле соответствует 3-5 операторам выразительного кода, и при такой избыточности в 10-50 раз действительно многие задачи становятся много проще (например, при венгерской записи нет необходимости в утилите, которая выдает тип каждой переменной)
А, ну в такой формулировке - охотно верю.
повышает интеллектинтеллект (человека) не повышается, он просто не расходуется попусту на те задачи, которые можно поручить машине.
с людьми, которые работают с ReSharper-ом, обсуждения задач идет на другом уровне?
да, потому что ReSharper снимает многие ограничения.
Интелект людей при этом, естественно, не меняется .
интеллект (человека) не повышается, он просто не расходуется попустуБедный. Много интеллекта уже израсходовал? Сколько процентов осталось?
понятно, мозги отключились, остался только батхерт
понятно, мозги отключились, остался только батхертНе тупи, я последние 60 постов вообще тут не отмечался, но ты так вкусно кормишь, что я не удержался)
решарпер отслеживает использование IDisposable без DisposeЯ такого не замечал. Что надо включить?
Вот тут менеджер проекта ReSharper говорит, что анализ IDisposable не имеет смысла делать
http://stackoverflow.com/questions/101664/can-resharper-be-s...
Оставить комментарий
uaha1979
Задача:Есть устройство, которое соединяется с ПК через n портов, через одни порты мы получаем инфу от устройства - состояние среды (ветренно, влажно, координаты, итд через другие порты - управляем устройством.
Когда мы получили инфу, мы рассчитываем какой move сделать (тут матстат, тервер, и прочая математика). Далее смотрим, успешен ли move был (стоит ли наше устройство или уже перевернулось). Если move успешен, то мы записываем в базу, что при таких условиях такой-то move успешен, далее эта база будет помогать рассчитывать следующий move.
Все это будет крутиться на linux.
Как связать устройство с ПК, я напишу на "С" - создам n файлов, в которые можно записывать управляющий код или с которых можно считывать инфу.
На каком языке _лучше и проще_ реализовать принятие решений?
Еще вопрос: существен ли дистрибутив linux или нет?