9 khác biệt của Lisp
Software Engineering
39
White

Ngoc Dao viết ngày 21/03/2016

When McCarthy designed Lisp in the late 1950s, it was a radical departure from existing languages, the most important of which was Fortran.

Khi McCathy thiết kế Lisp vào cuối những năm 1950, nó đã bứt phá khỏi những ngôn ngữ khác, quan trọng nhất trong số đó là Fortran.

Lisp embodied nine new ideas:

Lisp là hiện thân của 9 ý tưởng mới:

1. Conditionals. A conditional is an if-then-else construct. We take these for granted now. They were invented by McCarthy in the course of developing Lisp. (Fortran at that time only had a conditional goto, closely based on the branch instruction in the underlying hardware.) McCarthy, who was on the Algol committee, got conditionals into Algol, whence they spread to most other languages.

1. Điều kiện. Đó là cấu trúc if-then-else. Chúng ta dùng chúng đến bây giờ. Chúng được phát minh bởi McCathy trong quá trình phát triển Lisp. (Fortran vào thời điểm đó chỉ có điều kiện goto, dựa trên lệnh rẽ nhánh của phần cứng phía dưới.) McCathy, có chân trong ủy ban Algol, đã đưa cấu trúc điều kiện vào Algol, và từ đó chúng lan ra hầu hết những ngôn ngữ khác.

2. A function type. In Lisp, functions are first class objects-- they're a data type just like integers, strings, etc, and have a literal representation, can be stored in variables, can be passed as arguments, and so on.

2. Kiểu hàm. Trong Lisp, hàm là cũng là biến bình thường -- chúng là một kiểu dữ liệu giống như kiểu số, chuỗi, v.v., và có thể được biểu diễn bằng giá trị,  có thể lưu trữ trong các biến, có thể truyền như tham số, v.v.

3. Recursion. Recursion existed as a mathematical concept before Lisp of course, but Lisp was the first programming language to support it. (It's arguably implicit in making functions first class objects.)

3. Đệ quy. Đệ quy là khái niệm toán học có trước khi Lisp ra đời, nhưng Lisp là ngôn ngữ đầu tiên hỗ trợ nó.

4. A new concept of variables. In Lisp, all variables are effectively pointers. Values are what have types, not variables, and assigning or binding variables means copying pointers, not what they point to.

4. Khái niệm mới về biến. Trong Lisp tất cả biến đều có thể coi là con trỏ. Giá trị là những gì có kiểu, chứ không phải biến, và gán hoặc ràng buộc giá trị vào biến đồng nghĩa với sao chép con trỏ, chứ không phải cái chúng trỏ đến.

5. Garbage-collection.

5. Thu dọn rác (tự động quản lí bộ nhớ).

6. Programs composed of expressions. Lisp programs are trees of expressions, each of which returns a value. (In some Lisps expressions can return multiple values.) This is in contrast to Fortran and most succeeding languages, which distinguish between expressions and statements.

6. Chương trình được kết hợp bởi các biểu thức. Chương trình Lisp là cây chứa các biểu thức, mỗi biểu thức trả về một giá trị. (Trong một số ngôn ngữ phái sinh từ Lisp, biểu thức có thể trả về nhiều giá trị.) Đây là khác biệt với Fortran và hầu hết các ngôn ngữ ra đời sau đó, vì chúng phân biệt biểu thức và phát biểu.

It was natural to have this distinction in Fortran because (not surprisingly in a language where the input format was punched cards) the language was line-oriented. You could not nest statements. And so while you needed expressions for math to work, there was no point in making anything else return a value, because there could not be anything waiting for it.

Sự phân biệt này là tự nhiên trong Fortran vì (không có gì ngạc nhiên trong ngôn ngữ mà định dạng dữ liệu là thẻ đục lỗ) nó là ngôn ngữ lấy mỗi lệnh phải nằm một dòng. Không thể lồng các phát biểu. Trong khi bạn có thể sử dụng biểu thức để tính toán, thì thật là vô nghĩa nếu bất kì cái gì khác ngoài biểu thức trả về giá trị, vì chẳng có cái gì cần đến giá trị này.

This limitation went away with the arrival of block-structured languages, but by then it was too late. The distinction between expressions and statements was entrenched. It spread from Fortran into Algol and thence to both their descendants.

Giới hạn này đã được giải quyết với sự ra đời của ngôn ngữ theo dạng cấu trúc khối, nhưng lúc đó mọi sự đã quá trễ. Sự khác biệt giữa biểu thức và phát biểu đã trở nên khó thay đổi. Nó truyền từ Fortran sang Algol và sau đó là cả những ngôn ngữ phái sinh từ cả hai.

Trong ngôn ngữ gồm tòan biểu thức ví dụ như Ruby, bạn có thể viết:

if foo
x = 1
else
x = 2
end

hoặc

x = if foo
1
else
2
end

Trong C không thể viết theo cách 2 vì trong C "x = 1" là expression nhưng "if" là statement chứ không phải expression.

7. A symbol type. Symbols differ from strings in that you can test equality by comparing a pointer.

7. Kiểu ký hiệu. Kí hiệu khác với chuỗi ở chỗ bạn có thể kiểm tra xem chúng có bằng nhau hay không bằng cách so sánh con trỏ.

8. A notation for code using trees of symbols.

8. Cách viết mã sử dụng cây kí hiệu.

9. The whole language always available. There is no real distinction between read-time, compile-time, and runtime. You can compile or run code while reading, read or run code while compiling, and read or compile code at runtime.

9. Ngôn ngữ có thể sử dụng mọi lúc mọi nơi.  Không có sự khác biệt thực sự giữa lúc đọc, lúc biên dịch, và lúc chạy. Bạn có thể biên dịch hoặc chạy mã trong khi đang đọc, đọc hoặc chạy mã trong khi đang biên dịch, và đọc hoặc biên dịch mã lúc đang chạy.

Running code at read-time lets users reprogram Lisp's syntax; running code at compile-time is the basis of macros; compiling at runtime is the basis of Lisp's use as an extension language in programs like Emacs; and reading at runtime enables programs to communicate using s-expressions, an idea recently reinvented as XML.

Chạy mã lúc đọc giúp chỉnh sửa cú pháp Lisp; chạy mã lúc biên dịch là nền tảng của macro; biên dịch lúc chạy là nền tảng của việc dùng Lisp như là một ngôn ngữ mở rộng trong chương trình như Emacs; và đọc lúc chạy cho phép các chương trình giao tiếp thông qua biểu thức kí hiệu, một ý tưởng gần đây được phát minh lại dưới dạng XML.

-------- oOo --------

When Lisp was first invented, all these ideas were far removed from ordinary programming practice, which was dictated largely by the hardware available in the late 1950s.

Ban đầu khi Lisp được phát minh, tất cả những ý tưởng này đều xa lạ so với những phương pháp lập trình bình thường, những phương pháp bị chi phối nhiều bởi phần cứng vào cuối những năm 1950.

Over time, the default language, embodied in a succession of popular languages, has gradually evolved toward Lisp. 1-5 are now widespread. 6 is starting to appear in the mainstream. Python has a form of 7, though there doesn't seem to be any syntax for it. 8, which (with 9) is what makes Lisp macros possible, is so far still unique to Lisp, perhaps because (a) it requires those parens, or something just as bad, and (b) if you add that final increment of power, you can no longer claim to have invented a new language, but only to have designed a new dialect of Lisp ; -)

Theo thời gian, các ngôn ngữ đã từng bước tiến hoá về Lisp. 1-5 bây giờ đã phổ biến. 6 đã bắt đầu xuất hiện trong các ngôn ngữ được sử dụng nhiều nhất. Python có ý tưởng của 7, mặc dù nó chưa chính thức có cú pháp riêng cho ý tưởng này. 8 (là cái cho phép viết macro trong Lisp, đi đôi với 9) vẫn chỉ có trong Lisp, có lẽ vì (a) cần sử dụng dấu ngoặc ( ), hoặc cái gì đó tương tự, và (b) nếu ngôn ngữ của bạn làm được, thì bạn không thể tuyên bố bạn mới phát minh ra được ngôn ngữ mới, mà ngôn ngữ của bạn chỉ là một biến thể của Lisp.

Though useful to present-day programmers, it's strange to describe Lisp in terms of its variation from the random expedients other languages adopted. That was not, probably, how McCarthy thought of it. Lisp wasn't designed to fix the mistakes in Fortran; it came about more as the byproduct of an attempt to axiomatize computation.

Mặc dù hữu ích cho các lập trình viên ngày nay, thật lạ khi miêu tả Lisp qua những tính năng của Lisp mà các ngôn ngữ khác áp dụng. Có thể đó không phải là chủ đích ban đầu của McCathy khi phát minh ra Lisp. Lisp không được thiết kế để sửa chữa những sai lầm trong Fortran; hơn thế, nó là sản phẩm phụ của thử nghiệm xây dựng ngành khoa học máy tính dựa trên các tiên đề.

Nguồn: What Made Lisp Diffent

Đọc thêm:

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
301 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
66 8
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết gần 3 năm trước
66 8
White
42 1
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết hơn 2 năm trước
42 1
White
39 2
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết hơn 2 năm trước
39 2
Bài viết liên quan
White
1 1
Lập trình đôi (pair programming) là hình thức lập trình trong đó 2 người cùng hợp tác làm việc trên cùng màn hình (có thể khác bàn phím v.v.). Bài ...
Ngoc Dao viết hơn 2 năm trước
1 1
White
32 4
Như thường lệ, là chuyên mục quảng cáo, bài viết được đăng lại từ https://thefullsnack.com/posts/frameworkorlibrary.html Hôm nay mình nghe podca...
Huy Trần viết 2 tháng trước
32 4
White
7 1
Trong quyển sách Beyond Java, xuất bản vài năm trước có đoạn:Java has characteristics that many of us take for granted. You can find good Java deve...
Ngoc Dao viết hơn 2 năm trước
7 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
301 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!