If optional types in JS were implemented like they are in Flow, the types would 
be stripped before runtime. There are only there for pre-runtime type checking. 
So nothing related to optimization would change and there would be no runtime 
type checking.

---
R. Mark Volkmann
Object Computing, Inc.

> On Jan 13, 2018, at 5:27 PM, Ranando King <[email protected]> wrote:
> 
> Just throwing in my 2 cents.
> 
> I would argue that this represents such a fundamental change to how the 
> language works, that it would actually represent a new language, even though 
> they're optional. One problem is in how this would be implemented. Making 
> types optional introduces a lot of overhead in type checking. Such checks 
> would have to occur at runtime since ES is a language capable of 
> self-modification. What's more is that the weight of all these checks 
> happening at runtime would cause a serious performance penalty to run speed.
> 
> On the flip side, ```class``` already provides some of what you want to do. 
> The proposal for private fields brings class even closer. If decorators are 
> allowed to be applied to both non-objects and function parameters, then 
> decorators could be used to close the gap. All that would be needed is to 
> define a decorator for each desired type. The decorators would take care of 
> the type checks while performing the documentation purposes you're saying 
> would be one of the biggest features.
> 
> Having used many typed languages before, I cannot deny the usefulness of 
> types. However, where Javascript is concerned, mixing typed and untyped 
> variables leads to complexities that could be flatly impossible to optimize. 
> Have you considered what would happen if someone does something like this:
> 
> ```javascript
> function doSomething(param: int32) {
>    //Do something here
> }
> 
> var a = 32;
> doSomething(a);
> a = "foo";
> doSomething(a);
> ```
> The engine would not be able to optimize this... ever. Every call would 
> involve a type check before the call is made since the type of the parameter 
> cannot be guaranteed to be converted to an int32. The engine would either 
> need to disallow such a call from an untyped value, or type check every time.
> 
> If you can imagine implementing types as syntactic sugar over what can 
> already be done in ES6 (maybe with the inclusion of ES7 or proposed features) 
> you might find a bit less push-back.
> 
> 
>> On Sat, Jan 13, 2018 at 3:43 PM, <[email protected]> wrote:
>> Send es-discuss mailing list submissions to
>>         [email protected]
>> 
>> To subscribe or unsubscribe via the World Wide Web, visit
>>         https://mail.mozilla.org/listinfo/es-discuss
>> or, via email, send a message with subject or body 'help' to
>>         [email protected]
>> 
>> You can reach the person managing the list at
>>         [email protected]
>> 
>> When replying, please edit your Subject line so it is more specific
>> than "Re: Contents of es-discuss digest..."
>> 
>> Today's Topics:
>> 
>>    1. Re: Proposal: Optional Static Typing (Part 3) (Mark Volkmann)
>> 
>> 
>> ---------- Forwarded message ----------
>> From: Mark Volkmann <[email protected]>
>> To: kai zhu <[email protected]>
>> Cc: Brandon Andrews <[email protected]>, es-discuss 
>> <[email protected]>
>> Bcc: 
>> Date: Sat, 13 Jan 2018 15:43:52 -0600
>> Subject: Re: Proposal: Optional Static Typing (Part 3)
>> Not sure if this is the place to debate whether optional type support in 
>> JavaScript would be a good thing, but I'll throw in my perspective. I used 
>> to be anti-types. Then I decided to give Flow a try. Initially it felt like 
>> I was spending a lot of time just learning the syntax and trying to make 
>> Flow happy. But after a few weeks I caught on and noticed that every time 
>> Flow complained it was actually correct. Then I needed to so some 
>> refactoring. That's where the big benefit is for me. I no longer have to 
>> manually determine what would break if I want to do things like change a 
>> function name, change a property name in an object, and much more. I just 
>> make the change and Flow tells me where I need to make adjustments. So 
>> whether JavaScript adds types, I don't think I'll go back to not having 
>> them. I'd much rather use Flow or TypeScript than not have types at all.
>> 
>> On Sat, Jan 13, 2018 at 2:45 PM, kai zhu <[email protected]> wrote:
>>>> I really don't understand the irrational aversion to OST or classes in ES. 
>>>> If you don't want to use them, well don't use them. These features makes 
>>>> sense for a lot of programmers and IMO EcmaScript should not be a bastion 
>>>> of resistance against other languages, specially when it's the only 
>>>> language for building front end applications.
>>> 
>>> 
>>> then we agree to disagree. perspective-wise, type-related bugs are among 
>>> the most easy to debug-and-fix things in javascript (or any serious 
>>> programming language really). OST brings little to the productivity-table 
>>> in offering to help solve a relatively trivial problem on the javascript 
>>> bug-spectrum, while distracting us from bigger-picture show-stoppers. like 
>>> say, integration-level bugs dealing with async-io and timeouts, that can 
>>> invalidate design-decisions / performance-tradeoffs made at the 
>>> application-level and require major code rewrites.
>>> 
>>> for example, did you find out during integration / qa, that mongodb’s 
>>> scalability claim (using its old mmapv1 storage-engine) is a lie, and even 
>>> with indexing, its real-world query-performance for your use-case drops 
>>> dramatically when the db grows past 10gb (to maybe 30-60 seconds / query 
>>> which is similar to mysql at such scale)? great, now you have to retool the 
>>> application with a new caching-scheme (or maybe a *shudder* message-queue) 
>>> to compensate, and perhaps search-and-replace the timeout value everywhere 
>>> a request to mongodb is made in your code.  these are the kinds of bugs 
>>> that keep javascript-developers awake at night, not some kiddie 
>>> string-instead-of-number type-error.
>>> 
>>>>> On Jan 14, 2018, at 12:48 AM, Pier Bover <[email protected]> wrote:
>>>>> 
>>>>> I strongly disagree with kai zhu.
>>>>> 
>>>> 
>>>>> where is this demand coming from? newcomers from c# / java
>>>>> who don't know anything about how javascript is used to ship
>>>>> end-user-features and web-products?
>>>> 
>>>> The idea that optional static typings (OST from now on) are some 
>>>> "contamination" from other languages is naive. Programmers are not asking 
>>>> for OST because they lack perspective, quite the contrary, it's simple 
>>>> common sense. Types make code more obvious and deliberate. The importance 
>>>> of obviousness in code cannot be overstated.
>>>> 
>>>> I'm not a guy coming from C# or Java. In my 20+ years of professional web 
>>>> dev I've spent 80% of my time writing ES languages. I wrote with ES4 
>>>> extensively (AS3) and I experienced OST myself for years. In fact AS3 was 
>>>> 11 years ago a better language than JS is today and one of the biggest 
>>>> reasons for that were OST.
>>>> 
>>>>> static-typing, like classes, makes frontend developers' lives harder;
>>>>> it introduce non-essential, rigid structures, making it difficult to
>>>>> cut the necessary corners (and the inevitable ugly-hacks needed)
>>>>> during integration to ship a web-product.
>>>> 
>>>> It seems you are missing the word "optional". Current optional ES classes 
>>>> are nothing more than syntactic sugar over prototypal inheritance, and 
>>>> since these classes were introduced no flexibility has been lost. With the 
>>>> introduction of OST no flexibility would be lost either and we could 
>>>> happily ship quick and dirty solutions if we needed/wanted to.
>>>> 
>>>>> maybe its different @ the large companies / orgs tc39 represents who
>>>>> can hire better-than-average programmers that can magically ship
>>>>> products with correct javascript code right-off-the-bat. but not so
>>>>> for most of the web-industry that can only afford mediocre
>>>>> javascript-programmers whose code-designs and architectures rarely
>>>>> survive integration / productization intact.
>>>> 
>>>> You are again ignoring the optional factor. With OST JavaScript could 
>>>> still be used by mediocre programmers, but maybe they could start 
>>>> architecturing their code better and survive integration. That was exactly 
>>>> my experience when I started to write AS3 back in 2007. It made me a 
>>>> better programmer and it was my stepping to stone to C#, C++, Go, Swift, 
>>>> etc.
>>>> 
>>>> I really don't understand the irrational aversion to OST or classes in ES. 
>>>> If you don't want to use them, well don't use them. These features makes 
>>>> sense for a lot of programmers and IMO EcmaScript should not be a bastion 
>>>> of resistance against other languages, specially when it's the only 
>>>> language for building front end applications.
>>>> 
>>>>> On Sat, Jan 13, 2018 at 1:59 AM, kai zhu <[email protected]> wrote:
>>>>> rant warning
>>>>> 
>>>>> > The demand for types as a different approach to code has been so strong 
>>>>> > in the past few years that separate languages have been created to deal 
>>>>> > with the perceived shortcomings.
>>>>> 
>>>>> where is this demand coming from? newcomers from c# / java
>>>>> who don't know anything about how javascript is used to ship
>>>>> end-user-features and web-products? or those who do and accept the
>>>>> reality that there's always lots of ugly corner-cutting involved with
>>>>> javascript to push a product out the door?
>>>>> 
>>>>> static-typing, like classes, makes frontend developers' lives harder;
>>>>> it introduce non-essential, rigid structures, making it difficult to
>>>>> cut the necessary corners (and the inevitable ugly-hacks needed)
>>>>> during integration to ship a web-product.
>>>>> its usually easier for javascript-programmers to ship products if the
>>>>> code and async-logic they have to rewrite during integration and qa
>>>>> were mostly throwaway static-functions (with the assumption they WILL
>>>>> be rewritten during integration). versus classes with static-typing
>>>>> (that are more difficult to rewrite at the late-stage in
>>>>> web-development when it matters the most and have a higher tech-debt
>>>>> penalty).
>>>>> 
>>>>> maybe its different @ the large companies / orgs tc39 represents who
>>>>> can hire better-than-average programmers that can magically ship
>>>>> products with correct javascript code right-off-the-bat. but not so
>>>>> for most of the web-industry that can only afford mediocre
>>>>> javascript-programmers whose code-designs and architectures rarely
>>>>> survive integration / productization intact.
>>>>> 
>>>>> On Jan 12, 2018 12:19, "Brandon Andrews" <[email protected]> 
>>>>> wrote:
>>>>> >
>>>>> > > I'm still yet to read the entire proposal, but with a quick skim, it 
>>>>> > > seems to me like this is essentially what Typescript or Flow offers 
>>>>> > > you: i.e. an opt-in type system?
>>>>> >
>>>>> > This is in the core of ECMAScript, so the types would be real. The 
>>>>> > implementers would be encouraged to use native hardware types. But yes, 
>>>>> > outside of that it is an opt-in type system. Language built on top of 
>>>>> > it would then benefit from this. I often wonder if languages built on 
>>>>> > top of ES6 haven't limited themselves because types don't exist. That 
>>>>> > is they'd do more, but didn't because the complexity of transpiling. 
>>>>> > Stuff like this: https://github.com/Microsoft/TypeScript/issues/4639 
>>>>> > Imagine if ECMAScript already had all those types and support function 
>>>>> > overloading. TypeScript could move on and implement more experimental 
>>>>> > ideas.
>>>>> >
>>>>> > > I'm wondering if you have any good reasons to want there to be a 
>>>>> > > standardised static type annotation syntax within ECMAScript instead 
>>>>> > > of a "Bring Your Own Type Checker" system. If you do have some 
>>>>> > > thoughts on this, you might also want to include that as a preface on 
>>>>> > > your Github's README.You have a "Rationale" bit that seems to ignore 
>>>>> > > the existence of these existing systems.
>>>>> >
>>>>> > Did you read the rationale? It specifically says:
>>>>> >
>>>>> > > The demand for types as a different approach to code has been so 
>>>>> > > strong in the past few years that separate languages have been 
>>>>> > > created to deal with the perceived shortcomings.
>>>>> >
>>>>> > More of the rationale was below the types proposed. I've moved it up 
>>>>> > into the rationale since it fits better there. If there's more you 
>>>>> > think should be added I'll include it. I'm trying to keep things 
>>>>> > concise since it's a long proposal. I could go into an explanation that 
>>>>> > TypeScript and other languages are generally just a superset of 
>>>>> > Javascript and benefit from bringing their features closer to the base 
>>>>> > language and possibly the hardware? It seems too obvious to me to write 
>>>>> > something like that.
>>>>> >
>>>>> >
>>>>> >
>>>>> >
>>>>> > > From a quick read, I'm more in favor of something that's a little 
>>>>> > > more restricted to start, something like what Python has. Python has 
>>>>> > > optional static type annotations, but the Python interpreter just 
>>>>> > > ignores them. They are present purely for the purposes of tooling, 
>>>>> > > and are silently ignored at runtime.
>>>>> >
>>>>> > The goal with this proposal is to get essentially native hardware types 
>>>>> > where applicable. All the proposed types have special operator rules, 
>>>>> > value ranges (overflow behavior), and in the case of SIMD very real 
>>>>> > performance impact behind them. While documentation hints are a 
>>>>> > side-effect, I'm more focused instead for pushing ECMAScript toward 
>>>>> > being a more powerful language. Python is a classic example of where 
>>>>> > data type shortcomings lead to unintuitiveness or weird design like: 
>>>>> > https://docs.python.org/2/library/array.html I'm trying to avoid such 
>>>>> > things.
>>>>> >
>>>>> > > One of the reasons why I'd prefer a simpler approach to start is that 
>>>>> > > TypeScript and Flow, the two main implementations that add syntax, 
>>>>> > > have a *very* similar syntax, but have several nuances that would 
>>>>> > > make a heavier proposal much harder to accomplish:
>>>>> >
>>>>> > > - Flow has `?Foo` for optional types, TypeScript just uses unions.
>>>>> >
>>>>> > I have a section on unions with a small explanation on why I left it 
>>>>> > out. I kept it simple by only adding nullable types. Right now someone 
>>>>> > would overload or use 'any'.
>>>>> >
>>>>> > > - TypeScript has mapped/index types, where Flow uses special named 
>>>>> > > types.
>>>>> >
>>>>> > I didn't include these.
>>>>> >
>>>>> > > - Flow allows omitted parameter names in function types, TypeScript 
>>>>> > > only allows named parameters with implicit `any` types.
>>>>> >
>>>>> > I created an issue to be more explicit about optional and default typed 
>>>>> > parameters and the behavior.
>>>>> >
>>>>> > > - Flow has exact types, TypeScript doesn't.
>>>>> >
>>>>> > I hadn't even considered something like this. It sounds interesting for 
>>>>> > configuration options. They introduce new tokens. Something I'm very 
>>>>> > much avoiding for this initial proposal.
>>>>> >
>>>>> > > - Flow has `opaque type`, TypeScript only has `type`.
>>>>> >
>>>>> > Something to be decided later. Doesn't create breaking changes to add 
>>>>> > later.
>>>>> >
>>>>> > > - Flow constrains with `T: Super`, TypeScript uses `T extends Super`.
>>>>> >
>>>>> > There's a section on generics and why it isn't included already. I'm 
>>>>> > with you that it's far too complex to add in with initial types. 
>>>>> > There's no breaking changes introduced by adding it later. (Mostly 
>>>>> > because it introduces new tokens which would be a huge deal).
>>>>> >
>>>>> > > - Flow has existential types, TypeScript doesn't.
>>>>> >
>>>>> > I definitely haven't included this. Flow is a few steps ahead of this 
>>>>> > proposal.
>>>>> >
>>>>> > It seems like a lot of these features already aren't included in the 
>>>>> > proposal. I definitely hold your view that the proposal has to be 
>>>>> > minimal, but I think my minimal is functionally minimal. Something that 
>>>>> > when implemented allows developers to experiment and then discussion 
>>>>> > can progress from there to how more features can be added. I'm trying 
>>>>> > to be thourough though as to not harm a future proposal so if any of my 
>>>>> > decisions block something I'm open to changes.
>>>>> >
>>>>> > Most of my thoughts and focus have been on what I think of as the 
>>>>> > basics. How types interact with declarations, functions, classes, 
>>>>> > destructuring, allocation, and control structures. The future 
>>>>> > consideration sections are mostly a catalogue of ensuring that these 
>>>>> > basic initial features and designs will work as the language 
>>>>> > incorporates other proposals.
>>>>> > _______________________________________________
>>>>> > es-discuss mailing list
>>>>> > [email protected]
>>>>> > https://mail.mozilla.org/listinfo/es-discuss
>>>>> _______________________________________________
>>>>> es-discuss mailing list
>>>>> [email protected]
>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>> 
>>> 
>>> 
>>> _______________________________________________
>>> es-discuss mailing list
>>> [email protected]
>>> https://mail.mozilla.org/listinfo/es-discuss
>>> 
>> 
>> 
>> 
>> -- 
>> R. Mark Volkmann
>> Object Computing, Inc.
>> 
>> _______________________________________________
>> es-discuss mailing list
>> [email protected]
>> https://mail.mozilla.org/listinfo/es-discuss
>> 
> 
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to