THẾ NÀO LÀ NGÔN NGỮ LẬP TRÌNH BẬC THẤP, BẬC CAO?

Ngôn ngữ lập trình là gì thì chắc ở đây ai cũng biết rồi, vậy nhưng tại sao người ta còn có bậc thấp và bậc cao?

Để ngắn gọn, ta có thể nhớ luôn Hợp ngữ (Assembly language) và ngôn ngữ máy là ngôn ngữ cấp thấp, còn tất cả các ngôn ngữ khác đều là bậc cao.

NGÔN NGỮ MÁY

Máy tính vốn không hiểu tiếng người, bộ nhớ của nó chỉ chứa duy nhất các bit 0 và 1, được gom lại thành từng byte. Việc đọc hay ghi luôn được thực hiện theo đơn vị byte, cũng như việc đánh địa chỉ cũng theo byte. Bạn không thể yêu cầu CPU hay các thiết bị ngoại vi: “Hãy lấy cho tôi 1 bit ở vị trí xyz nào đó”. Muốn làm điều đó bạn phải tính toán xem bit đó thuộc byte nào (cứ chia cho 8 là được), đọc byte đó, rồi xem bit đó tương ứng với vị trí thứ mấy trong byte, dùng một toán tử bit nào đó (AND chẳng hạn) để kiểm tra xem nó bằng 1 hay bằng 0.

Continue reading “THẾ NÀO LÀ NGÔN NGỮ LẬP TRÌNH BẬC THẤP, BẬC CAO?”

TỪ NGÔN NGỮ LẬP TRÌNH ĐẾN MÃ MÁY (phần 2)

Sau khi đã hoàn thành tiền xử lý, chúng ta sẽ sang bước thứ hai: Biên dịch.

Về cơ bản quá trình biên dịch nhận đầu vào là file mã nguồn, phân tích nó và xuất ra file nhị phân chứa mã thực thi. Quá trình này sẽ chia làm 3 bước chính:

👉 Phân tích từ vựng (lexical analysis)Trình biên dịch sẽ đọc file mã nguồn, từng ký tự một, sau đó phân tích các ký tự rời rạc đó thành các từ vựng trong bộ từ vựng của ngôn ngữ tương ứng.

Xét ví dụ sau:

int x = myfunc(x) * 10

Ví dụ trên sẽ được phân tích thành các từ vựng (ta có thể dùng từ tiếng Anh là token): int, x, =, myfunc, (, x, ), *, 10.Trình phân tích từ vựng sử dụng các ký tự phân tách (khoảng trắng, tab, xuống dòng, dấu chấm phẩy… tùy ngôn ngữ) để tìm ra các từ vựng, nó cũng biết rằng chữ n và t nằm sau i phải được kết hợp thành keyword int, ký tự 1 và 0 phải được kết hợp thành một nhóm là 10 – và đây là một số nguyên, tương tự cho các token còn lại.

Continue reading “TỪ NGÔN NGỮ LẬP TRÌNH ĐẾN MÃ MÁY (phần 2)”

TỪ NGÔN NGỮ LẬP TRÌNH ĐẾN MÃ MÁY (phần 1 – preprocessing)

Bạn đã biết C++ chưa? Đã học C#, Java, JavaScript, Python?Nghe nói Assembly khó lắm? Nếu Assembly khó thì mã máy thế nào?

Trong bài viết này tôi sẽ cố gắng mô tả quá trình từ một chương trình viết bằng ngôn ngữ bậc cao được dịch và thực thi như thế nào, hi vọng sau bài viết này các bạn sẽ có một cái nhìn tổng quan, hiểu được cơ bản và có thể tự mình giải quyết được các trục trặc thường gặp.Trong loạt bài này tôi sẽ chủ yếu minh họa bằng C, vì đây là ngôn ngữ có đầy đủ “đồ chơi” nhất, cũng như gần với các ngôn ngữ cấp thấp nhất.

❓Trình biên dịch làm thế nào để biến chương trình của bạn thành mã máy?

Continue reading “TỪ NGÔN NGỮ LẬP TRÌNH ĐẾN MÃ MÁY (phần 1 – preprocessing)”