Có thể biên dịch một ngôn ngữ cấp cao hơn để C ++ có thể đọc được không? [đóng cửa]


12

C ++ là một ngôn ngữ tuyệt vời theo nhiều cách, nhưng một số thứ đặc biệt là cồng kềnh để viết mà không có IDE. Là người dùng VIM, sẽ rất thú vị nếu tôi có quyền truy cập vào ngôn ngữ cấp cao hơn cho phép tôi viết C ++ bằng S-Expressions và có thể với các macro giống như Lisp, cho phép tạo mã sạch trong khi tránh viết lại cùng một patters lặp đi lặp lại.

Tôi đã hỏi trên freenode và đã thử nghiệm một số ý tưởng, chẳng hạn như biên dịch Lisp-> C với các trình biên dịch như ECL và Bigloo, nhưng không có ý tưởng nào tạo ra mã C đặc biệt sạch.

Có bất kỳ công trình về vấn đề này?


3
Tại sao không viết mã của bạn thành một macro với các macro như vậy đó là tất cả C ++ và sau đó là các tính năng mà bạn muốn nhưng khó có thể làm sạch chỉ bằng một macro LISP từ một cú pháp đơn giản sang C ++ phức tạp hơn. Tốt hơn nữa, bạn chỉ có thể viết mã của mình trong LISP. :)
Jimmy Hoffa

2
Bạn có mong đợi bản dịch Lisp -> C ++ tạo mã C ++ sạch, khi C ++ (> đơn giản hơn) có thể tạo ra hội đồng không thể đọc được (một vấn đề về ý kiến) không? Ai là mục tiêu của việc biên soạn có ý nghĩa cho dù sao?

1
Bằng cách nào đó tôi không hoàn toàn tin rằng bất kỳ ai đã viết macro để mở rộng chính xác những gì bạn muốn mở rộng, nhưng vì macro quy tắc rất đơn giản để viết, chúng chỉ là phương pháp xử lý danh sách, bạn không gặp nhiều khó khăn khi chỉ viết tất cả bên trong một biểu thức s mà bạn phân định khi bạn muốn bộ mở rộng macro chú ý, sau đó chỉ cần in danh sách để lấy mã C ++ của bạn với bản mở rộng.
Jimmy Hoffa

2
Tôi đồng ý rằng Lisp có thể làm một số việc khó trong C ++ (như đóng cửa). Bạn có cần phải làm những điều đó? Sau đó, vì chúng khó thực hiện trong C ++, bất kể bạn đưa chúng vào C ++ như thế nào, tự động hay thủ công, nó sẽ không đẹp. Gợi ý của tôi: Nếu bạn không thực sự thực sự cần những điều khó khăn mà Lisp có thể làm, đừng sử dụng Lisp. Học giỏi C ++. Nếu bạn phải sử dụng những thứ đó, nhưng bạn phải viết mã trong C ++, sau đó tìm ra cách thực hiện trong C ++. Đó là những gì tách biệt người lớn với trẻ em trong doanh nghiệp này.
Mike Dunlavey

3
Có một số ngôn ngữ có trình biên dịch phát ra mã C, vì vậy tôi không hiểu tại sao điều này không khả thi, ngay cả khi đó là mã C ++ giống như C ++. Nếu câu hỏi của bạn là "tôi có thể lấy mã C ++ chuẩn, thực hành tốt nhất bằng cách sử dụng tất cả các tính năng có sẵn trong C ++ không", điều đó có thể khó hơn một chút.
Robert Harvey

Câu trả lời:


13

Biên dịch các ngôn ngữ cấp cao hơn cho các ngôn ngữ cấp thấp hơn là bánh. Có vô số ví dụ về nó đang được thực hiện. Không cần tiếp tục phát triển, chúng ta có thể chỉ ra các trình biên dịch C ++ sớm được biên dịch thành C.

Tuy nhiên, khi bạn bắt đầu ném "sạch" và "có thể đọc được" vào hỗn hợp, mọi thứ trở nên thực sự khó khăn. Mã sạch, dễ đọc thể hiện ý nghĩaý định của những gì bạn đang viết. Máy tính nổi tiếng là xấu trong việc giải thích và tạo ra ý nghĩa. Bạn có nhiều khả năng kết thúc với các biến được đặt tên int_147hơn input_buffer_length. Chắc chắn, nếu bạn thực sự muốn làm cho dự án này hoạt động, bạn có thể tham gia vào một dự án AI khổng lồ để xử lý việc chuyển đổi Lisp của bạn thành một loại C ++ dễ đọc nào đó, nhưng thành thật mà nói, các trình biên dịch Lisp thông thường rất giỏi trong những gì họ làm .

Quan trọng hơn khó khăn trong việc tạo C ++ từ Lisp là tính hữu ích của việc này. Mục đích nào nó sẽ phục vụ cho C ++ được tạo ra để có thể đọc được? Nếu Lisp là mã nguồn của bạn, các biểu diễn trung gian sẽ không liên quan. Nếu bạn muốn có thể trao C ++ cho các lập trình viên không hiểu Lisp gốc của bạn, thì bây giờ bạn đã gặp một vấn đề khác . Điều gì xảy ra khi họ muốn sửa đổi C ++ được tạo của bạn? Điều gì xảy ra nếu họ viết những thứ trong C ++ mà không dịch rõ ràng sang Lisp của bạn?

Hãy nói rằng chúng tôi đã giải quyết điều đó. Một thập kỷ sau và, sau khi đốt hàng trăm triệu đô la tiền cấp DoD, chúng tôi đã xây dựng công cụ dịch ngôn ngữ khổng lồ, phức tạp (nhưng hoàn hảo) này có thể biến Lisp thành C ++ thành ngữ và ngược lại. Những gì chúng ta đã thực sự đạt được sẽ không được hoàn thành tốt hơn bằng cách dạy cho mọi người một ngôn ngữ lập trình mới hoặc chỉ phát triển một trình biên dịch mới cho phép chúng ta liên kết hai ngôn ngữ?

Ô đúng rồi. Sếp của bạn muốn bạn viết C ++ còn bạn thì không. Cập nhật sơ yếu lý lịch của bạn và tìm một công việc mới.


Tôi ước tôi có thể cập nhật sơ yếu lý lịch của mình và tìm một công việc khác. Thật không may, điều đó không đơn giản khi công việc = "sinh viên" và ông chủ = "giáo sư". Và thật không may, tôi phải có bằng tốt nghiệp. Bất kể thực tế tôi không đến lớp, mà tự học ở nhà. Thực tế tôi đã làm việc trong ngành và kiếm được nhiều tiền hơn hầu hết sinh viên tốt nghiệp mà tôi biết. Đó chỉ là cách nó hoạt động. Thật đáng buồn. Hạnh phúc là prof của tôi chấp nhận vượt qua tôi nếu tôi viết một cái gì đó phức tạp trong C ++. Tôi đã biết C ++. Vì vậy, tôi thà mất cơ hội để học một cái gì đó khác nhau (;.. Rant sang một bên, câu trả lời tuyệt vời Cảm ơn
MaiaVictor

@Dokkat: Tôi không tin bạn biết C ++. Bạn có thể viết các mẫu với các triển khai đặc biệt tùy thuộc vào việc tham số có một số phương thức hoặc hàm không? Bạn đã thực hiện tính toán thời gian biên dịch bằng Boost.MPL chưa? Bạn có hiểu cách Boost.ForEach hoạt động không? Nếu bạn phải làm điều đó trong C ++, hãy coi đó là cơ hội để tìm hiểu C ++ nâng cao hơn. Nó sẽ có ích hơn cho công việc của bạn quá.
Jan Hudec

1
Vâng, tôi đã thực hiện một số mẫu khá phức tạp khi tôi làm việc với C ++ những năm buồn đó. Vâng, tôi đã sử dụng Boost.ForEach rất nhiều, tôi nhớ việc xác định rất nhiều macro để làm cho nó hữu ích hơn mặc dù. Dù sao tôi là một đứa trẻ, đó không phải là một trải nghiệm thú vị. Tôi không có ý định học thêm nữa, khi Lisp cung cấp một hệ thống vĩ mô vững chắc hơn, ít đau đớn hơn, để thực hiện chính xác kiểu siêu lập trình mà C ++ yêu cầu các kỹ năng chuyên nghiệp.
MaiaVictor

3

Câu trả lời ngắn gọn, hiện tại không có gì giúp bạn chuyển đổi Lisp thành READABLE C ++. Chắc chắn bạn có thể chuyển đổi bất cứ thứ gì sang C ++ hoặc C nhưng mã có thể đọc được viết bởi con người, không phải chương trình. Chắc chắn bạn có thể xuất mã C ++ với định dạng thích hợp, thụt lề, tên lớp đẹp và thậm chí có thể bằng cách nào đó có được bản dịch hoàn hảo từ các đối tượng lớp Lisp sang các lớp C ++. Có lẽ bạn có thể khiến các phụ thuộc thư viện của mình được liên kết vừa phải và có thể bạn có thể biên dịch các tệp nhị phân rất gần với ngôn ngữ C sẽ tạo ra nếu bạn viết toàn bộ bằng C. Nhưng cuối cùng, mã có thể đọc được là một vẻ đẹp không thể hiểu được bởi bất cứ ai, ít nhất là chưa, và có thể không bao giờ xem xét thuật ngữ đó có thể đọc được là khá chủ quan để bắt đầu và những gì có thể được coi là dễ đọc giữa một nhóm các nhà phát triển có thể bị những người khác coi là tàn bạo.

Để làm cho C ++ dễ đọc, bạn phải viết bằng C ++, không phải bằng Lisp. Bạn cũng phải có khả năng thay đổi phong cách mã hóa của mình theo những gì những người sẽ đọc mã của bạn sẽ hiểu rõ nhất. Cũng giống như sách, các chương trình được viết với một đối tượng cụ thể trong tâm trí và có thể đẹp và cảm động nếu được viết tốt, và bị xáo trộn và tẻ nhạt nếu không. Và nếu chúng tôi không thể đưa ra một chương trình viết tiểu thuyết viễn tưởng đẹp cho chúng tôi, thì chúng tôi sẽ không thể đưa ra một cái gì đó để chuyển đổi thành C ++ có thể đọc được.


Tôi đoán bạn đang đọc quá những gì tôi muốn nói với "có thể đọc được"! Nó không phải là thực sự đẹp. Chỉ cần đủ để bạn có thể đọc nó và hiểu những gì đang xảy ra. Tôi đoán tôi sẽ đi với một số macro Lisp để dịch trực tiếp, như JimmyHoffa đã gợi ý về các bình luận.
MaiaVictor

3

ViM là một IDE tuyệt vời cho C ++. Nó có sự hoàn thành tốt nhất mà tôi từng thấy cho đến nay, mặc dù nó hơi chậm nếu bạn lấy được nhiều tiêu đề, tiếng kêu hoàn chỉnh . Và để biên dịch, tôi thấy tất cả các IDE đều thiếu; bạn kết thúc bằng cách viết hệ thống xây dựng trong CMake hoặc một cái gì đó. Và tôi đã không thấy bất cứ điều gì để cung cấp bất kỳ trợ giúp cho lisp, thời gian.

Đúng, C ++ không có macro kiểu lisp, nhưng các mẫu có thể làm mọi thứ macro hợp vệ sinh có thể và một số thứ khác, bởi vì bạn có thể triển khai chúng khác nhau dựa trên các loại và dựa trên khả năng của chúng. Thật vậy, việc thiếu bộ thu gom rác khiến việc đóng cửa trở nên tẻ nhạt hơn một chút, nhưng thành ngữ RAII được sử dụng để quản lý tài nguyên thay vào đó có những ưu điểm và thuộc tính thú vị riêng.

Nếu bạn là sinh viên, bạn có thực sự biết tất cả C ++ nâng cao không? Từ thư viện thuật toán qua việc viết các mẫu với các triển khai thay thế dựa trên các thuộc tính của các loại đối số, biên dịch tính toán thời gian bằng cách sử dụng lập trình meta mẫu (sử dụng Boost.MPL) để hiểu cách Boost hoạt động dưới mui xe? Nếu không, tôi khuyên bạn nên coi đây là cơ hội để tìm hiểu một số C ++ nâng cao. Việc phân công trường học sẽ không cần phải được duy trì, vì vậy bạn có thể chơi với ngôn ngữ để xem các tính năng có giá trị ở đâu trong mã sản xuất mà bạn phải cẩn thận về khả năng đọc.


Và để trả lời câu hỏi trực tiếp cuối cùng: C ++ có rất nhiều thành ngữ dưới vành đai của nó đến nỗi không có cách nào để tạo ra C ++ thành ngữ từ bất cứ điều gì. Đơn giản vì sẽ không có cách nào để diễn đạt hầu hết những thành ngữ đó trong bất cứ điều gì khác. Bắt đầu từ thực tế là bất cứ thứ gì sẽ thu gom rác sẽ phân bổ mọi thứ trên heap trong khi trong C ++, việc tận dụng lợi thế của ngăn xếp là vô nghĩa.


Đồng ý về VIM. Nó phù hợp như một chiếc găng tay cho sự phát triển C. Tôi là người dùng Vim nhưng đối với Lisp tôi sử dụng Emacs ở chế độ ác với SLIME và Paredit. Có một số hỗ trợ cho Lisping in vim với các móc REPL cơ bản nhưng chúng không đến gần SLIME.
mike30
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.