Halstead 的软件度量

17 Mar 2025 | 5 分钟阅读

根据 Halstead 的说法,“计算机程序是算法的一种实现,它被认为是标记的集合,这些标记可以归类为运算符或操作数。”

标记计数

在这些度量中,计算机程序被认为是标记的集合,这些标记可以归类为运算符或操作数。所有软件科学度量都可以用这些基本符号来定义。这些符号被称为标记。

基本度量是

n1 = 唯一运算符的数量。
n2 = 唯一操作数的数量。
N1 = 运算符总出现次数。
N2 = 操作数总出现次数。

就使用的总标记而言,程序的大小可以表示为 N = N1 + N2。

Halstead 度量包括

程序体积 (V)

体积的度量单位是大小的标准单位“比特”。如果使用统一的二进制编码作为词汇表,它就是程序的大小。

        V=N*log2n

程序级别 (L)

L 的值范围在零和一之间,其中 L=1 代表以最高可能级别编写的程序(即,大小最小)。

        L=V*/V

程序难度

程序的难度级别或易出错性 (D) 与程序中唯一运算符的数量成正比。

        D= (n1/2) * (N2/n2)

编程工作量 (E)

E 的度量单位是基本心智辨别。

        E=V/L=D*V

估计程序长度

根据 Halstead 的说法,软件科学的第一个假设是,一个结构良好的程序的长度仅取决于唯一运算符和操作数的数量。

        N=N1+N2

估计程序长度用 N^ 表示

        N^ = n1log2n1 + n2log2n2

已发布以下替代表达式来估计程序长度

  • NJ = log2 (n1!) + log2 (n2!)
  • NB = n1 * log2n2 + n2 * log2n1
  • NC = n1 * sqrt(n1) + n2 * sqrt(n2)
  • NS = (n * log2n) / 2

潜在最小体积

潜在最小体积 V* 被定义为编码问题时最短程序的体积。

        V* = (2 + n2*) * log2 (2 + n2*)

此处,n2* 是唯一输入和输出参数的数量

词汇量大小 (n)

程序词汇量的大小,包括用于构建程序的唯一标记的数量,定义为

        n=n1+n2

其中

n=程序的词汇量
n1=唯一运算符的数量
n2=唯一操作数的数量

语言级别 - 显示算法实现程序的语言级别。如果用低级程序语言编写,同一算法需要额外的工作量。例如,用 Pascal 编程比用汇编语言容易。

        L' = V / D / D
lambda = L * V* = L2 * V

语言级别

语言语言级别 λ方差 σ
PL/11.530.92
ALGOL1.210.74
FORTRAN1.140.81
CDC 汇编0.880.42
PASCAL2.54-
APL2.42-
C0.8570.445

C 语言计数规则

  1. 注释不考虑。
  2. 标识符和函数声明不考虑。
  3. 所有变量和常量都视为操作数。
  4. 同一程序不同模块中使用的全局变量被计为同一变量的多次出现。
  5. 不同函数中名称相同的局部变量被计为唯一的操作数。
  6. 函数调用被视为运算符。
  7. 所有循环语句,例如 do {...} while ( ), while ( ) {...}, for ( ) {...},所有控制语句,例如 if ( ) {...}, if ( ) {...} else {...} 等,都被视为运算符。
  8. 在控制结构 switch ( ) {case:...} 中,switch 以及所有 case 语句都被视为运算符。
  9. 保留字如 return, default, continue, break, sizeof 等被视为运算符。
  10. 所有括号、逗号和终止符都被视为运算符。
  11. GOTO 被计为运算符,标签被计为操作数。
  12. "+" 和 "-" 的一元和二元出现分别处理。同样,"*"(乘法运算符)也分别处理。
  13. 在数组变量如“array-name [index]”中,“array-name”和“index”被视为操作数,而“[ ]”被视为运算符。
  14. 在结构变量如“struct-name, member-name”或“struct-name -> member-name”中,struct-name、member-name 被视为操作数,而“.”、“->”被视为运算符。不同结构变量中成员元素的某些名称被计为唯一的操作数。
  15. 所有哈希指令都被忽略。

示例:考虑如图所示的排序程序:列出运算符和操作数,并计算软件科学度量值,如 n、N、V、E、λ 等。

解决方案:运算符和操作数列表如下表所示

运算符出现次数操作数出现次数
int4SORT1
()5x7
,4n3
[]7i8
if2j7
<2save3
;11im13
for222
=613
-101
<=2--
++2--
return2--
{}3--
n1=14N1=53n2=10N2=38

此处 N1=53 且 N2=38。程序长度 N=N1+N2=53+38=91

程序词汇量 n=n1+n2=14+10=24

体积 V= N * log2N=91 x log2 24=417 比特。

程序的估计程序长度 N

                = 14 log214+10 log2)10
                = 14 * 3.81+10 * 3.32
                = 53.34+33.2=86.45

概念上,唯一的输入和输出参数由 n2* 表示。

        n2*=3 {x: 用于存储要排序整数的数组。该数组用作输入和输出}

                {N: 要排序的数组的大小}

潜在体积 V*=5log25=11.6

由于         L=V*/V

Halstead's Software Metrics

我们可以使用另一个公式

                V^=V x L^= 417 x 0.038=15.67
                E^=V/L^=D^ x V

Halstead's Software Metrics

因此,构造该程序需要 10974 次基本心智辨别。

Halstead's Software Metrics

这可能是生产该程序的一个合理时间,该程序非常简单。


下一个主题功能点 (FP) 分析