Hi Vasileios,
we use our own Groovy framework to develop an in-house multi part web
application and accompanying SQL & PL/SQL generation framework, and have
been using Groovy for 10 years, including some dabbling in the
@CompileStatic predecessor Groovy++ (which later afaik gave birth to
Kotlin).
Contrary to many ppl here I love static compilation checks - in my book
there is nothing more annoying than to get an incompatible-type-RTE, and
it also makes code more readable to use explicit types & easier to
refactor automatically (e.g. through IntelliJ). And no, I do not have
time to write a test or execute a Selenium test (suite) before every
rollout during development, to catch any potential errors of that kind,
so I would much rather have the compiler catch those, thank you ver
much* :-)
Having said that, I have come to realize what I actually want to use in
Groovy 99% of the time is @TypeChecked, not @CompileStatic, and the
reason for this is simple: Dynamic call site selection. Dynamic call
site selection is a feature I have already seen people request for
Kotlin, which e.g. allows one to easily add polymorphic method support
for newly introduced sub-types, without any refactoring effort (while
still keeping type safety, i.e. in fully @TypeChecked code).
On the other hand in practice there is most of the time very little to
nothing to be gained from using @CompileStatic, even in low level code,
because a) dynamic code execution is highly optimized in Groovy** so
there is no relevant speed difference, and b) in most cases even that
would not matter, since performance of business applications is mostly
bound by database and network performance.
Cheers & a Happy 2024,
mg
*@TypeChecked is not yet perfect here, it on occasion lets code slip
through, which later leads to a RTE, while sometimes complaining about
code which is actually valid (most of the time when using generics), but
it still is of great value, and one can of course always make a method
fully dynamic as a workaround in these cases (a bit counterintuitively
not by using @CompileDynamic, but @TypeChecked with TypeCheckingMode.SKIP).
**Alas that is not the case for JVM invoke dynamic, which is much slower
when generating a really large number of objects, which recently
required us to make a part of our SQL generation code less user
friendly, to make Groovy 3/4 with invoke dynamic as fast as the old
Groovy-specifc code which did not rely on invoke dynamic...
On 30/12/2023 19:17, Agile Developer wrote:
Hi,
I was a 4 years user of Grails/Groovy (last year mostly Python). With
the general trend of people moving to static languages, is there any
reason that Groovy needs to stay dynamic?
I see Python having the mypy approach, I see gradle moving to Kotlin
and FE mostly on Typescript.
I understand that the @CompileStatic is the supported method, but
having true static typing (with the Script-Like enhancements other
Languages added, would be beneficial).
Is there still a reason to keep it dynamic? What is the benefit?
--
Dr. Vasileios Anagnostopoulos (MSc,PhD)
Researcher/Developer