From d7d1e9d44a13d9640a79c920399d6d7ee2ac7481 Mon Sep 17 00:00:00 2001 From: Christopher Swiedler Date: Wed, 10 Feb 2021 20:27:24 -0800 Subject: [PATCH] Add navigation and a splashy index page --- docs/_config.yml | 13 +++- docs/_data/navigation.yml | 16 +++++ docs/{ => _pages}/limited-terms-of-use.md | 1 + docs/{ => _pages}/lint.md | 4 ++ docs/{ => _pages}/performance.md | 4 ++ docs/{ => _pages}/sandbox.md | 3 + docs/{ => _pages}/syntax.md | 4 ++ docs/{ => _pages}/typecheck.md | 3 + docs/{ => _pages}/why.md | 3 + docs/assets/images/example.png | Bin 0 -> 38006 bytes docs/index.md | 84 +++++++++++++--------- 11 files changed, 99 insertions(+), 36 deletions(-) create mode 100644 docs/_data/navigation.yml rename docs/{ => _pages}/limited-terms-of-use.md (99%) rename docs/{ => _pages}/lint.md (99%) rename docs/{ => _pages}/performance.md (99%) rename docs/{ => _pages}/sandbox.md (99%) rename docs/{ => _pages}/syntax.md (99%) rename docs/{ => _pages}/typecheck.md (99%) rename docs/{ => _pages}/why.md (99%) create mode 100644 docs/assets/images/example.png diff --git a/docs/_config.yml b/docs/_config.yml index ed345a5b..c2bc6acf 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,6 +1,17 @@ remote_theme: "mmistakes/minimal-mistakes@4.22.0" +minimal_mistakes_skin: "air" #, "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum" "sunrise" +url: title: Luau description: > A fast, small, safe, gradually typed embeddable scripting language derived from Lua -plugins: [ jekyll-include-cache ] \ No newline at end of file +plugins: ["jekyll-include-cache"] +include: ["_pages"] + +defaults: + # _docs + - scope: + path: "" + type: "pages" + values: + layout: "single" diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml new file mode 100644 index 00000000..a5becb95 --- /dev/null +++ b/docs/_data/navigation.yml @@ -0,0 +1,16 @@ +main: + - title: "Why?" + url: /why + - title: "Syntax" + url: /syntax + - title: "Terms of Use" + url: /limited-terms-of-use + - title: "Linting" + url: /lint + - title: "Performance" + url: /performance + - title: "Sandboxing" + url: /sandbox + - title: "Typechecking" + url: /typecheck + \ No newline at end of file diff --git a/docs/limited-terms-of-use.md b/docs/_pages/limited-terms-of-use.md similarity index 99% rename from docs/limited-terms-of-use.md rename to docs/_pages/limited-terms-of-use.md index c3f4d690..678716a3 100644 --- a/docs/limited-terms-of-use.md +++ b/docs/_pages/limited-terms-of-use.md @@ -1,6 +1,7 @@ --- layout: default title: LIMITED USE LICENSE +permalink: /limited-terms-of-use ---

ROBLOX, INC.

diff --git a/docs/lint.md b/docs/_pages/lint.md similarity index 99% rename from docs/lint.md rename to docs/_pages/lint.md index 8e71958c..69d60a51 100644 --- a/docs/lint.md +++ b/docs/_pages/lint.md @@ -1,3 +1,7 @@ +--- +permalink: /lint +--- + # Linting Luau comes with a set of linting passes, that help make sure that the code is correct and consistent. Unlike the type checker, that models the behavior of the code thoroughly and points toward type mismatches that are likely to result in runtime errors, the linter is more opinionated and produces warnings that can often be safely ignored, although it's recommended to keep the code clean of the warnings. diff --git a/docs/performance.md b/docs/_pages/performance.md similarity index 99% rename from docs/performance.md rename to docs/_pages/performance.md index 0333e7f9..58fab3af 100644 --- a/docs/performance.md +++ b/docs/_pages/performance.md @@ -1,3 +1,7 @@ +--- +permalink: /performance +--- + # Performance One of main goals of Luau is to enable high performance code, with gameplay code being the main use case. This can be viewed as two separate goals: diff --git a/docs/sandbox.md b/docs/_pages/sandbox.md similarity index 99% rename from docs/sandbox.md rename to docs/_pages/sandbox.md index 6b0e7c98..9c78236b 100644 --- a/docs/sandbox.md +++ b/docs/_pages/sandbox.md @@ -1,3 +1,6 @@ +--- +permalink: /sandbox +--- # Sandboxing Luau is safe to embed. Broadly speaking, this means that even in the face of untrusted (and in Roblox case, actively malicious) code, the language and the standard library don't allow any unsafe access to the underlying system, and don't have any bugs that allow escaping out of the sandbox (e.g. to gain native code execution through ROP gadgets et al). Additionally, the VM provides extra features to implement isolation of privileged code from unprivileged code and protect one from the other; this is important if the embedding environment (Roblox) decides to expose some APIs that may not be safe to call from untrusted code, for example because they do provide controlled access to the underlying system or risk PII exposure through fingerprinting etc. diff --git a/docs/syntax.md b/docs/_pages/syntax.md similarity index 99% rename from docs/syntax.md rename to docs/_pages/syntax.md index c4cac9a1..5be450f0 100644 --- a/docs/syntax.md +++ b/docs/_pages/syntax.md @@ -1,3 +1,7 @@ +--- +permalink: /syntax +--- + # Syntax Luau uses the baseline [syntax of Lua 5.1](https://www.lua.org/manual/5.1/manual.html#2). For detailed documentation, please refer to the Lua manual, this is an example: diff --git a/docs/typecheck.md b/docs/_pages/typecheck.md similarity index 99% rename from docs/typecheck.md rename to docs/_pages/typecheck.md index 4a7da30d..cca158ba 100644 --- a/docs/typecheck.md +++ b/docs/_pages/typecheck.md @@ -1,3 +1,6 @@ +--- +permalink: /typecheck +--- # Type checking Luau supports a gradual type system through the use of type annotations and type inference. diff --git a/docs/why.md b/docs/_pages/why.md similarity index 99% rename from docs/why.md rename to docs/_pages/why.md index 0e1846fe..25da418c 100644 --- a/docs/why.md +++ b/docs/_pages/why.md @@ -1,3 +1,6 @@ +--- +permalink: /why +--- # Why Luau? Around 2006, [Roblox](https://www.roblox.com) started using Lua 5.1 as a scripting language for games. Over the years the runtime had to be tweaked to provide a safe, secure sandboxed environment; we gradually started accumulating small library changes and tweaks. diff --git a/docs/assets/images/example.png b/docs/assets/images/example.png new file mode 100644 index 0000000000000000000000000000000000000000..2f4eedeffa8af6bc79861a077a8aaa3e54509a95 GIT binary patch literal 38006 zcmeGERdgIpvIUF^EoNqxEN01KS!l5=W@eUJ%*@OdGcz+YTFguqGt=Kbb7sC->;CuQ zzTJn@tEwwIGb1u8swyjU=Z+4Omla2V#f1d{0YQ-XA)){R0xkjq0vZkt2F%I-f|&?B zfC3c6g+QvN@Q;B%tc=wpOk`w0Xn<*G5C~9Q5Xiq(fIB}Z-ha|!pkG12|0f@)C&U~C z;(zPN0*`+`vB3SW%)gFcIbi>;0WOjQ{_iws_}{7<@D2mO1B~4dbpQwmCdJFL z3IqfU)?7)=QB6jg+tAjULEp&Mz?i|++U~Cu2(K$QFllYtD_B{#C{;Z|-Vrr6yu-ZEOPon#TW)m4o+xn)&}I`Nz=zl2rdkl9h|?za{^x z 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 + Around 2006, [Roblox](https://www.roblox.com) started using Lua 5.1 as a scripting language for games. Over the years we ended up substantially evolving the implementation and the language; to support growing sophistication of games on the Roblox platform, growing team sizes and large internal teams writing a lot of code for application/editor (1+MLOC as of 2020), we had to invest in performance, ease of use and language tooling, and introduce a gradual type system to the language. [This page](why) goes into more detail about the road that got us here. + - image_path: + title: "Sandboxing" + excerpt: > + Luau limits the set of standard libraries exposed to the users and implements extra sandboxing features to be able to run unprivileged code (written by our game developers) side by side with privileged code (written by us). This results in an execution environment that is different from what is commonplace in Lua. The sandboxing [is described here](sandbox). + - image_path: + title: "Compatibility" + excerpt: > + Whenever possible, Luau aims to be backwards-compatible with Lua 5.1 and at the same time to incorporate features from later revisions of Lua. However, Luau is not a full superset of later versions of Lua - we do not agree with some design decisions made by the Lua authors, and have different use cases and constraints. All post-5.1 Lua features, along with their support status in Luau, [are documented here](compatibility). +feature_row2: + - image_path: /assets/images/example.png + title: "Syntax" + excerpt: > + Luau is syntactically backwards-compatible with Lua 5.1 (code that is valid Lua 5.1 is also valid Luau); however, we have extended the language with a set of syntactical features that make the language more familiar and ergonomic. The syntax [is described here](syntax). + url: "/syntax" +feature_row3: + - image_path: + title: "Analysis" + excerpt: > + To make it easier to write correct code, Luau comes with a set of analysis tools that can surface common mistakes. These consist of a linter and a type checker, colloquially known as "script analysis", and can be used from [Roblox Studio](https://developer.roblox.com/en-us/articles/The-Script-Analysis-Tool) or using SECRET TOOL. The linting passes are [described here](lint), and the type checking user guide can [be found here](typecheck). + - image_path: + title: "Performance" + excerpt: > + In addition to a completely custom front end that implements parsing, linting and type checking, Luau runtime features new bytecode, interpreter and compiler that are heavily tuned for performance. Luau currently does not implement Just-In-Time compilation, but its interpreter is often competitive with LuaJIT interpreter on a wide set of benchmarks. We continue to optimize the runtime and rewrite portions of it to be even more efficient, including plans for a new garbage collector and further library optimizations, as well as an eventual JIT/AOT option. While our overall goal is to minimize the amount of time programmers spend tuning performance, some details about the performance characteristics are [provided for inquisitive minds](performance). + - image_path: + title: "Libraries" + excerpt: > + As a language, Luau is a full superset of Lua 5.1. As far as standard library is concerned, some functions had to be removed from the builtin libraries, and some functions had to be added. Additionally, Luau is currently only runnable from the context of the Roblox engine, which exposes a large API surface [documented on Roblox developer portal](https://developer.roblox.com/en-us/api-reference). -Luau (lowercase u, /ˈlu.aʊ/) is a fast, small, safe, gradually typed embeddable scripting language derived from Lua. It is used by Roblox game developers to write game code, as well as by Roblox engineers to implement large parts of the user-facing application code as well as portions of the editor (Roblox Studio) as plugins. +--- -```lua -type Point = { x: number, y: number } +{% include feature_row id="intro" type="center" %} -local p: Point = { x = 1, y = 2 } +{% include feature_row %} -print(p.x, p.y) --- print(p.z) results in a type error -``` +{% include feature_row id="feature_row2" type="right" %} -## Motivation - -Around 2006, [Roblox](https://www.roblox.com) started using Lua 5.1 as a scripting language for games. Over the years we ended up substantially evolving the implementation and the language; to support growing sophistication of games on the Roblox platform, growing team sizes and large internal teams writing a lot of code for application/editor (1+MLOC as of 2020), we had to invest in performance, ease of use and language tooling, and introduce a gradual type system to the language. [This page](why.md) goes into more detail about the road that got us here. - -## Syntax - -Luau is syntactically backwards-compatible with Lua 5.1 (code that is valid Lua 5.1 is also valid Luau); however, we have extended the language with a set of syntactical features that make the language more familiar and ergonomic. The syntax [is described here](syntax.md). - -## Sandboxing - -Luau limits the set of standard libraries exposed to the users and implements extra sandboxing features to be able to run unprivileged code (written by our game developers) side by side with privileged code (written by us). This results in an execution environment that is different from what is commonplace in Lua. The sandboxing [is described here](sandbox.md). - -## Compatibility - -Whenever possible, Luau aims to be backwards-compatible with Lua 5.1 and at the same time to incorporate features from later revisions of Lua. However, Luau is not a full superset of later versions of Lua - we do not agree with some design decisions made by the Lua authors, and have different use cases and constraints. All post-5.1 Lua features, along with their support status in Luau, [are documented here](compatibility.md). - -## Analysis - -To make it easier to write correct code, Luau comes with a set of analysis tools that can surface common mistakes. These consist of a linter and a type checker, colloquially known as "script analysis", and can be used from [Roblox Studio](https://developer.roblox.com/en-us/articles/The-Script-Analysis-Tool) or using SECRET TOOL. The linting passes are [described here](lint.md), and the type checking user guide can [be found here](typecheck.md). - -## Libraries - -As a language, Luau is a full superset of Lua 5.1. As far as standard library is concerned, some functions had to be removed from the builtin libraries, and some functions had to be added. Additionally, Luau is currently only runnable from the context of the Roblox engine, which exposes a large API surface [documented on Roblox developer portal](https://developer.roblox.com/en-us/api-reference). - -## Performance - -In addition to a completely custom front end that implements parsing, linting and type checking, Luau runtime features new bytecode, interpreter and compiler that are heavily tuned for performance. Luau currently does not implement Just-In-Time compilation, but its interpreter is often competitive with LuaJIT interpreter on a wide set of benchmarks. We continue to optimize the runtime and rewrite portions of it to be even more efficient, including plans for a new garbage collector and further library optimizations, as well as an eventual JIT/AOT option. While our overall goal is to minimize the amount of time programmers spend tuning performance, some details about the performance characteristics are [provided for inquisitive minds](performance.md). +{% include feature_row id="feature_row3" %}