Kotlin e Groovy sembrano linguaggi molto simili con caratteristiche molto simili se compiliamo Groovy staticamente. Quali caratteristiche, a parte la sicurezza nulla, Kotlin ha che mancano in Groovy?Quali funzionalità di Kotlin non sono disponibili in Groovy compilato staticamente?
risposta
Kotlin è un linguaggio JVM, che IMO sta cercando di migliorare su Java in funzionalità e concisione, pur restando imperativo e statico. Groovy ha un concetto simile, ma ha deciso di andare dinamico. Di conseguenza, un numero di funzionalità linguistiche sarà simile.
Qui sono alcune differenze io sappia
- statico vs dinamica: Dal momento che Groovy è stato progettato come un linguaggio dinamico, e @CompileStatic, mentre un grande annotazione (lo uso molto), è stato aggiunto dopo. La sua funzionalità sembra un po 'schiacciata, e non impone alle persone di codificare in modo statico. Non è utilizzabile ovunque (ad esempio i miei test di Spock sembrano non riuscire a compilarli). A volte persino con esso su Groovy sembra avere qualche strano comportamento dinamico di tanto in tanto. Kotlin è al 100% statico e la dinamica non è un'opzione.
Esistono molte altre funzionalità. Ti consiglierei di guardare il riferimento e potresti individuarne ancora alcuni, ad es. https://kotlinlang.org/docs/reference/
- classi di dati - concisi con una funzione di copia (un po 'come classi case a Scala)
- verificare la sicurezza nulla hai citato (che è un grande professionista)
- La capacità di distruggere oggetti. val (nome, età) = persona
- Funzioni di ordine superiore, definite come "fun doStuff (body: Int -> T)): T". Che sono molto meglio delle allegre Closure IMO. (Molto simile alla Scala di)
- Tipo controlli e calchi intelligenti sono piacevoli: https://kotlinlang.org/docs/reference/typecasts.html
- Companion oggetti, nello stesso modo in Scala cerca anche di rimuovere i metodi statici dalle classi, Kotlin tenta la stessa cosa.
- Classi sigillate per limitare l'ereditarietà (di nuovo Scala ha qualcosa di simile)
- Il sottotipo "Niente", dove tutto è un supertipo di esso. (un altro concetto cruciale in Scala).
- quando le espressioni per la corrispondenza di base modello: https://kotlinlang.org/docs/reference/control-flow.html
Come si può vedere non prendere in prestito da altre lingue diverse Groovy. Hanno tentato di cogliere una serie di grandi caratteristiche nel tentativo di fare un buon linguaggio. Naturalmente Groovy ha la sua bontà. Ho focalizzato solo quello che Kotlin ha e non visa-versa
Un altro vantaggio è che, essendo realizzato da un produttore di IDE, il compilatore è molto veloce e ha un ottimo supporto IDE. Non sto dicendo che Groovy non ha un buon supporto, ma il mio progetto attuale richiede molto tempo per essere compilato, e il metodo refactor presuppone sempre che tu stia codificando in modo dinamico.
Ti consiglio di provare i Koan per farti un'idea di quali caratteristiche della lingua ti piacciono e di come è paragonabile a groovy (https://github.com/Kotlin/kotlin-koans).
Un'altra caratteristica di Kotlin che ho trovato mancante in Groovy è denominata parametri. È possibile usare map spread per emularlo in una certa misura, ma non sembra essere un modo per combinare parametri standard con parametri nominati: 'someMethod (" foo ", 10, color: RED, verbose: true)' –
"Kotlin è al 100% statico e la dinamica non è un'opzione" Kotlin ha l'inferenza di tipo (anche Golang) in modo da poter programmare in Kotlin in modo dinamico. Kotlin non può essere usato come linguaggio di scripting perché è sempre compilato e questa è la differenza principale rispetto a Groovy. –
In questo caso, "statico" si riferisce alla compilazione e ai tipi determinati/bloccati in fase di compilazione. Per esempio. var s = "ciao"; s = 1; non riuscirà a compilare in Kotlin. La dinamica implica che i controlli delle informazioni sul tipo avvengano in fase di runtime.E.g. in Groovy puoi fare questo: def s = "ciao"; s = 1; def t = s + 1 e verrà compilato/eseguito correttamente. Penso che l'affermazione che kotlin sia statico è ancora corretta, anche se sia Groovy che Groovy hanno inferenza di tipo. Anche Java ha elementi di tipo inferenza, ma è sicuramente un linguaggio tipizzato in modo statico: https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html –
Kotlin progettato come linguaggio tipizzato staticamente, con un ottimo sistema di tipi e altri vantaggi del linguaggio tipizzato staticamente.Groovy - in primo luogo è un linguaggio tipizzato dinamicamente, e solo allora - staticamente.
Quando si attiva la compilazione statica in groovy si ottiene solo java con lo zucchero della sintassi. Dall'altra parte - Kotlin, nel loro sistema di tipi, ha due tipi di riferimenti: nullable and nonnullable, quindi è possibile scrivere codice con meno NPE. Se stai chiedendo una sola caratteristica - è così.
Seconda grande caratteristica di Kotlin - non esegue conversioni implicite, d'altra parte - groovy converte implicitamente da doppio a bigdecimal e così via.
Ma Kotlin ha molte altre caratteristiche, come smart casts, ADT (doc), type-safe builders, astrazioni a costo zero e, infine, un grande supporto IDE.
Anche io non sono sicuro di qualità di tipo-deduzione di Groovy (in chiusure per esempio, abbiamo bisogno additional annotations, meh), ma in Kotlin tipo di inferenza lavoro come un fascino, senza annotazioni in ogni pace della lingua.
Compilazione così statisticamente scritta in Kotlin - cittadino di prima classe, in Groovy - not.
Kotlin ha un'inferenza di tipo (anche Golang lo ha) quindi tu può programmare in Kotlin in modo dinamico. Kotlin non può essere usato come script, linguaggio interpretato perché è sempre compilato e questa è la differenza principale rispetto a Groovy. –
Groovy è un linguaggio dinamico, quindi l'inferenza di tipo è integrata nel core del linguaggio. Dovresti saperlo. Ciò è implicito nella definizione del linguaggio digitato dinamico. –
@MarekMarczak cosa intendi per tipo di inferenza? In groovy hai tipi dinamici e conosci il tipo solo in runtime (in molti casi). Anche in groovy ci sono cose come "metodo mancante" che è abusato di gradle. – IRus
- 1. Kotlin: quali funzionalità di Java 8 non sono ancora supportate?
- 2. Quali funzionalità di C# 7.0 sono disponibili nell'anteprima VS "15"?
- 3. Quali nuove funzionalità del browser sono disponibili oggi?
- 4. - Quali opzioni sono disponibili?
- 5. Quali funzionalità di dattiloscritto non sono implementate in ES6?
- 6. IntellJ IDEA Plugin Kotlin - "non ci sono configuratori disponibili"
- 7. Quali operatori matematici sono disponibili in metaprogrammazione
- 8. Quali ganci sono disponibili in jQuery?
- 9. Quali librerie di testi sono disponibili in Linux?
- 10. __LINE__ funzionalità in Groovy
- 11. Quali funzionalità ES6 sono supportate in JSX?
- 12. Quali saranno le nuove funzionalità disponibili in ASP.Net 4.0?
- 13. Quali estensioni GNU C sono disponibili che non sono banali da implementare in C99?
- 14. Quali plug-in vim sono disponibili per Eclipse?
- 15. Quali grandi progetti linguistici funzionali sono disponibili gratuitamente?
- 16. Quali funzionalità di C99 sono disponibili nel compilatore MS Visual Studio?
- 17. Quali funzionalità HTML5 sono disponibili per i widget Dashcode in iBook?
- 18. Quali sono i buoni Podcast SQL disponibili?
- 19. Quali funzionalità di C99 sono considerate dannose o non supportate
- 20. Attributi del nodo Chef. Quali sono disponibili?
- 21. Quali parser Java standalone sono disponibili?
- 22. Quali segnali Process.kill sono disponibili su Windows?
- 23. Quali driver MySQL sono disponibili per node.js?
- 24. Quali tipi di carattere sono disponibili in iOS 9?
- 25. Quali sono gli operatori di dominio disponibili in Openerp/Odoo?
- 26. Quali comandi di uscita della console sono disponibili in Erlang?
- 27. Quali tipi di messaggi flash sono disponibili in Rails?
- 28. Quali sono le parole chiave riservate in Kotlin?
- 29. Framework test unità - Quali sono le funzionalità principali
- 30. Quali sono i vantaggi del linguaggio di programmazione Kotlin?
Ho cercato di riformulare la domanda per renderla meno basata sull'opinione pubblica. Mi scuso se non è ancora accettabile per Stack Overflow. –