Это звучит как работа, для которой Tcl / Tk была разработана. Он имеет очень простой C API, который позволяет регистрировать команды с помощью обратного вызова. Если вы используете команду в программе Tcl, она вызовет функцию обратного вызова и предоставит механизм для преобразования аргументов между списком Tcl (структура собственных данных) и массивом стиля ARGV типа char *.
Он был разработан специально для того, чтобы можно было легко модифицировать этот вид оболочки для программ на C, запускаемых из командной строки. Существует также множество других режимов, которые вы можете использовать для взаимодействия с интерпретатором, и его легко встроить в программы в качестве языка сценариев. По памяти доступны следующие механизмы сопряжения:
- Регистрация команд в Tcl
Переводчик
- Вставьте Tcl-интерпретатор в ваш
запрограммировать и использовать Tcl в качестве встроенного
язык сценариев (возможно, включая регистрацию команд и обратные вызовы на ваш
программа)
- Создать процесс с дуплексным каналом и отправлять команды через
стандартный / стандартный вывод (вы также можете прикрепить
обработчик события в канал, который
вызывается при наличии данных)
- Меньше Tcl специфических механизмов, таких как
fork / exec или подключение через сокеты.
Книга Оустерхаута Tcl и TK Toolkit немного устарели, но содержат хорошее руководство по C API. Практическое программирование Уэлча в Tcl / Tk - другая классическая книга по Tcl / Tk, которая обновляется чаще. Есть также несколько других книг и довольно много электронных ресурсов в Интернете. Вот некоторые хорошие отправные точки: Учебное пособие по Tcl , Учебное пособие по TK , Сайт поддержки Tcl (возможно, стоит попробовать, чтобы помочь вам решить, хотите ли вы идти по этому маршруту ), Tcl / Tk Wiki и, конечно, Stackoverflow .
TK предоставит вам простой графический интерфейс и его очень легко научить программировать - если немного упрощенно. Это не так уродливо, как раньше , если вы потратите некоторое время на настройку внешнего вида или воспользуетесь движком тем, например Tile.
Как отмечает Норман Рэмси (+1) , другая альтернатива с простым C API - это Lua. Оба имеют свои преимущества и недостатки. Основными преимуществами Tcl являются простой и четко интегрированный инструментарий TK и хорошая, зрелая поддержка из сторонних библиотек (например, Tix ). Основным преимуществом Lua является то, что язык намного приятнее, но нет стандартного инструментария GUI, поэтому пользовательский интерфейс не так хорошо интегрирован. Lua также имеет гораздо лучшую поддержку потоков в интерпретаторе, разработанную для этого с нуля. Однако, если вы оборачиваете устаревшее приложение C / unix, это вряд ли будет важной функцией.
WXWidgets значительно сложнее, чем TK и несет больше времени выполнения багажа, но имеет более богатый набор функций.
Если у вас есть реальная причина полагать, что ваш сценарий превратится в более масштабное приложение, вы можете рассмотреть Lua. Тем не менее, в более широком масштабе вы находитесь в крупном проекте разработки, и Python или Ruby начинают становиться жизнеспособными вариантами. По мере того, как проект становится больше, кодовая база C станет меньшей частью всего проекта, а поддержка сторонних библиотек станет более важным фактором.
Если вы пойдете с Tcl и обнаружите, что ваш проект получает свою собственную жизнь, рассмотрите возможность встраивания интерпретатора Tcl и повторного приведения приложения в качестве API-интерфейса плагина, в который люди могут подключать свои собственные сценарии. Дополнительные функции могут быть выполнены в виде сценариев и, возможно, предоставлены сторонним организациям для обслуживания. Одним из преимуществ системы со встроенным языком сценариев является то, что вам лично не обязательно реализовывать функции. Люди могут написать свои собственные расширения на языке сценариев или заставить третьих лиц сделать это за них.
SWIG предназначен для создания оболочек вокруг библиотек. Он анализирует заголовочные файлы и создает слой клея, который представляет собственный API на целевом языке. Чтобы использовать его, вам нужно будет повторно преобразовать вашу программу в библиотеку.