[Học lập trình C++] Chương 0: 0.2 Giới thiệu về ngôn ngữ lập trình

0.2 Giới thiệu về ngôn ngữ lập trình

Các máy tính hiện đại có tốc độ cực kì nhanh và ngày càng nhanh hơn nữa. Tuy nhiên, với tốc độ này thì đi kèm một số hạn chế đáng kể. Máy tính chỉ có thể hiểu được rất giới hạn câu lệnh, và phải nói một cách chính xác những gì cần làm. Một chương trình (còn được gọi là ứng dụng hay phần mềm) là một tập hợp các câu lệnh nói cho máy tính biết những gì phải làm. Phần máy tính vật lý thực thi những câu lệnh đó được gọi là phần cứng.

Ngôn ngữ máy

Một CPU của máy tính không đủ khả năng để hiểu ngôn ngữ C++. Có rất ít các câu lệnh mà CPU có thể hiểu được gọi là mã máy (hoặc ngôn ngữ máy). Những câu lệnh được tổ chức như thế nào thì vượt ra khỏi phần giới thiệu này, nhưng nó rất thú vị bởi hai điểm đáng chú ý. Đầu tiên, mỗi câu lệnh là một chuỗi số binary mang giá trị 0 hoặc 1. Những số binary này thường được gọi là bit (viết tắt của binary digit). Ví dụ, cấu trúc câu lệnh MIPS luôn có chiều dài 32 bit. Cấu trúc khác (ví dụ như x86, cái và bạn thích dùng) có những câu lệnh có thể là biến dài hơn.

Đây là ví dụ về câu lệnh ngôn ngữ máy x86: 10110000 01100001
Thứ 2, mỗi chuỗi bit được chuyển đổi bởi CPU sang một câu lệnh mà chỉ dẫn cụ thể từng công việc rất cụ thểm giống như so sánh các số với nhau, hoặc đặt số đó vào bộ nhớ. Các loại CPU khác nhau sẽ có các loại câu lệnh khác nhau, vì vậy câu lệnh chạy trên một máy Pentium 4 sẽ không chạy trên máy Macintosh PowerPC. Quay trở lại thời những chiếc máy tính đầu tiên được phát minh, những lập trình viên phải viết chương trình một cách trực tiếp bằng ngôn ngữ máy, điều này rất khó khăn và mất nhiều thời gian để thực hiện.

Ngôn ngữ Assembly

Bởi vì ngôn ngữ máy quá khó để lập trình, ngôn ngữ assembly đã được ra đời. Trong một ngôn ngữ assembly, mỗi câu lệnh được định nghĩa bởi những tên rất ngắn (ngắn hơn một chuỗi các bit), và các biến có thể được định nghĩa bởi tên thay vì các số. Điều này giúp cho chương trình dễ đọc hơn và dễ viết hơn. Tuy nhiên CPU không thể hiểu ngôn ngữ Assembly một cách trực tiếp. Thay vào đó, nó phải được dịch sang ngôn ngữ máy bởi một trình biên dịch Assmbler. Ngôn ngữ Assembly thực thi rất nhanh, và Assembly vẫn còn được sử dụng đến ngày nay khi hệ thống quyết định bởi tốc độ. Tuy nhiên, lý do mà ngôn ngữ máy chạy nhanh là bởi vì ngôn ngữ Assembly được viết cho một CPU riêng biệt. Chương trình Assembly viết cho một CPU sẽ không chạy trên những loại CPU khác. Hơn nữa, ngôn ngữ Assembly vẫn yêu cầu nhiều câu lệnh để thực thi một công việc đơn giản và rất khó đọc đối với con người.

Đây là một câu lệnh mẫu cho ngôn ngữ Assembly: mov al, 061h

Ngôn ngữ bậc cao

Để giải quyết những lo ngại này, thì ngôn ngữ lập trình bậc cao đã được phát triển. C,C++, Pascal, Java, Javascript, và Perl, là những ngôn ngữ bậc cao. Ngôn ngữ bậc cao cho phép lập trình viên viết những chương trình mà không cần quan tâm đến máy tính đang chạy chương trình là gì. Chương trình viết ở ngôn ngữ bậc cao phải chuyển đổi thành một dạng mà CPU có thể hiểu được trước khi chúng có thể thực thi. Có hai cách kinh điển để làm điều này: biên dịch và thông dịch.

Trình biên dịch là một chương trình có thể đọc code và tạo ra được một file thực thi chuẩn mà CPU có thể hiểu được một cách trực tiếp. Một khi code của bạn được chuyển sang một file thực thi, bạn không cần trình biên dịch để chạy chương trình. Mặc dù có cảm giác dường như ngôn ngữ bậc cao sẽ làm giảm hiệu suất đáng kể hơn so với ngôn ngữ Assembly, các trình biên dịch hiện đại làm rất tốt công việc chuyển đổi ngôn ngữ bậc cao sang một file thực thi rất nhanh chóng. Thỉnh thoảng, chúng còn làm tốt hơn những người lập trình viết bằng ngôn ngữ Assembly!

Đây là sơ đồ mô tả quá trình biên dịch:

Example of compiling

Một trình thông dịch là một chương trình mà thực thi code của bạn một cách trưc tiếp mà không cần biên dịch sang mã máy trước. Trình thông dịch có khuynh hướng linh động hơn, nhưng hiệu quả không cao khi chạy chương trình bởi vì cứ mỗi lần chạy chương trình thì một quá trình thông dịch được thực hiện.
Đây là sơ đồ mô tả quá trình thông dịch:

Example of interpreting

Bất kì ngôn ngữ nào cũng có thể được biên dịch hoặc thông dịch, tuy nhiên, các ngôn ngữ truyền thống như C, C++, và Pascal thông thường là biên dịch trong khi ngôn ngữ “scripting” như Perl và Javascript là thông dịch. Một vài ngôn ngữ giống Java sử dụng cả hai kiểu này.

Ngôn ngữ bậc cao có nhiều tính chất mong muốn.

Đầu tiên, ngôn ngữ bậc cao rất dễ đọc và viết.

Đây là một một câu lệnh mẫu trong C/C++: a=97;

Thứ 2, chúng cần ít câu lệnh để thực thi một công việc giống như ở ngôn ngữ cấp thấp hơn. Trong C++ bạn có thể thực hiện a = b * 2 + 5; Trong một dòng. Trong ngôn ngữ Assembly, điều này sẽ mất 5 hoặc 6 câu lệnh.

Thứ 3, bạn không cần quan tâm đến chi tiết như việc lưu các biến vào các thanh ghi CPU. Trình biên dịch hoặc trình thông dịch sẽ thực hiện tất cả các chi tiết cho bạn.

Và thứ 4, chúng tương thích với nhiều cấu trúc khác nhau, với một vài ngoại lệ chúng ta sẽ thảo luận một chút.

Example of portability


Ngoại lệ cho sự tương thích đó là những nền tảng, giống như Microsoft Windows, chứa các hàm nền tảng cụ thể mà bạn có thể dùng trong code của bạn. Điều này làm cho chúng dễ viết hơn trong một nền tảng cụ thể, nhưng nó rất khó tương thích. Trong những loạt bài hướng dẫn, chúng ta sẽ làm rõ điểm này khi nào bạn gặp một nền tảng cụ thể nào đó.

Nguồn: learncpp.com

Nhận xét

Bài đăng phổ biến