IDEs will still interpret stuff incorrectly at times.*

On Mon, Mar 25, 2024 at 4:17 PM Caleb Brandt <calebbrand...@gmail.com>
wrote:

> Thank you all so much for your insight!  And I'm not being facetious here;
> you guys keep blasting away the points that don't hold water, so I think
> I've finally nailed down *why* I feel this project is so necessary.
>
> Because you're absolutely right: Groovy already *does* do much of what I
> want.  In terms of contributing new functionality to the ecosystem, my
> project isn't necessary in the slightest.  My argument is entirely borne
> out of *ignorance* to what Groovy can do.
>
> But to be honest... that's kind of the *point*.  It's absolutely
> IGNORANT, and that's absolutely *WRONG*, but even still, it *is*.
>
>
> See, I've been programming in Java for around seven years at this point.
> I'm very immersed in the Minecraft dev space, and I've worked with others
> on non-Minecraft things as well, like working on toolchains and libraries,
> contributing to a handful of personal projects, etc.  And as a member of
> those spaces, the "vibe" that I've gotten is this: "the non-Java JVM
> languages are clunky".
>
>
> See, Groovy has exactly two things going against it for reaching the most
> people: it's a *language*, and it's *compiled*.  Now that might sound odd
> to criticize, but bear with me.
>
>
>  1. As another language, it is *inherently* intimidating to people who
> aren't familiar with it.
>
> People are closed-minded, and like to stick to what they know. I know when
> I see "Foo.groovy" on Github, I immediately go "oh god", though it
> *absolutely* isn't warranted!  Fact is, people who use Java and know
> their way around it like the back of their hand don't want to go relearn
> how to speak in code just to do the same thing a tiny bit easier.
>
> Their instinct is to go:
>
>> "I've never used Groovy, and I never intend to, because I'm fine with
>> Java.  I can do everything I need to with Java.  Why do people have to be
>> weird and use something that isn't Java when writing a Java program?  I
>> don't want to have to learn a new language just to sift through this."
>>
>
> It doesn't really matter if it's identical to Java in most places, the
> very *name* not being "Java" is enough to spook people who aren't
> familiar with it.  Sure, once you get to know it, you realize there was
> never any reason to be intimidated, but that's a leap too far for most
> people when they could just... *not* use it, without any consequence.
>
> Even as someone who tries to be more open-minded than most people, I
> *still* find myself having that instinct.  Even though I know my fear of
> Groovy was unwarranted, it doesn't change the fact that it *took this
> conversation* to change my mind about it.  Very few people are going to
> have this conversation; most are just going to say "oh, that's neat, I
> guess" and leave it.
>
>
> And also:
>
> 2. As a compiled language, any analysis tools need to be specifically
> written *for Groovy*, and they just can't match the ones for Java.
>
> And that's no fault of Groovy's!  See, even if we got the* brightest
> minds* in the world together to make a static analyzer, debugger, and
> suite of tools for Groovy, Java still has *twenty years* on us.  It's
> just a fact: without massive resources, we can't match the tools made for
> Java.  Debuggers will fail inside Closures, static analyzers will infer the
> wrong types and throw false errors, and IDEs
>
> Even if we could theoretically do all of that *better than Java*, we'll
> inevitably still be working in a *Java-based* ecosystem.  Any tools made
> are implemented in a Java IDE: analyzers are slower, intellisense loses
> track of where things are defined, postfix completions have to be
> redefined, templates stop working; *every single thing* has to be
> retooled for Groovy.  And that includes community-made plugins too!
>
> It's unfortunate, but it's a fact: any non-Java JVM language will - by
> virtue of not being Java - be slightly more clunky than Java in a
> Java-based ecosystem.
>
>
>
> But they're still worth it, right?
>
> Of course they are!  But that doesn't matter if no one *uses them*.
>
> See, you can *tell* when it fails where Java wouldn't.  You notice when
> it takes slightly longer for errors to pop up, when types get inferred
> incorrectly, when intellisense can't find your class and you have to
> manually go and search for the reference to import.  It's *annoying* to
> have to take over for something that worked seamlessly before.
>
> Again, it's no fault of the *language*, it's just the fact that our tools
> are *inevitably* going to be slightly less refined than ones made by a
> company doing it for profit.
>
> But when you're *already* feeling the malaise from being immersed in a
> somewhat-new language and you notice that the things you've taken for
> granted are suddenly *failing*, what impression do you get about the
> language?  In my experience: that it's a novelty, one that's slightly worse
> in your experience than the one you're used to.
>
>
>
>
> *That's* what I'm trying to solve here.  It's not a matter of *features*,
> it's a matter of *accessibility* and making sure people *don't feel
> disinclined* to continue past their first glance at it.
>
> So how do you do that?  How do you get people to take that leap - to
> continue past that cliff that stops people from continuing past their first
> impression?
>
>
> It's simple: don't let there be any leap at all.
>
> 1. Forget the "language" part.  Show your features for what they are: *tiny
> addons* for the language they already know.
>
> There are a few parts to making it as approachable as possible:
>
> *1. The NAME:*
>
> There's a reason I didn't call it "Latte", "Javaccino", or "Mocha" instead
> of "Java Plus".  To be honest, even *THAT* might be too much; *everything
> about it* needs to emphasize that it is *NOT* a new language.
>
> I'd describe it as "A *few* *tiny* (eensy-weensy teeny-weeny) snippets to
> save you time writing things you constantly use", and specifically
> accentuate the *small* part.  It needs to *feel* like something you can
> just "click on" without any commitment on your part.
>
>
> *2. DROP-IN INSTALLATION:*
> People need to be able to plug it into their preexisting project without
> *any* action on their part besides pasting in the plugin.  *Not even any
> file extension changes.*  If it *looks* like it isn't Java from far away,
> people will *feel* like it isn't Java.
>
> We can do this fairly easily: take all of the Java files, scan them for
> our constructs, generate new source files with their transpiled
> counterparts, and give the new files to javac.  We actually do a very
> similar thing in MinecraftForge already: source files are copied to the
> `out` directory, where tokens are replaced and deobfuscated method calls
> are mapped to their obfuscated counterparts before the new sources are
> passed on to the `compile` task.
>
> The only problem with this approach is that you end up having two
> identical sets of source files: one in the src directory, and one in the
> out directory.  However, this actually turns from a bug into a *feature*
> because of the third step:
>
>
>
> *3. DROP-OUT REMOVAL:*
> It's Java allllll the way down.  If you want to stop using it, awesome!
> Everything gets converted to plain ol' Java, so every single one of the
> vanilla Java files are RIGHT THERE for you to use outside of this project.
> This is also why TypeScript is so approachable: you can add or remove it at
> any time without any impact to your project.  There's *no commitment* to
> using the plugin in everything; you're still a Java developer like everyone
> else, you just have some new things in your toolbelt that Oracle didn't add.
>
> Speaking of:
>
>
> *4. IT'S JUST "MORE" JAVA:*
> Everything that's added needs to "feel like Java".  Again, it's a
> psychological thing: people will feel some malaise if they're using
> something that doesn't look like something they're used to, so it all has
> to be an *intuitive analogue* to something that already exists in Java.
>
> We all know what a getter and a setter is, so condensing them into one
> place is easy to understand.  But what's a "closure"? What's a "delegate"?
> What's a "virtual thread"??? (I'm kidding.)  People don't have a basis for
> these things in Java, so it's just *more* stuff to learn instead of
> already making sense to a Java-only programmer.
>
> I actually removed the idea of the `pojo` keyword from this proposal for
> this very reason: while it's clever shorthand for something that people do
> a lot, it *hides too much* from the writer.  Where are the getters? Where
> are the setters? Do we access them by field or by method? How do we do
> internal member referencing?  Can we extend classes?   It's just too much
> hidden behind a single keyword, so it's not a good fit for this project,
> instead being partially covered by the declaration get/setters.  Every
> addition needs to scan like Java at face value and feel like something
> Oracle themselves would have added.
>
>
> And on the backend:
>
> 2. Instead of COMPILING, we transpile it to Java source code
>
> Unlike with JVM bytecode, this one would transpile to Java 8 *source code*,
> letting a few things happen that *completely* change the game:
>
>
> *1. WE CAN USE JAVA'S TOOLS*
> Yeah so remember what I said about how "nothing will ever match Java in a
> Java space"?  If you can't beat 'em, join 'em.  By acting as a transparent
> frontend to real Java source code, we can leverage existing Java analyzers
> to do our linting for us.  The IntelliJ system already has a variant of
> this for CLion's macro processing, being able to detect errors in the
> applied macro and display the code it'll be replaced with in a hover popup.
>
> We can also use Java debuggers to their fullest extent too: it'll link to
> the processed Java8 sources when we freeze on a breakpoint instead of the
> J+ sources, but once again that's a *feature*, not a bug.  With a good
> enough formatter on the processor, they'll even thank us for it.
>
> We don't return anything, only being *syntactic* sugar instead of
> *library* sugar, so type-checking is a non-issue as well.  (I *wanted* to
> add the ability to return from an outer function from inside an Optional,
> so I wouldn't have to do the "Optional Dance" whenever I wanted to get or
> return if null, but that would break the rules I highlighted above so it
> was a no-go.)
>
> No Java syntax rules are broken either - nothing new goes outside a
> method, for starters - so any community-made Java source plugins will work
> exactly the same on the unprocessed source as they would on the vanilla
> source.
>
>
> *2. W E  C A N  U S E  J A V A ' S  T O O L S*
> Again, you don't realize how huge this is.  There's *no* overhead.
> There's no stuttering.  No incorrect typing, no invalid templates, no
> broken plugins; it works *exactly* like normal Java, just with additional
> features.  People won't have any excuse *not* to use it.  It's purely
> helpful without breaking people's workflows in the slightest. (...save for
> some additional gradle configuration to point any other plugins to the
> processed sources, but just *sneezing* on the project does the same
> thing, so it's an acceptable loss imo)
>
>
> *3. It's great marketing for Groovy*
>
> Like I said before, people don't like to stray too far from what they
> know.  They know Java, so they stick with Java.  Oh, but now they know Java
> Plus too!  But... by its very design, Java Plus can only do half of the
> things that Groovy can.  So, if they want even *more* features, we tell
> them to go try Groovy!  "It's just like this, but more!!!"
>
>
>
>
> So, do you get what I'm going for now?  In the end, it *won't* end up all
> that different from Groovy in function, but that's not the point.  The
> point is to be something that doesn't exist yet: an approachable set of
> useful features for people who otherwise would look at a whole other
> "language" and run away.
>
>
> As for marketing: I'm friends with some of the biggest Minecraft
> developers in the space; if something's going to be used by new Java
> developers, it'll be recommended by them.  I can even get it packaged into
> the major modding frameworks for the game if it's intuitive enough, and
> from there it'll spread by word-of-mouth as long as there's no learning
> curve at all.  It will improve readability, make you have to keep fewer
> things in your head while writing, and sort through your code easier; there
> will be no reason *not* to use it, which is exactly what I have in mind.
> Hell, if the features prove stable enough, we could even pitch them to
> Oracle for inclusion in the language proper.
>
> It'll be a great stress-test for some sorely-needed features in Java.
> Plus, it'll let me keep track of where my getters and setters are without
> having to open the Structure tab every five minutes.  Win-win.
>
>
> So, have I sold you on it yet?
>
>
> Cheers,
>
> Caleb
>
> On Mon, Mar 25, 2024 at 11:35 AM OCsite <o...@ocs.cz> wrote:
>
>> Caleb,
>>
>> On 24. 3. 2024, at 16:57, Caleb Brandt <calebbrand...@gmail.com> wrote:
>>
>>> I know you made Groovy, but if you're anything like me, you *love* Java.
>>>
>>
>> just for one, although I haven't co-operated on the Groovy creation (am
>> just a very satisfied user), I *hate* Java very bitterly.
>>
>> The language design is simply *terrible*, all the worse since the people
>> who made that abomination, i.e., Sun, knew Objective C well (they used to
>> cooperate with NeXT on OpenStep) and thus *knew* how to do an
>> object-oriented language right.
>>
>> Instead they botched it *terribly*. No real polymorphism. Very limited
>> encapsulation. Type-system which effectively prevents (or at the very least
>> makes highly complicated and expensive) all the best and most important
>> object-oriented patterns like e.g., proxying and message forwarding.
>> Classes are not objects and their „methods“ do not support inheritance
>> properly. It is quite normal to access instance variables directly, instead
>> of consistent usage of accessors. *Heaps and heaps* of boilerplate.
>> Often, the darned thing limitations just force the IDEs to generate code —
>> compare e.g., WOLips. Could rant on for months like this :(
>>
>> Whilst languages like e.g., Kotlin or Scala fix some of the problems all
>> right, they, alas, do not allow to switch a big project from the Java
>> disaster without re-writing it at once and completely, which is a big
>> show-stopper.
>>
>> The vast advantage of Groovy is that you can take a big project, just
>> rename all *.java to *.groovy, and it will essentially work (well, as
>> someone already wrote, 99 % — my experience is rather 99.99 %, but indeed
>> there are things which need fixing and there are a couple of gotchas, but
>> there's really a very very small number of them). Then you can work on with
>> the project and gradually change the stupid Java patterns to the pretty
>> decent Groovy ones, part by part, method by method and if need be,
>> practically line by line, without losing any functionality during the
>> process. No other language I know of allows anything like this.
>>
>> All the best,
>> OC
>>
>>

Reply via email to