计算机程序是一种算法的实现,该算法被认为是令牌的集合,可以将令牌分类为运算符或操作数。 Halstead的指标包含在许多对软件代码行进行计数的当前商业工具中。通过计算令牌并确定哪些是运算符,哪些是操作数,可以收集以下基本度量:
n1 =不同运算符的数量。
n2 =不同操作数的数量。
N1 =运算符出现的总数。
N2 =操作数的总数。
除上述内容外,Halstead还定义了以下内容:
n1 * =潜在运算符。
n2 * =潜在操作数。
Halstead将n1 *和n2 *分别表示为模块和程序的最小可能的运算符和操作数。此最小数量将体现在编程语言本身中,在该语言中已经存在所需的操作(例如,在C语言中,任何程序都必须至少包含函数main()的定义),可能是作为函数还是作为一个过程:n1 * = 2,因为任何函数或过程都必须出现至少2个运算符:1表示函数的名称,1表示分配或分组的符号,n2 *表示参数的数量,无重复,这将需要传递给函数或过程。
霍尔斯特德指标-
霍尔斯特德指标是:
- Halstead程序长度–运算符出现的总数和操作数出现的总数。
N = N1 + N2估计的程序长度为N ^ = n1log 2 n1 + n2log 2 n2
下列替代表达式已发布,以估计程序长度:
- N J =日志2 (n1!)+日志2 (n2!)
- N B = n1 *对数2 n2 + n2 *对数2 n1
- N C = n1 * sqrt(n1)+ n2 * sqrt(n2)
- N S =(n * log 2 n)/ 2
- Halstead词汇表–唯一运算符和唯一操作数出现的总数。
n = n1 + n2 - 程序容量–与程序大小成比例,表示存储程序所需空间的大小(以位为单位)。此参数取决于特定的算法实现。 V,N和代码中的行数显示为线性连接,并且对于测量相对程序大小同样有效。
V =大小*(log 2词汇)= N * log 2 (n)
体积的度量单位是“位”大小的通用单位。如果对词汇表使用统一的二进制编码,则它是程序的实际大小。错误=体积/ 3000
- 潜在最小容量–潜在最小容量V *定义为可以在其中编码问题的最简洁程序的容量。
V * =(2 + n2 *)*对数2 (2 + n2 *)
在此,n2 *是唯一输入和输出参数的计数
- 程序级别–要对编程语言进行排名,请考虑由编程语言提供的抽象级别,即程序级别(L)。语言的等级越高,使用该语言开发程序所花费的精力就越少。
L = V * / V
L的值在0到1之间,其中L = 1表示以最高级别(即最小大小)编写的程序。
估计的程序级别为L ^ = 2 *(n2)/(n1)(N2) - 程序难度–此参数显示处理程序的难度。
D =(n1 / 2)*(N2 / n2)
D = 1 / L
随着程序执行量的增加,程序级别会降低,难度也会增加。因此,诸如操作数的冗余使用之类的编程实践,或者不使用高级控制构造的失败将趋于增加数量和难度。 - 编程工作量–测量将现有算法转换为指定程序语言的实现所需的智力活动量。
E = V / L = D * V =难度*体积 - 语言级别–显示算法实施程序的语言级别。如果使用低级程序语言编写相同的算法,则需要付出额外的努力。例如,在Pascal中编程比在Assembler中编程容易。
L’= V / D / D的
λ= L * V * = L 2 * V - 智能内容–确定程序中显示(说明)的智能量。此参数独立于实现该程序的程序语言,提供了对程序复杂性的度量。
我= V / D - 编程时间–显示将现有算法转换成指定程序语言的实现所需的时间(分钟)。
T = E /(f * S)还使用了心理学家约翰·斯特劳德(John Stroud)提出的人脑处理速率的概念。 Stoud将时刻定义为人脑执行最基本决定所需的时间。因此,Stoud数S是Stoud每秒的力矩,其中:
5 <= S <=20。Halstead使用18。S的值是根据心理推理经验得出的,其在编程应用中的建议值为18。转体数S = 18矩/秒
秒-分钟因子f = 60
C语言的计数规则–
- 不考虑评论。
- 不考虑标识符和函数声明
- 所有变量和常量都被视为操作数。
- 在同一程序的不同模块中使用的全局变量被计为同一变量的多次出现。
- 在不同函数中具有相同名称的局部变量计为唯一操作数。
- 函数调用被视为运算符。
- 所有循环语句,例如,对于{} {…},{{}},而(){…},而(){…},所有控制语句,例如if(){…},if(){…} else {…},等被视为运算符。
- 在控制构造switch(){case:…}中,switch以及所有case语句都被视为运算符。
- 保留字(例如return,default,continue,break,sizeof等)被视为运算符。
- 所有方括号,逗号和终止符均视为运算符。
- GOTO被计为运算符,标签被计为操作数。
- “ +”和“-”的一元和二进制出现分别处理。同样,“ *”(乘法运算符)也分开处理。
- 在数组变量中,例如“ array-name [index]”,“ array-name”和“ index”被视为操作数,而[]被视为运算符。
- 在“结构名,成员名”或“结构名->成员名”等结构变量中,将结构名,成员名作为操作数,将“。”,“->”作为操作数。运算符。不同结构变量中成员元素的某些名称被计为唯一操作数。
- 所有的hash指令都将被忽略。
示例–列出运算符和操作数,并计算软件科学度量值,例如
int sort (int x[ ], int n)
{
int i, j, save, im1;
/*This function sorts array x in ascending order */
If (n< 2) return 1;
for (i=2; i< =n; i++)
{
im1=i-1;
for (j=1; j< =im1; j++)
if (x[i] < x[j])
{
Save = x[i];
x[i] = x[j];
x[j] = save;
}
}
return 0;
}
解释 –
operators | occurrences | operands | occurrences |
int | 4 | sort | 1 |
() | 5 | x | 7 |
, | 4 | n | 3 |
[] | 7 | i | 8 |
if | 2 | j | 7 |
< | 2 | save | 3 |
; | 11 | im1 | 3 |
for | 2 | 2 | 2 |
= | 6 | 1 | 3 |
– | 1 | 0 | 1 |
<= | 2 | – | – |
++ | 2 | – | – |
return | 2 | – | – |
{} | 3 | – | – |
n1=14 | N1=53 | n2=10 | N2=38 |
Therefore,
N = 91
n = 24
V = 417.23 bits
N^ = 86.51
n2* = 3 (x:array holding integer
to be sorted. This is used both
as input and output)
V* = 11.6
L = 0.027
D = 37.03
L^ = 0.038
T = 610 seconds
Halstead指标的优点:
- 它很容易计算。
- 它衡量程序的整体质量。
- 它可以预测错误率。
- 它可以预测维护工作量。
- 它不需要对程序结构进行全面分析。
- 在计划和报告项目中很有用。
- 它可以用于任何编程语言。
Halstead指标的缺点:
- 这取决于完整的代码。
- 它没有用作预测估计模型。
参考 –
Halstead复杂性度量–维基百科
ristancase