Ngôn ngữ máy là gì? Hợp Ngữ là gì? Tại sao phải phân biệt bậc cao thấp trong ngôn ngữ Lập trình? Hãy theo dõi bài viết dưới đây để tìm ra câu trả lời cho mình nhé!
Ngôn ngữ máy là gì?
Về cơ bản máy tính của chúng ta không thể hiểu những dạng dữ liệu cao cấp như âm thanh, hình ảnh, video. Tất cả những gì chúng hiểu chỉ xoay quanh 2 con số 0 và 1 (bit nhị phân).
Chính vì vậy, chúng ta không thể đưa trực tiếp cho máy tính số 3 và số 5 và yêu cầu máy tính tính tổng và in kết quả ra màn hình. Những con số đó cần phải chuyển về dạng nhị phân, và ngay cả lệnh thực hiện phép cộng 2 số cũng được chuyển dưới các bit nhị phân 0 và 1.
Mã máy cũng không ngoại lệ, chúng cũng chỉ là những con số, được ghi theo một quy tắc do CPU quy định.
Ví dụ nếu nó quy định mã máy mang số 1 là phép toán cộng 2 biến a và b trong bộ nhớ, sau đó gán vào biến c, phép toán cộng (mã máy 1) này sẽ cần 3 tham số, nên 3 byte kế tiếp sẽ thuộc vào lệnh này.
Ta sẽ có 4 byte trong bộ nhớ như sau (được viết dưới dạng hex):
0x01 0x20 0x21 0x40
(giả sử biến a nằm ở địa chỉ 0x20, biến b nằm ở 0x21 và c tại 0x40)
CPU biết rằng lệnh 0x01 luôn chiếm 4 byte, nên nó sẽ đọc và thực thi mã lệnh kế tiếp sau 4 byte này.
Trong thực tế các lệnh sẽ phức tạp hơn nhiều, với những bài toán đơn giản sinh ra với mục đích để học tập chúng ta có thể hiểu được. Tuy nhiên, với độ phức tạp cao với số lượng tiến trình công việc lớn thì đúng chỉ có máy tính mới có thể hiểu được thôi.
Các bạn hoàn toàn có thể tìm hiểu các chương trình mã máy bằng cách nghiên cứu các file.exe rồi dịch ngược lại để biết được chương trình thực sự làm gì.
Chương trình viết bằng mã máy có ưu và nhược điểm:
Ưu điểm lớn nhất là nó thân thiện với …. máy tính, đương nhiên rồi. Vì là ngôn ngữ máy nên máy tính có thể thực thi ngay không cần thông qua các quá trình thông dịch và biên dịch trung gian, dẫn đến tốc độ chạy chương trình rất cao.
Thế nhưng về mặt nhược điểm thì chúng lại không mấy thân thiện với con người.
- Rất khó nhớ mã lệnh, một CPU thời cách đây vài chục năm cũng đã có hàng trăm lệnh khác nhau, những tập lệnh được bổ sung sau đó cũng rất lớn, vậy nên việc nhớ hết là hoàn toàn bất khả thi.
- Một khi thay đổi một phần chương trình sẽ phải sửa lại rất nhiều thứ khác.
Hợp Ngữ (Assembly Language) là gì?
Để đơn giản hóa việc ghi nhớ, người ta sẽ tạo ra một bảng ánh xạ 1-1 giữa từ khóa và mã máy, ví dụ khi ánh xạ 0x01 với add (lệnh cộng hai số), chúng ta có thể viết câu lệnh trên như sau:
add [0x20],[0x21],[0x40]
Trình dịch sẽ tự động chuyển chữ add đó thành số 0x01, ta đỡ phải ghi nhớ, mà dễ đọc hơn nhiều.
Hợp ngữ là ngôn ngữ trung gian giữa ngôn ngữ máy và ngôn ngữ lập trình bậc cao. Hợp ngữ có rất nhiều ưu điểm, bạn có thể nhìn vào một câu lệnh và biết ngay nó làm gì, không còn phải dịch ngược từ những con số sang một cái gì có ý nghĩa để có thể hiểu.
Tuy nó thân thiện với người dùng hơn ngôn ngữ máy nhưng vẫn có nhược điểm:
- Phụ thuộc vào kiến trúc hệ thống: mỗi một CPU có một tập lệnh riêng, bạn không thể đem chương trình viết cho CPU này sang một CPU khác.
- Chỉ thể hiện được đúng những gì CPU làm, tức là theo cách suy nghĩ của CPU, không phải của con người.
Ngôn ngữ lập trình bậc cao
Ngoài 2 ngôn ngữ trên, tất cả những ngôn ngữ mỗi lập trình viên được học đều là bậc cao: C, C++, Java, JavaScript, PHP, C#…
Ngôn ngữ lập trình bậc cao được sinh ra với các thành phần logic mang tư duy con người: biến, hằng, hàm, toán tử, biểu thức, vòng lặp, if else. Rồi thì đến các cấu trúc phức tạp hơn như: OOP, class object, try/ catch, using, import, async/await,…
Tất cả những thứ này sẽ được thông dịch hoặc biên dịch (tùy ngôn ngữ) thành mã máy để máy tính hiểu và thực thi. Một cấu trúc ngôn ngữ bậc cao có thể được dịch thành trăm dòng lệnh mã máy.
Các ngôn ngữ bậc cao có rất nhiều ưu điểm so với hợp ngữ và ngôn ngữ máy:
- Dễ đọc, dễ học, dễ nhớ… nói thật là ai cũng có thể học được nếu muốn. Với những khái niệm cơ bản thường không có sự khác biệt quá nhiều giữa các ngôn ngữ với nhau
- Cho phép triển khai nhiều khái niệm trừu tượng, phức tạp mà nếu chỉ sử dụng hợp ngữ thì không làm nổi (như OOP, async/await…).
- Cho phép dịch chương trình sang nhiều kiến trúc, môi trường khác nhau mà không cần sửa code. Tất cả sẽ do trình thông dịch và biên dịch thực hiện.
Với người lập trình ứng dụng, bạn chỉ cần thành thạo một ngôn ngữ nào đó là có thể đi làm được, bạn không cần hiểu sâu về những gì diễn ra đằng sau, bạn không cần biết kiến trúc máy tính thế nào (tất nhiên biết thì vẫn tốt hơn), chỉ cần viết, dịch và chạy. Thay vì phải mất vài năm, giờ chỉ cần vài tháng là đã có thể ‘hành nghề’ được rồi. Tất cả là nhờ các ngôn ngữ bậc cao.
Ngôn ngữ lập trình bậc trung
Nhiều người hay cho rằng các ngôn ngữ với tuổi thọ lâu đời như C, C++, Rust,.. là ngôn ngữ bậc trung, không thể xếp chung mâm với java, c# hay javascript,…
Do những ngôn ngữ mới thường sẽ được cải tiến và ngày càng thân thiện với con người hơn, chúng sẽ cung cấp những công cụ và phương tiện dễ dàng hơn để thực hiện một bài toàn nào đó. Những ngôn ngữ lâu đời sẽ có xu hướng gần với ngôn ngữ máy hơn, do vậy tính phức tạp của nó cũng cao hơn.
Người ta hay so sánh cùng một chương trình chục dòng của java sao mang sang python chỉ mất có 2 dòng. Không phải java không bằng python mà là do python có các phương tiện hỗ trợ cao hơn java, thay vì chúng ta phải xây dựng logic chi tiết bằng java thì python đã xây dựng hết và cung cấp sẵn cho ta sử dụng.
Điều đó có nghĩa là nếu xét đến cùng tất cả đều phức tạp như nhau, những gì bạn nhìn thấy ở 2 dòng code bề nổi không có nghĩa là cấu trúc bên trong nó đơn gian và ngược lại.
Vì vậy, tất cả ngôn ngữ lập trình bậc trung đều là ngôn ngữ lập trình bậc cao. Tùy thuộc vào mục đích của bạn mà chúng ta nên chọn ngôn ngữ nào cho phù hợp với bản thân để bắt đầu và theo đuổi.
Bộ môn Công nghệ Thông tin
Trường Cao đẳng FPT Mạng cá cược bóng đá
cơ sở Hà Nội