[[modules-scripting-painless]]
== Painless scripting language

_Painless_ is a performant, secure scripting language designed specifically for
{es}. You can use Painless to safely write inline and stored scripts anywhere
scripts are supported in {es}.

[[painless-features]]
Painless provides numerous capabilities that center around the following
core principles:

* **Safety**: Ensuring the security of your cluster is of utmost importance. To
that end, Painless uses a fine-grained allowlist with a granularity down to the
members of a class. Anything that is not part of the allowlist results in a
compilation error. See the
{painless}/painless-api-reference.html[Painless API Reference]
for a complete list of available classes, methods, and fields per script
context.
* **Performance**: Painless compiles directly into JVM bytecode to take
advantage of all possible optimizations that the JVM provides. Also, Painless
typically avoids features that require additional slower checks at runtime.
* **Simplicity**: Painless implements a syntax with a natural familiarity to
anyone with some basic coding experience. Painless uses a subset of Java syntax
with some additional improvements to enhance readability and remove
boilerplate.

[discrete]
=== Start scripting
Ready to start scripting with Painless? Learn how to
<<modules-scripting-using,write your first script>>.

If you're already familiar with Painless, see the
{painless}/painless-lang-spec.html[Painless Language Specification] for a
detailed description of the Painless syntax and language features.
