2010-03-25 49 views
7

Các ngôn ngữ được phiên dịch thường cao cấp hơn và do đó có các tính năng như nhập động (bao gồm tạo biến động mới mà không cần khai báo), nổi tiếng eval và nhiều tính năng khác giúp cuộc sống của lập trình viên trở nên dễ dàng hơn. những điều này là tốt?Các tính năng của ngôn ngữ thông dịch nào có thể được biên dịch?

Tôi không có nghĩa là các ngôn ngữ như Java chạy trên máy ảo, nhưng những ngôn ngữ biên dịch thành nhị phân như C (++).

Tôi sẽ không tạo danh sách bây giờ nhưng nếu bạn định hỏi những tính năng nào tôi muốn nói, hãy xem những gì PHP, Python, Ruby, v.v. cung cấp.

  • Các tính năng phổ biến của ngôn ngữ thông dịch không thể/không/tồn tại trong ngôn ngữ được biên dịch? Tại sao?
+0

Đây phải là wiki cộng đồng vì nó không có câu trả lời rõ ràng (tôi thậm chí không chắc chắn nó sẽ không bị đóng). Vui lòng nhấn 'chỉnh sửa' và chọn hộp 'Cộng đồng Wiki'. –

+0

Ngoài ra, tôi không nghĩ rằng sự khác biệt giữa Java và C++ là giá trị bất cứ điều gì cho cuộc thảo luận này. –

+0

Hãy xem http://stackoverflow.com/questions/2147662/ để biết một số ý tưởng tương tự! – Dario

Trả lời

0

Ban đầu, một trong những lợi ích lớn nhất của ngôn ngữ thông dịch là gỡ lỗi. Bằng cách đó bạn có thể nhận được thông tin cực kỳ chính xác và chi tiết khi tìm kiếm lý do mà một chương trình không hoạt động. Tuy nhiên, hầu hết các trình biên dịch đã trở nên đủ tiên tiến, đó không phải là quá lớn của một thỏa thuận nữa.

Các lợi ích chính khác (theo ý kiến ​​của tôi anyway), là với các ngôn ngữ diễn giải, bạn không cần phải chờ đợi vĩnh cửu cho dự án của bạn để biên dịch để kiểm tra nó ra. Ví dụ:

+4

Không giải quyết được câu hỏi. –

0

Bạn không thể làm điều này một cách hợp lý, ví dụ, vì những lý do tôi nghĩ là khá rõ ràng: chính xác bạn sẽ triển khai nó như thế nào? Làm cho thời gian chạy có chứa một bản sao đầy đủ của trình biên dịch? Mỗi khi bạn muốn đánh giá một chuỗi (lưu ý rằng mỗi lần nó có thể khác nhau!), Bạn sẽ lưu chuỗi vào một tệp, chạy trình biên dịch trên nó để tạo một DLL/shared-lib, sau đó tải DLL đó/chia sẻ-lib và gọi mã của bạn? Bạn không thể thấy tại sao điều này có thể là một chút wee không thực tế? ;)

Bạn có thể tìm thấy loại điều này bằng ngôn ngữ động trên khắp nơi mà bạn không thể thực hiện với mã tĩnh về cơ bản chạy trình thông dịch, thực tế, đằng sau hậu trường.

+1

Tôi nghĩ bạn có thể làm eval. Và bạn đã nói như thế nào: Làm cho thời gian chạy có chứa một bản sao đầy đủ của trình biên dịch. Đó là cách diễn giải ngôn ngữ, đúng không? Gọi eval là không có gì khác hơn là gọi cho thông dịch viên. Vì vậy, trong một ngôn ngữ biên dịch, nó sẽ không có gì khác hơn là gọi trình biên dịch. Trong .NET bạn có thể phát ra IL (một số loại assembly/bytecode) trực tiếp với việc phải "lưu chuỗi thành file, ... load DLL". Nó không phải là không phổ biến. Mặc dù không nhiều người sử dụng một cái gì đó chính xác như "eval", nó không phải là không thực tế. –

+0

Ví dụ thực tế: boo được biên dịch và có thông dịch viên. Tôi cho rằng có một eval ở đâu đó trong ruột của thông dịch viên. Ngoài ra, những gì Dario nói. –

+1

Tôi đã nhìn thấy một bản demo của hành vi REPL cho C#. Vì vậy, eval có thể được thực hiện với các ngôn ngữ biên dịch. –

4

Cho dù mã nguồn được biên dịch - thành mã nhị phân gốc, một số loại ngôn ngữ trung gian (Java Bytecode/IL) - hoặc được hiểu là hoàn toàn không có đặc tính của ngôn ngữ. Nó chỉ là một câu hỏi của việc thực hiện.

Bạn thực sự có thể có cả hai trình biên dịch và phiên dịch cho cùng một ngôn ngữ như

  • Haskell: GHC < -> GHCI
  • C: gcc < -> ch
  • VB6: VS IDE < -> Trình biên dịch VB6

Một số tính năng ngôn ngữ nhất định như eval hoặc nhập động có thể gợi ý sự khác biệt giữa cái gọi là "ngôn ngữ động" và tĩnh những người, nhưng cách điều này được chạy không bao giờ có thể là câu hỏi chính.

+0

1. Khi bạn chạy Java biên dịch, bạn Tôi thực sự giải thích Java bytecode.Tôi không thấy nhiều sự khác biệt, ngoài thực tế là Ruby là một ngôn ngữ có thể đọc được bằng Java và Java không phải là điều có liên quan, nếu bạn nghĩ về nó, chúng ta có thể loại bỏ "nhân tạo" "phân biệt giữa biên soạn và giải thích, làm cho câu hỏi tranh luận, và suy nghĩ về phân chia động/tĩnh thay thế. –

+0

@Martinho: Chính xác. Người ta thậm chí có thể gọi một thông dịch viên độc lập với nguồn bao gồm một trình biên dịch;) – Dario

+0

Tôi tự hỏi liệu nó có thể tạo ra một ngôn ngữ lập trình mà không thể biên dịch được hay không. –

0

Tiếp tục từ Dario - Tôi nghĩ bạn thực sự hỏi tại sao một chương trình được biên soạn không thể đánh giá các câu lệnh trong thời gian chạy (ví dụ: eval).Dưới đây là một số lý do tôi có thể nghĩ:

  • Trình biên dịch đầy đủ sẽ phải được phân phối với các chương trình (hoặc là một phần của chương trình)
  • Đối với một hàm eval để có quyền truy cập để gõ thông tin và biểu tượng (ví dụ như tên biến và tên hàm) trong môi trường nó đã được sử dụng chương trình gốc sẽ phải được biên dịch với các biểu tượng có thể truy cập (các ngôn ngữ được biên dịch thường loại bỏ các ký hiệu này tại thời gian biên dịch).

Chỉnh sửa: Như đã lưu ý, không có ngôn ngữ/trình biên dịch nào có thể đánh giá mã khi chạy, nhưng chúng chắc chắn là những thứ cần xem xét khi phát triển trình biên dịch hoặc khi thiết kế một ngôn ngữ.

+1

Lisp thường có 'eval' tại thời gian chạy, và các triển khai cường độ công nghiệp được biên dịch. –

+0

Tôi không cố gắng để nói rằng nó không thể cho các chương trình biên dịch để có một eval, tôi chỉ đưa ra một số lý do tại sao nhiều ngôn ngữ không có một eval. Tôi sẽ cập nhật câu trả lời của mình để làm rõ điều này. – CiscoIPPhone

+0

Trình biên dịch có thể được phân phối với thời gian chạy, giống như trình thông dịch không phải là một phần của các chương trình diễn giải. Ngoài ra, các nền tảng hiện đại như .NET và Java mang theo thông tin kiểu như siêu dữ liệu trong các đơn vị được biên dịch (lắp ráp trong .NET, JAR trong Java). Chỉ các tên biến cục bộ bị tước, bởi vì ngay cả các biến cục bộ cũng có thể được loại bỏ hoàn toàn bằng các tối ưu hóa. –

0

Có lẽ câu hỏi không phải là ngôn ngữ được biên dịch/biên dịch (biên dịch còn mơ hồ) nhưng về ngôn ngữ làm/không mang theo trình biên dịch riêng của chúng? Ví dụ, chúng tôi đã nói C + + có thể làm eval với một trình biên dịch tiện dụng nổi xung quanh trong ứng dụng, và phản ánh có lẽ là tương tự trong một số cách.

+0

Có các thư viện trình biên dịch C được thiết kế cho chính xác mục đích đó: vì vậy bạn có thể nhúng trình biên dịch C vào ứng dụng của bạn để viết kịch bản bằng cách sử dụng C. libtcc là một ví dụ như vậy. –

Các vấn đề liên quan