ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
11 июля
351827
Evgeny_CD, Архитектор (04.09.2012 20:19 - 20:26, просмотров: 5142)
Отметим начало нового сезона! Придумалось!!! Как сделать удобную систему разметки исходников на любом «обычном» языке программирования. Пусть мы делаем некую продвинутую систему программирования, скажем, на С. Генерация С кода из мегаязыка, изоморфное отображение С кода на граф алгоритма и т.д. Возникает извечная задача – как в С код всунуть некие теги, не имеющие отношения к С, и не получить при этом исходник на brainfuck? Можно наделать всяких макросов или псевдомакросов (которые препроцессор раскроет в пробелы), но это приведет к изрядном засиранию кода и может сильно замедлить время трансляции. Можно наделать каментов а ля doxygen, но это тоже прилично унавозит исходник. + много руками набивать надо. Мои постоянные читатели помнят, что я тут предлагал много разных экзотических вариантов решения проблемы – одно страннее другого :). Если дополнительно поставить задачу совместимости с SVN и возможность применения утилиты а ля diff – то станет еще тоскливее. Делаем так. Пишем исходник в некотором продвинутом редакторе. В одном окне – обычный текст. В другом окне – некие дополнительные описания. Т.е. в первом окне выделяем тег или группу тегов, строку или фрагмент, а во втором окне – пишем камент, ставим ссылку на какую-то внешнюю базу данных, граф алгоритма и прочее. Продвинутый редактор хранит эти связи в памяти, и строит «карту исходника» - ссылку от каждого символа на некий объект. Или какое-то бинарное дерево для поиска – в дерево «вводишь» строку и символ – тебе дают ссылки на объекты. Когда редактирование завершено, «продвинутый редактор» формирует файл исходника. Вначале идет обычный исходник, а в конце файла (применительно к С) блок вида:/*<binary descriptor ID 1234> MIME двоичные данные – та самая внутренняя БД «продвинутого редактора». ZIP или нечто подобное как вариант для уменьшения размеров. </binary descriptor ID 1234>*/(пример примитивен – как иллюстрация идеи). При создании новой версии файла идентификатор ++ - для удобства diff. Файл исходника сразу станет мегабайтный (или даже 10 мегабайтный), но это не создает никаких проблем.
  • Блок в конце, и глядеть его глазами не обязательно.
  • Для компилера это просто камент, и он его тупо скипает.
  • Для diff не зря стоит новый идентификатор. В любом адекватном текстовом редакторе можно настроить фолдинг мегабайтов мусора, которые между строками /*<binary descriptor ID 1234> и </binary descriptor ID 1234>*/.
  • Что мы имеем в итоге?
  • Результат работы продвинутой системы совместим с любым редактором и любым компилером. Естественно, что для полного использования возможностей нужно использовать продвинутый редактор, а вот собрать можно чем угодно.
  • Скорость сборки упадет незначительно. Даже если файлы из 1к -> 1м – RAM DRIVE|SSD нас спасут.
  • Читабельность исходника не страдает совершенно.
  • Продвинутость ничем не ограничена. Совершенно!!!
  • Критика идеи? Вопросы?