Có rất nhiều câu trả lời cho điều này.
Thứ nhất: nó không thực sự là một câu hỏi về sự khác biệt giữa ngôn ngữ kịch bản và ngôn ngữ lập trình, bởi vì ngôn ngữ kịch bản là ngôn ngữ lập trình. Câu hỏi nhiều hơn về những đặc điểm nào khiến một số ngôn ngữ lập trình trở thành ngôn ngữ kịch bản trong khi một ngôn ngữ lập trình khác không phải là ngôn ngữ kịch bản.
Thứ hai: thực sự rất khó để nói ngôn ngữ XYZ là gì, cho dù XYZ đó là "kịch bản", "lập trình chức năng", "lập trình hướng đối tượng" hay là gì. Định nghĩa về "lập trình chức năng" là khá rõ ràng, nhưng không ai biết "ngôn ngữ lập trình chức năng" là gì.
Lập trình hàm hay lập trình hướng đối tượng là các kiểu lập trình ; bạn có thể viết theo kiểu chức năng hoặc kiểu hướng đối tượng bằng bất kỳ ngôn ngữ nào. Ví dụ, Linux Virtual File System Switch và trình điều khiển Linux Mẫu là nặng nề hướng đối tượng mặc dù viết bằng C, trong khi rất nhiều Java hoặc C # mã bạn thấy trên web là rất thủ tục và không hướng đối tượng ở tất cả . OTOH, tôi đã thấy một số mã Java có nhiều chức năng.
Vì vậy, nếu lập trình chức năng và lập trình hướng đối tượng chỉ đơn thuần là các kiểu có thể được thực hiện bằng bất kỳ ngôn ngữ nào , thì làm thế nào để bạn định nghĩa một "ngôn ngữ lập trình hướng đối tượng"? Bạn có thể nói rằng một ngôn ngữ lập trình hướng đối tượng là một ngôn ngữ cho phép lập trình hướng đối tượng. Nhưng đó không phải là định nghĩa nhiều: tất cả các ngôn ngữ đều cho phép lập trình hướng đối tượng, do đó tất cả các ngôn ngữ đều hướng đối tượng? Vì vậy, bạn nói, một ngôn ngữ là hướng đối tượng, nếu nó buộc bạn phải lập trình theo phong cách hướng đối tượng. Nhưng đó cũng không phải là định nghĩa: tất cả các ngôn ngữ đều cho phép lập trình hàm, do đó không có ngôn ngữ nào là hướng đối tượng?
Vì vậy, đối với tôi, tôi đã tìm thấy định nghĩa sau:
Một ngôn ngữ là một ngôn ngữ kịch bản (ngôn ngữ hướng đối tượng / ngôn ngữ chức năng) nếu cả hai
- tạo điều kiện thuận lợi cho việc tạo kịch bản (lập trình hướng đối tượng / lập trình chức năng), tức là nó không chỉ cho phép mà còn làm cho nó dễ dàng và tự nhiên và chứa các tính năng trợ giúp cho nó, VÀ
- khuyến khích và hướng dẫn bạn theo hướng viết kịch bản (lập trình hướng đối tượng / lập trình chức năng).
Vì vậy, sau năm đoạn văn, tôi đã đến: "một ngôn ngữ kịch bản là một ngôn ngữ để viết kịch bản". Thật là một định nghĩa tuyệt vời. KHÔNG PHẢI.
Rõ ràng, bây giờ chúng ta cần nhìn vào định nghĩa của "scripting".
Đây là lúc vấn đề thứ ba xuất hiện: trong khi thuật ngữ "lập trình chức năng" được định nghĩa rõ ràng và chỉ có thuật ngữ "ngôn ngữ lập trình chức năng" là có vấn đề, thật không may với kịch bản, cả thuật ngữ "kịch bản" và thuật ngữ "ngôn ngữ lập trình "không được xác định rõ.
Vâng, trước hết kịch bản là lập trình. Nó chỉ là một kiểu lập trình đặc biệt. IOW: mọi kịch bản đều là một chương trình, nhưng không phải mọi chương trình đều là kịch bản; tập hợp tất cả các tập lệnh là một tập hợp con thích hợp của tập hợp tất cả các chương trình.
Theo ý kiến cá nhân của tôi, điều tạo nên kịch bản script và phân biệt nó với các kiểu lập trình khác, đó là…
Tập lệnh điều khiển phần lớn các đối tượng
- không được tạo bởi tập lệnh,
- có thời gian tồn tại độc lập với kịch bản và
- sống bên ngoài miền của script.
Ngoài ra, các kiểu dữ liệu và thuật toán được sử dụng thường không được định nghĩa bởi script mà là bởi môi trường bên ngoài.
Hãy nghĩ về một tập lệnh shell: các tập lệnh shell thường thao tác các tệp, thư mục và các quy trình. Phần lớn các tệp, thư mục và quy trình trên hệ thống của bạn có thể không được tạo bởi tập lệnh hiện đang chạy. Và chúng không biến mất khi script thoát ra: thời gian tồn tại của chúng hoàn toàn độc lập với script. Và chúng cũng không thực sự là một phần của kịch bản, chúng là một phần của hệ thống. Bạn không bắt đầu tập lệnh của mình bằng cách viết File
và Directory
các lớp, những kiểu dữ liệu đó không phải là mối quan tâm của bạn: bạn cứ cho rằng chúng ở đó, và bạn thậm chí không biết (cũng như không cần biết) cách chúng hoạt động. Và bạn cũng không triển khai các thuật toán của riêng mình, ví dụ như đối với truyền tải thư mục mà bạn chỉ sử dụng find
thay vì triển khai tìm kiếm theo chiều rộng của riêng bạn.
Nói tóm lại: một tập lệnh gắn chính nó vào một hệ thống lớn hơn tồn tại độc lập với tập lệnh, thao tác một số phần nhỏ của hệ thống và sau đó thoát ra.
Hệ thống lớn hơn đó có thể là hệ điều hành trong trường hợp tập lệnh shell, DOM của trình duyệt trong trường hợp tập lệnh trình duyệt, trò chơi (ví dụ: World of Warcraft với Lua hoặc Second Life với Linden Scripting Language), một ứng dụng (ví dụ: AutoLisp ngôn ngữ cho AutoCAD hoặc macro Excel / Word / Office), một máy chủ web, một gói rô bốt hoặc thứ gì đó hoàn toàn khác.
Lưu ý rằng khía cạnh kịch bản là hoàn toàn trực giao với tất cả các khía cạnh khác của ngôn ngữ lập trình: một ngôn ngữ lập trình có thể được gõ mạnh hoặc yếu, gõ chặt chẽ hoặc lỏng lẻo, nhập tĩnh hoặc nhập động, trên danh nghĩa, định cấu trúc hoặc gõ kiểu vịt, thậm chí có thể không định kiểu được. . Nó có thể là mệnh lệnh hoặc chức năng, hướng đối tượng, thủ tục hoặc chức năng, nghiêm ngặt hoặc lười biếng. Các triển khai của nó có thể được diễn giải, biên dịch hoặc trộn lẫn.
Ví dụ, Mondrian là một ngôn ngữ kịch bản chức năng lười biếng được đánh kiểu tĩnh mạnh mẽ với triển khai đã được biên dịch.
Tuy nhiên, tất cả điều này là tranh luận, bởi vì cách hạn ngôn ngữ kịch bản được thực sự được sử dụng trong thế giới thực, không có gì để làm với bất kỳ ở trên. Nó thường được sử dụng đơn giản như một sự xúc phạm và định nghĩa khá đơn giản, thậm chí đơn giản:
- ngôn ngữ lập trình thực : ngôn ngữ lập trình của tôi
- ngôn ngữ kịch bản: ngôn ngữ lập trình của bạn
Đây dường như là cách mà thuật ngữ này thường được sử dụng nhất.