From d719efd918189fed0ed79e6dfa0814ca308a8495 Mon Sep 17 00:00:00 2001 From: "ajeffrey@roblox.com" Date: Mon, 1 Mar 2021 18:40:05 -0600 Subject: [PATCH] Added Luau Recap August 2020 --- .../2020-08-11-luau-recap-august-2020.md | 93 ++++++++++++++++++ .../images/luau-recap-august-2020-arrow.png | Bin 0 -> 3435 bytes .../images/luau-recap-august-2020-format.png | Bin 0 -> 4692 bytes .../images/luau-recap-august-2020-format2.png | Bin 0 -> 3716 bytes .../images/luau-recap-august-2020-meta.png | Bin 0 -> 4102 bytes 5 files changed, 93 insertions(+) create mode 100644 docs/_posts/2020-08-11-luau-recap-august-2020.md create mode 100644 docs/assets/images/luau-recap-august-2020-arrow.png create mode 100644 docs/assets/images/luau-recap-august-2020-format.png create mode 100644 docs/assets/images/luau-recap-august-2020-format2.png create mode 100644 docs/assets/images/luau-recap-august-2020-meta.png diff --git a/docs/_posts/2020-08-11-luau-recap-august-2020.md b/docs/_posts/2020-08-11-luau-recap-august-2020.md new file mode 100644 index 00000000..5d149c18 --- /dev/null +++ b/docs/_posts/2020-08-11-luau-recap-august-2020.md @@ -0,0 +1,93 @@ +--- +layout: single +title: "Luau Recap August 2020" +--- + +As everyone knows by now, Luau is our new language stack that you can read more about at [https://roblox.github.io/luau](https://roblox.github.io/luau) and the month following June is August so let’s talk about changes, big and small, that happened since June! + +Many people work on these improvements, with the team slowly growing - thanks @Apakovtac, @EthicalRobot, @fun_enthusiast, @mrow_pizza and @zeuxcg! + +[Originally posted on the [Roblox Developer Forum](https://devforum.roblox.com/t/luau-recap-august-2020/).] + +## Type annotations are safe to use in production! + +When we started the Luau type checking beta, we’ve had a big warning sign in the post saying to not publish the type-annotated scripts to your production games which some of you did anyway. This was because we didn’t want to commit to specific syntax for types, and were afraid that changing the syntax would break your games. + +This restriction is lifted now. All scripts with type annotations that parse & execute will continue to parse & execute forever. Crucially, for this to be true you must not be using old fat arrow syntax for functions, which we warned you about for about a month now: + +![Fat arrow deprecated]({{ site.url }}{{ site.baseurl }}/assets/images/luau-recap-august-2020-arrow.png) + +… and must not be using the `__meta` property which no longer holds special meaning and we now warn you about that: + +![meta deprecated]({{ site.url }}{{ site.baseurl }}/assets/images/luau-recap-august-2020-meta.png) + +Part of the syntax finalization also involved changing the precedence on some type annotations and adding support for parentheses; notably, you can now mix unions and intersections if you know what that means (`(A & B) | C` is valid type syntax). Some complex type annotations changed their structure because of this - previously `(number) -> string & (string) -> string` was a correct way to declare an intersection of two function types, but now to keep it parsing the same way you need to put each function type in parentheses: `((number) -> string) & ((string) -> string)`. + +Type checking is not out of beta yet - we still have some work to do on the type checker itself. The items on our list before going out of beta right now include: + + * Better type checking for unary/binary operators + * Improving error messages to make type errors more clear + * Fixing a few remaining crashes for complex scripts + * Fixing conflation of warnings/errors between different scripts with the same path in the tree + * Improving type checking of globals in nonstrict mode (strict mode will continue to frown upon globals) + +Of course this doesn’t mark the end of work on the feature - after type checking goes out of beta we plan to continue working on both syntax and semantics, but that list currently represents the work we believe we have left to do in the first phase - please let us know if there are other significant issues you are seeing with beta beyond future feature requests! + +## Format string analysis + +A few standard functions in Luau are using format strings to dictate the behavior of the code. There’s `string.format` for building strings, `string.gmatch` for pattern matching, `string.gsub`'s replacement string, `string.pack` binary format specification and `os.date` date formatting. + +In all of these cases, it’s important to get the format strings right - typos in the format string can result in unpredictable behavior at runtime including errors. To help with that, we now have a new lint rule that parses the format strings and validates them according to the expected format. + +![String format]({{ site.url }}{{ site.baseurl }}/assets/images/luau-recap-august-2020-format.png) + +Right now this support is limited to direct library calls (`string.format("%.2f", ...)` and literal strings used in these calls - we may lift some of these limitations later to include e.g. support for constant locals. + +Additionally, if you have type checking beta enabled, string.format will now validate the argument types according to the format string to help you get your `%d`s and `%s`es right. + +![String format]({{ site.url }}{{ site.baseurl }}/assets/images/luau-recap-august-2020-format2.png) + +## Improvements to string. library + +We’ve upgraded the Luau string library to follow Lua 5.3 implementation; specifically: + + * `string.pack/string.packsize/string.unpack` are available for your byte packing needs + * `string.gmatch` and other pattern matching functions now support `%g` and `\0` in patterns + +This change also [inadvertently] makes `string.gsub` validation rules for replacement string stricter - previously `%` followed by a non-digit character was silently accepted in a replacement string, but now it generates an error. This accidentally broke our own localization script [Purchase Prompt broken in some games (% character in title)](https://devforum.roblox.com/t/purchase-prompt-broken-in-some-games-character-in-title/686237)), but we got no other reports, and this in retrospect is a good change as it makes future extensions to string replacement safe… It was impossible for us to roll the change back and due to a long release window because of an internal company holiday we decided to keep the change as is, although we’ll try to be more careful in the future. + +On a happier note, string.pack may seem daunting but is pretty easy to use to pack binary data to reduce your network traffic (note that binary strings aren’t safe to use in DataStores currently); I’ve posted an example in the release notes thread [Release Notes for 441](https://devforum.roblox.com/t/release-notes-for-441/686773) that allows you to pack a simple character state in 16 bytes like this: +``` +local characterStateFormat = "fffbbbB" + +local characterState = string.pack(characterStateFormat, + posx, posy, posz, dirx * 127, diry * 127, dirz * 127, health) +``` +And unpack it like this after network transmission: +``` +local posx, posy, posz, dirx, diry, dirz, health = + string.unpack(characterStateFormat, characterState) +dirx /= 127 +diry /= 127 +dirz /= 127 +``` + +## Assorted fixes + +As usual we fixed a few small problems discovered through testing. We now have an automated process that generates random Luau code in semi-intelligent ways to try to break different parts of our system, and a few fixes this time are a direct result of that. + + * Fix line debug information for multi-line function calls to make sure errors for code like `foo.Bar(...)` are generated in the appropriate location when foo is nil + * Fix debug information for constant upvalues; this fixes some bugs with watching local variables from the nested functions during debugging + * Fix an off-by-one range check in string.find for init argument that could result in reading uninitialized memory + * Fix type confusion for table.move target table argument that could result in reading or writing arbitrary memory + * Fix type confusion for `debug.getinfo` in some circumstances (we don’t currently expose getinfo but have plans to do so in the future) + * Improve out of memory behavior for large string allocations in string.rep and some other functions like `table.concat` to handle these conditions more gracefully + * Fix a regression with `os.time` from last update, where it erroneously reverted to Lua 5.x behavior of treating the time as a local time. Luau version (intentionally) deviates from this by treating the input table as UTC, which matches `os.time()` behavior with no arguments. + +## Performance improvements + +Only two changes in this category here this time around; some larger scale performance / memory improvements are still pending implementation. + + * Constant locals are now completely eliminated in cases when debugging is not available (so on server/client), making some scripts ~1-2% faster + * Make script compilation ~5% faster by tuning the compiler analysis and code generation more carefully +Oh, also `math.round` is now a thing which didn’t fit into any category above. \ No newline at end of file diff --git a/docs/assets/images/luau-recap-august-2020-arrow.png b/docs/assets/images/luau-recap-august-2020-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..282bc5a0ff2aabe7e3dd60cb2b51039af333f224 GIT binary patch literal 3435 zcmY*c3p7+~8{QqMkmy2Dh>Ft`={9M1TtcqJU|fr$Y$ch>K~hagOoXi(j=L!`X2zW@ zRL(R>r!cM~Cbxtb*O6)YS=zVBY^d7pRhZ-49E4+%ErveL@Z0078Z zTA11cz;8s%c32~U&Hi65MPY%LgpAdylZUcA0T#uRg@G$%357)zd}(PZ z0s#mFA`lsYs0a)qFoeKNv1$x_Y_JhNil71nMXO-23Z_<7)v~Don+mdde6|4Pa5%NK zwVytHs;leZQt(`gCzpcNVTcdIe3;6InS2Bi7l&X5CV?%kl8^AkKrtf1Nr(9q2H@3R6n zDB!^Y!Je0gF*G&zY*O-%_|o}0E#Kaa$>}2nHoC>0HpmbO^*|AbdIGxByaOp zs*TjsT%#ZM$yfiQm0nmU(NdC%*Szw(lbxBs(fIu9Oo~8K^@h=?<_slYa8H}UD+%)| z&o5HQIxu6}Xza3P81KK~i(faHGZfMt+4HXXPk8jpNN7cx; zd`=Js5Yrkp1Gn(MmSmL+(vEfQGI2~KjC~o_u{J(@YasuJZTIP{n4IqHDO?A<`O)YD zsWaXhW~cK*Z8_SfH&o>DV1(fU(!1=uXdQ7aJ(1xhyYN9z`BLa#&$=_NJD1(>xB7;kP%vR$iOVs57NuK5 zXmgn7IOv_8|JhVIQ=Lhlo9=6O2V$9|`KY-pxwO#F{kc~7O_YGM(WP1@o1`|bq@G#G z#0}kjiSk)Y|U5{R?3X)$7y(~9pB|_K({)yDSQWiG0ip8%eGA84~2-o6K{Jf z(mzfTlki)^y6(%1VlxPYE3r{ohD+CM$~3Msw0LR}=jINsAsa4dhmAzJ4~H)I6{Mz0 zhp8FZZwWJXH<`hmcl_;1UK_q=IWMcqaLt{0i$3|CBg%}#twTRNiv!2|q{l_l5BlQN z?&NJR@z}7R>Mg6Z`ft6 zLUawG=wGj1mJxaY}-SYCq~;VQ|() zuW0c@mibz4b8VB1&|LE6=Y{>8 z!q@wy^CecE$-cO|ob*V>y}_;y$Wzp)uGMwhIIjHT_S=6Z7^10l%{dR|hla?#!H)H_ ze<4Gswa>lFF1*C(Kk#HR<%?OmlzZo$FL gzx^nqA6%B`7_iE5JQ~uXpc`W=u-o( zuTmx{=0c&BoAX8cA06#pl~N^9@Utk@L?zsG0gNE@|1?cMn1FT$zWO09s(BYx4ta~xNz zG?MMt&W)nks)0c@QP@$1-!%BPzk``{YJJo>vI%?IfPJDNS@cT86q+lqzIN z-nY{HdeznT%E9(KU49~+Z~a%%b(RX6Bk;o4STmRN$4{Qp^!&M}|7p3y(VQmLldUG+ zS|hv0MU!vT_cp$^2=$osDp|NcIH1BM$1e;j2GrLdusd6_ep>%gkc(;o(9%i5d%US% zd$~&2u6k|fwT~qU?Hq2B>h4zJ?mMl8el*J$IfKrqaCj6Zi67WiHA^ zJIZ2aMAX0A8v6wP^%x}je2wA^Z80oL?L_ph~ku;SR_SGZz zp*`-RSF9P=iDfSlMJ6dd~N`L}<)=6DREDir>XQ34m9wlUV+qlwCYJ z-JjBM-Ggv^qAb!%w&(zTsWv-PUvFjQt0kjP>}t_+Q!VOlo{sC#DPBL{bJNTE);4Z< zRqASDz{~H;(;;~lwhtmRefIN|+eqxd$A_FMPm}6vdg$7{%iU=maX~fp%PJq* z(`($%=lYMhurme>vy9J?`5fbA%5=cY2dSWg@e%oOYPCH*Y0ov)PjtVi1U>KA)Q08` z3&%`qoN4AuhQMh)nq)O=KPq(^sDgi&i+=$Wg%6x6!~cmJ4(*c0LOc zkKdfxnX1Ofh4SBp>>XH@%(LHC`_HSw{lU*ulP4MFp(7(!g^|8`RcT)v`qc%8IiwvdOc7neU~Y;IiwhY;~>Wd~aQT zOF9&StKe_myPCug-l^}lkGyb{qLT=Z#3>pN$dD^^CQU4*zl=M+2pT99Z$*=sEW+jgiFfk2l(;2eiQEPu}84IsIXQA?HD)y(X{%Lc< z!_WL6O5NpPEon~1yYm4=mEOooR@RVFC=EB5OAp%{wc6mDUr?s>@WF)FHwsjq5Qbw6 z=zqH3mU58g`s328`w~E#u?_H`n^w1xB(;BEryzT(?MKJvQ6o3?JXs@Z zoRVz&sz*9fZ8POP&SweUI;$d=NBoaD!*uJ3t(Qw``(`KWJgyxIKb>A8!^t?3bKOSO z@o$IqT(YCt;~~Gp0lQT7Dpn-cMtWR~3*JEVea?DDvkwg1Rhaba?P!G5mo0ShpBvCG z#MzuEU%wf5cuRao z)$^hJr|Q(?x7%jde+Vr=E`rt-c8*P}U3h_e>|Wd|lc4J8lN9D zmajw`tANGOA>8xhJ@w1PU42ma^tpz^Xo^5Rfmn^ucuR?oN%1aUoXS;3- zhlMmo$4?rr@k8zt^YQAqvhcuf-*V$y0ta%<%+qZ$ytKWuGnAC__R(!JR8?*#ls!ER z-nSxY CwC}3` literal 0 HcmV?d00001 diff --git a/docs/assets/images/luau-recap-august-2020-format.png b/docs/assets/images/luau-recap-august-2020-format.png new file mode 100644 index 0000000000000000000000000000000000000000..d180b442af1ee6cc992a2fe28abe5ccafba8797a GIT binary patch literal 4692 zcmZu!c{r5a`yVRR>y@G`6)I^#Lv|wRO_C5YV=!5=W>;evL#kJ@$5=u}S!2eKVVGf% zLX0iUjL6=Q8T-C8{2qSS@A`fJ_+Hm@J?EVJInO!wx$paY?#~^0-^4)Ruakd)Kp+9b zJGab1pnVsCzQZA2;Qh}zLm?1I=#=3ty$6B)GnqO*;~FQ!R-#D{K5TDC6qr4!q6U0| zu4@&XJj4^z=uqU*eTjABMrrb=#?z(GEv93h-?)*^L+~RWF1>u@nzDhp-Ff|PfB9$U zgCuL}1KrZj$-vNyiDuamP*bzx!w)ZId%Uv)fx?8(jvcj!1KWoo9N<=>K!*_y^!`Io z??EEa)W2uYTs`2<2^SL18AdDBxToAQgzyb@s`Z8;ctD_2UZFa2jpkd#;JeJ& zn#zP?+?||qp~AAG-R03o4qxWi{GoedR0z)x0*xH7f=b_3cYRcl&&xnO5ovZEu!72* z8%?}gY?NQpo$cyqi1}l_)1m}B6LVMA+RP^*za5h79=Z0o+wpavjxo6u4Cp)Q1ovCo zoLDsenOoPt7W4Ei_4)cvhPp8<#{$lRgu`DIqlO7y#NGLlq;v;-lI)e%ZtQJ&=Y;aY z3*mXN)Jqn`$UGG6$T!4P*@_dZfdU-bWSBw`Zwly`nkL z)n}}Vb{ihG)1nQ{F)_=f^~b_Yx2#QbVJ8B%{OKfE4HkU}yLc_8H9d5Qh)CG`*^IIB zC0=*E7-x2NBmSN(ObH=faM&4qHzVpPqlXAK2+v0dJTwWYvQ4#pZ@Dw%pacEbsVFjb zB@2P*iTdIy24fxof#$pM9G~GGx`&Z^YQ@gCG9s$16kPahwDh5`f_`Cp)SwC`GF>00 z9K-#q*j>Mx^u~Y1ZmyA%PS)qP9Lpo6U$=)FR#;qoWO5vyguTx1Lq6_^?7UqZ( z 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 BU047B literal 0 HcmV?d00001 diff --git a/docs/assets/images/luau-recap-august-2020-meta.png b/docs/assets/images/luau-recap-august-2020-meta.png new file mode 100644 index 0000000000000000000000000000000000000000..c7396f92fc646185bda68f1c5dffb7a171f9c61d GIT binary patch literal 4102 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 literal 0 HcmV?d00001