markdown:
# Trình biên dịch
**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](/wiki/Ph%E1%BA%A7n_m%E1%BB%81m) 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](/wiki/Ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh) (gọi là *ngôn ngữ nguồn* hay [mã nguồn](/wiki/M%C3%A3_ngu%E1%BB%93n)), 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](/wiki/Ng%C3%B4n_ng%E1%BB%AF_m%C3%A1y) 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](/w/index.php?title=M%C3%A3_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit&redlink=1).
## Mục lục
[1 Dẫn nhập](#D.E1.BA.ABn_nh.E1.BA.ADp) [2 Lịch sử](#L.E1.BB.8Bch_s.E1.BB.AD) [3 Các kiểu trình biên dịch](#C.C3.A1c_ki.E1.BB.83u_tr.C3.ACnh_bi.C3.AAn_d.E1.BB.8Bch) [4 So sánh với phần mềm thông dịch](#So_s.C3.A1nh_v.E1.BB.9Bi_ph.E1.BA.A7n_m.E1.BB.81m_th.C3.B4ng_d.E1.BB.8Bch) [5 Thiết kế trình biên dịch](#Thi.E1.BA.BFt_k.E1.BA.BF_tr.C3.ACnh_bi.C3.AAn_d.E1.BB.8Bch) [6 Mặt ngoài của trình biên dịch](#M.E1.BA.B7t_ngo.C3.A0i_c.E1.BB.A7a_tr.C3.ACnh_bi.C3.AAn_d.E1.BB.8Bch) [7 Mặt trong của trình biên dịch](#M.E1.BA.B7t_trong_c.E1.BB.A7a_tr.C3.ACnh_bi.C3.AAn_d.E1.BB.8Bch) [8 Tham khảo](#Tham_kh.E1.BA.A3o) [9 Xem thêm](#Xem_th.C3.AAm) [10 Liên kết ngoài](#Li.C3.AAn_k.E1.BA.BFt_ngo.C3.A0i)
## Dẫn nhập[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=1) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=1)]
Hầu hết các trình biên dịch sẽ chuyển dịch mã nguồn viết trong một
[ngôn ngữ cấp cao](/w/index.php?title=Ng%C3%B4n_ng%E1%BB%AF_c%E1%BA%A5p_cao&action=edit&redlink=1) thành [mã đối tượng](/w/index.php?title=M%C3%A3_%C4%91%E1%BB%91i_t%C6%B0%E1%BB%A3ng&action=edit&redlink=1) hay [ngôn ngữ máy](/wiki/Ng%C3%B4n_ng%E1%BB%AF_m%C3%A1y) mà có thể được thi hành trực tiếp bởi một [máy tính](/wiki/M%C3%A1y_t%C3%ADnh) hay bởi một [máy ảo](/wiki/M%C3%A1y_%E1%BA%A3o). Dù vậy, việc chuyển dịch từ một ngôn ngữ cấp thấp sang một ngôn ngữ cấp cao hơn cũng có thể xảy ra; quá trình này thường được hiểu như là [bộ biên dịch ngược](/w/index.php?title=B%E1%BB%99_bi%C3%AAn_d%E1%BB%8Bch_ng%C6%B0%E1%BB%A3c&action=edit&redlink=1) nếu nó có thể tái tạo lại một chương trình trong ngôn ngữ cấp cao. Cũng tồn tại các trình biên dịch chuyển đổi từ ngôn ngữ cao này sang ngôn ngữ cao khác, hay là chuyển đổi sang một ngôn ngữ mà nó cần để tiếp tục 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](/w/index.php?title=B%E1%BB%99_bi%C3%AAn_d%E1%BB%8Bch_ph%C3%A2n_t%E1%BA%A7ng&action=edit&redlink=1).
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](/wiki/Ng%C3%B4n_ng%E1%BB%AF_m%C3%A1y) 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. Thí 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ữ.
## Lịch sử[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=2) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=2)]
Nhiều trình biên dịch thử nghiệm đã được phát triển từ
[thập niên 1950](/wiki/Th%E1%BA%ADp_ni%C3%AAn_1950). Tuy vậy chỉ có nhóm làm việc với [FORTRAN](/wiki/Fortran) dẫn đầu bởi [John Backus](/w/index.php?title=John_Backus&action=edit&redlink=1) ở [IBM](/wiki/IBM) thành công trong việc giới thiệu trình biên dịch hoàn bị đầu tiên trong năm [1957](/wiki/1957). [COBOL](/wiki/COBOL) là một ngôn ngữ sớm có được trình biên dịch trên nhiều loại kiến trúc trong năm [1960](/wiki/1960) (Xem thêm [[1]](http://www.interesting-people.org/archives/interesting-people/199706/msg00011.html))
Ý kiến về sự biên dịch được nhiều người chú ý và hầu hết các nguyên lý của thiết kế trình biên dịch đã được phát triển từ suốt
[thập niên 1960](/wiki/Th%E1%BA%ADp_ni%C3%AAn_1960).
Một trình biên dịch tự nó là một
[chương trình máy tính](/wiki/Ph%E1%BA%A7n_m%E1%BB%81m) đượ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](/w/index.php?title=ASM&action=edit&redlink=1) (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](/wiki/Lisp) bởi Hart và Levin ở [MIT](/wiki/H%E1%BB%8Dc_vi%E1%BB%87n_C%C3%B4ng_ngh%E1%BB%87_Massachusetts) trong năm [1962](/wiki/1962), (xem [[2]](http://www.ai.mit.edu/research/publications/browse/0000browse.shtml)).
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](/wiki/Th%E1%BA%ADp_ni%C3%AAn_1970) khi mà trình biên dịch [Pascal](/wiki/Pascal_(%C4%91%E1%BB%8Bnh_h%C6%B0%E1%BB%9Bng)) và [C](/wiki/C_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)) đã đượ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](/w/index.php?title=Ph%E1%BA%A7n_m%E1%BB%81m_th%C3%B4ng_d%E1%BB%8Bch&action=edit&redlink=1).
Trong suốt
[thập niên 1980](/wiki/Th%E1%BA%ADp_ni%C3%AAn_1980) và [thập niên 1990](/wiki/Th%E1%BA%ADp_ni%C3%AAn_1990) hàng loạt các trình biên dịch miễn phí và các [công cụ phát triển trình biên dịch](/w/index.php?title=C%C3%B4ng_c%E1%BB%A5_ph%C3%A1t_tri%E1%BB%83n_tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit&redlink=1) đã được tạo ra cho mọi loại ngôn ngữ. Cả hai như là một phần của đề án [GNU](/wiki/D%E1%BB%B1_%C3%A1n_GNU) và của những khởi xướng về [nguồn mở](/wiki/Ph%E1%BA%A7n_m%E1%BB%81m_ngu%E1%BB%93n_m%E1%BB%9F) 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 quan tâm trong các nguyên lý về trình biên dịch hiện đại.
## Các kiểu trình biên dịch[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=3) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=3)]
### Trình biên dịch cùng bản và trình biên dịch chéo bản[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=4) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=4)]
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 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](/wiki/Vi_%C4%91i%E1%BB%81u_khi%E1%BB%83n), 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](/w/index.php?title=Palmtop&action=edit&redlink=1) và các [điện thoại di động](/wiki/%C4%90i%E1%BB%87n_tho%E1%BA%A1i_di_%C4%91%E1%BB%99ng) chẳng hạn).
### Số bước chuyển dịch[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=5) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=5)]
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.
-
- Thí 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.
-
- Thí 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](/w/index.php?title=OpenMP&action=edit&redlink=1)hay cấu trúc ngôn ngữ (như các câu lệnh
DOALLcủa Fortran)).
- Thí 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ư
**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](/wiki/Prolog). Loại máy Prolog này còn được gọi là [máy trừu tượng Warren](/w/index.php?title=M%C3%A1y_tr%E1%BB%ABu_t%C6%B0%E1%BB%A3ng_Warren&action=edit&redlink=1)(hay WAM). **Trình biên dịch động**hay còn gọi là [trình biên dịch JIT](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch_JIT&action=edit&redlink=1)sẽ chuyển dịch các ứng dụng sang [bytecode](/w/index.php?title=Bytecode&action=edit&redlink=1), 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.
-
- Thí dụ: Trình biên dịch JIT được dùng bởi
[Smalltalk](/wiki/Smalltalk), Java, cũng như dùng bởi [Ngôn ngữ trung gian thông dụng](/w/index.php?title=CIL&action=edit&redlink=1)của Microsoft.NET.
- Thí dụ: Trình biên dịch JIT được dùng bởi
-
### Các đặc tính khác[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=6) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=6)]
Đặc biệt, một trình biên dịch có thể có thêm các chức năng sau đây:
**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ã** [Trình biên dịch mã liên kết](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch_m%C3%A3_li%C3%AAn_k%E1%BA%BFt&action=edit&redlink=1) [nhị phân](/wiki/H%E1%BB%87_nh%E1%BB%8B_ph%C3%A2n)sẵn có. Các khối mã nhị phân này có thể có nhiều cấp độ khác nhau.
-
- Thí dụ: các trình biên dịch trong hầu hết các kiến trúc của
[FORTH](/w/index.php?title=FORTH&action=edit&redlink=1). 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.
- Thí dụ: các trình biên dịch trong hầu hết các kiến trúc của
**. 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 (** [Trình biên dịch tăng tiến](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch_t%C4%83ng_ti%E1%BA%BFn&action=edit&redlink=1) *runtime*) mà các hàm này cũng bao gồm các chức năng thông dịch.
-
- Thí dụ: Kiến trúc dịch tăng tiến xuất hiện từ
[1962](/wiki/1962)và vẫn còn được sử dụng trong các hệ thống Lisp.
- Thí dụ: Kiến trúc dịch tăng tiến xuất hiện từ
**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** [Trình biên dịch đa năng](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch_%C4%91a_n%C4%83ng&action=edit&redlink=1) [CPU](/wiki/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](#CROSS).
-
- Thí dụ:
[GCC](/wiki/B%E1%BB%99_tr%C3%ACnh_d%E1%BB%8Bch_GNU)là một loại trình biên dịch đa năng miễn phí rất phổ biến.
- Thí dụ:
**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](/w/index.php?title=M%C3%A1y_t%C3%ADnh_song_song&action=edit&redlink=1).
## So sánh với phần mềm thông dịch[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=7) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=7)]
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](/w/index.php?title=Ng%C3%B4n_ng%E1%BB%AF_bi%C3%AAn_d%E1%BB%8Bch&action=edit&redlink=1) và các [ngôn ngữ thông dịch](/w/index.php?title=Ng%C3%B4n_ng%E1%BB%AF_th%C3%B4ng_d%E1%BB%8Bch&action=edit&redlink=1). 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](/w/index.php?title=Ph%E1%BA%A7n_m%E1%BB%81m_th%C3%B4ng_d%E1%BB%8Bch&action=edit&redlink=1) 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 chia này chỉ phản ánh thực trạng phổ biến của sự thực hiện của các ngôn ngữ chẳng hạn như BASIC được nhiều người cho là một ngôn ngữ thông dịch và C thì lại được xem là ngôn ngữ biên dịch nhưng thực tế ra vẩn tồn tại các trình biên dịch cho BASIC và các phần mềm thông dịch cho C.
## Thiết kế trình biên dịch[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=8) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=8)]
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](#FRONT) 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](#BACK), 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](#DEF). 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](/wiki/Ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh#SUB), 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ề các xử lý xung quanh về ý nghĩa ngôn ngữ. Trong khi mặt trong sẽ chú trọng đến việc làm ra các
[kết quả](#DEF) phải đạt hiệu quả và dúng. Điểm mạnh của phương thức này còn bao gồm việc cho phép dùng chung một mặt trong từ nhiều ngôn ngữ (nguồn) khác nhau và ngược lại là việc cho phép sử dụng các mặt trong khác nhau để phục vụ cho những mụch tiêu khác nhau.
Thường thì các bộ phận tối ưu hóa và các bộ phận kiểm lỗi có thể chia sẻ chung các mặt ngoài và mặt trong nếu chúng được thiết kế để hoạt động trên ngôn ngữ trung gian mà nó được chuyển từ mặt ngoài sang mặt trong. Điều này có thể dẫn đến việc nhiều trình biên dịch (kết hợp của các mặt ngoài và mặt trong) tái sử dụng được một lượng lớn công việc mà thường được tiến hành trong các bộ phận tối ưu hóa và bộ phận kiểm tra lỗi.
Có nhiều ngôn ngữ, dựa vào thiết kế của ngôn ngữ và các qui tắc dùng cho việc khai báo các biến và các đối tượ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 các hàm hay thủ tục, có khả năng được dùng trong một bước.
-
- Thí 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[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=9) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=9)]
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à:
[Phân tích từ vựng](/wiki/Ph%C3%A2n_t%C3%ADch_t%E1%BB%AB_v%E1%BB%B1ng)- Chia nhỏ các dòng mã nguồn thành những phần tử nhỏ gọi là thẻ khóa. Mỗi thẻ khóa đại diện cho cho một đơn vị không thể chia nhỏ của ngôn ngữ. Thí dụ: một [từ khóa](/w/index.php?title=T%E1%BB%AB_kh%C3%B3a_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1), một [kí hiệu nhận dạng](/w/index.php?title=K%C3%AD_hi%E1%BB%87u_nh%E1%BA%ADn_d%E1%BA%A1ng_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)&action=edit&redlink=1)hay một [tên kí hiệu](/wiki/Bi%E1%BB%83u_t%C6%B0%E1%BB%A3ng). Các thẻ khoá có thể nhận biết được bởi việc dùng [máy hữu hạn trạng thái](/w/index.php?title=FSM&action=edit&redlink=1). Pha này còn gọi là pha đọc từ ngữ hay pha quét. [Phân tích cú pháp](/w/index.php?title=Ph%C3%A2n_t%C3%ADch_c%C3%BA_ph%C3%A1p&action=edit&redlink=1)- Nhận diện các cấu trúc cú pháp của mã nguồn. Nó chỉ tập trung lên cấu trúc. Nói cách khác, nó nhận diện trật tự sắp xếp của các thẻ khóa và hiểu cấu trúc thứ bậc trong bộ mã. [Phân tích ý nghĩa](/w/index.php?title=Ph%C3%A2n_t%C3%ADch_%C3%BD_ngh%C4%A9a&action=edit&redlink=1)- dùng để nhận biết *ý nghĩa*của chương trình (mã nguồn) và bắt đầu chuẩn bị cho ra [kết quả](#DEF). Trong pha này, sự kiểm tra về kiểu được hoàn tất và hầu hết các lỗi dịch được nêu ra. [Biểu trưng trung gian](/w/index.php?title=Bi%E1%BB%83u_tr%C6%B0ng_trung_gian&action=edit&redlink=1)- Đây là một dạng tương đương của chương trình nguyên thủy đã được chuyển thành và gọi là biểu trưng trung gian. Biểu trưng này có thể là một cấu trúc dữ liệu (thường là dạng [cây](/wiki/C%C3%A2y_(c%E1%BA%A5u_tr%C3%BAc_d%E1%BB%AF_li%E1%BB%87u))hay dạng [biểu đồ](/w/index.php?title=Bi%E1%BB%83u_%C4%91%E1%BB%93_(c%E1%BA%A5u_tr%C3%BAc_d%E1%BB%AF_li%E1%BB%87u)&action=edit&redlink=1)hay một dạng [ngôn ngữ trung gian](/w/index.php?title=Ng%C3%B4n_ng%E1%BB%AF_trung_gian&action=edit&redlink=1).)
## Mặt trong của trình biên dịch[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=10) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=10)]
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 đương về chức năng ở ngôn ngữ đích. Việc này bao gồm các giai đoạn:
[Phân tích về biên dịch](/w/index.php?title=Ph%C3%A2n_t%C3%ADch_v%E1%BB%81_bi%C3%AAn_d%E1%BB%8Bch&action=edit&redlink=1)- Quá trình này thu nhặt thông tin về chương trình từ biểu trưng trung gian của các tập tin của nguồn vào. Các phân tích đặc trưng bao gồm phân tích việc sử dụng của định nghĩa biến, phân tích quan hệ giữa các định nghĩa của các biến và việc sử dụng của chúng trong một chuỗi các phép gán giá trị, phân tích sự phụ thuộc của dữ liệu, phân tích các nhãn thay thế, và vân vân. Sự phân tích chính xác là căn bản cho mọi sự tối ưu hóa về biên dịch. [Đồ thị gọi](/w/index.php?title=%C4%90%E1%BB%93_th%E1%BB%8B_g%E1%BB%8Di&action=edit&redlink=1)và [đồ thị dòng điều khiển](/w/index.php?title=CFG&action=edit&redlink=1)thường được xây dựng trong pha phân tích này. [Tối ưu hóa về biên dịch](/w/index.php?title=T%E1%BB%91i_%C6%B0u_h%C3%B3a_v%E1%BB%81_bi%C3%AAn_d%E1%BB%8Bch&action=edit&redlink=1)- Ngôn ngữ trung gian biểu trưng được chuyển dạng thành các dạng tương đương về chức năng nhưng nhanh hay gọn hơn. Những việc tối ưu hoá thông dụng là [mở rộng nội tuyến](/w/index.php?title=M%E1%BB%9F_r%E1%BB%99ng_n%E1%BB%99i_tuy%E1%BA%BFn&action=edit&redlink=1), [triệt tiêu mã chết](/w/index.php?title=Tri%E1%BB%87t_ti%C3%AAu_m%C3%A3_ch%E1%BA%BFt&action=edit&redlink=1), [phép thế hằng](/w/index.php?title=Ph%C3%A9p_th%E1%BA%BF_h%E1%BA%B1ng&action=edit&redlink=1), [chuyển dạng vòng lặp](/w/index.php?title=Chuy%E1%BB%83n_d%E1%BA%A1ng_v%C3%B2ng_l%E1%BA%B7p&action=edit&redlink=1), [phân phối thanh ghi](/w/index.php?title=Ph%C3%A2n_ph%E1%BB%91i_thanh_ghi&action=edit&redlink=1)và ngay cả [song song hoá tự động](/w/index.php?title=Song_song_ho%C3%A1_t%E1%BB%B1_%C4%91%E1%BB%99ng&action=edit&redlink=1). [Tạo mã](/w/index.php?title=T%E1%BA%A1o_m%C3%A3&action=edit&redlink=1)- Chuyển dịch ngôn ngữ trung gian sang ngôn ngữ đích, thường tạo mã cho một hệ thống có cùng ngôn ngữ máy. Việc này bao gồm các quyết định về tài nguyên và kho lưu trữ chẳng hạn như là quyết định xem biến nào thì nên đặt vào [thanh ghi](/wiki/Thanh_ghi)hay đặt vào kho nhớ, quyết định sự lựa chọn cũng như việc đặt thời biểu của các chỉ thị máy, và theo đó quyết định về các [chế độ địa chỉ hoá](/w/index.php?title=Ch%E1%BA%BF_%C4%91%E1%BB%99_%C4%91%E1%BB%8Ba_ch%E1%BB%89_ho%C3%A1&action=edit&redlink=1)tương ứng (xem thêm [Thuật toán Sethi-Ullman](/w/index.php?title=Thu%E1%BA%ADt_to%C3%A1n_Sethi-Ullman&action=edit&redlink=1)).
## Tham khảo[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=11) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=11)] **Compilers: Principles, Techniques and Tools**( [ISBN 0201100886](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0201100886)), tác giả [Alfred V. Aho](/w/index.php?title=Alfred_V._Aho&action=edit&redlink=1), [Ravi Sethi](/w/index.php?title=Ravi_Sethi&action=edit&redlink=1)và [Jeffrey D. Ullman](/w/index.php?title=Jeffrey_D._Ullman&action=edit&redlink=1), được xem là chuẩn mực về căn bản về trình biên dịch, và tạo ra các nền tảng cho các kỹ thuật nhắc đến ở trên. (Sách thường gọi là *Dragon Book*vì bức tranh bìa miêu tả một dũng sĩ của lập trình đang chiến đấu con rồng của Thiết kế trình biên dịch.) [liên kết ngoài đến catalog của nhà xuất bản](http://www.aw.com/catalog/academic/product/0,4096,0201100886,00.html) **Understanding and Writing Compilers: A Do It Yourself Guide**( [ISBN 0333217322](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0333217322)), tác giả [Richard Bornat](/w/index.php?title=Richard_Bornat&action=edit&redlink=1), là sách rất hữu ích. Nó là một trong ít sách giải thích tường tận thế hệ đệ qui của các chỉ thị máy theo một dạng cây phân tích, chủ đề rất có ích mà nhiều sách hiện nay không làm được.
## Xem thêm[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=12) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=12)] [Những xuất phẩm quan trọng về trình biên dịch](/w/index.php?title=Nh%E1%BB%AFng_xu%E1%BA%A5t_ph%E1%BA%A9m_quan_tr%E1%BB%8Dng_c%E1%BB%A7a_khoa_h%E1%BB%8Dc_m%C3%A1y_t%C3%ADnh&action=edit&redlink=1)cho [ngôn ngữ lập trình](/wiki/Ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh) [Hợp ngữ](/wiki/H%E1%BB%A3p_ng%E1%BB%AF) [Xây dựng trình biên dịch](/w/index.php?title=X%C3%A2y_d%E1%BB%B1ng_tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit&redlink=1)
- Trình thông dịch:
[Chương trình liên kết](/w/index.php?title=Tr%C3%ACnh_li%C3%AAn_k%E1%BA%BFt_(m%C3%A1y_t%C3%ADnh)&action=edit&redlink=1) [Phân tích cú pháp](/w/index.php?title=Ph%C3%A2n_t%C3%ADch_c%C3%BA_ph%C3%A1p_(m%C3%A1y_t%C3%ADnh)&action=edit&redlink=1): [Mã hóa ngữ cảnh](/w/index.php?title=M%C3%A3_h%C3%B3a_ng%E1%BB%AF_c%E1%BA%A3nh&action=edit&redlink=1) [Biên dịch lại](/w/index.php?title=Bi%C3%AAn_d%E1%BB%8Bch_l%E1%BA%A1i&action=edit&redlink=1) [Chương trình dịch mã ngược](/w/index.php?title=Ch%C6%B0%C6%A1ng_tr%C3%ACnh_d%E1%BB%8Bch_m%C3%A3_ng%C6%B0%E1%BB%A3c&action=edit&redlink=1) [Chương trình dịch Just-in-time](/w/index.php?title=Ch%C6%B0%C6%A1ng_tr%C3%ACnh_d%E1%BB%8Bch_Just-in-time&action=edit&redlink=1) [Chương trình dịch Jello](/w/index.php?title=Ch%C6%B0%C6%A1ng_tr%C3%ACnh_d%E1%BB%8Bch_Jello&action=edit&redlink=1) [Tối ưu vòng lặp lồng nhau](/w/index.php?title=T%E1%BB%91i_%C6%B0u_v%C3%B2ng_l%E1%BA%B7p_l%E1%BB%93ng_nhau&action=edit&redlink=1) [en:Meta-Compilation](//en.wikipedia.org/wiki/Meta-Compilation) [Tiền xử lý](/wiki/Ti%E1%BB%81n_x%E1%BB%AD_l%C3%BD) [Chương trình dịch song song](/w/index.php?title=Ch%C6%B0%C6%A1ng_tr%C3%ACnh_d%E1%BB%8Bch_song_song&action=edit&redlink=1)
## Liên kết ngoài[
[sửa](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&veaction=edit§ion=13) | [sửa mã nguồn](/w/index.php?title=Tr%C3%ACnh_bi%C3%AAn_d%E1%BB%8Bch&action=edit§ion=13)] ["Biên dịch" là gì?](http://codepedia.com/compile)(liên kết tới Bách khoa toàn thư của người phát triển) [Xây dựng và kiểm tra gcc/glibc giữa các bộ công cụ](http://www.kegel.com/crosstool/) [Các đoạn trích của CiteSeer](http://citeseer.ist.psu.edu/cs?q=compiler) [Nhóm thảo luận comp.compilers](http://compilers.iecc.com/) ["bài giới thiệu phi kỹ thuật về việc xây dựng trình biên dịch"](http://compilers.iecc.com/crenshaw/) *Hãy cùng xây dựng máy tính*của Jack Crenshaw (từ 1988 đến 1995) [Mã nguồn trình biên dịch đơn giản](http://www.gtoal.com/software/CompilersOneOhOne)của nhóm " [Compilers 101](http://groups.yahoo.com/group/compilers101/)". Chỉ có một trang và dễ theo dõi. [Các trình biên dịch song song](http://www.tutorial-reports.com/computer-science/parallel-compiler/)
|
|
Các trình biên dịch
Chú ý: khoa học máy tính còn có thể được chia thành nhiều chủ đề hay nhiều lĩnh vực khác dựa theo

X-Cache: cp1065 miss (0), cp1065 frontend miss (0)


markdown:
Đeo túi xách nặng, ngủ không đủ giấc, mặc áo ngực không đúng size ảnh hưởng xấu tới sức khỏe của chị em.
**1. Thói quen đi giày cao gót**
Chúng ta đều biết đi giày cao gót hoặc những đôi giày quai hậu cao 6-7 cm sẽ mang đến cho các bạn gái một chiều cao lý tưởng, cũng như làm tăng vẻ nữ tính và sexy. Nhưng nếu sử dụng nó thường xuyên mỗi ngày sẽ ảnh hưởng tới cơ thể và sức khỏe của bạn.
Giày cao gót không chỉ ảnh hưởng tới dáng đi của bạn mà nó còn tạo ra áp lực cho đầu gối và các khớp. Đi thường xuyên có thể gây ra bệnh đau lưng mãn tính bởi khi đi cơ thể của bạn sẽ tự động nghiêng về phía trước.
Sự liên kết cơ thể kém khi di chuyển trên giày cao chính là nguyên nhân gây đau lưng. Bên cạnh đó nó còn tác động lên đôi chân của bạn và gây ra các tổn thương khó lành. Giày càng cao thì nguy cơ bị vấp ngã cũng càng tăng.
Nếu không có một dáng đi đúng và chuẩn xác trên giày cao thì có thể chúng sẽ thành kẻ thù nguy hiểm. Bạn có nguy cơ bị bong gân hoặc ngã khi đi xuống cầu thang. Nếu công việc buộc phải đi giày cao gót hàng ngày, bạn nên cố gắng sử dụng giày cao không quá 3-5 cm. Tốt nhất bạn nên chọn những đôi giày có đế xuồng hoặc cao trước cao sau, hay bạn có thể sử dụng một miếng đệm chân khi đi giày.
**2. Mang túi xách nặng**
Bạn là một tín đồ của những chiếc túi to bởi bạn muốn đựng mọi thứ thiết yếu hàng ngày. Có thể là túi của bạn luôn quá nặng hoặc bạn có quá nhiều thứ 'cần thiết'.
Nhiều phụ nữ thường mắc lỗi này. Phái đẹp không thể ra khỏi nhà nếu không có cho mình các đồ dùng trang điểm, nước hoa, hộp thuốc... trong túi xách. Chúng ta thường cho rằng mọi thứ đều là thiết yếu nhưng có bao giờ đặt câu hỏi mình đã bao lần sử dụng chúng?
Nếu túi xách nặng hơn 2 kg điều đó có khả năng khiến vai chịu tổn thương và gây đau đớn cho cơ thể. Mang túi nặng sẽ ảnh hưởng tới cánh tay, cổ, vai và lưng. Trọng lượng của túi sẽ phá vỡ sự lưu thông máu trong cơ thể, đó là lý do tại sao bạn thấy đau, hoặc bị tê trên vai và cánh tay.
Để tránh điều này, hãy thường xuyên sắp xếp lại túi và cân nhắc những gì thật cần thiết để mang theo. Hoặc bạn có thể sử dụng những túi mini đi kèm để tránh mọi sức nặng từ chiếc túi đeo vai hàng ngày của mình.
**3. Mặc áo ngực không đúng size**
Theo một nghiên cứu khoa học, có khoảng 70% phụ nữ mặc sai áo ngực. Trong số này có những người mặc không đúng với kích cỡ hoặc không sử dụng đúng mục đích của chúng. Một chiếc áo ngực không đúng size sẽ khiến vòng 2 có hình dạng khác thường. Nếu bạn mặc áo quá chật hai bên lưng sẽ lộ rõ từng ngấn mỡ. Điều này sẽ càng rõ rệt hơn bên ngoài là những chiếc áo bó sát người.
Mặc áo ngực sai cỡ còn khiến bạn bị đau vùng cổ và lưng hoặc gây khó chịu ở ngực, thậm chí khó thở và cản trở lưu thông máu. Với những người có làn da nhạy cảm nó có thể gây kích ứng da. Để chọn được loại áo phù hợp và chuẩn xác bạn nên nhờ đến sự tư vấn của nhân viên bán hàng để chọn loại áo phù hợp và đúng kích cỡ. Nếu thấy áo ngực gây khó chịu hoặc tổn thương tới cơ thể, tốt hơn hết bạn hãy nên tìm một chiếc khác mang lại sự thoải mái và tự tin cho mình.
**4. Không tẩy trang trước khi đi ngủ**
Trang điểm là một trong những điều quan trọng mà phụ nữ không thể bỏ qua. Việc này giúp họ trông đẹp hơn và làm tăng sự tự tin. Tuy nhiên, nó cũng có thể là một "con dao hai lưỡi" nếu chúng ta không có thói quen loại bỏ lớp trang điểm trước khi đi ngủ.
Một số người về nhà muộn, thường có thói quen đi ngủ luôn vì họ quá mệt mỏi sau một ngày bận rộn. Điều này sẽ gây tổn thương tới làn da. Nếu không được làm sạch, lớp trang điểm này làm tắc nghẽn lỗ chân lông, gây ra mụn trứng cá và khiến da bị khô. Nguy hiểm hơn, bụi phấn và các vụn mascara có thể rơi vào mắt, khiến mắt bạn đỏ hoặc sưng. Vì vậy, hãy tạo thói quen tẩy trang trước khi đi ngủ và sử dụng nước hoa hồng hay kem dưỡng da tạo độ ẩm.
**5. Không ngủ đủ giấc**
Điều này có thể là một trong những vấn đề thường gặp ở tất cả mọi người. Do cuộc sống bận rộn, công việc, gia đình và nhiều mối lo khác, phụ nữ ngày nay có xu hướng ngủ ít hơn 8 tiếng mỗi ngày. Nhiều người thậm chí đi ngủ sau nửa đêm, do đó thường không có giấc ngủ ngon và sâu. Từ khoảng 22 giờ cho tới 2 giờ sáng hôm sau là khoảng thời gian da có thể giải độc và trẻ hóa hiệu quả nhất.
Hầu hết mọi người đều biết rằng nếu thiếu ngủ sẽ gây ra quầng thâm ở mắt và làm sạm da. Tuy nhiên, bạn có thể không nhận thức được việc thiếu ngủ còn gây ảnh hưởng tới sức khỏe về lâu dài như mệt mỏi, tiêu hóa kém, cao huyết áp, các bệnh liên quan tới tim mạch, thậm chí gây ra trầm cảm.
Phụ nữ có xu hướng khó ngủ hơn nam giới. Do đó, để chăm sóc tốt cho cơ thể cùng như làn da, phái đẹp cần phải quan tâm nhiều tới giấc ngủ, bằng cách đi ngủ đúng giờ và ngủ đủ giấc, đặc biệt là không bỏ qua giấc ngủ trưa.

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

P3P: policyref="http://info.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV"

X-Frame-Options: SAMEORIGIN

Content-Type: text/html; charset=UTF-8

Via: HTTP/1.1 ncache7.global.media.bf1.yahoo.com (MediaFEValidator/1.0), 1.1 ncache7.global.media.bf1.yahoo.com-2:3128 (squid/2.7.STABLE9), 1.1 ncache7.global.media.bf1.yahoo.com:4080 (squid/2.7.STABLE9), http/1.1 media-border80.global.media.bf1.yahoo.com (ApacheTrafficServer/4.0.2 [cMsSfW])

X-Media-Gzip: true

Server: ATS

Cache-Control: max-age=0, private

Content-Encoding: gzip


markdown:
Thứ hai, ngày 19 tháng mười hai năm 2011
[Cesar Curti đoạt giải Nam vương Quốc tế 2011](/cesar-curti-đoạt-giải-nam-vương-quốc-tế-021020302.html)
Chàng trai 24 tuổi Cesar Curti đến từ Brazil, cao 1,87m, nặng 80 kg với số đo 3 vòng (101-81-97) đã đoạt giải Nam vương Quốc tế (Mister International) …
[Xem tiếp »Cesar Curti đoạt giải Nam vương Quốc tế 2011](/cesar-curti-đoạt-giải-nam-vương-quốc-tế-021020302.html)

Via: HTTP/1.1 ncache3.global.media.bf1.yahoo.com (MediaFEValidator/1.0), 1.1 ncache3.global.media.bf1.yahoo.com-2:3128 (squid/2.7.STABLE9), 1.1 ncache2.global.media.bf1.yahoo.com:4080 (squid/2.7.STABLE9), http/1.1 yts39.global.media.bf1.yahoo.com (ApacheTrafficServer/4.0.2 [cMsSfW]), http/1.1 r02.ycpi.che.yahoo.net (ApacheTrafficServer/4.0.2 [cMsSf ])