Lập trình * thành * một ngôn ngữ so với viết mã C trong Ruby


10

Code Complete tuyên bố rằng bạn nên chuyển mã thành một ngôn ngữ trái ngược với mã trong đó. Điều đó có nghĩa là

Đừng giới hạn tư duy lập trình của bạn chỉ với các khái niệm được ngôn ngữ của bạn hỗ trợ tự động. Các lập trình viên giỏi nhất nghĩ về những gì họ muốn làm, và sau đó họ đánh giá cách hoàn thành mục tiêu của họ với các công cụ lập trình theo ý của họ. (chương 34.4)

Điều này không dẫn đến việc sử dụng một phong cách lập trình trong mọi ngôn ngữ ngoài kia, bất kể điểm mạnh và điểm yếu cụ thể của ngôn ngữ đó là gì?

Hoặc, để đặt câu hỏi ở định dạng dễ trả lời hơn:

Bạn có đề xuất rằng mọi người nên cố gắng mã hóa vấn đề của mình một cách gọn gàng nhất có thể bằng các chi tiết của ngôn ngữ của một người, hay bạn nên tìm kiếm giải pháp thanh lịch nhất, ngay cả khi điều đó có nghĩa là bạn cần thực hiện các cấu trúc khó xử không tồn tại nguyên bản trong ngôn ngữ của ai?


5
+1 câu hỏi hay. Tôi có thể viết bằng Perl bằng nửa tá ngôn ngữ khác nhau vào thời điểm này.
Dan Ray

@Dan Ray - lạ thật! Tôi luôn viết C bằng Perl.
James Anderson

Câu trả lời:


7

Có một cách tiếp cận thậm chí tốt hơn: quên đi ngôn ngữ lập trình cố định thảm hại của bạn. Mã hóa vấn đề của bạn bằng ngôn ngữ bạn vừa phát minh, xuất phát từ chính các điều khoản của miền vấn đề có liên quan, mã hóa nó một cách tự nhiên nhất có thể và sau đó chỉ nghĩ đến việc triển khai ngôn ngữ lập trình mới này hoặc làm giảm mã của bạn xuống các giới hạn của ngôn ngữ hiện có.

Cách tiếp cận này được gọi là lập trình hướng ngôn ngữ . Có nhiều kỹ thuật triển khai các ngôn ngữ dành riêng cho tên miền một cách hiệu quả và đó là một chủ đề đặc biệt nóng đối với cộng đồng Ruby.


1
Cộng đồng Haskell cũng chấp nhận các ngôn ngữ dành riêng cho tên miền và ngôn ngữ lập trình Haskell đặc biệt phù hợp để triển khai chúng.
tdammers

Việc triển khai một hệ thống kịch bản được thiết kế riêng dựa trên ngôn ngữ nhúng như Lua hay Tkl có được coi là viết DSL không? Nếu vậy, làm thế nào để bạn đối phó với sự thiếu hụt của ví dụ như Lua?
bastibe

@Paperflyer, trong một số trường hợp, việc triển khai các ngôn ngữ trên Lua (đặc biệt nếu là Metalua), nhưng sẽ dễ dàng hơn để viết một trình biên dịch phù hợp cho hầu hết các DSL điển hình.
SK-logic

@tdammers, vâng, Haskell và Scala đều nói về DSL. Nhưng tôi đến từ mặt tối của Thần lực: cách tiếp cận ưa thích của tôi là siêu lập trình. Tôi tin rằng các thông dịch viên ad hoc hầu như luôn thua kém các trình biên dịch.
SK-logic

2
@tdammers, DSL được triển khai trên các chức năng bậc cao, trên thực tế, là một trình thông dịch ad hoc. Bạn không thể mở rộng cú pháp Haskell giống như cách bạn sẽ mở rộng, giả sử, Lisp. Ngay cả với Mẫu Haskell. Đó là một cách hoàn toàn khác (và, tôi muốn nói, một cách hạn chế) trong việc triển khai DSL. Trong nhiều trường hợp, nó ổn, nhưng đối với bất kỳ điều gì thực sự phức tạp, nó sẽ dẫn đến việc triển khai hoàn toàn không thể đọc được, trong khi đó, siêu lập trình nhiều giai đoạn chỉ là chuyện nhỏ, cho dù DSL của bạn có lớn và xa lạ đến mức nào.
SK-logic

2

Tôi tin rằng câu trả lời chính xác, và câu trả lời của cuốn sách là:

người ta nên cố gắng mã hóa vấn đề của một cách gọn gàng nhất có thể bằng các chi tiết của ngôn ngữ của một người

Bằng cách lập trình thành một ngôn ngữ, tôi luôn cho rằng đó là sử dụng các kỹ thuật bên ngoài phong cách thông thường của ngôn ngữ nơi nó sẽ dẫn đến một lợi ích . Đây là một sự khác biệt chính để viết theo một phong cách trong tất cả các ngôn ngữ.

Ví dụ, học Haskell đã cải thiện đáng kể kỹ năng của tôi trong việc sử dụng các hàm bậc cao hơn. Bây giờ khi lập trình trong c #, tôi sử dụng các IEnumerablephương thức khác nhau như Selectthường xuyên hơn, vì sử dụng các phương thức này dẫn đến mã sạch hơn là viết vào các vòng lặp. Tôi cũng có xu hướng sử dụng pass và sử dụng các hàm (tức là Func<int, int>) thường xuyên hơn do trải nghiệm haskell của tôi. Việc sử dụng quyền thừa kế của tôi đã giảm do điều này và hầu hết thời gian kết quả là mã đơn giản hơn.

Tuy nhiên, tôi không sử dụng các khái niệm như đơn nguyên hoặc kiểu dữ liệu đại số trong c #. Điều này là do không thể biểu thị rõ ràng trong c # và dẫn đến ít lợi ích để đổi lấy rất nhiều điều tối nghĩa.

Vì vậy, tôi sử dụng các công cụ của ngôn ngữ để sử dụng các kỹ năng tôi có để đạt hiệu quả tốt nhất. Tôi tin rằng đó là lập trình vào ngôn ngữ.


0

Bạn có đề xuất rằng mọi người nên cố gắng mã hóa vấn đề của mình một cách gọn gàng nhất có thể bằng các chi tiết của ngôn ngữ của một người, hay bạn nên tìm kiếm giải pháp thanh lịch nhất, ngay cả khi điều đó có nghĩa là bạn cần thực hiện các cấu trúc khó xử không tồn tại nguyên bản trong ngôn ngữ của ai?

Vấn đề là các lập trình viên tốt không có một ngôn ngữ. Trích dẫn từ cuốn sách nói về "các công cụ lập trình theo ý của họ" - điều đó có nghĩa là nếu bạn biết perl và Java, thì có lẽ bạn nên sử dụng perl cho thao tác chuỗi nhanh đó. Ngôn ngữ lập trình không phải là hộp để giới hạn chúng tôi, nhưng các công cụ chúng tôi sử dụng để giải quyết vấn đề. Đây là (imo) những gì Code Complete đang nhận được. Không viết mã trong hộp ngôn ngữ / môi trường lập trình, đưa giải pháp tốt nhất vào ngôn ngữ / môi trường lập trình tốt nhất cho bạn, vấn đề của bạn và giải pháp của bạn.

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.