Đo lường sức mạnh khác với sự hoàn thiện của Turing


18

Ban đầu tôi đã thử hỏi điều này trên StackOverflow, nhưng nó quá chủ quan :-(. Tôi quan tâm đến các phương pháp xác định sức mạnh của ngôn ngữ lập trình. đo công suất phân biệt đối xử giữa các ngôn ngữ mà là thực sự trong sử dụng. Ví dụ lập trình, có thể bất cứ ai đề xuất một phương pháp không chủ quan rằng sẽ phân biệt đối xử giữa lắp ráp và Java?

Turing phương tiện đầy đủ rằng một ngôn ngữ là tối đa mạnh mẽ trong những gì nó có thể xuất (trong đó khá nhiều phương tiện nó có thể làm bất cứ điều gì phi thời gian thực dựa trong thế giới thực). Vì vậy, nếu chúng ta muốn xác định một biện pháp mạnh mẽ hơn, chúng ta cần thực hiện một cách tiếp cận khác. Độ ngắn đã được đề xuất trong câu hỏi ban đầu, nhưng điều này không dễ xác định chút nào. Có ai có bất cứ đề nghị nào khác không?

Câu trả lời:


24

Khái niệm bạn đang tìm kiếm được gọi là tính biểu cảm và Matthias Felleisen có một định nghĩa chặt chẽ về mặt toán học:

" Mở sức mạnh ý nghĩa của Lập trình Ngôn ngữ "

www.ccs.neu.edu/scheme/pub/scp91-felleisen.ps.gz (Phiên bản đăng bài)

Trực giác đằng sau ý tưởng là nếu bạn có hai chương trình tương đương với hai ngôn ngữ khác nhau - giả sử, chương trình A bằng ngôn ngữ X và chương trình B bằng ngôn ngữ Y-- và nếu bạn thực hiện thay đổi cục bộ thành A yêu cầu thay đổi toàn cầu thành B , sau đó X biểu cảm hơn Y.

Một ví dụ mà Felleisen cung cấp là phép gán: Trong các ngôn ngữ lập trình Scheme, bạn có thể loại bỏ toán tử gán và vẫn có ngôn ngữ hoàn chỉnh Turing. Tuy nhiên, trong một ngôn ngữ bị hạn chế như vậy, việc thêm một tính năng sẽ được bản địa hóa nếu cho phép chuyển nhượng sẽ yêu cầu thay đổi toàn cầu đối với chương trình mà không cần chuyển nhượng.

Thảo luận của tôi đã đơn giản hóa một số chi tiết và bạn nên đọc bài báo cho toàn bộ tài khoản.

Để trả lời câu hỏi khác của bạn: Bạn có thể nói rằng Java có ý nghĩa hơn so với lắp ráp bởi vì bạn có thể thêm một lớp mới vào chương trình Java của mình và sau đó thu được lợi ích của đa hình bằng cách yêu cầu các phần khác của chương trình gọi các phương thức của nó mà không cần sửa đổi toàn cục. Xử lý ngoại lệ là một ví dụ khác trong đó Java có tính biểu cảm cao hơn lắp ráp: Bạn chỉ cần viết một throwcâu lệnh để chuyển điều khiển lên ngăn xếp. Ở cấp độ cơ bản hơn, bạn cũng có thể thêm một casetuyên bố mới ở gần đầu a switchvà bạn sẽ không phải lo lắng về việc tính toán lại bất kỳ bước nhảy nào bằng tay.


Cảm ơn rât nhiều! Điều này thật đúng với gì mà tôi đã tìm kiếm!
Casebash

6

Nếu tôi hiểu chính xác câu hỏi của bạn, dù sao bạn cũng đang tìm kiếm thứ gì đó tương đối có thể đo lường được và không chỉ là một cuộc gọi phán xét chủ quan. Nếu vậy, cá nhân tôi sẽ ủng hộ lượng thời gian cần thiết để giải quyết bất kỳ vấn đề cụ thể nào (tính trung bình trên tất cả các vấn đề và tất cả các lập trình viên). Trong biện pháp này, bạn có thể cần xem xét không chỉ ngôn ngữ mà còn cả khung / API được sử dụng với nó. Cú pháp ngắn gọn là một yếu tố rất nhỏ: một điều quan trọng hơn nhiều là chức năng được yêu cầu phổ biến nhất có thể dễ dàng truy cập.

Nếu bạn đang tìm kiếm một cái gì đó chủ quan hơn, tôi sẽ nói nó thú vị như thế nào . Các lập trình viên có xu hướng là những người muốn giải quyết vấn đề, vì vậy một ngôn ngữ lập trình thú vị cho các lập trình viên sử dụng chắc chắn sẽ là ngôn ngữ sẽ giải quyết được nhiều vấn đề nhất. Biện pháp này tính đến việc những người khác nhau có sở thích khác nhau về cách sử dụng mọi thứ, do đó, ngôn ngữ lập trình tốt nhất của Lọ sẽ là ngôn ngữ hấp dẫn nhất đối với phạm vi lập trình viên rộng nhất. Tuy nhiên, bạn có thể cần xem xét không chỉ ngôn ngữ lập trình và API ở đây, mà cả môi trường (IDE), tất nhiên đó là những gì lập trình viên thực sự tương tác.


Tôi sẽ nói rằng đo thời gian thực hiện là chủ quan. Lập trình viên nào đã dành thời gian? Nếu bạn kiểm tra cả hai ngôn ngữ với cùng một lập trình viên, thì ngôn ngữ nào anh ta biết rõ hơn? Có nhiều cách thống kê để đối phó với điều này, nhưng một người không thể làm điều đó một mình.
John Fisher

1
@ John: Chỉ vì một cái gì đó chỉ có thể được phân tích thống kê không có nghĩa là nó chủ quan.
David Thornley

@David: Đó không thực sự là quan điểm của tôi. Vấn đề là nếu không có nghiên cứu từ trước, người hỏi sẽ không thể so sánh "sức mạnh" của các ngôn ngữ mà anh ta quan tâm - khiến nó trở nên chủ quan khi không được phân tích thống kê trong một nhóm lớn.
John Fisher

1

Tôi xác định mức độ mạnh mẽ của một ngôn ngữ bằng cách bạn có thể làm việc hiệu quả với nó. Rất nhiều người có xu hướng nói về năng suất về mặt viết mã một cách nhanh chóng, nhưng vì phần lớn vòng đời của chương trình là bảo trì, không phát triển, nên một biện pháp tốt hơn là bạn có thể đọc và gỡ lỗi mã dễ dàng như thế nào, đặc biệt là khi nó được viết bởi ai đó khác Các ngôn ngữ mạnh nhất là những ngôn ngữ dễ đọc và duy trì nhất.


2
Khó khăn với điều này là việc biết một ngôn ngữ giúp người biết nó dễ dàng hơn. Vì vậy, biện pháp này trở nên chủ quan.
John Fisher

1

Bạn cần xác định thuật ngữ của bạn tốt hơn.

Turing hoàn thiện không phải là về "sức mạnh" theo nghĩa mà bạn có thể có nghĩa. Thay vào đó là về khả năng tính toán; tức là liệu một ngôn ngữ nhất định có thể diễn đạt bất kỳ chương trình nào có thể được thực hiện bằng máy Turing hay không. Nó chỉ ra rằng mọi ngôn ngữ lập trình đã hoàn tất.

Những gì bạn có thể là sau đó là thước đo của cái được gọi là "tính biểu cảm" của ngôn ngữ lập trình. Tôi không chắc chắn nếu có bất kỳ biện pháp như vậy tồn tại, hoặc nếu nó có, nếu nó hữu ích. Về cơ bản, các ngôn ngữ lập trình khác nhau tốt hơn trong việc thể hiện các giải pháp cho các loại vấn đề khác nhau.

CHỈNH SỬA

Chỉ cần đánh vần nó ra, các ngôn ngữ lập trình không có thuộc tính được gọi là "sức mạnh". Có một khái niệm thường được gọi là "biểu cảm" hoặc "sức mạnh biểu cảm" của ngôn ngữ lập trình. Tính biểu cảm là một phần về việc dễ dàng viết các chương trình cô đọng để giải quyết các vấn đề cụ thể. Nhưng cũng có một thước đo đáng kể về việc dễ dàng đọc và viết các chương trình. Nó giống như "vẻ đẹp". Tôi sẽ biết nó khi tôi nhìn thấy nó, nhưng đừng yêu cầu tôi xác định nó.

Đơn giản chỉ cần so sánh số lượng nhân vật không cung cấp cho bạn một thước đo đầy đủ về biểu cảm. Nếu không, bạn có thể làm cho một ngôn ngữ trở nên biểu cảm hơn bằng cách nén mã nguồn ... và điều đó thật vô nghĩa. Trên thực tế, tôi không biết về bất kỳ thước đo khách quan nào về biểu cảm và tôi cực kỳ nghi ngờ rằng không tồn tại. Mà hiệu quả làm cho đặc tính vô dụng, và khá không thú vị.


1
Tôi biết rằng tính đầy đủ của Turing là về khả năng tính toán. Chúng tôi biết rằng tồn tại các biện pháp ít hơn về quy mô tính toán, chẳng hạn như máy trạng thái hữu hạn. Nhưng chúng ta không thể sử dụng khả năng tính toán để xác định mức độ sức mạnh trên mức này, vì tính hoàn chỉnh của Turing có sức mạnh tối đa về khả năng tính toán
Casebash

@Casebash - bạn vẫn chưa nói "sức mạnh" là gì.
Stephen C

2
Đó là bởi vì tôi không biết và đó là toàn bộ vấn đề của câu hỏi này!
Casebash

Vậy thì câu trả lời của bạn là gì? Nó nên là một bình luận.
rebierpost

@reinerpost - Quan điểm của câu trả lời của tôi là giải thích chi tiết rằng Câu hỏi là vô nghĩa, và tại sao. Về cơ bản Câu hỏi đang hỏi "Có một thứ gọi là 'sức mạnh biểu cảm' - tôi không biết nó là gì nhưng bạn có thể cho tôi biết cách đo lường nó không." Và câu trả lời của tôi là 'sức mạnh biểu cảm' là khái niệm / tính chất không xác định rõ ràng và DEFINITELY không phải là một khái niệm có thể đo lường / định lượng được. (Và đây rõ ràng là một Câu trả lời và không phải là một nhận xét. Có lẽ bạn chỉ đơn giản là không hiểu những gì tôi đang cố nói?)
Stephen C
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.