2011-09-08 31 views
11

Có thể sử dụng Javascript để viết một trình biên dịch có thể hỗ trợ các loại ngôn ngữ khác như tập lệnh không?Có thể viết Trình biên dịch bằng Javascript không?

Giả sử, tôi có một đoạn mã HTML.

<script language="cpp" id="cppScriptBlock" EntryPoint="main"> 
    int main() { 
     cout << "<h1>CPPHeader</h1>"; 
    } 
</script> 

<script language="java" id="javaScriptBlock" EntryPoint="MyJavaClass"> 
    public class MyJavaClass { 
     public final void main() { 
      java.lang.System.out.println("<h1>JavaHeader</h1>"); 
     } 
    } 
</script> 

<script language="csharp" id="csharpScriptBlock" EntryPoint="MyCSharpClass "> 
    public class MyCSharpClass { 
     public static void Main() { 
      System.Console.WriteLine("<h1>CSharpHeader</h1>"); 
     } 
    } 
</script> 


<script language="javascript"> 
    $("#cppScriptBlock").compileAndRun(); 
    $("#javaScriptBlock").compileAndRun(); 
    $("#csharpScriptBlock").compileAndRun(); 
</script> 

Và cuối cùng tạo ra HTML sau

<h1>CPPHeader</h1> 
<h1>JavaHeader</h1> 
<h1>CSharpHeader</h1> 

Có thể?

Alex

+3

Có, nó có thể được thực hiện. Tôi phải chúc bạn may mắn, mặc dù. :) –

+4

Tôi sẽ chỉ để lại điều này tại đây: http://bellard.org/jslinux/ –

+1

Xem https://github.com/gpjt/webgl-lessons/blob/master/example01/index.html để biết ví dụ về WebGL. Các chương trình GLSL (ngôn ngữ tô bóng) được viết trong các khối tập lệnh. –

Trả lời

0

Có nó có thể. Tuy nhiên, sẽ dễ dàng hơn nhiều nếu bạn viết một trình thông dịch chuyển đổi từ một ngôn ngữ này thành Javascript và sau đó có khả năng xử lý trình duyệt và thực thi mã byte.

7

Có, nhưng có rất nhiều việc bạn phải làm. Cũng giống như một trình biên dịch thực, bạn phải phân tích mã, chuyển đổi nó thành mã trung gian, vv Sau đó, bạn sẽ phải mô phỏng môi trường bao gồm tất cả các thư viện thời gian chạy kèm theo các ngôn ngữ đó. Trong ngắn hạn, nó không thực tế, nhưng nó là có thể.

+0

Chuyển đổi thành "mã trung gian" ngụ ý tôi cần một "Máy ảo" được xây dựng với Javascript để chạy mã trung gian, phải không? –

+0

@ Alex: Đó là những gì tôi đã giả định bạn sẽ làm. Hầu hết các trình biên dịch (và một số lượng lớn các trình thông dịch) cũng tạo ra mã trung gian tại một số điểm. Cho dù đó là outputted, thực hiện, hoặc chuyển đổi khác nhau, nhưng hầu hết các trình biên dịch có một bước phổ biến của việc tạo ra một cái gì đó tương tự như mã trung gian. – icktoofay

7

Có, Javascript là Turing Complete. Bạn có thể viết mã bất kỳ thứ gì trong đó mà bạn có thể viết bằng bất kỳ ngôn ngữ nào. Tất nhiên bao gồm các trình biên dịch. Tôi không thể tưởng tượng bất kỳ lý do nào để làm điều này mặc dù. Nếu bạn đủ giỏi Javascript để viết một trình biên dịch vào nó, bạn có thể chỉ muốn viết mã của bạn bằng javascript thay vì một ngôn ngữ khác.

+2

Đồng ý với bạn. Thực tế, tôi sẽ không làm điều đó. Tôi chỉ quan tâm đến khả năng xây dựng trình biên dịch với Javascript. Ý tưởng là để kết hợp ngôn ngữ lập trình. –

+3

cũng giống như nói với một nghệ sĩ rằng nếu anh ta/cô ấy đủ tốt để vẽ một bức tranh của một người nào đó vẽ một bức tranh về một con mèo, anh ấy/cô ấy chỉ nên vẽ một con mèo. nếu nghệ sĩ muốn vẽ, hãy để nghệ sĩ vẽ. chỉ cần không nói cho họ biết GÌ để sơn. – unsynchronized

2

Xem Metacompiler tutorial về cách viết trình biên dịch tùy ý (và trình biên dịch comper) nói chung, sử dụng Javascript làm ngôn ngữ triển khai.

16

Có, rất có thể sử dụng Jison.

Nó tạo trình phân tích cú pháp JavaScript dựa trên cấu trúc ngôn ngữ bạn xác định.

Jison có ngữ pháp không có ngữ cảnh khi nhập và xuất ra JavaScript tệp có khả năng phân tích ngôn ngữ được mô tả bằng ngữ pháp đó. Sau đó, bạn có thể sử dụng tập lệnh được tạo để phân tích đầu vào và chấp nhận, từ chối, hoặc thực hiện các tác vụ dựa trên dữ liệu nhập.

- từ documentation

PS: CoffeeScript! cũng được tạo ra bằng cách sử dụng này. :)

1

Có, điều đó là có thể. Nhưng thay vì viết trình phân tích cú pháp của bạn bằng tay, tôi sẽ khuyến khích bạn sử dụng trình tạo trình phân tích cú pháp tốt.

Ví dụ: ANTLR bởi Terence Parr là trình tạo trình phân tích cú pháp rất mạnh mẽ có a JavaScript target.Nó hoạt động trong các môi trường hỗ trợ ECMAScript 5.1. (được thử nghiệm trong Firefox, Safari, Chrome, Internet Explorer và Node.js). Nó là mã nguồn mở (giấy phép BSD) với tài liệu mở rộng và một cuốn sách rất hay.

Sử dụng công cụ như thế này, thay vì viết trình phân tích cú pháp của riêng bạn, bạn viết một ngữ pháp và trình phân tích cú pháp được tạo cho bạn.

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