So sánh thông dịch và biên dịch - khác và giống thế nào?

Nội dung bài viết

So sánh thông dịch và phiên dịch

100% lập trình viên đều đã nghe nói đến ngôn ngữ biên dịch và thông dịch, trong 100% đó có đến 60% hiểu nôm na là biên dịch nhanh hơn thông dịch, điều đó không bàn cãi.

Nhưng chỉ có 10% hiểu chính xác về sự giống nhau của thông dịch và biên dịch, nhưng chỉ có 2% là có thể giải thích một cách cặn kẽ về những điều dưới đây. Tôi thuộc 60%, chính vì thế tôi đã tìm hiểu và đưa ra bài viết này.

Bài viết này ngoài vấn đề giải thích và so sánh giữa biên dịch và thông dịch thì có nhiều vấn đề mà tôi mới nhận ra, hy vọng có những bạn có những suy nghĩa sai lầm như mình có sự điều chỉnh lại. Ngoài sự giống nhau giữa biên dịch và thông dịch, thì có sự khác nhau về biên dịch và thông dịch.

Hoàn cảnh bài viết

Hôm nọ, một anh tester qua chỗ mình và hỏi:

"Anh ơi? Em nghe về biên dịch và thông dịch về ngôn ngữ? Vậy Python thuộc loại nào anh?"

Câu hỏi này thực sự mình không biết, vì mình đâu có chuyên về python, nhưng sĩ diện, mình cảm thấy ai cũng nói python nhanh, nên mình nghĩ đại nói ngay là "Python là ngôn ngữ biên dịch em". Hồi hộp quá, chờ nó đi mình search Google ngay. Bạn biết câu trả lời đúng là sao không?

Python là thông dịch hay biên dịch?

Sau khi search Google xong thì kết luận rằng:

Hoá ra về Python là một ngôn ngữ thông dịch điển hình, vì vậy việc chạy các chương trình Python cần sự hỗ trợ của trình thông dịch. Chỉ cần bạn cài đặt các trình thông dịch khác nhau trên các nền tảng khác nhau, mã của bạn có thể chạy bất cứ lúc nào mà không cần lo lắng về bất kỳ vấn đề tương thích nào. Viết, chạy ở mọi nơi ".

Python hỗ trợ hầu hết các nền tảng phổ biến, chẳng hạn như Linux, Windows, Mac OS, Android , FreeBSD, Solaris, PocketPC, v.v. MãPython bạn viết có thể chạy chính xác trên các nền tảng này mà không cần sửa đổi. Nói cách khác, tính di động của Python rất mạnh.

Đến đây tôi tự hỏi, như vậy thì khoảng cách giữa ngôn ngữ biên dịch và thông dịch không còn xa, nếu như Python đã làm được điều này.

Ngoài ra theo tìm hiểu của tôi thì java hay c# trước giờ cữ chắc chắn là ngôn ngữ biên dịch, nhưng sự thật éo phải thế.

JavaC# là một dạng tồn tại kỳ lạ, chúng là ngôn ngữ bán biên dịch và bán thông dịch. Mã nguồn cần được chuyển đổi thành tệp trung gian (tệp bytecode), sau đó tệp trung gian được thực thi trong máy ảo. Java dẫn đầu xu hướng này. Mục đích ban đầu của nó là tính đến hiệu quả thực thi trong khi là đa nền tảng; C# là người đi sau, nhưng C# luôn dừng lại trên nền tảng Windows và ít ảnh hưởng đến các nền tảng khác.

Ngôn ngữ biên dịch

Ngôn ngữ biên dịch là gì? Đối với các ngôn ngữ biên dịch, sau khi phát triển xong, tất cả các mã nguồn cần được chuyển đổi thành các chương trình thực thi, chẳng hạn như các tệp .exe trong Windows. Miễn là chúng ta có một chương trình thực thi, chúng ta có thể chạy nó bất cứ lúc nào mà không cần biên dịch lại, tức là "biên dịch một lần, chạy không giới hạn số lần".

Bạn không cần hiểu kỹ, chỉ cần nhớ hai điều này khi nói về biên dịch đó là:

1) Các chương trình thực thi không được đa nền tảng

Bạn không thể sử dụng một chương trình thực thi bởi Ngôn ngữ biên dịch có thể hạy trên windowslinux được. Bạn phải chọn 1 trong 2.

Ngoài ra, các phiên bản khác nhau của cùng một hệ điều hành không nhất thiết phải tương thích. Ví dụ: không thể chạy chương trình x64 (chương trình Windows 64-bit) trên nền x86 (nền tảng Windows 32-bit). Nhưng điều ngược thì khả năng được.

2) Mã nguồn không được đa nền tảng

Cácfunction,kiểu,biến, v.v. được hỗ trợ bởi các nền tảng khác nhau có thể khác nhau và mã nguồn được viết trên một nền tảng nói chung không thể được biên dịch dưới nền tảng khác. Hãy lấy ngôn ngữ C làm ví dụ.

Ví dụ: Trong ngôn ngữ C, nếu bạn muốn tạm dừng chương trình, bạn có thể sử dụng hàm "sleep". Hàm này là Sleep () trên nền Windows và sleep () trên nền Linux. Chữ cái đầu tiên là khác nhau. Thứ hai, tham số của Sleep () là mili giây, tham số của sleep () là giây và đơn vị là khác nhau.

Thế đấy, bạn chỉ cần hiểu hai vấn đề đó cho ngôn ngữ biên dịch thôi.

Ngôn ngữ thông dịch

Đối với ngôn ngữ thông dịch, mỗi khi chương trình được thực thi, nó cần được chuyển đổi và thực thi, mã nguồn được chuyển đổi thành mã máy nếu nó được sử dụng, và không có quá trình xử lý nào được thực hiện trên mã nguồn không sử dụng. Các chức năng khác nhau có thể được sử dụng mỗi khi chương trình được thực thi và mã nguồn cần được chuyển đổi sẽ khác nhau tại thời điểm này.

Bởi vì mã nguồn cần được chuyển đổi lại mỗi khi chương trình được thực thi, hiệu quả thực thi của các ngôn ngữ thông dịch vốn đã thấp hơn so với các ngôn ngữ biên dịch, và thậm chí còn có khoảng cách về độ lớn. Ngôn ngữ thông dịch chỉ được sử dụng ở cấp ứng dụng (chẳng hạn như phát triển trang web, v.v.)

Ví dụ nhưjavascript nhé, V8 sẽ giúp biên dịch JavaScript trực tiếp sang mã máy trước khi thự thi nó, thay vì các kỹ thuật truyền thống khác như giải mã thông dịch bytecode hoặc biên dịch toàn bộ chương trình sang mã máy và thực thi nó từ một hệ thống tập tin. Mã đã biên dịch được tối ưu hóa bổ sung (và được tối ưu hóa lại) một cách linh động trong thời gian thực thi, dựa trên các chẩn đoán của hồ sơ thực thi của mã.

Tóm lại

Để tôi tóm tắt lại một lần nữa cho các bạn nếu như các bạn thấy bài viết của tôi quá dài, mà thời gian các bạn quý hơn vàng. Còn tôi thì không :D

Ngôn ngữ biên dịch

  • Ưu điểm: Sau khi biên dịch một lần, nó có thể chạy mà không cần trình biên dịch và hiệu quả chạy cao.
  • Nhược điểm: Tính di động kém và không đủ linh hoạt.

Ngôn ngữ thông dịch

  • Ưu điểm: Hiệu suất đa nền tảng tốt, thông qua các trình thông dịch khác nhau, diễn giải cùng một mã nguồn thành mã máy dưới các nền tảng khác nhau.
  • Nhược điểm: Thực thi trong khi chuyển đổi nhờ trình thông dịch, hiệu quả rất thấp.

Bài viết được sự hỗ trợ nhiều bài viết trên internet như:

freecodecamp

geeksforgeeks

Có thể bạn đã bị missing