Точный доступ к ограничениям VB6

Как устаревший и болезненный, так это - я работаю в компании, которая продолжает активно использовать VB6 для большого проекта. Фактически, 18 месяцев назад мы столкнулись с лимитом идентификатора 32k.

Не желая сдаваться на базе большого кода и переписывать все в .NET, мы разбили наше приложение на основной исполняемый файл и несколько поддерживающих DLL файлов. На этой неделе мы снова столкнулись с лимитом 32 тыс.

Проблема заключается в том, что ни один инструмент, который мы можем найти, не скажет нам, сколько уникальных идентификаторов используется нашим источником. У нас нет точного способа оценить, как наши усилия уменьшают количество идентификаторов или насколько мы близки к пределу, прежде чем мы достигнем его.

Кто-нибудь знает инструмент, который сканирует исходный код для проекта и возвращает некоторые точные показатели и статистику?

Ответы

Ответ 1

OK. Средство просмотра показателей проекта, которое является частью инструмента Project Analyzer от Aivosto, будет делать именно то, что вы хотите. Я включил скриншот, а также ссылку на список показателей, который включает в себя количество переменных и т.д.

Список показателей

alt text http://www.aivosto.com/project/help/pm-main.gif

Ответ 3

Компания, в которой я работаю, также имеет большой проект VB6, столкнувшийся с лимитом идентификатора. Я разработал способ точно подсчитать количество оставшихся идентификаторов, и это было включено в наш процесс сборки для этого проекта.

После нескольких попыток без успеха я наконец понял, что сам ID VB6 точно знает, сколько идентификаторов осталось. Фактически, VB6 IDE выдает ошибку "из памяти", когда вы добавляете одну переменную за ее пределы.

Воспользовавшись этим фактом, я написал проект надстройки VB6, который сначала компилирует загруженный в настоящее время проект в среде IDE, а затем добавляет в проект уникальные имена переменных, пока не выдает ошибку. Когда возникает ошибка, она записывает количество идентификаторов, добавленных до ошибки, в число оставшихся идентификаторов.

Этот номер хранится в файле в месте, известном нашему автоматизированному процессу сборки, который затем считывает это число и сообщает об этом команде разработчиков. Когда он становится ниже ценности, с которой нам удобно, мы планируем некоторое время рефакторинга и переходим больше кода из этого проекта в проекты DLL. Мы используем это в производстве уже несколько лет и зарекомендовали себя как надежный процесс.

Чтобы напрямую ответить на вопрос, использование надстройки - единственный способ узнать точное количество оставшихся идентификаторов. Хотя я не могу использовать код надстройки, который использует наш проект, я могу сказать, что не так много кода, и разработка не заставила себя долго ждать.

В Microsoft есть достойное руководство по созданию надстройки, которое может вас запустить: https://support.microsoft.com/en-us/kb/189468

Вот некоторые важные детали, относящиеся к подсчету идентификаторов:

  • VB6 IDE не будет последовательно генерировать ошибку, если из идентификаторов до тех пор, пока не будет скомпилирован текущий загруженный проект. Наша надстройка программно делает это, прежде чем добавлять идентификаторы, чтобы гарантировать точный подсчет. Если проект не может быть скомпилирован, то точное количество не может быть получено.
  • Доступно 32 500 идентификаторов для нового пустого проекта VB6.
  • Учитываются только имена уникальных идентификаторов. Две локальные переменные с одинаковым именем в двух разных подпрограммах считаются только одним идентификатором.

Ответ 4

Вы можете получить это из инструмента, который извлекал идентификаторы из кода VB6. Тогда вам нужно всего лишь отсортировать список, устранить дубликаты и измерить размер списка. У нас есть поисковая система исходного кода, которая разбивает исходный код на токены языка ( "lexes" ), причем некоторые из этих токенов являются именно этими идентификаторами, Это будет содержать именно нужные вам данные.

Но, возможно, есть другой способ решить вашу проблему: выяснить, какие имена переменных встречаются редко и заменить их набором стандартных имен (например, "temp" ). Так что вы действительно хотите, это количество чисел каждого имени переменной, чтобы вы могли сортировать "небольшое количество ссылок". Эти данные lexer могут предоставить эту информацию.

Тогда вам понадобится инструмент для переименования идентификаторов низкого уровня в нечто из стандартного набора. Мы предлагаем обфускаторы, которые заменяют одно имя другим, что, вероятно, может это сделать.

[Обновление Oct 2014]. Просто был длинный разговор с кем-то с этой проблемой. Оказывается, есть довольно концептуальный ответ, на котором основывается инструмент, и это называется регистр раскраски, который выделяет фиксированное количество регистров для произвольное число операндов. Это работает путем вычисления "интерференционного графа" над операндами; и двум операндам, которые не "мешают", может быть присвоен один и тот же регистр. Можно было бы использовать это, чтобы выделить 2 ^ 16 доступных имен имен переменных для произвольного количества идентификаторов, если граф помех недостаточно плох. Я предполагаю, что это не так. YMMV, и кто-то еще должен построить такой инструмент, нуждающийся в том, чтобы парсер и машина VB6 вычислили такой график. [Проверьте мою биографию].

Ответ 5

Cheat - создать неиспользуемый класс С#### уникальными переменными в нем. Используйте Excel или что-то для генерации алфавитных уникальных имен переменных. Удалите класс из проекта, когда вы достигнете предела, или закомментируйте блоки из 100 уникальных переменных.

Я предпочел бы опереться на компилятор (который определяет, сколько переменных слишком много), чем на любом стороннем инструменте.

(oh crud, извините necro - не заметил даты)

Ответ 6

Кажется, что Compuware DevPartner имел такой анализ кода. Я не знаю, поддерживает ли текущая версия Visual Basic 6.0. (Но, по крайней мере, существует 14-дневная пробная версия)