Đầu ra của mã PHP sau đây sẽ là gì PHP tổng = 25 sinh viên

MCQ PHP - Tiếng Anh

  • Căn bản
  • Toán tử và Biểu thức
  • Tuyên bố nếu
  • trường hợp chuyển đổi
  • Vòng

GK bằng tiếng Hindi

  • Chính trị Ấn Độ
  • Hoá học
  • Lịch sử Ấn Độ
  • vật lý
  • Sinh học
  • Sách và tác giả
  • Địa lý Ấn Độ
  • Các môn thể thao
  • Kinh tế Ấn Độ
  • ngày và năm

Đầu ra của mã PHP sau đây sẽ là gì?

$total = "25 student
Trang chủ. Diễn đàn thảo luận

Kiểm tra trực tuyến miễn phí

Kiểm tra trực tuyến PHP bằng tiếng Anh20 câu hỏi. 35 phút

Bắt đầu ngay



Đầu ra của mã PHP sau đây sẽ là gì?

$total = "25 students";
$more = 10;
$total = $total + $more;
echo "$total";

lỗi

sinh viên B 35

C35

D 25 học sinh


Câu trả lời. C

Quảng cáo được tài trợ

अगर आप कम्पटीशन एग्जाम की ऑनलाइन तैयारी कर रहे है तो यहाँ से आप फ्री में Online Test

Kiểm tra trực tuyến miễn phí

Kiểm tra trực tuyến PHP bằng tiếng Anh20 câu hỏi. 35 phút

Bắt đầu ngay




Xem thêm câu hỏi liên quan

1] Đầu ra của mã PHP sau đây sẽ là gì?

$num = 10;
echo 'What is her age? n She is $num years old';

Cô ấy bao nhiêu tuổi?

B Cô ấy bao nhiêu tuổi?

C Cô ấy bao nhiêu tuổi?

D Cô ấy bao nhiêu tuổi?và Cô ấy 10 tuổi


Xem câu trả lời

2] Câu nào dưới đây tương đương với $add += $add ?

Một $thêm = $thêm

B $add = $add +$add

C $ thêm = $ thêm + 1

D $add = $add + $add + 1


Xem câu trả lời

3] Cái nào sau đây là/là trình soạn thảo mã PHP?

Một cuốn sổ tay

Sổ tay B++

C Adobe Dreamweaver

D Tất cả những điều được đề cập


Xem câu trả lời

4] Đầu ra của mã PHP sau đây sẽ là gì?

$score = 1234;
$scoreboard = [array] $score;
echo $scoreboard[0];

một 1

Lỗi B

C1234

D 2


Xem câu trả lời

5] Tập lệnh PHP phải bắt đầu bằng ___ và kết thúc bằng ___

A < php >

B < ?

C < ?

Đ < ?php ?


Xem câu trả lời

UP Gk Kiểm tra trực tuyến

taiyari24hour. com

Danh mục MCQ

  • CCC MCQ
  • Kiến thức chung MCQ
  • Kiểm đếm MCQ
  • GST MCQ
  • MCQ phần cứng máy tính
  • Mạng máy tính MCQ

Đây là phần câu hỏi và câu trả lời về "Khái niệm cơ bản về PHP" với lời giải thích cho các cuộc phỏng vấn, kiểm tra cạnh tranh và kiểm tra đầu vào khác nhau. Các ví dụ đã giải với mô tả câu trả lời chi tiết, giải thích được đưa ra và nó sẽ dễ hiểu

Tìm hiểu thêm Câu hỏi MCQ từ PHP PHP MCQ cơ bản

Trong khoa học máy tính, lập trình hàm là một mô hình lập trình trong đó các chương trình được xây dựng bằng cách áp dụng và soạn các hàm. Nó là một mô hình lập trình khai báo trong đó các định nghĩa hàm là cây biểu thức ánh xạ các giá trị này sang các giá trị khác, chứ không phải là một chuỗi các câu lệnh mệnh lệnh cập nhật trạng thái đang chạy của chương trình

Trong lập trình hàm, các hàm được coi là công dân hạng nhất, nghĩa là chúng có thể được liên kết với tên [bao gồm cả mã định danh cục bộ], được truyền dưới dạng đối số và được trả về từ các hàm khác, giống như bất kỳ loại dữ liệu nào khác có thể. Điều này cho phép các chương trình được viết theo kiểu khai báo và có thể kết hợp, trong đó các chức năng nhỏ được kết hợp theo cách mô-đun

Lập trình hàm đôi khi được coi là đồng nghĩa với lập trình hàm thuần túy, một tập hợp con của lập trình hàm coi tất cả các hàm là hàm toán học xác định hoặc hàm thuần túy. Khi một hàm thuần túy được gọi với một số đối số đã cho, nó sẽ luôn trả về cùng một kết quả và không thể bị ảnh hưởng bởi bất kỳ trạng thái có thể thay đổi nào hoặc các tác dụng phụ khác. Điều này trái ngược với các thủ tục không trong sạch, phổ biến trong lập trình mệnh lệnh, có thể có tác dụng phụ [chẳng hạn như sửa đổi trạng thái của chương trình hoặc lấy thông tin đầu vào từ người dùng]. Những người ủng hộ lập trình chức năng thuần túy tuyên bố rằng bằng cách hạn chế các tác dụng phụ, các chương trình có thể có ít lỗi hơn, dễ gỡ lỗi và kiểm tra hơn và phù hợp hơn với xác minh chính thức

Lập trình hàm có nguồn gốc từ giới hàn lâm, phát triển từ phép tính lambda, một hệ thống tính toán chính thức chỉ dựa trên các hàm. Lập trình hàm trước đây ít phổ biến hơn so với lập trình mệnh lệnh, nhưng ngày nay nhiều ngôn ngữ hàm đang được sử dụng trong công nghiệp và giáo dục, bao gồm Common Lisp, Scheme, Clojure, Wolfram Language, Racket, Erlang, Elixir, OCaml, Haskell và F#. Lập trình hàm cũng là chìa khóa cho một số ngôn ngữ đã thành công trong các lĩnh vực cụ thể, như JavaScript trong Web, R trong thống kê, J, K và Q trong phân tích tài chính và XQuery/XSLT cho XML. Các ngôn ngữ khai báo dành riêng cho miền như SQL và Lex/Yacc sử dụng một số yếu tố của lập trình chức năng, chẳng hạn như không cho phép các giá trị có thể thay đổi. Ngoài ra, nhiều ngôn ngữ lập trình khác hỗ trợ lập trình theo kiểu chức năng hoặc đã triển khai các tính năng từ lập trình chức năng, chẳng hạn như C++11, C#, Kotlin, Perl, PHP, Python, Go, Rust, Raku, Scala và Java [kể từ

Lịch sử[sửa]

Phép tính lambda, được phát triển vào những năm 1930 bởi Alonzo Church, là một hệ thống tính toán chính thức được xây dựng từ ứng dụng hàm. Năm 1937, Alan Turing đã chứng minh rằng phép tính lambda và máy Turing là các mô hình tính toán tương đương, cho thấy phép tính lambda là Turing hoàn chỉnh. Phép tính Lambda tạo thành cơ sở của tất cả các ngôn ngữ lập trình chức năng. Một công thức lý thuyết tương đương, logic tổ hợp, được phát triển bởi Moses Schönfinkel và Haskell Curry trong những năm 1920 và 1930

Church sau đó đã phát triển một hệ thống yếu hơn, phép tính lambda được nhập đơn giản, mở rộng phép tính lambda bằng cách gán một loại cho tất cả các thuật ngữ. Điều này tạo cơ sở cho lập trình hàm kiểu tĩnh

Ngôn ngữ lập trình chức năng cấp cao đầu tiên, LISP, được phát triển vào cuối những năm 1950 cho máy tính khoa học bởi John McCarthy khi còn ở Viện Công nghệ Massachusetts [MIT]. Các hàm LISP được xác định bằng ký hiệu lambda của Church, được mở rộng với cấu trúc nhãn để cho phép các hàm đệ quy. Lần đầu tiên Lisp giới thiệu nhiều tính năng mô hình của lập trình chức năng, mặc dù Lisp ban đầu là và kết hợp hỗ trợ cho nhiều kiểu lập trình khi các mô hình mới phát triển. Các phương ngữ sau này, chẳng hạn như Scheme và Clojure, và các nhánh như Dylan và Julia, đã tìm cách đơn giản hóa và hợp lý hóa Lisp xung quanh một lõi chức năng rõ ràng, trong khi Common Lisp được thiết kế để bảo tồn và cập nhật các đặc điểm mô hình của nhiều phương ngữ cũ hơn mà nó đã thay thế

Ngôn ngữ xử lý thông tin [IPL], 1956, đôi khi được coi là ngôn ngữ lập trình chức năng dựa trên máy tính đầu tiên. Nó là một ngôn ngữ kiểu lắp ráp để thao tác danh sách các ký hiệu. Nó có một khái niệm về trình tạo, tương đương với một hàm chấp nhận một hàm làm đối số và vì nó là ngôn ngữ cấp độ hợp ngữ nên mã có thể là dữ liệu, vì vậy IPL có thể được coi là có các hàm bậc cao hơn. Tuy nhiên, nó phụ thuộc rất nhiều vào cấu trúc danh sách đột biến và các tính năng bắt buộc tương tự

Kenneth E. Iverson đã phát triển APL vào đầu những năm 1960, được mô tả trong cuốn sách A Programming Language [ISBN 9780471430148] xuất bản năm 1962 của ông. APL có ảnh hưởng chính đến FP của John Backus. Vào đầu những năm 1990, Iverson và Roger Hui đã tạo ra J. Vào giữa những năm 1990, Arthur Whitney, người trước đây đã làm việc với Iverson, đã tạo ra K, được sử dụng thương mại trong các ngành tài chính cùng với hậu duệ của nó là Q

Vào giữa những năm 1960, Peter Landin đã phát minh ra máy SECD, máy trừu tượng đầu tiên cho ngôn ngữ lập trình chức năng, mô tả sự tương ứng giữa ALGOL 60 và phép tính lambda, đồng thời đề xuất ngôn ngữ lập trình ISWIM

John Backus đã trình bày về FP trong bài giảng Giải thưởng Turing năm 1977 của ông "Lập trình có thể được giải phóng khỏi phong cách von Neumann không? Một phong cách chức năng và đại số chương trình của nó". Ông định nghĩa các chương trình chức năng được xây dựng theo cách phân cấp bằng "các hình thức kết hợp" cho phép một "đại số chương trình"; . [cần dẫn nguồn] Bài báo của Backus đã phổ biến nghiên cứu về lập trình hàm, mặc dù nó nhấn mạnh đến lập trình cấp hàm hơn là kiểu tính toán lambda hiện được liên kết với lập trình hàm

Ngôn ngữ ML năm 1973 được tạo ra bởi Robin Milner tại Đại học Edinburgh và David Turner đã phát triển ngôn ngữ SASL tại Đại học St Andrews. Cũng tại Edinburgh vào những năm 1970, Burstall và Darlington đã phát triển ngôn ngữ chức năng NPL. NPL dựa trên Phương trình đệ quy Kleene và lần đầu tiên được giới thiệu trong công việc của họ về chuyển đổi chương trình. Sau đó, Burstall, MacQueen và Sannella đã kết hợp kiểu kiểm tra đa hình từ ML để tạo ra ngôn ngữ Hope. ML cuối cùng đã phát triển thành một số phương ngữ, phổ biến nhất hiện nay là OCaml và Standard ML

Vào những năm 1970, Guy L. Steele và Gerald Jay Sussman đã phát triển Đề án, như được mô tả trong Bài báo Lambda và sách giáo khoa năm 1985 Cấu trúc và diễn giải các chương trình máy tính. Scheme là phương ngữ đầu tiên của lisp sử dụng phạm vi từ vựng và yêu cầu tối ưu hóa cuộc gọi đuôi, các tính năng khuyến khích lập trình chức năng

Vào những năm 1980, Per Martin-Löf đã phát triển lý thuyết loại trực giác [còn gọi là lý thuyết loại xây dựng], liên kết các chương trình chức năng với bằng chứng xây dựng được biểu thị dưới dạng các loại phụ thuộc. Điều này dẫn đến các cách tiếp cận mới để chứng minh định lý tương tác và đã ảnh hưởng đến sự phát triển của các ngôn ngữ lập trình hàm tiếp theo. [cần dẫn nguồn]

Ngôn ngữ chức năng lười biếng, Miranda, được phát triển bởi David Turner, lần đầu tiên xuất hiện vào năm 1985 và có ảnh hưởng mạnh mẽ đến Haskell. Với Miranda là độc quyền, Haskell bắt đầu với sự đồng thuận vào năm 1987 để hình thành một tiêu chuẩn mở cho nghiên cứu lập trình chức năng;

Gần đây, nó đã được sử dụng trong các ngóc ngách như CAD tham số trong ngôn ngữ OpenSCAD được xây dựng trên khung CGAL, mặc dù hạn chế của nó đối với việc gán lại các giá trị [tất cả các giá trị được coi là hằng số] đã dẫn đến sự nhầm lẫn giữa những người dùng không quen với lập trình chức năng như một

Lập trình chức năng tiếp tục được sử dụng trong cài đặt thương mại

Các khái niệm[sửa]

Một số khái niệm và mô hình dành riêng cho lập trình chức năng và thường xa lạ với lập trình mệnh lệnh [bao gồm cả lập trình hướng đối tượng]. Tuy nhiên, các ngôn ngữ lập trình thường phục vụ cho một số mô hình lập trình, vì vậy các lập trình viên sử dụng ngôn ngữ "chủ yếu là mệnh lệnh" có thể đã sử dụng một số khái niệm này

Các hàm hạng nhất và bậc cao hơn[sửa | sửa mã nguồn]

Hàm bậc cao là những hàm có thể lấy các hàm khác làm đối số hoặc trả về chúng dưới dạng kết quả. Trong giải tích, một ví dụ về hàm bậc cao là toán tử vi phân d/dx{\displaystyle d/dx}, trả về đạo hàm của hàm f{\displaystyle f}.

Các hàm bậc cao hơn có liên quan chặt chẽ với các hàm hạng nhất trong đó các hàm bậc cao hơn và các hàm hạng nhất đều cho phép các hàm làm đối số và kết quả của các hàm khác. Sự khác biệt giữa hai là tinh tế. "bậc cao hơn" mô tả một khái niệm toán học về các hàm hoạt động trên các hàm khác, trong khi "hạng nhất" là một thuật ngữ khoa học máy tính cho các thực thể ngôn ngữ lập trình không bị hạn chế sử dụng [do đó, các hàm hạng nhất có thể xuất hiện ở bất kỳ đâu trong

Các hàm bậc cao hơn cho phép ứng dụng một phần hoặc currying, một kỹ thuật áp dụng một hàm cho các đối số của nó tại một thời điểm, với mỗi ứng dụng trả về một hàm mới chấp nhận đối số tiếp theo. Điều này cho phép lập trình viên diễn đạt ngắn gọn, ví dụ, hàm kế dưới dạng toán tử cộng được áp dụng một phần cho số tự nhiên một

Hàm thuần túy[sửa]

Các hàm thuần túy [hoặc biểu thức] không có tác dụng phụ [bộ nhớ hoặc I/O]. Điều này có nghĩa là các hàm thuần túy có một số thuộc tính hữu ích, nhiều thuộc tính có thể được sử dụng để tối ưu hóa mã

  • Nếu kết quả của một biểu thức thuần túy không được sử dụng, nó có thể bị xóa mà không ảnh hưởng đến các biểu thức khác
  • Nếu một hàm thuần túy được gọi với các đối số không gây ra tác dụng phụ nào, thì kết quả là không đổi đối với danh sách đối số đó [đôi khi được gọi là tính minh bạch tham chiếu hoặc tính bình thường], i. e. , gọi lại hàm thuần túy với cùng các đối số sẽ trả về cùng một kết quả. [Điều này có thể cho phép tối ưu hóa bộ nhớ đệm như ghi nhớ. ]
  • Nếu không có sự phụ thuộc dữ liệu giữa hai biểu thức thuần túy, thứ tự của chúng có thể bị đảo ngược hoặc chúng có thể được thực hiện song song và chúng không thể can thiệp lẫn nhau [nói cách khác, việc đánh giá bất kỳ biểu thức thuần túy nào là an toàn theo luồng]
  • Nếu toàn bộ ngôn ngữ không cho phép tác dụng phụ, thì có thể sử dụng bất kỳ chiến lược đánh giá nào;

Trong khi hầu hết các trình biên dịch cho các ngôn ngữ lập trình mệnh lệnh phát hiện các hàm thuần túy và thực hiện loại bỏ biểu thức con chung cho các lệnh gọi hàm thuần túy, chúng không phải lúc nào cũng làm điều này cho các thư viện được biên dịch sẵn, thường không tiết lộ thông tin này, do đó ngăn cản việc tối ưu hóa liên quan đến các hàm bên ngoài đó. Một số trình biên dịch, chẳng hạn như gcc, thêm các từ khóa bổ sung để lập trình viên đánh dấu rõ ràng các hàm bên ngoài là thuần túy, để cho phép tối ưu hóa như vậy. Fortran 95 cũng cho phép các chức năng được chỉ định thuần túy. C++11 đã thêm từ khóa

$total = "25 students";
$more = 10;
$total = $total + $more;
echo "$total";
1 với ngữ nghĩa tương tự

Đệ quy[sửa]

Lặp lại [lặp] trong các ngôn ngữ chức năng thường được thực hiện thông qua đệ quy. Các hàm đệ quy tự gọi, cho phép một thao tác được lặp lại cho đến khi đạt đến trường hợp cơ sở. Nói chung, đệ quy yêu cầu duy trì một ngăn xếp, ngăn xếp này tiêu thụ không gian theo một lượng tuyến tính đến độ sâu của đệ quy. Điều này có thể làm cho việc sử dụng đệ quy trở nên cực kỳ tốn kém thay vì các vòng lặp mệnh lệnh. Tuy nhiên, một dạng đệ quy đặc biệt được gọi là đệ quy đuôi có thể được trình biên dịch nhận ra và tối ưu hóa thành cùng một mã được sử dụng để thực hiện phép lặp trong các ngôn ngữ mệnh lệnh. Tối ưu hóa đệ quy đuôi có thể được thực hiện bằng cách chuyển đổi chương trình thành kiểu truyền tiếp tục trong quá trình biên dịch, trong số các phương pháp khác

Tiêu chuẩn ngôn ngữ Đề án yêu cầu triển khai để hỗ trợ đệ quy đuôi thích hợp, nghĩa là chúng phải cho phép số lần gọi đuôi đang hoạt động không giới hạn. Đệ quy đuôi thích hợp không chỉ đơn giản là tối ưu hóa; . Hơn nữa, trái với tên của nó, nó chiếm tất cả các cuộc gọi đuôi, không chỉ đệ quy đuôi. Mặc dù đệ quy đuôi thích hợp thường được triển khai bằng cách biến mã thành các vòng lặp bắt buộc, nhưng việc triển khai có thể triển khai nó theo những cách khác. Ví dụ: GÀ cố tình duy trì ngăn xếp và để ngăn xếp tràn. Tuy nhiên, khi điều này xảy ra, trình thu gom rác của nó sẽ yêu cầu trả lại dung lượng, cho phép số lần gọi đuôi đang hoạt động không giới hạn mặc dù nó không biến đệ quy đuôi thành một vòng lặp

Các mẫu đệ quy phổ biến có thể được trừu tượng hóa bằng cách sử dụng các hàm bậc cao hơn, với dị hình và biến hình [hoặc "nếp gấp" và "mở ra"] là những ví dụ rõ ràng nhất. Các sơ đồ đệ quy như vậy đóng vai trò tương tự như các cấu trúc điều khiển tích hợp, chẳng hạn như các vòng lặp trong các ngôn ngữ mệnh lệnh

Hầu hết các ngôn ngữ lập trình chức năng có mục đích chung đều cho phép đệ quy không hạn chế và hoàn thành Turing, điều này làm cho vấn đề tạm dừng không thể giải quyết được, có thể gây ra sự không hợp lý của lý luận phương trình và thường yêu cầu đưa tính không nhất quán vào logic được thể hiện bởi hệ thống loại của ngôn ngữ. Một số ngôn ngữ có mục đích đặc biệt như Coq chỉ cho phép đệ quy có cơ sở vững chắc và được chuẩn hóa mạnh mẽ [các tính toán không kết thúc chỉ có thể được biểu thị bằng các luồng giá trị vô hạn được gọi là codata]. Kết quả là, các ngôn ngữ này không thể hoàn thành Turing và việc biểu diễn một số chức năng nhất định trong chúng là không thể, nhưng chúng vẫn có thể biểu diễn một loạt các phép tính thú vị trong khi tránh được các vấn đề do đệ quy không hạn chế gây ra. Lập trình chức năng giới hạn trong đệ quy có cơ sở tốt với một vài ràng buộc khác được gọi là lập trình chức năng tổng thể

Đánh giá nghiêm ngặt và không nghiêm ngặt[sửa | sửa mã nguồn]

Các ngôn ngữ hàm có thể được phân loại theo việc chúng sử dụng đánh giá nghiêm ngặt [háo hức] hay không nghiêm ngặt [lười biếng], các khái niệm đề cập đến cách các đối số hàm được xử lý khi một biểu thức đang được đánh giá. Sự khác biệt về kỹ thuật là ở ngữ nghĩa biểu thị của các biểu thức chứa các phép tính sai hoặc phân kỳ. Theo đánh giá nghiêm ngặt, việc đánh giá bất kỳ thuật ngữ nào chứa thuật ngữ con không đạt sẽ không thành công. Ví dụ, biểu thức

print length[[2+1, 3*2, 1/0, 5-4]]

không được đánh giá nghiêm ngặt vì chia cho 0 trong phần tử thứ ba của danh sách. Theo đánh giá lười biếng, hàm độ dài trả về giá trị 4 [i. e. , số mục trong danh sách], vì việc đánh giá nó không cố gắng đánh giá các thuật ngữ tạo nên danh sách. Tóm lại, đánh giá nghiêm ngặt luôn đánh giá đầy đủ các đối số của hàm trước khi gọi hàm. Đánh giá lười biếng không đánh giá các đối số hàm trừ khi các giá trị của chúng được yêu cầu để đánh giá chính lệnh gọi hàm

Chiến lược triển khai thông thường để đánh giá lười biếng trong các ngôn ngữ chức năng là giảm đồ thị. Đánh giá lười biếng được sử dụng theo mặc định trong một số ngôn ngữ chức năng thuần túy, bao gồm Miranda, Clean và Haskell

lập luận cho việc đánh giá lười biếng như một cơ chế để cải thiện tính mô đun của chương trình thông qua việc phân tách các mối quan tâm, bằng cách giảm bớt việc thực hiện độc lập của nhà sản xuất và người tiêu dùng luồng dữ liệu. Launchbury 1993 mô tả một số khó khăn mà việc đánh giá lười biếng gây ra, đặc biệt là trong việc phân tích các yêu cầu lưu trữ của chương trình và đề xuất một ngữ nghĩa hoạt động để hỗ trợ cho việc phân tích đó. Harper 2009 đề xuất bao gồm cả đánh giá nghiêm ngặt và lười biếng trong cùng một ngôn ngữ, sử dụng hệ thống loại của ngôn ngữ để phân biệt chúng

Loại hệ thống [ chỉnh sửa ]

Đặc biệt kể từ khi phát triển suy luận kiểu Hindley–Milner vào những năm 1970, các ngôn ngữ lập trình hàm có xu hướng sử dụng phép tính lambda đã nhập, loại bỏ tất cả các chương trình không hợp lệ tại thời điểm biên dịch và rủi ro, trái ngược với phép tính lambda chưa được gõ, chấp nhận tất cả các chương trình hợp lệ khi biên dịch . Việc sử dụng các kiểu dữ liệu đại số làm cho việc thao tác với các cấu trúc dữ liệu phức tạp trở nên thuận tiện;

Một số ngôn ngữ chức năng định hướng nghiên cứu như Coq, Agda, Cayenne và Epigram dựa trên lý thuyết loại trực giác, cho phép các loại phụ thuộc vào các điều khoản. Các loại như vậy được gọi là các loại phụ thuộc. Các hệ thống kiểu này không có suy luận kiểu có thể quyết định và khó hiểu và khó lập trình với. Nhưng các loại phụ thuộc có thể diễn đạt các mệnh đề tùy ý trong logic bậc cao hơn. Sau đó, thông qua đẳng cấu Curry–Howard, các chương trình được gõ tốt trong các ngôn ngữ này trở thành một phương tiện để viết các chứng minh toán học chính thức mà từ đó trình biên dịch có thể tạo mã được chứng nhận. Mặc dù các ngôn ngữ này chủ yếu được quan tâm trong nghiên cứu học thuật [bao gồm cả toán học chính thức], nhưng chúng cũng đã bắt đầu được sử dụng trong kỹ thuật. Compcert là trình biên dịch cho một tập hợp con của ngôn ngữ lập trình C được viết bằng Coq và được xác minh chính thức

Một dạng hạn chế của các kiểu phụ thuộc được gọi là kiểu dữ liệu đại số tổng quát [GADT's] có thể được triển khai theo cách cung cấp một số lợi ích của lập trình kiểu phụ thuộc trong khi tránh được hầu hết sự bất tiện của nó. GADT có sẵn trong Trình biên dịch Haskell của Glasgow, trong OCaml và Scala, và đã được đề xuất dưới dạng bổ sung cho các ngôn ngữ khác bao gồm Java và C#

Minh bạch tham chiếu[sửa]

Các chương trình chức năng không có câu lệnh gán, nghĩa là giá trị của một biến trong chương trình chức năng không bao giờ thay đổi sau khi được xác định. Điều này giúp loại bỏ mọi khả năng xảy ra tác dụng phụ vì bất kỳ biến nào cũng có thể được thay thế bằng giá trị thực của nó tại bất kỳ thời điểm thực thi nào. Vì vậy, các chương trình chức năng trong suốt về mặt tham chiếu

Xem xét câu lệnh gán của C

$total = "25 students";
$more = 10;
$total = $total + $more;
echo "$total";
2, điều này thay đổi giá trị được gán cho biến
$total = "25 students";
$more = 10;
$total = $total + $more;
echo "$total";
3. Giả sử giá trị ban đầu của
$total = "25 students";
$more = 10;
$total = $total + $more;
echo "$total";
3 là
$total = "25 students";
$more = 10;
$total = $total + $more;
echo "$total";
5, sau đó hai lần đánh giá liên tiếp của biến
$total = "25 students";
$more = 10;
$total = $total + $more;
echo "$total";
3 cho kết quả lần lượt là
$total = "25 students";
$more = 10;
$total = $total + $more;
echo "$total";
7 và
const numList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let result = 0;
for [let i = 0; i < numList.length; i++] {
  if [numList[i] % 2 === 0] {
    result += numList[i] * 10;
  }
}
0. Rõ ràng, thay thế
$total = "25 students";
$more = 10;
$total = $total + $more;
echo "$total";
2 bằng
$total = "25 students";
$more = 10;
$total = $total + $more;
echo "$total";
7 hoặc
const numList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let result = 0;
for [let i = 0; i < numList.length; i++] {
  if [numList[i] % 2 === 0] {
    result += numList[i] * 10;
  }
}
0 sẽ mang lại cho chương trình một ý nghĩa khác và do đó, biểu thức không minh bạch về mặt tham chiếu. Trên thực tế, các câu lệnh gán không bao giờ minh bạch về mặt tham chiếu

Bây giờ, hãy xem xét một hàm khác chẳng hạn như

const numList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let result = 0;
for [let i = 0; i < numList.length; i++] {
  if [numList[i] % 2 === 0] {
    result += numList[i] * 10;
  }
}
4 là trong suốt, vì nó không hoàn toàn thay đổi đầu vào x và do đó không có tác dụng phụ như vậy. Các chương trình chức năng chỉ sử dụng loại chức năng này và do đó minh bạch về mặt tham chiếu

Cấu trúc dữ liệu[sửa]

Các cấu trúc dữ liệu chức năng thuần túy thường được biểu diễn theo một cách khác với các đối tác bắt buộc của chúng. Ví dụ: mảng với thời gian truy cập và cập nhật liên tục là thành phần cơ bản của hầu hết các ngôn ngữ mệnh lệnh và nhiều cấu trúc dữ liệu mệnh lệnh, chẳng hạn như bảng băm và đống nhị phân, đều dựa trên mảng. Mảng có thể được thay thế bằng bản đồ hoặc danh sách truy cập ngẫu nhiên, cho phép triển khai chức năng thuần túy, nhưng có thời gian cập nhật và truy cập logarit. Các cấu trúc dữ liệu chức năng thuần túy có tính bền vững, thuộc tính giữ cho các phiên bản trước của cấu trúc dữ liệu không bị sửa đổi. Trong Clojure, cấu trúc dữ liệu liên tục được sử dụng làm chức năng thay thế cho các cấu trúc bắt buộc của chúng. Ví dụ, các vectơ liên tục sử dụng cây để cập nhật một phần. Gọi phương thức chèn sẽ dẫn đến một số nhưng không phải tất cả các nút được tạo

So sánh với lập trình mệnh lệnh[sửa | sửa mã nguồn]

Lập trình chức năng rất khác với lập trình mệnh lệnh. Sự khác biệt đáng kể nhất xuất phát từ thực tế là lập trình chức năng tránh được các tác dụng phụ, được sử dụng trong lập trình mệnh lệnh để triển khai trạng thái và I/O. Lập trình chức năng thuần túy ngăn chặn hoàn toàn các tác dụng phụ và cung cấp tính minh bạch tham chiếu

Các hàm bậc cao hiếm khi được sử dụng trong lập trình mệnh lệnh cũ hơn. Một chương trình mệnh lệnh truyền thống có thể sử dụng một vòng lặp để duyệt và sửa đổi danh sách. Mặt khác, một chương trình chức năng có thể sẽ sử dụng chức năng “bản đồ” bậc cao nhận một chức năng và một danh sách, tạo và trả về một danh sách mới bằng cách áp dụng chức năng cho từng mục danh sách

bắt buộc vs. lập trình hàm[sửa]

Hai ví dụ sau [được viết bằng JavaScript] đạt được hiệu quả tương tự. họ nhân tất cả các số chẵn trong một mảng với 10 và cộng tất cả lại, lưu trữ tổng cuối cùng trong biến "kết quả"

Vòng lặp mệnh lệnh truyền thống

const numList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let result = 0;
for [let i = 0; i < numList.length; i++] {
  if [numList[i] % 2 === 0] {
    result += numList[i] * 10;
  }
}

Lập trình hàm với hàm bậc cao

const result = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
               .filter[n => n % 2 === 0]
               .map[a => a * 10]
               .reduce[[a, b] => a + b];

Trạng thái mô phỏng[sửa]

Có những nhiệm vụ [ví dụ: duy trì số dư tài khoản ngân hàng] dường như thường được thực hiện một cách tự nhiên nhất với trạng thái. Lập trình chức năng thuần túy thực hiện các tác vụ này và các tác vụ I/O như chấp nhận đầu vào của người dùng và in ra màn hình theo một cách khác

Ngôn ngữ lập trình chức năng thuần túy Haskell thực hiện chúng bằng cách sử dụng các đơn nguyên, bắt nguồn từ lý thuyết danh mục. Các đơn nguyên cung cấp một cách để trừu tượng hóa một số kiểu mẫu tính toán nhất định, bao gồm [nhưng không giới hạn] mô hình tính toán với trạng thái có thể thay đổi [và các tác dụng phụ khác như I/O] theo cách bắt buộc mà không làm mất đi độ tinh khiết. Mặc dù các đơn nguyên hiện có có thể dễ dàng áp dụng trong một chương trình, nếu được cung cấp các mẫu và ví dụ phù hợp, nhiều sinh viên cảm thấy khó hiểu về mặt khái niệm, e. g. , khi được yêu cầu xác định các đơn nguyên mới [đôi khi cần thiết cho một số loại thư viện]

Các ngôn ngữ chức năng cũng mô phỏng các trạng thái bằng cách chuyển qua các trạng thái bất biến. Điều này có thể được thực hiện bằng cách làm cho một hàm chấp nhận trạng thái như một trong các tham số của nó và trả về một trạng thái mới cùng với kết quả, giữ nguyên trạng thái cũ

Các ngôn ngữ chức năng không thuần túy thường bao gồm một phương pháp trực tiếp hơn để quản lý trạng thái có thể thay đổi. Ví dụ: Clojure sử dụng các tham chiếu được quản lý có thể được cập nhật bằng cách áp dụng các hàm thuần túy cho trạng thái hiện tại. Cách tiếp cận này cho phép khả năng thay đổi trong khi vẫn thúc đẩy việc sử dụng các hàm thuần túy như là cách ưa thích để thể hiện tính toán. [cần dẫn nguồn]

Các phương pháp thay thế như logic Hoare và tính duy nhất đã được phát triển để theo dõi các tác dụng phụ trong chương trình. Một số ngôn ngữ nghiên cứu hiện đại sử dụng các hệ thống hiệu ứng để làm rõ sự hiện diện của các tác dụng phụ. [cần dẫn nguồn]

Các vấn đề về hiệu quả[sửa]

Các ngôn ngữ lập trình chức năng thường kém hiệu quả hơn trong việc sử dụng CPU và bộ nhớ so với các ngôn ngữ mệnh lệnh như C và Pascal. Điều này liên quan đến thực tế là một số cấu trúc dữ liệu có thể thay đổi như mảng có cách triển khai rất đơn giản bằng cách sử dụng phần cứng hiện có. Các mảng phẳng có thể được truy cập rất hiệu quả với các CPU có đường dẫn sâu, được tìm nạp trước một cách hiệu quả thông qua các bộ đệm [không có truy đuổi con trỏ phức tạp] hoặc được xử lý bằng các lệnh SIMD. Cũng không dễ dàng để tạo ra các đối tác bất biến có mục đích chung hiệu quả như nhau. Đối với các ngôn ngữ chức năng thuần túy, sự chậm lại trong trường hợp xấu nhất là logarit trong số lượng ô nhớ được sử dụng, bởi vì bộ nhớ có thể thay đổi có thể được biểu thị bằng cấu trúc dữ liệu chức năng thuần túy với thời gian truy cập logarit [chẳng hạn như cây cân bằng]. Tuy nhiên, sự chậm lại như vậy không phổ biến. Đối với các chương trình thực hiện tính toán số chuyên sâu, các ngôn ngữ chức năng như OCaml và Clean chỉ chậm hơn một chút so với C theo Trò chơi Điểm chuẩn Ngôn ngữ Máy tính. Đối với các chương trình xử lý ma trận lớn và cơ sở dữ liệu đa chiều, các ngôn ngữ chức năng mảng [chẳng hạn như J và K] được thiết kế với tốc độ tối ưu hóa

Tính bất biến của dữ liệu trong nhiều trường hợp có thể dẫn đến hiệu quả thực thi bằng cách cho phép trình biên dịch đưa ra các giả định không an toàn trong ngôn ngữ mệnh lệnh, do đó tăng cơ hội mở rộng nội tuyến

Đánh giá lười biếng cũng có thể tăng tốc chương trình, thậm chí là tiệm cận, trong khi nó có thể làm chậm chương trình nhiều nhất bởi một yếu tố không đổi [tuy nhiên, nó có thể gây rò rỉ bộ nhớ nếu sử dụng không đúng cách]. Launchbury 1993 thảo luận về các vấn đề lý thuyết liên quan đến rò rỉ bộ nhớ do đánh giá lười biếng và O'Sullivan et al. 2008 đưa ra một số lời khuyên thiết thực để phân tích và khắc phục chúng. Tuy nhiên, các triển khai chung nhất của đánh giá lười biếng khiến việc sử dụng rộng rãi mã và dữ liệu bị hủy đăng ký hoạt động kém trên các bộ xử lý hiện đại có đường ống dẫn sâu và bộ đệm đa cấp [trong đó lỗi bộ đệm có thể tiêu tốn hàng trăm chu kỳ][cần dẫn nguồn]

Lập trình chức năng trong các ngôn ngữ phi chức năng[sửa | sửa mã nguồn]

Có thể sử dụng phong cách lập trình chức năng trong các ngôn ngữ không được coi là ngôn ngữ chức năng theo truyền thống. Ví dụ: cả D và Fortran 95 đều hỗ trợ rõ ràng các hàm thuần túy

JavaScript, Lua, Python và Go có các chức năng hạng nhất ngay từ đầu. Python đã hỗ trợ "lambda", "map", "reduce" và "filter" vào năm 1994, cũng như các bao đóng trong Python 2. 2, mặc dù Python 3 đã chuyển "reduce" xuống mô-đun thư viện chuẩn

const numList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let result = 0;
for [let i = 0; i < numList.length; i++] {
  if [numList[i] % 2 === 0] {
    result += numList[i] * 10;
  }
}
5. Các hàm hạng nhất đã được đưa vào các ngôn ngữ chính thống khác như PHP 5. 3, Visual Basic 9, C# 3. 0, C++11 và Kotlin. [cần dẫn nguồn]

Trong PHP, các lớp ẩn danh, bao đóng và lambdas được hỗ trợ đầy đủ. Thư viện và phần mở rộng ngôn ngữ cho cấu trúc dữ liệu bất biến đang được phát triển để hỗ trợ lập trình theo kiểu chức năng

Trong Java, các lớp ẩn danh đôi khi có thể được sử dụng để mô phỏng các bao đóng; . Java 8 hỗ trợ các biểu thức lambda để thay thế cho một số lớp ẩn danh

Trong C#, các lớp ẩn danh là không cần thiết, bởi vì các bao đóng và lambdas được hỗ trợ đầy đủ. Thư viện và phần mở rộng ngôn ngữ cho cấu trúc dữ liệu bất biến đang được phát triển để hỗ trợ lập trình theo kiểu chức năng trong C#

Nhiều mẫu thiết kế hướng đối tượng có thể diễn đạt bằng thuật ngữ lập trình chức năng. ví dụ: mẫu chiến lược chỉ đơn giản ra lệnh sử dụng chức năng bậc cao hơn và mẫu khách truy cập gần như tương ứng với biến dị hoặc gấp

Tương tự, ý tưởng về dữ liệu bất biến từ lập trình hàm thường được bao gồm trong các ngôn ngữ lập trình mệnh lệnh, ví dụ như bộ dữ liệu trong Python, là một mảng bất biến và Đối tượng. đóng băng [] trong JavaScript

Bảng tính[sửa]

Bảng tính có thể được coi là một dạng hệ thống lập trình chức năng thuần túy, thứ tự không, đánh giá nghiêm ngặt. Tuy nhiên, các bảng tính thường thiếu các hàm bậc cao cũng như khả năng sử dụng lại mã và trong một số triển khai, cũng thiếu tính năng đệ quy. Một số tiện ích mở rộng đã được phát triển cho các chương trình bảng tính để kích hoạt các chức năng bậc cao hơn và có thể tái sử dụng, nhưng cho đến nay vẫn chủ yếu mang tính hàn lâm

Học viện [ chỉnh sửa ]

Lập trình hàm là một lĩnh vực nghiên cứu tích cực trong lĩnh vực lý thuyết ngôn ngữ lập trình. Có một số địa điểm xuất bản được đánh giá ngang hàng tập trung vào lập trình chức năng, bao gồm Hội nghị quốc tế về lập trình chức năng, Tạp chí lập trình chức năng và Hội nghị chuyên đề về xu hướng trong lập trình chức năng

Công nghiệp[sửa]

Lập trình chức năng đã được sử dụng trong một loạt các ứng dụng công nghiệp. Ví dụ, Erlang, được phát triển bởi công ty Thụy Điển Ericsson vào cuối những năm 1980, ban đầu được sử dụng để triển khai các hệ thống viễn thông chịu lỗi, nhưng sau đó đã trở nên phổ biến để xây dựng một loạt ứng dụng tại các công ty như Nortel, Facebook, Électricité de . Scheme, một phương ngữ của Lisp, được sử dụng làm cơ sở cho một số ứng dụng trên máy tính Apple Macintosh đời đầu và đã được áp dụng cho các vấn đề như phần mềm mô phỏng đào tạo và điều khiển kính thiên văn. OCaml, được giới thiệu vào giữa những năm 1990, đã được sử dụng thương mại trong các lĩnh vực như phân tích tài chính, xác minh trình điều khiển, lập trình robot công nghiệp và phân tích tĩnh của phần mềm nhúng. Haskell, mặc dù ban đầu được dùng làm ngôn ngữ nghiên cứu, nhưng cũng đã được áp dụng trong các lĩnh vực như hệ thống hàng không vũ trụ, thiết kế phần cứng và lập trình web

Các ngôn ngữ lập trình hàm khác đã được sử dụng trong công nghiệp bao gồm Scala, F#, Wolfram Language, Lisp, Standard ML và Clojure

Các "nền tảng" chức năng đã phổ biến trong lĩnh vực tài chính để phân tích rủi ro [đặc biệt là với các ngân hàng đầu tư lớn]. Các yếu tố rủi ro được mã hóa dưới dạng các hàm tạo thành các biểu đồ [phân loại] phụ thuộc lẫn nhau để đo lường mối tương quan trong các thay đổi của thị trường, tương tự như cách thức tối ưu hóa cơ sở của Gröbner mà còn cho các khung pháp lý như Đánh giá và Phân tích Vốn Toàn diện. Với việc sử dụng các biến thể OCaml và Caml trong tài chính, các hệ thống này đôi khi được coi là có liên quan đến một máy trừu tượng phân loại. Lập trình chức năng bị ảnh hưởng nặng nề bởi lý thuyết thể loại. [cần dẫn nguồn]

Nhiều trường đại học dạy lập trình chức năng. Một số coi nó như một khái niệm lập trình nhập môn trong khi những người khác lần đầu tiên dạy các phương pháp lập trình mệnh lệnh

Ngoài khoa học máy tính, lập trình chức năng được sử dụng để dạy các khái niệm giải quyết vấn đề, đại số và hình học. Nó cũng đã được sử dụng để dạy cơ học cổ điển, như trong cuốn sách Cấu trúc và giải thích cơ học cổ điển

Điều gì sẽ là đầu ra của mã PHP sau đây

Chủ Đề