Hợp ngữ
Các khái niệm > Trình hợp dịch (Assembler)

Thông thường, một trình hợp dịch hiện đại tạo ra mã đối tượng (object code) bằng cách phiên dịch các lệnh hợp ngữ thành mã thực thi (opcodes) và phân tích các biểu danh (symbolic names) ứng với các vùng nhớ cùng các thực thể khác. Việc dùng các biểu danh để tham chiếu là một tính năng then chốt của các trình hợp dịch, nó tiết kiệm một khối lượng lớn công việc tính toán và sửa đổi thủ công sau mỗi lần cải tiến ứng dụng. Hầu hết các trình hợp dịch đều hỗ trợ macro nhằm giúp cho việc thay thế một nhóm lệnh bằng một định danh ngắn gọn. Trong quá trình dịch, nhóm lệnh tương ứng sẽ được chèn trực tiếp vào vị trí macro thay vì một lời gọi hàm (subroutine).
Một số trình hợp dịch cũng có thể thực hiện một số loại tối ưu hóa cụ thể theo tập lệnh. Một ví dụ cụ thể về điều này có thể là trình hợp dịch x86  phổ biến từ các nhà cung cấp khác nhau. Hầu hết trong số chúng có thể thực hiện thay thế lệnh nhảy (nhảy dài thay thế bằng nhảy ngắn hoặc tương đối) trong bất kỳ số lần vượt qua, theo yêu cầu. Những trình hợp dịch khác thậm chí có thể thực hiện sắp xếp lại đơn giản hoặc chèn các lệnh, chẳng hạn như một số trình hợp dịch cho kiến trúc RISC có thể giúp tối ưu hóa lịch trình tập lệnh hợp lý để khai thác kênh chuyền dữ liệu (pipeline) của CPU một cách hiệu quả nhất có thể.
Giống như các ngôn ngữ lập trình ban đầu như  Fortran, Algol, Cobol và Lisp, các trình hợp dịch đã có sẵn từ những năm 1950 và các thế hệ giao diện máy tính dựa trên văn bản đầu tiên. Tuy nhiên, các trình hợp dịch xuất hiện đầu tiên vì chúng đơn giản hơn nhiều so với trình biên dịch cho các ngôn ngữ bậc cao. Điều này là do mỗi mnemonic cùng với các chế độ địa chỉ và toán hạng của một lệnh dịch trực tiếp thành các biểu diễn số của lệnh đó, mà không có nhiều bối cảnh hoặc phân tích. Cũng đã có một số lớp dịch giả và trình tạo mã bán tự động có các thuộc tính tương tự cả hợp ngữ và ngôn ngữ bậc cao, với Speedcode có lẽ là một trong những ví dụ được biết đến nhiều hơn.
Có thể có một số trình biên dịch với cú pháp khác nhau cho một cấu trúc CPU hoặc tập lệnh cụ thể. Chẳng hạn, một lệnh để thêm dữ liệu bộ nhớ vào một thanh ghi trong bộ xử lý họ x86 có thể là add eax,[ebx], trong cú pháp gốc của Intel, trong khi điều này sẽ được viết là addl (%ebx),%eax trong cú pháp của AT&T được dùng trong GNU Assembler. Mặc dù xuất hiện khác nhau, các hình thức cú pháp khác nhau thường tạo ra cùng một mã máy. Xem bên dưới. Một trình biên dịch đơn cũng có thể có các chế độ khác nhau để hỗ trợ các biến thể trong các hình thức cú pháp cũng như các diễn giải ngữ nghĩa chính xác của chúng (như cú pháp FASM, cú pháp TASM, chế độ lý tưởng, v.v., trong trường hợp đặc biệt của lập trình hợp ngữ x86).
Các trình hợp dịch nói chung dễ tạo hơn so với các chương trình dịch cho ngôn ngữ cấp cao. Những trình hợp ngữ đầu tiên xuất hiện từ những thập niên 1950, trong buổi đầu sơ khai của máy tính đã tạo ra một bước ngoặt lớn đối với những lập trình viên vốn rất mệt mỏi vì việc lập trình bằng ngôn ngữ máy. Các trình hợp dịch hiện đại ngày nay, đặc biệt cho các dòng chip RISC như MIPS, Sun SPARC và HP PA-RISC, thường tối ưu việc sắp xếp và đồng bộ các chỉ thị lệnh (instruction scheduling) để tận dụng các kênh chuyền dữ liệu (pipeline) của CPU một cách hiệu quả.