Previously, I was the first frontend engineer on Google Calendar, and was a security engineer who worked on the industrial-strength Mad Libs undergirding Gmail.
E.g. high risk: generating a database query from an untrusted input which can lead to SQL injection.
Low risk: pure math, like compute compound interest.
arxiv.org/pdf/2108.09293
E.g. high risk: generating a database query from an untrusted input which can lead to SQL injection.
Low risk: pure math, like compute compound interest.
arxiv.org/pdf/2108.09293
I can't vouch for the below but it matches my recollections.
I can't vouch for the below but it matches my recollections.
So if you have ideas on what would make the language really great for standards work, the sooner we know the more accomadating we can be.
And if you have ideas about how to spec something standards-related, we can help with advice and/or implementation work.
So if you have ideas on what would make the language really great for standards work, the sooner we know the more accomadating we can be.
And if you have ideas about how to spec something standards-related, we can help with advice and/or implementation work.
We're in the early adopter stage.
We've got the language functional. It's usable today, but we are reworking some significant parts.
Lots of work still to do.
We're in the early adopter stage.
We've got the language functional. It's usable today, but we are reworking some significant parts.
Lots of work still to do.
We've been slow rolling backends to get the foundation right, but have been trying to get a spread.
We've done initial investigation on a whole lot more.
We've been slow rolling backends to get the foundation right, but have been trying to get a spread.
We've done initial investigation on a whole lot more.
Two understanding the problem space.
Four on the compiler frontend & backends.
There're a lot of competing requirements. It wasn't obvious 6y ago that there are non-interfering solutions.
But we've got a nice, useful language.
It's getting to be fun to work in.
Two understanding the problem space.
Four on the compiler frontend & backends.
There're a lot of competing requirements. It wasn't obvious 6y ago that there are non-interfering solutions.
But we've got a nice, useful language.
It's getting to be fun to work in.
But adding an overload to a language is only backwards compatible if it doesn't introduce ambiguity, which languages have very different rules about.
But adding an overload to a language is only backwards compatible if it doesn't introduce ambiguity, which languages have very different rules about.
That works for typed languages.
For dynamic languages you do things differently.
Temper needs to allow for specifying groups of related operators while still translating to both language groups.
That works for typed languages.
For dynamic languages you do things differently.
Temper needs to allow for specifying groups of related operators while still translating to both language groups.
Temper has lots of restrictions on casts.
But we provide a workaround. Sealed SUM (slide is wrong) types are castable.
If you really need to cast something up and later back down, sealed wrappers given you the tools you need
Temper has lots of restrictions on casts.
But we provide a workaround. Sealed SUM (slide is wrong) types are castable.
If you really need to cast something up and later back down, sealed wrappers given you the tools you need
Casting lets devs work around that.
Only up-casts can be proven safe by compilers.
Erasure: not all runtimes have enough info to prove casts safe at the time the value is known.
Casting lets devs work around that.
Only up-casts can be proven safe by compilers.
Erasure: not all runtimes have enough info to prove casts safe at the time the value is known.
What does it mean to get the i-th "character"? What even is a character?
That table shows two main groups: some byte-based, some UTF-16. But there're outliers.
Temper is like Swift: code-point based by construction which lets us be consistent & efficient.
What does it mean to get the i-th "character"? What even is a character?
That table shows two main groups: some byte-based, some UTF-16. But there're outliers.
Temper is like Swift: code-point based by construction which lets us be consistent & efficient.
Coroutines & promises.
but can extend to actor model allowing mediated shared memory.
Need to be careful about global mutable state.
Can allow threadsafe cache types and atomics at the top level.
Extra type declaration checks for sharable values.
Coroutines & promises.
but can extend to actor model allowing mediated shared memory.
Need to be careful about global mutable state.
Can allow threadsafe cache types and atomics at the top level.
Extra type declaration checks for sharable values.
Start sub-tasks before others finish.
It's important in an SDK, a library that fetches URLs from a service.
Can't predict response arrival order.
But there's a lot of difference across PLs.
And mistakes can lead to memory corruption.
Start sub-tasks before others finish.
It's important in an SDK, a library that fetches URLs from a service.
Can't predict response arrival order.
But there's a lot of difference across PLs.
And mistakes can lead to memory corruption.
Now the .tail loop has < instead of <=, and is red.
If the < edges don't form a cycle, there's an order in which ref-counted records destruct.
But if a node has to be less-than itself, contradiction, there's no deallocation order.
Now the .tail loop has < instead of <=, and is red.
If the < edges don't form a cycle, there's an order in which ref-counted records destruct.
But if a node has to be less-than itself, contradiction, there's no deallocation order.
We generate a graph from it that shows what can point to what.
A cons list can point to another via its tail.
And it could have a head that is a different list type
bit the type definition says that an F cannot point back to Cons<F>.
We generate a graph from it that shows what can point to what.
A cons list can point to another via its tail.
And it could have a head that is a different list type
bit the type definition says that an F cannot point back to Cons<F>.
If you're writing generic collection libraries, it will kind of suck.
Goal: ref-counting is safe.
If you're writing generic collection libraries, it will kind of suck.
Goal: ref-counting is safe.
But our target audience is everyday devs, not only people who habitually think about ownership.
So we bit a bullet: you can provide cyclic looking APIs, but without actual cycles.
But our target audience is everyday devs, not only people who habitually think about ownership.
So we bit a bullet: you can provide cyclic looking APIs, but without actual cycles.
Dynlangs like Perl, PHP and JS don't.
It's complicated when these operations appear inside type-polymorphic functions.
We've put a lot of design work into a way to get semantic consistency here.
Dynlangs like Perl, PHP and JS don't.
It's complicated when these operations appear inside type-polymorphic functions.
We've put a lot of design work into a way to get semantic consistency here.
Here, comparison is different for numbers and strings.
And the trend in modern languages if for it to distribute through collections.
Here, comparison is different for numbers and strings.
And the trend in modern languages if for it to distribute through collections.
Exceptions & result checks are the main approaches.
We need to be idiomatic here; surprises lead to failures & hard debugging.
Strangely, results translate well if results aren't inputs or stored in temporaries.
Exceptions & result checks are the main approaches.
We need to be idiomatic here; surprises lead to failures & hard debugging.
Strangely, results translate well if results aren't inputs or stored in temporaries.
There're two main approaches: null values & option types.
But as the slide shows, they aren't equivalent.
Temper uses checked null syntax, but translates to either.
Extra compiler checks ensure consistent semantics.
There're two main approaches: null values & option types.
But as the slide shows, they aren't equivalent.
Temper uses checked null syntax, but translates to either.
Extra compiler checks ensure consistent semantics.
A type like X is declared in some source file, A.
Other files, B and C, can depend on it.
And if yet another depends on B and C, it can use an X value from one with the other.
A type like X is declared in some source file, A.
Other files, B and C, can depend on it.
And if yet another depends on B and C, it can use an X value from one with the other.