Là trình biên dịch được sử dụng bên ngoài phát triển?


14

Theo hiểu biết của tôi, trình biên dịch có nghĩa là cho các nhà phát triển biên dịch mã của họ thành các tệp thực thi (mã máy). Trình biên dịch không mở rộng đến máy của khách hàng hoặc hệ thống người dùng cuối.

Thay vào đó, các nhà phát triển chỉ sử dụng trình biên dịch để chuyển đổi mã của họ thành mã máy, sau đó được chuyển đến các máy khác để sử dụng làm ứng dụng.

Trình biên dịch có chức năng ngoài quy trình này không? Nếu vậy, khi nào chúng được sử dụng?


21
Có, trình biên dịch mã biên dịch.
Tom Squires

@Tom: Tôi đọc được ở đâu đó rằng trình biên dịch C được cài đặt trên nhiều máy khác nhau, bao gồm cả máy chơi game. Điều này có nghĩa là chúng ta viết mã bằng C, sau đó được chuyển đến các thiết bị này, nơi được biên dịch bởi trình biên dịch và sau đó được thực hiện bởi trình thông dịch?
Pankaj Upadhyay

3
@Pankaj Upadhyay: Có thể mã có thể được gửi đến một máy và sau đó được biên dịch bởi một quy trình nội bộ. Người dùng thiết bị sẽ không bao giờ thấy điều này xảy ra hoặc biết về nó. Nó có thể được thực hiện nếu các phần của mã cần được biên dịch cho phần cứng và giải pháp cụ thể kiểm tra phần cứng khi chạy quá chậm, dẫn đến nhu cầu phân phối mã và biên dịch trong khi cài đặt. Có lẽ ...
Thất vọngWithFormsDesigner

3
@Pankaj Không có máy chơi game nào có trình biên dịch, nhưng một số có thể được cài đặt trên chúng. Sony đã cung cấp một phiên bản Linux và GCC có thể được cài đặt trên PS2 chẳng hạn. Những người khác đã bẻ khóa / hack theo cách của họ để đưa các hệ điều hành và phần mềm khác vào bảng điều khiển.
IronMensan

4
@Stargazer: Ý của bạn là: "Không, trình biên dịch dịch từ ngôn ngữ nguồn sang ngôn ngữ đích"? Bỏ dấu phẩy làm cho câu của bạn có nghĩa trái ngược với ý định của bạn.
Daniel Pryden

Câu trả lời:


19

Có và không. Có, kịch bản cổ điển là nhà phát triển sử dụng trình biên dịch để tạo mã máy từ mã nguồn và mã máy sau đó được phân phối cho người dùng.

được một vài ngoại lệ đối với mặc dù điều này. Đầu tiên, nhiều dự án nguồn mở được phân phối chủ yếu (hoặc thậm chí độc quyền) ở dạng mã nguồn và mong muốn người dùng cuối sẽ cài đặt chúng bằng cách nhập một vài lệnh như makesau đómake intall. Điều này sẽ gọi trình biên dịch, trình liên kết, v.v., để tạo mã máy từ mã nguồn cho máy tính của người dùng đó. Tuy nhiên, trong những trường hợp này, quá trình xây dựng và cài đặt (ít nhất là dự định) sẽ tự động đến mức người dùng hiếm khi cần nhiều kiến ​​thức về nó ngoài thực tế là nếu họ chưa bao giờ cài đặt gói chỉ mã nguồn trước đây , người quản lý gói của họ thường liệt kê một số gói "phát triển" là điều kiện tiên quyết để cài đặt ứng dụng mà họ thực sự quan tâm (mặc dù một số người vẫn xem đây là không thân thiện với người dùng cuối).

Một ngoại lệ khác (đã được ám chỉ, nhưng không được giải thích rõ ràng trong các câu trả lời khác mà tôi đã thấy) là các trình biên dịch (JIT) đúng lúc. Một vài ví dụ rõ ràng về trình biên dịch JIT là Microsoft Common Language Runtime (CLR) và Máy ảo Java (JVM). Trong những trường hợp này, thông thường có hai trình biên dịch hoàn toàn riêng biệt liên quan đến việc dịch mã nguồn thành mã máy. Một được sử dụng bởi các nhà phát triển. Tuy nhiên, thay vì tạo mã máy trực tiếp, nó tạo mã byte độc ​​lập với máy. CLR / JVM sau đó bao gồm một trình biên dịch thứ hai , tách biệt hoàn toàn với trình biên dịch thứ nhất, chuyển đổi các mã byte đó thành mã máy cho máy tính đích.

Tôi nên thêm rằng trình biên dịch thứ hai không thực sự cần thiết. Các phiên bản ban đầu của JVM (ví dụ) chỉ giải thích mã byte thay vì biên dịch chúng. Điều này thường mang một hình phạt hiệu năng khá nghiêm trọng, do đó, hầu hết các JVM gần đây dành cho sử dụng sản xuất bao gồm một trình biên dịch JIT.


24

Có, trình biên dịch chủ yếu được sử dụng bởi các nhà phát triển, với một vài ngoại lệ đáng chú ý. Người dùng cuối đôi khi sử dụng trình biên dịch để biên dịch và cài đặt phần mềm nguồn mở mới nhất, ngay cả khi họ không thực hiện bất kỳ thay đổi nào đối với mã. Ngoài ra, một số ngôn ngữ lập trình không có trình biên dịch. Họ sử dụng các thông dịch viên thay vì "biên dịch" một cách nhanh chóng. Trong trường hợp đó, người dùng cuối cần cài đặt trình thông dịch trên máy của họ.


4
Nếu chúng ta hạn chế định nghĩa "trình biên dịch" có nghĩa là các chương trình tạo tệp thực thi, thì đây sẽ là một câu trả lời tốt. Tuy nhiên, đó chỉ là một tập hợp con của định nghĩa thực sự của "trình biên dịch"
riwalk

16
@Jan Soltis: Tôi không đồng ý. Tôi đã biên dịch nhân Linux từ nguồn: điều đó có nghĩa là tôi là nhà phát triển nhân Linux ? Tôi chưa bao giờ sửa đổi mã hạt nhân Linux hoặc gửi một bản vá - tôi sẽ nói điều đó có nghĩa là tôi không phải là nhà phát triển nhân. Thêm vào đó, trong vài năm tôi sử dụng Gentoo làm hệ điều hành chính của mình, tôi đã biên dịch từng phần mềm trên máy. Tuy nhiên, phần lớn trong số chúng được biên dịch tự động bởi hệ thống quản lý gói Portage. Tôi sẽ lập luận rằng trong trường hợp đó tôi đã đóng vai trò là người dùng cuối nhưng không phải là nhà phát triển .
Daniel Pryden

8
@Jan Soltis: Tôi biết đó là ý kiến ​​của bạn. Tôi tôn trọng không đồng ý. Tôi đã cung cấp phản biện để hỗ trợ vị trí của tôi, trong khi bạn tiếp tục đưa ra các xác nhận không được hỗ trợ. Bạn dường như nghĩ rằng có một ranh giới giữa "nhà phát triển" và "người dùng cuối" mà tôi không tin là có tồn tại.
Daniel Pryden

6
Tải xuống các nguồn và sau đó chạy "make install" không phải là nhà phát triển. Nó chắc chắn là một hoạt động của người dùng cuối.
Kristopher Johnson

3
@Jan: Tôi có thể chấp nhận rằng việc sử dụng một bản phân phối như Gentoo để biên dịch các gói làm cho bạn ít nhất là một người dùng quyền lực , nhưng đó vẫn rõ ràng là một loại người dùng. Biên dịch mã của người khác, mà không sửa đổi mã, thêm vào hoặc thậm chí đọc nó, không giúp bạn trở thành nhà phát triển.
Carson63000

10

Đúng

Trình biên dịch được định nghĩa là chương trình dịch mã từ ngôn ngữ này sang ngôn ngữ khác (xem Wikipedia ). Việc sử dụng phổ biến nhất của trình biên dịch là dịch ngôn ngữ nguồn thành mã máy, nhưng điều này không định nghĩa từ "trình biên dịch".

Ví dụ, Python tạo mã byte khi nhập mô-đun và do đó phù hợp với định nghĩa của trình biên dịch (vì nó chuyển đổi từ ngôn ngữ nguồn, Python, sang ngôn ngữ đích, mã byte Python).

Một ví dụ khác là công cụ JavaScript V8. Nó chuyển đổi JavaScript thành mã máy x86 và do đó cũng phù hợp với định nghĩa của trình biên dịch. V8 không chỉ phù hợp với định nghĩa của trình biên dịch, mà nó còn được bao gồm trong Chrome và được sử dụng rất rộng rãi trên các máy khách.


4

Một trường hợp sẽ là một ứng dụng tạo mã động khi chạy, và sau đó chạy mã được tạo. Mã này sẽ cần phải được biên dịch trong thời gian chạy.

Chỉnh sửa: Có những trường hợp ngoại lệ khác, nhưng chúng đã được đề cập trong các câu trả lời khác.


+1 chỉ cần nói JIT
gnat

1
Công cụ V8 trong Chrome không phải là một ngoại lệ kỳ quặc.
riwalk

Cập nhật để làm rõ. Tôi nhận ra có những ngoại lệ khác.
Morgan Herlocker

3

trình biên dịch chỉ dành cho các nhà phát triển để biên dịch mã ngôn ngữ lập trình của họ thành các tệp thực thi (mã máy)

Tôi sẽ nói "trình biên dịch có nghĩa là chính cho các nhà phát triển ...". Nhưng tôi đã thấy các ví dụ nơi các chương trình tạo mã ngôn ngữ lập trình mới một cách nhanh chóng và do đó cần một trình biên dịch để được cài đặt trên máy người dùng cuối. Điều đó không có nghĩa là người dùng cuối phải tự làm việc với trình biên dịch.

Lý do có thể cho thiết kế chương trình này:

  • hiệu suất: nghĩ về một ứng dụng dựa trên quy tắc trong đó các quy tắc được lưu trữ trong một số loại lưu trữ dữ liệu của người dùng cuối và bạn có một số dữ liệu hàng loạt được xử lý theo các quy tắc đó. Thay vì diễn giải các quy tắc hết lần này đến lần khác, một chương trình sẽ tạo mã xử lý trước, biên dịch nó và chạy nó với dữ liệu cần xử lý

  • nghĩ về một chương trình mà người dùng cuối có thể thêm một số loại công thức toán học và nhà phát triển chương trình không muốn triển khai trình phân tích cú pháp / trình thông dịch của riêng mình cho việc này. Thay vào đó, chương trình thực hiện công thức này, thực hiện một số bổ sung để chuyển đổi nó thành một đoạn mã chương trình hợp lệ, hãy để trình biên dịch biên dịch nó và chạy nó sau đó.


hmm .... Điều đó không có nghĩa là người dùng cuối phải tự làm việc với trình biên dịch . Điều đó khá nhiều giải thích và làm rõ.
Pankaj Upadhyay

2

Điều đó đúng - trình biên dịch biên dịch mã nguồn thành dạng thực thi, sau đó được liên kết thành tệp nhị phân thực thi bằng một trình liên kết. Mã nguồn cũng có thể được thực thi trực tiếp bởi một trình thông dịch, chẳng hạn như một trong nhiều shell dòng lệnh (C-shell, bash, zsh, v.v.), awk, sed, v.v.

Thật khó có thể vạch ra một ranh giới rõ ràng giữa "nhà phát triển" và "người dùng cuối" trừ khi bạn giới hạn thảo luận của mình về một sản phẩm cụ thể. Các nhà phát triển là tất cả "người dùng cuối" của các công cụ họ sử dụng và "người dùng cuối" có thể có các công cụ phát triển như trình biên dịch và trình thông dịch được cài đặt trên máy của họ.


2
Ok, tôi sẽ đến -1 cái này, bởi vì có rất nhiều sự hiểu lầm ở đây về trình biên dịch. Trình biên dịch dịch mã từ ngôn ngữ nguồn sang ngôn ngữ đích. Nói rằng họ tạo mã máy tương tự như nói rằng xe có 4 bánh (vâng, hầu hết các xe đều có 4 bánh, nhưng xe máy cũng là phương tiện. Cũng giống như vậy, hầu hết các trình biên dịch đều tạo mã máy, nhưng bộ chuyển đổi C # -> VB là một trình biên dịch là tốt)
riwalk

1
@ Stargazer712, tôi đảm bảo với bạn rằng không có sự hiểu lầm - Tôi biết rất rõ trình biên dịch làm gì, cảm ơn. Nhưng nếu ai đó không biết hỏi tôi xe là gì, có lẽ tôi sẽ nói rằng một chiếc xe có bốn bánh mặc dù thực tế là một số không . Một định nghĩa mô phạm thường gây nhầm lẫn nhiều hơn nó giải thích cho một người đang cố gắng nắm bắt một khái niệm. "Trình biên dịch" cũng có thể là một mô tả công việc, nhưng đề cập đến điều đó sẽ không giúp đỡ ở đây.
Caleb

1

Quản trị viên cũng có thể có nhu cầu sử dụng ngôn ngữ lập trình trong việc viết tập lệnh để thực hiện các tác vụ tự động khác nhau. Ví dụ: có một tập lệnh xóa các tệp nhật ký cũ khỏi máy chủ sau 90 ngày để giải phóng một số dung lượng đĩa. Ngôn ngữ được sử dụng để viết tập lệnh phải được giải thích hoặc biên dịch để có thể chạy trên hệ thống.


1

Một số chương trình là chương trình meta : trong khi chạy, chúng có thể tạo một số chương trình khác (hoặc một số mã nguồn) và biên dịch nó sau đó chạy nó bằng cách nào đó. Đọc thêm về lập trình nhiều giai đoạn .

Vì vậy, để sử dụng các loại chương trình này, sẽ cần một trình biên dịch, ngay cả khi người dùng không biết tự lập trình (vì máy tính sẽ tạo ra một số mã cần được biên dịch).

Ví dụ, xem MELT (tạo mã C ++ để mở rộng GCC ) hoặc hệ thống trí tuệ nhân tạo CAIA của J.Pitrat (tạo mã C - đặc biệt là mã của chính nó - để giải quyết các vấn đề kết hợp).

Ngoài ra, một số ngôn ngữ và một số triển khai gần như yêu cầu trình biên dịch phải có mặt ở mọi nơi (trong mọi chương trình được mã hóa bằng ngôn ngữ & triển khai đó). Đầu tiên, một số trình duyệt web chứa công cụ Javascript JIT (như V8 ). Ngoài ra, hầu hết các triển khai Lisp phổ biến -eg SBCL - chứa trình biên dịch (thậm chí hữu ích để chạy các ứng dụng, có thể tạo và đánh giá biểu thức). Đọc thêm về ngôn ngữ đồng âmcác chương trình Qine .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.