Rất khó để trả lời câu hỏi kiểu "là X một Y ", nếu người tham gia về việc sử dụng cuộc tranh luận định nghĩa khác nhau của X và Y . Có thể là đối với một số định nghĩa, câu trả lời là "có" và đối với một số định nghĩa, câu trả lời là "không". Đặc biệt nếu câu trả lời phụ thuộc vào chi tiết kỹ thuật trong đó các định nghĩa khác nhau khác nhau. Ngoài ra cuộc thảo luận này có chứa một số thông tin sai lệch, vì vậy xin hãy kiên nhẫn với câu trả lời dài hơn.
" Ngôn ngữ lập trình " nghĩa là gì?
Một câu trả lời đơn giản có thể là "một ngôn ngữ được sử dụng để tạo chương trình". Chắc chắn, nhưng: loại chương trình nào? Thế còn một ngôn ngữ có thể được sử dụng để tạo ra một số loại chương trình, nhưng không phải là các loại chương trình khác thì sao? Dưới đây là hai ví dụ cụ thể để minh họa các trường hợp cực đoan:
1) Một ngôn ngữ tưởng tượng gọi là M hoạt động như thế này: Nếu chương trình chứa một chữ cái "m", nó sẽ tạo ra một trò chơi của Minesweeper. Mọi thứ khác là một lỗi cú pháp.
Theo trực giác, đây không phải là những gì chúng tôi muốn nói bằng cách nói "một ngôn ngữ lập trình". Nhưng bộ phận tiếp thị của M có thể lập luận rằng về mặt kỹ thuật nó đáp ứng định nghĩa, bởi vì nó có thể được sử dụng để tạo ra một chương trình. Chắc chắn, trình biên dịch thực hiện một số phần quan trọng cho bạn, nhưng đó là những gì trình biên dịch làm, phải không? Một trình biên dịch của ngôn ngữ C cũng dịch một số từ đơn giản thành hàng tá hướng dẫn của bộ xử lý. Trình biên dịch M chỉ đi xa hơn và làm cho công việc của bạn thậm chí đơn giản hơn.
2) Nếu bạn cài đặt phiên bản gốc của Turbo Pascal nổi tiếng, bạn có thể viết nhiều loại chương trình. Nhưng bạn không thể viết một trò chơi chạy trong trình duyệt web, vì API cần thiết đơn giản là không có ở đó.
Vậy chính xác thì điều gì làm cho Turbo Pascal trở thành ngôn ngữ lập trình, nhưng M không có nó? Nói một cách đơn giản, bạn có thể làm nhiều hơn trong Pascal so với ở M. Nhưng hãy tưởng tượng chúng ta có một M.NET, tạo ra một trò chơi Minesweeper chạy trong trình duyệt web. Vì vậy, bây giờ chúng ta có một cái gì đó mà Pascal có thể làm và M.NET không thể, nhưng chúng ta cũng có một cái gì đó mà M.NET có thể làm và Pascal thì không thể. Tại sao chúng ta nên coi những lợi thế của Pascal là quan trọng và những lợi thế của M.NET không liên quan?
Câu trả lời là bạn có thể viết tất cả các loại thuật toán trong Pascal, nhưng bạn không thể viết các thuật toán trong M hoặc M.NET. Chắc chắn, M biên dịch lệnh của bạn "m" và C biên dịch lệnh của bạn "strcmp". Nhưng bạn có thể đặt "strcmp" trong ngữ cảnh lớn hơn, ví dụ so sánh hai tệp theo từng dòng hoặc đọc hàng nghìn chuỗi và sắp xếp chúng theo thứ tự bảng chữ cái hoặc ... tốt, hàng triệu thứ khác. Và chính xác là khả năng này sử dụng các lệnh đã cho trong bất kỳ thuật toán nào tạo nên bản chất của ngôn ngữ lập trình.
Chính xác thì thuật toán là gì và quan trọng hơn là "thuật toán bất kỳ" là gì? Trong khoa học máy tính, chúng tôi sử dụng các từ Turing-Complete . Ý tưởng là có một bộ ngôn ngữ máy tính, trong đó mỗi ngôn ngữ có thể mô phỏng tất cả chúng. Một trong những ngôn ngữ đó là máy Turing, đó là lý do tại sao chúng được gọi như vậy. Pascal ở đó, C ở đó, Java ở đó, Python ở đó, Lisp ở đó, Smalltalk ở đó, thậm chí XSLT ở đó. M và M.NET giả thuyết của chúng tôi không có ở đó. Bạn có thể tìm hiểu thêm về điều này tại bất kỳ trường đại học nào cung cấp khóa học khoa học máy tính đàng hoàng, nhưng ý tưởng là một ngôn ngữ hoàn chỉnh Turing có thể làm bất cứ điều gìrằng một ngôn ngữ hoàn chỉnh Turing khác có thể làm được, nếu bạn cung cấp cho họ API cần thiết tối thiểu. (Nếu bạn cung cấp một số API trình duyệt web cho Pascal, bạn có thể tạo tất cả các loại trò chơi trong trình duyệt web. Nếu bạn cung cấp API trình duyệt web cho M, bạn vẫn chỉ có thể tạo Minesweeper.) Chúng tôi có thể nói một cách ẩn dụ rằng nếu bạn xóa tất cả các API khỏi ngôn ngữ lập trình, nội dung quan trọng là những gì còn lại.
" Biểu thức chính quy " nghĩa là gì?
Các ngôn ngữ lập trình khác nhau thực hiện chúng hơi khác nhau. Nhưng ý tưởng ban đầu là các biểu thức chính quy thể hiện cái gọi là ngôn ngữ thông thường . Lưu ý rằng chúng ta không nói về ngôn ngữ lập trình ở đây, mà là về ngôn ngữ của con người (giả). Hãy tưởng tượng rằng bạn tìm thấy một bộ lạc kỳ lạ nói một ngôn ngữ chỉ bao gồm các từ "ba", "baba", "bababa", v.v. Bạn có thể mô tả ngôn ngữ này bằng lời nói là "một âm tiết 'ba' lặp đi lặp lại một hoặc nhiều lần" hoặc sử dụng một biểu thức thông thường là "(ba) +".
Các biểu thức chính quy được cho là thể hiện: "không có gì", "lá thư này", "cái này, tiếp theo là cái kia", "cái này hay cái kia", "cái này, lặp đi lặp lại một hoặc nhiều lần" và "không phải cái này". - Đó là định nghĩa toán học . Bất cứ điều gì khác chỉ là một phím tắt thuận tiện được xây dựng từ các thành phần trước đó. Ví dụ: "cái này, lặp lại hai hoặc ba lần" có thể được dịch là "cái này, tiếp theo là cái này, theo sau (cái này hoặc không có gì)", nhưng có thể thuận tiện hơn khi viết "ba {2,3}" so với "baba (ba)?".
Trong cuộc sống thực, một cách thực hiện điển hình của "biểu thức chính quy" thực hiện nhiều hơn thế này. Ví dụ: sử dụng định nghĩa toán học, ngôn ngữ của "aba", "aabaa", "aaabaaa", v.v. - bất kỳ số "a" nào, theo sau là "b", theo sau là cùng một số "a" "S - không phải là ngôn ngữ thông thường. Tuy nhiên, nhiều "biểu thức chính quy" được sử dụng ngày nay có thể phát hiện ra nó, bằng cách sử dụng khái niệm bổ sung "cùng một thứ mà chúng ta đã tìm thấy trước đây", được viết là "(a +) b \ 1". Sử dụng khái niệm bổ sung này, chúng ta có thể làm một số điều thú, ví dụ như phát hiện từ bao gồm các thủ số của các chữ cái. Tuy nhiên, chúng tôi không thể thực hiện bất kỳ thuật toán nào ... để giải thích tại sao,
Vì vậy, quay lại chủ đề ban đầu: các biểu thức chính quy (được định nghĩa là: các biểu thức mô tả các ngôn ngữ thông thường trong hệ thống phân cấp Chomsky; hoặc là: trước đây, cộng với thao tác \ 1) là ngôn ngữ lập trình (được định nghĩa là: Hoàn thành Turing)? Câu trả lời là không . Không, bạn không thể thực hiện bất kỳ thuật toán nào bằng cách sử dụng các biểu thức thông thường và khả năng thực hiện bất kỳ thuật toán nào là điều mà mọi người nghiên cứu về khoa học máy tính thường hiểu là bản chất của ngôn ngữ lập trình.
Tất nhiên, bất cứ ai cũng có thể thay đổi câu trả lời bằng cách nhấn mạnh vào một định nghĩa khác . Như tôi đã viết lúc đầu, các chi tiết kỹ thuật rất quan trọng ở đây. Nếu bạn nhận được chúng sai, bạn nhận được một câu trả lời sai.
Và nếu bạn không quan tâm đến các chi tiết kỹ thuật, câu trả lời có thể là: Bạn có thể sử dụng các biểu thức thông thường (và không có gì khác) để tạo một chương trình không? Không. Vậy tại sao gọi nó là ngôn ngữ lập trình? (Tuy nhiên, một câu trả lời như thế này đã được tải xuống và xóa ở đây, đó là lý do tại sao tôi viết phiên bản dài hơn này.)
EDIT: Ngoài ra, bất kỳ ai cũng có thể tạo một thư viện triển khai biến thể "biểu thức chính quy" mới của riêng họ với một số tính năng mới được thêm vào. Tại một thời điểm nào đó, các tính năng mới có thể đủ để toàn bộ hệ thống trở nên hoàn chỉnh. Một ví dụ tầm thường sẽ nhúng ngôn ngữ Turing-Complete bằng một số cú pháp mới; nhưng nó cũng có thể xảy ra ít rõ ràng hơn Có lẽ nó đã xảy ra rồi.