Bằng đại học của tôi là về Khoa học nhận thức và Trí tuệ nhân tạo. Từ đó tôi đã có một đoạn giới thiệu một khóa học về Lisp. Tôi nghĩ rằng ngôn ngữ này rất thú vị (như "thanh lịch") nhưng thực sự không nghĩ nhiều về nó cho đến khi tôi bắt gặp Quy tắc thứ mười của Greensasta sau đó:
Bất kỳ chương trình C hoặc Fortran nào đủ phức tạp đều chứa một chương trình đặc biệt, được chỉ định không chính thức, có lỗi, triển khai chậm một nửa Common Lisp.
Quan điểm của Greensasta là (một phần) rằng nhiều chương trình phức tạp có trình thông dịch tích hợp. Thay vì xây dựng một trình thông dịch thành ngôn ngữ, ông cho rằng việc sử dụng một ngôn ngữ như Lisp đã có sẵn một trình thông dịch (hoặc trình biên dịch) có ý nghĩa hơn.
Lúc đó tôi đang làm việc trên một ứng dụng khá lớn thực hiện các tính toán do người dùng xác định bằng trình thông dịch tùy chỉnh cho ngôn ngữ tùy chỉnh. Tôi quyết định thử viết lại cốt lõi của nó trong Lisp như một thử nghiệm quy mô lớn.
Mất khoảng sáu tuần. Mã ban đầu là ~ 100.000 dòng Delphi (một biến thể Pascal). Trong Lisp đã giảm xuống ~ 10.000 dòng. Tuy nhiên, điều đáng ngạc nhiên hơn nữa là thực tế là động cơ Lisp nhanh hơn 3-6 lần. Và hãy nhớ rằng đây là công việc của một tân sinh viên Lisp! Đó là toàn bộ trải nghiệm đối với tôi; lần đầu tiên tôi thấy khả năng kết hợp hiệu suất và biểu cảm trong một ngôn ngữ duy nhất.
Một thời gian sau khi tôi bắt đầu làm việc với một dự án dựa trên web, tôi đã thử giọng một số ngôn ngữ. Tôi đã bao gồm Lisp và Scheme trong hỗn hợp. Cuối cùng, tôi đã chọn một triển khai Đề án-- Lược đồ Chez . Tôi đã rất hài lòng với kết quả.
Dự án dựa trên web là một "công cụ lựa chọn" hiệu suất cao . Chúng tôi sử dụng Lược đồ theo một số cách khác nhau, từ xử lý dữ liệu đến truy vấn dữ liệu để tạo trang. Ở nhiều điểm, chúng tôi thực sự bắt đầu với một ngôn ngữ khác nhưng cuối cùng lại chuyển sang Scheme vì những lý do tôi sẽ mô tả ngắn gọn dưới đây.
Bây giờ tôi có thể trả lời câu hỏi của bạn (ít nhất là một phần).
Trong buổi thử giọng, chúng tôi đã xem xét một loạt các triển khai Lisp và Scheme. Về phía Lisp, chúng tôi đã xem xét (tôi tin) Allegro CL, CMUCL, SBCL và LispWorks. Về phía Scheme, chúng tôi đã xem xét (tôi tin) Bigloo, Chicken, Chez, Gambit. (Việc lựa chọn ngôn ngữ đã có từ lâu; đó là lý do tại sao tôi hơi mơ hồ. Tôi có thể khai thác một số ghi chú nếu nó quan trọng.)
Ngay lập tức chúng tôi đang tìm kiếm một) chủ đề gốc và b) Hỗ trợ Linux, Mac và Windows. Hai điều kiện đó kết hợp đã đánh gục tất cả mọi người nhưng (tôi nghĩ) Allegro và Chez - vì vậy để tiếp tục đánh giá, chúng tôi phải nới lỏng yêu cầu đa luồng.
Chúng tôi tập hợp một bộ các chương trình nhỏ và sử dụng chúng để đánh giá và thử nghiệm. Điều đó tiết lộ một số vấn đề. Ví dụ: một số triển khai có các khiếm khuyết ngăn một số thử nghiệm chạy đến hoàn thành; một số triển khai không thể biên dịch mã vào thời gian chạy; một số triển khai không thể dễ dàng tích hợp mã được biên dịch theo thời gian chạy với mã được biên dịch trước; một số triển khai có người thu gom rác rõ ràng tốt hơn (hoặc rõ ràng tệ hơn) so với những người khác; Vân vân.
Đối với nhu cầu của chúng tôi, chỉ có ba triển khai thương mại - Allegro, Chez và Lispworks - đã vượt qua các thử nghiệm chính của chúng tôi. Trong ba người duy nhất, Chez đã vượt qua tất cả các bài kiểm tra với màu sắc bay. Vào thời điểm đó, tôi nghĩ Lispworks không có chủ đề gốc trên bất kỳ nền tảng nào (tôi nghĩ họ làm bây giờ) và tôi nghĩ Allegro chỉ có chủ đề gốc trên một số nền tảng. Hơn nữa, Allegro có phí cấp phép thời gian "gọi cho chúng tôi" mà tôi không thích lắm. Tôi tin rằng Lispworks không có phí thời gian chạy và Chez có sự sắp xếp đơn giản (và rất hợp lý) (và nó chỉ khởi động nếu bạn sử dụng trình biên dịch vào thời gian chạy).
Đã tạo ra một số đoạn mã đáng kể trong cả Lisp và Scheme, đây là một số điểm so sánh và tương phản:
Môi trường Lisp trưởng thành hơn rất nhiều. Bạn nhận được rất nhiều bang cho buck. (Đã nói rằng, nhiều mã hơn cũng tương đương với nhiều lỗi hơn.)
Môi trường Lisp khó học hơn rất nhiều. Bạn cần nhiều thời gian hơn để thành thạo; Lisp thông thường là một ngôn ngữ lớn - và đó là trước khi bạn đến các thư viện mà các triển khai thương mại thêm vào đầu nó. (Đã nói rằng, trường hợp cú pháp của Scheme tinh tế và phức tạp hơn nhiều so với bất kỳ điều gì trong Lisp.)
Môi trường Lisp có thể khó tạo ra nhị phân hơn. Bạn cần "lắc" hình ảnh của mình để loại bỏ các bit không cần thiết và nếu bạn không thực hiện chương trình của mình một cách chính xác trong quá trình đó, bạn có thể gặp phải lỗi thời gian chạy sau này . Ngược lại, với Chez, chúng tôi biên dịch một tệp cấp cao nhất bao gồm tất cả các tệp khác mà nó cần và chúng tôi đã hoàn tất.
Tôi đã nói trước đó rằng chúng tôi đã kết thúc việc sử dụng Scheme ở một số nơi mà ban đầu chúng tôi không có ý định. Tại sao? Tôi có thể nghĩ ra ba lý do ngoài đỉnh đầu.
Đầu tiên, chúng tôi đã học cách tin tưởng vào Chez (và nhà phát triển của nó, Cadence). Chúng tôi đã hỏi rất nhiều từ công cụ này và nó luôn được chuyển giao. Ví dụ, trong lịch sử, Chez có một số lượng nhỏ các khiếm khuyết nhỏ và trình quản lý bộ nhớ của nó rất, rất tốt.
Thứ hai, chúng tôi đã học cách yêu thích màn trình diễn mà chúng tôi có được từ Chez. Chúng tôi đã sử dụng thứ gì đó giống như ngôn ngữ kịch bản - và chúng tôi đã nhận được tốc độ mã gốc từ nó. Đối với một số điều không quan trọng - nhưng nó không bao giờ bị tổn thương, và đôi khi nó giúp ích rất nhiều.
Thứ ba, chúng tôi đã học cách yêu thích Đề án trừu tượng có thể cung cấp. Nhân tiện, tôi không chỉ có nghĩa là macro; Ý tôi là những thứ như đóng cửa, lambdas, gọi đuôi, v.v ... Một khi bạn bắt đầu nghĩ theo những thuật ngữ đó, các ngôn ngữ khác có vẻ khá hạn chế khi so sánh.
Đề án có hoàn hảo không? Không; đó là một sự đánh đổi. Đầu tiên, nó cho phép các nhà phát triển riêng lẻ hoạt động hiệu quả hơn - nhưng các nhà phát triển khó khăn hơn trong việc tìm kiếm mã của nhau vì các biển chỉ dẫn mà hầu hết các ngôn ngữ có (ví dụ: đối với các vòng lặp) đều bị thiếu trong Đề án (ví dụ: có hàng triệu cách để làm một vòng lặp for). Thứ hai, có một nhóm các nhà phát triển nhỏ hơn nhiều để nói chuyện, thuê, mượn, v.v.
Tóm lại, tôi nghĩ tôi muốn nói: Lisp và Scheme cung cấp một số khả năng không có sẵn ở bất kỳ nơi nào khác. Khả năng đó là một sự đánh đổi, vì vậy tốt hơn hết là nên có ý nghĩa trong trường hợp cụ thể của bạn. Trong trường hợp của chúng tôi, các yếu tố quyết định giữa việc đi với Lisp hay Scheme có liên quan nhiều hơn đến các tính năng rất cơ bản (hỗ trợ nền tảng, luồng nền tảng, biên dịch thời gian chạy, cấp phép thời gian chạy) so với các tính năng ngôn ngữ hoặc thư viện. Một lần nữa, trong trường hợp của chúng tôi cũng là một sự đánh đổi: với Chez chúng tôi có các tính năng cốt lõi mà chúng tôi muốn nhưng chúng tôi đã mất các thư viện rộng lớn mà môi trường Lisp thương mại có.
Ngoài ra, chỉ để nhắc lại: chúng tôi đã xem xét các Lisps và Đề án khác nhau từ lâu; tất cả họ đã phát triển và cải thiện kể từ đó.