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...

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

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

Да, intval(2732120973) == -1562846323 — это нелепый и тупой баг дизайна языка.

$ ./int32
-1562846323

$ cat int32.c
#include <stdio.h>

int main()
{
	printf("%d", 2732120973);

	return 0;
}

Ой.

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

>В том что целые только 32битные (какие они, кстати на x64?) и на это никак нельзя повлиять.

rly?

nu11@dskr:~$ php -r 'echo gmp_strval(gmp_mod("2732120973", "8")) . "\n";' 
5

>какие они, кстати на x64?

соответствующей длины конечно.

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

В том что целые только 32битные (какие они, кстати на x64?)

Выше был пример:

$ php -r 'echo intval(2732120973);'
2732120973

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

Ой.

Ну если вам приятно прогать на «системном языке», тады действительно ой.

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

И в том, что приведение float к integer — по сути содержит в себе фееричненькое UB, которое не генерирует, цитирую, «ни предупреждения, ни даже замечания».

$ perl -e 'use strict; print 123.456 % 11;'
2

Ой. Ни предупреждения, ни даже замечания.

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

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

Да, intval(2732120973) == -1562846323 — это нелепый и тупой баг дизайна языка. Если ты этого не в состоянии осознать, плохие новости как раз для тебя.

А теперь смотри сюда:

$ cat test.c 
#include <stdio.h>

int main()
{
	int x, y;

	scanf("%d", &x);
	y = x % 8;
	printf("%d\n", y);

	return 0;
}

$ gcc test.c -o test

$ ./test 
2732120973
-3

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

Любой, кто учился в школе, знаком с целыми числами и целочисленным делением

Именно так. И сабжевый случай вызывает какие-то вопросы только у неучей. В отличие, скажем, от такого:

class Test
{
    public static void main(String[] args).
    {
        for(int i = 125; i < 130; ++i).
        {
            Integer a = i;
            Integer b = i;
            System.out.println(""+a+" == "+b+" => " + (a == b));
        }
    }
}


$ java Test
125 == 125 => true
126 == 126 => true
127 == 127 => true
128 == 128 => false
129 == 129 => false

Сейчас тоже скажешь, что нормальное поведение, которое должен знать каждый без знания особенностей языка? :)

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

>т.е. по-твоему Си бажный by design? :)

Человек впервые в жизни столкнулся с целочисленным переполнением. Дай ему насладиться баттхёртом :)

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

> т.е. по-твоему Си бажный by design? :)

А что сразу ассемблер не привел в качестве примера? Си — язык, в котором _необходимо_ быть в курсе машинной арифметики конкретной железяки. PHP — высокоуровневый скриптовый язык для обработки текстов, который должен обеспечивать _абстрагирование_ от железяки и давать возможность сосредоточиться на решаемой задаче. Во всяком случае, он позиционирутеся таковым. :D
Заканчивай фейлиться.

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

То есть, ты всерьез думаешь, что аргумент «смотри, PHP, он как Си», это хороший аргумент?

Такое поведение при работе с целочисленной арифметикой уже много лет является стандартом де-факто. Так что если в документации к языку программирование не указано, что поведение должно быть другое, значит всё должно работать именно так. Это единственный и очень сильный аргумент.

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

> Ой.

Еще один, не знающий, для чего нужен Си, и для чего нужны PHP/Perl/Python/Ruby/Tcl.

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

> Такое поведение при работе с целочисленной арифметикой уже много лет является стандартом де-факто.

Какое? Неявно автоматически приводить целое к float, а затем неявно же приводить потом обратно, получая UB? И в каких еще языках такой хитрый финт практикуется, не подскажешь? :D

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

Кстати говоря, в одной из недавних тем некоторые люди с ужасом узнали, что оказывается вот такой код имеет определённый смысл:

float x;

// ...

if (x != x) {
    // ...
}

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

>PHP — высокоуровневый скриптовый язык

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

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

Какое? Неявно автоматически приводить целое к float, а затем неявно же приводить потом обратно, получая UB? И в каких еще языках такой хитрый финт практикуется, не подскажешь? :D

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

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

>Как из базы получить int_64? И записать его туда?

— Прочитать (не важно, mysql_query или любой драйвер)
— Записать

В чём вопрос?

http://php.net/mysql_query
http://php.net/mysql_fetch_assoc

Если же без троллинга, то mysql-запрос возвращает строку. Как хочешь, так потом с ней и работай. Нужно вычислять 64-битную арифметику на 32-х битных машинах — GMP.

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

> А теперь смотри сюда:

И еще один. Да вас тут прям гнездо.

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

Сейчас тоже скажешь, что нормальное поведение, которое должен знать каждый без знания особенностей языка?

Сосредоточься. Ты сравниваешь с операцией целочисленного деления, которая просто так определена в питоне. Определена и все тут. И потрохами реализация явы. Да те самые кишочки, которые я хотел увидеть на примере питона.

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

>То есть, ты всерьез думаешь, что аргумент «смотри, PHP, он как Си», это хороший аргумент?

Ну, лично я сразу сказал — в любом языке без чтения документации ждут неожиданные «сюрпризы». Но виноваты в этом не языки. Боюсь, языков без неожиданного поведения нет вообще.

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

> числодробилку?

Выйди уже из состояния белой горячки, числодробильщик ты наш.

geekless ★★
() автор топика
Python 2.6.6 (r266:84292, May  4 2011, 02:00:31) 
[GCC 4.5.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 2732120973 % 8
5L

разве это не доказывает убожество php по сравнению с питоном. и я всегда знал, что php убог.

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

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

Это создаёт необходимость для разработчика языка думать, прежде чем браться за текстовый редактор и лабать говногод. Всё очевидно же.

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

В чём вопрос?

Ох, щи. Совсем забыл этот момент со строками. Да, прикрыты по всем фронтам.

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

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

О, так ты не читал ман PHP?

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

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

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

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

в любом языке без чтения документации ждут неожиданные «сюрпризы»

Кстати, раздел, посвященный инту, начинается довольно таки бодренько:

An integer is a number of the set ℤ = {..., -2, -1, 0, 1, 2, ...}.

Зато потом начинается натуральная содомия для бедного школьника.

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

>Ты сравниваешь с операцией целочисленного деления, которая просто так определена в питоне. Определена и все тут. И потрохами реализация явы

Да какие же потроха? По-твоему, сравнение двух Сhar'ов — это глубокие потроха? :) Это, как бы, вообще базовые вещи для Java. Которые _нужно знать_, иначе ты вообще не сможешь программировать. Точно также, как и сабж в случае PHP.

Вообще, нужно помнить, что на 32-х битных платформах в _большинстве_ языков нужно быть очень внимательным при работе с числами > 2³¹-1. Человек, забивающий на это болт и надеющеся на авось — это не программист, а быдлокодер. То, что в _некоторых_ языках by design реализованы многоразрядные целочисленные, не делает это явление всеобщим. А языки не выводит из группы исключений.

Собственно, топикстарт и реакция в теме, как раз, показывает, насколько сегодня уровень программистов упал. Многие уже давно не представляют, что происходит с их кодом в компьютере.

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

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

О, так ты не читал ман PHP?

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

В третьем случае из первого сообщения имеет место быть самый банальный integer overflow.

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

Такое поведение при работе с целочисленной арифметикой уже много лет является стандартом де-факто.

Как и «привычный» синтаксисис Си, бла-бла-бла.

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

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

> В третьем случае из первого сообщения имеет место быть самый банальный integer overflow.

FAIL

[code] ~$ php -r 'var_dump(2732120973);' float(2732120973) [/code]

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

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

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

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

Да какие же потроха.

Самые натуральные. Кеш на маленькие целочисленные *объекты*, это детали реализации jre.

базовые вещи для Java

Надо знать что, объекты надо сравнивать только через equals. Вот это базовая вещь, и никакие сюрпризы не появятся.

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

Уж явно это не на примере PHP надо изучать, хе-хе.

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

>потому что эти программисты думают несколько абстрактнее и хотят решить конкретную задачу, и при этом не задумываться о системно приземлённых аспектах

Что приводит именно к падению уровня. Так как софт в итоге становится всё более глючным и непредсказуемым.

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

> Собственно, топикстарт и реакция в теме, как раз, показывает, насколько сегодня уровень программистов упал. Многие уже давно не представляют, что происходит с их кодом в компьютере.

Ты просто застрял в ассемблерах, осознаешь ты это или нет.

Когда я пишу на Си, я знаю, во что превращается мой код, и что происходит при его исполнении в машине.

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

А когда я пишу на PHP, я пишу на языке, [b]который не имеет к железке никакого отношения[/b]. Я пишу на чертовом языке для обработки чертовых текстов. И мне плевать, во что он там превратит программу и каким раком будет исполнять. Если что-то невозможно вычислить корректно из-за ограничений реализации, пусть кидает исключения.

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

Это должно делать PHP каким-то особенным?

Да, если авторы хоть немного обременены мозгом.

baverman ★★★
()

Ладно, господа, я спать. Продолжим этот увлекательный срач завтра.

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

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

Вот тут есть много полезной информации: http://www.php.net/manual/en/language.types.integer.php.

Отлично, гуглить ты научился. Теперь осталось научиться читать. Когда планируешь этим заняться?

Даю подсказку: «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.» И далее по тексту, с примерами.

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

А когда я пишу на PHP, я пишу на языке, который не имеет к железке никакого отношения.

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

The size of an integer is platform-dependent, although a maximum value of about two billion is the usual value (that's 32 bits signed). 64-bit platforms usually have a maximum value of about 9E18. PHP does not support unsigned integers. Integer size can be determined using the constant PHP_INT_SIZE, and maximum value using the constant PHP_INT_MAX since PHP 4.4.0 and PHP 5.0.5.

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

у высокоуровневых программистов, другие задачи: написать сайт, сделать пагинацию, получить выборку из базы. а не думать о том, почему у них 2732120973 % 8 выдаёт -3, потому что это уже проблемы тех, кто пишет интерпретаторы.

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

>у высокоуровневых программистов, другие задачи: написать сайт, сделать пагинацию, получить выборку из базы

Именно. А не считать остатки от деления чисел over 2³¹ на древнем железе :)

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

Если такое базовое понятие как число в эрэнэре архитектурно зависимо, то для web его применять ничем не лучше, чем си, а то и с++.

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

Даю подсказку: «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.» И далее по тексту, с примерами.

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

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

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

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

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

Если такое базовое понятие как число в эрэнэре архитектурно зависимо, то для web его применять ничем не лучше, чем си, а то и с++.

О да. Оперирование большими целыми числами - это типичная задача в веб-программировании.

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

>Если такое базовое понятие как число в эрэнэре архитектурно зависимо, то для web его применять ничем не лучше, чем си, а то и с++.

Ты очень удивишься, наверное, но целочисленное числодробление — не единственный аргумент, по которому в Web'е выбирают языки.

Если смотреть только на этот аргумент, то, безусловно, для Web'а лучшими будут Си/Си++ и компания.

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

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

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