@pestunov

Почему PHP не исполняется построчно, хотя он интерпретируемый?

Интерпретируемые языки исполняются построчно. Значит, весь код до синтаксической ошибки исполняется. Python и JavaScript работают в соответствии с этим правилом. Оба фрагмента выведут 0 и 1, а затем сообщат об ошибке.
print(0)
print(1)
printttttt(2)
print(3)

console.log(0);
console.log(1);
console.loggggg(2);
console.log(3);

Если же написать код на PHP, то почему-то 0 и 1 не выведется, а сразу появится сообщение о синтаксической ошибке. Как будто PHP - компилируемый язык. Но это же не так.
echo 0;
echo 1;
echo1111 2;
echo 3;

Та же проблема и с Perl: 0 и 1 не выводятся, а сразу сообщается об ошибке.
print 0;
print 1;
printttt 2;
print 3;

Помогите, пожалуйста, разобраться, в чем дело?
  • Вопрос задан
  • 202 просмотра
Решения вопроса 1
@Vitsliputsli

Интерпретируемые языки исполняются построчно

Неа, интерпретируемые языки это те, которые исполняются не машиной, а программой-интерпретатором.
Работа php скрипта начинается с парсинга кода. Проводится лексический и грамматический анализ. Будет ли использоваться какой-либо промежуточный байткод здесь пока не важно.
В вашем примере, php парсер обнаружил неизвестную продукцию и сразу же кинул ошибку. Можно было, конечно, выполнить код до последней корректно определенной продукции, но зачем? Php старается уходить от устойчивости к стабильности, т.е. от "отработать хоть както" к "отработать обязательно корректно". "Хоть както" все равно можно, но это должен быть сознательный выбор.
И, хотя в php нет предварительной компиляции, тем не менее ошибки синтаксиса легко обнаруживаемы при запуске, поэтому логично о них сообщать сразу.
Что касается, зачем анализировать весь код, а не построчно, то это тупо быстрее даже без байткода, и дает преимущества по оптимизации. Например, если вы объявили переменную и присвоили ей значение, а дальше в коде нигде ее не меняли, то php сделает ее константой.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Изначально интерпретируемые языки преобразовывались в машинный код построчно, то есть каждая логическая строка компилировалась непосредственно перед выполнением. В результате каждая инструкция, заключенная в тело цикла и исполняемая несколько раз, столько же раз обрабатывалась транслятором. В настоящее время такие эффекты редки. Большинство интерпретируемых языков предварительно транслируются в промежуточное представление. Оно представляет собой байт-код. Это набор инструкций по вызову небольших фрагментов более низкоуровневого кода, эквивалентный нескольким командам ассемблера или командам виртуальной машины соответственно. Уже этот код исполняется интерпретатором или виртуальной машиной.
Ответ написан
YBB
@YBB
Если код вводить в консольном режиме (php -a), то будет обрабатываться построчно, как и положено классическому интерпретатору. Но для работы с http к php прикручен прекомпилятор в байт-код и OPcache - всё ради эффективности.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 02:11
5000 руб./за проект
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект