«Ngôn ngữ lập trình vĩ đại nhất từng được tạo ra«
- Alan Kay, "trên Lisp"

Khi McCarthy phát triển Lisp vào cuối những năm 1950, nó hoàn toàn khác với các ngôn ngữ hiện có, trong đó quan trọng nhất là .
Lisp giới thiệu chín ý tưởng mới:
1. Câu điều kiện. Câu lệnh có điều kiện là cấu trúc if-then-else. Bây giờ chúng tôi coi chúng là đương nhiên. Họ đã McCarthy trong quá trình phát triển Lisp. (Fortran vào thời điểm đó chỉ có các câu lệnh goto, gắn chặt với hướng dẫn chi nhánh về phần cứng cơ bản.) McCarthy, khi còn ở trong ủy ban Algol, đã đóng góp các điều kiện cho Algol, từ đó chúng lan rộng sang các ngôn ngữ khác.
2. Một loại chức năng. Trong Lisp, hàm là đối tượng hạng nhất - chúng là kiểu dữ liệu, giống như số, chuỗi, v.v. và có biểu diễn bằng chữ, có thể được lưu trữ trong các biến, có thể được truyền dưới dạng đối số, v.v.
3. đệ quy. Tất nhiên, đệ quy đã tồn tại như một khái niệm toán học trước Lisp, nhưng Lisp là ngôn ngữ lập trình đầu tiên hỗ trợ nó. (Điều này có lẽ được ngụ ý trong việc tạo ra các hàm như các đối tượng hạng nhất.)
4. Khái niệm mới về biến. Trong Lisp, tất cả các biến đều là con trỏ hiệu quả. Giá trị là những gì loại có, không phải biến và việc gán hoặc liên kết các biến có nghĩa là sao chép con trỏ chứ không phải nội dung chúng trỏ tới.
5. Thu gom rác thải.
6. Các chương trình bao gồm các biểu thức. Chương trình Lisp là cây biểu thức, mỗi biểu thức trả về một giá trị. (Một số biểu thức Lisp có thể trả về nhiều giá trị.) Điều này trái ngược với Fortran và nhiều ngôn ngữ thành công khác trong việc phân biệt giữa “biểu thức” và “câu lệnh”.
Việc có sự khác biệt này ở Fortran là điều tự nhiên vì ngôn ngữ được định hướng theo dòng (không có gì đáng ngạc nhiên đối với ngôn ngữ có định dạng đầu vào là thẻ đục lỗ). Bạn không thể có các câu lệnh lồng nhau. Và miễn là bạn cần các biểu thức toán học để hoạt động, thì việc yêu cầu bất kỳ thứ gì khác trả về một giá trị cũng chẳng ích gì vì có thể không có thứ gì đang chờ được trả về.
Các hạn chế đã được dỡ bỏ với sự ra đời của các ngôn ngữ có cấu trúc khối, nhưng khi đó thì đã quá muộn. Sự khác biệt giữa biểu thức và tuyên bố đã được thiết lập. Nó được truyền từ Fortran tới Algol và xa hơn nữa là đến con cháu của họ.
Khi một ngôn ngữ được tạo hoàn toàn bằng các biểu thức, bạn có thể soạn các biểu thức theo bất kỳ cách nào bạn muốn. Bạn có thể viết cả hai (sử dụng cú pháp )
(if foo (= x 1) (= x 2))hoặc
(= x (if foo 1 2))7. Một loại ký hiệu. Các ký tự khác với chuỗi, trong trường hợp đó bạn có thể kiểm tra sự bằng nhau bằng cách so sánh các con trỏ.
8. Một ký hiệu cho mã sử dụng cây ký hiệu.
9. Toàn bộ ngôn ngữ luôn có sẵn. Không có sự khác biệt rõ ràng giữa thời gian đọc, thời gian biên dịch và thời gian chạy. Bạn có thể biên dịch hoặc chạy mã trong khi đọc hoặc đọc hoặc chạy mã trong khi biên dịch hoặc đọc hoặc biên dịch mã trong khi mã chạy.
Chạy mã trong khi đọc cho phép người dùng lập trình lại cú pháp của Lisp; chạy mã tại thời điểm biên dịch là cơ sở cho macro; Quá trình biên dịch thời gian chạy là cơ sở để sử dụng Lisp làm ngôn ngữ mở rộng trong các chương trình như Emacs; và cuối cùng, việc đọc trong thời gian chạy cho phép các chương trình giao tiếp bằng cách sử dụng biểu thức s, một ý tưởng gần đây đã được phát minh lại trong XML.
Kết luận
Khi Lisp lần đầu tiên được phát minh, những ý tưởng này khác xa so với thực tiễn lập trình thông thường do phần cứng có sẵn vào cuối những năm 1950 quy định.
Theo thời gian, ngôn ngữ mặc định, thể hiện qua sự thành công của các ngôn ngữ phổ biến, dần dần phát triển theo hướng Lisp. Điểm 1-5 hiện được chấp nhận rộng rãi. Điểm 6 đang bắt đầu xuất hiện trong xu hướng chủ đạo. Trong Python, có mệnh đề 7 ở một dạng nào đó, mặc dù không có cú pháp phù hợp. Mục 8, (với mục 9) giúp tạo macro trong Lisp, vẫn chỉ có trong Lisp, có thể vì (a) nó yêu cầu những dấu ngoặc đơn đó hoặc thứ gì đó tệ hại không kém, và (b) nếu bạn thêm mức tăng sức mạnh mới nhất này, bạn có thể không còn tuyên bố đã phát minh ra một ngôn ngữ mới mà chỉ phát triển một phương ngữ mới của Lisp; -)
Mặc dù điều này hữu ích cho các lập trình viên hiện đại, nhưng thật lạ khi mô tả Lisp về sự khác biệt của nó so với các kỹ thuật ngẫu nhiên được áp dụng trong các ngôn ngữ khác. Đây có thể không phải là điều McCarthy đang nghĩ. Lisp không được thiết kế để sửa lỗi của Fortran; nó xuất hiện nhiều hơn như một sản phẩm phụ của việc cố gắng .
Nguồn: www.habr.com
