Aviseringar
Rensa alla

Programmering


Gentlernen:

Ett överkomplicerat, föråldrat skitspråk, menar du? Ett hett tips är att hålla sig så långt bort från Java som möjligt.

Överkomplicerat? Finns massa färdiga metoder som gör det lättare.[wink]

Gentlernen:

Herregud, nej! Det finns få språk som är tardigare än Java, men C++ är ett av dem.

Bägge är de mest använda inom spelbranchen osv.


   
SvaraCitera

köttfärssås:

Överkomplicerat? Finns massa färdiga metoder som gör det lättare.[wink]

Ja, Java har ett enormt klassbibliotek. Det ändrar inte på det faktum att språket är överkomplicerat och gör sitt bästa för att vara ivägen. Som ett exempel, hur bär du dig åt för att generera alla primtal i Java? Det är en rad kod i Haskell:

primes = go 2 where go n = n:filter (\a -> a `mod` n /= 0) (go $ n+1)

Antalet buggar per kodrad är konstant oavsett språk; vill du skriva buggfri kod ska du skriva så få rader som möjligt, någonting som är omöjligt i Java om du jämför med moderna språk. Och det är bara en liten del av Javas fail. Jag har inte tid att skriva mer om det just nu, men jag kan skriva några sidor om det senare om du är intresserad.

köttfärssås:

Bägge är de mest använda inom spelbranchen osv.

Det finns en enda anledning till att C++ alls används till nya projekt idag: prestanda. Java används överhuvudtaget inte, och C++ kan nog vara på väg ut tidigare än anat.


   
SvaraCitera

Åtta:

Som sagt, det är ett extremt vitt begrepp.

kan också vara en som bygger om sin brödrost till en limpistol. MacGyver är hacker [party]

sylar:

C är ett bra språk att kunna också. Det är bra att veta hur saker fungerar på lägre nivå så att man inte bara snöar in på högnivåspråk.

håller med här 😛

Gentlernen:

men jag kan skriva några sidor om det senare om du är intresserad.

do it!


   
SvaraCitera

Gentlernen:

men jag kan skriva några sidor om det senare om du är intresserad.

gärna[smile] Har egentligen bara läst JAVA och assembler så har ej mkt att jämföra med.


   
SvaraCitera

ankzor:

gärna[smile] Har egentligen bara läst JAVA och assembler så har ej mkt att jämföra med.

Det var ganska vitt skilda saker det, hur kommer det sig att du inte hållit på med C om du jobbat med assembler?

Anyway, det finns ett antal problem med Java, men här är de (IMO) största.

1. Typsystemet. Har du noterat att du precis alltid är tvungen att deklarera vilken typ allting har i Java? Du kan inte använda ett heltal utan att deklarera det som Int eller Integer, du kan inte använda en funktion utan att deklarera dess returtyp, etc. Det beror på att kompilatorn är korkad. Faktum är att det vore fullt möjligt att använda type inference, dvs. att avgöra vilken typ ett uttryck har beroende på dess beståndsdelar. Betrakta följande kod:

int a, b = 27;
String str = "hej tomtegubbar";
System.out.println(a + b*str.length());

Varför behöver vi tala om att a och b är heltal, och att str är en String? Det framgår klart och tydligt att str måste vara en String, eftersom vi tilldelar den "hej tomtegubbar." Likaså måste b vara ett heltal eftersom vi tilldelar 27 till b. Slutligen ser vi att även a måste vara ett heltal, eftersom vi adderar a till ett annat heltal. Detta bidrar kraftigt till nästa punkt, nämligen...

2. Javakod är pladdrig. Du måste skriva väldigt mycket Java för att åstadkomma någonting. Ta t ex Haskellkoden jag postade ovan för att generera alla primtal - hur lång är motsvarande kod i Java?

3. Allting är ett objekt. I Java är allting ett objekt. Fristående funktioner är inte tillåtna. Detta är ett stort problem, eftersom objektorientering inte alltid är optimalt, eller ens lämpligt, att använda. Ett praktexempel är Math-klassen; en hel hög med matematiska funktioner som egentligen borde varit fristående, men istället måste klumpas ihop i en samlingsklass full av statiska metoder.

Allting är ett objekt-mentaliteten leder ofta till överkomplicerade
program fulla av Factories, Managers, Singletons och andra spännande designmönster vars främsta uppgift är att kompensera för det faktum att du inte kan använda funktioner. Inte nog med att du skriver mycket mer kod för att åstadkomma samma sak du kunnat göra med en enkel funktion, du flyttar dessutom runt funktionaliteten så du måste läsa igenom 5-6 klasser bara för att få veta vad som pågår. Recept för buggar!

Detta innebär också att idéer som högre ordningens funktioner, dvs. att använda funktioner som argument och returvärde för andra funktioner, blir omöjligt. Varför är detta dåligt? Betänk följande kod:


for(int i = 0; i < numbers.length; ++i) {
numbers[ i ] = numbers[ i ] * numbers[ i ];
}

Ganska enkel kod; vi går igenom en array och utför någon operation för varje element i den. Dock finns ett problem med den här koden: vi har blandat ihop två fundamentalt olika uppgifter - att iterera genom en array och att kvadrera ett tal. Hade Java haft ordentligt stöd för funktioner hade vi istället kunnat göra såhär:

int squareIt(int n) {
return n*n;
}
forEach(numbers, squareIt);

Vi har generaliserat funktionen "gör någonting med varje element i en array," och kan därför återanvända den. Koden blir dessutom kortare och klarare, och därför lättare att både skriva och läsa.

Detta kanske ser fånigt och onödigt ut med dessa småexempel, men den verkliga fördelen kommer när man bygger större system: kan man generalisera koncept till funktioner kan man sedan sätta ihop dessa småfunktioner till större funktioner, utan att skriva en massa limkod runtikring.

4. Generics. Från början hade Java inte generics, dvs. du kunde inte säga ArrayList<Integer> a = new ArrayList<Integer>();. Istället använde du helt enkelt ArrayList a = new ArrayList(); för att få en ArrayList som kan innehålla precis vad som helst. Detta ledde helt uppenbart till program som inte var typsäkra (eftersom du förlorade all typinformation när du stoppade in ett objekt i din ArrayList) och därför både farliga och långsamma. Farliga därför att om du anropar ((String)a.get(7))).substring(5, 10); och det sjunde elementet i a egentligen är en Integer så exploderar allting, och långsamma därför att programmet spenderar en hel massa tid på att casta objekt fram och tillbaka. Fr o m Java 6 (eller är det 5?) har Java stöd för generics, men de är implementerade genom type erasure för att inte bryta bakåtkompatibilitet, dvs. det är bara syntaktiskt socker ovanpå den gamla, osäkra strukturen. Det förbättrar visserligen prestandan genom att färre casts är nödvändiga, men går fortfarande relativt enkelt att lura.

5. Märkliga beteenden du inte kan förklara utan att vara expert på JVM. Ta t ex det här lustiga exemplet med autoboxing:

public class test {
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println("a == b: " + (a == b ? "japp" : "nix"));
System.out.println("c == d: " + (c == d ? "japp" : "nix"));
}
}

Utan att kompilera och köra det, kan du lista ut vad programmet kommer att skriva ut, och förklara varför?

6. Konstanter existerar inte. Det är sant. Betänk följande:


class SomeClass {
private int foo = 0;
public void doSomething() {this.foo = this.foo + 1;}
}

class Outer {
public final SomeClass blah = new SomeClass();
}

Sansat beteende hade här varit att Outer.blah nu är konstant och inte kan ändras. Så är dock inte fallet; vi kan ändra värdet på Outer.blah genom att helt enkelt anropa Outer.blah.doSomething();. Bristen på konstanter gör det otroligt bökigt att skapa omuterbara datatyper, och eftersom data som kan förändras och andra exempel på stateful programmering (dvs. att en funktions beteende kan variera beroende på andra saker än dess indata) är en av de största källorna till buggar är detta naturligtvis väldigt problematiskt.

...och det är därför Java är skadligt och bör undvikas. C++ har några problem gemensamt med Java, utöver en hel drös egna, men de är så fint beskrivna i C++ FQA att jag knappast behöver skriva någonting om saken här.


   
SvaraCitera

Gentlernen:

Det var ganska vitt skilda saker det, hur kommer det sig att du inte hållit på med C om du jobbat med assembler?

för att först hade vi kurs i java, för att sedan ha en kurs i assembler.

för det andra, vad förespråkar du för språk?


   
SvaraCitera

ankzor:

för att först hade vi kurs i java, för att sedan ha en kurs i assembler.

Vad var meningen med detta (AKA vilken utbildning?) Ägnar man sig åt systemprogrammering är C ett måste, och gör man det inte har man ingen nytta av assembler, och javautvecklare får generellt sett inte lära sig någonting alls utöver klasshierarkier och Javasyntax.

ankzor:

för det andra, vad förespråkar du för språk?

Haskell och andra funktionella språk. (Läs Why Functional Programming Matters av John Hughes om du vill veta varför; relativt kort och lättläst, och väldigt informativt.)

Om folk prompt vill ha objektorientering, F# eller O'Caml. Om det absolut måste vara imperativt, Python.


   
SvaraCitera

Gentlernen:

ingen nytta av assembler

läser 300 HP IT och kommunikation på KTH i Kista. Vi läste assembler för att verkligen förstå hur en dator fungerar.


   
SvaraCitera

ankzor:

Vi läste assembler för att verkligen förstå hur en dator fungerar.

Ah, på så vis. En sådan kurs har jag också läst, men den följdes (om man ville) upp med en kurs i att programmera inbäddade saker med C och assembler, så jag tänkte inte riktigt på saken på det viset.


   
SvaraCitera

Gentlernen:

programmera inbäddade saker med C och assembler

vad läser du?


   
SvaraCitera

ankzor:

vad läser du?

Datavetenskap (individuell studieplan som innebär att jag läser kandidat och master samtidigt, ungefär) vid Göteborgs Universitet/Chalmers, specialisering mot språk, logik och algoritmer.


   
SvaraCitera

Gentlernen:

språk, logik och algoritmer.

ah, låter trevligt. Läser algoritmer och algoritmanalys just nu faktiskt.


   
SvaraCitera
Ämnesstartare

karleksproblem:

Vilket program ska jag börja med?

Ruby eller Python, imo. Ruby för att det är sött och gulligt eller Python för att det är vad Google använder för sina webbprojekt. Det är därmed "modernt".
http://www.ruby-lang.org/en/
http://www.python.org/

Python blir antagligen svårast om man är ny ...


   
SvaraCitera
Ämnesstartare

Gentlernen, visst, haskell är ett väldigt trevligt språk för att lösa olika sträng/tal-problem.. men att koda ett spel eller någon windows-app i Haskell (tror) jag kan vara ett riktigt helvete, och man behöver nog en hel del kunskap (har aldrig försökt skriva någon riktigt applikation i haskell, detta är bara ett antagande..).

Funktioner som tar funktioner, curried functions, tuplar, all rekursion osv som återfinns i Haskell - Ja, det ÄR jättebra. Om man kan det, och om man har tid / ork att lära sig det! Men killen är 13 bast och vet knappt vad en funktion är 🙂

Om man då tar Java istället, så kan man efter bara några veckor faktiskt börja bygga fungerande applikationer, web-applets osv.. Av den anledningen tror jag Java kan vara ett bra startspråk, även om det är onödigt mycket klafs o trams osv.

C# verkar i mina ögon vara vääldigt likt Java, som ett 'förnyat' java. Problemet är; stängt API - utvecklat av Microsoft.. vilket är otroligt tråkigt för ett så lovande språk..

C och C++ känns överdrivet "jobbigt" att lära sig som förstaspråk. Om man kan det väl är det otroligt kraftfullt, om man kan det dåligt blir det bara massa minnesläckor och rent ut sagt ett helvete..

Python har jag hört VÄLDIGT mycket gott om, men aldrig testat själv. Anar att det kan vara ett av dom bästa valen för en nybliven programmerare!

Det jag ville få fram är att Java inte är så dåligt som ni får det att låta, inte för någon som precis ska börja testa på programmering iaf. Att väldigt många företag söker Java/Java EE utvecklare (just nu, verkar börja röra sig mer åt C#?) är ju en bonus också!


   
SvaraCitera

shazbot:

men att koda ett spel eller någon windows-app i Haskell (tror) jag kan vara ett riktigt helvete, och man behöver nog en hel del kunskap (har aldrig försökt skriva någon riktigt applikation i haskell, detta är bara ett antagande..).

Ett felaktigt antagande. Sista laborationen i Chalmers introduktionskurs till funktionell programmering, som f ö är den första kursen alla datavetare läser, är t ex att skriva en grafritande kalkylator. Jag och min labkompis skrev ett visual novel-spel, komplett med bibliotek för att göra modifikationer till det triviala, på ungefär en vecka. (Screenshots: 1, 2; säg till om du vill se källkoden.)

För att testa hur jobbigt det är att skriva ett enkelt spel i Haskell slängde jag ihop den här fåniga saken lite snabbt; du styr den gröna lådan med musen, undvik att bli träffad av de röda lådorna så länge som möjligt. 115 rader (riktigt ful) Haskell inklusive kommentarer. Källkod + binär för x86.

Slutsats: nej, det är inte särskilt svårt.

shazbot:

Men killen är 13 bast och vet knappt vad en funktion är 🙂

Om han inte kan få huvudet runt funktioner har han inte en chans att lära sig objektorientering, än mindre bli en hyfsad programmerare.

shazbot:

Om man då tar Java istället, så kan man efter bara några veckor faktiskt börja bygga fungerande applikationer, web-applets osv..

Det gäller alla moderna språk.

shazbot:

C och C++ känns överdrivet "jobbigt" att lära sig som förstaspråk. Om man kan det väl är det otroligt kraftfullt, om man kan det dåligt blir det bara massa minnesläckor och rent ut sagt ett helvete..

Rättelse: C++ medför alltid minnesläckor, oförklarliga buggar, drastiskt minskad produktivitet jämfört med moderna språk, etc.

shazbot:

Det jag ville få fram är att Java inte är så dåligt som ni får det att låta, inte för någon som precis ska börja testa på programmering iaf.

Java är betydligt sämre än vad vi får det att låta, i synnerhet för nybörjare.


   
SvaraCitera