Когда я подобную задачу решал (правда, десктопная программа для тестирования была, но не суть), то делал примерно по следующему алгоритму:
- Принимал от пользователя исходный код
- Сохранял его во временный файл (*.cpp)
- Этот файл уже отдавал компилятору MinGW, лежащему рядом с программой тестирования (запускал компилятор, аргументом при запуске был путь к временному файлу)
- Попутно перенаправлял вывод компилятора в поток, из которого считывал результат
- Если всё ок - сверялся с эталонными результатами вывода
- Если есть ошибки при компиляции - просто отдавал их пользователю
- Удалял временный файл
В вашем случае нужен будет выделенный сервер (желательно отдельно от основного сайта, чтобы, в случае какой уязвимости, пользователь не мог получить доступа к сайту тестирования), с которым бы сайт общался по API: сайт отправляет серверу файл, а тот в ответ шлет результат компиляции. Если все ок, то статус успешности и результат вывода, иначе - ошибку и комментарий компилятора.