[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:

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:

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.

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
Đăng nhận xét