Kể từ buổi bình minh của mình vào những năm 1950, công nghệ thông tin ngày nay đã phát triển vô cùng mạnh mẽ và trở thành 1 phần không thể thiếu trong cuộc sống hàng ngày của chúng ta. Những thứ như tìm đường đi nhờ GPS (hệ thống định vị toàn cầu), đắt vé xem bóng đá trên mạng cho đến việc nói chuyện với gia đình, bạn bè ở tận nửa kia của địa cầu, vv… Tất cả những điều trước đây không thể đều đã trở thành có thể nhờ thứ mà chúng ta gọi là máy tính.
! Ở đây; thuật ngữ máy tính được dùng theo nghĩa rộng, nghĩa là sẽ bao gồm cả những máy tính cá nhân, Mac, các máy chủ tính toán cũng như các điện thoại thông minh hay máy tính bảng.
Thế nhưng, một chiếc máy tính dù có thông minh đến mấy cũng chỉ có thể thực hiện 1 cách tự động một tiến trình các thao tác đơn giản mà chúng ta yêu câu. Chúng không có khả năng tự học tập hay phán đoán. Nói chung là thật ra thì chúng cũng không “thông minh” lắm. Ưu điểm của chúng chỉ là khả năng thao tác nhanh và chính xác với 1 lượng lớn thông tin mà thôi.
Về cơ bản, sự hiện diện của con người vẫn là cần thiết nếu muốn máy tính thực hiện được 1 việc mà chúng ta cho là hữu dụng. Và đây là vai trò của các lập trình viên, người đưa ra các câu lệnh yêu cầu máy tính thực hiện theo trình tự hay chúng ta hay gọi việc này là viết các chương trình máy tính.
Một chương trình máy tính, hay cũng được gọi dưới những tên khác như ứng dụng hay phần mềm, thực chất chỉ là 1 chuỗi câu lệnh mà máy tính phải thực hiện. Chúng được trình bày trong nội dung của 1 hay nhiều tệp tin. Tổng hợp nội dung của những tệp đấy là thứ mà chúng ta gọi là mã nguồn.
Tuy vậy, chúng ta không thể cứ viết bất cứ thứ gì chúng ta muốn và mong máy tính sẽ thực hiện nó. Tưởng tượng chúng ta đang nói chuyện với 1 người bạn Anh và chúng ta chỉ nói toàn tiếng Việt ??? Ẩn dụ này cũng hoàn toàn đúng khi viết các chương trình máy tính. Để máy tính có thể hiểu được chúng ta, chương trình được viết ra phải hoàn toàn tuân theo các quy ước được đặt ra bởi ngôn ngữ lập trình được chọn.
1 ngôn ngữ lập trình định nghĩa cách thức mà chúng ta phải trao đổi nếu muốn máy tính hiểu. Giống như tất cả các loại ngôn ngữ khác, chúng cũng có từ vựng (mà chúng ta gọi là từ khóa) và ngữ pháp (cách thức sắp xếp các từ, cú pháp) nhất định.
Ngôn ngữ lập trình duy nhất mà máy tính có thể hiểu được là ngôn ngữ máy, còn được gọi là Assembly. Đây là tập hợp những câu lệnh vô cùng đơn giản, kiểu chuyên dùng để giao tiếp với bộ vi xử lý của máy tính và được phép thao tác trực tiếp trên bộ nhớ máy.
Dưới đây là 1 ví dụ đoạn mã nguồn của ngôn ngữ Assembly cho phép hiển thị “Xin chào” đến người dùng.
str: .ascii "Xin chao\n" .global _start _start: movl $4, %eax movl $1, %ebx movl $str, %ecx movl $8, %edx int $0x80 movl $1, %eax movl $0, %ebx int $0x80
Khó hiểu lắm đúng không ? Đừng lo, tôi xin đảm bảo là ngày nay, công việc viết mã đã trở nên đơn giản hơn nhiều lắm khi đem ra so sánh với buổi sơ khai chỉ sử dụng Assembly.
Có hàng tá ngôn ngữ lập trình khác nhau đang tồn tại ngoài kia, mỗi ngôn ngữ lại thích hợp sử dụng vào những mục đích cụ thể. Mỗi ngôn ngữ đều sở hữu cú pháp riêng cũng như là các câu lệnh đặc biệt. Giống như khi chúng ta học ngoại ngữ : trước khi có thể đọc thông viết thạo, chúng ta sẽ phải bắt đầu từ việc hiểu các đặc điểm riêng của nó.
Lấy ví dụ đoạn mã với mục đích tương tự như trên nhưng được viết bằng Python.
print("Xin chao")
Cũng chương trình đó nhưng viết bằng PHP.
<?php echo("Xin chao\n"); ?>
Hay C#
class Program { static void Main(string[] args) { Console.WriteLine("Xin chao"); } }
Hoặc Java
public class Program { public static void main(String[] args) { System.out.println("Xin chao"); } }
Đều dùng để hiển thị cùng 1 thông điệp nhưng mỗi ngôn ngữ lại có cách làm riêng của mình !
Thực thi là hành động yêu cầu máy tính thực hiện các câu lệnh được ghi lại trong nội dung chương trình. Dù là được viết bởi ngôn ngữ nào thì chương trình đều cần trước tiên được dịch ra Assembly để có thể thực thi. Quá trính dịch này sẽ khác nhau tùy thuộc vào ngôn ngữ mà chúng ta sử dụng.
Với 1 vài ngôn ngữ, các dòng mã nguồn được dịch trực tiếp ra ngôn ngữ máy và được thực thi từng dòng nhờ 1 chương trình đặc biệt là trình thông dịch. Chúng ta gọi chúng là ngôn ngữ thông dịch. Python và PHP là các ngôn ngữ ví dụ thuộc loại này.
1 phương án khác là từ đoạn mã nguồn trực tiếp tạo ra các tệp thực thi (như trong Windows thì đó là các tệp có phần mở rộng là .exe) bằng cách sử dụng 1 chương trình trung gian gọi là trình biên dịch. Các ngôn ngữ này vì thế được gọi là ngôn ngữ biên dịch. Các ngôn ngữ như C, C++ là các ngôn ngữ biên dịch.
Cuối cùng, phương án thứ 3 là sử dụng 1 chương trình bán biên dịch để từ mã nguồn tạo ra các tệp có thể thực thi trên bất cứ nền tảng nào hỗ trợ môi trường thực thi nó. Đây là trường hợp của những ngôn ngữ như Java hay .NET (VB.NET, C#, vv…).
Trừ những trường hợp vô cùng đơn giản còn không thì ít khi lập trình viên bắt tay ngay vào viết mã cho chương trình mà họ muốn thực hiện. Công việc phân tích kỹ vấn đề luôn rất cần thiết để có thể tìm ra phương án giải quyết hiệu quả nhất. Tôi không ngại khi nhấn mạnh rằng nó thậm chí quan trọng hơn rất nhiều bản thân việc viết mã cho chương trình.
Chúng ta sẽ lấy ví dụ cụ thể trong đời sống cho dễ hình dung : hãy cùng nấu mì nhé !
Bắt đầu Lấy nồi Đổ nước vào nồi Bật bếp Khi nào mà nước còn chưa sôi Đợi Lấy mỳ ra gói Thả mỳ vào nước sôi Khi nào mà mỳ còn chưa chín Đợi Vớt mỳ ra Nêm gia vị Nếu thích ăn thit bò hơn thịt gà Thêm thịt bò vào bát Nếu không Thêm thịt gà vào bát Kết thúc
3 kiểu hành động có thể dễ dàng tìm thấy ở đây :
Chúng ta nhận thấy rằng để đạt được mục tiêu, cần phải thực hiện 1 chuỗi hành động theo 1 thứ tự chính xác.
Trên đây chính là 1 ví dụ đơn giản về 1 khái niêm tổng quát, hoàn toàn độc lập với tất cả các ngôn ngữ lập trình, được chúng ta gọi là giải thuật. Chúng ta có thể định nghĩa giải thuật là 1 chuỗi các thao tác cần thiết để có thể giải quyết 1 vấn đề được đưa ra. Giải thuật chia nhỏ vấn đề ban đầu vốn phức tạp thành các thao tác đơn giản, dễ thực hiện hơn.
Nhiệm vụ hàng đầu của lập trình viên là viết ra được chương trình thực hiện hiệu quả 1 công việc được giao. Các tân binh thường dễ dàng có thể hoàn thành các chương trình đơn giản trong thời gian khá ngắn. Khó khăn chỉ đến khi chương trình phát triển thêm tính năng và ngày càng trở nên phức tạp hơn. Cần phải có rất nhiều kinh nghiệm cũng như phải thực hành liên tục nếu muốn làm chủ sự phức tạp này. Cũng chính đặc điểm này khiến lập trình tin học trở thành 1 môn nghệ thuật tinh tế và đầy thử thách. 1 khi các bạn đã nắm vững được những khái niệm cơ bản, điều duy nhất ngăn cản các bạn tiến xa hơn chỉ là trí tưởng tượng của các bạn.