Как работает интерпретатор php
Язык программирования PHP: как устроен и работает PHP?

PHP является объектно-ориентированным языком наподобие C++, Java, C#. Он имеет большое количество различных встроенных библиотек что существенно облегчает и ускоряет написание web-приложений: библиотека для работы с текстовыми файлами, работы с изображениями популярных форматов (кроп, масштабирование изображения, вставка одного изображения в другое и др.), библиотеки для работы с xml и html (Работа с DOM), работы с http (удаленный запрос к серверу, получение ответа с содержимым от сервера) CURL, библиотеки для работы с базами данных (mysql, PDO), криптографические библиотеки, библиотеки для работы с файловой системой, обработка аудио форматов.
Это далеко неполный перечень всех имеющихся на сегодняшний момент PHP библиотек. Возможности этого языка поистине колоссальны!
Как устроен и работает PHP?
Как работает PHP? За работу PHP интерпретатора отвечает web-сервер (например Apache), который обычно устанавливается вместе с PHP интерпретатором и какой нибудь СУБД в связке (например в пакетах LAMP или MAMP). При получении запроса c URL страницей сайта от браузера (клиента) web-сервер находит нужный скрипт у себя на жестком диске и отдает команду php-интерпретатору выполнить этот скрипт.
Разберем этот процесс более подробно. Например, вы хотите зайти на сайт yandex.ru:
1. Сначала вы набираете в адресной строке вашего браузера адрес сайта
2. После того как вы набрали адрес сайта и нажали Enter, клиент (в нашем случае это браузер) посылает запрос серверу (то есть компьютеру, на котором размещен сайт) через протокол http. Грубо говоря, браузер говорит серверу: я мозилла фаерфокс (например), дай мне информацию по такому то URL адресу (в нашем случае URL адрес это http://yandex.ru).
3. Сервер обрабатывает запрос клиента, и находит нужный ресурс (скрипт, картинку либо еще какой нибудь файл) у себя на жестком диске ориентируясь на полученный URL адрес. Если файл либо директория по заданному URL адресу на сервере не будут найдены, то сервер отправит клиенту (браузеру) ответ с определенным кодом 404 — «не найдено». При этом в браузере отобразится соответствующее сообщение: «Страница не найдена». Если же сервер найдет нужный скрипт по заданному URL адресу, то он поручит интерпретатору PHP выполнить этот скрипт, а результат выполнения (если он есть) сервер «отдаст» браузеру по протоколу http в виде html кода. Так же помимо самой информации web-сервер передает браузеру различные http заголовки. Но об этом уже в других статьях
Определение и особенности языка PHP
Что такое PHP
Начнём с определения того, чем именно является PHP. Сложно в одном предложении дать полное представление об этом языке, поэтому опишем его следующими тремя характеристиками:
PHP — это препроцессор гипертекста (HTML).
PHP — это серверный язык программирования.
PHP — это скриптовый, интерпретируемый язык программирования.
Зачем нужен PHP
Поясним каждое из определений и узнаем, в каких задачах будет полезен PHP.
Основная задача PHP — это «оживление» HTML страниц.
Обычные HTML-страницы статичны. Статичность (или неизменность) означает, что после того, как страницу создали и загрузили на сайт, при каждом обращении к этой странице браузер покажет её любому пользователю в неизменном виде.
Но этого не всегда достаточно.
Почти всегда пользователи приходят на сайт за информацией, которая всё время меняется, и нужно отображать её актуальное состояние. Например:
Если использовать только HTML, то решить такие задачи не получится. Здесь-то нам и понадобится PHP. Он принимает входящий запрос от веб-сервера, выполняет сценарий и возвращает веб-серверу результат в виде готового HTML-код. Сервер отправляет этот результат в браузер пользователю, который, в свою очередь, отображает её пользователю. После этого видно свежий курс валют, погоду, и что угодно ещё.
РНР позволяет изменять веб-страницу на сервере непосредственно перед тем, как она будет отправлена браузеру. Давайте разберёмся, как это работает. PHP умеет исполнять код — так называемые сценарии. В ходе исполнения PHP может изменить или динамически создать любой HTML-код, который и является результатом исполнения сценария. Затем сервер отправляет этот код браузеру. При этом браузеру не известно, как была сформирована данная страница — статично сверстана верстальщиком, или динамически создана при участии PHP. Это не важно, т.к. браузер всегда работает только с тем, что получил от сервера.
Давайте запомним, что сценарий — это программа, которая находится на стороне сервера и запускается в ответ на запрос от браузера.
Выполнение сценария также называют его интерпретацией, а сам PHP — интерпретатором.
Вы можете попрактиковаться в создании динамических страниц с помощью PHP в этом тренажёре.
Где используется PHP
Основная сфера применения языка PHP — это веб, то есть сайты, которые мы каждый день посещаем через браузер компьютера или смартфона. Важно понимать, что веб — это не весь интернет, а только самая большая и популярная его часть. Кроме веба через интернет работает электронная почта, мессенджеры, файлообменные сервисы, сетевые игры и многое другое.
Практически каждый сайт, который есть в интернете, работает на PHP. Этот язык отлично подходит для любых динамических веб-сайтов, среди которых:
Установка и использование
На нашем курсе мы будем работать с версией PHP 7.1
Где скачать PHP?
Мы рекомендуем использовать программную сборку OpenServer. После загрузки и установки на вашем компьютере появятся свежая версия PHP, веб-сервер, база данных, и много других программ и инструментов для удобной работы. Подробнее об установке и использовании мы рассказываем на первой лекции.
Как выглядит PHP-сценарий
Типичный PHP-сценарий — это набор выражений. Каждое выражение начинается с новой строчки и заканчивается точкой с запятой.
Выражение — это инструкция, которая приказывает PHP-интерпретатору выполнить одно действие, например, сложить два числа или вывести на экран информацию. Давайте посмотрим на самый простой сценарий. Он будет выводить на экран одну строку: «Привет, Мир!»:
В нашем примере сценарий состоит из всего одной инструкции: print(«Привет, мир»);
Здесь мы просим функцию print вывести на экран наш текст — «Привет, Мир!». Это можно рассматривать как подлежащее и сказуемое в русском языке, где функция print — это сказуемое, а «Привет, Мир!» — подлежащее.
Как мы уже знаем, PHP можно встроить в статичные HTML-файлы и модифицировать их с помощью инструкций. Вот как будет выглядеть тот же пример с выводом текста, но расположенный внутри HTML:
Потренироваться вставлять код на PHP в разметку можно в этом задании.
Язык программирования PHP: от истоков до современности
Ему ежегодно пророчили исчезновение из-за невостребованности. Но спустя годы он по-прежнему в топе. Встречайте самый распространенный язык — PHP.
Что за язык PHP и почему он так популярен
PHP: Hypertext Preprocessor (изначально Personal Home Page Tools, «Инструменты для создания персональных веб-страниц») — один из лидирующих языков современной веб-разработки. Его отцом считается датский программист Расмус Лердорф, который в 1994 году создал набор скриптов на Perl — ту самую «персональную домашнюю страницу», которая легла в основу PHP.
Первое свойство: интерпретируемость
Главная характеристика PHP — интерпретируемость. В отличие от Java, которая компилируется, а затем запускается в работу, PHP создается во время обращения к нему. Человек открывает сайт, на сервер посылается запрос, и в это время компилируется код. Каждый скрипт компилируется в реальном времени, а затем выполняется.
Приводим пример кода:
Благодаря этому свойству PHP — очень гибкий язык. Например, Java-программист вводит название класса один раз — теперь оно неизменно. PHP же компилируется в рантайме и можно подставить любое название класса из переменной.
Однако ради гибкости разработчик жертвует скоростью работы сайта. В случае с Java программу создают, а затем запускают. В случае с PHP приходится занимать время пользователя на процесс компиляции кода.
Второе свойство: динамическая типизация
Языки программирования бывают:
1) со статической типизацией;
2) с динамической типизацией.
В первом случае тип переменной определен жестко и заранее. Если это число, программист напишет тип int. Если строка — string. Во втором случае переменная может быть одновременно числом, строкой, массивом, объектом — чем угодно. Одной переменной можно присвоить число, затем массив, объект — и язык программирования это позволит. PHP относится ко второй группе.
Но есть проблема
Проблема динамической типизации в том, что она приводит к уменьшению скорости работы и потреблению большого количества оперативной памяти. Но динамическая типизация гибкая и удобная, поэтому PHP так популярен.
Команда разработки PHP сейчас трудится над тем, чтобы он занимал меньше памяти при работе, но сохранил гибкость статически нетипизированного языка.
Обзор версий: между первой и седьмой
Версии с первой по третью были «сырыми»: мало возможностей, хотя для создания простых сайтов их хватало. С версии 5.4 PHP стал отлаженной технологией. До этого было слишком много нюансов, и работать с ними было непросто.
Релизы 5.5 и 5.6 — серьезные, проверенные временем вещи. Они отлично себя показали и достаточно защищены от инъекций и возможностей взлома.
Шестую версию пропустили: она должна была поддерживать Unicode на уровне ядра, но релиз не состоялся. «PHP6 был амбициозным, но отстойным. Вот почему мы занялись PHP 7, в процессе пропустив шестую версию», — прокомментировал в своем блоге Vilson Duka, один из разработчиков.
Седьмая версия считается революционной в плане скорости. 5.6 медленно работала с массивами и вообще с переменными: обработка статически нетипизированных данных происходила долго. Строка обрабатывалась в 60 раз медленнее, чем на C#. Это не бросается в глаза — речь о долях секунды. Но когда у тебя миллиард пользователей, как на Facebook, скорость критична.
HipHop и прорыв в скорости
Facebook написан на PHP — проблему нужно было решать. Их программисты создали для пятой версии собственный интерпретатор языка. Они компилировали его изначально в промежуточные коды, а затем отправляли в обычный интерпретатор Zend Engine. Программисты Facebook ввели статическую типизацию и ускорили работу языка в два раза. Это стало настоящим прорывом. Транслятор назвали HHVM, или HPHP Compiler — «HipHop для языка PHP».
Но команда разработки PHP плотно занялась массивами. Итогом стала седьмая версия, которая работала быстрее HHVM. При этом статической типизации в PHP7 по-прежнему почти нет. Только в параметрах функции — но это так мало, что можно считать, будто нет.
С версии 7.0 до 7.3, которая сейчас в бета-тестировании, язык ускорялся — разница видна по замерам:
7.3 станет последним релизом: поддерживать и править ошибки будут, но ничего принципиально нового не появится.
Будущее PHP: восьмая версия
Главная задача — сделать PHP быстрым при сохранении гибкости динамического языка. Разработчики понимают, что в дальнейшем нужно приходить к статической типизации. Сейчас рассматривают опциональный вариант, когда ее можно включать в определенных частях скрипта. Это наилучший путь из возможных.
Восьмая версия появится ориентировочно в 2020–2022 годах. На open source-платформах изменения принимаются общим голосованием совета разработчиков. Сейчас идет тестирование нововведений в PHP 8.
В мире PHP ничего не происходит без движения сообщества.
Статическую типизацию планировали ввести в седьмой версии, но она не прошла голосование: нашлись изъяны. Ошибки исправили, и теперь мир разработки ждет возможность ее отключения одной командой в коде.
PHP частично написан на языке С, и в восьмой версии хотят полностью отойти от него. Также реализуют работу с матрицами: она ускорится в пять раз по сравнению с седьмой версией.
Для чего используют PHP
Единственное применение — это веб-разработка. На PHP невозможно сделать десктопные приложения, он не используется в мобильной разработке — только веб. Но сегодня эта область огромна. Даже некоторые десктопные приложения уходят в веб — тот же Microsoft Office имеет облачный сервис. Ранее считалось, что PHP не подходит для больших высоконагруженных проектов, но опыт Facebook доказывает обратное. «Авито» — еще один пример удачной реализации. Подробнее о том, как использовать PHP — в нашей статье Для чего используют PHP и почему его ненавидят.
С чего начать изучение
PHP легко изучить самостоятельно за счет низкого порога входа. Буквально за вечер можно прочитать документацию и написать скрипт, который будет возвращать данные на сайт. Другие языки (C#, Java) имеют более высокий порог вхождения, и одного дня мало, чтобы создать работающий код. Сегодня на российском рынке труда из-за низкого порога входа PHP-кодеров много, и большинство — невысокого уровня.
Хороший разработчик PHP фактически применяет те же паттерны программирования, что и в статически типизированных языках. На PHP даже сложнее программировать, и вот почему. Если в Java или C# допустить алгоритмическую ошибку, например, присвоить переменной не тот тип, — они «дадут по рукам». PHP же это пропустит, и программист сломает голову: что не так? Ведь все работает, но неправильно. Из-за этого на современном рынке хорошим программистам PHP готовы платить чек не ниже, чем другим разработчикам. Но хорошего специалиста сложно найти.
Чтобы учить язык, нужно задать себе вопрос: «Для чего он мне?» Учить ради процесса учебы — бесполезно, ведь без практического применения знания забудутся. Нужно поставить конкретную задачу и искать решение.
Начинайте изучать PHP в интернете: сегодня выпускается много видеоуроков, онлайн-лекций и тренажеров. Рекомендуем наш курс «PHP-разработчик», где вы прокачаете свой уровень с нулевого до профессионального.
Программное обеспечение с открытым исходным кодом.
Что такое PHP и почему его все ненавидят
Несмотря на то, что 83% сайтов в интернете работают на PHP.
История языка
Изначально PHP расшифровывался как Personal Home Page Tools — инструменты для создания персональных страниц. Дело в том, что раньше, чтобы сделать функциональный сайт, чаще всего использовали C, Perl и CGI-скрипты. Звучит сложно, на деле — тоже сложно. Единственным способом сделать что-то своё и не изучать при этом три тома по программированию был PHP.
Например, можно сделать так:
Привет! А вы знаете, что
В результате на странице получится строчка: «Привет! А вы знаете, что этот код написан на PHP?»
Ещё можно создавать целые PHP-файлы и писать весь код там, а потом просто подключать эти файлы в нужный момент. Получается, что с PHP можно работать в двух режимах: писать код прямо в коде страницы или выносить всё в отдельные файлы.
PHP — это просто
Именно простота этого языка принесла ему дурную славу: слишком много появилось плохого кода, который на первый взгляд работал хорошо. Посмотрите сами: начать писать на PHP действительно просто.
Комментарии и точка с запятой. Комментарии можно ставить в любом месте — достаточно написать два слеша подряд. А точка с запятой ставится после каждой команды — точно так же, как в С, Pascal, JavaScript и ещё в сотнях других языков.
Объявление переменных. Чтобы объявить переменную, нужно просто поставить знак доллара, после него написать название переменной и присвоить ей какое-то значение.
Вывод на экран. В HTML-коде достаточно вставить команду echo, которая помещает текст в то место, откуда вызвали команду. Например, этот код покажет заголовок первого уровня с текстом «Заголовок, собранный на PHP»:
И этот код сделает то же самое:
Ещё в PHP есть классы и объекты, автоматическое приведение типов (хотя мало кто понимает, как оно там работает в сложных примерах) и множество встроенных функций, которые упрощают разработку и помогают быстро писать код. А самое главное — PHP сам заставляет работать любой код, если он хоть как-то написан по правилам языка. Даже если внутри будет полная чушь, но похожая на PHP-код — интерпретатор его старательно выполнит, и, скорее всего, многое из этого будет даже работать.
Для чего нужен PHP
Собирать страницы из модулей. Если помните, PHP-код можно встраивать в HTML-страницы, а можно сохранять как отдельные файлы. В этом случае мы получаем мини-модули, каждый из которых отвечает за что-то одно. Например, в одном мы пишем, как будет выглядеть шапка сайта, в другом — меню, третий файл будет отвечать за подвал, четвёртый — за блок с отзывами о товарах.
Если у нас интернет-магазин и на каждой странице товара нужно показать шапку сайта и подвал, можно каждый раз прописывать это вручную, а можно собрать на PHP. Для этого достаточно в теле страницы написать что-то такое:
PHP возьмёт файл header.php, в котором мы написали, как должна выглядеть шапка сайта, и поставит её в начало страницы. То же самое сделает и с подвалом — файлом footer.php, и так будет на каждой странице товара. Получается, что нам не нужно писать один и тот же код шапки и подвала на каждой странице, достаточно сделать это в одном месте, а потом подключать одной строчкой.
Создавать CMS и движки для сайтов. Такие модульные возможности PHP привели к тому, что большинство современных систем управления контентом на сайтах написаны на PHP. Смотрите сами:
Если вы на бесплатном хостинге используете какой-то инструмент для создания или поддержки сайта, скорее всего, он тоже будет написан на PHP.
Работать с формами и данными на странице. HTML плохо умеет работать с формами и отправлять куда-то данные, которые вы вводите в поля регистрации. PHP справляется с этим гораздо лучше: вы говорите, из какого поля что нужно взять и по какому адресу отправить, а всё остальное интерпретатор делает за вас.
Запоминать пользователей и делать формы авторизации. Если вам нужно быстро написать свою форму регистрации на сайте или запоминать посетителей даже без регистрации, то PHP — самый простой вариант решения этой задачи. Единственное, что нужно знать — как работать с базами данных, где хранятся записи о пользователях, потому что PHP это тоже умеет.
Почему все ненавидят PHP
По старой памяти, когда ужасного кода было много. Простота вхождения в этот язык привела к тому, что невозможно было нормально поддерживать сайт, написанный кем-то на PHP. Этот язык позволял раньше (сейчас меньше, но тоже есть) много вольностей с типами данных, переменными, обращениями к базе данных, поэтому разобраться было почти нереально.
Кроме этого, раньше в PHP было много уязвимостей, через которые можно залезть в базы данных пользователей или что-то поломать на сайте. В новых версиях большинство дыр уже устранили, но тогда это стало реальной проблемой.
Смешанный код. Писать в одном файле на PHP и HTML можно, если у вас всего одна форма обратной связи. Но когда весь сложный код на PHP расползается по всей странице, то это сильно мешает разобраться, что же там происходит на самом деле.
Любые переменные в любом месте. Понадобилась новая переменная? Объявите её на любом участке кода и сразу берите в работу. Это удобно для первоначальной разработки, когда ты просто берёшь новую переменную там, где она понадобилась, и делаешь с ней что хочешь. Но когда проходит время или кто-то другой хочет разобраться в коде, то такой подход сильно затрудняет работу.
Например, можно написать так:
Когда новый программист захочет понять, за что отвечают переменные а и b, он найдёт место, где они объявляются, и посмотрит, какого они типа и для чего использовались вначале. Но разработчик мог в процессе передумать и начать использовать эти переменные для других целей с новыми типами данных. Чтобы это понять, нужно просмотреть весь код и разобраться в логике, а это долго и трудно.
Стоит ли учить PHP?
Зависит от задачи. Дело в том, что не менее 80% сайтов уже сейчас работают на PHP: это значит, что их нужно будет еще какое-то время поддерживать. Ещё лет 5–10 спрос на PHP точно будет.
Однозначно стоит учить PHP, если хотите работать с Вордпрессом, Друпалом, Джумлой и другими известными системами управления сайтами. Они написаны на PHP, и все надстройки и дополнения — тоже. Хороший разработчик WordPress сейчас на вес золота.
Будут ли веб-разработчики массово переходить на другие технологии — вопрос открытый. Сейчас, если вы покупаете виртуальный хостинг, вам сразу включают интерпретатор PHP, потому что все его используют. А другие технологии типа Python или Node.js — не включают, их нужно устанавливать отдельно.
Но ведь и веб — это не навсегда. Ещё лет 20, и понятие веб-сайта может безнадёжно устареть, потому что люди будут в приложениях, соцсетях или ещё где похуже.
Наверное, ответ на вопрос такой: если вам до 20 лет, то уже не надо учить PHP. А если ближе к 40–50 и вы хотите заниматься вебом — то определённо да.
Что дальше
В следующей серии попрактикуемся в PHP — напишем свой код для пользы дела или для развлечений.
Заметки об архитектуре или Интерпретатор Forth на PHP 5.3
О чем пойдет речь?
Мне очень часто приходится проводить собеседования, нанимая на работу PHP-программистов. 2-3 человека в день — это вполне нормально, хотя и на грани выносливости.
Все кандидаты разные, кто-то просто великолепен, кто-то похуже. Но у тех, кто похуже, всегда одни и те же ошибки.
Во-первых они совершенно не интересуются развитием языка, на котором пишут, и вопрос «А что нового в PHP 5.3» ставит их в тупик, а уж предложение порассуждать на тему «Чтобы Вы добавили в будущие версии языка» — просто пугает.
Во-вторых они категорически не представляют, что PHP может быть хоть чем-то кроме «скриптов для сайтов». Особенно печально это в свете того, что на работе им придется заниматься далеко не сайтами и даже скорее всего не сайтами.
Ну и в третьих кандидаты, которые похуже, с трудом представляют себе процесс построения архитектуры программы. Паттерны — знают, и много, а вот как из паттернов сложить целостную систему, чтобы за нее не было мучительно стыдно — это уже с трудом.
Таким кандидатам и посвящается этот топик. С уважением к их нелегкой доле (а быть программистом на самом деле непросто) и с надеждой, что он подтолкнет их вперед по пути самосовершенствования.
Что мы будем делать?
Давайте попробуем сделать интерпретатор Форта на PHP!
Форт меня всегда манил, как далекая галактика из антиматерии. Стек, слова в словаре, обратная польская нотация… Это только кажется сложным, но на самом деле очень просто, зато здорово «просветляет» и расширяет кругозор.
Архитектура приложения
В соответствии с 2 принципом архитектуры будем пространства имен однозначно преобразовывать к директориям в ФС, а имена классов — к именам файлов в этих директориях.
Получается примерно такой код:
Используем все современные возможности языка: сама функция автозагрузки у нас анонимная (и правда, зачем ей имя?), регистрируем ее через SPL, чтобы избежать конфликта с другими функциями автозагрузки (что, конечно в нашем случае маловероятно, но является хорошим тоном).
Берем этот код и кладем его в файл autoload.php в корне проекта.
Настраиваем запуск
Перед тем, как писать реальный код Форт-машины, нам нужна точка входа. Ее обеспечат три файла — forth.php будет инициализировать приложение и реализовывать главный цикл, а forth.bat и forth.sh будут играть вспомогательную роль, помогая запустить наш скрипт в режиме командной строки в разных ОС.
Под Windows файл forth.bat может выглядеть примерно так:
Я уверен, что читатели этого топика с легкостью его улучшат и с удовольствием создадут аналог для запуска нашего приложения под sh/csh/bash или любой другой командный интерпретатор.
Точку входа приложения, файл forth.php, оставим пока почти пустым, внесем в него лишь две строчки — объявление пространства имен и инициализацию автозагрузки
Стек и очередь команд
Настало время реализовать две главные части нашей Форт-машины: стек и очередь команд.
Стек — это основное понятие классического форта. На стеке у нас будут храниться числа, с которыми будет оперировать машина, туда же будут помещаться результаты операций над ними (слов).
В PHP стек LIFO отлично реализуется массивами и операциями array_pop и array_push, поэтому не будет изобретать велосипед, а воспользуемся этими средствами. Учтем, что в данной реализации стек у нас может быть только один, поэтому сделаем класс стека синглтоном. У нас получится примерно такой код:
Позвольте, скажете вы — а где же синглтон? Где же закрытый конструктор, привычный метод getInstance()?
Все просто — мы вынесли весь фунционал паттерна в специальный системный абстрактный класс \FORTH\SYSTEM\Singleton. Если Вы внимательно посмотрите код этого класса, то поймете основную идею — как LSB, появившееся в PHP 5.3 позволяет разделять абстрактное описание паттерна и его конкретную реализацию.
Совершенно аналогично с помощью массива организуем очередь, только используя функции array_push и array_shift.
Словарь
Наступает время словаря. В словаре Форт-машины хранятся определения слов. Для простоты реализации (и для исключения жестких связей в архитектуре) будем хранить в словаре следующую информацию: слово, размерность операции (сколько чисел с вершины стека нужно слову в качестве аргументов), эффект над стеком (сколько чисел со стека слово снимает) и код слова, возвращающий то, что слово хотело бы положить на стек.
Слово будем представлять в виде объекта класса \FORTH\SYSTEM\Word, а словарь — \FORTH\SYSTEM\Dictionary, реализацию этих классов вы найдете в исходном коде приложения.
Словарю необходимы по крайней мере два публичных метода — один будет искать слово в словаре и возвращать нам его в случае успешного поиска, а второй — принимать новое слово и добавлять его в словарь.
Стоит отметить, что класс словаря тоже несомненно должен быть реализован как синглтон, кроме того словарь уже при старте Форт-машины должен содержать в себе некий минимальный стандартный набор слов, так что кроме непосредственно класса \FORTH\SYSTEM\Dictionary нам потребуется реализовать класс StandartDictionary, выполняющий инициализацию словаря стандартными словами, а также добавить инициализацию стандартного словаря в точке входа в приложение.
Для начала реализуем в качестве стандартных слов четыре основные арифметические операции, «DUP» — удвоение числа на вершине стека, «SWAP» — перестановку двух верхних чисел со стека и «.» — вывод числа с вершины стека. Особой сложности это не составит, вот как выглядит пример для сложения двух чисел:
Общаемся с внешним миром
Настает время передать нашему приложению извне некую Форт-программу. Для простоты реализации будем предполагать, что программа находится в файле, который непосредственно указывается в командной строке.
Набросаем следующий код в forth.php:
Ничего сложного в коде «парсера» нет, наша задача очень проста — разбить строку по пробельным символам, а далее обработать. Если мы встречаем число, то просто поставить его в очередь, если же некий символьный литерал — спросить словарь, не является ли он словом, и если это действительно так — поставить в очередь объект-слово.
Гораздо интереснее код «палача». Исполнитель по сути представляет собой ядро Форт-машины — именно он оперирует со стеком и исполняет слова. Мы передадим ему объект нашего системного стека, загрузим в него очередь команд и попросим эту очередь над данным стеком выполнить.
Задача исполнителя — определить, чем является элемент очереди: числом, которое нужно положить на стек, либо словом, которое необходимо выполнить. Если с числом все просто, то слово потребует несколько больше умственных усилий — нужно снять со стека заданное количество чисел, сформировать из них массив аргументов и вызвать код слова, передав ему эти аргументы. Полученный результат, возможно, потребуется поместить на стек.
Выглядит это примерно так:
Что получилось?
А в результате у нас получился интерпретатор языка Форт на PHP — Форт-машина. Пусть код зияет большими пробелами (например мы нигде пока не ловим исключения, совершенно упущен момент с тестами), пусть много можно улучшить, но это улучшение уже не составит труда, основная работа сделана.
Для кого-то этот топик, возможно, откроет что-то новое — я буду только рад.
Кто-то прочтет и скажет «ну это же элементарно, что тут нового» — отлично.
А если кто-то знает, как сделать еще лучше — приходите в нашу команду, мы очень любим и высоко ценим профессионалов, которые, в свою очередь, любят и ценят язык, на котором программируют.

