Site icon Nhạc lý căn bản – nhacly.com

Trình biên dịch – Wikipedia tiếng Việt

Biểu đồ hoạt động giải trí của một trình biên dịch lý tưởng .

Trình biên dịch, còn gọi là phần mềm biên dịch, compiler, là một chương trình máy tính làm công việc dịch một chuỗi các câu lệnh được viết bằng một ngôn ngữ lập trình (gọi là ngôn ngữ nguồn hay mã nguồn), thành một chương trình tương đương nhưng ở dưới dạng một ngôn ngữ máy tính mới (gọi là ngôn ngữ đích) và thường là ngôn ngữ ở cấp thấp hơn, như ngôn ngữ máy. Chương trình mới được dịch này gọi mã đối tượng.

Hầu hết những trình biên dịch sẽ chuyển dịch mã nguồn viết trong một ngôn từ cấp cao thành mã đối tượng người dùng hay ngôn từ máy mà hoàn toàn có thể được thi hành trực tiếp bởi một máy tính hay bởi một máy ảo. Dù vậy, việc vận động và di chuyển từ một ngôn từ cấp thấp sang một ngôn từ cấp cao hơn cũng hoàn toàn có thể xảy ra ; quy trình này thường được hiểu như là bộ biên dịch ngược nếu nó hoàn toàn có thể tái tạo lại một chương trình trong ngôn từ cấp cao. Cũng sống sót những trình biên dịch chuyển đổi từ ngôn từ cao này sang ngôn từ cao khác, hay là quy đổi sang một ngôn từ mà nó cần để liên tục giải quyết và xử lý về sau ; những trình biên dịch như vậy được biết như là bộ biên dịch phân tầng .

Các loại trình biên dịch cho kết quả là mã đối tượng thì một cách cơ bản bao gồm mã máy tăng cường thêm các thông tin về tên vị trí của các ngõ vào và các gọi ngoài (đến các hàm mà không có sẵn bên trong của nó). Một tập hợp của các tập tin đối tượng, mà không hẳn được cung cấp từ cùng một trình biên dịch, thì vẫn có thể được liên kết với nhau để tạo nên các chương trình khả thi cuối cùng cho một người dùng. Dĩ nhiên, để làm được như vậy thì các tập tin đối tượng đó phải được thiết kế chung nhau về dạng thức. Ví dụ của kiểu tập đối tượng này là các tập có đuôi là.obj có thể dùng chung giữa ASM, C/C++, Fortran… hay các tập tin.DLL trong các kiến trúc Windows dùng chung được cho nhiều ngôn ngữ.

Nhiều trình biên dịch thử nghiệm đã được tăng trưởng từ thập niên 1950. Tuy vậy chỉ có nhóm thao tác với FORTRAN đứng vị trí số 1 bởi John Backus ở IBM thành công xuất sắc trong việc ra mắt trình biên dịch hoàn bị tiên phong trong năm 1957. COBOL là một ngôn từ sớm có được trình biên dịch trên nhiều loại kiến trúc trong năm 1960 ( Xem thêm [ 1 ] Lưu trữ 2012 – 02-20 tại Wayback Machine )Ý kiến về sự biên dịch được nhiều người quan tâm và hầu hết những nguyên tắc của phong cách thiết kế trình biên dịch đã được tăng trưởng từ suốt thập niên 1960 .

Một trình biên dịch tự nó là một chương trình máy tính được viết từ vài ngôn ngữ thực thi. Ban đầu các trình biên dịch đều viết trong ngôn ngữ ASM (tức là Assembler).

Trình biên dịch tự lập là trình biên dịch có khả năng được biên dịch và được tạo ra từ mã nguồn trong ngôn ngữ cấp cao bởi chính nó. Trình biên dịch tự lập đầu tiên đã được dùng cho Lisp bởi Hart và Levin ở MIT trong năm 1962, (xem [2]).

Việc sử dụng ngôn ngữ cấp cao để tạo ra các trình biên dịch bắt đầu ra đời vào đầu thập niên 1970 khi mà trình biên dịch Pascal và C đã được tạo nên từ chính ngôn ngữ của chúng. Xây dựng một trình biên dịch tự lập là một vấn đề về bẫy khởi động. Nghĩa là, phiên bản đầu tiên của trình biên dịch tự lập này cho một ngôn ngữ phải được biên dịch từ một trình biên dịch mà được viết trong một ngôn ngữ khác hay là, bắt chước theo cách của Hart va Levin trong trình biên dịch Lisp, biên dịch bằng cách thi hành trình biên dịch này trong một phần mềm thông dịch.

Trong suốt thập niên 1980 và thập niên 1990 hàng loạt những trình biên dịch không tính tiền và những công cụ tăng trưởng trình biên dịch đã được tạo ra cho mọi loại ngôn từ. Cả hai như thể một phần của đề án GNU và của những khởi xướng về nguồn mở khác. Một số trong chúng được xem là có chất lượng cao và nguồn mở tạo nên hứng khởi cho bất kể ai chăm sóc trong những nguyên tắc về trình biên dịch tân tiến .

Các kiểu trình biên dịch.

Trình biên dịch cùng bản và trình biên dịch chéo bản.

Tất cả những trình biên dịch đều hoặc là biên dịch cùng bản hoặc là biên dịch chéo bản .

Một trình biên dịch có thể sản xuất ra mã chủ định để chạy trên cùng một kiểu máy tính và một kiểu hệ điều hành như là chạy trên máy mà trình biên dịch tự nó tiến hành được gọi là một trình biên dịch cùng bản.

Một loại khác, trình biên dịch có thể sản xuất ra mã mà được thiết kế để chạy trên các kiểu máy tính khác hay hệ điều hành khác. Trường hợp này gọi là trình biên dịch chéo bản. Các trình biên dịch chéo bản thì rất có ích khi gặp một hệ thống phần cứng mới trong lần đầu tiên. Trình biên dịch chéo bản cũng rất cần khi việc phát triển phần mềm cho các hệ thống vi điều khiển, mà chúng chỉ có vừa đủ kho lưu trữ cho mã máy cuối, không đủ để tải trình biên dịch. (như trường hợp dịch chương trình để chạy trên các palmtop và các điện thoại di động chẳng hạn).

Số bước vận động và di chuyển.

Tất cả các trình biên dịch thì có thể là một bước hay nhiều bước

  • Trình biên dịch một bước: Với loại này, sự chuyển dịch hoàn tất trong một bước và do đó rất nhanh.
Ví dụ của các trình biên dịch trước đây cho Pascal hay Borland C là trình biên dịch một bước.
  • Các trình biên dịch cần nhiều hơn một bước để hoàn tất gọi là trình biên dịch nhiều bước. Các kiểu trình biên dịch nhiều bước bao gồm:
  • Trình biên dịch nguồn sang nguồn là loại trình biên dịch nhận vào mã nguồn là một ngôn ngữ cấp cao và chuyển dịch thành một ngôn ngữ cấp cao khác.
Ví dụ: Một trình biên dịch tự động song song hoá sẽ thường xuyên lấy chương trình trong ngôn ngữ cấp cao ở ngõ vào và chuyển dạng mã nguồn và chú giải nó với các chú giải mã song song (như OpenMP hay cấu trúc ngôn ngữ (như các câu lệnh DOALL của Fortran)).
  • Trình biên dịch phân đoạn biên dịch sang ngôn ngữ ASM của một máy lý thuyết như là vài tiến hành của Prolog. Loại máy Prolog này còn được gọi là máy trừu tượng Warren (hay WAM).
Ví dụ: Các trình biên dịch bytecode cho Java, Python và nhiều trình biên dịch khác nữa là một kiểu con của kiểu này.
  • Trình biên dịch động hay còn gọi là trình biên dịch JIT sẽ chuyển dịch các ứng dụng sang bytecode, sau đó, bytecode sẽ được dịch sang mã của ngôn ngữ máy tương thích trước khi thi hành.
Ví dụ: Trình biên dịch JIT được dùng bởi Smalltalk, Java, cũng như dùng bởi Ngôn ngữ trung gian thông dụng của Microsoft.NET.

Các đặc tính khác.

Đặc biệt, một trình biên dịch hoàn toàn có thể có thêm những tính năng sau đây :

  • Trình biên dịch mã liên kết là loại trình biên dịch cho phép thay thế các dòng ký tự trong (mã) nguồn bằng các khối mã nhị phân sẵn có. Các khối mã nhị phân này có thể có nhiều cấp độ khác nhau.
Ví dụ: các trình biên dịch trong hầu hết các kiến trúc của FORTH. Trong thực tế, một vài trình biên dịch FORTH có thể dịch các chương trình mà không cần đến hệ điều hành.
  • Trình biên dịch tăng tiến. Trong trình biên dịch tăng tiến, các hàm riêng lẻ có thể được dịch trong thời gian thi hành (runtime) mà các hàm này cũng bao gồm các chức năng thông dịch.
Ví dụ: Kiến trúc dịch tăng tiến xuất hiện từ 1962 và vẫn còn được sử dụng trong các hệ thống Lisp.
  • Trình biên dịch đa năng là trình biên dịch có thể được điều chỉnh để tạo ra mã cho các kiến trúc CPU khác nhau một cách tương đối dễ dàng. Mã đối tượng làm ra bởi các trình biên dịch này thường có chất lượng kém hơn là các mã được tạo ra từ các trình biên dịch chỉ chuyên dùng cho đúng loại CPU. Trình biên dịch đa năng thường cũng là trình biên dịch chéo bản.
Ví dụ: GCC là một loại trình biên dịch đa năng miễn phí rất phổ biến.
  • Trình biên dịch song song hóa là loại trình biên dịch có khả năng chuyển đổi một chương trình vào được viết theo kiểu liên tục sang một dạng thuận tiện trên kiến trúc của máy tính song song.

So sánh với ứng dụng thông dịch.

Nhiều người còn phân chia các ngôn ngữ lập trình cấp cao thành các ngôn ngữ biên dịch và các ngôn ngữ thông dịch. Mặc dù vậy, rất hiếm khi một ngôn ngữ lại đòi hỏi là loại biên dịch hay loại thông dịch. Các trình biên dịch và các phần mềm thông dịch là các sự thực hiện của các ngôn ngữ chứ không phải bản thân ngôn ngữ.

Việc phân loại này chỉ phản ánh tình hình phổ cập của sự triển khai của những ngôn từ ví dụ điển hình như BASIC được nhiều người cho là một ngôn từ thông dịch và C thì lại được xem là ngôn từ biên dịch nhưng trong thực tiễn ra vẩn sống sót những trình biên dịch cho BASIC và những ứng dụng thông dịch cho C .

Thiết kế trình biên dịch.

Trong quá khứ, các trình biên dịch thường chia quá trình biên dịch thành nhiều bước để tiết kiệm kho chứa. Mỗi bước trong nghĩa vừa nêu của một trình biên dịch, thông qua mã nguồn của chương trình, là một sự thực thi dẫn tới kết quả trong việc dựng nên một bộ dữ liệu nội tại (chẳng hạn như là sự tham gia của các bảng ký hiệu và các dữ liệu hướng dẫn cho việc chuyển dịch). Khi một bước hoàn tất, thì trình biên dịch có thể xóa các dữ liệu nội tại không cần nữa trong suốt bước đó nhằm tiết kiệm chỗ trống. Như vậy phương pháp nhiều bước là kỹ thuật thông dụng ở thời đó, và nó cũng nhằm giải quyết các khó khăn về khối lượng các bộ nhớ của máy chủ còn nhỏ so với khối lượng mã nguồn và dữ liệu.

Nhiều trình biên dịch hiện đại chia sẻ chung một dạng thiết kế hai mặt. Mặt ngoài chuyển dịch ngôn ngữ nguồn sang một sự biểu trưng trung gian. Mặt thứ nhì là mặt trong, mà trong đó, chủ yếu là sự làm việc với các biểu trưng nội tại (như là các bảng ký hiệu và các dữ liệu cần thiết khác) để làm ra kết quả là mã trong ngôn ngữ đích. Mặt ngoài và mặt trong lại có thể tiến hành trong nhiều bước và có cả trường hợp mặt ngoài gọi mặt trong như là một chương trình con, và chuyển vào đó những biểu trưng trung gian.

Phương thức trên giảm nhẹ sự phức tạp. Mặt ngoài thường lo về những giải quyết và xử lý xung quanh về ý nghĩa ngôn từ. Trong khi mặt trong sẽ chú trọng đến việc làm ra những tác dụng phải đạt hiệu suất cao và dúng. Điểm mạnh của phương pháp này còn gồm có việc được cho phép dùng chung một mặt trong từ nhiều ngôn từ ( nguồn ) khác nhau và ngược lại là việc được cho phép sử dụng những mặt trong khác nhau để ship hàng cho những mụch tiêu khác nhau .Thường thì những bộ phận tối ưu hóa và những bộ phận kiểm lỗi hoàn toàn có thể san sẻ chung những mặt ngoài và mặt trong nếu chúng được phong cách thiết kế để hoạt động giải trí trên ngôn từ trung gian mà nó được chuyển từ mặt ngoài sang mặt trong. Điều này hoàn toàn có thể dẫn đến việc nhiều trình biên dịch ( tích hợp của những mặt ngoài và mặt trong ) tái sử dụng được một lượng lớn việc làm mà thường được thực thi trong những bộ phận tối ưu hóa và bộ phận kiểm tra lỗi .Có nhiều ngôn từ, dựa vào phong cách thiết kế của ngôn từ và những quy tắc dùng cho việc khai báo những biến và những đối tượng người tiêu dùng khác cũng như là dùng cho sự khai báo trước khi sử dụng hay trước khi tham chiếu của những hàm hay thủ tục, có năng lực được dùng trong một bước .

Ví dụ: Pascal là ngôn ngữ được biết nhiều đến do khả năng này. Ngôn ngữ C cũng có thể dùng trong cách dịch một bước và đạt được ngay các tệp khả thi.

Mặt ngoài của trình biên dịch.

Mặt ngoài của trình biên dịch tự nó bao gồm nhiều pha. Các pha theo lý thuyết ngôn ngữ là:

Mặt trong của trình biên dịch.

Một trình biên dịch hoàn bị sẽ chuyển giao biểu trưng trung gian được làm ra bởi mặt ngoài cho mặt trong. Nhiệm vụ của mặt trong là sản xuất ra chương trình tương tự về công dụng ở ngôn từ đích. Việc này gồm có những quy trình tiến độ :

Liên kết ngoài.

Exit mobile version