Ngôn ngữ kịch bản

Ngôn ngữ kịch bản () là ngôn ngữ lập trình cho môi trường thời gian chạy đặc biệt tự động hóa thực thi các tác vụ; các tác vụ thay thế có thể được thực thi từng cái một bởi người điều hành. Ngôn ngữ kịch bản thường được diễn giải (thay vì biên dịch).

Nguyên thủy của "ngôn ngữ kịch bản" thường là các tác vụ cơ bản hoặc các lệnh gọi API và ngôn ngữ cho phép chúng được kết hợp thành nhiều chương trình hơn. Các môi trường có thể được tự động hóa thông qua tập lệnh bao gồm các ứng dụng phần mềm, trang web trong trình duyệt web, sử dụng shell của hệ điều hành, hệ thống nhúng, cũng như nhiều trò chơi. Một ngôn ngữ kịch bản có thể được xem như một ngôn ngữ dành riêng cho miền cho một môi trường cụ thể; trong trường hợp kịch bản một ứng dụng, nó còn được gọi là ngôn ngữ mở rộng. Ngôn ngữ kịch bản đôi khi cũng được gọi là ngôn ngữ lập trình cấp cao, vì chúng hoạt động ở mức độ trừu tượng cao hoặc là ngôn ngữ điều khiển, đặc biệt đối với ngôn ngữ kiểm soát công việc trên máy tính lớn.

Thuật ngữ "ngôn ngữ kịch bản" cũng được sử dụng một cách lỏng lẻo để chỉ các ngôn ngữ có mục đích chung cấp cao, như Perl, PowerShell, Python và Tcl với thuật ngữ "tập lệnh" thường được sử dụng cho các chương trình nhỏ (lên đến vài nghìn dòng mã) trong các ngôn ngữ đó hoặc trong các ngôn ngữ dành riêng cho tên miền như ngôn ngữ xử lý văn bản sed và AWK. Một số ngôn ngữ này ban đầu được phát triển để sử dụng trong một môi trường cụ thể và sau đó được phát triển thành ngôn ngữ dành riêng cho miền di động hoặc mục đích chung. Ngược lại, nhiều ngôn ngữ có mục đích chung có phương ngữ được sử dụng làm ngôn ngữ kịch bản. Bài viết này thảo luận về các ngôn ngữ kịch bản theo nghĩa hẹp của các ngôn ngữ cho một môi trường cụ thể.

Phổ của các ngôn ngữ kịch bản bao gồm từ các ngôn ngữ rất nhỏ và có tính đặc hiệu miền cao đến các ngôn ngữ lập trình có mục đích chung được sử dụng để viết kịch bản. Các ví dụ tiêu chuẩn về ngôn ngữ kịch bản cho các môi trường cụ thể bao gồm: Bash cho các hệ điều hành giống Unix hoặc Unix; ECMAScript (JavaScript) dành cho trình duyệt web; Visual Basic cho ứng dụng, cho các ứng dụng Microsoft Office. Lua là một ngôn ngữ được thiết kế và sử dụng rộng rãi như một ngôn ngữ mở rộng. Python là ngôn ngữ có mục đích chung cũng thường được sử dụng làm ngôn ngữ mở rộng, trong khi ECMAScript vẫn chủ yếu là ngôn ngữ kịch bản cho các trình duyệt web, nhưng cũng được sử dụng làm ngôn ngữ cho mục đích chung. Phương ngữ Lisp của Emacs (dành cho trình soạn thảo Emacs) và phương ngữ Visual Basic cho ứng dụng của Visual Basic là các ví dụ về phương ngữ ngôn ngữ kịch bản của các ngôn ngữ có mục đích chung. Một số hệ thống trò chơi, đáng chú ý là thế giới ảo Second Life và nhượng quyền thương mại mô phỏng Railroad của Trainz đã được mở rộng về chức năng bằng các phần mở rộng kịch bản (Linden Scripting Language và TrainzScript). Trong các trò chơi khác như Wesnoth, sự đa dạng của các trò chơi thực tế do người chơi chơi là các kịch bản được viết bởi người dùng khác.

== Đặc điểm ==
Các ngôn ngữ kịch bản điển hình được dự định sẽ rất nhanh để học và viết, dưới dạng các tệp mã nguồn ngắn hoặc tương tác trong một vòng lặp in (REPL, vỏ ngôn ngữ). Điều này thường bao hàm cú pháp và ngữ nghĩa tương đối đơn giản; thông thường, một "tập lệnh" (mã được viết bằng ngôn ngữ kịch bản) được thực thi từ đầu đến cuối, dưới dạng "tập lệnh", không có điểm nhập rõ ràng.

Ví dụ, việc mô tả Java là ngôn ngữ kịch bản là không phổ biến vì cú pháp dài và quy tắc về các lớp tồn tại trong các tệp nào và không thể thực thi trực tiếp Java, vì các tệp nguồn chỉ có thể chứa các định nghĩa phải được gọi bên ngoài bởi một ứng dụng máy chủ hoặc trình khởi chạy ứng dụng.

Một ngôn ngữ kịch bản thường được diễn giải từ mã nguồn hoặc mã byte.  Ngược lại, môi trường phần mềm mà các tập lệnh được viết thường được viết bằng ngôn ngữ được biên dịch và phân phối ở dạng mã máy.

Các ngôn ngữ kịch bản có thể được thiết kế để người dùng cuối của chương trình Phát triển người dùng cuối của chương trình có thể chỉ dành cho các nhà phát triển, vì vậy họ có thể viết các phần của chương trình bằng ngôn ngữ kịch bản. Các ngôn ngữ script thường sử dụng sự trừu tượng hóa, một dạng ẩn thông tin, để cung cấp cho người dùng các chi tiết về các loại biến nội bộ, lưu trữ dữ liệu và quản lý bộ nhớ.

Các tập lệnh thường được tạo hoặc sửa đổi bởi người thực thi chúng,  nhưng chúng cũng thường được phân phối, chẳng hạn như khi một phần lớn các trò chơi được viết bằng ngôn ngữ kịch bản.

== Lịch sử ==
Các máy tính máy tính lớn đầu tiên (vào những năm 1950) không tương tác, thay vào đó sử dụng xử lý hàng loạt. Ngôn ngữ kiểm soát công việc của IBM (JCL) là nguyên mẫu ngôn ngữ được sử dụng để kiểm soát xử lý hàng loạt.

Các shell tương tác đầu tiên được phát triển vào những năm 1960 để cho phép hoạt động từ xa các hệ thống chia sẻ lần đầu tiên và các shell shell được sử dụng này, điều khiển các chương trình máy tính chạy trong chương trình máy tính, shell. Calvin Mooers trong ngôn ngữ TRAC của anh ta thường được ghi nhận là đã phát minh ra "sự thay thế lệnh", khả năng nhúng các lệnh trong các tập lệnh mà khi diễn giải sẽ chèn một chuỗi ký tự vào tập lệnh.  Multics gọi các "chức năng hoạt động" này.  Louis Pouzin đã viết một bộ xử lý ban đầu cho các tập lệnh được gọi là RUNCOM cho CTSS vào khoảng năm 1964. Stuart Madnick tại MIT đã viết một ngôn ngữ kịch bản cho CP / CMS của IBM vào năm 1966. Ban đầu ông gọi bộ xử lý này là EXEC.  Multics bao gồm một nhánh của CTSS RUNCOM, còn được gọi là RUNCOM.  EXEC cuối cùng đã được thay thế bởi EXEC 2 và REXX.

Các ngôn ngữ như Tcl và Lua được thiết kế đặc biệt như các ngôn ngữ kịch bản có mục đích chung có thể được nhúng trong bất kỳ ứng dụng nào. Các ngôn ngữ khác như Visual Basic for Application (VBA) cung cấp tích hợp mạnh mẽ với các phương tiện tự động hóa của một hệ thống cơ bản. Việc nhúng các ngôn ngữ script đa mục đích như vậy thay vì phát triển ngôn ngữ mới cho mỗi ứng dụng cũng mang lại lợi ích rõ ràng, giúp nhà phát triển ứng dụng cần mã hóa trình dịch ngôn ngữ từ đầu và cho phép người dùng áp dụng các kỹ năng học được ở nơi khác.

Một số phần mềm kết hợp một số ngôn ngữ kịch bản khác nhau. Các trình duyệt web hiện đại thường cung cấp một ngôn ngữ để viết các phần mở rộng cho chính trình duyệt và một số ngôn ngữ nhúng tiêu chuẩn để kiểm soát trình duyệt, bao gồm JavaScript (một phương ngữ của ECMAScript) hoặc XUL.

== Các loại ==
Viết kịch bản thường tương phản với lập trình hệ thống, như trong phân đôi của Ousterhout hoặc " lập trình trong lớn và lập trình trong nhỏ ". Theo quan điểm này, kịch bản đặc biệt là mã keo, kết nối các thành phần phần mềm và một ngôn ngữ chuyên dùng cho mục đích này là "ngôn ngữ keo". Pipelines và shell scripting là những ví dụ điển hình của ngôn ngữ keo và Perl ban đầu được phát triển để hoàn thành vai trò tương tự. Phát triển web có thể được coi là việc sử dụng các ngôn ngữ keo, giao thoa giữa cơ sở dữ liệu và máy chủ web. Nhưng nếu một lượng lớn logic được viết bằng script, thì nó được đặc trưng tốt hơn như đơn giản là một thành phần phần mềm khác, không phải là "keo".

Ngôn ngữ keo đặc biệt hữu ích cho việc viết và duy trì:

- các lệnh tùy chỉnh cho một shell lệnh;
- các chương trình nhỏ hơn các chương trình được thực hiện tốt hơn trong một ngôn ngữ được biên dịch;
- Các chương trình "trình bao bọc" cho các tệp thực thi, như một tệp bó di chuyển hoặc thao tác các tệp và thực hiện các thao tác khác với hệ điều hành trước hoặc sau khi chạy một ứng dụng như trình xử lý văn bản, bảng tính, cơ sở dữ liệu, trình biên dịch, trình biên dịch...;
- kịch bản có thể thay đổi;
- Phát triển ứng dụng nhanh chóng của một giải pháp cuối cùng được thực hiện bằng ngôn ngữ khác, thường được biên soạn.

Ví dụ ngôn ngữ keo:

- AppleScript
- ColdFusion
- DCL
- Lisp phổ biến có thể nhúng
- ecl
- Erlang
- JCL
- CoffeeScript
- Julia
- JScript và JavaScript
- Lua
- m4
- Pascal hiện đại
- Perl (5 và 6)
- PHP
- PowerShell
- Pure
- Python
- Rebol
- Red
- Rexx
- Ruby
- Scheme
- Tcl
- Các kịch bản Unix Shell (ksh, csh, bash, sh và những thứ khác)
- VBScript
- Work Flow Language
- XSLT

Các ngôn ngữ macro tiếp xúc với hệ điều hành hoặc các thành phần ứng dụng có thể đóng vai trò là ngôn ngữ keo. Chúng bao gồm Visual Basic cho Ứng dụng, WordBasic, LotusScript, CorelScript, Hummingbird Basic, QuickScript, SaxBasic và WinWrap Basic. Các công cụ khác như AWK cũng có thể được coi là ngôn ngữ keo, như bất kỳ ngôn ngữ nào được triển khai bởi công cụ Windows Script Host (VBScript, JScript và VBA theo mặc định trong Windows và các công cụ của bên thứ ba bao gồm triển khai Rexx, Perl, Tcl, Python, XSLT, Ruby, Pascal hiện đại, Delphi và C). Phần lớn các ứng dụng có thể truy cập và sử dụng các thành phần hệ điều hành thông qua các mô hình đối tượng hoặc các chức năng của chính nó.

Các thiết bị khác như máy tính lập trình cũng có thể có ngôn ngữ keo; các hệ điều hành của các thiết bị PDA như Windows CE có thể có sẵn các công cụ macro của bên thứ ba hoặc bên thứ ba kết hợp các ứng dụng lại với nhau, ngoài việc triển khai các ngôn ngữ keo thông thường, bao gồm Windows NT, MS-DOS và một số shell Unix, Rexx, Modern Pascal, PHP và Perl. Tùy thuộc vào phiên bản HĐH, WSH và các công cụ tập lệnh mặc định (VBScript và JScript) có sẵn.

Máy tính lập trình có thể được lập trình bằng ngôn ngữ keo theo ba cách. Ví dụ, Texas -TI TI-92, theo mặc định của nhà máy có thể được lập trình bằng ngôn ngữ tập lệnh. Việc đưa vào ngôn ngữ kịch bản và keo dán Lua trong loạt máy tính TI-NSpire có thể được coi là sự kế thừa cho điều này. Các ngôn ngữ lập trình cấp cao chính trên tàu của hầu hết các máy tính vẽ đồ thị (thường là các biến thể cơ bản, đôi khi là các dẫn xuất Lisp và các dẫn xuất C khác thường) trong nhiều trường hợp có thể kết dính các chức năng của máy tính với nhau như đồ thị, danh sách, ma trận... Việc triển khai của bên thứ ba phiên bản Cơ bản toàn diện hơn có thể gần hơn với các biến thể được liệt kê là ngôn ngữ keo trong bài viết này có sẵn và cố gắng triển khai Perl, Rexx hoặc các hệ điều hành khác nhau trên máy tính vẽ đồ thị TI và HP cũng được đề cập. Trình biên dịch chéo C dựa trên PC cho một số máy TI và HP được sử dụng cùng với các công cụ chuyển đổi giữa C và Perl, Rexx, AWK, cũng như các tập lệnh shell sang Perl, Modern Pascal, VBScript sang và từ Perl để viết chương trình bằng ngôn ngữ keo để thực hiện cuối cùng (dưới dạng chương trình đã biên dịch) trên máy tính.

== Ngôn ngữ và trình điều khiển công việc ==
Một lớp lớn các ngôn ngữ kịch bản đã phát triển từ việc tự động hóa kiểm soát công việc, liên quan đến việc bắt đầu và kiểm soát hành vi của các chương trình hệ thống. (Theo nghĩa này, người ta có thể nghĩ các shell là hậu duệ của JCL của IBM hoặc Ngôn ngữ kiểm soát công việc, được sử dụng cho chính xác mục đích này.) Nhiều trình thông dịch của các ngôn ngữ này nhân đôi như các trình thông dịch dòng lệnh như shell Unix hoặc MS-DOS codice_1. Những người khác, chẳng hạn như AppleScript cung cấp việc sử dụng các lệnh giống như tiếng Anh để xây dựng các tập lệnh.

== GUI scripting ==
Với sự ra đời của giao diện người dùng đồ họa, một loại ngôn ngữ kịch bản chuyên dụng đã xuất hiện để điều khiển máy tính. Các ngôn ngữ này tương tác với cùng một cửa sổ đồ họa, menu, nút, và như vậy, một người dùng sẽ làm. Họ làm điều này bằng cách mô phỏng hành động của người dùng. Các ngôn ngữ này thường được sử dụng để tự động hóa hành động của người dùng. Các ngôn ngữ như vậy cũng được gọi là "macro" khi điều khiển thông qua các lần nhấn phím mô phỏng hoặc nhấp chuột, cũng như chạm hoặc nhấn vào màn hình kích hoạt cảm ứng.

Về nguyên tắc, các ngôn ngữ này có thể được sử dụng để kiểm soát bất kỳ ứng dụng GUI nào; nhưng, trong thực tế việc sử dụng của họ bị hạn chế vì việc sử dụng của họ cần sự hỗ trợ từ ứng dụng và từ hệ điều hành. Có một vài ngoại lệ cho giới hạn này. Một số ngôn ngữ kịch bản GUI dựa trên việc nhận dạng các đối tượng đồ họa từ pixel màn hình hiển thị của chúng. Các ngôn ngữ kịch bản GUI này không phụ thuộc vào sự hỗ trợ từ hệ điều hành hoặc ứng dụng.

== Ngôn ngữ dành riêng cho ứng dụng ==
Các ngôn ngữ dành riêng cho ứng dụng có thể được phân chia thành nhiều loại khác nhau, tức là ngôn ngữ ứng dụng dựa trên độc lập (có thể thực thi) hoặc ngôn ngữ dành riêng cho ứng dụng nội bộ (postcript, xml, gscript như một số tập lệnh được phân phối rộng rãi, tương ứng được Adobe, MS và Google triển khai) một ngôn ngữ kịch bản thành ngữ phù hợp với nhu cầu của người dùng ứng dụng. Tương tự như vậy, nhiều hệ thống trò chơi máy tính sử dụng ngôn ngữ kịch bản tùy chỉnh để thể hiện hành động được lập trình của các nhân vật không phải người chơi và môi trường trò chơi. Các ngôn ngữ thuộc loại này được thiết kế cho một ứng dụng duy nhất; và, mặc dù chúng có thể rất giống với một ngôn ngữ có mục đích chung cụ thể (ví dụ QuakeC, được mô phỏng theo C), chúng có các tính năng tùy chỉnh để phân biệt chúng. Emacs Lisp, trong khi một phương ngữ đầy đủ và có khả năng của Lisp, chứa nhiều tính năng đặc biệt giúp nó hữu ích nhất cho việc mở rộng các chức năng chỉnh sửa của Emacs. Một ngôn ngữ kịch bản dành riêng cho ứng dụng có thể được xem như một ngôn ngữ lập trình dành riêng cho miền dành riêng cho một ứng dụng.

== Mở rộng / ngôn ngữ nhúng ==
Một số ngôn ngữ đã được thiết kế cho mục đích thay thế các ngôn ngữ kịch bản dành riêng cho ứng dụng bằng cách có thể nhúng trong các chương trình ứng dụng. Lập trình viên ứng dụng (làm việc bằng ngôn ngữ C hoặc hệ thống khác) bao gồm "hook" trong đó ngôn ngữ script có thể điều khiển ứng dụng. Các ngôn ngữ này có thể tương đương về mặt kỹ thuật với ngôn ngữ mở rộng dành riêng cho ứng dụng nhưng khi ứng dụng nhúng ngôn ngữ "chung", người dùng có lợi thế là có thể chuyển các kỹ năng từ ứng dụng sang ứng dụng. Một cách khác chung hơn chỉ đơn giản là cung cấp một thư viện (thường là thư viện C) mà ngôn ngữ có mục đích chung có thể sử dụng để kiểm soát ứng dụng mà không cần sửa đổi ngôn ngữ cho tên miền cụ thể.

JavaScript bắt đầu và chủ yếu vẫn là ngôn ngữ để viết kịch bản bên trong các trình duyệt web; tuy nhiên, việc chuẩn hóa ngôn ngữ dưới dạng ECMAScript đã khiến nó trở nên phổ biến như một ngôn ngữ có thể nhúng mục đích chung. Cụ thể, SpiderMonkey triển khai Mozilla được nhúng trong một số môi trường như Yahoo! Công cụ phụ tùng. Các ứng dụng khác nhúng các triển khai ECMAScript bao gồm các sản phẩm Adobe Adobe Flash (ActionScript) và Adobe Acrobat (để tạo tập tin PDF).

Tcl được tạo ra như một ngôn ngữ mở rộng nhưng đã được sử dụng thường xuyên hơn như một ngôn ngữ có mục đích chung trong các vai trò tương tự như Python, Perl và Ruby. Mặt khác, Rexx ban đầu được tạo ra như một ngôn ngữ kiểm soát công việc, nhưng được sử dụng rộng rãi như một ngôn ngữ mở rộng cũng như ngôn ngữ có mục đích chung. Perl là một ngôn ngữ có mục đích chung, nhưng có phương ngữ Oraperl (1990), bao gồm một nhị phân Perl 4 với Giao diện cuộc gọi của Oracle được biên dịch. Tuy nhiên, điều này đã được thay thế bởi một thư viện (mô-đun Perl), DBD:: Oracle.

Các ứng dụng phức tạp và hướng theo nhiệm vụ khác có thể kết hợp và hiển thị ngôn ngữ lập trình nhúng để cho phép người dùng của họ kiểm soát nhiều hơn và cung cấp cho họ nhiều chức năng hơn có thể có sẵn thông qua giao diện người dùng, bất kể tinh vi đến mức nào. Ví dụ: các công cụ tác giả Autodesk Maya 3D nhúng ngôn ngữ kịch bản MEL hoặc Blender sử dụng Python để điền vào vai trò này.

Một số loại ứng dụng khác cần thêm tính năng nhanh hơn hoặc chu trình điều chỉnh và chạy (ví dụ: công cụ trò chơi) cũng sử dụng ngôn ngữ nhúng. Trong quá trình phát triển, điều này cho phép chúng tạo ra các tính năng nguyên mẫu nhanh hơn và điều chỉnh tự do hơn mà không cần người dùng phải có kiến thức sâu sắc về hoạt động bên trong của ứng dụng hoặc xây dựng lại sau mỗi lần điều chỉnh (có thể mất một khoảng thời gian đáng kể). Các ngôn ngữ kịch bản được sử dụng cho mục đích này bao gồm từ Lua và Python phổ biến hơn và nổi tiếng hơn đến các ngôn ngữ ít được biết đến hơn như AngelScript và Squirrel.