Mã chương trình c. Mã chương trình, ứng dụng, lỗi là gì

Để chương trình thực hiện các hành động được quy định cho nó, ví dụ như tính toán, hiển thị kết quả, phản ứng với các hành động của người dùng, chẳng hạn như nhấn các nút, chọn các dòng từ danh sách, thì cần Mã chương trình.

Mã chương trình là một tập hợp các từ và ký hiệu trong một ngôn ngữ lập trình.

Bảng chữ cái là một tập hợp đầy đủ các chữ cái, số và ký hiệu được sử dụng trong ngôn ngữ để biểu thị dữ liệu và hành động trên chúng.

Bảng chữ cái Visual Basic bao gồm bộ ký tự sau:

Chữ hoa (A - Z) và chữ thường (a - z) của bảng chữ cái Latinh;

Các số từ 0 đến 9;

Dấu hiệu số học (theo thứ tự ưu tiên tăng dần): +, -, *, /, |, ^;

Dấu hiệu hoạt động quan hệ: =,<, >.

Dấu câu và dấu phân cách :,  . : ; ();

Bảng chữ cái của ngôn ngữ cũng bao gồm để dành những từ không thể được sử dụng như những cái tên biến hoặc thủ tục. Ví dụ về các từ dành riêng: Dim, Sub, Integer, v.v. Theo mặc định, phông chữ màu xanh lam được sử dụng để đánh dấu các từ khóa trong cửa sổ Chỉnh sửa mã Visual Basic.

Các từ và ký hiệu phải được viết theo đúng quy tắc của ngôn ngữ, không mắc lỗi chính tả và dấu câu. Chính tả chính xác sẽ cho phép máy tính hiểu và thực thi chương trình một cách rõ ràng.

Cửa sổ mã

Mã chương trình được viết trong cửa sổ mã. Mỗi biểu mẫu có một cửa sổ như vậy.

Mở cửa sổ mã:

1 chiều - trong cửa sổ Trình khám phá dự án nhấp chuột phải vào biểu mẫu mong muốn và chọn Hiển thị mã.

Ghi chú: cửa sổ mã có thể có hoặc không được liên kết với biểu mẫu. Một cửa sổ mã riêng biệt được gọi là Mô-đun... Các mô-đun trong cửa sổ Project Explorer được nhóm thành một nhóm Mô-đun... Để mở một cửa sổ với mã mô-đun, bạn cần trong cửa sổ Người khám phá dự án nhấp đúp vào tên mô-đun.

2 cách - bấm đúp vào một điều khiển trên biểu mẫu hoặc trên chính biểu mẫu trong cửa sổ biểu mẫu.

Ghi chú: điều này không chỉ mở cửa sổ mã mà còn tạo ra một thủ tục xử lý sự kiện (xem bên dưới).

Cấu trúc cửa sổ mã:

Lúa gạo. 7. Cửa sổ mã chương trình.

    Danh sách các điều khiển

    Danh sách các sự kiện kiểm soát

    Thủ tục (mã)

Thủ tục

Vì khi mở tủ lạnh, đèn sáng và khi mở vòi, nước chảy ra, chúng ta có thể nói rằng khi sự kiện mở tủ lạnh xảy ra, một quy trình được thực hiện và sự kiện mở van sẽ kích hoạt một quy trình khác. Tương tự, mã chương trình bao gồm các thủ tục riêng biệt, mỗi thủ tục thực hiện các hành động cụ thể riêng cho nó, ví dụ, một thủ tục thắp đèn, thủ tục kia bật (bơm) nước.

Ngôn ngữ lập trình - ngôn ngữ lập trình thủ tục.Điều này có nghĩa là bạn có thể tạo các khối mã trong đó, sau đó có thể được tham chiếu theo tên. Sau khi khối mã được đặt tên, nó có thể được triệu tập và thực hiện. Nó giống như một chương trình trong một chương trình. Các chương trình nhỏ "sống" trong các chương trình lớn được gọi là chức năng nếu chúng trả về một số giá trị và chương trình con, nếu chúng không trả về giá trị.

Các chương trình con và hàm giúp lập trình dễ dàng và nhanh hơn, đồng thời mã được tạo ra đáng tin cậy hơn. Tạo thói quen và chức năng của riêng bạn là bước đầu tiên để phát triển gói lại và mã có thể sử dụng lại. Đóng gói có nghĩa là ẩn việc triển khai các thuộc tính và phương thức của một đối tượng đằng sau giao diện bên ngoài của nó.

Thủ tục (chương trình con) là một đoạn mã chương trình riêng biệt, với sự trợ giúp của nó, thông thường một vấn đề nhỏ sẽ được giải quyết, nó là một khối chương trình nhỏ, được xây dựng một cách hợp lý để phân chia toàn bộ chương trình.

Nếu một thủ tục chỉ có thể được thực thi trong một khối chương trình nhất định (ví dụ: chỉ trong biểu mẫu này) và nó không thể được gọi từ một khối chương trình khác, thì thủ tục đó là cục bộ. Thủ tục cục bộ được chỉ định bằng cách sử dụng từ khóa Private Sub.

Nếu thủ tục có thể được gọi từ các khối chương trình khác (ví dụ, từ một biểu mẫu khác), thì thủ tục như vậy là toàn cục. Thủ tục toàn cục được chỉ định bằng cách sử dụng từ khóa Public Sub.

Theo mặc định, nếu không có từ khóa nào trước từ khóa Sub, thì đây là một thủ tục toàn cục.

Các thủ tục là:

    Thủ tục sự kiện... Được thực thi khi một sự kiện xảy ra trong bất kỳ điều khiển (hoặc biểu mẫu) nào. Một thủ tục sự kiện luôn được liên kết với một đối tượng. Để gọi thủ tục sự kiện của một đối tượng, chỉ cần nhấp đúp chuột trái vào đối tượng này là đủ.

    Các thủ tục tùy ý... Chúng không liên quan đến sự kiện và có thể được gọi từ bất kỳ thủ tục nào khác và được thực thi bất kỳ lúc nào. Nếu cùng một khối chương trình xảy ra trong một chương trình ở mọi dạng, thì nó chỉ có thể được viết một lần và ở một nơi, dưới dạng một chương trình chung toàn cầu. Việc khởi chạy một chương trình thông thường không được liên kết với một đối tượng hoặc một sự kiện, nhưng xảy ra khi nó được truy cập từ các khối chương trình khác. Gọi một thủ tục chung từ cùng một biểu mẫu: Thủ tụcName (Danh sách tham số)... Gọi một thủ tục chung từ một biểu mẫu khác: MỘT ĐỐI TƯỢNG. Thủ tụcName (Danh sách tham số)... Thủ tục chung là cả Tư nhân địa phương và Công cộng toàn cầu.

Cấu trúc thủ tục

Thủ tục bao gồm các yếu tố sau:

    Tiêu đề thủ tục - đánh dấu sự bắt đầu của thủ tục, kiểu của nó, mục đích (sự kiện).

Ví dụ về tiêu đề của một thủ tục được thực thi khi nút có tên Command1 được nhấp vào.

    Từ Riêng tư có nghĩa là - đóng, tức là, thủ tục chỉ thuộc về biểu mẫu hoặc mô-đun này và không thể được sử dụng bởi các vùng chứa khác (biểu mẫu, mô-đun). Nếu từ này bị bỏ qua, thì thủ tục sẽ được mở cho các vùng chứa khác.

    Phụ- thủ tục.

Ghi chú: bên cạnh các thủ tục còn có các hàm - chức năng. Các hàm không được liên kết với các sự kiện và cũng có thể trả về kết quả của công việc của chúng (tính toán).

    Phần tử điều khiển(hoặc tên biểu mẫu): đây là tên chính xác của phần tử được lưu trữ trong thuộc tính Tên.

    Biến cố- tên của sự kiện. Dưới đây là một số sự kiện:

    Nhấp - nhấp chuột;

    DblClick - nhấp đúp chuột;

    KeyPress - phím bấm;

    UnLoad - dỡ bỏ biểu mẫu (khi biểu mẫu được đóng, chương trình kết thúc);

    Kích hoạt - kích hoạt biểu mẫu (khi nhấp vào biểu mẫu, khi tiêu đề của nó được đánh dấu);

    Hủy kích hoạt - hủy kích hoạt biểu mẫu (khi bấm vào biểu mẫu khác).

    Khởi tạo - khi tạo một đối tượng có dạng kiểu.

    Thay đổi kích thước - khi thay đổi kích thước biểu mẫu

    Chấm dứt - tại thời điểm xóa biểu mẫu

    Tranh luận là dữ liệu ban đầu được chuyển cho thủ tục để xử lý.

Các thủ tục tùy ý có tiêu đề sau:

Tên thủ tục nên là độc nhất, phải bắt đầu bằng một chữ cái và không được chứa khoảng trắng hoặc các ký tự khác ngoài dấu gạch dưới. Thủ tục được gọi theo tên khi nó cần được thực thi.

    Kết thúc thủ tục - kết thúc mã chương trình của thủ tục: End Sub

Ghi chú: cho các chức năng: Kết thúc Chức năng

    Thủ tục cơ thể là các dòng giữa tiêu đề và kết thúc. Số lượng của chúng là không giới hạn. Các dòng chứa các lệnh phải được thực hiện khi thủ tục được gọi (một sự kiện xảy ra).

Chương trình con (Phụ) - là một thủ tục thực thi mã chương trình trong khối của nó và không trả về giá trị. Cú pháp cho một chương trình con đơn giản là:

( Riêng tư | Công cộng ) Phụ SubMain ()

.. dòng mã Kết thúc Phụ

Phạm vi của chương trình con;

Kiểu con của thủ tục (cụ thể là một chương trình con);

subMain tên được gán cho chương trình con;

End Sub - phần cuối của khối mã chương trình con.

Tạo thủ tục

Để tạo một thủ tục, hãy làm như sau:

    1 chiều - nhấp đúp vào điều khiển hoặc biểu mẫu được yêu cầu. Cửa sổ mã sẽ mở ra, tiêu đề và phần cuối của quy trình sẽ xuất hiện trong đó. Nếu sự kiện khác là cần thiết, thì sự kiện đó sẽ được chọn bằng cách sử dụng danh sách ở góc trên bên phải của cửa sổ mã.

    2 cách - Mở cửa sổ mã, thực hiện Công cụ → Thêm thủ tục → xác định tên và các tham số của thủ tục → Ok.

    3 cách - mở cửa sổ mã và nhập các dòng cần thiết từ bàn phím.

Kết quả sẽ là:

Private Sub Command1_Click ()

Các thủ tục gọi điện để thực hiện

    Sự kiện này phải xảy ra để thủ tục sự kiện được thực thi.

    Để thực hiện một thủ tục tùy ý, tên của thủ tục này được chỉ định trong phần thân của thủ tục khác.

Private Sub Command1_Click ()

Tại đây, nhấn nút Command1 sẽ làm tăng sự kiện Click, đồng thời gọi và thực hiện thủ tục Kvadrat.

Mã thủ tục được thực hiện từng dòng một và từ trên xuống dưới.

Chức năng (Hàm số) - nó là một thủ tục thực thi các dòng mã của nó và trả về một số giá trị. Cú pháp cho một hàm đơn giản như sau:

Hàm số FunctionName () As Datatype

... dâymã số

FunctionName = ReturnValueKết thúc chức năng

Phạm vi chức năng;

Hàm là một từ khóa Visual Basic chỉ ra rằng đây là một hàm;

Tên chức năng () - tên được gán cho chức năng;

AS là một từ khóa Visual Basic đặt trước việc gán một kiểu dữ liệu;

Loại dữ liệu kiểu dữ liệu của giá trị trả về;

ReturnValue giá trị cần được gán cho tên hàm (đây là một điểm rất quan trọng!);

Hàm End - phần cuối của khối mã này.

Mã nguồn hoặc được sử dụng để tạo ra mã đối tượng hoặc được thực thi bởi trình thông dịch. Các thay đổi không bao giờ được thực hiện đối với mã đối tượng, chỉ đối với mã ban đầu, sau đó là chuyển đổi lại thành mã đối tượng.

Một mục đích quan trọng khác của mã nguồn là mô tả một chương trình. Sử dụng văn bản của chương trình, bạn có thể khôi phục logic hoạt động của nó. Các chú thích được sử dụng để làm cho mã nguồn dễ hiểu hơn. Ngoài ra còn có các công cụ cho phép bạn tự động truy xuất tài liệu từ mã nguồn của bạn - cái gọi là. trình tạo tài liệu.

Ngoài ra, mã nguồn còn có nhiều công dụng khác. Nó có thể được sử dụng như một công cụ giảng dạy; Các lập trình viên mới vào nghề có thể thấy hữu ích khi kiểm tra mã nguồn hiện có để tìm hiểu các kỹ thuật và phương pháp lập trình. Nó cũng được sử dụng như một công cụ giao tiếp giữa các lập trình viên có kinh nghiệm do tính chất ngắn gọn và rõ ràng (lý tưởng là) của nó. Chia sẻ mã giữa các nhà phát triển thường được coi là một yếu tố góp phần cải thiện trải nghiệm lập trình.

Các lập trình viên thường chuyển mã nguồn từ dự án này sang dự án khác, điều này được gọi là sử dụng lại mã ( Khả năng tái sử dụng phần mềm).

Mã nguồn là một thành phần thiết yếu để chuyển phần mềm sang các nền tảng khác. Không có mã nguồn cho bất kỳ phần mềm nào, việc chuyển dữ liệu quá khó hoặc không thể.

Tổ chức

Mã nguồn của một số phần của phần mềm (mô-đun, thành phần) có thể bao gồm một hoặc một số tệp. Mã chương trình không nhất thiết chỉ được viết bằng một ngôn ngữ lập trình. Ví dụ, các chương trình C thường chứa các phần chèn hợp ngữ nhằm mục đích tối ưu hóa. Các tình huống cũng có thể xảy ra khi một số thành phần hoặc bộ phận của chương trình được viết bằng các ngôn ngữ khác nhau, với việc lắp ráp tiếp theo thành một mô-đun thực thi duy nhất bằng cách sử dụng công nghệ được gọi là liên kết các thư viện ( liên kết thư viện).

Phần mềm phức tạp yêu cầu hàng chục hoặc thậm chí hàng trăm tệp nguồn để xây dựng. Trong những trường hợp như vậy, để đơn giản hóa việc xây dựng, các tệp dự án thường được sử dụng, tệp này mô tả sự phụ thuộc giữa các tệp với mã nguồn và mô tả quá trình xây dựng. Các tệp này cũng có thể chứa các tham số khác của trình biên dịch và môi trường phát triển. Các môi trường thiết kế khác nhau có thể sử dụng các tệp dự án khác nhau và trong một số môi trường, các tệp này có thể ở định dạng văn bản phù hợp để lập trình viên chỉnh sửa trực tiếp bằng trình chỉnh sửa văn bản phổ biến, trong các môi trường khác, các định dạng đặc biệt được hỗ trợ và tệp được tạo và sửa đổi bằng công cụ đặc biệt các chương trình. Các tệp dự án thường được gọi là mã nguồn. Trong đại đa số các môi trường ngôn ngữ hiện đại, các tệp dự án nhất thiết phải được sử dụng, bất kể độ phức tạp của mã nguồn khác có trong dự án. Thông thường, mã nguồn cũng có nghĩa là các tệp tài nguyên chứa nhiều dữ liệu khác nhau, ví dụ, đồ họa cần thiết để xây dựng một chương trình.

Để tạo điều kiện thuận lợi cho công việc với mã nguồn, cho công việc chung về mã của một nhóm lập trình viên, hệ thống kiểm soát phiên bản được sử dụng.

Chất lượng

Không giống như con người, không có mã "viết tốt" hoặc "viết xấu" cho máy tính. Nhưng cách mã được viết có thể có tác động lớn đến quá trình bảo trì. Chất lượng của mã nguồn có thể được nói đến trong ngữ cảnh của các tham số sau:

  • khả năng đọc của mã (bao gồm sự hiện diện hoặc không có chú thích đối với mã - các khối văn bản tùy ý bị chương trình biên dịch bỏ qua);
  • dễ dàng hỗ trợ, kiểm tra, gỡ lỗi và sửa lỗi, sửa đổi và chuyển;
  • độ phức tạp thấp;
  • sử dụng tài nguyên thấp - bộ nhớ, bộ xử lý, không gian đĩa;
  • không có bình luận nào được trình biên dịch hiển thị;
  • sự vắng mặt của "rác" - cái gọi là "biến chết" (nghĩa là các biến không được sử dụng), các toán tử không bao giờ được thực thi, các nhận xét từ các phiên bản trước của mã này đã mất ý nghĩa, v.v.

Mã nguồn không thực thi được

Giấy phép copyleft phần mềm miễn phí yêu cầu phân phối mã nguồn. Các giấy phép này cũng thường được sử dụng cho công việc không phải phần mềm, chẳng hạn như tài liệu, hình ảnh, tệp dữ liệu cho trò chơi máy tính.

Trong những trường hợp như vậy, mã nguồn được coi là hình thức ưu tiên của tác phẩm để chỉnh sửa. Nó cũng có thể được gọi là phiên bản "trong suốt" trong các giấy phép dành cho không phải phần mềm. Ví dụ:

  • đối với tệp nén bị mất dữ liệu - phiên bản không mất dữ liệu;
  • cho một hình ảnh raster - một phiên bản vector;
  • cho hình ảnh hai chiều của mô hình ba chiều - mô hình ba chiều
  • đối với hình ảnh văn bản - văn bản giống nhau ở định dạng văn bản;

và cuối cùng, bản thân tệp, nếu nó đáp ứng các điều kiện được chỉ định hoặc nếu một phiên bản thuận tiện hơn chỉ đơn giản là không tồn tại.

Cuộc hẹn

Mã nguồn hoặc được sử dụng để tạo ra mã đối tượng hoặc được thực thi bởi trình thông dịch. Các thay đổi không bao giờ được thực hiện đối với mã đối tượng, chỉ đối với mã ban đầu, sau đó là chuyển đổi lại thành mã đối tượng.

Một mục đích quan trọng khác của mã nguồn là mô tả một chương trình. Sử dụng văn bản của chương trình, bạn có thể khôi phục logic hoạt động của nó. Các chú thích được sử dụng để làm cho mã nguồn dễ hiểu hơn. Ngoài ra còn có các công cụ cho phép bạn tự động truy xuất tài liệu từ mã nguồn của bạn - cái gọi là. trình tạo tài liệu.

Ngoài ra, mã nguồn còn có nhiều công dụng khác. Nó có thể được sử dụng như một công cụ giảng dạy; Các lập trình viên mới vào nghề có thể thấy hữu ích khi kiểm tra mã nguồn hiện có để học các kỹ thuật và phương pháp lập trình. Nó cũng được sử dụng như một công cụ giao tiếp cho các lập trình viên có kinh nghiệm do tính chất ngắn gọn và rõ ràng của nó. Chia sẻ mã giữa các nhà phát triển thường được coi là một yếu tố góp phần cải thiện trải nghiệm lập trình.

Các lập trình viên thường chuyển mã nguồn (dưới dạng mô-đun, nguyên trạng hoặc có điều chỉnh) từ dự án này sang dự án khác, được gọi là tái sử dụng mã.

Mã nguồn là một thành phần thiết yếu để chuyển phần mềm sang các nền tảng khác. Không có mã nguồn cho bất kỳ phần mềm nào, việc chuyển dữ liệu quá khó hoặc không thể.

Tổ chức

Mã nguồn của một số phần của phần mềm (mô-đun, thành phần) có thể bao gồm một hoặc một số tệp. Mã chương trình không nhất thiết chỉ được viết bằng một ngôn ngữ lập trình. Ví dụ, thường các chương trình được viết bằng C, với mục đích tối ưu hóa, có chứa các đoạn mã hợp ngữ chèn. Cũng có thể một số thành phần hoặc bộ phận của chương trình được viết bằng các ngôn ngữ khác nhau, sau đó được tập hợp thành một mô-đun thực thi duy nhất bằng cách sử dụng công nghệ được gọi là liên kết các thư viện ( liên kết thư viện).

Phần mềm phức tạp yêu cầu hàng chục hoặc thậm chí hàng trăm tệp nguồn để xây dựng. Trong những trường hợp như vậy, để đơn giản hóa việc xây dựng, các tệp dự án thường được sử dụng, các tệp này mô tả sự phụ thuộc giữa các tệp với mã nguồn và mô tả quá trình xây dựng. Các tệp này cũng có thể chứa các tùy chọn cho trình biên dịch và môi trường thiết kế. Đối với các môi trường thiết kế khác nhau, các tệp dự án khác nhau có thể được sử dụng và trong một số môi trường, các tệp này có thể ở định dạng văn bản phù hợp để lập trình viên chỉnh sửa trực tiếp bằng trình chỉnh sửa văn bản phổ biến, trong các môi trường khác, các định dạng đặc biệt được hỗ trợ và tệp được tạo và sửa đổi sử dụng các chương trình nhạc cụ đặc biệt. Tệp dự án thường được gọi là mã nguồn. Trong đại đa số các môi trường ngôn ngữ hiện đại, các tệp dự án nhất thiết phải được sử dụng, bất kể mức độ phức tạp của mã nguồn khác có trong dự án. Thông thường, mã nguồn cũng có nghĩa là các tệp tài nguyên chứa nhiều dữ liệu khác nhau, ví dụ, đồ họa cần thiết để xây dựng một chương trình.

Để tạo điều kiện thuận lợi cho công việc với mã nguồn, cho công việc chung về mã của một nhóm lập trình viên, hệ thống kiểm soát phiên bản được sử dụng.

Chất lượng

Không giống như con người, không có mã "viết tốt" hoặc "viết xấu" cho máy tính. Nhưng cách mã được viết có thể có ảnh hưởng sâu sắc đến quá trình bảo trì. Chất lượng của mã nguồn có thể được đánh giá bằng các thông số sau:

  • khả năng đọc của mã (bao gồm cả sự hiện diện của các bình luận trên mã);
  • dễ dàng hỗ trợ, kiểm tra, gỡ lỗi và sửa lỗi, sửa đổi và chuyển;
  • sử dụng tiết kiệm tài nguyên - bộ nhớ, bộ xử lý, không gian đĩa;
  • không có bình luận nào được trình biên dịch hiển thị;
  • không có "rác" - các biến không sử dụng, các khối mã không thể truy cập, các nhận xét lỗi thời không cần thiết, v.v.;
  • xử lý lỗi đầy đủ;
  • tính di động - khả năng sử dụng trình xử lý (trình biên dịch, trình thông dịch, biên dịch viên) của các phiên bản khác nhau, hoặc thậm chí cả hệ điều hành khác nhau;
  • khả năng quốc tế hóa giao diện.

Mã nguồn không thực thi được

Giấy phép copyleft phần mềm miễn phí yêu cầu phân phối mã nguồn. Các giấy phép này cũng thường được sử dụng cho công việc không phải phần mềm, chẳng hạn như tài liệu, hình ảnh, tệp dữ liệu cho trò chơi máy tính.

Trong những trường hợp như vậy, mã nguồn được coi là hình thức ưu tiên của tác phẩm để chỉnh sửa. Nó cũng có thể được gọi là phiên bản "trong suốt" trong các giấy phép dành cho không phải phần mềm. Ví dụ:

  • đối với tệp nén bị mất dữ liệu - phiên bản không mất dữ liệu;
  • để hiển thị hình ảnh vectơ hoặc mô hình ba chiều - phiên bản vectơ và mô hình tương ứng;
  • đối với hình ảnh văn bản - văn bản giống nhau ở định dạng văn bản;
  • cho âm nhạc - một tệp ở định dạng bên trong của trình chỉnh sửa nhạc;
  • và cuối cùng, bản thân tệp, nếu nó đáp ứng các điều kiện được chỉ định hoặc nếu một phiên bản thuận tiện hơn chỉ đơn giản là không tồn tại.

Xem thêm


Quỹ Wikimedia. Năm 2010.

Xem "Mã nguồn" là gì trong các từ điển khác:

    Các tài liệu gốc của phim là âm bản, bản đối chiếu, bản sao đối chứng của phim, bản gốc của nhạc phim từ tính, bản ghi lại âm nhạc, tiếng ồn, nhạc phim chính, CD, v.v. Từ đồng nghĩa: văn bản được thực thi trực tiếp bởi trình thông dịch hoặc ... ... Từ vựng về tài chính

    Văn bản do con người viết ra của một chương trình máy tính bằng bất kỳ ngôn ngữ lập trình nào Từ điển thuật ngữ kinh doanh. Học thuật.ru. 2001 ... Bảng thuật ngữ kinh doanh

    nguồn- - Chuyên đề viễn thông, các khái niệm cơ bản Mã nguồn EN ... Hướng dẫn của người phiên dịch kỹ thuật

    nguồn- Mã nguồn 3.1.13: Một chương trình máy tính được thể hiện ở dạng con người có thể đọc được (ngôn ngữ lập trình) được dịch sang dạng có thể đọc được bằng máy (mã đối tượng) trước khi nó có thể được kiểm tra với ... ... Sách tham khảo từ điển các thuật ngữ của tài liệu quy chuẩn và kỹ thuật

    nguồn- ngôn ngữ của văn bản nguồn ... Từ điển dịch thuật giải thích

    Mã nguồn: Mã nguồn của văn bản do con người viết ra của một chương trình máy tính. Mã nguồn của technotriller do Duncan Jones chỉ đạo ... Wikipedia

    Thuật ngữ này có nghĩa khác, xem mã nguồn. Mã nguồn ... Wikipedia

    Bài viết này thiếu liên kết đến các nguồn thông tin. Thông tin phải được kiểm chứng, nếu không có thể bị nghi ngờ và xóa. Bạn có thể ... Wikipedia

    Logo Sáng kiến ​​Nguồn mở (OSI) Phần mềm nguồn mở là phần mềm nguồn mở. Mã nguồn của các chương trình đã tạo là mở, tức là nó có sẵn để xem và sửa đổi. Đây là ... ... Wikipedia

    Chương trình nguồn (mã nguồn)- 48) chương trình nguồn (mã nguồn) đại diện tương ứng của một hoặc nhiều quy trình có thể được chuyển đổi bởi hệ thống lập trình thành một dạng có thể được thực thi bởi thiết bị (mã đối tượng hoặc ngôn ngữ đối tượng) (loại 6, 7 và 9) ; ... Thuật ngữ chính thức

Nhu cầu có trang web riêng ngày nay của nhiều công ty cũng như cá nhân có kinh nghiệm, do đó, nhu cầu về thông tin phát triển và xúc tiến các dự án Internet là rất cần thiết. Nhiều người quan tâm đến câu hỏi - làm thế nào để tạo độc lập trang web, mã chương trình cho cái nào là vẻ bề ngoài của nền móng cho một ngôi nhà? Chúng ta hãy thử tìm hiểu vấn đề này, đi sâu vào chủ đề phát triển web.

Một trang web không chỉ là một tập hợp các văn bản, liên kết, hình ảnh và các biểu ngữ đầy màu sắc, nó còn là một mã chương trình chạy trên máy tính của người dùng hoặc trên phía máy chủ. Và nếu ngày nay hầu như tất cả mọi người đều có thể tạo hình ảnh ở định dạng yêu cầu ở độ phân giải và chất lượng mong muốn, bằng cách sử dụng hình ảnh tạo sẵn từ Internet hoặc bất kỳ trình chỉnh sửa đồ họa phổ biến nào, thì hãy tạo mã chương trình trang webđối với một giáo dân đầy khó khăn đáng kể.

Chất lượng của các ứng dụng và dự án Internet nói chung phụ thuộc mạnh mẽ vào kỹ năng của lập trình viên phát triển trang web, mã chương trình có thể chứa lỗi ảnh hưởng lớn đến tốc độ tải trang web và nhiều khía cạnh khác của toàn bộ trang web, kể cả những vấn đề liên quan đến bảo mật. Vì vậy, phát hiện và loại bỏ lỗi trong mã là điều bắt buộc khi tạo bất kỳ trang web nào. Tốt nhất là nên giao việc phát triển một trang web phức tạp của công ty cho các chuyên gia (nếu bạn không có), vì một số lỗi rất khó phát hiện và nhiều lỗi trong số đó có thể dẫn đến việc tải chậm và hiển thị không chính xác các trang web trong trình duyệt của máy tính của người dùng Internet. Việc tải quá lâu có thể gây ra lượng khách truy cập từ trang web bị gián đoạn và giảm chất lượng lưu lượng truy cập, điều này làm giảm lợi nhuận và hiệu quả từ việc sử dụng các dự án Internet thương mại.

HTML và CSS trước tiên

Cơ sở của một tài liệu web là mã được viết bằng ngôn ngữ đánh dấu HTML. Không nên nhầm lẫn ngôn ngữ đánh dấu với ngôn ngữ lập trình, nhưng sự khác biệt chính xác là gì sẽ được viết chi tiết. Về cơ bản, bằng cách sử dụng tập hợp các lệnh mà HTML cung cấp cho nhà phát triển trang web, bạn có thể đặt tất cả các tham số cần thiết cho một tài liệu web tĩnh - sự sắp xếp của các phần tử (bố cục khối), tiêu đề, đoạn văn, bảng, hình ảnh, v.v. Và với sự trợ giúp của CSS, một tiện ích bổ sung đặc biệt cho HTML, bạn có thể định vị tất cả các đối tượng đánh dấu được liệt kê, thay đổi kiểu của chúng - màu sắc, kích thước, định dạng, v.v.

Sau đó, JavaScript

Các yếu tố tương tác và hoạt hình, ví dụ - biểu ngữ, đường leo, biểu mẫu phản hồi, hoạt động trên các trang web do sự hiện diện của các tập lệnh và mã được viết bằng ngôn ngữ lập trình máy chủ hoặc máy khách. Các tập lệnh được phát triển bằng ngôn ngữ lập trình JavaScript rất phổ biến. Các tập lệnh máy khách như vậy trong công việc của họ không sử dụng các khả năng của máy chủ và được thực thi ở phía máy tính của người dùng, tức là trong trình duyệt. Điều này làm cho các ứng dụng JavaScript trở nên đơn giản và nhanh chóng.

Cuối cùng là PHP

Trong trường hợp được yêu cầu viết các mã phức tạp và nhiều, chẳng hạn như cho các diễn đàn hoặc sách khách, các lập trình viên chuyển sang các ngôn ngữ lập trình phía máy chủ để được trợ giúp, và đặc biệt là. Các mã PHP được thực thi ở phía máy chủ, vì vậy công việc của chúng có thể bị chậm lại một chút, vì nó phụ thuộc vào tốc độ kết nối với máy tính từ xa và mức độ khối lượng công việc của nó. Sử dụng các lệnh PHP và SQL (một ngôn ngữ đặc biệt để truy vấn cơ sở dữ liệu quan hệ), bạn có thể tổ chức sự tương tác của một trang web với cơ sở dữ liệu và tạo các dự án Internet tương tác - diễn đàn, cửa hàng trực tuyến, bảng tin, các danh mục khác nhau, v.v.

Cơ sở của trang web là mã chương trìnhđược sửa đổi lần cuối: ngày 3 tháng 3 năm 2016 bởi quản trị viên

(Hướng dẫn dành cho nhà phát triển dòng vi điều khiển HCS08)

Trong ví dụ 12.1, chúng ta sẽ xem xét mã cho phép bạn viết và xóa dữ liệu của riêng bạn trong bộ nhớ flash. Những hành động như vậy là cần thiết nếu người dùng của bất kỳ thiết bị nào thực hiện cài đặt bổ sung cho thiết bị này và muốn lưu cấu hình đã chọn sau khi tắt nguồn.

Trước đó, chúng tôi đã lưu ý rằng các MC thuộc họ HCS08 không cho phép xóa và lập trình bộ nhớ flash, thực hiện chương trình điều khiển các chế độ này cũng từ bộ nhớ flash. Trước tiên, hãy nhớ viết lại mã chương trình chịu trách nhiệm xóa và các hoạt động lập trình vào RAM, sau đó chạy mã này để thực thi. Trong quá trình xóa và lập trình, quá áp sẽ được áp dụng cho mô-đun bộ nhớ flash. Tuy nhiên, điều này sẽ không dẫn đến sự gián đoạn của chương trình, vì tại thời điểm này, nó sẽ được thực thi từ RAM.

NXP đã phát triển một tập hợp các tiện ích hợp ngữ giúp bạn dễ dàng viết mã lập trình bộ nhớ flash của riêng mình dưới sự điều khiển của chương trình vận hành thiết bị. Các tiện ích này nằm trong tệp doonstack.asm... Tệp này nên được bao gồm trong dự án như được hiển thị trong Hình. 12.3.

Lúa gạo. 12.3. Cửa sổ dự án với tệp được bao gồm doonstack.asm.

Nội dung tệp doonstack.asm trình bày bên dưới. Văn bản gốc của mã chương trình đã sử dụng được cung cấp, vì vậy không thể dịch nhận xét.


; * Văn phòng phẩm này được dùng làm khuôn khổ cho *
; * ứng dụng người dùng. Để có một chương trình toàn diện hơn *
; * thể hiện chức năng nâng cao hơn của điều này *
; * bộ xử lý, vui lòng xem các ứng dụng trình diễn *
; * nằm trong thư mục con ví dụ của *
; * Metrowerks Codewarrior cho thư mục Chương trình HC08 *
;**************************************************************
; ký hiệu xuất khẩu
XDEF DoOnStack
XDEF FlashErase
XDEF FlashProg
; chúng tôi sử dụng xuất "Entry" làm biểu tượng. Điều này cho phép chúng tôi
; tham chiếu "Entry" trong tệp .prm của trình liên kết
; hoặc từ C / C ++ sau này

; bao gồm các macro cụ thể phái sinh
Bao gồm "MC9S08GB60.inc"

Hai dòng tiếp theo nên được bỏ ghi chú và gán các giá trị mong muốn.

; mPageErase bằng $ 40
; mByteProg bằng $ 20
mFACCERR bằng $ 10
mFPVIOL bằng $ 20
mFCBEF bằng $ 80
; phần biến / dữ liệu
MY_ZEROPAGE: PHẦN NGẮN
; Chèn vào đây định nghĩa dữ liệu của bạn. Để trình diễn, temp_byte được sử dụng.
; temp_byte ds.b 1
; phần mã
MyCode: SECTION
;**************************************************************
; quy trình lắp ráp này được gọi là ứng dụng C / C ++
DoOnStack: pshx
pshh; lưu con trỏ vào flash
psha; lưu lệnh trên ngăn xếp
ldhx #SpSubEnd; trỏ vào byte cuối cùng để di chuyển vào ngăn xếp;
SpMoveLoop: lda, x; đọc từ flash
psha; di chuyển lên ngăn xếp
aix # -1; byte tiếp theo để di chuyển
cphx # SpSub-1; kết thúc quá khứ?
bne SpMoveLoop; vòng lặp cho đến khi toàn bộ phụ trên ngăn xếp
tsx; trỏ tới con trên ngăn xếp
tpa; chuyển CCR sang A để thử nghiệm
và # $ 08; kiểm tra I mask
bne I_set; bỏ qua nếu tôi đã đặt
sei; chặn ngắt khi FLASH bận
lda SpSubSize + 6, sp; tải trước dữ liệu cho lệnh
cli; ok để xóa tôi đắp mặt nạ ngay bây giờ
áo ngực I_cont; tiếp tục ngăn xếp phân bổ
I_set: lda SpSubSize + 6, sp; tải trước dữ liệu cho lệnh
jsr, x; thực thi sub trên ngăn xếp
I_cont: ais # SpSubSize + 3; deallocate sub body + H: X + lệnh
; Con trỏ flash H: X OK từ SpSub
lsla; A = 00 & Z = 1 trừ khi PVIOL hoặc ACCERR
rts; để flash nơi DoOnStack được gọi
;**************************************************************
SpSub: ldhx LOW (SpSubSize + 4), sp; lấy địa chỉ flash từ ngăn xếp
sta 0, x; ghi vào flash; chốt addr và dữ liệu
lda SpSubSize + 3, sp; nhận lệnh flash
sta FCMD; viết lệnh flash
lda #mFCBEF; mặt nạ để bắt đầu lệnh
sta FSTAT; đăng ký lệnh
nop; [p] muốn min 4 ~ từ chu kỳ w đến r
ChkDone: lda FSTAT; vì vậy FCCF là hợp lệ
lsla; FCCF hiện có trong MSB
bpl ChkDone; vòng lặp nếu FCCF = 0
SpSubEnd: rts; quay lại DoOnStack trong nháy mắt
SpSubSize: equ (* -SpSub)
;**************************************************************
FlashErase: psha; điều chỉnh sp cho mục nhập DoOnStack

lda #mPageErase; mẫu mặt nạ cho lệnh xóa trang
bsr DoOnStack; kết thúc lệnh từ con dựa trên ngăn xếp
rts
;**************************************************************
FlashProg: psha; tạm thời lưu dữ liệu nhập
lda # (mFPVIOL + mFACCERR); mặt nạ
sta FSTAT; hủy bỏ mọi lệnh và xóa lỗi
lda #mByteProg; mẫu mặt nạ cho lệnh byte prog
bsr DoOnStack; thực thi mã prog từ ngăn xếp RAM
ais # 1; thỏa thuận phân bổ vị trí dữ liệu từ ngăn xếp
rts
;**************************************************************

Ngoài ra, trong văn bản của mã chương trình C, bạn cần chỉ thị #bao gồm kết nối tệp doonstack.h, văn bản của nó được trình bày dưới đây.


/* */
/ * Tên dự án: doonstack.h * /
/ * Sửa đổi lần cuối: 11/04/2004 * /
/ * Bởi: r60817 * /
/* */
/* */
/**********************************************************************/
/* */
/ * Mô tả: MC9S08GB60_FLASH_DOONSTACK - demo * /
/* */
/* */
/ * Tài liệu: MC9S08GB60 / D Rev. 2,2 * /
/ * HCS08RMv1 / D Rev. 1 (Ví dụ về ứng dụng 4.8FLASH) * /
/* */
/ * Phần mềm này được phân loại là Phần mềm Mẫu Kỹ thuật. * /
/* */
/**********************************************************************/
/* */
/ * Các dịch vụ do FREESCALE thực hiện trong vấn đề này được thực hiện nguyên trạng * /
/ * và không có bất kỳ bảo hành nào. KHÁCH HÀNG giữ nguyên quyết định cuối cùng * /
/ * so với tổng thiết kế và chức năng của sản phẩm cuối cùng. * /
/ * FREESCALE không đảm bảo hoặc sẽ không chịu trách nhiệm bởi KHÁCH HÀNG * /
/ * cho sự thành công của dự án này. MIỄN PHÍ BÁN HÀNG TỪ CHỐI TẤT CẢ * /
/ * BẢO ĐẢM, ĐƯỢC THỂ HIỆN, NGỤ Ý HOẶC TRUYỆN BAO GỒM, NHƯNG KHÔNG PHẢI * /
/ * ĐƯỢC GIỚI HẠN ĐỐI VỚI, BẢO ĐẢM NGẪU NHIÊN VỀ TÍNH KHẢ NĂNG HOẶC PHÙ HỢP VỚI A * /
/ * MỤC ĐÍCH CỤ THỂ TRÊN BẤT KỲ PHẦN MỀM CỨNG NÀO, PHẦN MỀM MỞ RỘNG ĐƯỢC CUNG CẤP * /
/ * ĐẾN DỰ ÁN BẰNG CÁCH BÁN HÀNG, VÀ HOẶC CÓ THỂ KẾT QUẢ SẢN PHẨM TỪ * /
/ * DỊCH VỤ BÁN HÀNG. TRONG BẤT KỲ SỰ KIỆN NÀO, BÁN PHÍ SẼ KHÔNG ĐƯỢC CHỊU TRÁCH NHIỆM PHÁP LÝ CHO * /
/ * THIỆT HẠI BẤT CỨ HOẶC HẬU QUẢ PHÁT SINH NGOÀI THỎA THUẬN NÀY. * /
/* */
/ * KHÁCH HÀNG đồng ý giữ FREESCALE vô hại đối với bất kỳ và tất cả * /
/ * yêu cầu hoặc hành động của bất kỳ ai do bất kỳ thiệt hại nào, hoặc * /
/ * thương tích, cho dù thương mại, hợp đồng, hay quanh co, gia tăng * /
/ * trực tiếp hoặc gián tiếp là kết quả của lời khuyên hoặc hỗ trợ * /
/ * KHÁCH HÀNG cung cấp liên quan đến sản phẩm, dịch vụ hoặc hàng hóa * /
/ * được cung cấp theo Thỏa thuận này. * /
/* */
/**********************************************************************/
/*
- API tệp này giữa main.c và doonstack.asm
*/
#ifndef _doonstack
#define _doonstack
#ifdef __cplusplus
extern "C" (/ * các hàm hợp ngữ của chúng ta có quy ước gọi C * /
#endif
void DoOnStack (vô hiệu); / * nguyên mẫu cho quy trình DoOnStack * /
void FlashErase (không dấu *); / * nguyên mẫu cho quy trình FlashErase * /
/ * Lệnh xóa trang * /
void FlashProg (ký tự không dấu *, ký tự không dấu); / * nguyên mẫu cho quy trình FlashProg * /
/ * Lệnh chương trình Byte * /
#ifdef __cplusplus
}
#endif

#endif / * _doonstack * /
/**********************************************************************/

Trong ví dụ của chúng tôi, một khối 512 byte được dành riêng để ghi dữ liệu không bay hơi. Kích thước khối này được chọn vì nó là số lượng ô nhớ flash tối thiểu được phép xóa trong vi điều khiển MC9S08QG8. Khối được chọn sẽ nằm ở đầu không gian địa chỉ của bộ nhớ flash thường trú của MK: từ 0xE000 đến 0xE1FF. Mã chương trình sẽ bắt đầu ở 0xE200 và có thể chiếm không gian địa chỉ lên đến 0xFFFF.

Để triển khai vị trí dự kiến ​​của dữ liệu và mã chương trình, bạn nên thay đổi cài đặt trình liên kết trong tệp project.prm.

Trong dự án tiêu chuẩn, có một mục:


ROM = READ_ONLY 0xE000 ĐẾN 0xFFAD;

Nó nên được thay thế:

SEGMENTS / * Tại đây tất cả các vùng RAM / ROM của thiết bị đều được liệt kê * /
ROM = READ_ONLY 0xE200 ĐẾN 0xFFAD;

Trong ví dụ của chúng tôi, chúng tôi cũng đã sử dụng chế độ chống ghi của vùng mã chương trình, tức là không gian địa chỉ từ 0xF200 đến 0xFFFF. Trong bộ lễ phục. 12.4 cho thấy quá trình tạo mã cho thanh ghi FPROT, nó bảo vệ không gian địa chỉ 0xF200 ... 0xFFFF khỏi bị xóa / ghi ngẫu nhiên. Bảy bit quan trọng nhất của địa chỉ cuối cùng, 0xF1FF, của không gian địa chỉ không được bảo vệ phải được ghi vào thanh ghi FPROT.

Địa chỉ nhà A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
0xE1FF 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1
FPROT FPS7 FPS6 FPS5 FPS4 FPS3 FPS2 FPS1 FPDIS
0xE0 1 1 1 0 0 0 0 0

Lúa gạo. 12.4. Hình thành hồ sơ mã bảo vệ cho sổ đăng ký FPROT.

Ví dụ 12.1. Hoạt động với dữ liệu không thay đổi trong bộ nhớ flash

// Bảng demo DEMO9S08QG8
// xóa / ghi / đọc bộ nhớ flash thường trú
#include / * cho macro EnableInterrupts * /
#include "origin.h" / * bao gồm các khai báo ngoại vi * /
#include "hcs08.h" / * Đây là tệp khai báo của chúng tôi! * /
#include "doonstack.h"
#define BUSCLK 8000000
#define vFCDIV (BUSCLK / 200000-1)
char fdata, hoạt động;
không dấu int faddress;
// Gán vùng địa chỉ chống ghi: 0xE200 thành 0xFFFF
const byte NVPROT_INIT @ 0x0000FFBD = 0xE0;
// Khởi tạo MK
void mcu_init (void)
{
SOPT1 = bBKGDPE; // Bật chức năng dòng gỡ lỗi BKGD
ICSSC = NV_FTRIM; // Ghi giá trị cắt FTRIM
ICSTRM = NV_ICSTRM; // Ghi giá trị cắt TRIM
ICSC2 = 0; // ICSOUT = DCOOUT / 1
// BUSCLK = 8 MHz
FCDIV = vFCDIV; // Ghi giá trị của mã bộ chia cho tần số FCLK
// (FCLK = 200 kHz)
}
#pragma inline
// Hàm đọc một byte từ ô nhớ có địa chỉ cho trước
char flash_read (địa chỉ int không dấu)
{
con trỏ char * không dấu;
địa chỉ con trỏ = (char *);
return (* con trỏ);
}
// Hàm ghi một byte vào vị trí bộ nhớ có địa chỉ cho trước
char flash_write (địa chỉ int không dấu, dữ liệu char chưa dấu)
{
con trỏ char * không dấu;
địa chỉ con trỏ = (char *);
FlashProg (con trỏ, dữ liệu); // Gọi hàm lập trình flash
if (FSTAT_FACCERR) data = 1; dữ liệu khác = 0;
dữ liệu if (FSTAT_FPVIOL) | = 2;
return (dữ liệu);
}
// Hàm xóa một khối đã cho trong vùng nhớ flash
unsigned char flash_sector_erase (địa chỉ int không dấu)
{
con trỏ char * unsigned, res;
địa chỉ con trỏ = (char *);
FlashErase (con trỏ);
if (FSTAT_FACCERR) res = 1; khác res = 0;
if (FSTAT_FPVIOL) res | = 2;
trả về (res);
}
void main (void)
{
mcu_init ();
fdata = 0;
faddress = 0xE000;
hoạt động = 0;
trong khi (1)
{
chuyển đổi (hoạt động)
{
case 1: // Xóa khối
fdata = flash_sector_erase (faddress);
hoạt động = 0;
nghỉ;
case 2: // Ghi byte
fdata = flash_write (faddress, fdata);
hoạt động = 0;
nghỉ;
case 3: // Đọc byte
fdata = flash_read (faddress);
hoạt động = 0;
nghỉ;
}
}
}

Xem xét phương pháp kiểm tra mã chương trình của Ví dụ 12.1. Để thực hiện việc này, trong cửa sổ trình gỡ lỗi Dữ liệu thêm ba biến: mặc quần áo, fdata, hoạt động... Chúng tôi cũng đặt cửa sổ thành chế độ cập nhật định kỳ, ví dụ: sau 200 mili giây.

Trước khi chạy mã chương trình để thực thi, hãy ghi vào một biến mặc quần áođịa chỉ để viết và trong biến fdata- byte dữ liệu để ghi. Đi sâu hơn vào biến hoạt động ghi mã 0x02. Sau khi chạy mã mẫu, byte dữ liệu sẽ bắt đầu ghi vào vị trí bộ nhớ flash đã chọn. Xin lưu ý rằng ô đã chọn phải ở trạng thái đã xóa, tức là nó phải chứa mã 0xFF.

Để xóa khối bộ nhớ 0xE00 ... 0xE1FF, hãy ghi vào mặc quần áo bất kỳ địa chỉ nào từ phạm vi được chỉ định và đặt biến hoạt động c 1. Sau đó chạy lại mã để thực thi.

Đọc dữ liệu từ bộ nhớ flash cũng dễ dàng. Để làm điều này, hãy ghi vào biến mặc quần áo mã địa chỉ, thành một biến hoạt động- mã 0x03. Nội dung của vị trí bộ nhớ flash đã chọn sẽ được hiển thị trong một biến fdata sau khi thực hiện mã chương trình.

Xin lưu ý rằng các chức năng flash_write ()flash_sector_erase () trả về một biến kiểu chare với mã lỗi khi thực hiện hành động: 0 - không có lỗi, 0x02 - có lỗi truy cập, 0x04 - đã có nỗ lực xóa / ghi không gian địa chỉ được bảo vệ. Cả hai hàm này đều yêu cầu khoảng 35 byte bộ nhớ ngăn xếp để thực thi chúng. Nếu diện tích thực của ngăn xếp nhỏ hơn, thì lỗi nghiêm trọng sẽ xảy ra. Chỉ có thể khôi phục chương trình hoạt động bằng cách đặt lại MK.

Để xem các thay đổi bộ nhớ flash trong trình gỡ lỗi, bạn cần thực hiện một số thay đổi đối với cấu hình trình gỡ lỗi. Theo cài đặt mặc định, trình gỡ lỗi chỉ đọc vùng bộ nhớ flash MK một lần sau khi bắt đầu phiên gỡ lỗi. Để thay đổi cấu hình, hãy chọn tùy chọn trong menu chính của trình gỡ lỗi MultilinkCyclonPro> Bản đồ bộ nhớ gỡ lỗi... Cửa sổ hiển thị trong Hình. 12,5, a. Chọn trong cửa sổ này khối bộ nhớ 3 và nhấn nút Sửa đổi / Chi tiết... Trong cửa sổ mới được hiển thị trong Hình. 12.5, b, chọn tùy chọn đã chọn. Điều này sẽ cho phép trình gỡ lỗi định kỳ làm mới cửa sổ bộ nhớ.

Lúa gạo. 12,5. Thay đổi cấu hình trình gỡ lỗi để cập nhật định kỳ nội dung của cửa sổ bộ nhớ.