|
|
|
|
|
для: Trianon
(05.06.2010 в 14:07)
| | Ну давайте "обсосем конструктивно".
Если говорить конструктивно, то стоит рассмотреть именно варианты, ибо в различных средах это бует решаться по разному.
1. Решаем на листике бумаги. Условно мы первоклашки.
Х = 12 разделить на 6 равно ли 2?
Х = 12/6 = 2
Х = 2
2 равно 2?
Ответ: равно.
2. Мы немного повзрослели, и научились держать результаты некоторых операций в уме.
Х = 12 разделить на 6 равно ли 2?
Х = 12/6 = 2 (держим в уме) равно ли то что мы держим в уме 2, то есть 2 равно 2?
Ответ: равно.
3. Решаем задачу на компьютере, еще первом, восмиразрядном, ассемблером.
MOV A,12
DIV A,6
SUB A,2
JIZ OUT
.....
OUT: MOV M,1
Даже на такой слабенькой машине, мне и в голову не придет добавлять в программу команду помещения значения аккумулятора после деления в ячейку памяти, ибо она просто ни к чему, лишняя. Для решения этой задачи и временного хранения не требуется.
Если нужно будет решить, например, 12/6 == 2 || 4-3>1, то решив первое, после команды SUB выполняем PUSH PSW, сохранив регистр флагов в стек, решив второе, извлечем стек в регистр В и сравним его значение с аккумулятором. Но это на старенькой машине, и если не думать программисту. А если думать, то все, что после ||, решали бы только в том случае, если бы результатом первого выражения был бы 0 (флаг).
4. Интерпретатор преобразует такую задачу (выражение) в машинный код, и с условием того, что нынешние процессоры имеют конвейр команд, и не один, а также могут предсказывать ветвление кода в зависимости от результата выполнения некоторых условных операций. Из этого следует, что РНР поступает исходя из возможностей процессора, то есть:
а) данное выражение преобразуется в поток команд для процессора, процессор загружает их в конвейер, а интерпретатор ожидает результат выражения.
б) код в команды преобразуется последовательно и отдается процессору последовательно, и после каждой арефметической и логической опрерациях, он, беспокоясь, требует результат их выполнения... в общем, в этом случае РНР писали первоклашки.
Вот что-то сомнительно мне, что первоклашки. | |
|
|
|
|
|
|
|
для: sim5
(05.06.2010 в 13:28)
| | Для того чтобы конструктивно обсуждать, что происходит, нужно отвлечься и от регистров , и от стека , и от вершины стека выражения, отображенной на набор свободных регистров генератором кода, и вспомнить о грамматике.
Процессоры вычисляют выражения так, как хочет генератор кода с оптимизатором.
К пониманию того, как выражение следует интерпретировать, этот аспект имеет отношение, конечно, но весьма слабое.
PS. Таки да, весьма слабое. Хотите этого Вы - Вы лично. Или не хотите.
PPS. Кстати, тупой код, построенный примитивным генератором чисто по грамматике безо всякой оптимизации (если он компилированный, или хотя бы шитый) - весма шусёр, как ни странно.
Основная потеря производительности идет на интерпретации. Но у нас то на старте треда - С.
Так что. | |
|
|
|
|
|
|
|
для: Trianon
(05.06.2010 в 13:23)
| | Даже так? Стек для этого существует - результат первого выражения в стек, вычислили второе, извлекли из стека и сравнили, и т.д.. А вообще, нынешние процессоры загружают в память комманд гораздо больше, нежели это просто выражение, просто в данном случае интерпретатор выполняет строки.
Если бы процессоры вычисляли так, как вы хотите, играть бы вам до сих пор на них в Тетрис, не более. ) | |
|
|
|
|
|
|
|
для: sim5
(05.06.2010 в 12:16)
| | >и так пока не будет вычислено все выражение, и его рузультат в конечном итоге будет присвоен Х.
чушь.
Операция присваивания - часть выражения.
Невозможно вычислить всё выражение, не выполнив присваивания, как одной из операций, это выражение составляющих.. | |
|
|
|
|
|
|
|
для: NSDaler
(05.06.2010 в 12:03)
| | Да ничего в этом блуждающего нет, если знать приоритеты и логику. | |
|
|
|
|
|
|
|
для: NSDaler
(05.06.2010 в 12:08)
| | Ну вы мудрец! Вы думаете, что процессор разделит 12 на 6, вернет это значение интерпретатору, тот присвоит его Х, затем запросит опять процессор сравить Х с двойкой?
Как бы не так - 2, это промежуточный результат и гонять его туда-сюда накладно и не выгодно. 2 как рузультат певого вычисления хранится в аккумуляторе, и процессор продолжит выполять команды далее (конвейер команд), так как вычисление еще не закончилось, и так пока не будет вычислено все выражение, и его рузультат в конечном итоге будет присвоен Х.
А вот если это выражение записать так (виден смысл общей операции):
<?
if(12/6==2 || 12%5 != 0 && 12%2 == 0)
|
то интрепретатору достаточно проверить только истину первого выражения, ибо за ним следут условие логического ИЛИ - если будут истина, то дальнейшее вычисление он остановит, иначе будет продолжать.
PS. Вернее, это уже сами процессоры могут делать - предсказывать ветвление в зависимости от результата операций. | |
|
|
|
|
|
|
|
для: Valick
(05.06.2010 в 12:04)
| | канечно тут X=2
ведь вы сначала к X присваиваете 2 а потом сравниваем 2==2, НО X=2, для того чтобы верно получить, надо так написать
if($X=($X=12/6)==2) echo $X;
|
| |
|
|
|
|
|
|
|
для: sim5
(05.06.2010 в 12:03)
| | проверяли?
<?
if(($X=12/6)==2) echo $X;
?>
|
| |
|
|
|
|
|
|
|
для: Valick
(05.06.2010 в 11:57)
| | Ну вот опять 25, не будет он равен 2. | |
|
|
|
|
|
|
|
для: sim5
(05.06.2010 в 11:57)
| | спасибо вам огромное, вроде бы простая тема, а в заблуждение вводит =)))
вот к зачету все вспомнил=) | |
|
|
| |
|