Lập trình biết chữ, phương pháp thiết kế tốt / xấu


10

Gần đây tôi đã tìm thấy khái niệm về lập trình biết chữ . Và tôi thấy nó khá hấp dẫn. Tuy nhiên, tôi đã không gặp phải tuyên bố rằng đó là một cách xấu để cấu trúc một chương trình. Dường như không bao phủ nhiều nơi. Thậm chí ở đây tôi không thể tìm thấy bất kỳ câu hỏi liên quan đến điều này.

Câu hỏi của tôi không phải là về sai sót của nó hoặc cách xử lý tài liệu. Tôi coi tài liệu này là một tác dụng phụ của những gì nó có nghĩa cho dòng chảy lập trình biết chữ. Tôi biết rằng thiết kế ban đầu được dự định cho tài liệu dễ dàng cũng như khái niệm về dòng chảy lập trình chuyển tiếp .

Khái niệm phân chia vấn đề thành các vấn đề nhỏ dựa trên câu dường như thực sự là một ý tưởng tuyệt vời. Do đó sẽ giảm bớt sự hiểu biết về dòng chảy của chương trình.

Một hậu quả của phương pháp thiết kế biết chữ cũng là số lượng chức năng cần thiết sẽ bị giới hạn trong trí tưởng tượng của lập trình viên. Thay vì xác định hàm cho một tác vụ nhất định, nó có thể được tạo như một scrapphương thức biết chữ. Điều này sẽ mang lại việc tự động chèn mã, thay vì biên dịch hàm riêng biệt và yêu cầu tiếp theo của bước tối ưu hóa biên dịch liên thủ tục để đạt được tốc độ tương đương. Trong thực tế Donald E. Knuth lần đầu tiên cho thấy thời gian thực hiện kém hơn, do thực tế này. Tôi biết rằng trình biên dịch có thể được thực hiện cho rất nhiều điều này, tuy nhiên đây không phải là mối quan tâm của tôi.

Vì vậy, tôi muốn nhận được thông tin phản hồi về lý do tại sao người ta nên coi đây là một phương pháp thiết kế xấu / tốt?


2
Zeroth, tôi đã tạo thẻ lập trình biết chữ và thêm một bản tóm tắt dựa trên bài viết Wikipedia. Hãy giúp mở rộng wiki thẻ với thông tin liên quan.
yannis

@YannisRizos Tôi sẽ thêm nó vào đây, tôi không có đặc quyền chỉnh sửa.
zeroth

1
À, tôi cũng vậy :) Tôi đã thêm một số tài nguyên (bài viết trên wikipedia và các liên kết trong câu hỏi của bạn), chúng sẽ xuất hiện khi chỉnh sửa được xem xét và chấp nhận ngang hàng (?!). Đó là một cách tiếp cận hấp dẫn và vì bạn đã khám phá nó, hãy quay lại và cải thiện thẻ wiki mỗi khi bạn tìm thấy thứ gì đó mà bạn nghĩ rằng nó đáng được đề cập trong đó.
yannis

1
Tôi muốn giới thiệu tác giả của trang Lập trình Văn học để truy cập trang web UX stackexchange - màu sắc thực sự xấu khi đọc.
Daniel Varod

1
FYI, có một literate-programmingthẻ trên StackOverflow là tốt. Có nhiều nội dung hơn ở đó, mặc dù vẫn không nhiều.
Ross Patterson

Câu trả lời:


9

Điều này sẽ mang lại việc chèn mã tự động, thay vì biên dịch hàm riêng biệt và yêu cầu tiếp theo của bước tối ưu hóa biên dịch liên thủ tục để đạt được tốc độ tương đương

Điều này là không liên quan. Đã được nhiều thập kỷ. Bạn có thể loại bỏ nó khỏi câu hỏi, vì nó không có ý nghĩa với trình biên dịch hiện đại để lật đổ trình tối ưu hóa của chúng.

Vì vậy, tôi muốn nhận được thông tin phản hồi về lý do tại sao người ta nên coi đây là một phương pháp thiết kế xấu / tốt?

Không có nhược điểm để lập trình biết chữ. (Tôi mong đợi hàng chục -1 phiếu bầu cho tình cảm đó.) Là một học viên, tôi chưa bao giờ thấy bất kỳ vấn đề nào.

Có một số đối số mà tất cả số tiền để "lập trình bằng ngôn ngữ cấp cao hơn bị lật đổ bằng cách điều chỉnh mã kết quả." Đúng. Theo cùng cách mà lập trình trong C ++ bị phá vỡ bằng cách điều chỉnh .otệp được tạo. Đó là sự thật, nhưng không liên quan.

Viết chương trình biết chữ chỉ có nghĩa là kết hợp thiết kế cấp cao và chi tiết (cấp mã) vào một tài liệu, được viết bằng một bộ công cụ phù hợp để tạo các tệp thân thiện với trình biên dịch và các tệp thân thiện với mọi người.

Khi Knuth phát minh ra lập trình biết chữ, các ngôn ngữ OO chính thống không tồn tại. Do đó, rất nhiều công cụ dệt và web gốc cho phép anh ta tạo ra các định nghĩa giống như lớp cho các kiểu dữ liệu trừu tượng.

Phần lớn điều đó là không liên quan ngày nay. Các công cụ lập trình biết chữ có thể khá đơn giản nếu chúng tập trung vào các ngôn ngữ lập trình hướng đối tượng (hoặc chức năng) hiện đại, cấp cao. Ít có nhu cầu giải quyết công phu hơn vì những hạn chế của C (hoặc Pascal hoặc Trình biên dịch).

Cách tiếp cận để viết chương trình biết chữ không khác gì cách tiếp cận viết chương trình không biết chữ. Nó vẫn đòi hỏi thiết kế cẩn thận, kiểm tra đơn vị và mã hóa gọn gàng. Công việc phụ duy nhất là viết giải thích ngoài việc viết mã.

Chỉ vì lý do này - nhu cầu viết giải thích mạch lạc - lập trình biết chữ là khó khăn đối với một số lập trình viên. Có một số lượng lớn các lập trình viên thành công (mã của họ vượt qua tất cả các bài kiểm tra đơn vị, gọn gàng và dễ hiểu) nhưng dường như không thể viết một câu mạch lạc bằng ngôn ngữ bản địa của họ. Không biết tại sao điều này lại đúng.

Có một số lượng rất lớn các lập trình viên dường như chỉ thành công ngoài lề và sau đó chỉ là tình cờ. (Có đủ câu hỏi xấu trong Stack Overflow chỉ ra rằng nhiều lập trình viên đấu tranh để thậm chí nắm bắt các nguyên tắc cơ bản.) Tôi làm tốt công việc lập trình.


7
Một số lượng lớn các lập trình viên hầu như không mạch lạc khi giải thích một cái gì đó trong bất kỳ phương tiện, chính thức hoặc không chính thức nào, có thể là lập trình biết chữ, viết bình luận hoặc thậm chí là một email. Đó là một phần mềm tuyệt vời hoạt động cả :)
Andres F.

3

Khía cạnh quan trọng nhất của lập trình biết chữ (hoặc thậm chí chỉ là nhận xét tốt) đối với tôi không phải là nó cung cấp nhiều tài liệu, mà là nó nói lên ý định của lập trình viên. Khi biết mục đích đã nêu, bạn có thể đánh giá ngay lập tức liệu mã theo sau nó có thực sự làm những gì cần làm hay không. Không có ý định, bạn phải bắt đầu với giả định rằng mã là chính xác và sau đó chứng minh nó đúng hay sai bằng cảm ứng - điều này sẽ tốn nhiều thời gian và tốn thời gian hơn vì nó thường đòi hỏi phải làm quen với tất cả các mã xung quanh.

Vì vậy, mục đích đã nêu thường cho phép những người khác không quen thuộc với mã nhanh chóng nhảy vào và tìm lỗi mà không cần phải biết bối cảnh lớn hơn xung quanh nó.

Và tất nhiên, nó cũng giúp bạn tìm hiểu luồng cơ bản và thiết kế mã nhanh hơn, vì tiếng Anh đơn giản thường trực quan hơn so với số học con trỏ đối với hầu hết mọi người.


1

Mặc dù còn khá mới đối với khái niệm lập trình xả rác (và do đó có khả năng là tôi hoàn toàn thiếu thuyền), có vẻ như rất phù hợp với khái niệm DSL .

Ý tưởng đằng sau DSL là chắt lọc một miền các vấn đề thành một ngữ pháp đơn giản, theo ngôn ngữ tự nhiên, có thể được sử dụng để xây dựng các thuật toán để giải quyết các vấn đề đó.

Đối với tôi, ý tưởng tương tự, hoặc ít nhất là nền tảng cốt lõi của nó, giống hoặc ít nhất là liên quan chặt chẽ đến lập trình biết chữ.

Ví dụ, trong thế giới hấp dẫn, việc sử dụng DSL thường xuyên hơn và tạo ra DSL mới để giải quyết các vấn đề phổ biến. Sự thúc đẩy này đến từ cả hai công cụ trong ngôn ngữ (các nhà xây dựng dễ dàng), cũng như các thư viện cốt lõi hỗ trợ API dựa trên DSL.

Cho rằng xu hướng, ít nhất là ở góc đó của thế giới, là hướng tới lập trình biết chữ, tôi sẽ nói rằng đó là một phương pháp tốt để phấn đấu.

Thật không may, mức độ suy nghĩ cần thiết để tạo ra một dsl tốt thường vượt xa hầu hết các lập trình viên, từ những gì tôi đã thấy. Tôi biết cá nhân tôi đôi khi phải vật lộn với một số khái niệm cần thiết. Có thể chính khó khăn này đã ngăn cản các kỹ thuật như vậy có được sự chấp nhận rộng rãi hơn.

Đó là trường hợp kinh điển của bạn khi sử dụng công cụ là một chuyện, nhưng việc tạo ra nó ở một cấp độ hoàn toàn khác.


Để mở rộng quan điểm của tôi một chút, không có gì nhiều khi DSL giống như lập trình biết chữ, mà là chúng làm cho việc lập trình biết chữ trở nên khả thi hơn nhiều . Đặc biệt khi chúng là DSL ngôn ngữ tự nhiên .

Trong phiên bản 1.8 của Groovy, khả năng DSL ngôn ngữ tự nhiên đã được cải thiện đáng kể với việc bổ sung các chuỗi lệnh mạnh hơn.

Ví dụ, các dòng mã sau đây là lập trình , không chỉ là câu giả:

drink tea with sugar and milk
move left by 30.centimeters
sendFrom "Guillaume" to "Jochen"
send from: "Jochen" to "Lidia"
Email.from "Lidia" to "Guillaume" withBody "how are you?"
contact.name "Guillaume" age 33
move left by 30.centimeters
sell 100.shares of MSFT
take 2.pills of chloroquinine in 6.hours
blend red, green of acrylic
artist.paint "wall" with "Red", "Green", and: "Blue" at 3.pm
wait 2.seconds and execute { assert true }
concat arr[0] with arr[1] and arr[2]
developped with: "Groovy" version "1.8-beta-2"

Lưu ý: Mẫu mã đến từ blog của Guillaume Laforge

Ý tưởng cốt lõi đằng sau lập trình biết chữ là ngôn ngữ tự nhiên dễ hiểu hơn đối với con người và đó mới là điều quan trọng. Theo tôi, khả năng DSL ngôn ngữ tự nhiên của Groov khiến điều đó trở thành một thực tế gần gũi hơn nhiều, theo ý kiến ​​của tôi. Đặc biệt là khi các DSL đó được sử dụng để tạo quy tắc kinh doanh cho một ứng dụng.

Có thể "mã hóa" các thành phần quan trọng của một hệ thống bằng ngôn ngữ tự nhiên là bản chất của lập trình biết chữ. Phải xen kẽ ngôn ngữ tự nhiên với các đoạn mã là một hình thức lập trình bastardized. Mặc dù hữu ích, tôi tin rằng DSL ngôn ngữ tự nhiên cho phép bạn sử dụng ngôn ngữ tự nhiên vì bản thân mã là một bước tiến lớn.

Mở rộng khả năng lập trình nói chung là bước tiếp theo trong quy trình, nhưng ở một mức độ lớn, các công cụ để làm điều đó đã được áp dụng. Có, chưa có DSL "chung", nhưng đối với các miền nhỏ hơn, khả năng là có.

Để biết thêm ví dụ về điều này trong hành động (không theo thứ tự cụ thể):


2
Quan điểm thú vị. Theo quan điểm của tôi, nó hoàn toàn không phù hợp với DSL. Kể từ khi lập trình biết chữ là trong một số ngôn ngữ không phải DSL. Và các công cụ cũng không giống như DSL. Họ không hướng đến miền vấn đề. Bạn có thể cung cấp một ví dụ về cách bạn nghĩ lập trình biết chữ giống như DSL không? Một liên kết hoặc một tham chiếu đến một ví dụ có thể giúp làm rõ câu trả lời của bạn.
S.Lott

Một ví dụ về điều này là các chuỗi lệnh trong Groovy 1.8 cho phép bạn "lập trình" với những thứ như turn left then righthoặc paint wall with red, green and yellow: docs.codehaus.org/display/GROOVY/ trộm
cdeszaq

@ S.Lott - Tôi đồng ý rằng chắc chắn có sự khác biệt giữa DSL và lập trình biết chữ, nhưng tôi nghĩ DSL có thể là một công cụ để đạt được lập trình biết chữ thực sự nơi bạn có thể nhập ngôn ngữ tự nhiên và có ngôn ngữ thể hiện mong muốn. Đối với tôi, pha trộn ngôn ngữ tự nhiên và mã là một hình thức xóa mù chữ.
cdeszaq

"Bạn có thể nhập ngôn ngữ tự nhiên và ngôn ngữ đó thể hiện thuật toán mong muốn" không chắc là tốt nhất. Có nền tảng, sự biện minh, bằng chứng chính xác, các xác nhận phức tạp (big- O ) và rất nhiều tài liệu hỗ trợ không có tính chất không phải là một phần của sơ đồ DSL. Tôi không chắc chắn tôi đồng ý với song song rằng bạn đã làm rõ điều đó.
S.Lott

1
"Giải thích về logic chương trình". Không phải logic. Nhưng một lời giải thích. Logic hiếm khi tự giải thích. Nó không bao giờ chứa bằng chứng về sự đúng đắn (điều đó khó khăn và đôi khi không thể). Nó hiếm khi chứa một sự biện minh cho sự phức tạp big-O. Và nó hiếm khi giải thích các lựa chọn thay thế có hiệu suất thấp hơn hoặc nhiều bộ nhớ hơn. Vì vậy, tôi sẽ đề nghị DSL không cần "giải thích".
S.Lott

-2

Tôi nghĩ rằng đây là sai lầm khi nghĩ rằng LP là một loại DSL. Bởi vì LP là - tạp chí (với sơ đồ, sơ đồ, đoạn mã giả, tức là các đoạn) của chương trình đã phát triển, đó là kiến ​​trúc và v.v ... Nó hoàn toàn giống với sổ ghi chép giấy - nhiều nhà phát triển sử dụng chúng nhưng sau khi hoàn thành chương trình - bỏ 'sổ ghi chép, giấy tờ ...

Từ lâu, mỗi nhà vật lý, nhà thiên văn học, nhà hóa học / nhà giả kim, nhà toán học đều có sổ ghi chép, bản thảo với nhiều sơ đồ, thông tin cần thiết, bảng biểu và không có chúng bạn có thể hiểu hoặc lặp lại kinh nghiệm thành công của họ. Và luôn luôn giữa những người như vậy tồn tại manuscreepts / máy tính xách tay săn bắn.

Ngày nay nhiều lập trình viên viết mã, và đôi khi họ thêm ý kiến! Chương trình Byt không chỉ là mã - đó là suy nghĩ, ý tưởng, trí tưởng tượng, khái niệm và khi nhà phát triển mới thừa hưởng mã người ngoài hành tinh - anh ta thường xuyên nghiền ngẫm tất cả các ý tưởng và khái niệm, tạo ra các "lỗ hổng" và "backreen" khác nhau, tôi hy vọng bạn hiểu tôi :)

Vì vậy, yêu cầu chính đối với LP (như công cụ!) Quá cho phép tất cả những điều này với cú pháp đơn giản, nhẹ nhàng, dễ đọc. Tôi đã thử nhiều công cụ LP, nhưng hôm nay tôi đang phát triển riêng - NanoLP ( http://code.google.com.vn/p/nano-lp/ ) nhằm mục đích đáp ứng nhu cầu này.

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.