Tại sao sách giáo khoa sử dụng mã giả thay vì ngôn ngữ thực?


8

Trong các trường đại học và trong sách giáo khoa thuật toán, việc giáo viên và tác giả giải thích dòng điều khiển trong mã giả là khá phổ biến. Với sự ra đời của các ngôn ngữ biểu cảm hơn như Python và Haskell trong số các ngôn ngữ khác, liệu có hợp lý khi các trường đại học chuyển sang giải thích các thuật toán thông qua một trong những ngôn ngữ này?

Ưu điểm duy nhất của mã giả mà tôi có thể nghĩ đến là nó không mang tính ngôn ngữ. Nhưng nó không phải như vậy. Một số mã giả sử dụng một cách tiếp cận bắt buộc, mã giả khác có vẻ chức năng. Các tác giả chỉ mượn ngữ nghĩa từ bất kỳ ngôn ngữ lập trình nào mà họ cảm thấy thoải mái khi sử dụng, hoặc tệ hơn là chỉ mô tả ngữ nghĩa bằng ngôn ngữ tự nhiên. Vì vậy, nếu mã giả không thực sự là ngôn ngữ bất khả tri, thì lợi thế của việc sử dụng nó là gì? Sẽ không tốt hơn nếu chỉ sử dụng một ngôn ngữ hiện có?


5
"Tôi có thể đã chọn ngôn ngữ của một máy X cụ thể, nhưng sau đó những người không sở hữu máy X sẽ nghĩ rằng cuốn sách này chỉ dành cho người X. Hơn nữa, máy X có thể có rất nhiều đặc điểm hoàn toàn không liên quan đến tài liệu trong cuốn sách này chưa được giải thích và trong hai năm nữa, nhà sản xuất máy X sẽ đưa ra máy X + 1 hoặc máy 10X, và máy X sẽ không còn được ai quan tâm nữa. " (Donald Knuth, TAOCP)
Kilian Foth

@KilianFoth Đẹp. Tôi tin rằng Knuth cũng nói rằng ông đã thấy trước một tương lai nơi các chương trình sẽ được viết bằng tiếng Anh và được phân tách bằng khoảng trắng (mặc dù tôi không thể tìm thấy nguồn), điều này gần giống như nói mã giả sẽ được thực thi :) Mặc dù các đặc điểm riêng thực sự gây mất tập trung, một tập hợp con chính thức của các tính năng sẽ được chấp nhận.
Dấu hoa thị

1
@Asterisk bạn đang nghĩ về lập trình biết chữ . Tôi chắc chắn rằng ai cũng sẽ đọc EWD667: Về sự ngu ngốc của "lập trình ngôn ngữ tự nhiên". bởi Dijkstra. Tôi cũng sẽ chỉ ra những khó khăn mà mọi người đã đặt ra các câu hỏi ở đây tuân theo các quy tắc nhất quán về dấu câu, viết hoa và chính tả tiếng Anh. Tôi rùng mình khi nghĩ những người này viết mã theo phong cách tương tự khi viết chương trình văn xuôi.

1
"Phiêu lưu"? Cả hai ngôn ngữ này đều trên 20 tuổi. Và Haskell ít nhất đã được đi trước bởi Miranda, người có cú pháp gần như giống hệt nhau, và tôi tin rằng bây giờ đã 30 tuổi.
Jules

@Jules Vâng, tôi đặt tên cho chúng bởi vì chúng có cú pháp gọn gàng và gọn gàng nhất có vẻ phù hợp với mã giả. Cả hai đã đạt được lực kéo rộng hơn trong 10 năm qua (hoặc nhiều hơn như 5 năm trước). Python bẻ khóa top 10 trong PyPl và Haskell dưới 50. Có những ngôn ngữ khác đang phát triển (vì bất kỳ lý do gì), nhưng chúng có cú pháp nặng hơn và các tính năng nặng hơn. Công nghiệp vẫn là 50% C ++ và Java và sau đó có JavaScript (có vẻ như là một ngôn ngữ được thiết kế ngược lại, đầu tiên thêm các tính năng sau đó xác định các quy tắc và ràng buộc).
Dấu hoa thị

Câu trả lời:


18

Không. Điểm quan trọng của mã giả là nó không phải biên dịch. Tôi có thể nhanh chóng phủ bóng lên những chi tiết không liên quan. Ngược lại, ngay cả các ngôn ngữ trông giống như mã giả trong cái nhìn đầu tiên có thể có các chi tiết rất không trực quan sẽ làm mất đi thuật toán. Hãy lấy ví dụ Quicksort trong Haskell:

qs :: Ord a => [a] -> [a]
qs [] = []
qs (pivot:xs) = (qs smaller) ++ pivot:(qs larger)
  where smaller = [x | x <- xs, x <= pivot]
        larger  = [x | x <- xs, x > pivot]

hoặc tương tự trong Python:

def qs(array):
  if not array:
    return []
  pivot = array[0]
  xs = array[1:]
  smaller = [x for x in xs if x <= pivot]
  larger  = [x for x in xs if x > pivot]
  return qs(smaller) + [pivot] + qs(larger)

Ưu điểm trong cả hai trường hợp là đây là mã thực thi và do đó có thể được kiểm tra, đánh máy và chơi đùa với các sinh viên. Tuy nhiên, cả hai đều bao gồm các chi tiết cú pháp gây mất tập trung. Sinh viên thường sẽ được phục vụ tốt hơn bằng mã giả minh họa ý định của thuật toán, chứ không phải chi tiết thực hiện:

algorithm QUICKSORT(array)
  return [] if array is empty
  pivot  array[0]
  xs  array[1, ...] -- the rest of the array without the pivot
  smaller  [x | x  xs, x <= pivot] -- all smaller or equal elements
  larger  [x | x  xs, x  > pivot] -- all larger elements
  return [QUICKSORT(smaller)..., pivot, QUICKSORT(larger)...]

Sự khác biệt đáng chú ý:

  • Tôi chỉ có thể tạo ra một cú pháp hiểu danh sách trông giống như toán học hơn là phải giải thích tại sao Python có forifở đây.

  • Tôi không phải giải thích cú pháp của ngôn ngữ đó để nối danh sách. Tại sao Python sử dụng +bổ sung? Có gì :ở Haskell? Tôi chỉ có thể chọn một cú pháp nhận được điểm rõ ràng hơn.

  • chữ ký loại Ord a => [a] -> [a]chỉ là một chi tiết thực hiện. Mặc dù có thể hữu ích trong trường hợp này, chữ ký loại đôi khi được Haskell yêu cầu có thể trở nên vô lý.

  • Tôi không phải giải thích tại sao Python coi các bộ sưu tập trống là sai và array[1:]nghĩa là gì .

  • Tôi tránh các sinh viên thông minh chỉ ra rằng tôi thực sự nên sử dụng yieldtrong ví dụ Python.

  • Haskell hút để giải thích các cấu trúc dữ liệu có thể thay đổi như Bảng Hash, cây RB, Nhận.

  • Mọi thứ bắt đầu trở nên rất cụ thể về ngôn ngữ một khi chúng ta cần các bản ghi phức tạp để thể hiện các thuật toán của mình. Ví dụ, hệ thống đối tượng của Python có một vài điều ngạc nhiên gây mất tập trung.

Điều đó nói rằng, có thể rất có giá trị để sử dụng một trong những ngôn ngữ này ngoài mã giả, chỉ cần cẩn thận gắn nhãn là gì.


9
Tôi đồng ý với bạn nói chung, nhưng ví dụ của bạn mâu thuẫn với một số đối số của bạn - mã giả của bạn và ví dụ Python trông cực kỳ giống nhau. Đó là IMHO một hệ quả của ngôn ngữ Python chứa toàn bộ "lẽ thường".
Doc Brown

2
Nếu chỉ một tập hợp con các tính năng ngôn ngữ / API được sử dụng, nó sẽ đồng bộ với bản chất của mã giả. Tuy nhiên, nếu chúng ta bắt đầu đi sâu vào những gì sẽ là cách tốt nhất hoặc cách bí truyền nhất để thực hiện nó trong một ngôn ngữ cụ thể, thì đó sẽ là sự xao lãng. Các nhà khoa học mô tả thuật toán đã đưa ra ký hiệu riêng của họ rất giống với lý thuyết tập hợp. Sau khi ý tưởng của máy Turing được thành lập và C, Fortran, Lisp đã đưa ra mã giả bắt đầu mượn ý tưởng từ họ
Asterisk

2
Tôi sẽ nói thêm rằng nếu mã có thể được biên dịch "như hiện tại" thì có nguy cơ rất thực sự là "sinh viên đã sử dụng cắt & dán và không học được gì".
Brendan

3
Bạn đã tranh luận I don't have to explain ... what array[1:] is supposed to mean., nhưng sau đó bạn thực sự phải giải thích array[1, ...] -- the rest of the array without the pivottrong các bình luận bởi vì không ai có thể hiểu được ý array[1, ...]nghĩa của nó là gì Tôi nghĩ rằng điều đó thực sự có lợi cho việc sử dụng ngôn ngữ thực sự làm cơ sở cho mã giả, vì bạn có thể chỉ cần hướng mọi người đến tài liệu / hướng dẫn của ngôn ngữ thực thay vì phải học cú pháp mã giả của bạn.
Lie Ryan

1
@amon Để tốt hơn hay tệ hơn, các ký hiệu toán học không được định nghĩa tốt như các ngôn ngữ lập trình. Ngoài ra việc sử dụng dấu chấm lửng trong chuỗi không có ý nghĩa cụ thể. Đôi khi nó có nghĩa là chuỗi số học, đôi khi nó có nghĩa là hình học, đôi khi nó có nghĩa là mục tiếp theo trong một chuỗi tùy ý mà tác giả đang nói và bạn phải đọc năm đoạn văn từ mã để chọn. Ký hiệu lát có một nghĩa được xác định rõ, nó không mơ hồ. Ngoài ra, mặc dù dấu chấm lửng có thể phổ biến theo trình tự, bạn vẫn chưa chỉ định cách trình tự tương tác với dấu ngoặc vuông.
Lie Ryan

10

Không.

Toàn bộ mục đích của mã giả là để trừu tượng hóa các chi tiết và độ phức tạp của các ngôn ngữ riêng lẻ để bạn tập trung vào những gì chương trình phải làm, thay vì cách thực hiện. Với mã giả, bạn có thể tạo ra các quy tắc tùy ý không cần tuân thủ các yêu cầu triển khai thực tế theo cách mà các ngôn ngữ trong thế giới thực làm, nhưng chỉ theo yêu cầu của chủ đề thực tế.

Hơn nữa, nếu logic được trình bày theo cách mà bạn (với tư cách là học sinh) không thể sao chép / dán vào một tệp, biên dịch nó và được thực hiện, thì bạn buộc phải tự thực hiện giải pháp ngay cả khi chính giải pháp được mô tả cho bạn. Điều này khuyến khích suy nghĩ cá nhân về sao chép / dán gian lận.


0

Cái gì là thật?

Bởi vì Real chỉ trong định nghĩa cho một thông dịch viên .

Tiếng phổ thông có thực hơn hoặc ít hơn tiếng Anh không?

  • Chắc chắn tiếng Quan thoại không đặc biệt hữu ích với người nói tiếng Anh
  • tương tự tiếng Anh quá vô nghĩa với người nói tiếng phổ thông
  • trừ khi họ nói cả hai.

Vì vậy, Real thậm chí không phải là câu hỏi. Hãy viết lại nó:

Tại sao Mã giả được sử dụng thay vì Ngôn ngữ chính thức?

Một sơ đồ VENN đơn giản có thể làm nổi bật vấn đề một cách dễ dàng. Tập hợp tất cả con người là người nói tiếng Anh tiếng Quan thoại là tập hợp con của người nói tiếng Anh hoặc tiếng Quan thoại. Bởi vì cần nỗ lực để có được sự thành thạo trong bất kỳ ngôn ngữ nào, giao lộ thường nhỏ hơn nhiều so với liên minh.

Sách giáo khoa về lập trình có thể cho rằng bạn hiểu ít nhất một ngôn ngữ tự nhiên, ngôn ngữ mà sách giáo khoa được viết. Nói chung là an toàn để giả định điều này, vì nếu không thì một cuốn sách giáo khoa dễ đọc hơn sẽ được chọn. Sau khi học một ngôn ngữ là đủ khó - hai là khó hơn.

Điều này đưa ra lý do đầu tiên để sử dụng mã giả. Nó tối đa hóa đối tượng có thể dễ dàng đọc cuốn sách. Điều này được thực hiện bằng cách tuân theo các quy ước ngôn ngữ đã được thiết lập trong ngôn ngữ tự nhiên. Nói các công thức nấu ăn từ nấu ăn, các công thức toán học, v.v ... Bất kỳ khoảng cách nào cũng có thể được thu hẹp bằng cách giải thích ngôn ngữ tự nhiên nhanh chóng, hoặc thất bại trong việc giải thích cuối cùng cho hệ thống hình ảnh của chúng ta bằng hình ảnh.

Về lý do tại sao ngôn ngữ chung không thể là ngôn ngữ lập trình. Tôi để bạn xem xét bao nhiêu tiếng phổ thông (hoặc bất kỳ ngôn ngữ nào bạn chưa nói) bạn đã học bằng cách đọc một cuốn sách về lập trình được viết bằng các ví dụ được đưa ra trong một ngôn ngữ lập trình quen thuộc.

Những gì một cuốn sách giáo khoa đạt được

Đối với lý do thứ hai, hãy xem xét những gì một cuốn sách giáo khoa phải đạt được:

  • giải thích lý do tại sao họ muốn học một ngôn ngữ ngoài hành tinh thay vì chỉ sử dụng ngôn ngữ tự nhiên của họ.
  • giải thích một ngôn ngữ xa lạ cho người đọc để họ có thể tự nói được.

Tại sao chương trình

Hầu hết các cuốn sách phải thuyết phục bạn về lý do tại sao bạn muốn học và sử dụng ngôn ngữ ngoài hành tinh này, hoặc bất kỳ ngôn ngữ tương tự. Điều này có nghĩa là thảo luận về bản chất của lập trình.

  • Làm thế nào để bạn xác định một vấn đề
  • Làm thế nào để bạn phá vỡ một vấn đề
  • Làm thế nào để bạn kiến ​​trúc sư dữ liệu
  • Làm thế nào để bạn kiến ​​trúc sư các quy trình
  • Làm thế nào để bạn quản lý các phụ thuộc
  • Làm thế nào để bạn xác định lỗi
  • và hơn thế nữa

Hầu hết những điều này không liên quan gì đến bản thân các máy móc, chủ yếu là một cuộc thảo luận về cách thức hoạt động của kho thịt để mang lại một chương trình. Điều đó khá phức tạp vì nó phải chỉ ra lý do tại sao chúng ta sẽ liên kết các mục tiêu không gian của con người, để lập trình các vấn đề không gian và cố gắng giải quyết chúng.

Mô tả một chương trình

Thành tựu sách giáo khoa thứ hai là mô tả một ngôn ngữ. Bây giờ hầu hết các ngôn ngữ lập trình có thể được mô tả bằng một Ngữ pháp và một vài quy tắc ngữ nghĩa. Ở đầu nông là các ngôn ngữ như JSON có thể được định nghĩa khá hoàn toàn trong vòng ba trang. Các ngôn ngữ phức tạp hơn cần một đặc điểm kỹ thuật lớn hơn, nhưng đối với hầu hết các phần không cần sự hiểu biết tổng thể để có ích. Tuy nhiên, những mô tả này là Mã giả. Họ chỉ định ngôn ngữ chính thức theo ngôn ngữ tự nhiên. Sự khác biệt là các mã giả này được chỉ định trước.

Bây giờ được đưa ra rằng ngay cả Ngôn ngữ chính thức cũng là Mã giả (Có thể thực thi), câu hỏi đặt ra là điều gì là quan trọng nhất khi mô tả một thuật toán? Bối cảnh tiếp theo lớn hơn.

  1. Thuật toán có Mục tiêu hợp lý trong bối cảnh đó,
  2. bối cảnh đó có một số hạn chế,
  3. và thuật toán là một mô tả về cách các ràng buộc đó có thể được xử lý trong khi đạt được mục tiêu.

Không có gì là ngôn ngữ mà thuật toán được viết quan trọng. Nếu bất cứ điều gì chỉ một vài thao tác chính là quan trọng cho sự thành công của thuật toán. Vì vậy, câu hỏi sau đó trở thành:

  • tốt hơn là mô tả một chương trình kho thịt có khả năng diễn giải toàn bộ đặc tả của Ngôn ngữ chính thức như C ++ / C # / Python / etc ... để hiểu thuật toán
  • hoặc chỉ xác định 4 hoặc hơn các nguyên hàm cần thiết để hiểu thuật toán.

Cho rằng học một ngôn ngữ là Khó, và người đọc phải học / học một ngôn ngữ để hiểu thuật toán, vì người viết sách giáo khoa bạn nên hỏi gì về người đọc?


0

Tôi đã đi ngược lại hạt gạo ở đây và lập luận rằng có, sách và hướng dẫn nên sử dụng mã giả dựa trên các ngôn ngữ cấp cao thực sự thay vì phát minh ra một cú pháp mã giả hoàn toàn mới.

Tuy nhiên, tôi cũng cảnh báo bất kỳ tác giả và độc giả nào khi được sử dụng trong ngữ cảnh này, đây phải là phiên bản giả của ngôn ngữ thực và các tác giả nên lưu ý không quá khắt khe về việc tuân theo cú pháp và giới hạn của ngôn ngữ. Thay vào đó, các tác giả nên suy nghĩ cẩn thận về những gì họ đang cố gắng giao tiếp với đoạn trích và ẩn các chi tiết không liên quan đằng sau các lệnh gọi và / hoặc nhận xét thay vì cố gắng thực hiện đầy đủ, thực sự có thể biên dịch được hoặc mã đó là ngôn ngữ cơ bản được chọn .

Các tác giả nên có một chút tự do sáng tạo về ngôn ngữ để hiểu ý của họ để ngay cả những người chỉ biết những điều cơ bản của ngôn ngữ vẫn có thể hiểu được ý chính của đoạn trích, trong khi những người tìm kiếm ngữ nghĩa chính xác hơn có thể tham khảo tài liệu của ngôn ngữ hoặc dự phòng kiến thức trước đây của họ về ngôn ngữ để điền vào các chi tiết.

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.