Luồng điều khiển

Trong khoa học máy tính, **luồng điều khiển** (tiếng Anh: *control flow* hay *flow of control*) là thứ tự các câu lệnh, tập lệnh hay lời gọi hàm riêng biệt của một chương trình mệnh lệnh được thực thi hay đánh giá. Việc nhấn mạnh vào kiểm soát dòng một cách rõ ràng sẽ phân biệt một ngôn ngữ *[[lập trình mệnh lệnh]]* (*imperative programming*) với ngôn ngữ *[[lập trình khai báo]]* (*declarative programming*).

Trong một ngôn ngữ lập trình bắt buộc, một * câu lệnh điều khiển luồng * là một câu lệnh thực thi mà kết quả trong một sự lựa chọn được thực hiện theo cách của hai hoặc nhiều đường dẫn tiếp theo. Đối với ngôn ngữ lập trình không nghiêm ngặt các ngôn ngữ chức năng, các hàm và cấu trúc ngôn ngữ tồn tại để đạt được cùng một kết quả, nhưng chúng thường không được gọi là các câu lệnh luồng điều khiển.

Một tập hợp các câu lệnh lần lượt thường được cấu trúc như một Block, ngoài việc nhóm, cũng định nghĩa phạm vi từ vựng.

Ngắt và tín hiệu là các cơ chế cấp thấp có thể thay đổi dòng điều khiển theo cách tương tự như chương trình con, nhưng thường xảy ra như một phản ứng với một số kích thích hoặc sự kiện bên ngoài (có thể xảy ra không đồng bộ), thay vì thực hiện một dòng điều khiển lưu lượng.

Ngắt và tín hiệu là cơ chế cấp thấp có thể thay đổi luồng điều khiển theo cách tương tự như chương trình con, nhưng thường xảy ra như một phản ứng với một số kích thích hoặc sự kiện bên ngoài (có thể xảy ra không đồng bộ), thay vì thực hiện câu lệnh dòng điều khiển * nội dòng *.

## Danh mục

Các loại báo cáo dòng điều khiển được hỗ trợ bởi các ngôn ngữ khác nhau, nhưng có thể được phân loại theo hiệu ứng của chúng:
* Tiếp tục ở một câu lệnh khác (nhánh vô điều kiện hoặc nhảy)
* Thực hiện một tập hợp các câu lệnh chỉ khi một số điều kiện được đáp ứng (lựa chọn - tức là, nhánh có điều kiện)
* Thực hiện một tập hợp các câu lệnh bằng không hoặc nhiều lần, cho đến khi một số điều kiện được đáp ứng (tức là, vòng lặp - giống như nhánh có điều kiện)
* Thực hiện một tập hợp các câu lệnh ở xa, sau đó luồng điều khiển thường trả về (chương trình con, coroutines và tiếp tục)
* Dừng chương trình, ngăn chặn bất kỳ sự thực thi nào khác (dừng vô điều kiện)

## Ban đầu
### Nhãn

nhãn là tên hoặc số rõ ràng được gán cho một vị trí cố định trong source code và có thể được tham chiếu bởi các câu lệnh dòng điều khiển xuất hiện ở nơi khác trong mã nguồn. Nhãn đánh dấu một vị trí trong mã nguồn và không có hiệu ứng nào khác.

Số dòng là một thay thế cho một nhãn được đặt tên (và được sử dụng trong một số ngôn ngữ như BASIC), là số nguyên được đặt ở đầu mỗi dòng văn bản trong mã nguồn. Các ngôn ngữ sử dụng chúng thường áp đặt ràng buộc rằng các số dòng phải tăng giá trị trong mỗi dòng sau, nhưng có thể không yêu cầu chúng phải liên tiếp. Ví dụ, trong BASIC:


```qbasic
10 LET X = 3
20 PRINT X
```


Trong các ngôn ngữ khác như C và Ada, nhãn là số nhận dạng, thường xuất hiện ở đầu dòng và ngay lập tức theo sau bởi dấu hai chấm. Ví dụ, trong C:


```c
Success: printf("The operation was successful.\n");
```


Ngôn ngữ ALGOL 60 cho phép cả số nguyên và số nhận dạng dưới dạng nhãn (cả hai đều được liên kết theo dấu hai chấm cho câu sau), nhưng nếu bất kỳ biến thể ALGOL nào khác cho phép số nguyên. Các trình biên dịch Fortran chỉ cho phép các số nguyên làm nhãn. Bắt đầu với Fortran-90, nhãn chữ và số cũng được cho phép.

### Goto

Câu lệnh* goto * (một sự kết hợp của các từ tiếng Anh *  * và *  *, và phát âm tương ứng) là hình thức chuyển giao cơ bản nhất kiểm soát vô điều kiện.
Mặc dù từ khóa có thể nằm trong chữ hoa hoặc chữ thường phụ thuộc vào ngôn ngữ, nó thường được viết là:
  **goto** *label*

Ảnh hưởng của lệnh goto là làm cho câu lệnh tiếp theo được thực hiện để câu lệnh xuất hiện tại (hoặc ngay sau) nhãn được chỉ định.
Câu lệnh Goto đã được nhiều nhà khoa học máy tính coi là có hại, đáng chú ý Dijkstra.

### Chương trình con

Thuật ngữ cho các chương trình con khác nhau; chúng có thể được gọi là các thủ tục, hàm (nếu chúng trả về kết quả) hoặc các phương thức (nếu chúng thuộc về lớp hoặc loại lớp).

Trong những năm 1950, bộ nhớ máy tính rất nhỏ theo tiêu chuẩn hiện hành nên các chương trình con được sử dụng chủ yếu  
để giảm kích thước chương trình. Một đoạn mã được viết một lần và sau đó được sử dụng nhiều lần từ nhiều nơi khác nhau trong một chương trình.

Ngày nay, các chương trình con thường được sử dụng để giúp tạo một chương trình có cấu trúc hơn, ví dụ, bằng cách cô lập một số thuật toán hoặc ẩn một số phương thức truy cập dữ liệu. Nếu nhiều lập trình viên đang làm việc trên một chương trình, các chương trình con là một loại mô đun có thể giúp phân chia công việc.

### Trình tự

Trong cấu trúc lập trình, việc sắp xếp thứ tự các lệnh liên tiếp được coi là một trong những cấu trúc điều khiển cơ bản, được sử dụng như một khối xây dựng cho các chương trình cùng với sự lặp lại, đệ quy và lựa chọn.

## Luồng điều khiển có cấu trúc tối thiểu

Vào tháng 5 năm 1966, Böhm và Jacopini xuất bản bài báo trong ACM cho thấy rằng bất kỳ chương trình nào có * 'goto' * có thể được chuyển thành dạng goto-free chỉ liên quan đến lựa chọn (IF THEN ELSE) và vòng lặp (WHILE condition DO xxx), có thể với mã trùng lặp và/hoặc bổ sung Các biến Boolean (true / false flags). Các tác giả sau đó cho thấy rằng sự lựa chọn có thể được thay thế bằng các vòng lặp (và nhiều biến Boolean hơn).

## Tham khảo

* Hoare, C. A. R. "Partition: Algorithm 63," "Quicksort: Algorithm 64," and "Find: Algorithm 65." Comm. ACM 4, 321-322, 1961.

## Liên kết ngoài

*Go To Statement Considered Harmful 
*A Linguistic Contribution of GOTO-less Programming 
*&nbsp;
*&nbsp;