Permalänk
Medlem

Tråden om Kotlin

Under Google I/O 2017 presenterades det att Kotlin blir officiellt ett förstapartsspråk för Android. Givetvis kan man använda programmeringsspråket till annat också.

Varför man bör välja Kotlin:

  • Konsist - Reducera mängden av 'boilerplate'-kod

  • Säkert - Undvik hela klasser av felmeddelanden som 'null pointer exceptions'

  • Driftskompatibla - Importera redan existerande bibliotek för JVM, Android och webbläsaren

  • Verktygsvänlig - Använd vilken Java IDE du vill eller terminalen

Länkar:

Permalänk
Medlem

Finally.

Gjorde ett väldigt simpelt demoprojekt för några månader sen, om någon är intresserad av att kolla lite Kotlin kod.
Blandad kvalité dock.

Namnstatistik

Permalänk
Medlem
Skrivet av K W:

Finally.

Gjorde ett väldigt simpelt demoprojekt för några månader sen, om någon är intresserad av att kolla lite Kotlin kod.
Blandad kvalité dock.

Namnstatistik

Spännande! Hur upplevde du Kotlin? Använder du det fortfarande idag?

Permalänk
Medlem

@Cable:
Jag har kört enbart Kotlin sedan September förra året ungefär, dock ligger det mesta inte i publika repos tyvärr

Den största fördelen idag är att jag, i princip, kan dela viss kod mellan Kotlin & Swift, då syntaxen är ganska lik.
Bortsett från det så tycker jag att Kotlin är många gånger trevligare att arbeta med än java, då *insert fördelar från dina länkar ovan*.

För den som vill komma igång med Kotlin så är deras dokumentation väldigt bra, samtidigt som Android Studio klarar av att göra om Java till Kotlin felfritt många gånger med ett knapptryck.

Jag använder Kotlin & Swift dagligen, självklart finns det även nackdelar med allt men inget som stört mig något nämnvärt.

Permalänk
Medlem

Gör Kotlin om programmet till java när man kompilerar koden? För jag fattade det som att det är byggt ovanpå java på något sätt?

Permalänk
Medlem
Skrivet av ronnylov:

Gör Kotlin om programmet till java när man kompilerar koden? För jag fattade det som att det är byggt ovanpå java på något sätt?

Kotlin kompilerar huvudsakligen till JVM-bytecode, dvs. instruktioner som kan köras på en JVM (Java Virtual Machine). Det jobbas även på backends för javascript och native, men vet inte så mycket om dem. (Det kompilerar alltså INTE till språket Java)

Fun fact: Det finns faktiskt en mängd roliga språk som kör på JVM:en. Clojure och Scala är mina favoriter.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Kotlin kompilerar huvudsakligen till JVM-bytecode, dvs. instruktioner som kan köras på en JVM (Java Virtual Machine). Det jobbas även på backends för javascript och native, men vet inte så mycket om dem. (Det kompilerar alltså INTE till språket Java)

Fun fact: Det finns faktiskt en mängd roliga språk som kör på JVM:en. Clojure och Scala är mina favoriter.

Aha, så det har en egen kompilator som genererar samma typ av byte-kod som javas kompilator. Verkar intressant men det är jobbigt att sätta sig in i alla olika programmeringsspråk. Men fördelen är att då kanske jag kan lära mig detta istället för java eftersom jag inte börjat lära mig java ännu. Enda anledningen att jag funderat på att lära mig java är om jag vill skapa enklare android-appar men antar man lika gärna kan använda Kotlin istället.

Permalänk
Medlem
Skrivet av ronnylov:

Gör Kotlin om programmet till java när man kompilerar koden? För jag fattade det som att det är byggt ovanpå java på något sätt?

Klumpigt ordval i min text om du refererade till mitt inlägg ovan.
Det jag menade var att i ett Kotlin projekt i Android Studio, så kan du skriva java kod och få en popup om du vill översätta denna koden till Kotlin.

Om du har exempelvis

public class GitHubRepo { public String name; public String description; public String getName(){ return this.name; } public String getDescription(){ return this.description; } } public class RestDataSource implements Repository { private GithubApiService gitHubApiService; @Inject public RestDataSource(GithubApiService service){ this.gitHubApiService = service; } @Override public Observable<GithubRepo> getRepositoryForUser(String username){ return gitHubApiService.getRepository(username); } }

så kommer Android Studio att (förhoppningsvis) kunna översätta denna till.

data class GitHubRepo(val name: String, val description: String) class RestDataSource @Inject constructor(private val githubApiService: GithubApiService): Repository { override fun getRepositoryForUser(username: String): Observable<GitHubRepo>{ return githubApiService.getRepository(username) } }

Var ett tag sen jag kodade Android nu så kanske är något fel
Metoder brukade den kunna översätta ganska bra, ibland får man göra lite små förändringar

Permalänk
Medlem
Skrivet av Teknocide:

Kotlin kompilerar huvudsakligen till JVM-bytecode, dvs. instruktioner som kan köras på en JVM (Java Virtual Machine). Det jobbas även på backends för javascript och native, men vet inte så mycket om dem. (Det kompilerar alltså INTE till språket Java)

Fun fact: Det finns faktiskt en mängd roliga språk som kör på JVM:en. Clojure och Scala är mina favoriter.

Har också svårt att förstå strukturen hehe Menar du såhär:

Kotlin kod => Kotlin compiler => JVM => Maskinkod?
På samma sätt:
Java kod => Java compiler => JVM => Done?

Så man har gjort en "Java 2.0" (typ). Alltså ett språk som i grunden använder JVM.

Vet du om GC ligger i JVM eller om den är i kompilatorn? D.v.s. om de skrivit en egen GC?

Permalänk
Medlem
Skrivet av Alotiat:

Har också svårt att förstå strukturen hehe Menar du såhär:

Kotlin kod => Kotlin compiler => JVM => Maskinkod?
På samma sätt:
Java kod => Java compiler => JVM => Done?

Så man har gjort en "Java 2.0" (typ). Alltså ett språk som i grunden använder JVM.

Vet du om GC ligger i JVM eller om den är i kompilatorn? D.v.s. om de skrivit en egen GC?

Både Java och Kotlin kan kompileras till JVM-bytecode. Vad JVM:en gör efter det är egentligen ointressant i frågan men den kan både kompilera bytecode till rena maskininstruktioner eller köra i interpreted mode.

Ja, man skulle kunna säga att Kotlin är Java 2.0. Däremot tycker jag det är viktigt att särskilja på språk och JVM: Kotlin går att kompilera till JVM-bytecode, men man säger inte att "Kotlin är ett språk som i grunden använder JVM".

Ett programmeringsspråk är tänkt att vara en abstraktion ovanför processorarkitekturen som bland annat gör det enklare för en programmerare att porta ett program mellan plattformar. Med "plattform" kan avses både processorarkitektur eller operativsystem. Tänk dig JVM:en som en virtuell processorarkitektur, typ i386 eller ARMv6.

Om ett språk kompilerar till bytecode kan applikationer skapade i det språket köras överallt där det finns en JVM tillgänglig, kortfattat. Det stora utbudet av implementationer av JVM:en tillsammans med mognadsgraden gör att nya språk ofta väljer bytecode som förstahandsval för kompilering, men rent teoretiskt finns det ofta ingenting som begränsar dessa språk till bytecode. Kotlin kompileras alltså till bytecode som standard, men det kan även transpilas till javascript — för att kunna köra i webbläsare eller på en node.js-server — och senare även experimentellt till maskinkod.

Garbage collectorn är en del av JVM:en, så språk som kompilerar till bytecode får den "gratis".

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Både Java och Kotlin kan kompileras till JVM-bytecode. Vad JVM:en gör efter det är egentligen ointressant i frågan men den kan både kompilera bytecode till rena maskininstruktioner eller köra i interpreted mode.

Ja, man skulle kunna säga att Kotlin är Java 2.0. Däremot tycker jag det är viktigt att särskilja på språk och JVM: Kotlin går att kompilera till JVM-bytecode, men man säger inte att "Kotlin är ett språk som i grunden använder JVM".

Ett programmeringsspråk är tänkt att vara en abstraktion ovanför processorarkitekturen som bland annat gör det enklare för en programmerare att porta ett program mellan plattformar. Med "plattform" kan avses både processorarkitektur eller operativsystem. Tänk dig JVM:en som en virtuell processorarkitektur, typ i386 eller ARMv6.

Om ett språk kompilerar till bytecode kan applikationer skapade i det språket köras överallt där det finns en JVM tillgänglig, kortfattat. Det stora utbudet av implementationer av JVM:en tillsammans med mognadsgraden gör att nya språk ofta väljer bytecode som förstahandsval för kompilering, men rent teoretiskt finns det ofta ingenting som begränsar dessa språk till bytecode. Kotlin kompileras alltså till bytecode som standard, men det kan även transpilas till javascript — för att kunna köra i webbläsare eller på en node.js-server — och senare även experimentellt till maskinkod.

Garbage collectorn är en del av JVM:en, så språk som kompilerar till bytecode får den "gratis".

Ok tack för förklaringen! Jag trodde först att ett språk skapades för att i grunden använda JVM. Det är mer en feature som språket använder om jag förstått rätt nu. Men om man nu har det tillgängligt på så många plattformar (webb, server, applikation etc.), förlorar man inte prestanda då? Eller ger det bara fördelar?

Permalänk
Medlem
Skrivet av Alotiat:

Ok tack för förklaringen! Jag trodde först att ett språk skapades för att i grunden använda JVM. Det är mer en feature som språket använder om jag förstått rätt nu. Men om man nu har det tillgängligt på så många plattformar (webb, server, applikation etc.), förlorar man inte prestanda då? Eller ger det bara fördelar?

I teori finns det ingenting som säger att prestandan måste bli lidande av att kompilera till en "plattform", men sanningen är mycket mer nyanserad.

Om Kotlin kompileras till Javascript — en process som kallas transpilation — beror prestandan direkt på hur bra kompilatorn är på att omvandla Kotlin till Javascript, samt den plattform som kör den resulterande Javascript-koden. Den slutgiltiga plattformen kan vara exempelvis V8 som Chrome använder sig av för att köra javascript på webbsidor.

När Kotlin istället kompileras till bytecode omvandlas koncept som bara återfinns i Kotlin till instruktioner för JVM:en. Detta kan innebära att en rad kod blir femton instruktioner i bytecode. Samma sak görs för Java och andra språk, men Java är "närmst" bytecode så ofta är omvandlingen naturligare där. Detta i sig innebär inte att Kotlin är dömt att vara mindre effektivt än Java, då en rad Kotlin kan ersätta flera rader Java: Kotlins kompilator optimerar för effektiv bytecode på samma sätt som en C-kompilator optimerar för att ge så effektiv maskinkod som möjligt.

I slutändan beror prestandan på hur JVM:en är implementerad: Då det rör sig om en virtuell maskin som ansvarar för att omvandla bytecode till processorinstruktioner som den underliggande hårdvaran förstår sig på. Även här görs en mängd optimeringar, och avancerade virtuella maskiner så som Oracles JRE eller Azul Zing ger ofta prestanda som kan mäta sig med optimerad C.

Jag är inte säker på hur moget Kotlin native är och hur de har löst garbage collection och liknande problem, men en möjlig lösning är att koden kompileras till maskinkod och en GC inkluderas i det slutgiltiga resultatet. Uppstartstider tenderar att bli bättre än motsvarande JVM-lösning medan garbage collecting är ett typiskt svårt problem att få bättre då Sun/Oracle lagt åtskilliga utvecklingsår på den biten för JVM:en.

Sammanfattningsvis är frågan svår att besvara — vet inte ens om jag förstod dig rätt till att börja med :). Vanligtvis behöver man inte oroa sig för eventuella prestandaproblem, och om de ändå uppstår brukar man analysera vilken del av koden som är långsam och försöka skriva om den mer effektivt.

Program skrivna i språk som kompilerar till bytecode brukar oavsett vara långt (10x till 100x) snabbare än motsvarande program skrivna i exempelvis PHP eller Ruby.

Visa signatur

Kom-pa-TI-bilitet