tahorg уже написал все правильно, но я хочу проиллюстрировать простым примером.
Рассмотрим ситуацию: Игрок дал команду <planes.
Раздельная реализация: парсер на Java (П), контроллер миссий на C# (К) и логика на Питоне (Л).
1. П видит команду <planes, и должен спросить К о наличии самолетов
2. Каким-то образом опрелелят где находится К
3. Устанавливает канал обмена информацией с К
4. Упаковывает данные: имя команды,имя игрока, координаты... возможно еще что-то
5. Передает К
6. К распаковывает
7. Производит вычисления и определяет наличие самолетов на данном поле.
8. Запаковывает запрос к Л на определение возможности взлета данному игроку на каждом из самолетов.
9. Передает Л
10. Л анализирует
11. Упаковывает обратно отфильтрованный список
12. K принимает ответ
13. Упаковывает для ответа П
14. П распаковывает ответ
15. П форматирует, переводит в локаль пользователя и выплевывает в чат.
В случае с встроенным СЯ и имея контроллер K допустим на Ruby получим:
1. П видит команду <planes, и должен спросить К о наличии самолетов
2. Находит у себя объект К
3. Вызывает метод для команды <planes
4. Производит вычисления и определяет наличие самолетов на данном поле.
5. Находит объект Л
6. Вызывает метод объекта Л и получает отфильтрованный список
7. К возвращает список
8. П форматирует, переводит в локаль пользователя и выплевывает в чат.
При этом создание протокола для передачи это отдельная задача, гораздо более сложная и ошибкоемкая чем парсинг лога...