Mối quan hệ giữa tính toán lambda và ngôn ngữ lập trình là gì? [đóng cửa]


13

Tôi đang bắt đầu năm đầu tiên (ở trường đại học) về Khoa học Máy tính vào năm tới và tôi viết chủ yếu bằng C (nếu đó là vấn đề). Tôi đã cố gắng tìm kiếm nhưng hầu hết những gì tôi tìm thấy đều thừa nhận kiến ​​thức về phép tính lambda. Tại sao phép tính lambda được coi là hữu ích hơn nhiều so với phép tính biến đơn trong prograrmming? Có một mối quan hệ giữa các biểu thức lambda và các chương trình chức năng? Có phải công việc của Alonzo Church về phép tính lambda đã ảnh hưởng đến sự phát triển của ngôn ngữ lập trình?

Mọi người bên ngoài trường cứ xôn xao về nó và tôi không biết họ sẽ nói về điều gì mặc dù tôi rất muốn học nó và xem nó liên quan trực tiếp đến lập trình và hiểu ngôn ngữ lập trình của tôi như thế nào.


2
Câu hỏi này sẽ được trả lời tốt hơn tại cs.stackexchange.com .
davidk01

@ChrisF. Có lẽ câu hỏi này phù hợp hơn cho một trong những trang web khoa học máy tính. Nếu không, tôi đã cố gắng thu hẹp nó, và tự hỏi liệu nó có thể được mở lại ở dạng hiện tại không.
Tom Au

Mathematica có tính toán lambda nướng trong nhận thấy không ai đề cập đến nó.
William

Câu trả lời:


26

Công cụ tính toán Lambda thú vị, thanh lịch và giúp việc hiểu ngôn ngữ lập trình chức năng dễ dàng hơn nhiều. Tuy nhiên, bạn sẽ không gặp LC trong khóa học Cử nhân CS điển hình, vì vậy bạn không cần phải học nó ngay bây giờ - Tôi khuyên bạn nên thử nghiệm các ngôn ngữ chức năng trước khi xem lại Phép tính Lambda. Tôi tin rằng OCaml là một điểm khởi đầu tốt trong lập trình chức năng cho một lập trình viên C và Scheme là điểm khởi đầu tốt để đi sâu vào tính toán Lambda.

Giải tích Lambda không liên quan đến Giải tích (nên được gọi là Phân tích thay thế). Nói chung, một phép tính là một hệ thống chính thức của người Viking, tức là một bộ quy tắc để làm một cái gì đó. Trong khi Tính toán vi phân cung cấp các quy tắc liên quan đến thay đổi giá trị, các quy tắc của Công cụ tính toán Lambda tự mô tả tính toán. Từ bộ quy tắc rất cơ bản này, chúng ta có thể xây dựng các tính toán tùy ý, biểu diễn dữ liệu như booleans, số nguyên hoặc danh sách và thậm chí kiểm soát các cấu trúc luồng như điều kiện hoặc vòng lặp. LC tương đương với Turing Machines, nhưng một trong hai model có các điểm mạnh khác nhau.

Lambda Tính đã có một tác động to lớn đến các ngôn ngữ lập trình. Ngôn ngữ cấp cao thứ hai được triển khai là Lisp, có thể hiểu là mã hóa trực tiếp LC thành ngôn ngữ lập trình. Chương trình chức năng này của Cameron có tác dụng to lớn đối với sự phát triển của các ngôn ngữ lập trình. Các tính năng như hàm ẩn danh, con trỏ hàm, đóng (hàm lồng nhau), thu gom rác, phạm vi biến, siêu lập trình, tiến bộ trong hệ thống kiểu, suy luận kiểu, ngôn ngữ diễn giải, ngôn ngữ gõ động, lập trình hướng đối tượng đều có một phần lớn đến nhánh lập trình chức năng của các ngôn ngữ lập trình. Có một trò đùa rằng bất kỳ ngôn ngữ lập trình mới (phi học thuật) nào chỉ thêm các tính năng mà Lisp đã có trong nhiều thập kỷ.

Ngoài ra, tính toán Lambda và các tính toán liên quan khác là những công cụ không thể thiếu trong lý thuyết ngôn ngữ lập trình và trong các kỹ thuật xây dựng trình biên dịch nhất định.

Bất kỳ ngôn ngữ nào có chức năng ẩn danh hoạt động như các bao đóng và có thể được chuyển xung quanh một cách tự do ngay lập tức có chứa một mã hóa của phép tính lambda. Các hàm ẩn danh tương ứng với một biểu thức lambda, ngoại trừ trong các hàm LC luôn có chính xác một đối số. Tuy nhiên, bất kỳ ngôn ngữ hoàn chỉnh Turing nào cũng tương đương với LC, vì vậy LC luôn có thể được triển khai trên các ngôn ngữ đó. Này có xu hướng xảy ra trong hệ thống cai trị khớp hoặc các định dạng cấu hình quá thông minh, làm phát sinh “quy tắc thứ mười Greenspun của” (trong jest - chủ yếu): “ Bất kỳ C hoặc Fortran chương trình đủ phức tạp chứa quảng cáo hoc, chính thức chỉ định, bug-ridden , chậm triển khai một nửa Lisp thông thường. Giáo dục


Đây là một câu trả lời tốt hơn so với câu tôi đã chọn trước đây. Câu trả lời của bạn thực sự đánh về nhà. Điều này thật đúng với gì mà tôi đã tìm kiếm!
RonaldMunodawafa

"... Ngoại trừ việc trong các hàm LC luôn có chính xác một đối số": Tính năng này có được gọi là currying hay ít nhất là nó có liên quan đến nó không?
Giorgio

@Giorgio Currying thì khác, nhưng có liên quan. LC không có các hàm đa đối số, nhưng các hàm đó có thể được mã hóa thành các hàm lồng nhau, mỗi hàm có một đối số. Ví dụ sử dụng ký hiệu ML: x = fn (a, b, c) => a + b + c(loại int * int * int -> int, lời gọi fn (1, 2, 3)) có thể được chuyển đổi thành x = fn a => fn b => fn c => a + b + c(loại int -> int -> int -> int, cách gọi ((x 1) 2) 3- parens tùy chọn trong ML). Bây giờ thay vì cung cấp cả ba đối số, chúng tôi cũng chỉ có thể cung cấp hai: plus3 = x 1 2có loại int -> int. Đây là một phần ứng dụng / currying.
amon

Tôi nghĩ rằng currying có nghĩa là tất cả các hàm chỉ mất một đối số (như trong LC).
Giorgio

8

Phép tính Lambda không liên quan gì đến phép tính vi phân / tích phân. Tính toán theo nghĩa chung nhất của từ chỉ có nghĩa là một hệ thống tính toán.

Ở cấp độ lambda tính toán rất cao là một mô hình tính toán giống như cách một máy turing là một mô hình tính toán. Lý do các nhà nghiên cứu ngôn ngữ lập trình nghiên cứu tính toán lambda là vì như một mô hình, nó có mối liên hệ chặt chẽ với các phương pháp chính thức trong toán học như logic và lý thuyết phạm trù. Vì vậy, các phương pháp từ các miền đó có thể được áp dụng để nghiên cứu các khía cạnh và phần mở rộng khác nhau của phép tính lambda, từ đó giúp thiết kế các ngôn ngữ lập trình tốt hơn với các thuộc tính nhất định.

Ảnh hưởng trực tiếp nhất của phép tính lambda trong các ngôn ngữ lập trình thường xuất hiện dưới dạng các hàm và đóng hàm hạng nhất. C không có hỗ trợ cho việc đóng cửa và vì vậy bạn sẽ cần khám phá khái niệm này bằng ngôn ngữ cấp cao hơn như Lisp, Python, Ruby, JavaScript, v.v. Trong lịch sử Lisp được coi là triển khai cụ thể đầu tiên của phép tính lambda như một ngôn ngữ lập trình .


1
Bạn có thể muốn đề cập đến các ngôn ngữ cụ thể khá gần với tính toán lambda, ví dụ Lisp.
Giorgio

1
Tôi vẫn đang học Scheme bằng SICP và hy vọng tôi sẽ tìm hiểu thêm về lĩnh vực này. Cảm ơn câu trả lời và đề nghị công phu của bạn.
RonaldMunodawafa
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.