Точный доступ к ограничениям VB6 - PullRequest
14 голосов
/ 17 апреля 2009

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

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

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

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

Ответы [ 6 ]

2 голосов
/ 17 апреля 2009

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

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

alt text
(источник: aivosto.com )

1 голос
/ 30 сентября 2015

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

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

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

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

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

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

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

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

CodeSmart от AxTools очень хороший.
alt text
(источник: axtools.com )

0 голосов
/ 16 марта 2010

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

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

(о боже, прости некро - не заметил дат)

0 голосов
/ 12 августа 2009

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

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

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

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

0 голосов
/ 17 апреля 2009

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

...