LINUX.ORG.RU
ФорумTalks

[php][история успеха][закопать]

 ,


0

2

Отлаживал тут один скрипт на php, наткнулся на эпичные грабли:

~$ php -r 'echo print_r(2732120973, true)."\n";'
2732120973
~$ # good
~$ php -r 'echo print_r(2732120973>0, true)."\n";'
1
~$ # fine
~$php -r 'echo print_r(2732120973 % 8, true)."\n";'
-3
~$ # FUUUUUUUU...

Они идиоты. Убейте их кто-нибудь. Пожалуйста.

Ответ на: комментарий от PolarFox

>Хм, а какими критериями надо руководствоваться, чтобы выбрать PHP?

Думаю, с учётом его распространённости, критериев таких множество :)

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


Так почему же они писали компилятор PHP, а не пересадили всех на Java? :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

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

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

>Потому что было проще написать компилятор для пыха, чем переписать весь фейсбук на языках более расово верных?

Понятия не имею, я в Facebook не работаю. Могу только за свой выбор отвечать :)

KRoN73 ★★★★★
()

ммм...какой неочевидный и странный баг...все пехепешники наверное вывелись когда узнали про него...
З.Ы.всем ей богу пофигу
З.Ы.Ы. Мы все идиоты в какой-то степени, да)

Byryi
()
Ответ на: комментарий от Deleted

> Живительный RTFM:

Д-да, документированный баг становится фичей. ЧТД. :D

geekless ★★
() автор топика
Ответ на: комментарий от Deleted

А ты вообще в курсе, что получение остатка от деления - это целочисленная операция? И независимо от того, в каком представлении было число ранее, перед операцией взятия остатка пых неизбежно переводит это число в целое. А тут БАМС!!1 и происходит целочисленное переполнение.

Ты только что, двумя сообщениями до этого, пытался мне доказать, что PHP не переводит указанное выше число во float. FAIL. Осиль уже мануал.

А тут БАМС!!1 и происходит целочисленное переполнение.

Проблемы быдлоинтепретатора убогого недоязычка. В Ruby не происходит переполнения. В Python не происходит переполнения.

geekless ★★
() автор топика
Ответ на: комментарий от KRoN73

> Не поможет. Налицо одностороннее восприятие действительности. При программировании на Python или Java для него чтение документации обязательно, а при программировании на PHP — вредно :)

При программировании на Python ман нужно прочитать и понять. При программировании на PHP ман нужно вызубрить как молитву, и всё равно периодически наступать на заботливо расставленные там и тут грабли.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

>При программировании на Python ман нужно прочитать и понять

При программировании на PHP ман нужно вызубрить как молитву


Если не можешь понять целочисленные операции — то да, придётся зубрить.

и всё равно периодически наступать на заботливо расставленные там и тут грабли.


Почему я на них не наступаю? А вот на Java, скажем, с упомянутым кешированием — наступил однажды. Значит ли это, что в Java граблей больше?

KRoN73 ★★★★★
()
Ответ на: комментарий от aho

> а разве в PHP нет даже подобия варнингов из С?

Количество ворнингов в языке напрямую пропорционально убогости его дизайна — чтобы генерировать по ворнингу на каждый костыль. В PHP ворнингов много. Но даже они все не покрывают целиком все возможные костыли.

Да там в каждой главе мануала документировану по костылю. Плюнь не глядя в главу, попадёшь в костыль.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

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

Это же чистый и незамутнённый баттхёрт :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Почему я на них не наступаю?

Почему я не наступаю на грабли в Си? Потому что уровень языка соответствует уровню задач, которые принято решать на нём. Почему я не наступаю на грабли в Ruby? По той же причине.

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

Мне плевать, за сколько времени скрипт возьмёт остаток деления от 2732120973 — за одну операцию на АЛУ или же вызовет библиотечную функцию для обработки чисел произвольной разрядности.

Если бы мне было это важно, я бы писал этот код на сях, а не на скриптовом языке.

Или ты предпочитаешь забивать гвозди отверткой?

geekless ★★
() автор топика
Ответ на: комментарий от KRoN73

> Скажи мне прямо — тебя в детстве что, PHP-программист изнасиловал, что у тебя такая брызжущая ненависть к этому языку? :)

Это же чистый и незамутнённый баттхёрт :)

Да нет, мне просто доставляет общаться со всеми этими удивительными людьми, что собрались в этом треде. :D

Я на пыхе в свое время написал прилично кода, и с особенностями языка знаком хорошо — во всяком случае, был знаком года 3 назад, вероятно, сейчас уже многое позабывал. Но тут пришлось отлаживать один скрипт, а там лежали такие замечательные грабли, что я не мог не поделиться с благодарной общественностью. (Вон вас сколько тут собралось, благодарных ;) )

geekless ★★
() автор топика
Ответ на: комментарий от geekless

>Или ты предпочитаешь забивать гвозди отверткой?

Нет. Гвозди я предпочитаю забивать молотком. Именно поэтому (и только поэтому) пишу сейчас на PHP :)

KRoN73 ★★★★★
()
Ответ на: комментарий от geekless

>Я на пыхе в свое время написал прилично кода, и с особенностями языка знаком хорошо

Топикстарт утверждает, что ты с ним вообще практически не знаком. Точнее, или с PHP, или с целочисленными особенностями популярных языков вообще.

а там лежали такие замечательные грабли, что я не мог не поделиться с благодарной общественностью


У PHP, как и у любого языка, есть свои грабли. Но сабж — это пример твоей безграмотности, не более того. Хочешь примеры реальных граблей на PHP — это смотреть надо в сторону чего-то типа http://www.linux.org.ru/forum/development/3273356 Тут, кстати, тоже результат в рамках правил языка. Но эффект получается неожиданный.

А сабж — это не дефект языка, а дефект программиста. Наступить на такие грабли может только полный дилетант.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Гвозди я предпочитаю забивать молотком.

Именно поэтому (и только поэтому) пишу сейчас на PHP :)


Сочувствую. Вас обманули, подсунув рукоятку от отвертки, вместо молотка.

geekless ★★
() автор топика
Ответ на: комментарий от KRoN73

> практически не знаком. Точнее, или с PHP, или с целочисленными особенностями популярных языков вообще.

Назови мне еще популярных языков, автоматически преобразующих int во float при переполнении int. Не растекайся мыслью по дереву, просто назови.

Я сложил 2 положительных числа. Проверил результат на положительность. Взял остаток от деления. И получил -3. FAIL.

Руководствуясь «целочисленными особенностями популярных языков вообще», я проверил на переполнение. Руководствуясь «целочисленными особенностями популярных языков вообще», переполнения не было. Так с чем я там не знаком, говоришь?

И да — не пользуясь PHP 3 года, я забыл по эту замечательную граблю его арифметики. И именно поэтому PHP сосёт. Его невозможно понять. Его можно только зазубрить.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

s/2 положительных числа/2 целых положительных числа/

geekless ★★
() автор топика
Ответ на: комментарий от geekless

>Вас обманули, подсунув рукоятку от отвертки, вместо молотка.

Интересно, кто это меня обманул? Тем более, учитывая то, что я в своей жизни немало поработал и с отвёртками, и с молотками, и с гаечными ключами, гвоздодёрами, зубилами и дрелями :D

KRoN73 ★★★★★
()
Ответ на: комментарий от geekless

>Назови мне еще популярных языков, автоматически преобразующих int во float при переполнении int

Зачем? Даже если другого такого нет, что это изменит?

Я сложил 2 положительных числа. Проверил результат на положительность. Взял остаток от деления. И получил -3. FAIL.


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

Руководствуясь «целочисленными особенностями популярных языков вообще», я проверил на переполнение


А, так ты из тех, кто в Си++ сравнивает int n = x + y; if(n>INT_MAX) { … } Работал я и с такими, да. Встречаются :D

И именно поэтому PHP сосёт. Его невозможно понять. Его можно только зазубрить.


Удивительное дело, я его не только никогда не зубрил, но даже не учил. Просто начал на нём программировать, когда понадобилось, и уже 10 лет этим занимаюсь. Страшно сказать, я даже не читал всей той документации, которую тут рекомендую читать тем, кто сам догадаться что к чему не может :) Вообще, последний язык, который я _учил_, вооружившись книжкой и т.п., кажется, была Java, где-то в ~1997-м году. Даже уже Perl в ~1999-м «учил» только глядя на чужой код. Так что не понимаю обвинения в сторону PHP. Он просто работает. И весьма логично работает.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> А, так ты из тех, кто в Си++ сравнивает int n = x + y; if(n>INT_MAX) { … } Работал я и с такими, да. Встречаются :D

Без обид, но ты идиот. Ты даже не в состоянии почитать написанное: «Я сложил 2 положительных числа. Проверил результат на положительность».

В игнор.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

>Ты даже не в состоянии почитать написанное: «Я сложил 2 положительных числа. Проверил результат на положительность».

Вот видишь, ты даже не понял о чём я тебе писал :)

В игнор.


Да мне пофиг. Печально только, что подобных тебе горе-кодеров в программировании всё больше и больше :)

KRoN73 ★★★★★
()
Ответ на: комментарий от geekless

Ты только что, двумя сообщениями до этого, пытался мне доказать, что PHP не переводит указанное выше число во float. FAIL. Осиль уже мануал.

Я ничего тебе не пытался доказать. Ещё раз повторяю: float к проблеме из первого поста не имеет никакого отношения. Там обычное целочисленное переполнение. И пусть пых хоть 100500 раз переводит целое в плавающее и обратно - насрать, ибо к проблеме это не имеет отношения.

Проблемы быдлоинтепретатора убогого недоязычка.

Тогда уж проблемы сразу всех убогих быдлоархитектурок убогих былопроцессорчиков =).

В Ruby не происходит переполнения. В Python не происходит переполнения.

Мы все очень рады за руби и пайтон!

Deleted
()
Ответ на: комментарий от geekless

В Ruby не происходит переполнения. В Python не происходит переполнения.

И кстати ты тут совершенно по-свински забыл упомянуть камон лисп 8).

Deleted
()
Ответ на: комментарий от Deleted

> Я ничего тебе не пытался доказать. Ещё раз повторяю: float к проблеме из первого поста не имеет никакого отношения. Там обычное целочисленное переполнение. И пусть пых хоть 100500 раз переводит целое в плавающее и обратно - насрать, ибо к проблеме это не имеет отношения.

Как и следовало ожидать, к прочтению мана оказался не готов.

Дорогой мой, если бы там было обычное целочисленное переполнение, то код $a=2732120973, $a>0 вычислился бы в false. Как и происходит во всех языках с нормальными знаковыми целочисленными 32-разрядными типами, имеющими арифметику переполнением. И моя программ бодро бы сообщила о недопустимом значении переменной, а не стала молча превращать результат вычислений в фарш.

Впрочем, я уже не надеюсь, что до тебя дойдёт. Ты даже ман осмыслить не способен.

Тогда уж проблемы сразу всех убогих быдлоархитектурок убогих былопроцессорчиков =).

Опять у PHPистов железо виновато. Железо плохое, негодное железо, PHPисты в белом, а железо в каловых массах.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

s/арифметику переполнением/арифметику с переполнением/

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Как и следовало ожидать, к прочтению мана оказался не готов.

Дорогой мой, если бы там было обычное целочисленное переполнение, то код $a=2732120973, $a>0 вычислился бы в false. Как и происходит во всех языках с нормальными знаковыми целочисленными 32-разрядными типами, имеющими арифметику переполнением. И моя программ бодро бы сообщила о недопустимом значении переменной, а не стала молча превращать результат вычислений в фарш.

Впрочем, я уже не надеюсь, что до тебя дойдёт. Ты даже ман осмыслить не способен.

Хватит уже употреблять тормозуху!

Код «$a=2732120973, $a>0» вычислился в true, так как в данном случае приведение «обратно» в целое число не потребовалось, а следовательно и переполнение не возникло. И это даже мне понятно, при том, что php я практически не знаю и никогда его не использовал.

Deleted
()
Ответ на: комментарий от Deleted

> так как в данном случае приведение «обратно» в целое число не потребовалось

Таким образом, ты подтверждаешь, что число 2732120973 32-разрядный PHP интерпретирует как float.

А теперь отмотаем тред на сколько-то там сообщений выше... и что мы видим? ОМГ, кто же это писал:

Какой float? Ты его откуда вообще взял?

Ты не знаешь, кто бы это мог быть? Может быть, ты?

geekless ★★
() автор топика
Ответ на: комментарий от Deleted

Ну и еще,

приведение «обратно» в целое число

А нахрена он вообще его конвертировал «туда» во float? Кто его просил об этом? Как в больную голову разработчиков языка могла вообще прийти такая мысль?

geekless ★★
() автор топика
Ответ на: комментарий от Deleted

Код «$a=2732120973, $a>0» вычислился в true

Всё верно:

$ php -r '$a=2732120973; var_dump($a);'
float(2732120973)

If PHP encounters a number beyond the bounds of the integer type, it will be interpreted as a float instead. Also, an operation which results in a number beyond the bounds of the integer type will return a float instead.

Ты ввёл большое число. Оно отконвертировалось во float согласно задокументированному поведению. Сравнение тоже прошло для float. А вот остаток от деления — операция целочисленная. Отсюда и переполнение.

Впрочем, это в теме уже разжёвывали.

KRoN73 ★★★★★
()
Ответ на: комментарий от geekless

Таким образом, ты подтверждаешь, что число 2732120973 32-разрядный PHP интерпретирует как float.

Да мне вообще без разницы: сконвертировалось оно во float или нет. Проблема то, блин, не в этом.

А теперь отмотаем тред на сколько-то там сообщений выше... и что мы видим? ОМГ, кто же это писал:

Какой float? Ты его откуда вообще взял?

Ты не знаешь, кто бы это мог быть? Может быть, ты?

Повторяю ещё раз: приведение во float не виновато. Не виновато оно, слышишь?!

Deleted
()
Ответ на: комментарий от Deleted

> Да мне вообще без разницы: сконвертировалось оно во float или нет. Проблема то, блин, не в этом.

Повторяю ещё раз: приведение во float не виновато. Не виновато оно, слышишь?!

Религия детектед. Повтори еще 9999 раз эту мантру.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

>PHPшники — вот настоящая еда.

Ты же уже подавился, судя по игнору? :)

KRoN73 ★★★★★
()
>>> (-1562846323)%8
5
$ ./a.out 
-3
$ cat t.c
#include <stdio.h>

void main()
{
    int i;
    i = (-1562846323)%8;
    printf("%d\n",i);
}

olegsov
()
Ответ на: комментарий от nu11

подумать о чем?

О ком. О geekless-е очевидно :)

sergej ★★★★★
()
Ответ на: комментарий от geekless

аа, ясно. Разработчики интерпретатора забыли подумать о том, что на нем будут писать нечитающие имбецилы. Так это ж замечательно по-моему.

Ты может чего еще вспомнишь веселого? А то три страницы мусолить подробно описанную в доке особенность (при чем не только пхп) как-то не смешно.

nu11 ★★★★★
()
Ответ на: комментарий от nu11

> подробно описанную в доке особенность (при чем не только пхп)

Выше по треду KRoN73 и mironov_ivan уже зафейлились назвать еще языки, имеющие эту особенность автоматом кастовать int во float при переполнении int-а. Теперь вот и твоя очередь настала.

Блеснёшь или сольёшь и присоединишься к их комании?

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Ты лучше скажи, с какого языка пошла гнусная традиция считать числовой нуль за булевый False.

Не далее как 10 минут назад нашел связанный с этим забавный баг в известной питоновской программе.

Vadim_Z
()
Ответ на: комментарий от Vadim_Z

>Ты лучше скажи, с какого языка пошла гнусная традиция считать числовой нуль за булевый False

Ну, вполне очевидно, что с машинных кодов :)

KRoN73 ★★★★★
()
Ответ на: комментарий от geekless

>имеющие эту особенность автоматом кастовать int во float при переполнении int-а.

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

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

nu11 ★★★★★
()
Ответ на: комментарий от KRoN73

> Ну, вполне очевидно, что с машинных кодов :)

При этом даже в Fortran 77 конверсия целого в логический была нестандартом, а в gfortran-е она и вовсе запрещена по умолчанию.

Боюсь, что корни надо искать в языке C и его популярности.

Vadim_Z
()
Ответ на: комментарий от Vadim_Z

> Ты лучше скажи, с какого языка пошла гнусная традиция считать числовой нуль за булевый False.

Не далее как 10 минут назад нашел связанный с этим забавный баг в известной питоновской программе.


Дык практически с ассемблера.

Чсх, автокаст false в 0 и обратно совершенно не мешает в си++, например. А вот в скриптах из этого получаются те еще замечательные грабли. Особенно если какие-нибудь библиотечный функции могут возвращать false и 0 в разных случаях. Ошибки типа something == false вместо something === false в том же PHP косяками ходят.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Хе-хе, в этом и дело. Но ты забыл сказать, что те же грабли и в питоне лежат.

Баг, описанный в исходном сообщении, состоял в неразличении 0 от None.

Vadim_Z
()
Ответ на: комментарий от Vadim_Z

>При этом даже в Fortran 77 конверсия целого в логический была нестандартом

Боюсь, что Фортран не был первым ;)

Боюсь, что корни надо искать в языке C и его популярности.


В Си эта особенность возникла не спроста. А от машинной оптимальности. В то же Форте, который практически ровесник Си, такой же принцип изначально.

Всё от разных JZ/JNZ, BNE/BEQ и т.п. команд ассемблеров :)



Тьфу, что я про Си/Forth. Бейсик куда как постарше Си будет, да и от железа отвязан — но и там это уже было :D И в Фокале…

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.