Bạn đã đọc được suy nghĩ của tôi.
Khi tôi tham gia một khóa học trình biên dịch, một vài năm trước, tôi phát hiện ra rằng nếu bạn lấy AST và tuần tự hóa nó, với ký hiệu tiền tố thay vì ký hiệu infix thông thường và sử dụng dấu ngoặc đơn để phân định toàn bộ câu lệnh, bạn sẽ nhận được Lisp. Trong khi tôi đã học về Scheme (một phương ngữ của Lisp) trong các nghiên cứu đại học của tôi, tôi chưa bao giờ thực sự đạt được sự đánh giá cao về nó. Tôi chắc chắn đã đạt được sự đánh giá cao đối với Lisp và phương ngữ của nó, là kết quả của khóa học đó.
Vấn đề với những gì bạn đề xuất:
thật khó / chậm để soạn AST trong môi trường đồ họa. Rốt cuộc, hầu hết chúng ta có thể gõ nhanh hơn chúng ta có thể di chuyển một con chuột. Chưa hết, một câu hỏi mới nổi là "làm thế nào để bạn viết mã chương trình với máy tính bảng?" Gõ trên máy tính bảng chậm / cồng kềnh, so với bàn phím / máy tính xách tay có bàn phím phần cứng. Nếu bạn có thể tạo AST bằng cách kéo và thả các thành phần từ bảng màu lên khung vẽ trên màn hình lớn, lập trình thiết bị màn hình cảm ứng trên máy tính bảng có thể trở thành một điều thực sự.
vài / không có công cụ hiện có của chúng tôi hỗ trợ này. Chúng tôi có nhiều thập kỷ phát triển trong việc tạo ra các IDE ngày càng phức tạp và các biên tập viên ngày càng thông minh. Chúng tôi có tất cả các công cụ này để định dạng lại văn bản, so sánh văn bản, tìm kiếm văn bản. Đâu là các công cụ có thể thực hiện tương đương với tìm kiếm biểu thức chính quy trên cây? Hay một khác biệt của hai cây? Tất cả những điều này được thực hiện dễ dàng với văn bản. Nhưng họ chỉ có thể so sánh các từ. Thay đổi tên biến, sao cho các từ khác nhau nhưng ý nghĩa ngữ nghĩa là như nhau và các công cụ tìm khác biệt đó gặp rắc rối. Các công cụ như vậy, được phát triển để hoạt động trên AST thay vì văn bản, sẽ cho phép bạn tiến gần hơn đến việc so sánh ý nghĩa ngữ nghĩa. Đó sẽ là một điều tốt.
trong khi việc biến mã nguồn chương trình thành AST tương đối dễ hiểu (chúng ta có trình biên dịch và trình thông dịch, phải không?), biến AST thành mã chương trình không được hiểu rõ lắm. Nhân hai số nguyên tố để có được một số tổng hợp lớn, tương đối đơn giản nhưng việc tìm ra một số tổng hợp lớn trở lại các số nguyên tố khó khăn hơn nhiều; đó là nơi chúng ta đang phân tích cú pháp so với dịch ngược AST. Đó là nơi mà sự khác biệt giữa các ngôn ngữ trở thành một vấn đề. Ngay cả trong một ngôn ngữ cụ thể, có nhiều cách để dịch ngược AST. Lặp lại thông qua một bộ sưu tập các đối tượng và nhận được một số loại kết quả, ví dụ. Sử dụng một vòng lặp for, lặp qua một mảng? Đó sẽ là nhỏ gọn và nhanh chóng, nhưng có những hạn chế. Sử dụng một Iterator của một số loại, hoạt động trên một bộ sưu tập? Bộ sưu tập đó có thể có kích thước thay đổi, giúp tăng thêm tính linh hoạt với chi phí (có thể) về tốc độ. Bản đồ / Giảm? Phức tạp hơn, nhưng ngầm hiểu song song. Và đó chỉ là dành cho Java, tùy thuộc vào sở thích của bạn.
Theo thời gian, nỗ lực phát triển sẽ được mở rộng và chúng tôi sẽ phát triển bằng cách sử dụng màn hình cảm ứng và AST. Đánh máy sẽ trở nên ít cần thiết hơn. Tôi thấy đó là một sự tiến bộ hợp lý từ nơi chúng ta đang ở, nhìn vào cách chúng ta sử dụng máy tính, ngày nay, Điều đó sẽ giải quyết # 1.
Chúng tôi đã làm việc với cây. Lisp chỉ đơn thuần là các AST được tuần tự hóa. XML (và HTML, bởi phần mở rộng) chỉ là một cây được tuần tự hóa. Để thực hiện tìm kiếm, chúng tôi đã có một vài nguyên mẫu: XPath và CSS (tương ứng cho XML và HTML). Khi các công cụ đồ họa được tạo cho phép chúng tôi tạo các bộ chọn và sửa đổi kiểu CSS, chúng tôi sẽ giải quyết được phần 2. Khi các bộ chọn đó có thể được mở rộng để hỗ trợ các biểu thức chính quy, chúng tôi sẽ tiến gần hơn. Vẫn đang tìm kiếm một công cụ khác biệt đồ họa tốt để so sánh hai tài liệu XML hoặc HTML. Khi mọi người phát triển các công cụ đó, # 2 sẽ có thể được giải quyết. Mọi người đã làm việc trên những thứ đó; họ chỉ không có ở đó, chưa.
Cách duy nhất tôi có thể thấy để có thể dịch ngược các AST đó thành văn bản ngôn ngữ lập trình sẽ là thứ gì đó tìm kiếm mục tiêu. Nếu tôi sửa đổi mã hiện có, mục tiêu có thể đạt được bằng thuật toán làm cho mã được sửa đổi của tôi giống với mã bắt đầu nhất (khác biệt văn bản tối thiểu). Nếu tôi viết mã từ đầu, mục tiêu có thể là mã nhỏ nhất, chặt nhất (có thể là vòng lặp for). Hoặc nó có thể là mã song song hiệu quả nhất có thể (có thể là bản đồ / thu nhỏ hoặc thứ gì đó liên quan đến CSP). Vì vậy, cùng một AST có thể dẫn đến mã khác nhau đáng kể, ngay cả trong cùng một ngôn ngữ, dựa trên cách đặt mục tiêu. Phát triển một hệ thống như vậy sẽ giải quyết # 3. Nó sẽ phức tạp về mặt tính toán, có nghĩa là chúng ta có thể cần một số kiểu sắp xếp máy khách-máy chủ,