【问题标题】:Accurately accessing VB6 limitations准确访问 VB6 限制
【发布时间】:2010-10-20 02:32:43
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: vb6 code-metrics


    【解决方案1】:

    好的。 Project Metrics Viewer 是 Aivosto 的 Project Analyzer 工具的一部分,它将完全满足您的需求。我已经包含了一个屏幕截图以及指标列表的链接,其中包括变量的数量等。

    Metrics List


    (来源:aivosto.com

    【讨论】:

    • 我希望这个工具能工作......它显示了变量声明的数量(就像 CodeSMART 一样),但它仍然没有显示唯一标识符的数量。如果您有三个 subs 都包含相同的变量“myvar”,那么它算作三个变量声明,但只有一个唯一标识符。项目分析器只显示声明的数量...
    【解决方案2】:

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

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

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

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

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

    Microsoft 有一个关于如何创建插件的不错的指南,可以帮助您入门: https://support.microsoft.com/en-us/kb/189468

    以下是一些特定于计数标识符的重要细节:

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

    【讨论】:

      【解决方案3】:

      AxTools 的 CodeSmart 非常好。

      (来源:axtools.com

      【讨论】:

      • 是的,但是提问者需要计算变量声明的数量,而我看不到 CodeSmart 显示该数字的位置。你能告诉我们它应该在哪里吗?谢谢。
      • 它在那里,但我没有图像托管来更正制造商网站上的屏幕截图。如果您下载试用版并安装它,您可以运行它并亲自查看。
      • 我已经安装了 CodeSMART 但我找不到它。你能说出显示这个值的树的“路径”吗?
      • 当然可以。打开 CodeSmart 项目资源管理器(替代 VB Ctrl-R 版本)并深入了解对象以查看更多详细信息,包括变量声明列表。
      • 我一定是盲人什么的...我可以看到方法、公共标识符的数量,但我找不到唯一标识符的数量...
      【解决方案4】:

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

      无论如何,我宁愿依靠编译器(它定义多少变量太多),而不是依靠一些 3rd 方工具。

      (哦,粗鲁,抱歉,没注意到日期)

      【讨论】:

        【解决方案5】:

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

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

        那么您所需要的只是一个工具,可以将低出现率的标识符重命名为标准集中的名称。我们提供了混淆器,可以将一个名称替换为另一个名称,这可能会做到这一点。

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2017-11-29
            • 1970-01-01
            • 2011-04-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多