[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как транслятор обрабатывает комментарии в PHP
OleKh
Хотелось бы поделиться своими результатами поиска информации по теме.
Раз уж затеял, как говорится, в наше время доверять нельзя никому).
Так можно и до уровня элементарной физики съехать)

Вот тут как работает движок PHP
http://www.php.su/php/?phpengine

А тут мои предположения как транслятор обрабатывает php код
1. Транслятор открывает файл для чтения (типа fopen, но вероятно на C) и ставит указатель в начало. При этом в оперативную память сам файл не загружается,, это было проверено get_memory_usage(), после выполнения fopen() размер затраченной оперативной памяти не увеличился.
2. Транслятор считывает и что-то там делает, это по теме не важно. Важно как считывает. Считывает по байтно и когда обнаруживает например // начинает считывать с новой строки, если /* ищет */ и продолжает.

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

У нас был целый курс в институте где мы разрабатывали свой язык и его прогонали его компилятором.
Компилятор выводил синтатические и лексические ошибки.

Компилятором может послужить любой язык.
Где весь исходных код приврощяется в лексемы.

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

В шашем случаи комментарии это тоже лексемы.И они пропускаются.

LEX_COMMENT

Для примера возьмем разбор простого выражения

if($a == 5){
//first comments
}

LEX_BEGIN_IF
LEX_LEFT_S_BRACKET
LEXT_ASSIGN_VARIABLE
LEX_EQUAL
LEX_INT_NUMBER
LEXT_RIGHT_BRACKET
LEXT_RIGHT_S_BRACKET
LEX_COMMENT
LEX_LEFT_S_BRACKET
LEX_ENDIF


Подробно как хранятся числа и делается между ними mapping писать здесь не буду,а лишь в общем видении всего этого.(Это очень интересно с точи зрения разбора и локиги)

Steps
  • lexing - break up the text of the program into "tokens"
  • Parsing - convert the sequence of tokens into a parse tree, which is a data structure representing various language constructs: type declarations, variable declarations, function definitions, loops, conditionals, expressions, etc.
  • Optimization - evaluate constant expressions, optimize away unused variables or unreachable code, unroll loops if possible, etc.
  • Translate the parse tree into machine instructions (or JVM byte code)
Интересная книга
http://www.pearsonhighered.com/educator/pr...0321486813.page
OleKh
С тем что комментарии пропускаются мне было понятно с начала. Проблема была в том, загружается ли в оперативную память всё и дальше обрабатывается. Выходит, что не загружается. Просто мне трудно было разобраться потому, что в php нет возможности во время считывания файла делать проверки, т.е. если fread использовать, можно только кол-во байт указать. Верно? Вероятно в С есть возможность, открыть файл для чтения и считывать так как продумано алгоритмом.
OleKh
Цитата
С тем что комментарии пропускаются мне было понятно с начала. Проблема была в том, загружается ли в оперативную память всё и дальше обрабатывается. Выходит, что не загружается.


Вот тут предположение было ошибочно.
Цитата
2. Транслятор считывает и что-то там делает, это по теме не важно. Важно как считывает. Считывает по байтно и когда обнаруживает например // начинает считывать с новой строки, если /* ищет */ и продолжает.


Даже если транслятор на С, чтобы считать символ и сравнить (или найти и сравнить), потребуется считать данные в переменную или буфер или куда угодно) т.е. под это должна выделяться оперативная память. Например чтобы найти завершающий комментарий символ */ всё равно нужно считать весь комментарий или где искать. В варианте с // проще, т.к. когда найдено, можно с новой строки продолжать считывать.

Заметил особенность, например так

/*  
Compilation includes configuration file
*/


или так

/**
* Compilation includes configuration file
*/


зачем-то добавляется *, может быть этот символ переводит считывание с новой строки

И всё таки комментарии загружаются в оперативную память, но не полностью а очень незначительно, если memory_get_usage() учитывает транслятор.

В мануале есть подобный тест, но я решил перепроверить

echo $start =  round(memory_get_usage()/1024, 10);
//texttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttexttext
.... 9 999 строк

echo "<br/>";
echo $end = round(memory_get_usage()/1024, 10);
echo "<br/>";

echo $res = $end - $start;


start 111.390625 Kb
end 111.5703125 Kb
result 0.1796875 Kb

Т.е. очень мало.

Идиотизм этого тестирования заключается в том, что и на 10 000 строк (1М) комментариев и на 50 000(4М) строк, результат не меняется, что наводит на то, что тут что-то не так.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.