Все что я думаю о Кумире

Задача: добавить язык программирования Кумир в ejudge 3.0.2. Все это под операционной системой Debian 7.

Казалось бы, нормальный язык добавляется в ejudge установкой пакета. После этого обычно надо перезапустить поиск компиляторов. В случае Кумира все несколько сложнее. В случае кумира пакета под debian нету. Под ubuntu тоже нету.

Ну ничего, нам же не привыкать. Вот это выглядит как официальный сайт. Качаю kumir-1.9.0.tar.gz. Распаковываю его, даю права на выполнение ./configure. Запускаю make.

Ошибка компиляции. Бывает. Вероятно написан на qt5, ну или какая-нибудь зависимость не указана. Я вряд ли первый, так что наверняка все проблемы уже решены… Ничего не нашел. Вероятно никому не приходило в голову ставить его под debian.

В гайдах от ejudge сказано, что для работы Кумира нужна программа ckumir. Под ALT Linux есть пакет kumir-console, собранный Кириенко. С помощью alien конвертирую rpm пакет в deb. Устанавливается без каких-либо проблем и вроде бы работает.

Однако, в ejudge на любую посылку выдается статус «Compilation error» со статусом ошибки «Segmentation fault». На первый взгляд эти статусы противоречат. На второй тоже. ckumir это интерпретатор, какая компиляция?? Я нашел этот скрипт где-то в недрах ejudg’a.

Ошибка происходит на строке «${KUMIRPATH}» —check —program-encoding=UTF-8 —messages-encoding=UTF-8 «$1»

Эта штука падает с segmentation fault. Странно, но можно и забить. В скрипте выше я их уже закомментил, и это был проход на следующий уровень. Следующий вердикт ejudg’a — runtime error. В очередной раз проверяю ckumir — все работает. Какая-то мистика.

Я потратил около шести часов пытаясь расковырять этот скрипт, потому что был уверен в том, что виноват ejudge. Я ошибался. Куча дебаг-вывода в левые файлы в скриптах совершенно не помогла. Долгое ковыряние в ejudg’e дало мне информацию о схеме запуска программ. Они запускаются через скрипт ejudge-execute. Опять куча запусков, чтобы понять — Кумир выжирает слишком много памяти. После выставления лимита памяти в ejudg’e на 10 гигабайт все заработало. Win!

Кумир использовал более 2,5 GB оперативке запуская пустую программу. Как так? Куда тебе столько?

Запустив через strace я увидел следующую картину:

Нда… Ничего не понятно..

Конкретизируем: «grep mmap »

Еще конкретизируем:
mmap(NULL, 2147483648, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x7f9165b93000

Что это было? Кажется у кого-то переполнился int.

Тогда мне это надоело, и я забил. Я решил что раз программы запускаются и работают, то я переживу ML в 10GB. Тем более, что это виртуальная память, к которой не происходит (вроде бы) обращений. Я решил, что это битый пакет, но в ALT Linux’e это воспроизвести не удалось. Поэтому я свалил все на конвертацию пакета и битые зависимости.

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

Добавить комментарий

Ваш адрес email не будет опубликован.