Mà những lời chỉ trích cũ của lisp phổ biến vẫn còn áp dụng ngày nay?


29

Trong A Critique of Common Lisp được viết bởi Rodney A. Brooks và Richard P. Gabriel từ Stanford năm 1984, một số quyết định thiết kế được giữ lại bởi ủy ban bình thường hóa Common Lisp được thảo luận. Mặc dù hầu hết các cuộc thảo luận vẫn còn hiệu lực, có hai tuyên bố đề cập đến công nghệ có sẵn tại thời điểm đó và có thể sai trong ngày hôm nay.

Hai tuyên bố này là:

Quá nhiều chi phí của ngôn ngữ đã bị loại bỏ với lời khuyên rằng 'bất kỳ trình biên dịch tốt' nào cũng có thể chăm sóc chúng. Chưa có ai viết được mà cũng không có khả năng nếu không có nỗ lực to lớn, một trình biên dịch thực hiện một phần các thủ thuật được mong đợi từ nó.

Vì tôi là người mới làm quen với Lisp, hoặc thậm chí là người học việc, tôi không thể cụ thể hơn các tác giả. Họ dường như nói rằng một tính tổng quát và tính linh hoạt tuyệt vời đã được xây dựng trong một số khía cạnh của ngôn ngữ, khiến cho việc viết một trình biên dịch tốt khá khó khăn.

Trong CommON LISP, một chút kiểm soát đã được đặt vào số học dấu phẩy động. Và chắc chắn, mặc dù có thể đạt được hành vi chính xác của một chương trình chuyên sâu về dấu phẩy động, hiệu suất có thể thay đổi một cách dữ dội.

Theo tôi hiểu, có vẻ như việc viết mã số hiệu quả trong Common Lisp là có thể nhưng khó khăn hơn nó phải có.

Đây là ba mươi năm trước. Làm thế nào tôi nên xem xét các tuyên bố này ngày hôm nay nếu tôi sẵn sàng viết các chương trình Lisp chung cho một trong những triển khai phần mềm miễn phí phổ biến (CLISP, SBCL và cộng sự)?


Câu hỏi tuyệt vời! Rất thích nghe từ ai đó am hiểu về Common Lisp về chủ đề này. Nỗi sợ hãi của tôi là họ vẫn áp dụng, dựa trên mức độ phổ biến tương đối rõ ràng của Common Lisp ngày nay.

1
Điểm nổi là khó để có được đúng. Một số ngôn ngữ chỉ định một mô hình nghiêm ngặt và chịu hiệu suất khôn ngoan, những ngôn ngữ khác sử dụng mô hình lỏng lẻo và khó lý luận. Ví dụ, lý do về các chương trình dấu phẩy động đơn giản trong C # là quá khó đối với tôi. Vì vậy, tôi có xu hướng bên cạnh các nhà thiết kế ngôn ngữ, những người nghiêm khắc với điểm nổi, ngay cả khi nó có chi phí hiệu suất.
CodeInChaos

2
Mặt khác, phần cứng hiện đại thường thực hiện điểm nổi của IEEE, do đó, có lẽ nó có thể dự đoán được nhiều hơn trong hành vi của nó so với các triển khai có sẵn vào năm 1984.
microtherion 4/12/13

Câu trả lời:


31

Bài viết thú vị theo nhiều cách.

Phần thú vị nhất là đây: các tác giả đã làm sai lệch bài báo từ năm 1984 chỉ hai năm sau đó vào năm 1986. Brooks và Gabriel đã phát triển một trình biên dịch Lisp tối ưu hóa cao và bán nó rất thành công về mặt thương mại trong vài năm: Lucid Common Lisp (PDF).

Bảo trì cho trình biên dịch Lisp này vẫn có sẵn từ LispWorks : bây giờ nó được gọi là Liquid Common Lisp .

Tối ưu hóa trình biên dịch của Liquid CL được ghi lại trong Chương 3 của Hướng dẫn người dùng nâng cao : Tối ưu hóa các chương trình Lisp .

Một số ứng dụng thương mại đã được viết và triển khai trong Lucid CL. Ví dụ, ở thành phố quê hương của tôi, hệ thống thông tin giao thông công cộng đầu tiên cho HVV (Hamburger Verkehrsverbund) đã được triển khai bằng Lucid CL trên máy quay phim SUN SPARCstation. Nó có sẵn cho công chúng trong các nhà ga bằng màn hình cảm ứng lớn và trong trung tâm cuộc gọi.

Lucid CL đã thành công vì trình biên dịch chế độ sản xuất của nó đã tạo ra các ứng dụng Common Lisp nhanh, chủ yếu cho các nền tảng Unix / RISC.

Brooks và Gabriel đang viết về Lucid Common Lisp vào năm 1986:

Trình biên dịch có thể nhắm mục tiêu động đã được chứng minh là một phương tiện giúp dễ dàng biên dịch cho nhiều cách triển khai Lisp khác nhau; một phương tiện chuyển hệ thống Lisp sang nhiều loại máy tính; và một công cụ để sản xuất mã hiệu suất cao, chất lượng cao cho nhiều loại máy tính từ một nguồn chung.

Do đó, họ đã thực hiện những gì mà Phê bình chung Lisp tuyên bố là khó khăn hoặc không thể.

Ngày nay, các triển khai nâng cao hơn đang thực hiện rất nhiều tối ưu hóa, nhưng phần cứng cũng nhanh hơn 1000 lần so với những gì chúng ta có vào năm 1984. Một VAX 11/780 sau đó có một MIPS (triệu hướng dẫn mỗi giây) và Máy Lisp cũng có trong phạm vi đó. Một chiếc Motorola 68000 có tốc độ xung nhịp 8 MHz.

Những lời chỉ trích về hiệu suất điểm nổi và hiệu suất thay đổi nói chung vẫn còn hiệu lực, nhưng điều này phản ánh sự lựa chọn của người thực hiện. Một số triển khai không được phát triển như trình biên dịch hiệu năng cao. Trọng tâm chính của họ có thể là tính di động, nhỏ gọn hoặc một cái gì đó khác và do đó họ có các mục tiêu thực hiện khác nhau.

Là người dùng / nhà phát triển, người ta không bị buộc phải viết mã di động và sử dụng tất cả mười hệ thống Common Lisp hiện được hỗ trợ. Sử dụng thực hiện phù hợp nhất với vấn đề ứng dụng.


Câu trả lời của bạn rất chính xác và chi tiết, nó chắc chắn xứng đáng với tiền thưởng!
dùng40989

1
"Tối ưu hóa cao" không nhất thiết có nghĩa là trình biên dịch "đủ thông minh". Các từ "đủ thông minh" đưa ra câu hỏi "cho mục đích gì?". Vẫn còn các ứng dụng (chủ yếu dành cho các nền tảng nhúng rất hạn chế) mà bạn sẽ không viết trong Common Lisp vì việc tối ưu hóa vẫn không thể loại bỏ tất cả các chi phí thời gian chạy khỏi gõ động, phân bổ heap và thu gom rác. Tất nhiên Common Lisp không có gì là độc nhất trong "thất bại" đó. Không có ngôn ngữ đã được quan sát trong tự nhiên nhưng thực sự phù hợp với tất cả mọi thứ.
Steve314

@ Steve314: Các mục tiêu của Lucid CL là thị trường cho các hệ thống AI, hệ thống CAD lớn, dựa trên Lisp, v.v. trên các máy trạm và máy chủ Unix. Mục tiêu Lucid CL không phải là hệ thống nhúng. Lucid CL giải quyết vấn đề thời gian thực của việc gõ động, phân bổ heap và nhiều khu vực tối ưu hóa khác - bao gồm cả trình thu gom rác hiệu suất. Tuy nhiên, chủ yếu là cần thiết. Thông thường, ứng dụng sử dụng các kỹ thuật đặc biệt để tránh sự cố chấp và do đó để giảm tỷ lệ GC, như nhóm 'tài nguyên'.
Rainer Joswig

21

Khi bài báo này được viết vào năm 1984, một máy tính có RAM 1 megabyte và ổ cứng 20 megabyte, có khả năng ngồi trên bàn của bạn, là một vấn đề lớn. Đương nhiên, tranh chấp sẽ nảy sinh về tính thực tiễn của một ngôn ngữ cấp cao như Lisp trên phần cứng mà spartan. Những tiến bộ trong cả công nghệ phần cứng và trình biên dịch đã diễn ra kể từ đó đã giúp các chương trình Lisp dễ dàng viết và thực thi hơn, bất kể sự thiếu hiệu quả về số có thể có trong ngôn ngữ.

Các lập trình viên thường đánh đổi hiệu quả tính toán để đạt hiệu quả lập trình. Lisp có thể là một ngôn ngữ chậm (trong một số triển khai, nhưng các ngôn ngữ khác cũng vậy), nhưng nó cũng có tiếng là xứng đáng để phát triển nhanh chóng, và nhiều chương trình không yêu cầu cơ sở hạ tầng được tối ưu hóa cao để thể hiện hiệu suất đầy đủ.

Việc lựa chọn triển khai Lisp có thể ảnh hưởng lớn đến hồ sơ hiệu suất của các chương trình của bạn. Ví dụ: CLISP dễ dàng thừa nhận rằng "Nếu mã của bạn có số lượng lớn, bạn có thể thích CMUCL." Một số triển khai Lisp (và Scheme) hiện đại cho phép bạn chỉ định các gợi ý loại số, điều này sẽ tăng hiệu suất số.

Nói tóm lại, tình hình ngày nay tốt hơn nhiều so với lú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.