2010-03-31 13 views
31

Tôi tự hỏi liệu có một ngôn ngữ lập trình biên dịch thành mã máy/nhị phân (không bytecode sau đó được thực hiện bởi máy ảo), có tính năng động và/hoặc gõ yếu, ví dụ:Có một ngôn ngữ lập trình * đã biên dịch có năng động, thậm chí có thể đánh máy yếu không?

Hãy suy nghĩ của một ngôn ngữ biên soạn nơi:

  • biến không cần phải được khai báo
  • các biến có thể được tạo ra trong thời gian chạy
  • Chức năng có thể trả về giá trị của các loại khác nhau

Câu hỏi:

  • Có như vậy một ngôn ngữ lập trình?
  • (Tại sao) không?

Tôi nghĩ rằng ngôn ngữ được biên soạn động, chưa mạnh mẽ thực sự có ý nghĩa, nhưng có thể không?

+2

Um, C# 4.0? .... –

+0

@Robert Harvey: Đã được biên soạn thành mã máy? Tôi nghĩ rằng nó đã được biên dịch sang bytecode đầu tiên. –

+1

@ Platinum: Bạn có thể lấy mã máy bằng NGen. –

Trả lời

6

Mục tiêu-C có thể có một số thuộc tính bạn tìm kiếm. Các lớp có thể được mở và thay đổi trong thời gian chạy, và bạn có thể gửi bất kỳ loại thông báo nào tới một đối tượng, cho dù nó có phản ứng với nó hay không. Bằng cách đó, bạn có thể thực hiện gõ vịt, giống như trong Ruby. Loại id, tương đương với void*, có thể được ưu đãi với giao diện chỉ định hợp đồng mà loại (nếu không biết) sẽ tuân theo.

6

C# 4.0 có nhiều, nếu không phải tất cả các đặc điểm này. Nếu bạn thực sự muốn có mã máy riêng, bạn có thể compile the bytecode down to machine code sử dụng một tiện ích.

Cụ thể, việc sử dụng từ khóa dynamic cho phép các đối tượng và thành viên của chúng bị ràng buộc động trong thời gian chạy.

Check-out Video Anders Hejlsberg của, Tương lai của C#, cho một mồi:

http://channel9.msdn.com/pdc2008/TL16/

+0

Về mặt kỹ thuật, điều này là không chính xác. Tất cả những gì mà C# động làm là cung cấp cú pháp đường qua việc sử dụng Object làm kiểu. – lassombra

1

Tôi không biết về bất kỳ ngôn ngữ mà có chính xác những khả năng. Tôi có thể nghĩ đến hai có một tập hợp con đáng kể, mặc dù:

  • D có kiểu suy luận, thu gom rác thải, và các cơ sở lập trình meta mạnh mẽ, tuy nhiên biên dịch thành mã máy hiệu quả. Nó không có gõ năng động, tuy nhiên.
  • C# có thể được biên dịch trực tiếp sang mã máy qua dự án đơn âm. C# có tính năng tương tự được đặt thành D, nhưng lại không có tính năng nhập động.
4

Mục tiêu-C có nhiều tính năng bạn đề cập: nó biên dịch thành mã máy và được nhập động một cách hiệu quả đối với các cá thể đối tượng.Loại id có thể lưu trữ bất kỳ cá thể lớp nào và Mục tiêu-C sử dụng tính năng truyền tin nhắn thay vì các cuộc gọi hàm thành viên. Phương thức có thể được tạo/thêm vào lúc chạy. Thời gian chạy Objective-C cũng có thể tổng hợp các biến cá thể của lớp khi chạy, nhưng các biến cục bộ vẫn cần được khai báo (giống như trong C).

C# 4.0 có nhiều tính năng này, ngoại trừ việc nó được biên dịch sang IL (bytecode) và được diễn dịch bằng máy ảo (CLR). Điều này mang lại một điểm thú vị, tuy nhiên: nếu bytecode là chỉ-trong-thời gian biên dịch để mã máy, không tính? Nếu vậy, nó sẽ mở ra cửa không chỉ bất kỳ ngôn ngữ .Net nào, nhưng Python (xem PyPy hoặc Unladed Swallow hoặc IronPython) và Ruby (xem MacRuby hoặc IronRuby) và nhiều ngôn ngữ được nhập động khác, không đề cập đến nhiều biến thể LISP.

2

VB 6 có hầu hết số đó

+1

... nhưng không thực sự biên dịch thành mã máy (biên dịch thành mã p). –

+2

Cài đặt mặc định là biên dịch thành mã gốc. (Bạn có thể thay đổi điều này trong thuộc tính dự án.) – svinto

0

Python đến C có thể cần những tiêu chí này.

  1. Viết bằng Python.

  2. Biên dịch Python thành có thể thực thi. Xem Process to convert simple Python script into Windows executable. Xem thêm Writing code translator from Python to C?

+0

Bạn không nói về/không phải tất cả những trình biên dịch "trình biên dịch" này chỉ đóng gói các tệp nhị phân python cùng với tập lệnh trong một tệp thực thi? – sub

+0

@sub: làm thế nào là "bao bì nhị phân ... trong một tập tin thực thi" không phải là trình biên dịch? Vui lòng cung cấp một số định nghĩa không bao gồm việc tạo một tệp thực thi từ nguồn. Và một số dịch sang C trước khi biên dịch nhị phân, FWIW. –

+0

không phải vậy. Trình biên dịch chuyển đổi mã thành các tệp nhị phân có thể đọc được trên máy tính. Py2exe (và các hệ thống khác) chỉ đơn thuần là tàu thực thi Python cùng với kịch bản Python, do đó, mã ban đầu vẫn còn là Python, và vẫn chỉ thực thi bởi Python thực thi. Nhưng có tồn tại 'biến thể' của ngôn ngữ Python cho phép biên dịch thành C, nhưng không bao giờ là Python gốc (như Cython) – Manux

3

Trong một tĩnh mạch tương tự như Lisp, có Factor, một concatenative * ngôn ngữ với không có biến theo mặc định, gõ năng động, và một hệ thống đối tượng linh hoạt. Mã nhân tố có thể được chạy trong trình thông dịch tương tác, hoặc được biên dịch thành một tệp thực thi tự nhiên bằng cách sử dụng hàm deploy của nó.

* chức năng dựa trên điểm xếp chồng miễn phí

4

Có, có thể. Xem Julia. Nó là một ngôn ngữ động (bạn có thể viết các chương trình không có kiểu) nhưng nó không bao giờ chạy trên máy ảo. Nó biên dịch chương trình thành mã gốc trong thời gian chạy (biên dịch JIT).