准确访问VB6限制

问题描述 投票:14回答:6

虽然过时和痛苦 - 我在一家公司工作,继续积极使用VB6进行大型项目。实际上,18个月前我们遇到了32k标识符限制。

不愿意放弃大型代码库并重写.NET中的所有内容,我们将应用程序分解为主可执行文件和几个支持DLL文件。本周我们又遇到了32k的限制。

我们遇到的问题是,我们找不到的任何工具都会告诉我们我们的源使用了多少个唯一标识符。我们没有准确的方法来衡量我们的努力如何减少标识符的数量或我们达到限制之前的接近程度。

有没有人知道一个工具会扫描项目的来源并返回一些准确的指标和统计数据?

vb6 code-metrics
6个回答
2
投票

好。项目指标查看器是Aivosto项目分析器工具的一部分,它将完全按照您的要求进行操作。我已经包含了截图以及指标列表的链接,其中包括变量数量等。

Metrics List

alt text (来源:aivosto.com


1
投票

我工作的公司也有一个大型VB6项目,遇到了标识符限制。我开发了一种方法来准确计算剩余标识符的数量,这已经包含在我们的项目构建过程中。

在尝试了几个没有成功的工具之后,我终于意识到VB6 IDE本身确切地知道它剩下多少个标识符。实际上,当您将一个变量添加到其限制之外时,VB6 IDE会抛出“内存不足”错误。

利用这一事实,我编写了一个VB6加载项项目,该项目首先在IDE中编译当前加载的项目,然后将唯一命名的变量添加到项目中,直到它抛出错误。当引发错误时,它会将错误之前添加的标识符数记录为剩余的标识符数。

此编号存储在文件中,位于我们的自动构建过程已知的位置,然后读取此编号并将其报告给开发团队。当它低于我们感到满意的值时,我们会安排一些重构时间并将更多代码从此项目中移出到DLL项目中。我们几年来一直在生产中使用它,并且已被证明是一种可靠的工艺。

要直接回答这个问题,使用加载项是我知道准确测量剩余标识符数量的唯一方法。虽然我无法共享我们的项目正在使用的加载项代码,但我可以说没有太多代码涉及,并且开发时间不长。

微软有一个关于如何创建加载项的合适指南,它可以帮助您入门:https://support.microsoft.com/en-us/kb/189468

以下是计算标识符的一些重要细节:

  • 在超出标识符之前,VB6 IDE将不会始终抛出错误,直到编译了当前加载的项目。我们的加载项以编程方式执行此操作,然后添加标识符以确保准确计数​​。如果项目无法编译,则无法获得准确的计数。
  • 新的空VB6项目有32,500个标识符可用。
  • 只有唯一标识符名称。两个不同例程中具有相同名称的两个局部变量仅计为一个标识符。

1
投票

AxTools的CodeSmart非常好。 alt text (来源:axtools.com


0
投票

作弊 - 使用####唯一变量创建一个未使用的类。使用Excel或其他东西生成按字母顺序排列的唯一变量名称。达到限制时从项目中删除类,或注释掉100个唯一变量的块。

我宁愿依靠编译器(它定义了多少变量太多)而不是某些第三方工具。

(哦,crud,对不起necro - 没有注意到日期)


0
投票

您可以从一个从VB6代码中提取标识符的工具中获取此信息。然后,您所要做的就是对列表进行排序,消除重复项并测量列表大小。我们有一个source code search engine将源代码分解为语言标记(“lexes”),其中一些标记正是那些标识符。这将包含您想要的数据。

但也许还有另一种方法可以解决您的问题:找出哪些变量名很少出现,并用一组标准名称(例如“temp”)替换它们。所以你真正想要的是每个变量名称的数量,这样你就可以对“少量引用”进行排序。相同的词法分析器数据可以提供此信息。

然后,您只需要一个工具,将低位置标识符重命名为标准集中的某些内容。我们提供的混淆器可以替换另一个可能做到这一点的名称。

[2014年10月更新]。和这个问题的某个人进行了长时间的交谈。事实证明,有一个非常概念性的答案可以作为工具的基础,这就是所谓的register coloring,它将固定数量的寄存器分配给任意数量的操作数。这通过计算操作数上的“干涉图”来工作;并且可以为两个不“干扰”的操作数分配相同的寄存器。如果干扰图不够糟糕,可以使用它将2 ^ 16个可用变量名称分配给任意数量的标识符。我的猜测是不是。 YMMV,还有人还需要构建这样一个工具,需要一个VB6解析器和机器来计算这样的图形。 [看看我的生物]。


-1
投票

似乎Compuware's DevPartner有这种代码分析。我不知道当前版本是否仍支持Visual Basic 6.0。 (但至少可以进行为期14天的试用)

© www.soinside.com 2019 - 2024. All rights reserved.