BangMaple's Blog. Nơi sẻ chia kiến thức!

Sự khác nhau giữa "include" và "import" keyword

Không có nhận xét nào
Xin chào các bạn.

Có thể các bạn không để ý hoặc là không biết. Nếu các bạn đã từng lập trình căn bản với ngôn ngữ lập trình C và ngôn ngữ lập trình Java, các bạn sẽ để ý thấy có 2 keyword chính là include và import.

Mục đích của bài viết này có ý nghĩa gì?
- Tóm gọn vấn đề chính của 2 keyword include import.
- Cải thiện kĩ năng lập trình.

Vậy trước khi đi vào định nghĩa thì hãy đi vào thực hành trước nhỉ, mình sẽ demo trên NetBeans IDE.
Đầu tiên là sử dụng keyword import đối với một chương trình Java đơn giản.
(Hình 1)

Sau đó chúng ta cần biên dịch từ tệp tin .java sang tệp tin .class!
(Hình 2)

Hãy để ý đến dung lượng của tệp tin trước và sau biên dịch!

Tiếp theo là sử dụng keyword include đối với một chương trình C đơn giản.
(Hình 3)

Hãy cùng biên dịch chương trình này!
(Hình 4)

Mặc định là sau khi build một chương trình trên NetBeans IDE thì chương trình đích (có thể thực thi) sẽ nằm trong thư mục dist nhưng mình cố ý để chung trong một thư mục project hiện tại để các bạn có thể dễ dàng so sánh!

Tại đây, mình đã cho chạy thử chương trình C cơ bản và hoạt động rất bình thường. Nhưng có một điều khá là lạ lẫm là tệp tin sau khi biên dịch của chương trình C có dung lượng lớn hơn chục lần so với tệp tin tiền biên dịch.

Mình viết đến đây thì các bạn cũng hình dung được một chút về 2 keyword đó rồi nhỉ..

Để rõ hơn, chúng ta hãy cùng dịch ngược mã nguồn của 2 tệp tin hậu biên dịch từ chương trình Java và C!
Các bạn có thể dễ dàng tìm cho mình một trình dịch ngược trực tuyến trên mạng, đối với ngôn ngữ lập trình Java thì mình sẽ dùng trang: javadecompilers.com 

Đây là kết quả sau khi dịch ngược tệp tin JavaConsoleApp.class mà mình đã biên dịch trước đó.
(Hình 5)
Kết quả được hiện hữu trực tiếp cho chúng ta thấy là tệp tin sau khi dịch ngược và tệp tin tiền biên dịch của chương trình Java tương đồng với nhau.

Hãy cùng tiếp tục dịch ngược đối với chương trình C khả nghi của chúng ta!
(Hình 6)
Ngôn ngữ lập trình C không có một trình dịch ngược nào hoàn chỉnh giống như tệp tin tiền biên dịch ở hình 3. Ở đây, mình sử dụng phần mềm Snowman Decompiler để các bạn có thể dễ hình dung nhất.

Đối với hàm printf nó sẽ phải lệ thuộc vào thư viện stdio.h, vậy chúng ta cần phải include nó vào là điều hiển nhiên. Ở đây chúng ta chỉ sử dụng một hàm printf để in ra số 0 nhưng nào ngờ nó lại chèn tất cả source code của tệp tin stdio.h vào trong chương trình của chúng ta.
(Hình 7: Source code tệp tin stdio.h)
Chúng ta thấy không chỉ hàm printf mà còn có rất nhiều hàm chúng ta không dùng đến.

Quay lại về ngôn ngữ Java, chúng ta có một slogan mà đã được học trong môn lập trình Java cơ bản, tạm dịch: Viết một lần, chạy bất kì nơi nào.
(Hình 8 -  Nguồn: Google Search)
Điều này chỉ đúng nếu như thiết bị của bạn đã cài đặt môi trường máy ảo Java và phần phụ trợ của nó, có thể nói là JRE (Java Runtime Environment).
Hầu hết các hệ điều hành hiện tại đều có thể cài đặt và sử dụng JRE một cách bình thường.

Vậy cái keyword import của ngôn ngữ lập trình Java muốn nói với chúng ta điều gì?
(Hình 9: Cấu trúc thư mục của Java JRE)
Java JRE đã giấu cụ thể thư viện java.util.Arrays đang hiện hữu ở đâu, nhưng chúng ta có thể dễ dàng nhận ra nó không thể nằm đâu ngoài thư mục lib (libraries) được. 

Cùng với hình 8, dễ dàng hiểu được là chúng ta không cần phải chèn thư viện của Java trong khi biên dịch thành tệp tin .class mà chỉ cần reference (đối chiếu/xem/tham khảo) đến thư viện có sẵn của máy ảo Java để từ đó chạy chương trình một cách bình thường và cũng được lợi thế là tệp tin sau biên dịch có dung lượng tối thiểu!

Ngược lại đối với ngôn ngữ lập trình C không có một máy ảo thực thụ và cũng không có tính chất Write once, run anywhere. Chúng ta đã biên dịch ra một chương trình C từ tệp tin tiền biên dịch nhưng chưa chắc tệp tin có đã có thể chạy trên hệ điều hành Windows được.

Buộc nó phải đính kèm luôn mã nguồn của thư viện trong khi biên dịch một chương trình C, từ đó làm chương trình C của chúng ta lớn lên là vậy.

Nói cho dễ hiểu, giống như việc bạn luôn thuê nhà ở gần một siêu thị tiện lợi và việc bạn sống xa siêu thị tiện lợi nên bạn phải mua tất cả những đồ dùng bạn cần về một lần để khỏi tốn sức và mất công lần sau đi mua nữa!

Tóm gọn

  • include sẽ nói với compiler vào bên trong thư viện chuẩn của nó để copy tệp tin thư viện (headers) và đính kèm vào chương trình từ đó làm tăng kích cỡ chương trình tương ứng với số thư viện bạn khai báo!
  • import sẽ nói với compiler khi nào gọi đến method có tên nó thì hãy vào thư viện có sẵn trong Java JRE và reference đến những thư viện có liên quan đến nó nhất, không cần phải đính kèm toàn bộ source code trong quá trình biên dịch.

Hi vọng bài viết này sẽ giúp các bạn phân biệt được 2 keyword được đề cập đến bài nhiều nhất!
Có thể trong quá trình phỏng vấn bạn sẽ gặp phải vấn đề phân biệt chúng, bạn sẽ tự tin trong việc lập trình hơn đấy!

Chúc các bạn học tốt!


Không có nhận xét nào :

Đăng nhận xét