Biên dịch và vận chuyển


92

Trong khi tìm kiếm về sự khác biệt, tôi đã xem qua các định nghĩa sau:

Biên dịch là thuật ngữ chung để lấy mã nguồn được viết bằng một ngôn ngữ và chuyển đổi sang một ngôn ngữ khác.

Transpiling là một thuật ngữ cụ thể để lấy mã nguồn được viết bằng một ngôn ngữ và chuyển đổi sang một ngôn ngữ khác có mức độ trừu tượng tương tự.

Tôi hiểu trừu tượng là gì.

Nhưng "mức độ trừu tượng tương tự" trong định nghĩa trên có nghĩa là gì? Và làm thế nào để chúng ta tìm thấy mức độ trừu tượng trong một ngôn ngữ?


Có thể có bản sao của trừu tượng là gì?
GrumpyCrouton

Đây có phải là nguồn không? stevefenton.co.uk/2012/11/compiling-vs-transpiling
wjandrea

Câu trả lời:


144

Định nghĩa mà bạn đã trích dẫn ở trên là quá chung chung để một người mới bắt đầu có thể hiểu hoàn toàn và vì vậy hãy để tôi đơn giản hóa nó thành một cái gì đó mà chúng ta thấy thực tế.

Trình biên dịch: là một thuật ngữ chung để mô tả một chương trình lấy mã nguồn được viết bằng một ngôn ngữ và tạo ra một (hoặc nhiều) tệp đầu ra bằng một số ngôn ngữ khác. Trong thực tế, chúng tôi chủ yếu sử dụng thuật ngữ này để mô tả một trình biên dịch như gcc lấy mã C làm đầu vào và tạo ra tệp thực thi nhị phân (mã máy) làm đầu ra.

Transpilers còn được gọi là trình biên dịch từ nguồn sang nguồn. Vì vậy, về bản chất chúng là một tập hợp con của các trình biên dịch lấy một tệp mã nguồn và chuyển đổi nó sang một tệp mã nguồn khác bằng một số ngôn ngữ khác hoặc một phiên bản khác của cùng một ngôn ngữ. Con người nói chung là dễ hiểu. Đầu ra này vẫn phải thông qua trình biên dịch hoặc trình thông dịch để có thể chạy trên máy.

Một số ví dụ về transpilers:

  1. Emscripten : Chuyển C / C ++ sang JavaScript
  2. Babel : Chuyển mã ES6 + sang ES5 (ES6 và ES5 là các phiên bản hoặc thế hệ khác nhau của ngôn ngữ JavaScript)

Bây giờ, chúng có nghĩa là gì bởi "mức độ trừu tượng tương tự": Như tôi đã nói nó biên dịch / chuyển đổi sang một tệp nguồn, người ta có thể tranh luận rằng hợp ngữ cũng là một tệp nguồn và do đó gcc cũng là một trình chuyển tiếp. Vì vậy, đối số này là cái mà mức trừu tượng tương tự này làm mất tác dụng.

Khái niệm phân loại ngôn ngữ thành cấp thấp hơn, trung bình và cao hơn dựa trên mức độ trừu tượng mà chúng cung cấp từ hoạt động thực tế của máy móc / kiến ​​trúc.

Các ngôn ngữ cấp thấp hơn như hợp ngữ rất gần với kiến ​​trúc bộ xử lý, tức là có các lệnh khác nhau cho các bộ xử lý khác nhau. Trong khi C / C ++ / Java / JavaScript, hãy trừu tượng hóa tất cả những điều này để cung cấp thêm tính trừu tượng.

Vì vậy, một trình chuyển đổi biên dịch sang một ngôn ngữ gần với ngôn ngữ bạn bắt đầu hơn về mặt trừu tượng này (hoặc gần hơn với cấp độ của ngôn ngữ đó trong bậc thang ngôn ngữ cấp thấp hơn trung bình cao hơn).

Hi vọng điêu nay co ich!


10
"Một số ví dụ về transpilers:" --- babel tự gọi mình là trình biên dịch. Sự tách biệt giữa bộ chuyển đổi và trình biên dịch thực sự là giả tạo.
zerkms

14
@zerkms Như tôi đã nói, transpilers là một tập hợp con của các trình biên dịch.
tapananand 29/12/18

1
Tôi muốn nói thêm một điều, chúng ta đang nói về ngôn ngữ tự nhiên ở đây. Do đó, các định nghĩa mờ được mong đợi. Tôi mong đợi sự "dễ đọc" của đầu ra của một trình chuyển đổi tương tự như những gì trước đây trong khi trình biên dịch làm cho mọi thứ khó đọc hơn. Vì vậy, Webpack / npm là một trình biên dịch, bạn không muốn đọc đầu ra của nó. (Ít nhất khi bạn thêm "bốc" cho ví dụ .vue file.
Samuel Åslund

1
Ý kiến: Tôi cho rằng các định nghĩa nên là: Biên dịch: ngôn ngữ -> ngôn ngữ cấp thấp hơn. Chuyển ngữ: ngôn ngữ -> ngôn ngữ cùng cấp.
Deji

3
@Deji Không nhất thiết phải cùng một cấp độ ngôn ngữ, mà là một ngôn ngữ ở cấp độ trừu tượng tương tự.
tapananand

33

Đây là một loại cách mô tả để trả lời

Nếu bạn nghĩ về các lớp trừu tượng như ví dụ này:

(1) CPU-level (actual logic gates on the CPU)
(2)machine code
(3)assembly code
(4)[C/C++, JVM/bytecode]
(5)[JavaScript, Python]

Trình biên dịch chuyển sang cấp thấp hơn (số thấp hơn). Bộ chuyển tiếp chuyển đổi từ một ngôn ngữ (hoặc phiên bản của một ngôn ngữ) sang ngôn ngữ khác với cùng một số.


1
Tò mò, danh sách "mức độ trừu tượng" đó đến từ đâu?
zerkms

Ví dụ minh họa chỉ là ngẫu nhiên, tôi biết lần đầu tiên hai là kinda ủy mị tbh, nhưng tôi muốn có một danh sách dài hơn: P
Araymer

2
Tôi thích nó và sẽ rất tuyệt nếu nó là một số phân loại "chính thức" như thế. Vì không có nó, thật khó để xếp một công cụ (một người dịch) vào một danh mục này hoặc một danh mục khác. Vd: có phải là javactrình biên dịch hay không.
zerkms

2

Tôi hầu như đồng ý với câu trả lời của tapanana và ...


Định nghĩa

Các từ được "tạo ra", vì vậy chúng phục vụ một mục đích. Và điều này cũng thay đổi theo thời gian.

Bây giờ chúng ta có xu hướng sử dụng trình dịch chuyển để chỉ định một trình biên dịch dịch mã thành một số mã khác "tương tự" hơn với mã nguồn, điều mà một trình biên dịch có thể làm. Và được sử dụng để phân biệt cả hai chủ yếu khi cả hai được đề cập trong cùng một ngữ cảnh (một lần nữa chủ yếu ngụ ý rằng một ngôn ngữ chuyển đổi sẽ phải được biên dịch ít nhất một lần nữa)


ví dụ

Vì vậy mọi thứ đều rất chủ quan. Tại thời điểm viết bài này:

  • Đến từ thế giới Java, tôi có thể gọi các bộ chuyển mã CoffeeScript / TypeScript để mô tả rằng mã kết quả không hiệu quả hơn mã gốc.
  • Tài liệu CoffeScript nói rằng nó là một trình biên dịch và babel là một trình chuyển tiếp. Muốn nói rằng CoffeeScript, mặc dù rất giống nhau, nhưng không phải là Javascript. Ít nhất không phải là một phiên bản của nó, vì đó là những gì babel tạo ra.
  • Babel tự gọi mình là một trình biên dịch.

fazit

Vì vậy, transpile tại thời điểm này rất ít được sử dụng nữa, và chỉ để phân biệt hai trình biên dịch.

Nó có thể sẽ khác với khái niệm, vì quá trình biên dịch phức tạp hơn nhiều (cùng một ngôn ngữ / cao hơn / thấp hơn, phiên bản, v.v.) và từ này dường như không còn hữu ích nữa ("transpilers" hiện đã phổ biến)


2

Ví dụ: TypeScript (một tập hợp JavaScript siêu việt của Microsoft với tính năng kiểm tra loại an toàn) chuyển sang mã JavaScript có thể chạy trên các loại trình duyệt khác nhau.

https://en.wikipedia.org/wiki/Microsoft_TypeScript "Microsoft TypeScript là một ngôn ngữ lập trình mã nguồn mở do Microsoft phát triển và duy trì. Đây là một tập hợp cú pháp chặt chẽ của JavaScript và thêm tính năng nhập tĩnh tùy chọn vào ngôn ngữ.

TypeScript được thiết kế để phát triển các ứng dụng lớn và chuyển đổi sang JavaScript. [5] Vì TypeScript là một tập hợp siêu của JavaScript, các chương trình JavaScript hiện có cũng là các chương trình TypeScript hợp lệ. TypeScript có thể được sử dụng để phát triển các ứng dụng JavaScript để thực thi cả phía máy khách và phía máy chủ (Node.js). "


Có là "biên dịch nguyên cảo" (hoặc TSC) công cụ, đặt tên của nó ngụ ý rằng nguyên cảo được biên soạn không transpiled ... nhưng công cụ chuyển đổi typescript để Javascript, mà là cùng một mức độ trừu tượng WRT phần cứng cơ bản. TypeScript được biên dịch hay chuyển đổi?
Alex McMillan

@AlexMcMillan TypeScript được SOẠN, bởi vì nó là một tập hợp siêu của javascript và như vậy sẽ được biên dịch thành javascript.
Araymer

@Araymer Bạn có hiểu sự khác biệt giữa biên dịch và biên dịch không? Vì TS không được biên soạn; JS cũng vậy.
Alex McMillan

Vâng tôi đồng ý. Và bởi vì TS là một tập hợp siêu của JS, nó được coi là một cấp độ trừu tượng cao hơn, và do đó được gọi là "biên dịch". Sau đó, JS đã biên dịch được hiểu là bình thường. Do đó tại sao nếu bạn tra cứu TS, chủ đề được thảo luận nhiều nhất là "biên dịch" của nó. Tuy nhiên, ranh giới giữa biên dịch và biên dịch không có một định nghĩa định lượng chính thức. Nó trở nên khá ủy mị, vì vậy ý ​​kiến ​​của bạn về những gì được biên soạn (khác với những người sáng tạo) chỉ là ý kiến ​​của bạn.
Araymer
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.