Ý nghĩa của câu mà chúng tôi muốn nó được biên dịch để nó không đốt cháy CPU làm những thứ sai.


10

Tôi đang đọc này bài viết. Nó có đoạn văn sau.

Và Scala đã trở nên nhanh chóng? Chà, định nghĩa của bạn về nhanh là gì? Về nhanh như Java. Nó không phải nhanh như C hay hội. Python không nhanh hơn đáng kể so với Ruby. Chúng tôi muốn làm nhiều hơn với ít máy hơn, tận dụng lợi thế đồng thời tốt hơn; chúng tôi muốn nó được biên dịch để nó không đốt CPU làm những thứ sai.

Tôi đang tìm ý nghĩa của câu cuối cùng. Làm thế nào ngôn ngữ diễn giải sẽ làm cho CPU làm công cụ "sai"?


3
Gọi bất cứ thứ gì biên dịch sang mã byte JVM được diễn giải là một chút tự do với cách sử dụng.
Giàn khoan

Câu trả lời:


47

Nếu mã nói

A = A + 1

mã được biên dịch thực hiện điều này

add A, 1

mã diễn giải làm điều này (hoặc một số biến thể)

look up the location of A in the symbol table
find the value of A
see that 1 is a constant
get its value
add the value of A and the value of 1
look up the location of A in the symbol table
store the new value of A

Có được ý tưởng?


3
Đôi khi sự đơn giản hóa thực sự không làm cho hình ảnh rõ ràng hơn ;-) (chỉ để được hoàn chỉnh: nhiều dịch viên nổi tiếng tối ưu hóa một số trong những bước đi, vì vậy họ đang nằm giữa hai mẫu "hiện thực" ở đây).
Joachim Sauer

3
@JoachimSauer: Tất nhiên là bạn đúng. Vẫn khó để làm cho một trình thông dịch chạy với hệ số phạt dưới 10 lần so với mã được biên dịch. Nếu ngôn ngữ là ngôn ngữ thực sự dành toàn bộ thời gian cho các hàm được biên dịch cấp dưới phải được gọi bằng mọi cách, như thư viện toán học hoặc I / O, thì chi phí phiên dịch không phải là vấn đề.
Mike Dunlavey

1
Đây là một mô tả tuyệt vời
Jamie Taylor

13

chúng tôi muốn nó được biên dịch để nó không đốt CPU làm những thứ sai.

Âm thanh như họ đang đề cập đến biên dịch vs giải thích. Rất có thể là toàn bộ câu chuyện về Twitter chuyển các tác vụ xử lý nền sang Scala (được biên dịch) sau khi ban đầu phát triển trong Ruby On Rails (diễn giải).

Một lời giải thích về mã được biên dịch và giải thích ở đây .

Với ngôn ngữ được biên dịch, mã bạn nhập được rút gọn thành một tập hợp các hướng dẫn cụ thể của máy trước khi được lưu dưới dạng tệp thực thi. Với các ngôn ngữ được thông dịch, mã được lưu theo cùng định dạng mà bạn đã nhập. Các chương trình được biên dịch thường chạy nhanh hơn các chương trình được giải thích vì các chương trình được giải thích phải được giảm xuống theo hướng dẫn của máy khi chạy.


Rất vui khi được cung cấp cho bạn +1 đầu tiên của bạn. Chào mừng bạn đến với P.SE!
haylem

4
(Có thể đáng nói là Scala - như trên JVM - về mặt kỹ thuật chỉ được biên dịch theo byte).
haylem

Không biết Scala dựa trên JVM. Có nghĩa là JIT có lẽ được biên dịch. Trong trường hợp nào, tại sao Twitter không chuyển từ Ruby on Rails sang JRuby? Bạn sẽ nghĩ rằng đó sẽ là một sự di chuyển dễ dàng hơn với lợi ích của việc biên dịch.
KrisG

3
Họ cũng đang tìm kiếm mô hình tương tranh tốt hơn và họ gặp vấn đề với bộ sưu tập rác của Ruby. Bài viết mô tả nó một cách chi tiết.
Scrwtp

9

"Công cụ sai" ở đây có nghĩa là chi phí cần thiết cho trình thông dịch phân tích và xử lý mã. Nó được kết nối với khái niệm về ngôn ngữ được dịch và so sánh. Có một số mô hình dịch mã đang được sử dụng, gần như thuộc một trong các loại sau:

  • Biên dịch gốc - mã nguồn được biên dịch trực tiếp thành mã máy. Hiệu suất tốt nhất với chi phí di động. Thường được liên kết với C và C ++,
  • Biên dịch trung gian - mã nguồn được biên dịch thành ngôn ngữ trung gian đơn giản hóa (mã byte), sau này được giải thích hoặc biên dịch (biên dịch đúng lúc) thành mã máy trong khi thực hiện. Tính di động tốt hơn mã gốc, hiệu suất tốt hơn so với giải thích thuần túy trong khi vẫn giữ một số mặt tích cực của giải thích (như ràng buộc muộn). Ví dụ bao gồm C #, Java và các ngôn ngữ khác nhắm mục tiêu JVM và .NET CLR,
  • Giải thích - mã nguồn không được dịch trực tiếp thành mã máy, thay vào đó, nó được diễn giải và thực thi bởi một chương trình thông dịch chuyên dụng. Các thông dịch viên khác nhau về độ tinh vi, trong cách triển khai ngây thơ, tuy nhiên, nó tập trung vào phân tích cú pháp, phân tích và thực thi từng dòng mã nguồn. Giải thích cho phép linh hoạt hơn so với biên dịch, do đó, các ngôn ngữ được giải thích sử dụng rộng rãi hơn cho việc gõ hoặc phản chiếu động, chẳng hạn. Các ngôn ngữ được giải thích thường được xem là mang lại năng suất cho nhà phát triển tăng lên, vì chúng yêu cầu ít mã soạn sẵn hơn và cho vay chính xác để tạo mẫu nhanh. Nhược điểm là giảm hiệu suất. Thường được liên kết với JavaScript, Ruby hoặc Python.

Do đó, sự lựa chọn giữa ngôn ngữ được giải thích và biên dịch tập trung vào câu hỏi, chúng ta đánh giá cao hơn điều gì, năng suất hay hiệu suất của nhà phát triển? Việc di chuyển được mô tả trong bài viết dường như đi theo cùng một dòng suy nghĩ, với ngôn ngữ tạo mẫu mạnh mẽ Ruby được thay thế bằng Scala dựa trên JVM do các cân nhắc về hiệu năng.


-1 cách trả lời, có vẻ quá đơn giản. Nó hoàn toàn bỏ qua những thứ như JIT ( biên dịch đúng lúc ) - đó là cách Scala chạy trên JVM / CLR
gnat

Thật. Viết lại câu trả lời, nó đã thêm rất ít vào chủ đề.
Scrwtp

-3

Trong trường hợp này tôi đã có the wrong stuffnghĩa là thiếu an toàn kiểu trong mã không được biên dịch.

Do đó, không chỉ mã được giải thích chậm hơn mà còn nhiều lỗi hơn ...


8
Bạn đang giả sử rằng các ngôn ngữ được biên dịch là loại an toàn và các ngôn ngữ được giải thích thì không. Có nhiều ví dụ ngược lại Ví dụ lisp có thể được biên dịch và không được gõ mạnh, trong khi Haskell có thể được hiểu và là loại RẤT an toàn
Zachary K

1
Tương đương "không an toàn" với "nhiều lỗi hơn" là FUD được thúc đẩy bởi những người có sản phẩm để bán.
dùng16764

1
@ user16764: Không phải FUD nếu nó đúng. IME những người vô lý về chủ đề bán sản phẩm là những người cố gắng hạ thấp liên kết giữa lỗi đánh máy động và lỗi. ("Đây chỉ là một loại lỗi ", v.v.)
Mason Wheeler
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.