Inlägg

Inlägg som Teknocide har skrivit i forumet
Av Teknocide
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.

Av Teknocide
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".

Av Teknocide
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.

Av Teknocide
Skrivet av warmerspy:

Vilka är fördelarna och nackdelarna med det stabila respektive det senaste?

Vet inte om du skojar nu men..

Stabila +: Det är stabilt
Stabila -: Det är inte det allra senaste

Senaste +: Det är det senaste
Senaste -: Det är inte lika stabilt som det stabila

Tänk Windows 7 vs Windows 8 när det drog igång. Fast inte lika illa. Aldrig lika illa.

Av Teknocide
Skrivet av Gremanz:

Misstänkte det.

Känns bara lite "uncanny" varje gång jag får upp "password has been used before", som om att det skulle förvaras i klartext någonstans.

Det i sig bör inte vara en varningsflagga. Däremot blir jag fundersam när ett lösenord begränsas med en maxlängd, som på exempelvis battle.net.. :\

Av Teknocide
Skrivet av Andre_H:

Ni som använder github, gör ni det för att det underlättar på något sätt eller av andra anledningar?
Hittar man nåt som bara finns på github kan man ladda ner det utan att ha varken konto eller git.
Bara klicka på Clone or download > Download ZIP
Vill man göra en backup, eller skicka något kan man använda google drive, skulle även kunna gå att sammarbeta via drive men i praktiken inte eftersom folk använder github och nån kanske bitbucket. Jag sammarbetar inte med någon på det sättet så det spelar ingen roll för min del.
Har jag missat något?

Något som Github eller Bitbucket är ett måste för all typ av programmering, men det kan vara svårt att se innan man kommit till insikt.

Så fort jag skrivit ihop något som inte är trivialt att återskapa hamnar det i ett versionshanteringssystem. Planerar att testa Fossil i framtiden bara för att det verkar kul

Av Teknocide
Skrivet av hasenfrasen:

Här på sweclockers kör man med: (meta http-equiv="content-type" content="text/html; charset=UTF-8"/)

Mindre/större utbytt mot () för att inte förvirra din webläsare. Din output lär matcha vad du specat.

Skrivet av F@|)€r/\/:

Hmm satte in det där högst upp i index.php, ingen skillnad ÅÄÖ åäö är fortfarande ��� ��� :/

Din data är lagrad (eller har konverterats till) ett single-byte format, typ ISO-8859-1, men presenteras som UTF-8.
Vad du har i din <meta>-tag spelar ingen roll, det enda som betyder något är att webbservern skickar ut rätt Content-type header (t ex "Content-Type: text/html; charset=iso-8859-1")

Av Teknocide
Skrivet av perost:

Jo, det sista plusset kan tas bort utan att påverka uttrycket. Man kan få rätt svårlästa uttryck i C om man leker lite med whitespace

T.ex. denna klassiker:

while (x --> 0) // x går mot 0 { ... }

Eller

while (0 <---- num) {} // springer mot 0 while (0 <-------- num) {} // expresståg mot 0 while (0 <---------------------------------------- num) {} // rymdraket mot 0

Av Teknocide
Skrivet av kundun:

1. Att förstå funktioner ingår inte i TS kurs.
2. Att förstå arrayer och for-loopar ingår uppenbarligen.
3. TS förstår problemet.
4. TS förstår inte arrayer.
5. TS förstår inte for-loopar.

Hur tycker du att införa funktioner hjälper TS att förstå arrayer och for-loopar, och således klara kursen?

Vet du vad som ingår i kursen? Vad jag kan se har det inte skrivits i tråden. Kan inte heller hitta något som säger att problemet måste lösas med for-loopar men det är säkert möjligt att så är fallet.

Jag påstår inte att funktioner hjälper någon att förstå vare sig arrayer eller for-loopar: Det är ju precis det jag skulle välja att undvika i en grundkurs. Mitt utgångsläge var att visa en enklare lösning på problemet. Efter det blev det en massa periferisk diskussion om vad som bör ingå i en grundkurs i programmering, där jag har försökt att ge tydliga argument för hur jag tänker och varför.

Jag vet inte riktigt vad du vill att jag ska skriva. Att C-style for-loopar ska finnas med i alla grundkurser i programmering? Då hade man inte kunnat använda Python (bland många andra språk) som programmeringsspråk, för där finns de inte — och ändå är det många här på Sweclockers som rekommenderar att man börjar med just Python.

Av Teknocide
Skrivet av kundun:

Du har såklart rätt i sak, men du missar/ignorerar kontexten helt.
Att DU tycker det är lättare att förstå är begripligt, du har ju redan kunskapen, det har inte TS.
Det finns en anledning till att man börjar med arrayer och for-loopar, och inte key-valuepairs och linq/lambda/func. I en for-loop med en array kan man förklara ett procedurellt händelseförlopp direkt i koden på ett helt annat sätt, vilket är ett insteg till ökad förståelse för andra sätt att iterera samlingar.
Det handlar inte om vilket som funnits längst, bästa sättet, prestanda, komplexitet, vad du och jag tycker är lättast, osv. Det handlar om att mottagaren ska förstå och lära sig.

Ja jag har kunskapen, och med den kunskapen kan jag med säkerhet säga att jag hellre hade lärt mig det funktionella tänket långt tidigare. En sak jag tycker du missar är att trådskaparen och andra personer i samma situation saknar insikt i både for-loopar och funktioner (men som sagt, matte A…). Det handlar med andra ord om vad man ska lära ut först, eller borde handla om då funktioner alltsom oftast inte ens tas upp.

Du säger att en for-loop ger ökad förståelse för hur man kan iterera genom andra samlingar men det är ju inte sant, snarare motsatsen.
LINQ fungerar på alla typer under System.Collections.Generic, medan for bara fungerar för linjära indexerade samlingar.

Citat:

Kunskap växer fram genom förståelse för problemet, snarare än genom lösningen av det.
Du måste väl ändå se det pedagogiska värdet i det?

Problemet borde väl ändå vara att ta bort en spelare ur en samling snarare än att göra det med en for-loop? Lösningen på problemet kan se ut hur som helst: om man inte förstått problemet kommer lösningen inte heller att göra det den borde.

Jag argumenterar för att min lösning är enklare att läsa och förstå — om man utgår från en person som inte har någon tidigare erfarenhet av programmering. Om studenten därtill tagit en grundläggande kurs i SQL råder det inga tvivel om vilket som är mer tydligt.

Av Teknocide
Skrivet av kundun:

"Jag har precis börjat läsa en kurs som heter grundläggande programmering"
Det är detta du måste relatera till, inte vad du tycker är 'the shit' för tillfället eller överlag.
Du har alltså en person som antagligen precis lärt sig vad en variabel är och så kommer du med funktionellauttryck och tycker läroinstanser är ignoranta för att dom inte lär ut det vecka ett.
Efter ett halvår hade vi halva klassen som fortfarande inte fått huvudet runt hur objekt fungerade, men vi hjälptes åt och nu är dom flesta med på tåget. Det dom flesta tyckte var svårt var att det blev för mycket på en gång, då får man backa och förenkla. Inte ge dom en oneliner som löser uppgiften, men som dom inte begriper. Det handlar om att lära sig, inte nödvändigtvis lösa uppgiften på bästa sätt.
Lägger en smile för god ton

Det är inte vad jag tycker är "the shit", det är vad jag tycker är enklare att förstå. Funktionella språk har funnits längre än objektorienterade; att påstå att det är nytt/tufft/obegripligt håller inte. Jag ser helt enkelt inte varför det skulle vara lättare att förklara en for-loop för en person, än att förklara en funktion. Som sagt, de flesta som går kursen har antagligen tagit matte A och borde ha en åtminstone grundläggande idé om vad det handlar om.

Jag tar inte illa upp, förstår varför du reagerar.

Skrivet av oxxyyd:

@Teknocide: Och hur har du tänkt förklara för eleverna hur ditt LINQ-uttryck fungerar?

Nu har jag inte tänkt något på förhand men vad sägs om

Citat:

Raden väljer ut en delmängd element från en samling där det givna uttrycket är sant.

Att förklara den föreslagna for-loopen hade blivit något i stil med

Citat:

Varje element i din samling har ett index, såvida det inte rör sig om en IEnumerable eller Dictionary — den förstnämnda har ingen längd och den andra är indexerad på nyckelvärdet, alltså går det inte att for-loopa över den. Sedan initierar vi for-loopens index till det första elementets, dvs 0, och låter loopen fortsätta köra medan uttrycket index är mindre än nummer är sant. För varje snurr i loopen kopierar vi värdet på spelare[index] till nyVector[index]

Efter varje snurr i loopen lägger vi på 1 på vårt flytande index-värde. Det är viktigt att vi inte lägger till det innan (++index) för då missar vi första elementet och får dessutom fel data om nummer är 1 i anropet. Om nummer är sista indexet i listan kommer applikationen i stället att krascha. Det kommer den iofs göra ändå om nummer > spelare.Length

När den första loopen är färdig gör vi samma sak igen för element där index < spelare.Length, men vi initierar index till nummer + 1 eftersom vi inte vill ha med elementet med index "nummer". Dessutom måste vi komma ihåg att kopiera spelare[index] till nyVektor[index - 1], då nyVektor är ett element kortare än spelare.

Om nummer är större än sista indexet i samlingen kommer resultatet bli en tom samling och inte en oförändrad. Detta beror på att vi manuellt lägger till elementen baserat på deras index. Det är tråkigt men så får det vara.

Låter det någorlunda rätt?

edit: försök till att korrigera for-looparna som jag skrev fel i.

Av Teknocide
Skrivet av kundun:

Håller inte med Det handlar om att lära sig grunderna i programmering och för att lättare förstå lambda så bör man förstå de olika metoderna som finns för att loopa.
En lambda kan översättas till loopar och vice versa. I en loop är det lättare att följa händelseförloppet än i en lambda.
Innan man fått in tänket är det lätt att fylla loopar med funktionalitet som hade kunnat flyttas ut, och det gör lambda svåra och komplexa att använda.

Själv kör jag lambdas till det mesta men om jag blir tvungen att göra en komplex iterering så väljer jag vanliga loopar. Det handlar inte bara om att jag ska skriva 'min' kod utan om att öka läsligheten och förståelsen för det man byggt. Man är inte ensam om koden, någon kommer efter och ska undrhålla eller utveckla vidare på den och då är det kontraproduktivt att lägga in onödig komplexitet som försvårar för dom, hur lätt man än själv tycker det är.

Skickades från m.sweclockers.com

En funktion (eller "lambda" som du kallar det) är inte kopplat till loopar på något vis. Har man läst matte A har man kommit i kontakt med funktioner så de borde vara mer bekanta för någon som läser en eftergymnasial kurs. Av den anledningen, och på grund av att de är relevanta vid fler tillfällen än loopar, tycker jag det är rent bisarrt att man inte får lära sig hur de fungerar i moderna programmeringsspråk. Näst intill alla uppgifter folk ställer frågor om här verkar komma från åttiotalet.

Argumentet om att for-loopar skulle vara mer lättlästa än LINQ-uttryck är rent subjektiv och bristfällig då det inte känns som du förstått vad de handlar om. Trender inom datavetenskapen — om man kan kalla dem trender då de börjar bli rätt gamla — visar att språk med rötter i C drar sig åt det funktionella hållet. Java fick förstaklassfunktioner i version 8, samt stöd i standardbiblioteket för att använda dem i uttryck som arbetar med mängd-data; C# har haft dem i åratal; Rust som är ett modernt språk avsett för programmering nära hårdvaran har dem och mer eller mindre alla språk som inte har for-loopar har dem.

Jag påstår inte att det ena är en ersättning för det andra. Det finns fall då en klassiskt for-sats är mer lämpligt än att använda funktionella uttryck, men (i fallet C#) LINQ-uttryck låter dig skriva kod som är kortare och med större sannolikhet gör vad den ska.

Av Teknocide
Skrivet av MickeBoy:

Jag håller med dig, men det faktum att man använder arrayer istället för listor får mig att tro att läraren en gång i tiden använde C eller C++ och helt enkelt har portat över uppgiften till C#. Lösningsförslagen är lite anpassade för utskrift, men strukturen är fortfarande likadan.

Om man är ny och tillsammans med andra sitter och sliter med en och samma uppgift så tycker i alla fall inte jag att det hjälper mig att få flera alternativa lösningar att titta på. Lösningar som dessutom ser helt olika ut. Jag tycker att principerna med tilldelning, instansiering av variabler o.s.v. måste man lära sig först och detta är det sättet som läraren har valt att göra det på.

Återigen: Om jag själv skulle lösa uppgiften på valfritt sätt så hade jag inte valt arrayer själv.

Nåväl, någon måste ju vara den som bryter trenden om det ska bli ändring

Av Teknocide
Skrivet av Emilia_Johanness:

@Teknocide:

Aa okej, förstår dock inte riktigt vart jag ska lägga den koden och om jag ska ta bort något?

Tack för hjälpen!

Den raden ersätter större delen av din DeleteSpelare-metod.

public static void DeleteSpelare(int nummer) { Spelarinfo[] nyVector = new Spelarinfo[spelare.Length - 1]; for (int i = 0; i < nummer; i++) { nyVector[i] = spelare[i]; } for (int i = nummer + 1; i < spelare.Length; i++) { nyVector[i - 1] = spelare[i]; } spelare = nyVector; }

blir istället

public static void DeleteSpelare(int nummer) { spelare = spelare.Where((s, index) => index != nummer).ToArray(); }

Om du vill ta bort en spelare vars spelarnummer stämmer överens med argumentet 'nummer' blir det istället

public static void DeleteSpelare(int nummer) { spelare = spelare.Where((s) => s.Nummer != nummer).ToArray(); }

Av Teknocide
Skrivet av MickeBoy:

Jag tänker om man har precis börjat med en kurs i programmering och inte har gjort något förut så är det bättre att försöka lära sig grunderna först. Då tror jag att det bara ställer till det att introducera alternativa lösningar.

Som jag ser det är det for-loopen som är den alternativa lösningen. Gentemot funktionella uttryck är for-loopar svårare att få rätt (bevisligen) och de bryter mot naturligt tänkande. En nybliven student borde få fokusera på att lösa ett problem logiskt, inte semantiskt, men det verkar tyvärr som de flesta kurser har fel fokus.

Att rekommendera något sånt här känns än mer kontraproduktivt. Problemet som skulle lösas har blivit en fördjupning i bisarra syntaktiska regler och förslag om att sätta null (vilket troligtvis inte heller borde läras ut i detta skede).

Av Teknocide
Skrivet av Emilia_Johanness:

Har en till fråga angående att ta bort spelare i vårat program via nummer.

Koden ser ut såhär:
public static void DeleteSpelare(int nummer)
{
Spelarinfo[] nyVector = new Spelarinfo[spelare.Length - 1];
for (int i = 0; i < nummer; i++)
{
nyVector[i] = spelare[i];
}
for (int i = nummer + 1; i < spelare.Length; i++)
{
nyVector[i - 1] = spelare[i];
}
spelare = nyVector;

}

Sedan skriver vi i i vårat menyval såhär för att anropa metoden:

else if (choice == 4)
{

Console.WriteLine("Skriv in numret för spelaren du vill ta bort:");
int nummer = int.Parse(Console.ReadLine());
DeleteSpelare(nummer);

}

Problemet är att det kommer inget på errorlist men när vi ska ta bort en viss spelare kommer det sedan upp:

An unhandled exception of type 'System.IndexOutOfRangeException' occurred in ManU3.exe

Additional information: Indexet låg utanför gränserna för matrisen.

Förstår inte riktigt problemet..

Den nya arrayen är ett element kortare än spelare-arrayen, men iterationerna sker mellan 0 och spelare.Length (en för mycket).

Att använda for-loopar för att göra sånt här ger ofta kod som är svårläst och benägen att innehålla buggar. Ett bättre alternativ är att använda ett LINQ-uttryck:

var nyVector = spelare.Where((item, index) => index != nummer).ToArray();

Av Teknocide
Skrivet av Kalebsson:

behöver ha lite hjälp till! Känner mig så kokad.

Så här långt har jag kommit:
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Skriv ett tal med sex (6) antal decimaler.:");
string read = Console.ReadLine();
double decimalNbr = double.Parse(read);

Console.WriteLine("Hur många decimaler ska talet ha?:");
read = Console.ReadLine();
int paces = int.Parse(read);

var roundedNbr = Math.Round(decimalNbr, paces);
Console.WriteLine("Avrundat: {0}",roundedNbr);

Console.Read();
{

double test = 3.445;

double res = Math.Round(test, 2); //3.44
double res1 = Math.Round(test, 2, MidpointRounding.ToEven); //3.44
double res2 = Math.Round(test, 2, MidpointRounding.AwayFromZero); //3.45

Console.ReadLine();

}

Allt fungerar bra men vad ska jag lägga till /göra för att få det skriva med ett förbestämt antal decimaler (exempelvis tre) också

Tack på förhand

Jag förstår inte hur du lyckats skriva koden om du inte kan förstå hur du löser ditt problem.

Av Teknocide

En URL måste ha ett protokoll, t ex file. Testa "file://./hello.mp3"

Av Teknocide
Skrivet av ProgrammeringElev:

Jag har provat med

C:\Users\(Mitt namn)\NetBeans\Book_Examples\build\classes\> appletviewer Animering.html

Men det visar 'appletviewer' is not recognized as an ..... bla bla bla javac också fungerar inte

Skrivet av ProgrammeringElev:

Nej nej jag fick inte igång. Jag bara testade det i IDE.

Jag har appletviewer.exe
C:\Program Files\Java\jdk1.8.0_101\bin
Men, när jag startar det, det stängas automatiskt direkt. Jag kan göra ingenting med det.

Jag har
appletviewer
C:\Program Files\Java\jdk1.8.0_73\bin
här också, det också vill inte att fungera.

därför jag försökte att jobba med cmd och resultat är som ni vet.

För att "appletviewer Animering.html" ska kunna fungera måste du ha C:\Program Files\Java\jdk1.8.0_101\bin satt i miljövariabeln PATH.

Annars kan du testa att ställa dig där (C:\Program Files\Java\jdk1.8.0_101\bin) och köra "appletviewer C:\Users\(Mitt namn)\NetBeans\Book_Examples\build\classes\Animation.html"

Av Teknocide
Skrivet av pannkaksmonstret:

@Teknocide:
Såhär antar jag att det blir?

public String toString(){ String lista = ""; for (int i = 0 ; i < bears.size(); i++ ){ lista += "Björntyp: " + bears.get(i).getName() + " Poäng för denna björn: " + bears.get(i).getPoints() + "\n"; } lista += " Totalt antal sparade poäng: " + totalPoints; return lista; }

Här menar jag att du kan använda en foreach: for (Bear b : bears) { … istället för en klassisk for-loop. Du använder redan samma sorts for-loop i add, ser ingen anledning till att byta här.

Citat:

public void setPointsToHalf(int points) { points /= 2; this.points=points; }

Jag tycker det är förvirrande att du tar in en poäng här. Det blir en matteuppgift av det hela, om jag vill att björnen ska ha 160 poäng måste jag anropa setPointsToHalf(320). Känns inte jättelogiskt att någon skulle vilja göra så.

Björnen har redan en poäng, det är bara att halvera den: this.points = this.points / 2

Sedan skulle jag personligen aldrig haft någon metod på Bear som halverade dess poäng: Det gör att en björn inte kan finnas med i två separata björnlistor eftersom dess individuella poäng sjunker varje gång den läggs till. Kan förstå att du måste göra så om uppgiften kräver det, men det är ingen bra lösning. Jag skyller på kursmaterialet.