Một "trình biên dịch của trình biên dịch" hay "chương trình sinh trình biên dịch" (tiếng Anh: compiler-compiler) là một công cụ tạo ra bộ phân tích cú pháp, trình thông dịch hoặc trình biên dịch từ một dạng mô tả hình thức nào đó của một ngôn ngữ và máy tính. Dạng sơ khai nhất nhưng vẫn phổ biến của chương trình sinh trình biên dịch là trình sinh bộ phân tích cú pháp với đầu vào là một văn phạm (thường dưới dạng BNF của một ngôn ngữ lập trình và đầu ra là mã nguồn của một bộ phân tích cú pháp thường được sử dụng như một thành phần của trình biên dịch.
Compiler-compiler lý tưởng nhận một mô tả của ngôn ngữ lập trình và một kiến trúc tập lệnh đầu ra và tự động sinh ra một trình biên dịch có thể sử dụng được. Trong thực tế, mức độ phát triển hiện tại vẫn chưa đạt đến độ phức tạp này và hầu hết trình sinh trình biên dịch không thể xử lý được ngữ nghĩa của thông tin về kiến trúc đầu ra.
Các biến thể
Một trình sinh bộ phân tích cú pháp điển hình gắn mã nguồn thực thi được với mỗi luật của văn phạm. Mã nguồn sẽ được thực thi khi luật đó được áp dụng bởi bộ phân tích. Những đoạn mã nguồn này đôi khi được gọi là tiểu trình ngữ nghĩa vì chúng xác định ngữ nghĩa của cấu trúc ngữ pháp đang được phân tích. Dựa vào kiểu bộ phân tích cần sinh ra, các tiểu trình này có thể xây dựng cây phân tích (hoặc cây phân tích trừu tượng) hoặc sinh trực tiếp ra mã lệnh.
Một vài compiler-compiler thử nghiệm nhận đầu vào là mô tả hình thức của ngữ nghĩa của một ngôn ngữ lập trình, điển hình là sử dụng denotational semantics. Cách tiếp cận này thường được gọi là "biên dịch dựa ngữ nghĩa" mà người tiên phong là Peter Mosses' Semantic Implementation System (SIS) in 1978. Tuy nhiên, cả trình biên dịch dược sinh ra và mã lệnh nó tạo ra đều không hiệu quả về thời gian và bộ nhớ. Hiện tại không có trình biên dịch thành phẩm nào được xây dựng theo cách này tuy nhiên các nghiên cứu vẫn đang tiếp tục.
Dự án Production Quality Compiler-Compiler ở Đại học Carnegie-Mellon không hình thức hoá ngữ nghĩa nhưng có một framework bán hình thức cho mô tả máy tính.
Compiler-compiler tồn tại dưới nhiều hình thức, bao gồm cả bottom-up rewrite machine generators (xem [http://jburg.sourceforge.net/ JBurg]) và trình sinh bộ phân tích văn phạm thuộc tính (ví dụ ANTLR có thể được dùng để kiểm tra kiểu, lan truyền hằng số và hơn nữa đồng thời với pha phân tích cú pháp).
Lịch sử
Compiler-compiler đầu tiên sử dụng tên gọi này được viết bởi Tony Brooker năm 1960 và được sử dụng để tạo ra trình biên dịch cho máy tính Atlas ở Đại học Manchester, gồm cả trình biên dịch Atlas Autocode. Tuy nhiên nó khá khác so với các trình sinh trình biên dịch hiện đại và có thể được xếp vào giữa một trình biên dịch tổng quát có khả năng tuỳ chỉnh cao và một ngôn ngữ có khả năng mở rộng. Tên gọi "compiler-compiler" phù hợp với hệ thống của Brooker hơn nhiều so với những hệ thống ngày nay. Hầu như chắc chắn rằng cái tên "Compiler Compiler" đã trở nên phổ biến do Yacc hơn là công trình của Brooker's.
Một số ví dụ khác của trình sinh bộ phân tích cú pháp là ANTLR, Coco/R, CUP, GNU bison, Eli, FSL, SableCC và JavaCC.
Một vài compiler-compiler
ANTLR
Bison
Coco/R
ELI, bộ công cụ tích hợp cho việc xây dựng trình biên dịch.
Lemon
parboiled, thư viện Java cho bộ phân tích cú pháp.
Packrat parser
PQCC
*Yacc
Các chủ đề liên quan
LL,
LR,
SLR,
LALR,
*GLR,
👁️
1 | 🔗 | 💖 | ✨ | 🌍 | ⌚
Một "trình biên dịch của trình biên dịch" hay "chương trình sinh trình biên dịch" (tiếng Anh: compiler-compiler) là một công cụ tạo ra bộ phân tích cú pháp, trình thông dịch hoặc trình biên
thumb|Minh họa mã nguồn [[Java (programming language)|Java với comment **mở đầu** được biểu thị bằng màu **đỏ** và comment **nội dòng** bằng màu **lục**. **Mã chương trình** là bằng màu **lam**.]]Trong lập
**Romcc** là một trình biên dịch C tạo ra mã chỉ sử dụng các thanh ghi để lưu trữ các biến, thay vì dùng RAM. Nó được thiết kế để bổ trợ cho khởi đầu
**Watcom C / C ++** (hiện tại là **Open Watcom C / C ++**) là một sản phẩm môi trường phát triển tích hợp (IDE) của Watcom International Corporation cho ngôn ngữ lập trình C,
**Pascal** là một ngôn ngữ lập trình cho máy tính thuộc dạng mệnh lệnh và thủ tục, được Niklaus Wirth phát triển vào năm 1970. Pascal là ngôn ngữ lập trình đặc biệt thích hợp
phải|Biểu đồ hoạt động của một trình biên dịch lý tưởng. **Trình biên dịch** () hay **phần mềm biên dịch** 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
nhỏ| Chương trình máy tính "Xin chào, thế giới" của [[Brian Kernighan (1978) ]] **Chương trình máy tính** là tập hợp các câu lệnh thực hiện một tác vụ cụ thể khi được máy tính
**Bộ trình dịch GNU** ( - thường được viết tắt thành **GCC**) là một tập hợp các trình biên dịch được thiết kế cho nhiều ngôn ngữ lập trình khác nhau. GCC là một thành
**D** là một ngôn ngữ lập trình hệ thống hướng đối tượng, dùng câu lệnh, đa mẫu hình do Walter Bright của Digital Mars tạo ra và phát hành năm 2001. Quá trình thiết kế
Trong lập trình máy tính, một **triển khai của ngôn ngữ lập trình** là một hệ thống để thực thi chương trình máy tính. Có hai cách tiếp cận chung để triển khai một ngôn
**Quản lý bờ biển** là phòng chống lũ lụt và xói mòn và một số biện pháp kĩ kỹ thuật để ngăn chặn xói mòn để giữ đất. Các vùng ven biển chiếm dưới 15%
**Go** là một ngôn ngữ lập trình mới do Google thiết kế và phát triển. Nó được kỳ vọng sẽ giúp ngành công nghiệp phần mềm khai thác tối đa nền tảng đa lõi của
**Cỏ biển** là những loài thực vật có hoa mọc trong môi trường nước mặn và thuộc một trong bốn họ là họ Cỏ biển (Posidoniaceae), họ Rong lá lớn (Zosteraceae), họ Thủy thảo (Hydrocharitaceae)
**Trình sinh bộ phân tích cú pháp** (tiếng Anh: _Parser Generator_) là một chương trình lấy dữ liệu nhập là một bộ văn phạm và cho ra kết quả là một bộ phân tích cú
**World Editor** hay **WE**. Là một công cụ thiết kế và phát triển bản đồ của Blizzard Entertainment tạo ra dành cho Warcraft III: Reign of Chaos và bản mở rộng Warcraft III: Frozen Throne.
**Babel** là một trình biên dịch Javascript mã nguồn mở và miễn phí có chức năng chính dùng để biên dịch ECMAScript thành phiên bản tương thích ngược cho JavaScript có thể chạy trên các
**Trận chung kết giải vô địch bóng đá châu Âu 2020** là một trận đấu bóng đá được diễn ra vào ngày 11 tháng 7 năm 2021 trên sân vận động Wembley ở Luân Đôn,
Trong lập trình hướng đối tượng dựa trên lớp, **hàm tạo** (tiếng Anh: _constructor_, viết tắt: _ctor_) trong một lớp là một kiểu chương trình con đặc biệt được dùng để tạo ra đối tượng.
Trong khoa học máy tính, **ngôn ngữ máy tính** là hệ thống giao tiếp với máy tính. Các ngôn ngữ như vậy được sử dụng để tạo **mã máy tính** hoặc **mã** **chương trình**, tập
Trong lập trình, **tham số** là biến được thu nhận bởi một chương trình con. Tại thời gian chạy, chương trình con sử dụng các giá trị được gán cho các tham số để thay
**Trận chung kết Giải vô địch bóng đá U-23 ASEAN 2025** là trận đấu quyết định ngôi vô địch của Giải vô địch bóng đá U-23 ASEAN 2025, giải đấu lần thứ năm do Liên
"**Love Story**" là một bài hát của nữ ca sĩ kiêm nhạc sĩ sáng tác bài hát người Mỹ Taylor Swift, được hãng đĩa Big Machine Records phát hành làm đĩa đơn mở đường cho
**Dylan** là một ngôn ngữ lập trình đa mẫu hình có hỗ trợ hàm, lập trình hướng đối tượng (OOP), động và phục hồi trong khi cung cấp một mô hình lập trình được thiết
**_Liên Minh Huyền Thoại_: Giải vô địch thế giới mùa 2** () là Giải vô địch thế giới lần thứ hai của bộ môn thể thao điện tử _Liên Minh Huyền Thoại_, diễn ra vào
**Trận chung kết Giải vô địch bóng đá nữ thế giới 2015** là trận đấu bóng đá nữ được tổ chức vào ngày 5 tháng 7 năm 2015 trên sân BC Place, ở Vancouver, Canada,
**Chung kết Giải vô địch bóng rổ thế giới 2023** là trận đấu nhằm xác định ra nhà vô địch của Giải vô địch bóng rổ thế giới 2023 giữa Đức và Serbia. Trận đấu
**Gecko** là một bộ máy trình bày được phát triển bởi Mozilla. Nó được sử dụng trong trình duyệt Firefox, email client Thunderbird và nhiều dự án khác Gecko được thiết kế để hỗ trợ
**Oberon** là một ngôn ngữ lập trình đa năng được xuất bản lần đầu tiên vào năm 1987 bởi Niklaus Wirth và là thành viên mới nhất của gia đình Wirth gồm các ngôn ngữ
**Elixir** (phát âm là _Ê-líx-xơ_) là một ngôn ngữ lập trình hàm, đồng thời và đa năng, được chạy trên máy ảo BEAM, thứ còn được sử dụng để thực hiện ngôn ngữ lập trình
phải|nhỏ|402x402px|[[Mã nguồn của một chương trình máy tính đơn giản được viết bằng ngôn ngữ lập trình C. Khi được biên dịch và chạy, nó sẽ cho kết quả "Hello, world!".]] **Ngôn ngữ lập trình**
**_Kinh Dịch_** (chữ Nôm: 經易), tên gốc là **_Dịch Kinh_** (chữ Hán: 易經), là một sách bói toán cổ xưa của Trung Quốc, nằm trong hàng ngũ những kinh điển cổ xưa nhất của nền
**C** là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ đó, ngôn ngữ này đã lan rộng ra nhiều
**Phương thức lẩn tránh miễn dịch của mầm bệnh** là các phương thức mà mầm bệnh sử dụng để chống lại cơ chế hoạt động của hệ miễn dịch. Nếu như động vật có xương
**Chiến dịch Šiauliai** hay **Chiến dịch Shyaulyay** diễn ra từ ngày 5 tháng 7 đến ngày 29 tháng 8 năm 1944 là một trong các hoạt động quân sự lớn của Hồng quân Liên Xô
nhỏ|Cbmain Trong khoa học máy tính, một **ngôn ngữ lập trình bậc cao** (tiếng Anh: _high-level programming language_) là một ngôn ngữ lập trình có sự trừu tượng hóa mạnh mẽ khỏi các chi tiết
**Java** (phiên âm Tiếng Việt: "_Gia-va_") là một ngôn ngữ lập trình hướng đối tượng, dựa trên lớp được thiết kế để có càng ít phụ thuộc thực thi càng tốt. Nó là ngôn ngữ
**Chiến dịch Overlord**, hay **Cuộc tập trận Hornpipe**, là mật danh của **Trận Normandie,** một chiến dịch quân sự quy mô lớn của quân đội Đồng Minh tại miền Bắc nước Pháp trong Chiến tranh
**Chiến dịch Linebacker II**, hay còn được biết đến là **Chiến dịch Điện Biên Phủ trên không**, là chiến dịch quân sự cuối cùng của Hoa Kỳ chống lại Việt Nam Dân chủ Cộng hoà
**Chiến dịch Budapest** (Tiếng Nga:_Будапештская операция_) là trận đánh lớn nhất giữa quân đội Liên Xô với quân đội Đức Quốc xã và quân đội Hungary tại _Mặt trận Hungary_ thuộc Chiến tranh Xô-Đức trong
thumb|Hình ảnh [[kính hiển vi điện tử quét của một bạch cầu trung tính hay đại thực bào (màu vàng/phải) đang nuốt vi khuẩn bệnh than (màu cam/trái).]] **Hệ miễn dịch** là hệ thống bảo
**Chiến dịch tấn công hữu ngạn Dniepr** ở Ukraina (1944), hay còn được gọi là **Chiến dịch tấn công Dniepr–Carpath**, kéo dài từ ngày 24 tháng 12 năm 1943 đến ngày 14 tháng 4 năm
**Chiến dịch Lyublin–Brest** hay **Chiến dịch Lublin-Brest** là một chiến dịch quân sự diễn ra trong Chiến tranh Xô-Đức do Hồng quân Liên Xô tổ chức nhằm tiếp tục tấn công vào Cụm tập đoàn
**Chiến dịch tấn công Proskurov (Khmelnitskyi)–Chernovtsy** (từ 4 tháng 3 đến 17 tháng 4 năm 1944) là một trong các trận đánh lớn nhất giữa Hồng quân Liên Xô và Quân đội Đức quốc xã
**Chiến dịch Praha** là chiến dịch lớn cuối cùng của Quân đội Liên Xô và các đồng minh tại châu Âu trong Chiến tranh thế giới thứ hai. Diễn ra từ ngày 5 đến ngày
**Chiến dịch tranh cử tổng thống năm 2024 của Donald Trump** là chiến dịch tranh cử tổng thống cho cuộc bầu cử tổng thống Hoa Kỳ 2024 đang diễn ra của cựu tổng thống thứ
**Chiến dịch CQ-88** (tên đầy đủ là **Chiến dịch Chủ quyền 1988**) là một chuỗi các hoạt động quân sự trên biển Đông do Quân chủng Hải quân Nhân dân Việt Nam tiến hành từ
nhỏ|Những nghiên cứu phủ nhận quá trình ấm lên toàn cầu do con người gây nên được kiểm duyệt bởi hội đồng chuyên gia là gần như không tồn tại trong khoảng 2013-14. Hơn 99.99%
**Lịch sử quan hệ hai bờ eo biển Đài Loan** giới thiệu thay đổi về lịch sử quan hệ giữa hai bờ eo biển từ xưa đến nay. Các ghi chép sớm nhất trong lịch
**Chiến dịch Pedestal** (, **Trận chiến giữa tháng Tám**), được người dân Malta gọi là **** (, **Đoàn vận tải Santa Maria**), là một chiến dịch tiếp vận đảo Malta của Hải quân Hoàng gia
**Chiến dịch đổ bộ của lính dù Mỹ ở Normandie** là chiến dịch nhảy dù của Quân đội Hoa Kỳ trong cuộc đổ bộ vào Normandie trong Chiến tranh thế giới thứ hai, bắt đầu