1. Trang chủ
  2. » Công Nghệ Thông Tin

Tiểu luận Nguyên lý các Ngôn ngữ lập trình Lập trinh song song và lập trình tương tranh Ngôn ngữ lập trình Erlang Bản doc

76 603 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 76
Dung lượng 701,74 KB

Nội dung

Công nghệ luôn phát triển không ngừng, những nhu cầu mới phát sinh những công nghệ mới, những công nghệ nổi bật trở sẽ thành xu hướng. Ngày nay các ứng dụng thương mại với yêu cầu xử lý một số lượng rất lớn dữ liệu đang là động lực thúc đẩy các nhà phát triển máy tính và phần mềm tạo ra các máy tính với công nghệ tính toán với tốc độ ngày một nhanh hơn. Trong suốt 20 năm qua, xu hướng chỉ ra rằng mạng máy tính ngày càng nhanh hơn, có nhiều hệ thống phân tán, và các kiến trúc máy tính đa vi xử lý (bao gồm cả máy tính để bàn) cho thấy rõ ràng song song là tương lai của máy tính. Công nghệNgôn ngữ lập trình rất quan trọng trong việc xây dựng nên những ứng dụng chạy trên máy tính điện tử, những ngôn ngữ lập trình cấp cao hiện nay đều hỗ trợ những phương pháp lập trình mới giúp cho lập trình viên đơn giản hơn trong việc xây dựng chương trình. Nhưng không chỉ dừng lại ở đó các ngôn ngữ lập trình cũng ngày càng phát triển, rất nhiều các ngôn ngữ lập trình mới được ra đời, với nhiều đặc trưng mới phù hợp hơn với các ứng dụng cụ thể, hỗ trợ những paradigm lập trình khác như parallel, object – oriented,… Erlang là một ngôn ngữ cấp cao, được ra đời nhằm mục đích xây dựng những ứng dụng chạy tốt bằng cách song song hóa các yêu cầu tính toán, hỗ trợ lập trình hàm. Một đặc điểm quan trọng nhất của Erlang đó là đây là ngôn ngữ xây dựng theo hướng lập trình tương tranh (Concurrency – Oriented), một hướng khá mới, tiểu luận của chúng em với mục đích tìm hiểu ngôn ngữ lập trình Erlang với các đặc trưng chính của ngôn ngữ và làm rõ cách xây dựng chương trình theo hướng lập trình tương tranh của Erlang. Sau hơn 20 năm, Erlang có một lượng người dùng lớn bởi vì nó cung cấp các cấu trúc hiệu quả giúp giảm thiểu những khó khăn khi chạy nhiều luồng song song. Web Server có khả năng xử lý đồng thời nhiều người dùng một cách chính xác nếu chúng được viết bằng Erlang, bởi vì ngôn ngữ này được thiết kế để giúp các lập trình viên đưa ra quyết định hợp lí hơn khi giới hạn các phương pháp xây dựng chương trình. Nghiên cứu tính toán tương tranh, sử dụng Ngôn ngữ lập trình Erlang là nghiên cứu một công nghệ tiên phong nhằm giải các bài toán có tính thời sự cao trong thời đại ngày nay.

Trang 1

GIẢNG VIÊN HƯỚNG DẪN: TS Phạm Đăng Hải

Trang 2

- -MỤC LỤC

MỤC LỤC 2

ĐẶT VẤN ĐỀ 5

1 Lý do chọn đề tài 5

2 Phạm vi nghiên cứu 6

DANH MỤC TỪ VIẾT TẮT 7

I CÁC KHÁI NIỆM 8

2.1 Tính toán song song (Paralell Computing) 8

2.1.1 Các khái niệm 8

2.1.2 Các lý do chính của việc tính toán song song 9

2.1.3 Các đơn vị xử lý chính trong tính toán song song 10

2.2 Lập trình song song (Paralell Programming) 10

2.2.1 Khái niệm 10

2.2.2 Các thành phần 11

2.3 Lập trình tương tranh (Concurrent Programming) 11

2.3.1 Khái niệm 11

2.3.2 Đơn vị xử lý Tiến trình (Process) 11

2.3.3 Đơn vị xử lý Luồng (Threads) 12

2.4 Lập trình song song vs Lập trình tương tranh (Paralell Programming vs Concurrent Programming) 15

II ERLANG VÀ HỆ THỐNG HỖ TRỢ LẬP TRÌNH VỚI ERLANG 15

2.1.Giới thiệu chung 15

2.2.Lịch sử của Erlang 16

2.2.1.Giai đoạn 1985-1988 : Sự ra đời của Erlang: 16

2.2.2.Giai đoạn 1989-1997 19

2.3.Hệ thống hỗ trợ lập trình Erlang 20

2.3.1.Viết code bằng file – module 21

III HỆ THỐNG TỪ VỰNG CỦA ERLANG 23

3.1.Hệ thống ký tự của ngôn ngữ Erlang 23

3.2.Các từ khóa của Erlang (reserved word): 23

3.3.Biến và các atom hợp lệ 23

3.4.Dấu phân cách 23

IV KIỂU DỮ LIỆU CƠ BẢN CỦA ERLANG 24

4.1.Biến - Variable 24

4.2.DataType của Erlang 26

Trang 3

4.2.1.Số và biểu diễn số trong Erlang 26

4.2.2.Atom 26

4.2.3.Fun, một kiểu dữ liệu khá đặc biệt 26

4.2.4.Tuple và Record 27

4.2.5.List và hằng xâu trong Erlang 30

4.2.6.Binary 32

V TOÁN TỬ, BIỂU THỨC, ĐIỀU KHIỂN LUỒNG TRONG ERLANG 33

5.1.Biểu thức (Expression) 33

5.1.1.Biểu diễn biểu thức: 33

5.1.2.Số hạng (Term) 33

5.1.3.Biến số (Variables) 34

5.1.4.So khớp: 35

5.1.5.Cách gọi hàm – function calls: 35

5.1.6.If – rẽ nhánh có điều kiện: 36

5.1.7.Case: 36

5.1.8.Send – toán tử gửi: 37

5.1.9.Receive – nhận: 37

5.1.10.So sánh số hạng: 40

5.1.11.Biểu thức số học: 41

5.1.12.Biểu thức logic – Boolean: 42

5.1.13.Biểu thức Short-Circuit – ngắn mạch: 42

5.1.14.Toán hạng List: 43

5.1.15.Biểu thức cú pháp dạng bit: 43

5.1.16.Biểu thức FUN 46

5.1.17.Catch và Throw 46

5.1.18.Try 47

5.1.19.Block Expression: 50

IV.1.20.List Comprehension: 50

5.1.21.Bit String Comprehensions: 51

5.1.22.Guard Sequences: 52

5.1.23.Operator Precedence – Ưu tiên toán tử: 54

5.2.Exception Handling 54

VI LẬP TRÌNH TƯƠNG TRANH TRONG ERLANG 56

6.1.Concurrent Programming 56

6.2.Process trong Erlang 57

6.3.Exception Handling với các Process 59

6.4 Giao tiếp với các phần mềm khác (Interfacing Technique) 62

6.4.1.Ports: 63

6.4.2.Tương tác với chương trình C bên ngoài: 64

Trang 4

6.4.4.Thiết bị liên kết trong – Linked-in Drivers: 70

VII ERLANG NODE VÀ KẾT NỐI GIỮA CÁC ERLANG NODE 74

7.1.1.Cookie 74

7.1.2.Tên của Node 74

7.1.3.Kiểm tra kết nối và gọi hàm từ một node khác 75

KẾT LUẬN 76

TÀI LIỆU THAM KHẢO 77

Trang 5

ĐẶT VẤN ĐỀ

1 Lý do chọn đề tài

Công nghệ luôn phát triển không ngừng, những nhu cầu mới phát sinh những công nghệ mới, những công nghệ nổi bật trở sẽ thành xu hướng Ngày nay các ứng dụng thương mại với yêu cầu xử lý một số lượng rất lớn dữ liệu đang là động lực thúc đẩy các nhà phát triển máy tính và phần mềm tạo ra các máy tính với công nghệ tính toán với tốc

độ ngày một nhanh hơn.

Trong suốt 20 năm qua, xu hướng chỉ ra rằng mạng máy tính ngày càng nhanh hơn,

có nhiều hệ thống phân tán, và các kiến trúc máy tính đa vi xử lý (bao gồm cả máy tính

để bàn) cho thấy rõ ràng song song là tương lai của máy tính

Công nghệ/Ngôn ngữ lập trình rất quan trọng trong việc xây dựng nên những ứngdụng chạy trên máy tính điện tử, những ngôn ngữ lập trình cấp cao hiện nay đều hỗ trợnhững phương pháp lập trình mới giúp cho lập trình viên đơn giản hơn trong việc xâydựng chương trình Nhưng không chỉ dừng lại ở đó các ngôn ngữ lập trình cũng ngàycàng phát triển, rất nhiều các ngôn ngữ lập trình mới được ra đời, với nhiều đặc trưngmới phù hợp hơn với các ứng dụng cụ thể, hỗ trợ những paradigm lập trình khác nhưparallel, object – oriented,…

Erlang là một ngôn ngữ cấp cao, được ra đời nhằm mục đích xây dựng những ứngdụng chạy tốt bằng cách song song hóa các yêu cầu tính toán, hỗ trợ lập trình hàm Mộtđặc điểm quan trọng nhất của Erlang đó là đây là ngôn ngữ xây dựng theo hướng lậptrình tương tranh (Concurrency – Oriented), một hướng khá mới, tiểu luận của chúng emvới mục đích tìm hiểu ngôn ngữ lập trình Erlang với các đặc trưng chính của ngôn ngữ vàlàm rõ cách xây dựng chương trình theo hướng lập trình tương tranh của Erlang Sau hơn

20 năm, Erlang có một lượng người dùng lớn bởi vì nó cung cấp các cấu trúc hiệu quảgiúp giảm thiểu những khó khăn khi chạy nhiều luồng song song Web Server có khảnăng xử lý đồng thời nhiều người dùng một cách chính xác nếu chúng được viết bằngErlang, bởi vì ngôn ngữ này được thiết kế để giúp các lập trình viên đưa ra quyết địnhhợp lí hơn khi giới hạn các phương pháp xây dựng chương trình

Trang 6

Nghiên cứu tính toán tương tranh, sử dụng Ngôn ngữ lập trình Erlang là nghiên cứumột công nghệ tiên phong nhằm giải các bài toán có tính thời sự cao trong thời đại ngàynay.

Trang 7

DANH MỤC TỪ VIẾT TẮT

2 Paralell Computing Tính toán song song

3 Concurrentcy Computing Tính toán tương tranh

4 Oriented Programming Lập trình hướng đối tượng

Trang 8

Synchronous có nghĩa là xử lý đồng bộ, chương trình sẽ chạy theo từng bước và

chỉ khi nào bước 1 thực hiện xong thì mới nhảy sang bước 2, khi nào chương trìnhnày chạy xong mới nhảy qua chương trình khác Đây là nguyên tắc cơ bản trong lập trình

mà bạn đã được học đó là khi biên dịch các đoạn mã thì trình biên dịch sẽ biên dịch theothứ tự từ trên xuống dưới, từ trái qua phải và chỉ khi nào biên dịch xong dòng thứ nhât

mới nhảy sang dòng thứ hai, điều này sẽ sinh ra một trạng thái ta hay gọi là trạng thái

chờ Ví dụ trong quy trình sản xuất dây chuyền công nghiệp được coi là một hệ thống xử

lý đồng bộ

b Asynchronous

Ngược lại với Synchronous, Asynchronous là xử lý bất động bộ, nghĩa là chươngtrình có thể nhảy đi bỏ qua một bước nào đó, vì vậy Asynchronous được ví như mộtchương trình hoạt động không chặt chẽ và không có quy trình nên việc quản lý rất khókhăn Nếu một hàm A phải bắt buộc chạy trước hàm B thì với Asynchronous sẽ khôngthể đảm bảo nguyên tắc này luôn đúng

c Tính toán song song (Paralell Computing)

Tính toán song song nói chung là một hình thức tính toán trong đó nhiều phép tínhđược thực hiện đồng thời, hoạt động trên nguyên tắc là những vấn đề lớn đều có thể chiathành nhiều phần nhỏ hơn, sau đó được giải quyết tương tranh ("trong lĩnh vực tínhtoán") Có nhiều hình thức khác nhau của tính toán song song: song song cấp bit, songsong cấp lệnh, song song dữ liệu, và song song tác vụ Song song đã được sử dụng từnhiều năm qua, chủ yếu là trong lĩnh vực tính

toán hiệu năng cao Gần đây hình thức tính

toán này được quan tâm nhiều hơn, do những

hạn chế vật lý ngăn chặn việc tăng hiệu năng

tính toán chỉ bằng cách tăng tần số Vì việc

tiêu hao điện năng (dẫn đến sinh nhiệt) từ

máy tính đã trở thành một mối lo ngại trong

những năm gần đây, tính toán song song đã

trở thành mô hình thống trị trong lĩnh vực

kiến trúc máy tính, phần lớn là dưới dạng bộ

xử lý đa nhân

d Tương tranh (Concurrent)

Trong ngành khoa học máy tính, tương

tranh là một tính chất của các hệ thống bao

gồm các tính toán được thực thi trùng nhau về mặt thời gian, trong đó các tính toán chạy

Trang 9

đồng thời có thể chia sẻ các tài nguyên dùng chung Hoặc theo lời của Edsger Dijkstra:

"Tương tranh xảy ra khi nhiều hơn một luồng thực thi có thể chạy đồng thời."Việc cùng

sử dụng các tài nguyên dùng chung, chẳng hạn bộ nhớ hay file dữ liệu trên đĩa cứng, lànguồn gốc của nhiều khó khăn Các tranh đoạt điều khiển (race condition) liên quan đếncác tài nguyên dùng chung có thể dẫn đến ứng xử không đoán trước được của hệ thống.Việc sử dụng cơ chế loại trừ lẫn nhau (mutual exclusion) có thể ngăn chặn các tình huốngchạy đua, nhưng có thể dẫn đến các vấn đề như tình trạng bế tắc (deadlock) và đói tàinguyên (resource starvation) Thiết kế của các hệ thống tương tranh thường là kết quả củaviệc tìm kiếm các kĩ thuật đáng tin cậy cho việc phối hợp hoạt động của thực thi, trao đổi

dữ liệu, cấp phát bộ nhớ và lập lịch thực thi để giảm tối thiểu thời gian phản ứng(response time) và tăng tối đa thông lượng (throughput)

2.1.2 Các lý do chính của việc tính toán song song

Những lý do chính cho việc sử dụng tính toán song song:

 Tiết kiệm thời gian

 Giải quyết những bài toán lớn

 Xử lý đồng thời cùng một lúc

Ngoài ra, còn có một số lý do khác

 Tận dụng các nguồn tài nguyên như khai thác tài nguyên tính toán có sẵn trênmạng diện rộng, hoặc thậm chí sử dụng Internet khi các tài nguyên cục bộ hạnchế

 Tiết kiệm chi phí – sử dụng nhiều tài nguyên máy tính “rẻ” thay vì phải đầu tưmột con siêu máy tính

 Khắc phục những hạn chế về bộ nhớ - Các máy tính đơn có tài nguyên bộ nhớrất hữu hạn Đối với những bài toán lớn, sử dụng bộ nhớ của nhiều máy tính cóthể vượt qua trở ngại này

2.1.3 Các đơn vị xử lý chính trong tính toán song song

 Processes

 Threads

Trang 10

2.2 Lập trình song song (Paralell Programming)

2.2.1 Khái niệm

Lập trình song song (Parallel Computing) là việc chia một công việc ra thành cáccông việc nhỏ và cho các công việc này thực hiện đồng thời với nhau bởi các hệ thống cónhiều bộ vi xử lý (multiprocessor) hay bộ vi xử lý đa nhân (multicore) nhằm giảm thờigian thực hiện công việc đó xuống Việc lập trình để tách ra các công việc nhỏ và sắp xếp

để xử lý song song được gọi là lập trình song song

Cùng với định luật Moore, các máy tính hiện nay được được trang bị các bộ vi xử lý

đa nhân mạnh mẽ Tuy nhiên, để tận dụng được sức mạnh đó đòi hỏi các lập trình viênphải tận dụng được hết các nhân trong bộ vi xử lý Vì vậy, thay vì lập trình tuần tự nhưtrước đây chỉ sử dụng một nhân của bộ vi xử lý thì người lập trình viên ngày nay phảidùng kỹ thuật lập trình song song để tận dụng hiệu suất của bộ vi xử lý đa nhân

Bộ vi xử lý có nhiều nhân sẽ tăng tốc chương trình song song tuy nhiên không cónghĩa là nó sẽ tăng lên 100% trên một nhân (core) được thêm vào Thậm chí chương tr.nhsong song không hề tăng hiệu suất lên trong một số trường hợp Vì vậy lập trình viênphải biết quyết định khi nào sử dụng lập trình song song bằng cách sử dụng các công cụ

đo lường để xác định được tốc độ thực thi của chương trình

Lập trình song song là một công việc rất phức tạp so với lập trình tuần tự thôngthường, người phát triển phải thực hiện một quá trình “song song hóa”, biến đổi cácchương trình tuần tự thành chương trình song song có khả năng tận dụng tối đa sức mạnhcủa hệ thống

2.2.2 Các thành phần

Quá trình song song hóa gồm ba giai đoạn bước chính

 Phân chia chương trình thành các công việc con (Sub-task decomposition)

 Phân tích sự phụ thuộc (Dependence analysic)

 Định thời các công việc (Task scheduling)

Trang 11

2.3 Lập trình tương tranh (Concurrent Programming)

2.3.1 Khái niệm

Lập trình tương tranh (Concurrent Programming) là một khái niệm (cũng có thểhiểu là kỹ thuật) lập trình chia nhỏ công việc ban đầu thành những nhiệm vụ (task) nhỏhơn, mỗi nhiệm vụ chạy trên một tiến trình (process, hay thread), và chúng có thể chạyđồng thời (song song - parallel) trên nhiều CPU

2.3.2 Đơn vị xử lý Tiến trình (Process)

Là một khái niệm trừu tượng của Hệ điều hành, biểu hiện một chương trình(program) đang chạy Process là quá trình hoạt động của một ứng dụng Điều này có nghĩa

là process bao gồm các dòng lệnh và trạng thái thực thi của những dòng lệnh đó Ví dụkhi bạn click đúp vào icon Microsoft Word trên màn hình desktop để khởi động chươngtrình chính là bạn đã bắt đầu một process của chương trình Word Khi process bắt đầu thìmột vùng nhớ sẽ được phân phối để sử dụng trong quá trình thực thi instruction

Hệ điều hành (OS) ngày nay cho phép phân phối nhiều process cùng một lúc lên bộnhớ để thực hiện đồng thời nhiều tác vụ (multitasking) Thực tế thì những process nàykhông được thực thi đồng thời mà sẽ được phân bổ qua một bộ phận của OS gọi làscheduler Bạn có thể tưởng tượng bộ phận này như một công tắc chuyển đổi để lần lượtđưa các chương trình này vào CPU Bộ phận này sẽ thay đổi qua lại giữa các chươngtrình liên tục trong khoảng thời gian rất ngắn, giả sử là 1 mili giây Giả sử mỗi mili giây

sẽ có khoảng 1000 instruction được thực thi thì đối với con người là quá nhanh và làmchúng ta tưởng như là 2 chương trình đang chạy đồng thời (concurrent)

Trang 12

2.3.3 Đơn vị xử lý Luồng (Threads)

Đa số chương trình ngày nay hỗ trợ đa luồng (multithread) Ví dụ như một processcủa chương trình Word có thể có 1 luồng (thread) để nhận chỉ thị từ người dùng qua bànphím và hiển thị lên màn hình, 1 thread để thực hiện chức năng in tài liệu ở background,

1 thread được dùng để lưu xuống ổ cứng

Có thể tưởng tượng thread là một phiên bản nhẹ hơn của process Một thread có thểthực hiện bất cứ tác vụ gì mà một process có thể thực hiện Tuy vậy, do thread nằm trongprocess, những tác vụ của thread thực hiện thường nhỏ hơn Điểm khác biệt cơ bản giữathread và process là nhiều thread nằm trong cùng một process dùng một không gian bộnhớ giống nhau, trong khi process thì được phân bổ riêng biệt Điều này cho phép cácthread đọc và viết cùng một kiểu cấu trúc và dữ liệu, giao tiếp dễ dàng giữa các threadvới nhau Việc có nhiều thead chạy song song trong cùng một process giúp multitaskingnhẹ và dễ dàng hơn

Dưới đây là bảng so sánh giữa process và thread:

Sử dụng nhiều bộ nhớ Sử dụng ít bộ nhớ hơn

Nếu process cha ngưng trước khi process con

thoát thì process con sẽ vẫn tồn tại nhưng

không hoạt động

Tất cả threads sẽ ngừng hoạt động khi process ngừng hoạt động

Sử dụng nhiều tài nguyên hơn vì phải OS phải

lưu và reload mỗi khi chuyển đổi giữa process

Sử dụng ít tài nguyên hơn vì dùng chung không gian và bộ nhớ

Process được tạo mới được cung cấp cho một

không gian bộ nhớ ảo (process isolation)

Thread chia sẻ bộ nhớ nên cần phải giải quyết vấn đề chia sẻ tài nguyên cho hợp lýĐòi hỏi giao tiếp giữa process với nhau Có thể giao tiếp qua queue và bộ nhớ

chungTạo và xóa chậm hơn Tạo và xóa nhanh hơn

Dễ dàng code và debug hơn Có thể vô cùng phức tạp để code và debugMỗi process có code, data và cấu trúc kernel

riêng biệt Thread chia sẻ code, data và cấu trúc kernel trong cùng 1 processThread là đơn vị nhỏ nhất trong Lập trình tương tranh (Concurrent programming).Một trong những đặc tính cơ bản nhất là chúng giúp chúng ta có thể thực thi nhiều côngviệc (task) trong cùng một lúc

 Một Process chứa một hoặc nhiều luồng (Thread)

 Các Thread có Tập thanh ghi (Register Set) và ngăn xếp (Stack) riêng

Trang 13

 Các Threads trong một Process chia sẻ bộ nhớ với nhau (Các Threads cũng cóthể có bộ nhớ riêng)

Trong mô hình lập trình tương tranh theo mô hình thread, một xử lý đơn có thểchuyển thành đa xử lý bằng cách thực thi đồng thời theo các cách khác nhau Đơn giảnnhất để mô tả mô hình thread, chúng ta phân tích ví dụ trên với một số thủ tục trongchương trình:

 Chương trình chính a.out được lập lịch để chạy trên hệ điều hành a.out nạp vàyêu cầu hệ thống và các tài nguyên cần thiết để chạy chương trình

 a.out thực thi một dãy các công việc, và rồi tạo ra một dãy các tác vụ (cácthread) mà có thể được lập lịch và chạy đồng thời bởi hệ điều hành

 Mỗi thread có dữ liệu cục bộ, nhưng cũng chia sẻ toàn bộ tài nguyên của a.out.Điều này tiết kiệm các chi phí liêu quan đến tái tạo tài nguyên cuả chương trìnhcho mỗi thread Mỗi thread cũng có quyền với bộ nhớ toàn cục vì nó chia sẻkhông gian bộ nhớ của a.out

 Công việc của thread có thể được miêu tả

tốt như một chương trình con trong

chương trình chính Bất kỳ thread nào

cũng có thể thực thi bất kỳ chương trình

con tại cùng thời điểm như các thread

khác

 Các thread giao tiếp với nhau qua bộ nhớ

toàn cục (cập nhật vị trí địa chỉ) Điều này

đòi hỏi các cấu trúc đồng bộ để đảm bảo rằng khi có nhiều hơn một thread thì sẽkhông cập nhật lên cùng địa chỉ toàn cục tại cùng thời điểm

 Các thread có thể chạy luân phiên nhau, nhưng a.out vẫn giữ lại trạng thái hiệntại để cung cấp các tài nguyên chia sẻ khác cho đến khi ứng dụng kết thúc

 Các threadthường được kết hợp với các kiến trúc bộ nhớ chia sẻ và hệ điềuhành

Trang 14

2.4 Lập trình song song vs Lập trình tương tranh (Paralell Programming vs Concurrent Programming)

II ERLANG VÀ HỆ THỐNG HỖ TRỢ LẬP TRÌNH VỚI

ERLANG

2.1.Giới thiệu chung

Erlang là một ngôn ngữ lập trình nhằm mục đích lập trình tương tranh cho phépthích ứng trên nhiều nền tảng khác nhau Với Erlang, sự song song hóa chỉ phụ thuộc vàongôn ngữ lập trình chứ không phụ thuộc vào hệ điều hành

Erlang thực hiện cấu trúc chương trình thành các tiến trình tương tranh (concurrentprocess), từ đó khiến cho việc lập trình song song trở nên dễ dàng bằng cách thông quacác thông điệp được gửi qua lại giữa các tiến trình tương tranh này Các tiến trình tươngtranh này chạy song song nhưng không dựa trên một quá trình chia sẻ bộ nhớ vì vậykhông gây ra hiện tượng đợi lẫn nhau giữa các tiến trình.Các tiến trình tương tranh nàynhỏ và nhẹ vì vậy mỗi chương trình bao gốm một số lượng lớn các tiến trình tương tranh(lên đến hàng trăm, hàng nghìn) có thể được thực thi trên một bộ xử lý, một bộ xử lý đalõi, hoặc trên một mạng các bộ xử lý khác nhau

Có 5 lý do mà tác giả của ngôn ngữ khuyên chúng ta nên biết về nó :

Trang 15

 Chương trình sẽ chạy nhanh hơn khi được thực thi trên một máy tính đa lõi.

 Khả năng xây dựng ứng dụng có chịu lỗi tốt, chúng có thể được chỉnh sửa

mà không cần phải dừng ứng dụng lại

 Ngôn ngữ sử dụng paradigm lập trình hàm (functional programming)

 Đây là một ngôn ngữ được kiểm nghiệm thực tế trong hệ thống sản xuấtcông nghiệp quy mô lớn, có các thư viện khổng lồ, và cộng đồng sử dụng rấtlớn

 Các ứng dụng được viết với lượng dòng lệnh không quá nhiều

2.2.Lịch sử của Erlang

Erlang được phát triển tại phòng thí nghiệm Ericsson Computer Science Laboratoryvào những năm 1986 Erlang được thiết kế cho việc lập trình tương tranh, một chươngtrình trong Erlang được tạo thành bởi hàng nghìn, hàng vạn các tiến trình, các tiến trìnhnày không chia sẻ bộ nhớ và giao tiếp với nhau qua thông qua các message Erlang có cơchế cho phép chương trình có thể thay đổi code ngay khi chúng đang được thực thi, ta gọi

đó là cơ chế “on the fly”, chính nhờ cơ chế này ta có thể xây dựng các phần mềm cho các

hệ thống non-stop

2.2.1.Giai đoạn 1985-1988 : Sự ra đời của Erlang:

Vào những năm 1986, Joe Armstrong dự định phát triển một trình biên dịch chophép lập trình các ứng dụng trên điện thoại một cách hiệu quả Như chúng ta đã biết, cácứng dụng trên điện thoại có yêu cầu về khả năng tương tranh cao: một thao tác switchphải xử lý hàng trăm thậm chí hàng nghìn các giao dịch Trong quá trình phát triển, ông

bị ảnh hưởng khá nhiều bởi cấu trúc cú pháp của ngôn ngữ Prolog Trình biên dịch củaông không những hỗ trợ cho nhiều process cũng lúc mà còn có cơ chế trao đổi thông điệpgiữa các process, cơ chế bắt lỗi … Cùng với Robert Virding, ông đã nghiên cứu và pháttriển ra một ngôn ngữ lập trình, đồng thời phát triển các nguyên lý cho ngôn ngữ này,ngày này chúng ta gọi ngôn ngữ này là Erlang và nguyên lý mà hai người phát triển là

“Concurrency-Oriented Programming” Như vậy Erlang là một ngôn ngữ lai giữa ngônngữ lập trình tương tranh và ngôn ngữ lập trình hàm

Trang 16

Hình 1 Cấu trúc của ngôn ngữ Erlang

Vào những năm 1987, Erlang lần đầu tiên được sử dụng để thực hiện các ứng dụngthực tế, Erlang được sử dụng để tạo ra một kiến trúc phần mềm mới mang tên là ACS3được thiết kế cho lập trình các dịch vụ điện thoại trên Ericsson MD110 PABX4, và dự ánmang tên ACS/Dunder đã được triển khai, dựa trên ngôn ngữ erlang để xây dựng kiếntrúc ACS3 Chính nhờ dự án này, ngôn ngữ erlang được phát triển một cách nhanhchóng, erlang liên tục được cập nhật thêm các tính năng mới, và được áp dụng ngay vàotrong thực tế, những tính năng phù hợp sẽ được giữ lại, còn không chúng sẽ được bỏ đi.Hầu hết các thay đổi của Erlang đều không được lưu lại, bảng dưới đây là một trongnhững mẫu câu lệnh hiếm hoi của erlang trong những ngày đầu phát triển

Trang 17

Hình 2 Các mẫu câu lệnh của Erlang trong những ngày đầu

Đến cuối năm 1988, hầu hết mọi ý tưởng trong erlang đã định hình:

 Bufered message reception: đây là một trong những ý tưởng được thiết kếđầu tiên trong erlang, cú pháp gửi nhận tin nhắn được thực hiện theo mẫusau :

Trang 18

một đối tượng, và muốn khi muốn tương tác đến phần cứng thì phải thôngqua việc gửi tin nhắn Điều này khiến cho mọi việc trở lên dễ dàng trongerlang vì tất cả đều được quy về việc xử lý các process, và việc trao đổi tinnhắn giữa các process là đồng nhất chứ không phân biết xem tin nhắn nào làtin nhắn gửi đến thiết bị phần cứng, tin nhắn nào là tin nhắn giữa các processvới nhau.

 Links: links trong erlang dùng để kiểm soát đường truyền lỗi khi xảy ra lỗigiữa các process Mô hình xử lý lỗi trong erlang như sau: khi một processtrong erlang “chết”, sẽ có một số các process đóng vai trò “quan sát viên”,chúng theo dõi cái chết của process đó và sửa những lỗi gây ra cái chết củaprocess kia, tuy nhiên vậy thi process nào trong hệ thống sẽ được đóng vaitrò làm “quan sát viên” trong số hàng trăm, hàng nghìn process trong mộtchương trình của erlang Chính nhờ links trong erlang mà chúng ta có thể tạo

ra một tập các process được liên kết với nhau, và khi một process thôngthường chết thi các process liên kết với nó sẽ chết theo, tuy nhiên trong sốchúng sẽ có những process được gán làm process hệ thống, khi các processthông thường chết, chúng sẽ có nhiệm vụ khắc phục lỗi Ý tưởng này doMike Williams đề xuất

 Buffers: như ta đã biết các process trong erlang giao tiếp với nhau thông quaviệc gửi thông điệp đến nhau, mỗi một process đều có một “mailbox” đểchứa các thông điệp Khi một thông điệp được gửi đến nó được đưa vàomailbox, và process sẽ lên kế hoạch để thực hiện nó Nếu process thực hiệnđối sánh mẫu thông điệp trong mailbox, nếu thành công thông điệp sẽ đượcxóa khỏi mailbox và dữ liệu từ thông điệp sẽ được đưa vào chương trình, nếukhông thông điệp sẽ được đưa vào một hàng đợi Khi bất cứ một thông điệpnào được process xử lý tiếp theo, thì những thông điệp được lưu trong hàngđợi sẽ được đưa lại vào mailbox

2.2.2.Giai đoạn 1989-1997

Trong khoảng thời gian 8 năm này chính là giai đoạn phát triển chính của Erlang, từthời gian ban đầu chỉ có hai người phát triển, đến giai đoạn này đã có hàng trăm ngườinghiên cứu và sử dụng erlang

Trang 19

Kết quả của dự án ACS/Dunder: vào tháng 12 năm 1989, báo cáo cuối cùng của dự

án ACS/Dunder được đưa ra, đã có khoảng 25 tính năng của điện thoại đã được thực hiệnthành công, các tính năng này đại diện cho khoảng một phần mười chức năng củaMD110 Báo cáo cũng chỉ ra rằng, Erlang quá chậm để phát triển sản phẩm, để có thể tạo

ra các sản phẩm thực tế thì erlang cần phải nhanh hơn 40 lần so với hiện tại, tuy nhiênEricsson vẫn quyết định xây dựng một sản phẩm gọi là “Mobility Server” dựa trên kiếntrúc ACS/Dunder

Mở rộng ra thế giới: năm 1989 cũng là lần đầu tiên Erlang có cơ hội được giới thiệu

ra ngoài thế giới thông qua hội nghị SETSS tại Bournemouth Chính nhờ hội nghị này,

mà các tác giả đã được mởi đến Bellcore để nói về Erlang

Việc thực hiện cài đặt chương trình khá đơn giản, sau khi cài đặt xong chương trình

ta có thể thấy có ba chương trình thực thi phục vụ cho việc lập trình được gọi là shell

trong thư mục bin đó là:

erl.exe đây là shell để chạy trên dòng lệnh command line Nếu không có tham số đi kèm, hệ thống tự động chạy vào command mode của erlang.

erlc.exe đây là shell để compile các file erl ra file đã được biên dịch

.beam Các file này có thể chạy trực tiếp trong môi trường command mode

Trang 20

Hình 3 Shell cửa sổ của Erlang và lệnh tính biểu thức 2 * (3 + 4)

Từ hình trên ta có thể nhận ra một số thông tin về version của Erlang cũng như

version của Eshell Shell được thực hiện với dấu nhắc 1> Để thực hiện biểu thức đã cho

ta gõ trực tiếp biểu thức sau dấu nhắc của hệ thống Một lỗi khá gặp đối với người mớilập trình Erlang đó là dấu “.” cuối cùng sau biểu thức Dấu chấm này đánh dấu kết thúcmột dòng lệnh để chuyển sang lệnh kế tiếp (dấu nhắc hệ thống chuyển thành 2>), nếuthiếu dấu chấm này câu lệnh sẽ không được thực hiện và nếu ta ấn ENTER dấu nhắc của

hệ thống vẫn là 1> mà không đưa ra được kết quả của biểu thức

2.3.1.Viết code bằng file – module

Để tiện cho quá trình lập trình cũng nhưng thêm các tham số cho quá trình biên dịchErlang hỗ trợ xây dựng các Module

Modules: là đơn vị cơ bản trong Erlang, toàn bộ các functions mà chúng ta viết

được chứa trong modules, các modules được lưu trong các file có phần mở rộng erl.

Modules cần được biên dịch trước khi chạy Một file modules đã được biên dịch sẽ có

Trang 22

III HỆ THỐNG TỪ VỰNG CỦA ERLANG

3.1.Hệ thống ký tự của ngôn ngữ Erlang

Trong Erlang hệ thống ký tự rất đa dạng Erlang có thể nhận được khá nhiều ký tự(tất cả ký tự của bảng ISO-8859-1 (Latin-1)

Các ký tự được phân loại như dưới bảng sau:

3.2.Các từ khóa của Erlang (reserved word):

after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse query receive rem try when xor3.3.Biến và các atom hợp lệ

Các cụm ký tự được bắt đầu bởi chữ cái in hoa được coi là một biến, mỗi biến đượcbắt đầu bằng _ là một biến có thể đại diện cho bất kỳ giá trị nào (ta không quan tâm vàkhông tác động đến biến dạng này)

Các cụm ký tự mà không bắt đầu được coi như một atom, nếu muốn có atom bắtđầu bằng chữ cái in hoa ta để trong dấu nháy đơn (‘’)

3.4.Dấu phân cách

 Hằng ký tự nằm trong cặp nháy kép (“”)

 Dấu « » là thể hiện kết thúc lệnh sau dấu này ấn Enter sẽ thực hiện

 Dấu « , » là dấu thể hiện phân tách giữa các phần tử trong 1 list, 1 danh sáchtham số, …

 Dầu « ; » là dấu thể hiện các vế của một câu lệnh

 Đằng sau dấu % là một câu chú thích, toàn bộ những kí tự đằng sau dấu %cho đến cuối dòng đều được coi là câu chú thích và sẽ không được dịch bởiErlang compiler

Trang 23

IV KIỂU DỮ LIỆU CƠ BẢN CỦA ERLANG

4.1.Biến - Variable

Đối với một ngôn ngữ lập trình thì biến là một thành phần rất quan trọng của ngônngữ nó là nơi thể hiện cách xử lý đối với vùng nhớ của một ngôn ngữ lập trình, tùy từngngôn ngữ mà các biến có thể được xử lý khác nhau, chúng được gán cho một tập các kiểutương ứng ở từng ngôn ngữ lập trình Mỗi biến được gán cho một tên để người lập trình

có thể thao tác với biến thông qua tên

Trong Erlang thì tên của biến được thể hiện bằng một cụm các ký tự bắt đầu bằngmột chữ cái in hoa Khi thực thi chương trình chạy trên shell mỗi thành phần đều đượcgán với một biến cụ thể

Biễn số thường được khai báo dưới dạng bắt đầu bằng chữ cái in hoa hay là dấugạch dưới và có thể bao gồm các ký tự số và chữ, gạch chân và @ Ví dụ:

Member(_Elem,[]) -> [].

Trang 24

Chú ý ràng các biến số bất đầu với dấu gạch chấn sẽ phù hợp (match) với:

1234, và trước khi được gán trị 1234 thì biến X có thể nhận bất cứ giá trị nào, tuy nhiênkhi đã được gán thì nó sẽ giữ giá trị đó mãi mãi

Trong Erlang thì phép gán “=” được thực hiện là một phép “pattern matchingoperation”, ta có thể gọi tắt là phép bound Mỗi khi thực hiện phép bound Lhs = Rhs,thì Rhs sẽ được thực hiện tính toán trước, sau đó kết quả này được đối sánh với Lhs, nếukhông thực hiện được lỗi sẽ được đưa ra

Trang 25

Trong khi thực hiện Shell ta có thể dùng lênh f() để cho phép shell quên đi các phépbound trước đó đến các biến khi đó ta có thể thực hiện bound lại một tên biến đã sử dụng.

4.2.DataType của Erlang

4.2.1.Số và biểu diễn số trong Erlang

Các số được cung cấp các cách viết thông thường với các số nguyên và các số thực(các số thực được viết dưới dạng dấu chấm tĩnh, chấm động: 3.123453E12)

Ngoài ra Erlang còn cung cấp các cách viết khác:

 $char – trong đó char là các ký tự ASCII

 Base#value – trong đó base là hệ cơ số của số được biểu diễn, value là cách ghi số

đã cho trong hệ cơ số base, trong đó base là các số từ 2 đến 36

4.2.2.Atom

Trong Erlang chúng ta sử dụng các atom để định nghĩa các hằng số kí tự, khác vớitrong C, để sử dụng các hằng số kí tự thì ta phải khai báo chúng ở phần đầu của chươngtrình ví dụ như khai báo marco, hoặc khai báo trong một file header ví dụ như gobal.h, và

để sử dụng file này, ngay ở đầu chương trình chính ta phải có lệnh “#include gobal.h”.Trong Erlang thì các hằng số kí tự là toàn cục, ta không cần phải sử dụng các định nghĩamarco hoặc gọi các hàm include như trong C

Đây là kiểu dữ liệu dạng chữ, dạng một hằng số tên Như đã nói ở phần trước Atomcần phải để trong dấu ngoặc đơn, nếu nó được bắt đầu bằng một chữ cái in hoa hoặc chứathêm các ký tự khác ngoài các chữ cái và số ra như dấu cách (space), dấu « _ » hoặc dấu

Giá trị của atom chính là atom, có nghĩa là giá trị của một atom chính là hằng số kí

tự, vì erlang là một ngôn ngữ lập trình hàm nên mọi biến đều phải có giá trị, và giá trị đó

có thể là số hay atom (hằng số kí tự)

4.2.3.Fun, một kiểu dữ liệu khá đặc biệt.

Đây là một kiểu dữ liệu khá đặc biệt của các ngôn ngữ hỗ trợ lập trình hàm như cácngôn ngữ Standard ML (SML) hay OCaml, … Nếu như ở các ngôn ngữ không hỗ trợ lập

Trang 26

trình hàm thì kiểu dữ liệu mảng có thể được coi như một kiểu dữ liệu hàm nhưng khá hạnchế và không hiệu quả

Ngôn ngữ Erlang hỗ hợ kiểu dữ liệu hàm bằng khai báo như ví dụ sau:

1> Fun1 = fun (X) -> X+1 end.

hỗ trợ như vậy nên ta có thể xây dựng các hàm cấp cao (high-order function), như ví dụdưới đây:

1> Double = fun(Fun, X) -> Fun(Fun(X)) end.

Person = {person, {name, joe}, {height, 1.82}, {footside, 42}, {eyecolour, brown}}.

Trang 27

Trong C, khi muốn khởi tạo giá trịc các trường x và trường y ta sử dụng dấu chấm,

ta nhớ tuple này làm gì, vậy thay vì viết P = {10, 45} ta sẽ khai báo P = {point, 10, 45}.Tuple được tạo ra tự động khi chúng ta khai báo chúng, và chúng sẽ được hủy đi khikhông được sử dụng đến nữa, Erlang sẽ sử dụng garbage collector để thu hồi tất cả các bộnhớ không sử dụng nữa vì vậy chúng ta không phải quan tâm quá nhiều đến việc cấp phát

bộ nhớ như trong C Chúng ta có thể tạo ra các Tuple mới từ các Tuple cũ thông qua biếnđược gán cho Tuple đó:

Trang 28

một tuple có cùng cấu trúc với tuple đó, và thay thế một biến chưa được gán tại giá trị mà

Ngoài cách làm trên khi làm việc với Tuple ta có thể sử dụng một số hàm được xâydựng sẵn như:

element(ViTri,Tuple) cho biết giá trị của phần tử thứ ViTri của Tuple

setelement(ViTri, Tuple, GiaTri) thêm vào Tuple phần tử GiaTri tại

Tuple làm việc khá thuận lợi nhờ tính đơn giản của nó nhưng nó lại có một mặt yếu

đó là tên của các trường không có vì vậy ta sẽ có thể gặp rắc rối khi làm việc với nhữngTuple có số lượng thành phần lớn và phức tạp Trong Erlang một kiểu dữ lieuj mới cũngđược cung cấp nhằm thực hiện điểm yếu này đó là Record

Record cũng là một dạng tuple nhưng có số lượng thành phần là cố định, và cáctrường của nó không như tuple, được đặt tên giống như struct trong ngôn ngữ C Để sửdụng được record ta cần phải thêm –record() vào phần đầu của module sử dụng Record.Như trong ví dụ sau:

Trang 29

Trong file records.hrl ta có định nghĩa record như sau:

"Fix errata in book"

4.2.5.List và hằng xâu trong Erlang

List là kiểu dữ liệu tập hợp của ngôn ngữ Erlang, cũng giống trong C, list trongerlang cũng dùng để liệt kê các biến, kiểu dữ liệu tập hợp này có kể thứ tự của các phần

tử Kiểu dữ liệu này có thể được khai báo như sau :

[Term1, ,TermN]

Như trên ta thấy List trong Erlang được khởi tạo trong các dấu ngoặc vuông [], cácphần tử được cách nhau bằng dẫu “,“ thành phần có thể là một tuple, hay atom, hoặc mộtbiến số bình thường thông thường:

List có thể là một List rỗng ([]) hay là một List được cấu tạo từ hai thành phần Head

và Tail, ở đây Head là chỉ thành phần đầu tiên của List còn Tail là phần còn lại của Listngoài Head ra, như vậy Tail cũng là một danh sách, kí tự “|“ dùng để phân biệt phần đầu

Trang 30

với phần đuôi của một list Như vậy List có thể được biểu diễn thành [Head|Tail].Cách viết List như trên ([Term1, ,TermN]) là cách viết ngắn gọn của [Term1|[ |[TermN|[]]]].

Một List mà có thành phần Tail cũng là List thường được gọi là một List chuẩn ỞErlang cũng cho phép tạo ra những List mà thành phần Tail của nó không phải là mộtList ví dụ như List [a|b], nhưng những loại List như vậy thường rất ít khi được sử dụng.Chúng ta có thể tạo thêm nhiều thành phần hơn trong list mới bằng cách viết[E1,E2…,En|T]:

3>ThingsToBuy1 = [{oranges,4},{newspaper,1}|ThingsToBuy].

[{oranges,4},{newspaper,1},{apples,10},{pears,6},{milk,3}]

Cũng giống như tuple, muốn lấy giá trị từ list ta sử dụng toán tử pattern matching “

= “ Nếu T không phải là một list rỗng thì biểu thức [X|Y] = T (với X, Y là nhữngbiến “unbound variable”) sẽ gán phần đầu của T cho X và phần đuôi của T cho Y:

Tập hợp các hàm làm việc với List được để trong thư viện lists

String là một chuỗi ký tự trong Erlang được biểu diễn bằng cách để trong dấu nháykép (“”), nhưng chuỗi ký tự không phải là một kiểu dữ liệu trong Erlang nó là một cáchviết ngắn của một list Ví dụ như chuỗi “Hello” là viết tắt của list [$h,$e,$l,$l,$o] hoặclist [104,101,108,108,111]

Trang 31

Các chuỗi ký tự sẽ được nối vào nhau một cách tự động nếu viết liền nhau Ví dụ :

và in ra dưới dạng một chuỗi các số nguyên hay strings nằm hai dấu nhỏ hơn và hai dấulớn hơn Ví dụ:

1> <<5,10,20>>

<<5,10,20>>

2> <<"hello">> <<"hello">>

Giá trị số nguyên được sử dụng trong binary chỉ được nằm trong khoảng 0 đên

255 Cồn đối với string thì <<”cat”>> là viết tắt của <<99, 97, 116>> chính

là mã ASCII của kí tự, nếu dãy số trong binary đều đại diện cho mã ASCII của một

kí tự nào đó thì shell sẽ in ra chuỗi số như một string, còn không shell chỉ in ra một chuỗicác số nguyên Chúng ta có thể tạo một binary hoặc lấy các thành phần trong một binarybằng cách sử dụng các hàm trong BIF hoặc có thể dùng cấu trúc bit (Bit Syntax)

Các hàm BIF thao tác trên binary:

tạo thành từ các số nguyên và binary trong loList loList ở đây là một list màcác thành phần là các số nguyên trong khoảng 0 255, hoặc là các binaries:

Bin thành hai phần tại vị trí phần tử thứ Pos:

1> split_binary(<<1,2,3,4,5,6,7,8,9,10>>, 3).

{<<1,2,3>>,<<4,5,6,7,8,9,10>>}

nào của Erlang thành một binary Term được sử dụng để chuyển đổi thànhbinary bằng câu lệnh term_to_binary có thể được lấy từ trong file, được lấy

Trang 32

từ các thông điệp truyền trên mạng, và tất nhiên các Term này có thể được táitạo lại sau này Câu lệnh này rất hữu dụng cho việc lưu trữ các cấu trúc dữliệu phức tạp trong file hoặc gửi các cấu trúc dữ liệu phức tạp đến các máytrạm.

term_to_binary:

1>B = term_to_binary({binaries,"are", useful}).

<<131,104,3,100,0,8,98,105,110,97,114,105,101,115,107,0,3,97,114,1 01,100,0,6,117,115,101,102,117,108>>

5.1.1.Biểu diễn biểu thức:

Tất cả các biểu thức con được biểu diễn trước khi bản thân nó được biểu diễn, trừkhi nó đuợc biểu diễn một cách rõ ràng Ta có thể xem xét ví dụ sau:

Expr1 + Expr2

Trong đó, Expr1 và Expr2 cũng là biểu thức, cần phải được biểu diễn trước,trong bất cứ thứ tự nào, trước khi các thông tin thêm vào được thực hiện

Rất nhiều các toán tử chỉ có thể được sử dụng như là tham số của một kiểu phù hợp

Ví dụ, các toán tử số học chỉ có thể sử dụng tới các kiểu số Các tham số của các kiểukhông phù hợp sẽ gây nên lỗi badarg run-time

Trang 33

[H | T]

{error, Reason}

Patterns – mẫu được cho phép trên đầu mỗi mệnh đề, biểu thức case and receive, và

biểu thức so khớp (match expression)

Toán tử so khớp ( = ): Nếu Pattern1 và Pattern2 là biểu mẫu hợp lệ, thì biểu thức

sau đây cũng là biểu thức hợp lệ:

Pattern1 = Pattern2

Khi số khớp với các số hạng, cả Pattern1 và Pattern2, sẽ đuợc so khớp với số hạngnày Ở đây chúng ta nên ẩn sau các đặc trưng này để tránh xa việc biểu diễn lại các sốhạng Ví dụ:

Có thể được viết lại như sau:

f({connect,_,To,_,_} = Signal, To) ->

;

f(Signal, To) ->

ignore.

Tiền tố xâu dữ liệu trong biểu mẫu:

Khi so khớp các xâu dữ liệu, biểu mẫu sau đây là hợp lệ:

Trang 34

Nếu chỉ sử dụng toán hạng số và toán hạng biểu diễn bit, và nếu giá trị của nó có thểđược biểu diễn là một hằng số trong thời gian dịch, các biểu thức số học có thể được sửdụng trong các pattern Ví dụ:

case {Value, Result} of

** exception error: no match of right hand side value [1,2]

5.1.5.Cách gọi hàm – function calls:

ExprF(Expr1, ,ExprN)

ExprM:ExprF(Expr1, ,ExprN)

Trong dạng đầu tiên của việc gọi hàm, ExprM: ExprF(Expr1, …, ExprN),mỗi ExprM và ExpF phải là atom hay là một biểu thức mà biểu diễn dưới dạng atom.Hàm này được gọi bằng cách sử dụng tên đầy đủ chức năng (fully qualified functionname), thườn được nhắc đến như là một remote hay là external function call – gọi chứcnăng ngoài Ví dụ:

Trang 35

handle(Msg, State)

spawn(m, init, [])

Ví dụ khi ExprF là một fun:

Fun1 = fun(X) -> X+1 end

Để tránh được sự nhập nhằng có thể xảy ra, thì tên gọi đầy đủ chức năng phải được

sử dụng khi gọi một hàm với cùng một tên như là một BIF, và trình dịch không cho phépđịnh nghĩa một hàm với cùng một tên như là hàm được nhận vào một cách rõ ràng

Chú ý rằng việc gọi một hàm cục bộ có sự khác nhau giữa việc sử dụng tên hàmđầy đủ chức năng hay là ẩn, nó sẽ được tham chiếu đến phiên bản muộn nhất của module

5.1.6.If – rẽ nhánh có điều kiện:

Các nhánh điều kiện của biểu thức IF được check một cách tuần tự cho tới khi

GuardSeq (biểu thức điều kiện ) nhận giá trị true Sau đó phân thân – body tương ứng của

lệnh IF được thực hiện (các biểu thức được phân cách bởi dấu , )

Giá trị trả vể của body là giá trị trả về của biểu thức

Nếu GuardSeq không phải là true, thì mệnh để if sẽ gây nên lỗi if_clause Nếu cầnthiết biểu thức guard mang giá trị true có thể được sử dụng như là nhánh cuối cùng (luônluôn trả về giá trị true)

Trang 36

Biểu thức Expr được biểu diễn và biểu mẫu Pattern được so khớp một cách tuần tự

với kết quả Nếu việc so khớp thành công và GuardSeq là true, thì Body tương ứng được

biểu diễn

Giá trị trả về của Body là giá trị trả về của biểu thức case.

Nếu không có biểu mẫu so khớp nào với GuardSeq là true, lỗi case_clause (mệnh đềcase) sẽ xảy ra

5.1.8.Send – toán tử gửi:

Gửi giá trị của Expr2 như một thông điệp tới một quá trình được đặc tả bởi Expr1.Giá trị của biểu thức Expr2 cũng là giá trị trả về

Expr1 phải biểu diễn là một PID (processing identify), tên đăng ký – atom hày làmột tuple {Name, Node}, ở đây Name là một ation và Node là một tên Node, cũng là mộtatom

 Nếu Expr1 biểu diễn một tên, nhưng tên này không được đăng ký, lỗi badargrun-time sẽ xảy ra

 Gửi một thông điệp tới một PID không bao giờ bị lỗi thậm chí nếu PID trỏtới một process không tồn tại

 Gửi thông điệp phân tán: nếu Expr1 biểu diễn một tuple {Name, Node} (haymột PID được đặt tại một Node khác), cũng không bao giờ lỗi

Trang 37

Thông điệp nhận việc được gửi tới process bằng việc sử dụng toán tử send –

nhận(!) Biểu mẫu Pattern được so khớp một cách tuần tự với thông điệp đầu tiên trong

thứ tự thời gian trong mailbox, và các thông điệp thứ 2, và cứ thế tiếp tục Nếu việc sokhớp thành công và GuardSeq tùy chọn là true, thì tương ứng Body sẽ được thực hiện.Thông điệp so khớp là bị phá hủy, remove ra khỏi mailbox, trong khi các thông điệp cònlại khác trong mailbox là không thay đổi

Giá trị trả về của Body là giá trị trả về trong biểu thức receive.

Receive là không bao giờ lỗi Việc thực thi được hoãn lại, có thể không được định

nghĩa cho tới khi thông điệp tới mà không so khớp được với một pattern nào vàGuardSeq là true

ExprT nên là giá trị kiểu integer Giá trị được phép cao nhất là 16#FFFFFFFF, giá

trị này phải phù hợp với 32 bít Receive … after làm việc đúng như là một receive, ngoại

Trang 38

trừ các thông điệp không khớp đến trong Expr phần nghìn giây, sau đó BodyT sẽ được thực thi thay thế, và giá trị trả về trở thành giá trị của biểu thức receive… after.

Có 2 trường hợp đặc biệt cho giá trị timeout – quá hạn của ExprT:

 infinit:vô định quá trình này nên đợi một cách vô định cho một thôngđiệp phù hợp - Ở đây gần giống như việc chúng ta không sử dụng timeout –quá hạn Điều này có thể có ích cho giá trị timeout mà được tính toán lúcrun-time

 0:Nếu không có thông điệp nào phù hợp trong mailbox – hòm thư, thìtimeout – quá hạn sẽ xảy ra ngay

Ngày đăng: 16/07/2018, 15:02

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w