crypt of decay - g++, я люблю их! [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

g++, я люблю их! [Mar. 5th, 2009|02:01 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
[Tags|]

хороший, хороший компилятор. режим -O2:
  if (!(dynamic_cast
[Error: Irreparable invalid markup ('<psycplace *>') in entry. Owner must fix manually. Raw contents below.]

хороший, хороший компилятор. режим -O2:
<pre>
if (!(dynamic_cast<PsycPlace *>(cc))) {
qint32 af = cc->authorized() ? 1: 0;
qDebug() << "***uni:" << cc->uni() << "auth:" << af;
}
</pre>
результат: всё, что угодно, только не единица. точнее, третий символ некоей строки, видимо, оставшийся в каком-то регистре.

<pre>
if (!(dynamic_cast<PsycPlace *>(cc))) {
qint32 af = 0;
if (cc->authorized()) af = 1;
qDebug() << "***uni:" << cc->uni() << "auth:" << af;
}
</pre>
результат: аналогичен предыдущему.

<pre>
if (!(dynamic_cast<PsycPlace *>(cc))) {
qint32 af = 1;
if (!cc->authorized()) af = 0;
qDebug() << "***uni:" << cc->uni() << "auth:" << af;
}
</pre>
результат: искомая единица. подозреваю, что зато сломается нолик.

нет, я понимаю, что компилятор — это сложно и ваще. но блядь… как можно искать баги в софте, когда хуй знает, твой это баг или компилятора? я вот тут единицу хочу. именно единицу, не 5, не 10, не 100. она имеет значение, эта единица. а 100 никакого значения не имеет. даже 42 ничего тут не значит.
<p align='right'><small>crossposted from <a href='http://ketmar.no-ip.org/users/ketmar/36065.html'>Vivisector's Home</a></small></p>
Linkmeow!

Comments:
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 01:07 am
(Link)
А есть нормальный компилятор современного Си++ (ну, с STL, можно без Boost:))? (Об ошибках около gcc давно читаю, интересуюсь теоретически, чтобы поставить и не обламываться, если что-нибудь захочу написать на хотя бы тысячу строк.)
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 01:12 am
(Link)
нету, конечно же. нормальный компилятор для цпп вообще написать совершенно нереально в силу монстродурости языка. пока его дотестишь — половину уже переписывать пора. plain C ещё вот кое-как…

впрочем , с gcc не всё так плохо, на самом деле, он таки весьма безглючен. да и -O0 для проверок есть, dumb code совсем-совсем редко ошибается. пишут же вон на гцц — Qt тот же, вебкит — там далеко больше тыщи строк.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 01:36 am
(Link)
Ну, gmp, например, http://www.gmplib.org/ из того, что меня за душу трогает, сильно ругается.

Ошибки скорее стиль программирования вызовет, наверное.
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 01:44 am
(Link)
оооо, нашёл на кого показывать. %-)
это ж стресс-тест компилятора скорее %-), его, наверное, мало кто из (если вообще найдётся такой) *оптимизирующих* компилеров совершенно точно прожуёт.

тем более что, в принципе, никакой вменяемой технологии отладки и автотестинга для оптимизаторов, в общем-то, нет. матдоказательства рассматривать смешно в силу огромности условий. автотесты генерить неизвестно как. а ручные завсегда неполные — тупо невозможно все случаи (с учётом взаимовлияния) рассмотреть. боюсь, что даже автотесты в этом случае будут сильно неподъёмными, только для каких-то суперкластеров. отсюда — мелкий баг в одном месте может таааааак накосорылить…
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 02:08 am
(Link)
Ну, всем трудно жить.

Кстати, напиши что-нибудь про регулярные выражения мне в дневничок — я подумываю (не факт, что это будет реализовано) движок регулярных выражений написать, то ли на Паскале (дань уважения используемому языку), то ли на Си++ (вспомнить язык, с которого начинал после Turbo Basic), может даже попробую с поддержкой Юникода (http://www.unicode.org/reports/tr18/ , но это уж тем более вряд ли: только если интересно будет про языки разные технические подробности узнать). Хочу с синтаксисом определиться.
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 02:11 am
(Link)
а что написать-то? собственно, вряд ли имеет смысл делать синтаксис, отличный от перлового в этом случае. как бы стандарт «де факто», и к нему кучу тестов можно нарыть в этих ваших интернетах.

ну, или вот EBNF, кстати — тоже ведь регулярки, по-сути.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 02:35 am
(Link)
Меня интересуют личные мнения типа: "Вот этой фигнёй я всё время пользуюсь тогда-то и тогда-то, очень удобно и безальтернативно!"

Перловый синтаксис идёт в жопу: я всё-таки хочу регулярных выражений движок написать в основном, а не гарантировать наличие глюков, подобных тем, что меня сподвигают на рассуждения об этой деятельности.

"Back-tracking", который, например, есть даже в POSIX BRE, я точно не собираюсь реализовывать: ибо не знаю, как справиться с "\(.*\)\1", не пожирая неопределённо много памяти и времени (что известно и разумному TRE, см. домашнюю страничку). Собственно, что-то типа TRE и получится в идеале (ну, совсем в идеале — с продвинутой поддержкой Юникода), ну, на нулевой символ, конечно, не предполагается нервической реакции.
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 02:43 am
(Link)
а. так я кроме [] и захватов с жадностью-нежадностью обычно ничего больше и не использую. право, для чего-то сложного проще написать и отладить парзер, чем регулярку. обычно я просто бью на куски простейшей регуляркой (когда разделителями бывают несколько символов или символ из диапазона), а потом уже обычно извращаюсь. ну, не укусил меня Ларри в детстве.

ктстати, а разве TRE не жуёт утф? ну, только что на ноль нервничает.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 02:48 am
(Link)
Ты по ссылке на Юникод смотрел? Поддержка Юникода может быть беспредельной…

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

// выхожу из интернетов до дня
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 02:54 am
(Link)
>Ты по ссылке на Юникод смотрел?
неа, не смотрел, я ленивое. ща гляну.

>А что такое "захваты с жадностью-нежадностью"
ну, обычные скобочки «()», «*» или «+» и модификатор жадности. надо, например, затем, чтобы строку сплитить по регулярке. например, если разделители — пробелы, то надо их жадно съедать все, обычно. а вот если запятые — то тут жадность ни к чему, «,,» вполне может означать пустое поле.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 03:50 pm
(Link)
Запятую надо ловить ",?", если есть или нет.

Можешь уточнить?
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 03:55 pm
(Link)
нет. вот: "a,b,,c"
как это "или нет"? O_O разделитель же. вот типа так:
",+?([a-z]*)"
ну, то есть, по минимиму запятых (но хотя бы одна), и дальше буквы.
ну и ты пы. и вот:
"\s+([a-z]*)"
по максимуму пробелов, и дальше буквы.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 04:04 pm
(Link)
"[a-z]*,?" — если запятая есть, обязана попасть в выражение, все буквы подряд обязаны попасть в выражение.

Если всю штуку, то "([a-z]*,?)*" — но ты не вычленишь их, ибо это не предусмотрено (когда подвыражения с "*" или чем-то таким, ловится только последнее).

Если ровно четыре хочешь, да ещё подвыражениями, то "([a-z]*),([a-z]*),([a-z]*),([a-z]*)" (ну, если в движке для подвыражений нужно "\(", "\)", то соответственно).

Если четыре, а ловить не нужно, то "([a-z]*,){3}[a-z]*".

Поясни.
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 04:09 pm
(Link)
>сли всю штуку, то «([a-z]*,?)*» — но ты не вычленишь их, ибо это не предусмотрено
O_O
«(([a-z]*,?)*»
это раз.
два: «?» — это «0 или 1». а «+» — это «1 или много». разница очевидна же.

зыж вот я и говорю — мне проще руками парзер сделать, чем регулярку сочинять. не кусал меня Ларри.
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 04:10 pm
(Link)
сорри, скобку забыл.
(([a-z]*),?)
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 04:11 pm
(Link)
а вообще, мне хватает примитивного движка из Lua. вот что он умеет:
* (жадное)
+ (жадное)
? (жадное)
— (то же, что и *, не жадное).
всё, даже альтернатив нет. для простого разбиения строк хватает, дальше идут в ход парзеры. что хорошо — исходник движка 20 кил, и никакой там прекомпиляции. и никаких тормозов. ну, и 0 оно отлично лопает (%z).
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 04:23 pm
(Link)
Можешь дать конкретный пример, когда НУЖНО нежадное?
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 04:34 pm
(Link)
да.
«^%s*(.-)%s*$»
это обычный trim. жадное .* слопает всё до конца строки вместе с завершающими пробелами. нежадное — нет.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 05:44 pm
(Link)
???

"^ [\x20\t]* ( [^\x20\t] (.*[^\x20\t])? ) [\x20\t]* $"

Или

"^%s*([^%s](.*[^%s])?)%s*$", если я правильно синтаксис понял

Так что необходимости не вижу.

Если же хочется сокращений, то лучше ввести макросы, по-моему.
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 05:50 pm
(Link)
ты намекаешь, что вот этот вот пиздец проще? да я лучше тогда посимвольный trim напишу. это я даже прочитать ниасилил.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 06:04 pm
(Link)
Если не осилил, то лучше действительно не пользоваться регулярными выражениями.

Длиннее примерно в два раза (я уже послал, что вопросик забыл): разобраться с 12-ю или 26-ю символами — разница небольшая, по-моему.

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

И так много спец. символов, зачем ещё минус?
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 06:15 pm
(Link)
>Если не осилил, то лучше действительно не пользоваться регулярными
>выражениями.

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

>Ради «проще» всё равно лучше макросы
новая сущность. опять усложнение. зачем мне макрос, если я могу присвоить часть регулярки чему-то, а потом соединять части? и, кстати, в тех же частях простейшей же регуляркой перед присоединением менять что надо.

>И так много спец. символов, зачем ещё минус?
потому что «*?» — это два символа. зачем два, если «*», «+» и «?» уже задействованы? опять модификаторы? модификаторы — это усложнение. в доке вообще написано, что любые не alnum можно смело экранировать — потому что это проще, чем запоминать, кто из них особенный. собственно, я так и делаю.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 06:57 pm
(Link)
использовать то, что сложнее, если есть то, что проще?
Тогда проще, короче и понятнее s:=trim(s);.

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

любые не alnum можно смело экранировать — потому что это проще, чем запоминать, кто из них особенный. собственно, я так и делаю.
Тогда и на макросы не жалуйся.
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 07:07 pm
(Link)
>Тогда проще, короче и понятнее s:=trim(s);.
на Lua, пожалуйста. мы сейчас о регулярках, а не о стандартных библиотеках же.

>Тогда и на макросы не жалуйся.
я не жалуюсь, я не понимаю, нахуя они нужны, если регулярки средствами почти любого языка и так можно из кусков спокойно собирать.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 07:18 pm
(Link)
А зачем с кусками возиться?

А так запускаешь выражение и либо получаешь отказ, либо, например, получаешь в переменные проверенные синтаксически три адреса электронной почты, два IP и ещё что-нибудь. Для каждого типа готовы длиннющие выражения, а в выражении для их вытягивания пишешь только что-нибудь в духе {:IP} или {:Email}. Ещё в регулярном выражении недурно воспринимается игнорирование пробелов и возможность писать комментарии.
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 07:27 pm
(Link)
а зачем множить сущности без нужды?

local r0 = [тут-регэксп-мыла];
local r1 = [тут-регэксп-ип];
local email, ip = s:match(r0.."%s+"..r1);

за фигом мне нужны макросы в либе регэкспов? собрал общеупотребительные регулярки в библиотеку, да и всё.

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

единственно, где такое создаст некоторые проблемы — это сиобразные макроассемблеры, где до сих пор нет нормальной работы со строками. ну так ССЗБ, не надо на них подобное писать.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 07:34 pm
(Link)
Ну, если у тебя между ними "%s+", то да. А если ты целую форму хочешь считать, то другое дело.
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 07:37 pm
(Link)
да какая разница? хоть мегакилометр чего-то. нет, я тупо не понимаю, какая разница между моей и твоей записью.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 07:52 pm
(Link)
Можно отдельно править большое регулярное выражение. На двадцать строк запихивать кусочками средствами языка — геморрой. Я ненавижу писать всякие такие штуки на много строк типа: 'a'+b+'c'+d+'efg'+h.
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 07:58 pm
(Link)
ну так у меня тоже отдельные строки. а потом из кусочков составляется что надо. и с комментариями. в чём разница? не, натурально не понимаю.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 08:21 pm
(Link)
В том, что у меня в отдельных файлах регулярные выражения, которые я могу править, не исправляя программы, например.
[User Picture]
From:[info]ketmar
Date:March 28th, 2009 - 07:00 am
(Link)
ну, у меня вот вообще Lua вмонтирована обычно.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 05:45 pm
(Link)
(вопросик общий забыл для серединки)
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 04:12 pm
(Link)
а, да.
(abc)* Lua уже не умеет. то есть, скобки — только для захвата, группу с повторением ними не обозначишь.
[User Picture]
From:[info]ppkk
Date:March 27th, 2009 - 04:22 pm
(Link)
Не понял. А если понял, то это абзац.
[User Picture]
From:[info]ketmar
Date:March 27th, 2009 - 04:35 pm
(Link)
неа, просто Lua никогда не говорила, что у неё есть «регулярки». это так, расширеные wildcards с захватами. для регулярок есть luapcre и lpeg.