Подборка онлайн компиляторов: запускаем и тестируем код прямо в браузере. Как выполняется сам скрипт

Почти все разработчики рано или поздно сталкиваются с необходимостью запустить или быстро проверить какой-то код, но не все знают, что для такой простой задачи совсем не обязательно запускать тяжёлые десктопные IDE или прикладные компиляторы. Достаточно воспользоваться онлайн-инструментами, которые позволяют всё сделать намного быстрее: Ctrl+C, Ctrl+V, Run, вжух - и вывод программы уже перед вашими красноватыми глазами.

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

Koding

Koding.com не является онлайн-компилятором в привычном смысле. Каждый пользователь сервиса может создать в облаке несколько полноценных виртуальных машин под управлением Ubuntu 14.04, на которых может сделать всё, что пожелает, в том числе - скомпилировать код. Все популярные языки поддерживаются по умолчанию, но вы с лёгкостью сможете добавить свои.

Кроме панели управления своим сервером, в интерфейсе доступна удобная IDE и окошко терминала. Koding является самым универсальным средством, далее мы рассмотрим более простые и специализированные варианты.

IdeOne

IdeOne - это онлайн компилятор, а также инструмент отладки, который позволяет прямо в браузере выполнять код на более чем 60 языках программирования и их конкретных версиях.

Для тех, у кого нет девушки, создатели предусмотрели компиляцию кода на языке Brainfuck.

JDoodle

Ещё один онлайн-компилятор, который поддерживает множество языков, в том числе и тех, которые вы не найдете во многих других онлайн-компиляторах. Приятной особенностью JDoodle является возможность совместной работы - просто отправьте ссылку на вашу текущую сессию и плодите баги с двойной скоростью!

jsFiddle

Пусть название вас не обманывает - jsFiddle создан не только для JavaScript. Этот онлайн-редактор для фронтенда позволяет проверить любое сочетание JavaScript, HTML и CSS. Разумеется, есть поддержка разных фреймворков, например, jQuery, Vue, React, TypeScript, а также CSS-препроцессоров вроде SCSS. Для удобства вы можете выбрать привязку клавиш из любимого редактора. Правда, только в том случае, если ваш любимый редактор - Vim, Emacs или Sublime Text.

CodePad

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

Главным его достоинством является простота и лёгкость: сайт будет быстро работать даже при медленном интернете. Предусмотрено автоподключение стандартных заголовков, а также интеграция с Vim или Emacs.

Из минусов можно назвать полное отсутствие подсветки синтаксиса при вводе кода в форму. Впрочем, при просмотре уже сохранённой записи подсветка присутствует.

GCC GodBolt

GCC GodBolt - интерактивный компилятор языка С++. Попал в эту подборку по той причине, что имеет простой интерфейс, а также большое количество настроек, в том числе для опций, регулируемых с помощью ключей.

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

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

Ниже речь пойдет о компиляторах, позволяющих компилировать php код в C++, а его в исполняемый. Таким образом PHP приложения выполняются непосредсвенно процессором, минуя интерпретатор.

Проверим все ли так хорошо на практике.

Как работает интерпретатор

Интерпретация PHP кода проходит в два этапа:

  1. Парсинг кода и генерация опкодов (Zend opcodes) - инструкций, понятных интерпретатору.
  2. Выполнение опкодов.

Тогда как первая фаза хорошо поддается оптимизации (использование кеша опкодов), вторая довольно закрытая - интерпретатор всегда является посредником между набором команд и процессором, выполняющим их. Без интерпретатора, процессору не понять, чего делать с опкодами.

Чтобы избавиться от звена-интерпретатора придумали компиляторы, наиболее популярный и свежий из них HipHop от Facebook. Пощупаем его поближе.

HipHop PHP

HipHop написан разработчиками Facebook и представляет собой приложение, которое:
  1. оптимизирует PHP код
  2. конвертирует в С++
  3. генерирует из вашего приложения многопоточный веб-сервер исполняющий его
  4. компилирует в исполняемый код при помощи g++

Таким образом на входе PHP код, на выходе сервер, частью которого является написаный функционал.

Проверим, как справится HipHop с компилированием приложения написаного с использованием фреймворка, например Wordpress.

Компилируем Wordpress

После установки HipHop в папке src/hphp/ получим файл hphp, который и является компилятором. Перед началом компиляции, устанавливаем переменные среды:

Cd .. # переходим в папку с hiphop export HPHP_HOME=`pwd` export HPHP_LIB=`pwd`/bin export CMAKE_PREFIX_PATH=`/bin/pwd`/../

и вперед!

Скачиваем Wordpress и разархивируем архив:

Wget http://wordpress.org/latest.tar.gz tar zxvf latest.tar.gz

Копируем wp-config-sample.php в wp-config.php и указываем настройки соединения с базой (в настройках хоста указываем 127.0.0.1, а не localhost).

Для удачной компиляции нужно немного пропатчить Wordpress:

  1. Открываем wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php и заменяем: function &loopback(/* args.. */) { return func_get_args(); } на function &loopback(/* args.. */) { $ret = func_get_args(); return $ret; }
  2. В wp-includes/query.php, вместо if (!isset($q["suppress_filters"])) $q["suppress_filters"] = false; вставляем $q["suppress_filters"] = true;

Wordpress готов.

Hiphop"у нужно указать список файлов, которые будем компилировать - получим его и сохраним в files.list:

Find . -name "*.php" > files.list

Все готово к компиляции, приступим:

$HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 --force=1 --cluster-count=50

После завершения выполнения команды, во временной папке (в начале компиляции hphp покажет ее путь, что то типа "/tmp/hphp_ptRgV1") получим скомпилированный веб-сервер. Запустим его (если на 80 порту, что-то висит, например apache или nginx - нужно сначала остановить, чтобы освободить порт):

Sudo /tmp/hphp_6s0pzd/program -m server -v "Server.SourceRoot=`pwd`" -v "Server.DefaultDocument=index.php" -c $HPHP_HOME/bin/mime.hdf

Вуаля! Перейдя на http://localost увидим рабочий Wordpress блог.

Производительность

Посмотрим, будет ли прирост производительности, по сравнению с нескомпилированой версией Вордпреса, бегающей на apache2. Ниже графики зависимости скорости генерации страниц от количества параллельных пользователей.

Как видите результаты получились шокирующие: скомпилированый блог работает в среднем в 6 раз быстрее! Среднее количество обработанных запросов за секунду в нескомпилированом 9, а в скомпилированом 50! Не знаю как вас, а меня эти результаты поразили, такого сильного прироста производительности не ожидал.

Подведем итог

После таких ошеломляющих результатов можно сказать только одно - ребята из Facebook поработали на славу. Компилятор действительно делает из приложения ракету и хотя перед компилированием приложение нужно подготавливать - результат того стоит.

В тему:

Если пост понравился - нажмите на гугловский +1 - мне будет больше мотивации писать ещё и просто приятно.

Языки программирования бывают двух видов: интерпретируемые и компилируемые. А каким языком является PHP? Для того, чтобы ответить на этот вопрос, нам необходимо разобраться в терминологии.

Программа, переводящая код, написанный на одном языке программирования, на другой называется транслятором. Компилятор – это тоже транслятор. Он переводит код, написанный на языке высокого уровня, в машинный код. В результате процесса компиляции создается двоичный исполняемый файл, который уже можно запускать без компилятора.

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

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

Что касается PHP, то он не является ни компилятором, ни интерпретатором. PHP представляет собой нечто среднее, между компилятором и интерпретатором. Попробуем в этом разобраться и рассмотрим, как PHP обрабатывает код.

Рассмотрим рисунок:

Мы видим, что PHP составлен из двух почти независимых блоков - транслятора и интерпретатора. Зачем же понадобилось так делать? Конечно, из соображений быстродействия.

На вход PHP подается сценарий. Он переводит его (транслирует) , проверяя синтаксис, в специальный байт-код (внутреннее представление). Затем PHP выполняет байт-код (а не код самой программы), при этом он не создает исполняемый файл.

Байт-код значительно компактнее обыкновенного кода программы, поэтому его легче (и быстрее) интерпретировать (выполнять). Посудите сами: синтаксический разбор осуществляется всего один раз на этапе трансляции, а исполняется уже "полуфабрикат" - байт-код, который гораздо более удобен для этих целей. Поэтому, PHP больше является интерпретатором, нежели компилятором. Такая «двойная работа» была необходима для следующих целей.

Рассмотрим цикл:

For (i=0;i<10; i++) { Operator_1; Operator_2; Operator_3; ............ Operator_99; Operator_100; }

Такой цикл будет «крутиться» 10 раз. За каждый из этих десять проходов интерпретатор должен и 100 строк кода. А в ему нужно проанализировать и выполнить 10*100 = 1000 строк кода! Если перевести один раз весь цикл в байт-код, то анализировать ему придется в 10 раз меньше! А это значит, что сценарии будут выполняться в 10 раз быстрее!

Получается, что PHP является.

Главной фазой работы PHP является интерпретация внутреннего представления программы и ее исполнение. Именно эта фаза и занимает больше всего времени в серьезных сценариях. Однако, замедление не так уж и существенно.

Стоит вспомнить, что PHP версии 3 был «чистым» интерпретатором», а с PHP 4 сценарии стали выполняться значительно быстрее, поскольку 4-я версия PHP (и PHP5) является интерпретирующим транслятором.

Язык Perl, который практически всегда называют компилятором, работает точно по такой же схеме - он транслирует текст программы во внутреннее представление, а затем использует результирующий код при исполнении. Так что, можно сказать, PHP версии 4 представляет собой компилятор ровно настолько, насколько им является Perl.

Итак, мы вынуждены заключить, что PHP является интерпретатором с встроенным блоком трансляции, оптимизирующим ход интерпретации.

Использование интерпретатора (а значит и PHP) имеет свои неоспоримые преимущества:

  • Нет необходимости заботится об освобождении выделенной памяти, не нужно закрывать файлы по окончании работы с ними – всю рутинную работу сделает интерпретатор, поскольку программа выполняется под его бдительным контролем;
  • Не нужно думать о типах переменных, а также не нужно объявлять переменную до его первого использования;
  • Отладка программ и обнаружение ошибок существенно упрощаются – интерпретатор полностью контролирует этот процесс;
  • В контексте web-приложений, интерпретатор также имеет еще очень важное преимущество – нет опасности «зависания» сервера при неправильной работе программы.

Есть и другие достоинства. Вообще, использование интерпретатора способно дать сценариям ту мощь, которую пользователи Web от них и ожидают.

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

<<< Назад
(Что нового в PHP5 ?)
Содержание Вперед >>>
(Переход на PHP 5.3)

Есть еще вопросы или что-то непонятно - добро пожаловать на наш