2010-10-13 34 views
13

Tôi cần phải thực hiện một thông dịch viên cho một ngôn ngữ lập trình như là một phần của dự án tôi đang làm việc. Tôi không nghĩ rằng các chi tiết của dự án này quá liên quan, ngoại trừ việc yêu cầu tôi thực hiện một thông dịch viên từ đầu, tôi không thể sử dụng ngôn ngữ lập trình hiện có (các yêu cầu bao gồm hỗ trợ tiếp tục phân tách bằng tay và có thể viết thông dịch viên cho nó trong Javascript, và cũng trong Java).Ngôn ngữ lập trình nào có trình thông dịch dễ thực hiện nhất?

Rõ ràng là tôi thực sự không muốn phát minh ra một ngôn ngữ lập trình hoàn toàn mới, vì vậy tôi hy vọng có một số ngôn ngữ rất đơn giản mà tôi có thể sao chép hoặc ít nhất là lấy cảm hứng từ đó.

Suy nghĩ đầu tiên của tôi là Ngôn ngữ giống như ngôn ngữ Lisp thô sơ, tuy nhiên tôi thực sự thích ngôn ngữ có cú pháp gần hơn với các ngôn ngữ lập trình phổ biến hơn như Java, Python hoặc Ruby. Đặc biệt, điều này có nghĩa là hỗ trợ các toán tử infix (a + b), và cũng gán a = b cho các biến.

Nói một cách khác, tôi muốn ngôn ngữ này cảm thấy quen thuộc với những người lập trình PHP ngày hôm nay, và tôi không tin Forth hoặc Lisp đáp ứng được tiêu chí này.

Có ai có thể đưa ra bất kỳ đề xuất nào cho ngôn ngữ đó không?

+5

-1 vì muốn làm giống như PHP;) Hãy nhét nó vào chồi. – ocodo

+1

Tôi không muốn làm một PHP-như nhau, tôi chỉ wanat để làm cho một cái gì đó hợp lý quen thuộc với những người lập trình trong PHP. – sanity

Trả lời

10

Điều này nghe giống như một công việc cho Lua.

  • Đó là một ngôn ngữ nhỏ, được thiết kế để đơn giản để thực hiện
  • Đã có nhiều implementations trong Java và ít nhất các công trình cơ bản dở dang cho Javascript.
  • Cú pháp của nó đáp ứng các yêu cầu của bạn (bài tập, toán tử kết xuất).

Công việc bạn đã để lại là triển khai các tiếp tục được giới hạn, nhưng bạn đã biết rằng khi bạn loại trừ Lisp/Scheme.

14

Tôi nghĩ rằng Lisp và Forth có một số trình thông dịch ngây thơ dễ nhất.

Bạn có thể chọn ngôn ngữ động đơn giản và phần khó nhất sẽ xây dựng trình phân tích cú pháp. Ví dụ: một tập hợp con JavaScript có thể hoạt động. Trình thông dịch cơ bản đi ngang qua AST và thực hiện các thao tác của mỗi nút.

Trong mọi trường hợp, hãy nghiên cứu các ngôn ngữ kịch bản hiện có có thể được nhúng vào môi trường phát triển của bạn và tránh tự mình lăn bằng mọi giá. Việc thực hiện các trình biên dịch (theo nghĩa rộng) là rất thú vị để làm, nhưng nó có thể tốn kém để duy trì trong thời gian dài.

+0

Tôi đã loại trừ lisp và không may vì những lý do được mô tả trong câu hỏi của tôi. – sanity

+2

tại sao không làm cho một lisp với cú pháp infix? điều đó không thực sự khó khăn. – nickik

3

Brainfuck? Tôi có nghĩa là nó chỉ có 8 lệnh mà mỗi bản đồ cho một nhân vật duy nhất.

+0

Đã làm một trong số đó một vài tuần trước ... thật vui.Có một vài phần mở rộng như pbrain mà thêm vào dự án là tốt. Tôi nghĩ sẽ thú vị khi viết một trình biên dịch JIT tối ưu cho nó, nhưng sau đó tôi bị phân tâm bởi công việc ... –

+0

Vâng, tôi cho rằng nó không trả lời đầy đủ câu hỏi khi bạn xem xét "cố gắng thiết kế một ngôn ngữ cho mọi người để thực sự sử dụng "phần;) –

+0

@sanity, nó không phải. Nó được thiết kế để cho phép trình biên dịch nhỏ nhất có thể cho một ngôn ngữ lập trình hoàn chỉnh Turing. –

2

Tạo trình thông dịch LISP trước, đây sẽ là tương đối đơn giản.

Bạn sẽ đạt được nhiều kinh nghiệm trong phân tích cú pháp ngôn ngữ, mà không bị cản trở bởi các yêu cầu tính năng bổ sung.

+0

Tôi đã loại trừ Lisp vì những lý do được giải thích trong câu hỏi của tôi. – sanity

+2

Tôi biết, tuy nhiên tôi vẫn muốn khuyến khích bạn làm điều này, vì tôi giả định đây sẽ là phiên dịch ngôn ngữ đầu tiên của bạn, và tôi nghĩ có nhiều thứ hơn để đạt được từ việc xây dựng một ngôn ngữ tương đối dễ phân tích cú pháp. của ngôn ngữ bạn muốn người khác sử dụng. Đừng lo lắng về điều đó ở giai đoạn này, xây dựng một cái gì đó mà bạn có thể học hỏi từ. Chưa kể rằng một cuộc cãi vã nhanh quanh Reddit và YCombinator tiết lộ rằng Lisp hầu như không được ưa chuộng vào lúc này. – ocodo

+0

Bạn có nghĩ Paul Graham có thể có liên quan đến LISPers tụ tập quanh YCombinator không? = P –

2

Tôi giả định này là càng nhiều một bài tập cho sự soi sáng của riêng bạn như một mong muốn cho một sản phẩm cuối cùng hữu ích.

Trong trường hợp đó, tôi phải đồng ý với những người khác đã đề xuất các biến thể trên ngôn ngữ giống như Lisp, ít nhất là cho lần đầu tiên, đặc biệt là nếu bạn chưa làm điều này trước đây.

Lua là ngôn ngữ kịch bản khá phổ biến cho loại điều này yêu cầu các tập lệnh người dùng nhỏ, không đặc biệt hiệu năng.

Bạn cũng có thể xem xét liệu chính javascript (hoặc tập hợp con) có đáp ứng các yêu cầu của bạn hay không.

Cũng tham khảo danh sách tại đây: http://en.wikipedia.org/wiki/Continuation#Programming_language_support

0

tôi khuyên bạn nên bắt đầu với một tập hợp con của lisp - về cơ bản xe, cdr, khuyết điểm, và báo giá.Hãy chắc chắn rằng bạn có một máy quét cơ bản xử lý các ký tự không hợp lệ, và sau đó các loại không hợp lệ (như khuyết điểm yêu cầu 2 args, thứ 2 phải là một danh sách). Bạn có thể làm được điều này với kiến ​​thức về cấu trúc dữ liệu cơ bản (danh sách liên kết một mình có thể làm điều đó, nhưng liên kết hoặc vòng tròn gấp đôi thì tốt hơn nhiều).

8

Tcl. Cú pháp đơn giản như Lisp, và nó có expr proc cho số học infix. Nó thậm chí còn sử dụng {} cho các khối vì vậy nếu bạn nheo mắt vừa phải, bạn có thể nói với mọi người đó là một ngôn ngữ giống như C.

Nó không có bài tập trộn a=b, nhưng khi bạn bắt đầu đi xuống đường ký hiệu chung, ngôn ngữ trở nên thực sự phức tạp rất nhanh, vì vậy tôi không chắc cách nó tương thích với các yêu cầu khác của bạn.

+1

Tôi muốn +1 câu trả lời TCL, nhưng việc viết một thông dịch viên TCL đầy đủ không thực sự dễ dàng như vậy. Bạn có thể nhận được một lõi khiêm tốn của ngôn ngữ khá đơn giản, nhưng TCL chứa nhiều ngôn ngữ phụ, ví dụ, lệnh expr bạn đề cập đến. bất kỳ chương trình thực nào phải hỗ trợ expr, bởi vì nó xuất hiện trong lệnh if, vì vậy bạn thực sự phải thực hiện một ngôn ngữ giống như C trên đỉnh của shell như ngôn ngữ là endlalog TCL – SingleNegationElimination

+0

Vâng, anh ta đã nói "hoặc ít nhất là vẽ cảm hứng từ ", và khả năng tương thích Tcl không phải là một yêu cầu khó khăn. Ngoài ra, vì 'expr' trông khá giống với bất kỳ proc nào khác, nó không cần phải được triển khai đầy đủ ngay lập tức, giống như trong hầu hết các ngôn ngữ (phức tạp hơn). Tôi nghĩ bạn thậm chí có thể viết nó trong chính Tcl, và chia sẻ nó giữa hai người phiên dịch mà anh ta cần viết! – Ken

+0

@Token: Tôi cũng sẽ thêm rằng các ngôn ngữ phụ đó cụ thể cho các lệnh được đề cập. Việc triển khai trình phân tích cú pháp/thông dịch viên cho ngôn ngữ thật dễ dàng. Thực hiện tất cả các lệnh cốt lõi ... ít hơn như vậy. Mặc dù, nếu bạn nhìn vào wiki, bạn có thể tìm thấy việc triển khai nhiều lệnh bằng các lệnh khác, đơn giản hơn. – RHSeeger

4

Logo là ngôn ngữ đơn giản giống như Lisp không có dấu ngoặc đơn và vài trăm lần triển khai.

Logo information on Wikipedia.

Xem tệp PDF này để biết thông tin về triển khai: Logo tree.

0

Bạn có thể sử dụng một tập hợp con Lisp và vẫn có một ký hiệu hơn tự nhiên nếu bạn sử dụng ngọt-biểu thức, hoặc ít nhất là xoăn-ghi vào ký hiệu:

  • Quăn-ghi vào thêm ghi vào , bằng cách đọc {a + b} as (+ ab), và hỗ trợ ký pháp chức năng truyền thống như f (x). Xem thêm trong SRFI-105.

  • Biểu thức ngọt được xây dựng trên hình thức xoắn và thêm thụt lề có liên quan đến cú pháp. Xem thêm tại SRFI-110. URL của nó là http://srfi.schemers.org/srfi-110/ (đối với SRFI-105, chỉ thay thế "110" bằng "105").

Cả hai đã được thực hiện bởi các Readable Lisp S-biểu thức dự án: http://readable.sourceforge.net/

Thưởng thức!

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