2009-07-13 49 views
40

Có trình biên dịch mã máy gốc cho JavaScript không? Tôi không nói về máy ảo. Nếu nó không tồn tại nó có thể được thực hiện?
Tôi tự hỏi nếu nó có thể được biên dịch thành nhị phân do tính chất động của ngôn ngữ.Có trình biên dịch mã máy gốc cho JavaScript không?

+0

Bạn có đang nói về JScript.NET không? – Shimmy

+0

Tôi yêu cầu làm rõ một chút: Bằng "trình biên dịch mã máy gốc", bạn có nghĩa là trình biên dịch có một chương trình Javascript và tạo ra một tệp thực thi (Trình biên dịch tĩnh) hay không, có nghĩa là bạn có thể dịch mã javascript sang máy code ở tất cả (Ví dụ các trình biên dịch JIT trong Tracemonkey (Firefox) và V8 (Chrome) sẽ tạo ra mã máy riêng từ javascript hiện đang thực thi, vì vậy nó không phải giải thích chúng nhiều lần.) – Falaina

+1

Tôi yêu cầu biên dịch tĩnh . –

Trả lời

26

Theo như tôi biết, không có trình biên dịch tĩnh cho JavaScript. Đó chắc chắn là lý thuyết có thể; tuy nhiên, việc biên dịch JavaScript tĩnh sẽ cần một thời gian chạy rất nặng để hỗ trợ tất cả các tính năng của nó (chẳng hạn như gõ động và eval). Là một phần nhỏ, khi được trình bày với nhu cầu biên dịch tĩnh Python (ngôn ngữ động khác), các nhà phát triển PyPy đã tạo ra một ngôn ngữ là một tập con rất hạn chế của Python (được gọi là RPython), mất một số tính năng động của Python, có khả năng được biên dịch tĩnh.

Nếu bạn đang yêu cầu điều này với mục đích tạo một tệp thực thi độc lập từ mã JavaScript, tôi chắc chắn phải có trình bao bọc về cơ bản sẽ tạo tệp thực thi có chứa tập lệnh của bạn và máy ảo JavaScript được nhúng (thật đáng buồn, tôi không có) t biết bất kỳ offhand).

+1

JIT dựa trên trình duyệt đầu tiên được phát hành với FF 3.5 khoảng một tháng trước khi câu hỏi này được trả lời. –

+0

+1 cho PyPy. 'RPython' không được biên dịch một cách tĩnh, thay vào đó, chương trình« RPython' được bắt đầu bằng 'CPython' bình thường, và ảnh chụp nhanh tất cả các đối tượng hiện có trong bộ nhớ được lấy. Điều đó đảm bảo tất cả các loại chuyên môn vv đã được thực hiện. Điều đó cũng có nghĩa là đầu vào chương trình RPython bị hạn chế nghiêm trọng, ví dụ: nó không thể 'json.load' một cái gì đó và nhận được các loại trên bay. –

2

Về mặt lý thuyết có thể, nhưng sẽ có rất nhiều hành lý hỗ trợ thời gian chạy (và thậm chí là trình biên dịch Javascript đầy đủ hoặc thông dịch viên để hỗ trợ eval).

Bạn đang tìm kiếm một trình biên dịch mã nguồn gốc thực sự hay bạn đang tìm kiếm thứ gì đó có thể kết hợp mã Javascript cùng với một thời gian chạy vào một nhị phân thực thi duy nhất?

+3

Tôi đang tìm kiếm một trình biên dịch mã nguồn gốc thực tế –

25

Đó chắc chắn thực hiện được, mặc dù cách duy nhất tôi biết làm thế nào để làm điều đó vào lúc này là một quá trình hai bước ...

  1. Biên dịch javascript để sử dụng Java Mozilla Rhino JSC.
  2. Biên dịch tệp lớp java kết quả thành có thể thực thi bằng cách sử dụng một cái gì đó như GNU's GCJ.

Tại sao bạn muốn? Bạn mong đợi những lợi thế gì?

+12

Nó chỉ là sự tò mò. Tôi thích javascript rất nhiều. –

1

TraceMonkey trong FF3.5 thực hiện việc này đối với một số phần của mã javascript. Bạn có thể nhận được một số hướng dẫn từ đó!

+0

Không thực sự. Tôi đã không tìm thấy bất cứ điều gì hữu ích ở đó. –

+0

Điều này không hữu ích, vì Tracemonkey không thể thực hiện việc này với * tất cả * các phần của mã. – Bergi

2

Tôi chắc microsoft có JScript tải ("javascript của Microsoft") trình biên dịch

nếu bạn có cửa sổ: Nếu bạn viết một tập tin văn bản javascript bạn có thể biên dịch nó bằng cách: mở dấu nhắc lệnh sử dụng cd để vào thư mục tập tin văn bản (nếu bạn có cửa sổ) gõ: C: \ wINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ jsc.exe textfile.js

khác: tải về một trình biên dịch JScript gõ vào thư mục của trình biên dịch jscript và sau đó là tên của javascript tex t file

bạn có thể thêm biến môi trường nếu bạn không muốn gõ toàn bộ tên thư mục vào trình biên dịch.

anh chàng này giải thích nó tốt hơn: http://www.phpied.com/make-your-javascript-a-windows-exe/

Cá nhân tôi nghĩ rằng đây là thực sự mát mẻ. Tôi chỉ muốn có thêm tài liệu cho nó.

Tôi khá chắc chắn đó là những gì bạn đang tìm kiếm, nhưng tôi là một chút mới.

+2

Biên dịch sang .net Mã IL không được biên dịch sang ngôn ngữ mẹ đẻ như được đặt câu hỏi, mã IL thực sự là một phiên dịch (Chỉ trong thời gian). Chỉ cần bạn biết;) – Remco

+0

@Remco: IL luôn được ** biên dịch thành các hướng dẫn mã máy, trước khi nó được thực thi. Không giống như Java bytecode, IL không bao giờ được diễn giải. – IInspectable

4

Xin lưu ý rằng tất cả các giải pháp này là DOM ít, vì vậy không thư viện như angular.js hay jquery, chỉ underscore.js/lodash

Theo dõi câu trả lời Falaina 's, PyPykhông có một dist cho JavaScript

Ngoài ra, Appcelerator Titaniumjs>JavaBit >android

Cuối cùng, có thể sử dụng node.jsnexe Explained trong công cụ này khác answer

8

Google V8 biên dịch JavaScript vào mã máy trực tiếp. Tính năng này được sử dụng trong trình biên dịch EncloseJS mà tôi đã viết cho các dự án node.js và io.js.

+0

Tôi có thể làm như thế nào? –

+2

(* Meta *) Nó không và không nên gây khó chịu, nhưng một * đơn giản * của tôi ở đúng nơi đủ. Tôi đã tiếp tục và chỉnh sửa câu trả lời của bạn ở đây. Hãy ghi nhớ điều này cho các câu trả lời trong tương lai. –

1

Trình biên dịch AOT của Adobe AIR cho iOS biên dịch tĩnh một tập hợp siêu nhỏ của JavaScript có tên Actionscript 3.0 xuống mã byte bytecode của ABC, sau đó mã máy thông qua LLVM. Nếu bạn đã viết mã AS3 của bạn mà không có các lớp và không có chú thích kiểu, nó về bản chất sẽ là JavaScript, và sau đó trình biên dịch sẽ vui vẻ biên dịch nó xuống mã máy. Đáng buồn thay, đây không phải là phần mềm nguồn mở, và bạn không có quyền truy cập vào bất kỳ DOM nào (mà nhiều người nghĩ đến khi họ nghĩ về JavaScript) bởi vì nó chạy bên trong cơ bản một cá thể Flash Player.

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