Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Работа операторов

Сообщения:  [1-10]    [11-20]  [21-27] 

 
 автор: sim5   (05.06.2010 в 16:00)   письмо автору
 
   для: 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. Интерпретатор преобразует такую задачу (выражение) в машинный код, и с условием того, что нынешние процессоры имеют конвейр команд, и не один, а также могут предсказывать ветвление кода в зависимости от результата выполнения некоторых условных операций. Из этого следует, что РНР поступает исходя из возможностей процессора, то есть:
а) данное выражение преобразуется в поток команд для процессора, процессор загружает их в конвейер, а интерпретатор ожидает результат выражения.
б) код в команды преобразуется последовательно и отдается процессору последовательно, и после каждой арефметической и логической опрерациях, он, беспокоясь, требует результат их выполнения... в общем, в этом случае РНР писали первоклашки.

Вот что-то сомнительно мне, что первоклашки.

  Ответить  
 
 автор: Trianon   (05.06.2010 в 14:07)   письмо автору
 
   для: sim5   (05.06.2010 в 13:28)
 

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

PS. Таки да, весьма слабое. Хотите этого Вы - Вы лично. Или не хотите.

PPS. Кстати, тупой код, построенный примитивным генератором чисто по грамматике безо всякой оптимизации (если он компилированный, или хотя бы шитый) - весма шусёр, как ни странно.
Основная потеря производительности идет на интерпретации. Но у нас то на старте треда - С.
Так что.

  Ответить  
 
 автор: sim5   (05.06.2010 в 13:28)   письмо автору
 
   для: Trianon   (05.06.2010 в 13:23)
 

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

  Ответить  
 
 автор: Trianon   (05.06.2010 в 13:23)   письмо автору
 
   для: sim5   (05.06.2010 в 12:16)
 

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

чушь.
Операция присваивания - часть выражения.
Невозможно вычислить всё выражение, не выполнив присваивания, как одной из операций, это выражение составляющих..

  Ответить  
 
 автор: sim5   (05.06.2010 в 12:38)   письмо автору
 
   для: NSDaler   (05.06.2010 в 12:03)
 

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

  Ответить  
 
 автор: sim5   (05.06.2010 в 12:16)   письмо автору
 
   для: NSDaler   (05.06.2010 в 12:08)
 

Ну вы мудрец! Вы думаете, что процессор разделит 12 на 6, вернет это значение интерпретатору, тот присвоит его Х, затем запросит опять процессор сравить Х с двойкой?
Как бы не так - 2, это промежуточный результат и гонять его туда-сюда накладно и не выгодно. 2 как рузультат певого вычисления хранится в аккумуляторе, и процессор продолжит выполять команды далее (конвейер команд), так как вычисление еще не закончилось, и так пока не будет вычислено все выражение, и его рузультат в конечном итоге будет присвоен Х.
А вот если это выражение записать так (виден смысл общей операции):
<?
if(12/6==|| 12%!= && 12%== 0)

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

PS. Вернее, это уже сами процессоры могут делать - предсказывать ветвление в зависимости от результата операций.

  Ответить  
 
 автор: NSDaler   (05.06.2010 в 12:08)   письмо автору
 
   для: Valick   (05.06.2010 в 12:04)
 

канечно тут X=2
ведь вы сначала к X присваиваете 2 а потом сравниваем 2==2, НО X=2, для того чтобы верно получить, надо так написать
if($X=($X=12/6)==2) echo $X; 

  Ответить  
 
 автор: Valick   (05.06.2010 в 12:04)   письмо автору
 
   для: sim5   (05.06.2010 в 12:03)
 

проверяли?
<? 
if(($X=12/6)==2) echo $X;
?> 

  Ответить  
 
 автор: sim5   (05.06.2010 в 12:03)   письмо автору
 
   для: Valick   (05.06.2010 в 11:57)
 

Ну вот опять 25, не будет он равен 2.

  Ответить  
 
 автор: NSDaler   (05.06.2010 в 12:03)   письмо автору
 
   для: sim5   (05.06.2010 в 11:57)
 

спасибо вам огромное, вроде бы простая тема, а в заблуждение вводит =)))
вот к зачету все вспомнил=)

  Ответить  

Сообщения:  [1-10]    [11-20]  [21-27] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования