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

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

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

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

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

6 ответов


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

Список Метрик

alt текст http://www.aivosto.com/project/help/pm-main.gif



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

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

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

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

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

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

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

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

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

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

(О черт, извините за некро - не заметил даты)


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

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

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

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


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