[02:27:46] <valexey> "Но при этом я совершенно согласен с мнением Артемия Андреевича, в его посте по итогам изгнания с лепры - элитарные закрытые сообщества крайне подверженны деградации."
[02:27:54] <valexey> http://mymaster.livejournal.com/354726.html
[02:28:00] <valexey> Что-то мне это напоминает :-D
[03:56:58] <vlad2> Гы :)
[04:15:56] <vlad2> Это оно.
[04:16:40] <vlad2> На самом деле не оборонкоре чего-то теплится в виде видео конференций.
[04:43:05] <valexey> Смотрю я на эти видеоконференции, и понимаю что наше приложение будет востребовано :-)
[04:43:16] <valexey> Оно там так и просится для некоторых задников :-)
[05:09:03] <vlad2> Кто здесь? Ты чего не спишь то?
[05:49:59] <vlad2> /me превратил один return функции в три. Ибо нефиг ;-]
[07:35:56] <vlad3> Вести с кукурузных полей: http://oi45.tinypic.com/293x69v.jpg
[07:36:12] <vlad3> (третий день шел дождь)
[07:43:15] <vlad3> Ха-ха-ха. Пошел снег, и будет идти до завтрашнего обеда. А я уже две недели как резину летнюю поставил (фигли, +22 было). Экстрим!
[10:51:00] <valexey> vlad2: в калифорнии демо было, я волновался и поддерживал :-)
[11:02:13] <valexey> http://habrahabr.ru/company/intel/blog/176985/
[11:34:34] <valexey> vlad2: кстати у нас был такой лозунг: "Никакого вёба! Только математика, только хардкор!"
[15:19:12] <ilov_boris> Человеки, подскажите плиз по сям
[15:19:33] <ilov_boris> Вот если я компильнул некую либу в obj
[15:20:41] <ilov_boris> И затем линкую ее со своим поделием
[15:21:08] <ilov_boris> Код неиспользуемых функций будет удален?
[15:21:37] <ilov_boris> Или весь obj будет прилинкован?
[15:30:48] <alexey.veselovsky> зависит от
[15:30:55] <alexey.veselovsky> в некоторых случаях - будет удален.
[15:31:06] <alexey.veselovsky> это называется link time optimisation
[15:31:15] <alexey.veselovsky> умеет ли твой компоновщик это - я не знаю
[15:33:09] <ilov_boris> VS 2012
[15:33:39] <ilov_boris> оно по умолчанию обычно?
[15:33:43] <alexey.veselovsky> не знаю, не щупал. под линухом gold вроде бы умеет
[15:33:53] <alexey.veselovsky> не, это в общем то недавняя фишка
[15:34:14] <ilov_boris> блин придется доки курить
[15:34:25] <alexey.veselovsky> ога :-)
[15:34:31] <ilov_boris> :)
[15:34:43] <alexey.veselovsky> так, я убег на часок.
[16:51:16] <vlad3> ilov_boris: должен выкинуть
[16:51:31] <vlad3> они еще в 6-й версии такое сделали
[16:52:00] <vlad3> Так что MFC-шные проги резко похудели и дельфисты обломались еще раз :)
[16:52:15] <alexey.veselovsky> Злой ты!
[17:29:10] <alexey.veselovsky> xxx: Я как-то спросил "как насчёт вирта?", мне ответили "хорошо))", тогда я попросил объяснить начало 6-й главы "Построения компиляторов", и мне объяснили. Я заработал баттхёрт, так как сам её не читал, закрыл чатвдвоём и больше там не троллирую.
yyy: А не пиздишь? Иначе моя вера в людей окрепла, чёрт возьми!
xxx: Что обидно, это был первый, на ком я опробовал эту смищную шутку.
[20:24:10] <jordan36957> Алексей так как ты программист на С++ хочу задать пару вопросов. Для чего нужно разделение delete и delete [] и в книжках по си пишут после delete p; нужно указатель устанавливать в NULL, почему delete сам не устанавливает. Для чего все эти сложности? Или это фича?
[20:29:22] <vlad2> delete [] нужен, чтобы вызвались деструкторы всех объектов в массиве
[20:30:22] <jordan36957> В вики я это прочитал, но ведь в других языках обходятся одной функцией.
[20:30:55] <jordan36957> Просто free или dispose
[20:30:56] <vlad2> В других языках один и тот же акзатель не может быть указателм на объект и на массив объектоа.
[20:32:01] <alexey.veselovsky> у других языков деструкторов нет
[20:32:07] <vlad2> И это тоже :)
[20:32:10] <alexey.veselovsky> ибо они говно (языки)
[20:32:21] <jordan36957> А если пользоваться нетипизированным указателем?
[20:32:44] <vlad2> По поводу установки в NULL - морально устаревшие советы.
[20:33:01] <vlad2> В смысле если писать в современном силе на C++ - оно неактуально совершенно.
[20:33:10] <vlad2> Как и delete сам по себе.
[20:33:44] <vlad2> Что, если пользоватья нетипизированными указателями?
[20:34:16] <jordan36957> Нетипизированный указатель можно привести как к объетку так и к массиву объектов.
[20:34:32] <vlad2> И?
[20:35:18] <jordan36957> Я имею ввиду ваш\твой? ответ [20:30:58] <vlad2> В других языках один и тот же акзатель не может быть указателм на объект и на массив объектоа.
[20:35:26] <vlad2> Если ты сделал new X, а потом delete Y - то чниего хорошего у тебя не будут - будет UB
[20:36:02] <vlad2> X *p = new X[10];
[20:36:12] <vlad2> p - указывает на &X[0]
[20:36:24] <vlad2> И он же указывает на начало массива X
[20:36:41] <jordan36957> Вроде понятно.
[20:37:27] <vlad2> На самом деле проверку, конечно, можно сделать. Возможно в тот момент боролись за несколько лишних тактов процессора.
[20:37:44] <vlad2> Т.е. да, можно в рантайме проверить, что это указатель на массив таки.
[20:38:02] <vlad2> Просто это никому не надо :)
[20:38:10] <vlad2> Сейчас.
[20:38:41] <jordan36957> Допустим если писать на С++ в процедурном стиле без умных указателей не используя stl, всё в стиле си но с типизированными указателями. Будет ли проверка выхода за границ массива и проверка указателей на NULL? Да я именно хотел узнать почему в рантайме нет такой проверки.
[20:38:54] <vlad2> Сейчас использут смартпоинтеры, которые всегла все удалят правильно.
[20:39:49] <vlad2> В рантайме нет такой проверки, потому что С++ традиционно выжимает максимум произыводительности.
[20:40:08] <vlad2> В дебаге - будут тебе проверки.
[20:40:25] <jordan36957> Так как же на нём программируют?
[20:40:45] <jordan36957> Дебаг версия?
[20:40:49] <alexey.veselovsky> без проблем :-)
[20:41:21] <vlad2> Да, дебаг версия. Зависит от конкретной реализации. VC++ делает кучу проверок.
[20:41:41] <vlad2> Вплоть до обращения к неинициализированным переменным.
[20:41:44] <jordan36957> Я использую mingw.
[20:41:52] <vlad2> Про этот не знаю :)
[20:43:35] <jordan36957> К примеру в оберуне такие проверки не отключаемые, можно просто всегда компилить в дебуг версию. Сильно скорость падает с такими проверками в разы или в десятки раз.
[20:44:29] <vlad2> Если тебе принципиальны проверки индексов массивов, то правильно ерешение - это не дебаг версия, а соответсвующий массив.
[20:44:42] <vlad2> Пишешь свой массив с проверками.
[20:44:46] <vlad2> Компилишь в релиз.
[20:44:52] <vlad2> Работает везде.
[20:45:14] <vlad2> Работает быстро.
[20:45:16] <jordan36957> Автоматом нельзя? Как в паскале. И код проверками не засоряется.
[20:45:23] <vlad2> (быстрее, чем дебаг версия)
[20:45:30] <vlad2> Нет, автоматом нельзя.
[20:45:42] <vlad2> Код не засоряется проверками.
[20:45:49] <vlad2> Код пишется один раз - как std::vector.
[20:46:14] <vlad2> Везде используется твой самописный массив с проверками.
[20:46:55] <vlad2> template <typename T> class MyArray {...T& operator [] (size_T index); };
[20:47:53] <jordan36957> Всё же хотелось бы из коробки. Я понял спасибо. Просто вроде вещь элементарная а нужно свой велосипед делать.
[20:47:58] <vlad2> T& operator [](size_t index){ if (index > this->size) throw exception("out of bounds"); return this->data[i];}
[20:48:17] <vlad2> Ну погугли - найдешь готовое ;)
[20:49:05] <jordan36957> Не хочу связываться с шаблонами, с другой стороны я видел реализацию массивов в си в glibc это ужос
[20:49:48] <vlad2> свой массив - самый простой случай применения шаблонов ;)
[20:52:03] <jordan36957> Так как в массиве все же хранится его длина, компилятор сам может проверять. В общем всё это странно.
[20:52:50] <vlad2> Нет, длина не хранится.
[20:53:46] <vlad2> (в смысле можно, конечно, хранить - в дебаге это все сделано)
[20:54:19] <alexey.veselovsky> ну, менеджер памяти же хранит выделенные блоки
[20:54:25] <alexey.veselovsky> то есть начало и длину
[20:54:33] <vlad2> Короче, "из коробки" - тебе нужен другой язык ;)
[20:54:47] <alexey.veselovsky> искаропка - нинужен!
[20:54:52] <vlad2> Это смортя какой у меня мэнеджер памяти ;)
[20:55:00] <alexey.veselovsky> вообще, с считаю, что пользоваться сырыми массивами в С++ это моветон
[20:55:09] <alexey.veselovsky> есть std::vector, есть std::array
[20:55:14] <alexey.veselovsky> вот ими и пользоваться
[20:55:21] <vlad2> Дык, да. Но товарищу нужны проверки :)
[20:55:45] <vlad2> В std::vector проверяется только at(), а ему очевидно захочется []
[20:55:46] <alexey.veselovsky> vector::at()
[20:56:03] <alexey.veselovsky> чем at не устраивает? вполне кошерно
[20:56:45] <alexey.veselovsky> помню в какой-то аццко-математической лабе Сестра как раз at пользовала - сильно помогало
[20:56:47] <vlad2> jordan36957: самый простой дубовый способ: template <typename T> class MyArray : public std::vector<T> { operator [](); }
[20:56:57] <vlad2> И делаешь там проверку,
[20:57:14] <vlad2> return this->at(index);
[20:57:20] <jordan36957> Сырые массивы проще m[i] := 5; Если пользоваться stl тем же vectorom нужно какие то итераторы вводить да и синтаксис странный.
[20:57:34] <alexey.veselovsky> не надо
[20:57:40] <vlad2> Понятно. Ты ж все таки попробуй ;)
[20:57:43] <alexey.veselovsky> v[i] = 666;
[20:57:47] <alexey.veselovsky> и все ок
[20:57:56] <jordan36957> Перегрузка операторов?
[20:58:02] <alexey.veselovsky> yep
[20:58:04] <vlad2> Дык.
[20:58:16] <Kemet> аа, я сегодня таки завершил непосильный мегатруд по переписыванию с сей на активоберон целой звуковой карты, теперь могу слушать музыку, мегарад )
[20:58:24] <alexey.veselovsky> это ж плюсы - язык созданный для писателей либ. это вам не Оберон :-)
[20:58:38] <alexey.veselovsky> kemet: откуда портировал?
[20:58:47] <Kemet> бсд
[20:59:11] <alexey.veselovsky> бсд рулид, да
[20:59:21] <Kemet> на след неделе попробую из линукса чего нитьт, сетевушку наверное
[21:00:54] <Kemet> а хайка замудреная какаято ну нафик
[21:01:27] <alexey.veselovsky> :-)
[21:01:32] <jordan36957> Весь сыр бор в том, что в паскале я создал список list и функции для добавления обработки, но так как лист pointer каждый тип нужно приводить, что не удобно, шаблоны в free pasal можно применять только к классам. Хотелось бы что, то более простое.
[21:01:42] <alexey.veselovsky> архитектура! не все в одно же лепить. это вам не монолит!
[21:01:57] <Kemet> куних еще посмотреть чтоли
[21:02:08] <alexey.veselovsky> qnx - микроядро.
[21:02:30] <Kemet> драйвера там должны быть интересные
[21:02:46] <jordan36957> Minix 3 микроядро.
[21:03:00] <jordan36957> С сервером воскрешения :-)
[21:03:06] <Kemet> в миниксе дров почти нет наверное
[21:03:29] <jordan36957> Дистр весит 600 мег
[21:03:58] <jordan36957> Уж какие то драйвера точно должны быть.
[21:04:17] <Kemet> какието и в А2 есть )\
[21:06:27] <jordan36957> Смотрел в вики новый стандарт С11 в него добавили новые интерфейсы для проверки границ масива, никто не знает, что за интерфейсы?
[21:06:59] <alexey.veselovsky> Это не то что ты думаешь
[21:07:41] <alexey.veselovsky> Это набор стандартных функций которые типо безопасные. Ты же понимаешь, что в Си массивов как таковых нет.
[21:08:41] <alexey.veselovsky> Поэтому я люблю С++ а не Cи (хотя, иногда и Си прекрасен)
[21:11:52] <jordan36957> Всё же он сложен, если на нём писать как на си то да. Просто процедурный стиль. Но то, что нет элементарных проверок из коробки, я не могу понять чем думал Страуструп.
[21:12:24] <alexey.veselovsky> А я не понимаю нафига они нужны
[21:12:28] <jordan36957> Лямбды, шаблоны, замыкания есть проверок нет.
[21:12:29] <alexey.veselovsky> Их даже в Обероне нет :-)
[21:12:41] <jordan36957> ???
[21:12:45] <alexey.veselovsky> !!!
[21:12:57] <alexey.veselovsky> Найди мне в Оберон-репорте упоминание проверок границ
[21:13:18] <alexey.veselovsky> Хоть в репорте оригинального оберона, хоть новейшего от 2011 года
[21:13:42] <jordan36957> Так в этом и главное достоинсто оберона. Но ведь в реализованных компиляторах она есть?
[21:14:06] <jordan36957> На сайте Info21 читал, что они не отключаемые.
[21:14:07] <alexey.veselovsky> Главное достоинство Оберона в том, что там нет проверок? :-)
[21:14:12] <alexey.veselovsky> Нет, не во всех ;-)
[21:14:17] <alexey.veselovsky> Ты больше info21 читай, ога
[21:14:33] <jordan36957> В том что проверки есть. Я не правильно выразился.
[21:14:34] <alexey.veselovsky> http://www.inf.ethz.ch/personal/wirth/Articles/Oberon/Oberon.Report.pdf
[21:14:41] <alexey.veselovsky> http://www.inf.ethz.ch/personal/wirth/Articles/Oberon/Oberon07.Report.pdf
[21:14:47] <alexey.veselovsky> найди там проверки
[21:16:30] <jordan36957> Но ведь на практике их реализуют?
[21:17:03] <jordan36957> Герметичность типов, сборка мусора и всё такое.
[21:19:48] <alexey.veselovsky> Сборка мусора также опциональна
[21:20:00] <alexey.veselovsky> На практике их могут реализовывать а могут не реализовывать
[21:20:17] <alexey.veselovsky> в XDS например проверки можно отключть
[21:20:28] <alexey.veselovsky> А в некоторых реализациях их нет вообще.
[21:20:43] <alexey.veselovsky> Это ничему не противоречит.
[21:20:45] <jordan36957> не для холивара ради, а токмо постичь сию суть языка с++. Почему при создании С++ не были реализованы такие проверки, чем руководствовался создатель языка, совместимость, быстродействие?
[21:21:22] <alexey.veselovsky> А info21 знает о обероне (как ЯП) не больше чем знает С++ тот, кто в резюме пишет: "знаю язык VisualC++"
[21:21:45] <alexey.veselovsky> Тем что они не нужны. Если тебе нужен массив с проверками - ты с полпинка его реализуешь и дальше используешь
[21:21:49] <alexey.veselovsky> В виде либы
[21:22:03] <alexey.veselovsky> И никакого ущерба от этого ты не имеешь.
[21:22:38] <jordan36957> std::string с проверками?
[21:22:46] <alexey.veselovsky> есть std::vector, есть std::array, можно элементарно сделать свой тип который будет над ними и с проверками
[21:22:53] <alexey.veselovsky> все будет безопасно и няшно
[21:23:17] <alexey.veselovsky> можно реализовать отладочную сборку с проверками
[21:23:27] <vlad2> jordan36957: не понтов ради: нет у профессиональных программистов ошибок с индексацией
[21:23:40] <vlad2> в смысле процент этих ошибок совершенно ничтожен
[21:23:48] <alexey.veselovsky> угу. тем более что прям таки по индексу со строками обычно не работают
[21:24:03] <jordan36957> Проход по строке по индексу.
[21:24:13] <vlad2> во всех местах, где возможна проблемы с индексацией ставятся проверки
[21:24:18] <alexey.veselovsky> нет, не по индексу
[21:24:30] <alexey.veselovsky> а банально через for_each
[21:24:54] <vlad2> Угу. Вообще "опускаться" до уровня индексов приходится редко. Это ж не оберон.
[21:25:00] <alexey.veselovsky> зачем мне рантайм проверки, если мы можем все это проверить во время компиляции?
[21:25:19] <jordan36957> Индесы ведь сами по себе очень просты и в понимании и в реализации.
[21:25:36] <jordan36957> Да и удобно с ними.
[21:25:38] <alexey.veselovsky> Угу. И не проверяемы на этапе компиляции
[21:25:53] <alexey.veselovsky> И тебе не поможет рантайм проверка если у тебя индекс вылезет за границу во время старта ракеты
[21:26:08] <alexey.veselovsky> Будет HALT и основного и резервного компа
[21:26:11] <alexey.veselovsky> И привет
[21:26:28] <jordan36957> Я имею ввиду pascal. Ты имеешь ввиду ариан 5?
[21:26:57] <jordan36957> Хоть узнаем в какой строке произошла ошибка и её можно исправить.
[21:27:08] <alexey.veselovsky> не узнаем. она самоуничтожится
[21:27:26] <vlad2> В ариан 5 был не индекс :)
[21:27:29] <jordan36957> Но как можно проверить динамический индекс при компиляции?
[21:27:37] <alexey.veselovsky> также мы нифига не узнаем в случае если оно сбойнет скажем в нашем устройстве, у которого памяти 512 БАЙТ
[21:27:47] <vlad2> valexey лукавит - в общкм случае конечно нельзя проверить
[21:27:50] <jordan36957> А что за устройство?
[21:28:06] <alexey.veselovsky> Динамический индекс проверить нельзя, поэтому мы выкидываем индексы в принципе
[21:28:13] <alexey.veselovsky> http://oxirate.com/
[21:28:17] <alexey.veselovsky> вот это
[21:30:07] <jordan36957> 512 байт для данных и кода или всё раздельно. И их программируют на С++?
[21:30:16] <alexey.veselovsky> Да, на С++
[21:30:40] <alexey.veselovsky> 512 это для данных. Это ОЗУ. Программа шьется на флеш, там килобайт 16. Оно только на чтение.
[21:30:41] <Kemet> на там флешь еще
[21:30:45] <alexey.veselovsky> Модель памяти - плоская
[21:31:06] <alexey.veselovsky> 512 - это стек, куча, вообще все что может меняться.
[21:31:08] <jordan36957> Интересно помотреть как выглядит подобный код на С++, не именно из вашего проекта а вообще.
[21:31:42] <vlad2> Ну std::vector mfv не будет, но темплейты никто не запрещает :)
[21:31:44] <alexey.veselovsky> Код как код. Ничего интересного :-) Я в подобные устройства писал на современном С++ - с лямбдами и прочими радостями
[21:32:17] <jordan36957> А что там за процессор, в смысле скорость?
[21:32:33] <alexey.veselovsky> а что такое скорость процессора? :-)
[21:32:38] <alexey.veselovsky> там msp430
[21:32:40] <jordan36957> nhz
[21:32:45] <jordan36957> mhz
[21:33:02] <alexey.veselovsky> mhz тебя обманут :-) они не дадут представления о скорости
[21:33:14] <alexey.veselovsky> Там до 20 МГц. Но это ни о чем не говорит
[21:33:30] <jordan36957> Я читал в книге Таненбаума об архитектуре 8051.
[21:33:41] <alexey.veselovsky> ну, это не 8051 :-)
[21:34:39] <Kemet> да, мегагерцы это туфта, у нас есть собственный pdp-11 на 16 mhzб но у него 4-х ступенчатый конвеер и два ядра которые можно спарить, и ак тут по састоте о производительности судить
[21:35:39] <alexey.veselovsky> маркетинговый булшит эти мегагерцы
[21:36:03] <alexey.veselovsky> также как и ядра. как и все остальное - ибо они упрощают сверхмеры. нельзя между двумя процессорами ставить ровно один знак больше или меньше.
[21:36:12] <alexey.veselovsky> у процессоров МНОГО характеристик.
[21:36:38] <alexey.veselovsky> а уж если говорить о System On Chip...
[21:37:20] <alexey.veselovsky> ладно, я домой
[21:38:06] <jordan36957> Я так глубоко не углублялся в процессоры, но книгу архитектура компьютера прочитал с восхищением. понравилась фраза архитетектура Pentium 4 основывается на 3 китах совместимость, совместимость и ещё раз совместимость. :-)
[21:39:40] <Kemet> и эта совместимость тянет кучу проблем с допотопных времен
[21:41:39] <jordan36957> Получается процессор x86 может содержать любую архитетуру, но поверх есть микрокод который и интерпритирует x86.
[21:42:46] <jordan36957> реально ли на i7 будут запускать dos. Думаю проще воспользоваться программным эмулятором.
[21:50:38] <jordan36957> И ещё один вопрос. К примеру игра Battke of Wesnoth сам exe весит 20 мегов и отдельно идут библиотеки gtk и sdl. В коде используются векторы списки. Сама игра не такая уж и сложная. Это вес зависит от количества типов в шаблона? Есть шаблон но на каждый тип будет генерироваться другие функции, для работы только с этим типом? Или генерируются толкь одна функция, но при работе с используется привидение типа. Это зависит от ключа компиляции?
[21:55:20] <Kemet> freedos нормально запускается вроде
[21:56:31] <jordan36957> Я имел ввиду саму неоходимость запускать дос на i7.
[21:57:04] <jordan36957> В любом случает будут запускать в эмуляторе.
[21:57:38] <Kemet> ктото ее до сих пор использует а некоторые пароизводители поставляют системники с предустановленной freedos
[21:59:58] <jordan36957> Совместимость осталась, но нужна ли к примеру совместимость с 286. Когда я в прагме работал завесли ноутбуки с freedos, черный экран, пробывал запусить хот какойнибудь файл менеджер, но в самой поставке freedos его не было. Просто черный экран с командной строкой.
[22:02:14] <jordan36957> За отказ от windows делают скидку в 300-500 рублей.
[22:02:39] <Kemet> ))
[22:03:36] <Kemet> зачем экономить 300 руб на винде?
[22:04:37] <jordan36957> Я не знаю. таких случаев не было, но само право отказа есть.
[22:05:19] <Kemet> конечно есть, уменьшается на стоимость винды
[22:05:34] <jordan36957> 300 рублей.
[22:06:13] <Kemet> у меня товарищь брал ноут и отказался от винды, ему возместили еес стоимость
[22:06:28] <jordan36957> Может цену подняли, возможно всё зависит от политики самого магазина.
[22:06:37] <jordan36957> Полная стоимость это сколько?
[22:06:55] <Kemet> тыщи 2 было, оем же
[22:08:46] <jordan36957> Как раз на сумку хватит.
[22:12:24] <jordan36957> В интернете в спорах delphi vs c++, спор плавно перетикает в меряние скорости циклов. :-)
[22:16:11] <Kemet> оно всегда к этому скатывается
[22:30:47] <vlad3> jordan36957: еще по поводу отсутствия проверок индексации:
[22:31:10] <vlad3> Следует понимать, что сишные массивы - это синтаксический сахар над указателями.
[22:31:36] <vlad3> Т.е.: arrat[i] это ни что иное как *(array + i)
[22:32:13] <vlad3> Gj'njve вполне нормальная сишная практика иметь, например, такие структуры:
[22:32:22] <jordan36957> В С++ тоже?
[22:32:43] <vlad3> struct X { char data[1]; }
[22:33:26] <vlad3> X* x = malloc(1000); x.data[100] = 'x'; // абсолютно валидный сишный код
[22:34:00] <vlad3> С++ декларирует совместимость с С (насколько это возможно).
[22:34:32] <vlad3> Т.е. отсновные отличия С++ - строгая типизация и возможность создавать сложные абстракции.
[22:34:47] <vlad3> Что касается указателей - полная совместимость на ваш страх и риск :)
[22:35:18] <vlad3> Не хотите делать свой массив с проверками - используйте сишный без проверок ;)
[22:37:27] <jordan36957> Как раз его и не хочется использовать, потому, что без проверок. Но как тогда пишут программы на си, к примеру wget, работает с текстом. На чистых массивах, долгая отладка и везение? :-)
[22:37:36] <jordan36957> Без stl в С++ ckj;yj/
[22:37:49] <jordan36957> Без stl в С++ сложно.
[22:37:50] <vlad3> Да. Трудоемко это все, но возможно.
[22:38:58] <vlad3> Опять же - масса сишного кода это прежде всего наследние.
[22:38:59] <jordan36957> А само написание на си wgetа оправдывается? Программа более производительная? Много софта для линукс пишется на си, даже тот же gtk и gnome.
[22:39:16] <vlad3> Сейчас не так много задач, где нужен действительно См.
[22:39:18] <vlad3> Си.
[22:39:45] <vlad3> gtk и gnome - это фрэймворки - там это оправдывается
[22:40:10] <jordan36957> gnome же среда, десктоп.
[22:40:40] <vlad3> По поводу wget - уже не так однозначно. Безусловно там есть часть, которую лучше писать на сях (что касается непосредественного взаимодействия с нетворкой и ОС).
[22:41:10] <jordan36957> sdl_net. можно хоть на паскале.
[22:45:02] <jordan36957> К примеру в паскале строки и массивы сделаны с проверками, хотя её можно и отключить. Само написание очень легко, я работаю только с индексами, без тяжеловесных конструкций vector string. Я понял, что проверки можно реализовть на шаблонах, всё это сделано для совмесимости. Может это и правильно всё делать через библиотеки.
[22:57:34] <valexey> vlad2: тут есть нюанс. даже если задача требует работы с голыми указателями, все равно её лучше писать на С++ а не на Си
[22:57:56] <valexey> Пусть это даже будет подмножество С++ слабо отличимое от Си.
[22:58:32] <valexey> Дело в том, что один фиг у С++ строгая типизация. То есть код лучше компилить С++ компилером.
[22:59:56] <valexey> Важно понимать, что Си и С++ разные языки и один не является подмножеством другого.
[23:00:16] <valexey> А вот ObjC - вот он да, чистая надмножество для Си99.
[23:02:29] <vlad2> Да, даже если писать на сях без плюсов - лучше прогонять это все плюсовым компилятором.
[23:02:51] <vlad2> сколько-то ошибок можно будет поймать сразу.
[23:04:06] <vlad2> jordan36957: vector и string - это не тяжеловеные конструкции
[23:04:29] <jordan36957> Для восприятие, не для процессорного времени.
[23:04:44] <valexey> Вообще, не понятно что это народ так шаблонов да плюсов пугается. Вон, мне на хакатоне потребовался кольцевой буфер, я взял да реализовал его за 5 минут.
[23:04:44] <vlad2> Восприятие оегко адаптируется ;)
[23:04:47] <valexey> template <size_t N>
struct ring_buffer {
float buf[N];
size_t head;
size_t size;
ring_buffer():head(0), size(0) {memset(buf, 0, sizeof(buf));}
void push_back(float v) {
if (++head >= N) {head=0;}
if (size<N) size++;
buf[head]=v;
}
float back() {return buf[head];}
float front() {return buf[head!=N-1?head+1:0];}
};
[23:05:04] <valexey> можно было еще и тип зашаблонить. но мне было это не нужно.
[23:05:26] <valexey> а если бы я все делал на массивах... Багов было бы....
[23:06:42] <vlad2> jordan36957: когда я вижу в коде delete и массивы (голые) - мне сразу страшно ;) Потому что "тут лучше ничегоне трогать если работает",
[23:06:45] <vlad2> ;)
[23:07:15] <vlad2> А если не работает - то восстановить логику и переписать нах :)
[23:09:52] <jordan36957> Может дело в привычке, так сказать нужно набить руку в программировании. С другой стороны вы программисты по специальности и этим занимаетесь, я как маленькое хобби. Хотя область программирования мне очень интересна.
[23:11:12] <jordan36957> Для меня индексация в паскале, очень радует, прозрачна и не перегружена лишними примочками + проверка.
[23:11:29] <jordan36957> Шаблоны в любом случае гибче.
[23:12:02] <vlad2> Конкретно наличие "delete" означает потенциальную проблему с исключениями и потенциальную проблему "удалить не то, что надо". Т.е. с этим кодом ничего нельзя делать :) Никакие не предрассудки - чистая прагматика.
[23:12:28] <vlad2> С индексацией тоже самое - раз она есть, значит может бвть "out of index".
[23:13:03] <jordan36957> Но ведб с проверкой если она будет программа о ней сообщит, бояться не надо.
[23:13:03] <valexey> когда дело доходит до рантайм проверки - это уже все, алес
[23:13:25] <valexey> гг. кому оно сообщит, если это сервер который должен работать 24x7x365?
[23:13:33] <valexey> у которого нет монитора и вообще нифига.
[23:14:24] <jordan36957> Значит это не глобальная ошибка. Если сглючит само ядро это программы, то всё капут.
[23:14:26] <valexey> Бояться не надо было бы если бы в случае ошибки была бы просто ошибка компиляции.
[23:14:57] <valexey> В смысле не глобальная? В паскале, если мне память не изменяет, в случае выхода за границу банально HALT и все.
[23:15:05] <valexey> Без возможности отстрелить поврежденную часть.
[23:15:30] <jordan36957> Да, какой смысл выполнять программу дальше, если данные будут зпороты.
[23:15:56] <jordan36957> Возможно если эти данные не глобальные, а на примере запроса, еще раз сделать запрос.
[23:16:23] <vlad2> valexey прав, основное достоинство проверок только в предсказуемости падения. С точки зрения результата - не важно почему оно не работает из-за сработавшей проверки или из-за порчи памяти. Поэтому код с индексацией лучше не писать ;)
[23:17:10] <valexey> jordan36957: это была ПОПЫТКА порчи памяти. мы её предотвратили. тот алгоритм который это делал - плохой, негодный и не реализовался.
[23:17:19] <valexey> В этом случае можно пойти по альтернативной ветке.
[23:17:29] <valexey> Если бы это был не HALT а кошерное исключение.
[23:17:35] <valexey> Можно было бы восстановиться после сбоя.
[23:18:15] <jordan36957> Уверен что в free pascal такое есть, хотя нужно уточнить.
[23:18:26] <valexey> Да, это ж делфи - там есть исключения.
[23:18:29] <valexey> А вот в паскале этого нет.
[23:18:33] <valexey> И в Обероне нет.
[23:18:46] <jordan36957> А как в оберуне восстанавливаются:
[23:18:55] <jordan36957> На нём ос написана.
[23:19:00] <valexey> Никак. HALT и привет.
[23:19:24] <valexey> Если ты пишешь ось, то тебе пофигу на возможности языка - ты можешь слепить что угодно, у тебя полная власть.
[23:19:29] <jordan36957> Такая\ модель применяется в комерческом софте?
[23:19:54] <valexey> В смысле? Восстановление после исключения? Да, применяется.
[23:20:01] <jordan36957> наоборот.
[23:20:36] <valexey> Чтобы при малейшем чихе приложение дохло? Да, применяется, но в этом случае запускается множество приложений, они друг друга дублируют и резервируют. И перезапускаются.
[23:20:58] <valexey> unix way :-)
[23:21:43] <jordan36957> На серверах linux стоит, может такая модель и не так плоха?
[23:22:01] <valexey> Зависит от задачи.
[23:22:32] <jordan36957> Как минимум для понимания она проще, не нужно делать лишних телодвижений. Но и ограниченней.
[23:22:46] <valexey> Но опять таки - такая модель, это лечение симптомов болезни, а не самой болезни. Выпилив работу с индексами (а значит убрав адресную арифметику) везде где возможно, мы лечим причину болезни - не будет падений и халтов.
[23:23:13] <vlad2> Угу.
[23:23:42] <vlad2> При том, что на С++ можно придумать много штук, чтоб не использовать индексацию.
[23:23:43] <jordan36957> Но разве поиск в vector идет не по номеру?(сам индекс)
[23:23:48] <vlad2> В отличие от оберонов.
[23:24:00] <valexey> Индексы, хоть в паскале, хоть в обероне - это слегка загримированная адресная арифметика. Со всеми вытекающими.
[23:24:10] <vlad2> Поиск идет в std::find. В том числе и по вектору.
[23:24:22] <valexey> То есть по итератору :-)
[23:24:34] <jordan36957> Итератор это индекс?
[23:24:52] <vlad2> Не важно. Важно то, что оно написано и отлажено. И ты туда багов не счажаешь.
[23:24:59] <valexey> Нет, итератор это итератор :-)
[23:25:43] <valexey> C точки зрения сишника итератор это такой сложный указатель, с точки зрения приплюсника, указатель это такой кастрированый итератор.
[23:27:15] <valexey> Вот что такое индекс в случае hash_map? ;-)
[23:27:42] <valexey> Или в случае красно-черного дерева
[23:30:05] <jordan36957> указатель на запись
[23:32:14] <valexey> Нет.
[23:32:29] <valexey> То есть это частный случай.
[23:34:28] <valexey> Да, у меня на этом хакатоне было МНОГО работы с индексами. Было много циклов. Иногда глубина вложенности циклов достигала пяти. Так вот, я не помню проблем из за того, что кто-то куда-то вылез за границу массива а оно взяло и не упало.
[23:35:00] <valexey> Да, поясню - было много работы с индексами, много-много циклов и мало-мало времени.
[23:35:34] <valexey> Да, и отладчиком пошагово ходить по всем циклам не представлялось возможным - там ОЧЕНЬ много итераций. В отладчике просто сдохнешь.
[23:35:37] <valexey> И это С++
[23:37:07] <valexey> Да, если бы у меня была бы штука с неотключаемыми проверками индексов, то это сожрало бы четверть производительности. То есть вместо 18-20 кадров в секунду я получил бы 13-15. А это не приемлемо.
[23:41:04] <jordan36957> Так итератор не может выйти за свои границы? Значит в нутри ему все равно нужно сравнивать длину и текущую позицию. Те же проверки и те же тормоза.
[23:42:22] <valexey> смотря какой и смотря где :-)
[23:43:08] <valexey> в общем, я не понимаю этой возни вокруг проверок выхода за границы
[23:43:43] <jordan36957> Если проверки не будет, и произойдет ошибка программа может и не упасть, но глючить будет жёстко. И понять без проверки где ошибка только в отладчике или во включении проверок и перекомпиляции для последующего запуска.
[23:44:37] <valexey> для этого существуют логи
[23:45:11] <jordan36957> Можно считать, что проверка, эдакий реал тайм лог который реалтзует компилятор.
[23:45:56] <valexey> обычно хреново реализует :-) ну, то есть он тебе в 80 процентах не даст достаточной информации чтобы понять ПОЧЕМУ там случилась бяка.
[23:46:18] <valexey> Ну и покрывает он только один, очень узкий и очень редкий класс ошибок. При это сжирая производительность.
[23:47:38] <vlad2> jordan36957: В общем случае ты конечно прав - проверки хорошо - тут спорить не о чем. Мы тут с valexey просто пытаемся тебе сделать поправку на реальномть. В реальности проблема с проверками индексов раздута теми, кто не умеет работать без них.
[23:48:10] <vlad2> И в реальности проверка имеет свои недостатки - производительность.
[23:48:26] <vlad2> Поэтому в реальности приходится делать выбор - хочешь ты иметь эту проверку или нет.
[23:49:10] <vlad2> Невалидный итератор получить очень легко. Опять же - если не уммешь пользоваться.
[23:49:59] <jordan36957> Согласен. В книге о free pascal тоже было написано, что для производительности после тестирования некоторые проверки можно отключить.
[23:50:02] <vlad2> Смысл всей этой дискусси в том, чтобы донести тебе идею о том, что не стоит зацикливаться на индексах.
[23:50:12] <valexey> Да, за рантайм-проверку в основном ратуют те, кто пишут также как писали 20 лет назад :-)
[23:50:40] <valexey> Или даже 30
[23:50:48] <jordan36957> Я пользуюсь и списками, в зависимости от задачи, отличия массива от списка я знаю. А как они писали?
[23:51:24] <valexey> А они писали так, что каждый раз, для каждого типа реализовывали ручками абстракцию, например список.
[23:52:18] <valexey> И не пользовались обобщенными алгоритмами. То есть алгоритмами которые не зависят от типа данных, но при этом сохраняют строгую статическую типизацию.
[23:52:24] <vlad2> Если говорить о С++, то это std::vector и std::list. Для них есть гтовые алгорититмы в STL. Они покроют 95% твоих нужд. Остальные 5% - твоя забота о валидных итераторах :)
[23:52:26] <jordan36957> Я к стати в своей программе с этим столкнулся. есть pointer но каждый раз приводить тип громоздко(визуально)
[23:52:44] <valexey> Это не столько громоздко, сколько не безопасно.
[23:52:53] <valexey> Кто-то может туда тебе подложить не тот тип :-)
[23:53:01] <valexey> У тебя дыра в типизации.
[23:53:20] <jordan36957> Список скрыт, а на ружу выдаются типизированные типы и функции
[23:53:23] <vlad2> Угу. Велкам в шаблоны ;)
[23:53:48] <valexey> а потом придет другой программист и залезет в твой модуль. и чутка пофиксит. и привет.
[23:54:02] <jordan36957> Шаблоны в free pascal только для classов
[23:54:18] <jordan36957> А менять язык нехочется.
[23:54:28] <vlad2> Ну извините :) Причем тут тогда С++? :)
[23:55:04] <valexey> Более того, когда я вижу std::list<MyItem> item_list; я понимаю что в этом списке будет лежать, а когда я вижу просто List items; // хз что там будет и зачем оно нужно.
[23:55:22] <jordan36957> Если нужно то конечно поменяю, так сказать прощупываю почву. :-)
[23:55:23] <valexey> то есть код еще и читабельнее становится
[23:55:43] <vlad2> Угу - там появляются комментарии, потому эти комментарии устаревают, и потом код становится нечитабельным :)
[23:57:29] <valexey> jordan36957: советую посмотреть на D. Он проще плюсов. Все шаблонные плюшки там присутствуют. Проверка границ массива там есть по умолчанию.
[23:57:50] <valexey> http://dlang.org/comparison.html
[23:57:57] <valexey> И даже сборщик мусора есть :-)
[23:58:03] <valexey> И не требует виртуальной машины.
[23:58:30] <jordan36957> Так как ядро linux написан на си, в нём полно таких дублирующихся структур и функций? В нём уже 10 мл строк.
[23:58:49] <valexey> нет. там есть макросы :-)
[23:59:07] <valexey> с помощью макросов и такой-то матери можно изобразить подобие шаблонов :-)
[23:59:34] <valexey> если бы в Сях не было бы макросов, то Си бы уже сдох.