Date: 2011-06-06 05:41 pm (UTC)
Да, при паскалевских обозначениях путаницы было бы меньше. Но сама по себе идея присвоить одно другому и результат сразу же использовать в if - так же порочна, как выделенный инкремент на 1. Для части присваиваний (по уму - только булевских) работает, для другой - нет. Это все было понятно в те времена, когда памяти у машин было настолько мало, что лишних сто байтов в теле программы - и ее уже некуда записать. И оптимизирущий компилятор, который мог бы i+=1 перевести в ассемблерную inc, i+=2 - в два inc, а i+=5 оставил бы сложением, тоже некуда было бы засунуть. Обрати, кстати, внимание, что арифметика с указателями даже в C такова, что инкремент в ассемблерную inc не очень-то преобразуется - делается смещение на размер объекта.

А в языке, который был создан тогда, когда это все уже было неактуально... У тебя в комментах кто-то уже говорил, что ЯВУ созданы для передачи своих мыслей не машине, а другому программисту. Это не вполне так, но в немалой степени. И Питон - язык, который сделан в первую очередь для этого. Что, говорят, не мешает ему при этом еще и работать быстрее перла...

И там, где машине-то пофигу, как ты записал инкремент, она железная, человеку не все равно. Инструкция i+=1 явно читается понятнее, чем выражение ++i, а то и, не приведи Великий Вычислитель, i++. Каковое, будучи выражением, еще и засунуто куда-то в еще более забористое выражение.

Постинкремент провоцирует ошибки именно тем, что им невозможно правильно воспользоваться, не уделив внимание именно ему, а не решаемой задаче. Программист либо вынужден выныривать из своего размышления о задаче и внимательно думать про постинкремент, чего организму делать не хочется, либо на автопилоте ошибается с вероятностью 1/2. Чего стоит один только шаблон for (i=0; i
[Error: Irreparable invalid markup ('<n;>') in entry. Owner must fix manually. Raw contents below.]

Да, при паскалевских обозначениях путаницы было бы меньше. Но сама по себе идея присвоить одно другому и результат сразу же использовать в if - так же порочна, как выделенный инкремент на 1. Для части присваиваний (по уму - только булевских) работает, для другой - нет. Это все было понятно в те времена, когда памяти у машин было настолько мало, что лишних сто байтов в теле программы - и ее уже некуда записать. И оптимизирущий компилятор, который мог бы i+=1 перевести в ассемблерную inc, i+=2 - в два inc, а i+=5 оставил бы сложением, тоже некуда было бы засунуть. Обрати, кстати, внимание, что арифметика с указателями даже в C такова, что инкремент в ассемблерную inc не очень-то преобразуется - делается смещение на размер объекта.

А в языке, который был создан тогда, когда это все уже было неактуально... У тебя в комментах кто-то уже говорил, что ЯВУ созданы для передачи своих мыслей не машине, а другому программисту. Это не вполне так, но в немалой степени. И Питон - язык, который сделан в первую очередь для этого. Что, говорят, не мешает ему при этом еще и работать быстрее перла...

И там, где машине-то пофигу, как ты записал инкремент, она железная, человеку не все равно. Инструкция i+=1 явно читается понятнее, чем выражение ++i, а то и, не приведи Великий Вычислитель, i++. Каковое, будучи выражением, еще и засунуто куда-то в еще более забористое выражение.

Постинкремент провоцирует ошибки именно тем, что им невозможно правильно воспользоваться, не уделив внимание именно ему, а не решаемой задаче. Программист либо вынужден выныривать из своего размышления о задаче и внимательно думать про постинкремент, чего организму делать не хочется, либо на автопилоте ошибается с вероятностью 1/2. Чего стоит один только шаблон for (i=0; i<n; i++). Спрашивается вопрос: накойхер (фамилие такое) в этом шаблоне _пост_инкремент, который, если забыть его оттуда соптимизировать, в несколько раз медленнее _пре_инкремента? Однако ж, шаблон именно таков. Я думаю, что если там написать просто инкремент (который, собственно, будет эквивалентен преинкременту) i+=1, то это удлиннение кода аж на 1 символ сэкономит пяток байтов скомпилированного кода и соответствующее количество тактов процессора прямо вот сходу. Ну, конечно, -O2 и даже -O1 догадается само, но зачем сразу-то лажу писать? (Да, я еще умею написать for (i=n-1; i>=0; --i), если i у нас signed, и это реально даст выигрыш, потому что gcc не догадается развернуть цикл в обратную сторону - но при этом надо не забыть проследить за знаком i, и зачастую в теле цикла еще явно откастить его в unsigned.)

От char в качестве byte все ЯВУ действительно отошли, ибо иначе оставалось только лечь и сдохнуть. Но проблемы до сих пор. А int-bool и постинкременты таки расползлись по ним. Их нету только в языках с прицелом на обучение программированию (питон) и суровых математических языках типа хаскела. Ну и лиспа в силу его специфического синтаксиса и простой, но строгой семантики, куда постинкремент засунуть можно, но будет сразу видно, что это черезжопное действие. И то... Из всех лиспов только в схеме, построенной специально для обучения, nil в качестве булевского false не используется. В остальных используется.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

arilou: (Default)
Danil "Eleneldil G. Arilou" Lavrentyuk

February 2023

S M T W T F S
   1234
5678 91011
12131415 161718
192021222324 25
262728    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 19th, 2025 12:21 pm
Powered by Dreamwidth Studios