Tải bản đầy đủ (.docx) (31 trang)

Báo cáo môn học các vấn đề hiện đại công nghệ phần mềm docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (745.52 KB, 31 trang )

Báo cáo môn học các vấn
đề hiện đại công nghệ phần
mềm
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
LỜI CẢM ƠN
Để hoàn thành báo cáo môn học các vấn đề hiện đại công nghệ phần mềm
một cách hoàn chỉnh, chúng em xin bày tỏ lòng cảm ơn chân thành đến các
thầy cô đã hướng dẫn chúng em tại trường Đại Học Công Nghệ. Đặc biệt là
thầyĐặng Đức Hạnh và cô Vũ Diệu Hương, thầy cô đã trực tiếp hướng dẫn
tận tình, sửa chữa và đóng góp nhiều ý kiến quý báu giúp chúng em hoàn
thành tốt báo cáo môn học của mình.
Lời cảm ơn chân thành và sâu sắc, chúng em xin gửi đến gia đình, đã
luôn sát cánh và động viên chúng em trong những giai đoạn khó khăn nhất.
Chân thành cảm ơn đến các bạn trong lớp đã hỗ trợ để chúng em có
thể hoàn thành tốt công việc được giao.
Chúng em xin chân thành biết ơn sự tận tình dạy dỗ của tất cả các quý
thầy cô Khoa Công nghệ Thông tin – Trường Đại học Công Nghệ Thông
Tin – Đại học Quốc gia Hà Nội.
Chúng cũng xin chân thành gửi lời cảm ơn đến tất cả các thầy cô đã
giảng dạy chúng em thời gian qua, đã truyền đạt và trang bị cho chúng em
những kinh nghiệm, kiến thức chuyên môn, giúp chúng em mở rộng tầm nhìn
khi thâm nhập vào thực tế. chúng em xin hứa sẽ không ngừng phấn đấu nỗ
lực vươn lên trong học tập và công tác sau này.
2
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Phụ lục
3
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
CHƯƠNG 1
GIỚI THIỆU
1.1 Đặt vấn đề


Trong các công ty phát triển phần mềm hầu hết công việc kiểm thử của
kiểm thử viên được thực hiện thủ công bằng tay. Trong khi đó số lượng tình
huống kiểm tra quá nhiều mà các kiểm thử viên không thể hoàn tất bằng tay
trong thời gian cụ thể nào đó. Hoặc khi nhóm lập trình đưa ra nhiều phiên bản
phần mềm liên tiếp để kiểm tra. Thực tế cho thấy việc đưa ra các phiên bản
phần mềm có thể là hàng ngày, mỗi phiên bản bao gồm những tính năng mới,
hoặc tính năng cũ được sửa lỗi hay nâng cấp. Việc bổ sung hoặc sửa lỗi code
cho những tính năng ở phiên bản mới có thể làm cho những tính năng khác đã
kiểm tra tốt chạy sai mặc dù phần code của nó không hề chỉnh sửa. Để khắc
phục điều này, đối với từng phiên bản, kiểm thử viên không chỉ kiểm tra chức
năng mới hoặc được sửa, mà phải kiểm tra lại tất cả những tính năng đã kiểm
tra tốt trước đó. Điều này khó khả thi về mặt thời gian nếu kiểm tra thông
thường. Để giải quyết vấn đề này chúng ta áp dụng kỹ thuật kiểm thử dựa trên
mô hình cho quá trình sinh các ca kiểm thử tự động. Nhưng làm sao để thực
hiện được quá trình sinh các ca kiểm thử tự động chúng ta phải áp dụng khá
nhiều các công nghệ sẵn có và thông dụng nhất. Ở đây chúng em xin giới
thiệu mã nhúng C vào mô tả Promela và trình bày công cụ Spin để sinh ra các
ca kiểm thử tự động từ đó áp dụng vào một bài toán cụ thể.
Trong báo cáo này chúng em tập trung trình bày về việc nghiên cứu
kiểm thử dựa trên mô hình và ứng dụng công cụ Spin vào việc tự động sinh
các ca kiểm thử: Xây dựng mô hình hệ thốngvà thực nghiệm. Bên cạnh đó
chúng em cũng giới thiệu qua về trình soạn thảo Emac, một công cụ lập trình
khá hay và ra đời từ rất sớm, chạy được trên nhiều hệ điều hành thông dụng.
1.2 Nội dung báo cáo môn học
4
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Bài báo cáo trình bày ngôn ngữ Promela vào thiết kế Promela và áp
dụng kĩ thuật sử dụng công cụ Spin là hai nội dung quan trong nhất của quá
trình sinh ca kiểm thử tự động.
Đề xuất bài toán cụ thể để thực hiện công việc Demo một chương trình

nhỏ. Từ đó đem áp dụng vào phục vụ cho việc kiểm chứng phần mềm.
Xây dựng tài liệu hướng dẫn về ngôn ngữ Promela, công cụ Spin, trình
soạn thảo Emac phục vụ cho việc nghiên cứu, giảng dậy và ứng dụng thực
tiễn.
1.3 Cấu trúc báo cáo môn học
Các phần còn lại của khóa luận có cấu trúc như sau:
Chương 2: Trình bày các khái niệm về ngôn ngữ mô hình promela,
bao gồm các định nghĩa cơ bản về khai báo biến và kiểu, định danh, hằng
số, biểu thức, tiến trình.
Chương 3: Giới thiệu công cụ Spin, cấu trúc cú pháp lệnh, tham số
lệnh và chức năng của nó.
Chương 4: Giới thiệu công cụ soạn thảo Emacs.
Chương 5: Tóm tắt các kết quả đã đạt được, kết luận, những hạn chế
và hướng nghiên cứu phát triển trong tương lai.
5
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
CHƯƠNG 2
TRÌNH BÀY KHÁI NIỆM MÔ HÌNH PROMELA
Chương này sẽ lần lượt trình bày những khái niệm cơ bản về mô hình
Promela. Khái niệm cụ thể về cấu trúc cú pháp lệnh, thủ tục hàm, cách khai
báo biến trong Promela.
2.1 Khái niệm cơ bản ngôn ngữ Promela
Xây dựng mô hình hệ thống bằng ngôn ngữ Promela là một công đoạn
quan trọng trong kiểm thử dựa trên mô hình, để từ đó có thể dùng công cụ
Spin sinh ra các ca kiểm thử. Ngôn ngữ mô hình Promela có nhiều nét tương
đồng với ngôn ngữ C.
• Định nghĩa Promela (Process meta language )
Promela là ngôn ngữ mô hình dùng để mô tả hệ thống đồng thời [The
Spin Model Checker: Primer and Reference Manual].
Ví dụ: Giao thức mạng, hệ thống điện thoại, các chương trình giao tiếp

đa luồng,…
• Cấu trúc chương trình Promela
Một chương trình Promela cơ bản gồm:
 Khai báo kiểu.
 Khai báo biến.
 Khai báo tiến trình.
 [init process].
// Các khai báo kiểu và biến
mtype = {MSG, ACK};
chan toS =
chan toR =
bool flag;
// Một tiến trình
proctype Sender() {
// Thân một tiến trình

}
6
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
proctype Receiver() {

}
// Tiến trình init
init {
// Tạo một tiến trình

}
 
Giống như nhiều ngôn ngữ lập trình khác, Promela yêu cầu các biến
phải được khai báo trước khi chúng có thể được sử dụng. Khai báo biến theo

phong cách của ngôn ngữ lập trình C. Theo mặc định tất cả các biến của các
loại biến cơ bản được bắt đầu từ 0. Cũng như trong C thì 0 được coi như sai
và khác 0 được coi là đúng. Một biến có thể là biến toàn cục hoặc là biến địa
phương của mỗi tiến trình.

 
 
 !""
#$ %
"
!
"
%
 %
&
!
&
'
• ($)
int ii;
bit bb;
bb = 1;
ii = 2;
• *+,*
Records (structs): Có thể tìm ra xung đột khi chạy
Typedef record{
short f1;
byte f2;
}
7

Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Truy cập như C
Record rr;
rr.f1 = …
•  
/ *0*+,*$1#)2
) 3-)45
61789:)-/ -)4%#;<2
) 35) 35) 3-)4%5
• (<
Một bộ các hằng số tượng trưng được khai báo như sau:
mtype = {LINE_CLEAR, TRAIN_ON_LINE, LINE_BLOCKED}
• <$=>$) ?2@1A*#BC9)9D)**EF$
>,G$G2
chan <name> = [<dim>] of <type1>,<type2>, <typen>;
>,G$GBE$H-/(<$=I?
chan-name ! <expr1>, <expr2> <exprn>;
>,G$G$JE$H-/(<$=K?
chan-name ? <expr1>, <expr2> <exprn>;
& @$)$L8#;$M*
• @$)$
@$)$*0$-/*$*-/(7N
• L8#;
L8#;-/*$O(7N9:*$-/#;<$JGG$P
L8#;1A1*0$91A*9$$Q)$1#)2
R S TUVVV
• $M*
8
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Một biểu thức được xây dựng từ các biến, hằng số và sử dụng các toán

tử sau đây:
+, -, *, /, %, , ++,
>, >=, <, <=, ==, !=,
&&, ||, !,
&, |, ~, ^, >>, <<,
!, ?,
(), [],
W XF$
XF$-/$$G$Y*Z)$$;91A*9$$Q)[**9;
1A*C*
• Một tiến trình được khai báo bắt đầu bằng một từ khóa proctype và
gồm có:
Tên
Danh sách thông số chính
Khai báo biến cục bộ
Thân chương trình
• Cú pháp của một khai báo tiến trình
proctype name( /* formal parameter list */ )
{
/* các khai báo địa phương và các lệnh */

}
/* và */ quy định giới hạn chú thích trong promela
• Tiến trình init
Tất cả các chương trình promela đều cần một tiến trình init nó
giống như hàm main() trong ngôn ngữ C. Việc thực thi một chương
trình promela được bắt đầu từ tiến trình init.
9
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Một tiến trình init có dạng:

init { /* Các khai báo địa phương và các biểu thức. */ }
Đơn giản nhất có thể là chương trình promela có dạng:
init { skip }
Skip có nghĩa là không có biểu thức nào trong tiến trình init;
Mỗi tiến trình được định nghĩa bởi một proctype, nó được thực thi đồng
thời với tất cả các tiến trình khác, nó giao tiếp với các tiến trình khác thông qua
việc sử dụng các biến công cộng hoặc các kênh. Tiến trình thực thi sau khi thực
hiện hàm run.
/#;\C9].EF$
G*G $ =?G^=_L _?
G*G `=?G^=_ab_?
$ =?c`=?
" 6$*+,*$d- )
• O$91A*e**$f$)-/+*$+-G$g=c?
/#;$*+,*E<
• h(G2($i$N*$*$j$)9D($EF$kf
• d^2l)-$F$
• T## =m4G?2hBC(-)m4G$M*$AG
=nm4Go$F$N*$#pO?
• >+,*qG=?
>,G$G2
if
:: choice1 -> stat1.1; stat1.2;
:: choice2 -> stat2.1; stat2.2;
::
:: choicen -> statn.1; statn.2;
fi;
10
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Lựa chọn một trong các điều kiện thực thi

• >+,*##$=r?
do
:: choice1 -> stat1.1; stat1.2;
:: choice2 -> stat2.1; stat2.2;
::
:: choicen -> statn.1; statn.2;
od;
Lựa chọn được lặp đi lặp lại nhiều lần và có thể dừng nếu gặp break.
• >,G$GT*E
Xs($0)T*E *0$E;*$-k$ZC*91A*($)
$-
Lt.*Z)s($0))*E :)<(dG $$;
)9Y
n$1u$AG*Z)*v-/($)dG *0$91A*:)
8**$#BC-/ **$J;v*$kw\C2
active [4] proctype hello(){ printf("Hello") }
active [7] proctype world(){ printf("World\n") }
Lưu ý: trường hợp này sẽ tạo ra 4 trường hợp của “Hello” và
7 trường hợp của “World”
• >,G$GT-*
>0$#BCf-/$0-$-/$i)-*>*
$91A*$N*$9]x($i4 (pf**$EF$
($*
XN9/G$y$($0)($90**$EF$($*
*0$4 (p)
>,G$G2
atomic { statement1; ; statementn }
Statement1 chạy đầu tiên, statementn chạy cuối cùng.
11
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.

• >,G$Gz%hXmd
n$G$<.T-*2$i*$M):$)91A*:
)1
>$j*0$*$M)$1f*4*9$
X$u)*$:#pOh)%l=l{?*$q($0)
z%hXmd*N*(F$\*$9$N*$*|$tF$*$9D
$+
>,G$G2
d-step { statement1; ;statementn }
• >,G$GXlm%}~X
6$#p91A*$N*$($i*0-/$($***EF$
($*9)$N*$
•;$1$u)*$u*Z)L$;hG#BC9.t
H*49/
n0($iG$.-/|$e$u)$N**0$($i91A*
#BC-i$F$E- #%#$)-)$($$;
€ hN($*($#BCs($0)T-*z%# G*C
$
• i$F$
o $($i#BCs($0)*$1]F$
12
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Hình 1: Khi không sử dụng từ khóa
>*:$#$)($($i#BCs($0)#p91A*e<$ *i
/X1u$AG+*.**:$*0$:91A*s*$1]
F$9*0$#$)z90$:$($i*Y$-•
91A*1/$f#p-‚G$\-/G$Y/$f#;1A
:$$1J#p-*$1u$(($0*0$(-#91A*
o $#BCs($0)T-*
13

Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Hình 2: khi sử dụng từ khóa Atomic
Mặc dù câu lệnh Atomic sẽ không được chạy xen kẽ nhau nhưng các trạng
thái trung gian vẫn sẽ được khởi tạo và lưu trữ trong stack. Do đó khi có một
trạng thái trung gian (trạng thái A) bị khóa , ngắt thì lời gọi Atomic sẽ bị mất
và các trạng thái trung gian sẽ được đến thăm.
o $#BCs($0)z%hXmd
14
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Hình 3: khi sử dụng từ khóa D-Step
$*fs($0)T-*s($0)z%h G$N*$-/-‚<$-/1f*
$))*$($0)$F*$1]F$#pO>*:$)
#p($i91A*($[:
• /*$1]F$9].9(-)*$M*e($#BC**s
($0)
o ‚$2$($i#BCs($0)
15
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Hình 4: Chương trình không sử dụng lệnh Atomic, D-step
Khi không sử dụng từ khóa nào thì số các trạng thái sinh ra trong ví dụ trên sẽ
là 9 trường hợp. Do các câu lệnh trong hai tiến trình sẽ chạy xen kẽ với nhau.
o ‚$2$#BCs($0))-*$q*z%# G
z*$M*e*Z)-‚$)-*z%# G1]9;;$)*$j
($*$)9i*$,:$)91A*($[:
T-*2$[::$)$1*$j1#)*(>$
9($*0-/:$<-‚$)-*($0)
H$F-f$N*$**:$h)*(
z%# G2$i($[::$)<($*0-/:
$<-‚$z%# G($0)$F*$1]F$$N*$
#pO

16
int x=0
int y=0;int z=0
proctype A(){
printf("gia tri x1= %d\n", 1);
printf("gia tri y1= %d\n", 1);
printf("gia tri z1= %d\n", 1);
}
proctype B(){
printf("gia tri x2= %d\n", 2);
printf("gia tri y2= %d\n", 2);
printf("gia tri z2= %d\n", 2);
}
init {
run A();
run B();
}
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Hình 5: Khi sử dụng từ khóa Atomic, D-step
X1u$AG$F#;**:$#$)#p 9[F($
H9Y9:$4$F*$1]F$G$.*$:$9:$4&ƒ
-f4 (pf**:$($*91A*zN)9q*9--1u
(-$B*0$:f991A*($$**:$($i*Y$
17
int x=0
int y=0;
int z=0
proctype A(){
atomic{
printf("gia tri x1= %d\n", 1);

printf("gia tri y1= %d\n", 1);
printf("gia tri z1= %d\n", 1);
}
}
proctype B(){
printf("gia tri x2= %d\n", 2);
printf("gia tri y2= %d\n", 2);
printf("gia tri z2= %d\n", 2);
}
init {
run A();
run B();
}
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
CHƯƠNG 3
TRÌNH BÀY CÔNG CỤ SPIN, THAM SỐ, CÚ PHÁP LỆNH
3.1 Sơ lược về công cụ spin
SPIN là công cụ mã nguồn mở, phổ biến và được sử dụng bởi hàng
ngàn người trên toàn cầu.
SPIN được sử dụng cho việc xác minh thẩm định của các hệ thống
phân phối phần mềm.
Nó cung cấp một giả lập cho phép các nhà thiết kế đạt được kết quả
phản hồi từ hệ thống mô hình của họ. Những kết quả phản hồi đó đóng vai trò
quan trọng trong sự hiểu biết của các nhà thiết kế về hệ thống trước khi họ
đầu tư vào phân tích chính thức.
3.2 Lịch sử phát triển công cụ SPIN
Từ năm 1980 Spin được phát triển tại Bell Labs của nhóm Unix Phần
mềm này phát triển rộng rãi từ năm 1991.
Tháng 4 năm 2002 Spin được trao giải thưởng phần mềm uy tín cho
năm 2001 của ACM.

Các version chính: năm 1991 là 1.0 (initial version) tới năm 2002 đã có
SPIN version 4.0 (automata extration from C code).
1.0 Jan 1991 Initial version (Holzmann 1991
2.0 Jan 1995 Partial order reduction
3.0 Apr 1997 Minimised automaton
representation
4.0 Late 2002 Ax: automata extraction from C
code
5.0 Oct 2007 Multi-core & swarm support
6.0 Dec 2010 Inline LTL formula parallel bfs
3.3 Một số yếu tố thành công của SPIN
Cú pháp thực hiện (bằng cách sử dụng tựa ngôn ngữ C).
18
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Giao diện người dùng đồ họa đẹp Xspin.
Không chỉ là một công cụ nghiên cứu, mà còn là công cụ hỗ trợ.
Chứa nhiều hơn so với nhiều thập kỷ nghiên cứu kéo xác minh máy
tính tiên tiến AIDEC (nhiều thuật toán tối ưu hóa).
3.4 Kiến trúc SPIN – Cấp độ tổ chức Spin
Hình 6: Cấp độ tổ chức SPIN
3.4 Công cụ dòng lệnh.
3.4.1 Cú pháp Spin
Một số câu lênh trong SPIN.
Spin –a [-m] [-Pcpp] file
spin [-bglmprsv] [-J] [-qN] [-nN] [-Pcpp] file
spin -c [-t] [-Pcpp] file
spin -d [-Pcpp] file
spin -f LTL
spin -F file
19

Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
spin -i [-bglmprsv] [-J] [-qN] [-Pcpp] file
spin -M [-t] [-Pcpp] file
spin -o1 -o2 -o3 file
spin -t[N] [-bglmprsv] [-J] [-qN] [-Pcpp] file
spin –V
3.4.2 Tùy chọn và chức năng của mỗi lệnh
Bắt đầu bằng việc viết một chương trình có vai trò như một mô hình hệ
thống cần được kiểm thử (được viết bằng ngôn ngữ Promela).
Ví dụ: trong bài trình bày của nhóm em, em sử dụng counter.plm làm
file đầu vào. Nó đóng vai trò là mô hình hệ thống được kiểm thử.
• •yO*$1]F$
Chạy 2 câu lệnh sau:
$spin –c spec.pml
$spin –p spec.pml
Hai câu lệnh sẽ chạy mô phỏng mô hình. Câu lệnh đầu tiên sẽ tính toán
và cho ta đầu ra của hệ thống từ những đầu vào được khai báotrong mô
hình. Câu lệnh thứ hai cho ta quá trình mà hệ thống thay đổi theo khi
chạy mô hình.
Thực hiện debugged bằng dòng lệnh:
$spin –a counter.pml # generate verifier
Đầu ra file pan.c mô tả hệ thống bằng ngôn ngữ C hoàn toàn tự động.
• Biên dịch file pan.c. Lúc này, quyết định quan trọng là chọn xác minh
đầy đủ (Exhaustive verification) (CPU-time or memory) hoặc xác minh
không đầy đủ (Supertrace verification).
Xác minh không đầy đủ (Exhaustive verification)
Sẽ là tối ưu nhất khi sử dụng tham số -o2 –o, thời gian chạy xác minh
có thể chỉ còn một nửa so với cách sử dụng các tham số khác
$ gcc -O2 -o pan pan.c # default compilation
20

Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Nếu đã biết bao nhiêu phần của bộ nhớ vật lý được sử dụng thì có thể
sử dụng cú pháp sau: ví dụ có 256 Mb cho việc biên dịch, câu lệnh
được thực hiện sẽ là.
$ gcc -O2 -DMEMLIM=256 -o pan pan.c # memory bound 256Mb
Nếu việc xác minh vẫn chạy ra khỏi bộ nhớ, có thể sử dụng nén thay vì
tăng giới hạn bộ nhớ:
$ gcc -O2 -DMEMLIM=256 DCOLLAPSE -o pan pan.c # collapse
compression
Nếu vẫn là vượt quá giới hạn bộ nhớ thì sẽ sử dụng lựa chọn thứ hai
(Supertrace verification).
$ gcc -O2 -DMEMLIM=256 -DBITSTATE -o pan pan.c
# supertrace algorithm
• X$N*$*4*-$;1
o /4*-$9Y9Z
$ ./pan
o /4*-$($i9Y9Z
% Đối với chu kì acceptance cycles, sử dụng tham số -a:
% Đối với chu kì non-progress cycles:
$ gcc -O2 -DNP -o pan pan.c
Hoặc:
$ gcc -O2 -DNP -DBITSTATE -o pan pan.c
Tiếp theo là:
$ ./pan -l
% Đối với chu kì non-progress cycles:
$ gcc -O2 -DSAFETY -o pan pan.c
Hoặc:
$ gcc -O2 -DSAFETY -DBITSTATE -o pan pan.c
o >0$4*-$N)9/4P„-(-
$ . / Pan-m100000

Hoặc
$ . / Pan-m100000
21
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
• Sau khi thực hiện một loạt các hoạt động xác minh trên, có thể vào file
‘spec.pml.trail ‘ với ‘spec.pml’ là tên đầu vào PROMELA để xem các lỗi
nhận được sau khi debug.
o Để kiểm tra nguyên nhân gây ra lỗi sử dụng tham số -t.
$ Spin-t-c spec.pml
$ Spin-t-M spec.pml
$ Spin-t-r-s-l-g spec.pml
• Sinh test case
Mô hình SPIN và file thực thi pan sẽ cho ra một bộ test case một cách tự
động . SPIN gán số đầu vào cho tất cả các dòng lệnh. Đầu ra của hệ
thống với số liệu đầu vào trước đó được liệt kê, giúp theo dõi những gì
xảy ra của hệ thống. Sử dụng tham số -d để xem thòi gian và quá trình
chạy của hệ thống.
$ pan -d # print state machines
$ pan -d -d # print full, unoptimized state machines
3.4.3 Một ví dụ đơn giản.
Code và hướng dẫn thực thi được gửi kèm tài liệu báo cáo.
&WW hdln*i*C)9ƒ$k)($*
Hơn hai thập kỉ được nghiên cứu và phát triển, SPIN được phát triển
mạnh mẽ. Các công cụ có giao diện đồ họa giúp tiếp cận với SPIN cũng ra
đời và phát triển không ngừng.
Phải kể đến jSPIN, iSPIN, xSPIN. Mỗi công cụ kể trên đều có những
lợi thế nhất định để các nhà kiểm thử hệ thống lựa chọn cho công việc chuyên
môn của mình.
&W" L1f•*9qhdln
Tải về một phiên bản của SPIN từ trang chủ

Đổi tên file tải về thành spin.exe.
Tải và cài đặt một trình biên dịch C. Trong bài trình bày này, chúng em sử
dụng Cygwin Net Release Setup Program. Có thể tải về từ địa chỉ sau:
/>Copy spin.exe vào thư mục bin, nơi cài đặt Cygwin. VD:
C:\cygwin\bin.
22
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
CHƯƠNG 4
GIỚI THIỆU CÔNG CỤ SOẠN THẢO EMACS
m-)*#<*Z)-/$k**F$#:$.e.@q*1[
($.e-[/*Z)0d$H9Y)$e-V…
EGC*G$fe-m-)*#*0$]$91A*4PN
*$G$†G1u#BC($AG**$-)*9N9/$0)
*i*9q*f*#BCm-)*#6#G-/$*Z)6#G*
*+G-/($.e-[/#P
W $-*$M*e*Z)•n~m-)*#
• •n~m-)*#F$#:$.e.
• XN#)*$†GG$PG$;:
• >0$*$:<$$9$$
• >0$-[/2($i*$j$)9D**4*JG*$P-*‡*0
$:)$*$M*e-f
W >*:F$#:$.m-)*#
Emacs nguyên thuỷ được viết bằng ngôn ngữ lập trình của trình soạn
thảo văn bản TECO, và chạy trên DEC PDP-10 và -11. Emacs đầu tiên cho
các máy Unix là Gosling Emacs, sau này được thương mại hoá với tên
Unipress Emacs. GNU Emacs được viết bởi Richard Stallman, tác giả chính
của TECO Emacs nguyên thuỷ. Yêu cầu chính để một trình soạn thảo văn bản
được gọi là “emacs” là nó có thể được mở rộng đầy đủ với một ngôn ngữ lập
trình thực, không đơn thuần là một ngôn ngữ macro. Đối với GNU Emacs,
ngôn ngữ này là Lisp.

23
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Hình 7: Quá trình phát triển của Emacs
4.3 Bộ gõ phím
4.3.1 Bàn phím và bộ kí tự
Tất cả các lệnh của Emacs dùng bộ kí tự ASCII 8 bit.
4.3.2 Kí hiệu
C-x: Kí tự Control-x, với x là phím bất kì.
M-x: Kí tự Meta-x, với x là phím bất kì.
C-M-x: Kí tự Control-Meta-x, với x là phím bất kì.
RET: Phím return (thực ra là C-m).
SPC: Thanh khoảng trắng (space bar).
ESC: Phím escape, hay tương đương, C-[
4.4 Giao diện trình soạn thảo Emacs
24
Bộ môn : Các vấn đề hiện đại công nghệ phần mềm.
Hình 8: Giao diện trình soạn thảo Emacs
4.5 Cấu trúc lệnh Emac.
Đối với Emacs, mỗi gõ phím (keystroke) thực ra là một lệnh, ngay cả
các gõ phím đơn giản như các chữ cái A và z: in các ký tự là lệnh điền chúng
vào. Các ký tự không in (non-printing) là các lệnh soạn thảo, tức dùng để di
chuyển con trỏ, cuộn văn bản, xoá hoặc sao chép văn bản, v.v.
Mỗi lệnh có một tên dài, như kill-line, delete-backward-char, hay self-
insert-command. Các lệnh này được liên kết (bind) với một gõ phím để thuận
tiện khi soạn thảo. Mỗi cặp gõ phím và lệnh được gọi là liên kết phím (key
binding), hoặc gọi tắt là liên kết (binding).
Bộ các liên kết tạo thành bộ lệnh Emacs. Tuy nhiên, chúng có thể được
mở rộng và được thay đổi tuỳ thích.
4.6 Các phím đơn.
95 ký tự ASCII in được, chúng liên kết với self-insert-command để

được điền vào văn bản khi được gõ.Các ký tự điều khiển: C-a, C-b, : 32 kí tự
soạn thảo.Meta để sử dụng thêm 128 ký tự ở nửa trên của ASCII cho các lệnh
soạn thảo:
• M-a, M-b, (cũng có M-A là một kí tự riêng biệt, nhưng để giảm
thiểu nhầm lẫn các kí tự meta chữ hoa được coi như các kí tự meta
chữ thường tương ứng.)
• C-M-a (tương đương với M-C-a), (giữ Control và Meta đồng thời
và gõ phím kia.)
25

×