Câu hỏi Giảng dạy lập trình và phương pháp chính thức


Đây là một câu hỏi kỳ lạ. Tôi đang trong quá trình viết một cuốn sách về việc học lập trình bằng cách sử dụng các phương pháp chính thức, và tôi sẽ nhắm nó vào những người có kinh nghiệm lập trình. Ý tưởng là dạy họ trở thành những lập trình viên chất lượng cao.

Ký hiệu cơ bản là từ Dijkstra's Kỷ luật lập trình, cùng với một số tiện ích mở rộng đồng thời và liên lạc.

Không giống như EWD, tôi muốn học sinh của tôi cuối cùng viết các chương trình thực thi thực tế. Điều đó có nghĩa là tại một số điểm dịch từ ký hiệu EWD sang một số ngôn ngữ khác. Khi tôi bắt đầu thực hiện lập trình chính thức, tôi nhắm mục tiêu C, nhưng cuối cùng bạn viết rất nhiều hệ thống ống nước, cộng với tất cả các phức tạp của việc xử lý con trỏ, vv. Ruby là một mục tiêu rõ ràng, như Scheme hoặc Lisp. Nhưng cũng có các ngôn ngữ chức năng khác nhau; vì tôi đặc biệt quan tâm đến đồng thời, Erlang có vẻ như là một khả năng.

Vì vậy, cuối cùng, đây là câu hỏi của tôi: Tôi nên dạy những ngôn ngữ nào để các độc giả của tôi nhắm vào các chương trình phát triển chính thức của họ?


21
2018-05-07 00:51


gốc


Âm thanh như một cuốn sách thực sự thú vị! - Uri
Cảm ơn, tôi sẽ đưa các chương lên cho bình luận, có thể được liên kết từ chasrmartin.com. Khi tôi có các chương. - Charlie Martin
"Tất cả là tốt nhất" cho cuốn sách của bạn Marty, tôi chỉ tìm kiếm và tìm thấy ý nghĩa của "phương pháp chính thức". - Alphaneo


Các câu trả lời:


Charlie,

Tôi luôn gắn liền với kiệt tác của Dijkstra với một mô hình lập trình trong đó giai đoạn trung tâm bị chiếm bởi các vòng lặp và mảng. Nếu bạn gắn bó với Dijkstra (ví dụ: tính toán các điều kiện tiên quyết yếu nhất), tôi nghĩ bạn sẽ thấy các ngôn ngữ chức năng không phù hợp lắm. Trong số các ngôn ngữ phổ biến cung cấp hỗ trợ tốt cho lập trình bắt buộc bằng các vòng lặp và mảng, có lẽ Python mang hành lý bổ sung ít nhất.

Đây không phải là để nói rằng các ngôn ngữ chức năng không phù hợp với các phương thức chính thức --- chúng rất phù hợp --- nhưng phong cách khá khác với Dijkstra. Các phương pháp ưa thích nhấn mạnh các bằng chứng tính toán; xem bài báo của Richard Bird về việc giải Sudoku (nặng nề) hoặc sách giáo khoa của Richard Bird và Phil Wadler.

Đối với concurrency nó phụ thuộc rất nhiều vào những gì mô hình của concurrency (và những gì các phương pháp chính thức) bạn tin vào. Concerto ML John Reppy là một mô hình thông điệp đẹp đi qua. Erlang cũng có một mô hình hạn chế sạch đẹp. Mặt khác, lập trình với ổ khóa và các phần quan trọng là rất khó khăn, có thể có nhiều lợi ích hơn cho các phương pháp chính thức trong tình huống đó.

Hai nhận xét khác đi qua có thể được quan tâm cho nghiên cứu nền của bạn:

  • Lập trình viên duy nhất mà tôi từng gặp khi áp dụng các phương pháp của Dijkstra trong thực tế cho các hệ thống thực là Greg Nelson, người đang làm việc ở Modula-3. (Greg và Mark Manasse đã viết hệ thống cửa sổ Trestle với nhau.) Modula-3 là một ngôn ngữ rất hay mà Digital cho phép chết thông qua sự thiếu thận trọng và bất lực. Greg đã có một bài báo TOPLAS tốt đẹp trên một phần mở rộng để tính toán của Dijkstra.

  • Ngôn ngữ mô hình hóa của Gerard Holzmann SPIN dựa trên ngôn ngữ lệnh bảo vệ của Dijkstra, và nó cũng hỗ trợ đồng thời. Mục đích của nó là kiểm tra mô hình, không lập trình, và có một vài đồng bộ hóa, nhưng có một kết nối mạnh mẽ với các phương thức chính thức, và nó thực sự tuyệt vời để có thể mô hình kiểm tra các xác nhận của bạn. Bất cứ ai quan tâm đến các phương pháp chính thức sẽ muốn kiểm tra nó.

(Chỉnh sửa: Đây là liên kết đến Greg Nelson giấy, hoặc một trong số đó. - CRM)


17
2018-05-07 03:35



Vâng, thực sự tôi đã làm khá một chút với lập trình chính thức vào C; đã dạy nó tại một số hội thảo của NASA, NSA, sau đó tôi đã được đưa vào bảo mật máy tính. Tôi nhớ công cụ của Greg bây giờ mà bạn đề cập đến nó, tôi sẽ phải nhìn lại nó. Điểm của bạn về các chương trình do-od của EWD so với chức năng là một chương trình tốt; Tôi sẽ kết thúc việc xác định cấu trúc vòng lặp về mặt đệ quy đuôi nếu tôi đi theo cách đó. Tôi cũng đã đưa ra một số suy nghĩ để thống nhất họ nhìn vào wp như là một hình thái trên vectơ nhà nước, nhưng điều đó có thể eb một dấu hiệu tôi cần phải đi ngủ. - Charlie Martin
Cảm ơn bạn đã nghĩ btw. - Charlie Martin
Tôi đồng ý bạn có thể làm rất nhiều với C, nhưng bạn nói rằng bạn muốn tránh tarpit con trỏ. Nói chung khi tôi nhận được một suy nghĩ về hình thái, tôi nằm xuống cho đến khi nó biến mất ... - Norman Ramsey
Vâng chính xác. Tôi đã chỉ làm cho điểm mà tôi đã làm "lập trình rigoropus" vào C từ tính toán EWD về cùng một thời gian. Re morphisms, yeah, nhưng một trong những thành viên ủy ban của tôi là một sinh viên của Mac Lane và Joe Goguen, tôi đã bị hỏng sớm. - Charlie Martin


Bỏ qua những gì rõ ràng yêu thích  lập trình  ngôn ngữ câu trả lời, tôi có thể thấy hai câu trả lời hữu ích:

Một mặt, bạn đang cố gắng chứng minh các phương pháp cho những gì được cho là những người lập trình trung gian. Nếu bạn chọn một ngôn ngữ duy nhất và chúc lành cho nó như là ngôn ngữ sách của bạn, bạn sẽ có thể xa lánh những người đọc tiềm năng không thích ngôn ngữ đó vì một lý do nào đó. Vì bạn đang trình diễn các phương pháp, Bạn có sự sang trọng trong việc sử dụng các đoạn mã bằng các ngôn ngữ xảy ra để minh họa cho quan điểm của bạn một cách súc tích. Ví dụ: ngôn ngữ duy nhất có sẵn để trình diễn RIIA có thể là C ++, nhưng ngôn ngữ này cũng khá kém để hiển thị cách thực hiện phân tích nguồn. Sơ đồ lý tưởng cho phân tích nguồn, nhưng không cung cấp cho bạn nhiều tùy chọn để khám phá các lợi ích (và điểm yếu) của việc gõ mạnh. Sử dụng nhiều ngôn ngữ.

Mặt khác, vì bạn chủ yếu là lên đến phương pháp lập trình, tôi không hoàn toàn chắc chắn bạn cần bất kỳ ngôn ngữ thực sự nào cả. Một ký hiệu được xác định rõ ràng là tốt và buộc người đọc của bạn tập trung vào điểm bạn đang tạo ra thay vì các chi tiết bề ngoài của một ngôn ngữ này hay ngôn ngữ khác.


7
2018-05-07 02:12



Vâng, đó là lập luận của EWD. Tôi không chắc tôi mua nó - tôi nghĩ việc sử dụng một ngôn ngữ thực sự sẽ giúp bạn thành thật. Tôi cũng nghĩ đến việc đưa ra một DSL Ruby như một ngôn ngữ sư phạm. - Charlie Martin
Bạn có thể sử dụng một ngôn ngữ thực, hoặc nhiều ngôn ngữ thực sự, mỗi ngôn ngữ được lựa chọn cẩn thận, theo từng trường hợp cho sức mạnh minh họa tối đa. - SingleNegationElimination
Hãy tiếp tục với ý tưởng của EWD và sử dụng ngôn ngữ được xác định rõ của riêng bạn. Tất cả các ngôn ngữ thực thi thực sự đều có lỗi thiết kế và các trường hợp cạnh khiến chúng trở nên đau đớn. Tốt hơn để có một ký hiệu / ngôn ngữ mà bạn có thể bước qua và chắc chắn về việc thực hiện nó. - Rudolf Olah


Tôi lớn lên trên Lisp và Scheme và yêu cả hai. Tôi nghĩ rằng họ là những ngôn ngữ tuyệt vời để học hỏi từ đầu. Nhưng, tôi không chắc ai đó với một số kinh nghiệm lập trình sẽ đưa đến những ngôn ngữ đó. Bạn sẽ không nhận được nhiều lượt truy cập trên Amazon cho cuốn sách của mình với Đề án trong tiêu đề. :)

C # là một ngôn ngữ rất dễ dàng để tìm hiểu và nó có tất cả những điều cơ bản bạn sẽ cần phải đi sâu vào các chủ đề như đồng thời khá nhanh chóng. Nó có nhiều khả năng ứng dụng hơn vì bạn cũng có thể nhắm mục tiêu đến các khái niệm OO và web. Nó cũng khá phổ biến và bạn sẽ nhận được các công ty trả tiền cho sổ nhân viên của họ mà luôn luôn là tốt cho bán hàng ("Hãy là một Kick Ass C # Programmer" đi nhiều hơn nữa trên một tấm bồi hoàn chi phí hơn "Concurrency trong Lisp hiện đại").

F # là một ngôn ngữ thú vị. Nó có vẻ đẹp chức năng của một Lisp hoặc Scheme (cũng không hoàn toàn, nhưng gần như) và nó mang lại cho bạn một số khả năng đi sâu vào các chủ đề OOP cũng như móc vào .NET Framework cho giao diện người dùng nếu bạn muốn thêm gia vị. Nhưng, ngay bây giờ, nó tối nghĩa.

Tôi không thể nói chuyện với Ruby, cá nhân, tôi sẽ cắn viên đạn và đi với C #.


3
2018-05-07 01:08



Tôi chỉ đang đợi những câu chuyện trên cái này :) - JP Alioto
Vâng, tôi đã bình chọn bạn, đó là một lý lẽ hoàn toàn hợp lý. Tôi nghi ngờ mọi người sẽ chạy la hét từ "phương pháp chính thức" lâu trước khi "chương trình" bắt sự chú ý của họ. Tôi có một chút định kiến ​​về Win .. Giành chiến thắng ... mà hệ điều hành khác, nhưng chắc chắn có rất nhiều nó ra khỏi đó. - Charlie Martin
Bạn có thể dễ dàng thay thế C # bằng Java nếu đó là loại vấn đề đó. :) Tôi không chắc chắn các phương pháp chính thức sẽ làm mọi người sợ hãi ... chắc chắn không phải tôi. Nó có vẻ tốt trên một kệ sách ngay cả khi bạn không bao giờ đọc nó và chỉ nhận được lợi ích của nó từ thẩm thấu. - JP Alioto
Nói về đồng thời, làm thế nào để các phương pháp chính thức làm với điều đó? Dijkstra đã viết trước khi tất cả đều quan trọng. - David Thornley


Thành thật mà nói, tôi không thể khuyên bạn nên Ruby cho điều này. Khi tôi lập trình hàng ngày trong thế giới thương mại của mình, tôi thích nó khá nhiều, chắc chắn nhiều hơn C hoặc Java. Nhưng ngữ nghĩa của nó quá yếu đến nỗi tôi không tin nó nhiều như C ở đâu, mặc dù tôi có thể dành vài giờ tranh luận về một tuyên bố và tư vấn rằng cuốn sách trắng dày hơn nhiều thay thế K & R, tôi đi ra kết thúc khá thuyết phục rằng nếu tôi đã có một trình biên dịch phù hợp (có, tôi biết, tôi là một người mơ mộng, nhưng làm việc với tôi ở đây) Tôi biết những gì đang sắp ra phía bên kia.

Ruby là tuyệt vời theo nhiều cách, nhưng theo như bất cứ điều gì chính thức đi, các twain sẽ không bao giờ đáp ứng.

Tôi có xu hướng bỏ phiếu cho Haskell bản thân mình, bởi vì mỗi khi tôi quay lại, tôi ngạc nhiên trước ý nghĩa của mọi thứ trong định nghĩa ngôn ngữ đó. (Mặc dù được thừa nhận chỉ sau một năm hoặc lâu hơn, tôi chắc rằng tôi đã không khám phá một nửa góc thậm chí của Haskell 98.)

Và tôi cũng hiểu, điều Dikjstra so với chức năng; quay lại và đọc các bài báo của anh ấy anh ấy rất nhiều trong thế giới bắt buộc; Tôi không đủ điều kiện để nói liệu anh ta có thực sự đi sai đường không. Có lẽ tôi chỉ bị choáng ngợp bởi cách viết của anh ấy tốt như thế nào, nhiều như suy nghĩ của anh ấy. Nhưng nó dường như làm hài lòng anh ta, vì vậy những gì về việc sử dụng Algol 60?


2
2018-06-15 16:51





Đó là một ý tưởng tốt. Tôi nghĩ rằng Đề án là một lựa chọn tốt vì nó cho phép người ta đưa vào thực hành (dưới hình thức thư viện) các trừu tượng khác nhau với một yếu tố cần thiết tối thiểu. Nó cũng dễ dàng dịch từ chương trình sang một hệ thống xác minh như PVS (http://pvs.csl.sri.com/)

cổ vũ


1
2018-05-07 01:03



Ừ. Tôi rất quan tâm đến việc kiểm tra mô hình vào một số công cụ này, nhưng tôi nghĩ đó sẽ là một cuốn sách thứ hai. Tôi đang cố gắng để thúc đẩy ý tưởng mà bạn có thể học cách suy nghĩ, và theo đây chương trình, một cách nghiêm túc mà không cần một người kiểm tra bằng chứng. - Charlie Martin


Tôi nghĩ rằng bạn nên có một số kinh nghiệm trong ngôn ngữ bạn sử dụng cho cuốn sách của bạn, hoặc một người nào đó thành thạo để xem lại mã của bạn.

Cá nhân, tôi sẽ sử dụng Common Lisp, vì tôi quen thuộc với điều đó, và đó là một ngôn ngữ tuyệt vời để thực hiện bất kỳ khái niệm nào. Các tùy chọn khác có thể là Erlang, Haskell, Ruby hoặc Python, có lẽ ngay cả một số phương ngữ ML. Tôi thiên vị chống lại gia đình C (bao gồm cả C # và Java), họ dường như bị mắc kẹt với một mức độ suy nghĩ thấp hơn về các khái niệm.


1
2018-05-07 01:46



Im thực sự rách về điều này. Im khá thoải mái trong bất kỳ lựa chọn nào tôi đã suy nghĩ, do đó, đó không phải là một vấn đề, và địa ngục, sau 40 năm ở đây họ tất cả sorta trông giống nhau anyway. Điểm của bạn về C / Java là vừa phải, nhưng sau đó tat là lý do tại sao tôi làm điều đó trong hai bước: EWD mã đầu tiên, sau đó dịch sang một ngôn ngữ mục tiêu. - Charlie Martin


Có khá nhiều trường đại học sử dụng Perfect Developer để dạy các phương pháp chính thức (từ chối trách nhiệm: Tôi được kết nối với sản phẩm này). Nó được xây dựng xung quanh một ngôn ngữ để thể hiện thông số kỹ thuật, sàng lọc dữ liệu và thuật toán. Nó có một prover định lý tự động để xác minh, và một bộ tạo mã có thể tạo ra C ++, C # và Java. Thiết kế của PD được lấy cảm hứng từ "Kỷ luật lập trình", tuy nhiên chúng tôi nhận thấy ký hiệu khá không thực tế đối với các hệ thống lớn, vì vậy ký pháp đã phân tách một phần từ Dijktra.


1
2018-02-10 01:01



Được rồi, có vẻ hấp dẫn. Tôi sẽ phải xem xét điều này nhiều hơn, nhưng tôi đánh giá cao con trỏ. - Charlie Martin