Kom-pa-TI-bilitet
Vad för Programmeringsspråk ska jag lära mig nu?
Fast de funktioner/metoder som modifierar tillståndet på ett existerande objekt är väl markerade då de slutar med "!"
s="abc"
S = s.capitalize # skapar en ny sträng "ABC"
s.capitalize! # modifierar strängen som 's' refererar till
Det finns en väldigt bra anledning till varför man vill kunna ha "mutable" data: det leder till mycket snabbare algoritmer i vissa lägen. Se t.ex. Clojure där man infört "transient" (mutable state som man får använda inuti en funktion) då det kan bli flera tiopotenser snabbare.
Skulle säga att Ruby är Python "done right" (framförallt OO-delen). Men vill för den delen inte dissa Python som är ett väldigt trevligt språk (och som jag använder relativt i ofta i mitt arbetet).
I min bok är mutable helt ok om det utnyttjas ansvarsfullt. Problemet i Rubys fall är att de strängar som skapas av literaler är muterbara; kodstycket
a = "abc"
b = a
a << "def"
resulterar i b == "abcdef" (referens: http://www.ruby-doc.org/core-1.9.3/String.html)
Hur kan jag förhindra att en strängreferens inte muteras okontrollerat i en annan del av koden?
DOS räknas (enligt åvanstående artikel) som dataintrång
So sue me!
C:\>debug
-e 109 'Hello DOS!',0d,0a,'$'
-rcx
CX 0000
:20
-n hello.com
-a
0C76:0100 mov ah,9
0C76:0102 mov dx,109
0C76:0105 int 21
0C76:0107 int 20
0C76:0109
-w
Skriver 00020 byte
-q
C:\>hello
Hello DOS!
I min bok är mutable helt ok om det utnyttjas ansvarsfullt. Problemet i Rubys fall är att de strängar som skapas av literaler är muterbara; kodstycket
a = "abc"
b = a
a << "def"
resulterar i b == "abcdef" (referens: http://www.ruby-doc.org/core-1.9.3/String.html)
Hur kan jag förhindra att en strängreferens inte muteras okontrollerat i en annan del av koden?
a += "def"
But yes, the in-place syntax is perhaps not super clear on string concatenation..
a += "def"
But yes, the in-place syntax is perhaps not super clear on string concatenation..
Jag kan förhindra det genom att använda en annan metod, men finns det något sätt att försäkra att strängen aldrig byter värde genom någon annans kod?
Att utgå ifrån en omutbar sträng och skapa en sträng-datatyp som är mutable är enkelt, men att göra det omvända verkar omöjligt eftersom basreferensen alltid kan muteras.
Kom-pa-TI-bilitet
Jag kan förhindra det genom att använda en annan metod, men finns det något sätt att försäkra att strängen aldrig byter värde genom någon annans kod?
Att utgå ifrån en omutbar sträng och skapa en sträng-datatyp som är mutable är enkelt, men att göra det omvända verkar omöjligt eftersom basreferensen alltid kan muteras.
Du har (minst två) sätt utöver att undvika "mutuable" metoder
> a="abc".freeze
=> "abc"
irb(main):002:0> a<<"def"
RuntimeError: can't modify frozen String
from (irb):2
from /usr/bin/irb:12:in `<main>'
"freeze" är en envägsfunktion, väl anropad så är objektet ett värde (i stället för bara en identitet) för resten av sitt liv. Det är förklaringen till varför "String" är "mutable" från start i Ruby.
alternativt skapa din egen strängklass som inte har "mutable" metoder / gör strängen "frusen" direkt vid skapandet.
Och om detta är ett så stort problem för dig lär du inte kunna använda språk som C# / Java (eller ens Scala). De må ha strängklasser som inte kan förändras i normalfallet, men väldigt många andra (majoriteten av fallen för C#/Java) tillåter modifiering av objekt av de flesta standardklasser.
Håller dock med om att det finns massor med fördelar att använda värden ("immutable" state) i stället för identiteter ("mutable" state), men är det något språk förutom Clojure som gör det enkelt och ändå hyfsat effektivt att jobba med (Clojure är trots allt rätt mycket långsammare än t.ex. Java trots att båda kör på en JVM)? Och det trots att Clojure just nu har den mest effektiva implementationen av persistent data structures som finns i någorlunda kända språk. Hur många prestandaproblem i C#/Java program är inte orsakade av att folk bygger strängar direkt med '+' operatorn i stället för StringBuilder, så det finns nackdelar också?
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Du har (minst två) sätt utöver att undvika "mutuable" metoder
> a="abc".freeze
=> "abc"
irb(main):002:0> a<<"def"
RuntimeError: can't modify frozen String
from (irb):2
from /usr/bin/irb:12:in `<main>'
"freeze" är en envägsfunktion, väl anropad så är objektet ett värde (i stället för bara en identitet) för resten av sitt liv. Det är förklaringen till varför "String" är "mutable" från start i Ruby.
alternativt skapa din egen strängklass som inte har "mutable" metoder / gör strängen "frusen" direkt vid skapandet.
Och om detta är ett så stort problem för dig lär du inte kunna använda språk som C# / Java (eller ens Scala). De må ha strängklasser som inte kan förändras i normalfallet, men väldigt många andra (majoriteten av fallen för C#/Java) tillåter modifiering av objekt av de flesta standardklasser.
Håller dock med om att det finns massor med fördelar att använda värden ("immutable" state) i stället för identiteter ("mutable" state), men är det något språk förutom Clojure som gör det enkelt och ändå hyfsat effektivt att jobba med (Clojure är trots allt rätt mycket långsammare än t.ex. Java trots att båda kör på en JVM)? Och det trots att Clojure just nu har den mest effektiva implementationen av persistent data structures som finns i någorlunda kända språk. Hur många prestandaproblem i C#/Java program är inte orsakade av att folk bygger strängar direkt med '+' operatorn i stället för StringBuilder, så det finns nackdelar också?
Det är literalen som är problemet, inte mutabilitet i sig som sagt.
Mutabilitet kan tas för givet ur lågnivåperspektiv och många utvecklare tar det även för givet eftersom de är vana vid iterativ programmering. Man kan även vända på steken och se mutabilitet som ett extra ansvarsområde för ett värde; en implicit setter-metod för att använda en väldigt naiv Java-liknelse.
När en literal ger en muterbar datatyp förbinder sig plattformen till ett större ansvar än om datatypen är immutable eftersom det inte går att komma ifrån den extra funktionaliteten.
Scala är inget rent funktionellt språk. Man har ett specifikt nyckelord för variabler som kan ändra värde och man rekommenderas att använda dessa i prestandakritiska områden av kod. Även muterbara datatyper och -strukturer som arrayer används med fördel i dessa situationer. Skillnaden ligger i att man sällan exponerar dessa datatyper utan omvandlar dem till omutbara modeller när de har behandlats klart. På så vis kan man (förhoppningsvis ofta) få det bästa av bägge världar med en förhållandevis liten overhead. Detta är en konvention som möjliggörs av standardramverket och, som jag förstår det, ganska likt "transient"-konceptet i Clojure fast med mer manuell handpåläggning.
Det skulle vara intressant att utveckla ett collection-bibliotek som bygger vidare på dessa idéer
Att man använder + för att konkatenera strängar i C#/Java är antingen av bekvämlighet eller av okunskap; det är inte en defekt i plattformen. Men jag förstår inte riktigt distinktionen mellan C#/Java och Ruby här; Ruby returnerar väl också en ny stränginstans när man konkatenerar med +?
Kom-pa-TI-bilitet
Att man använder + för att konkatenera strängar i C#/Java är antingen av bekvämlighet eller av okunskap; det är inte en defekt i plattformen. Men jag förstår inte riktigt distinktionen mellan C#/Java och Ruby här; Ruby returnerar väl också en ny stränginstans när man konkatenerar med +?
Han syftade inte precis på + och att man inte använder . eller något annat för att sätta ihop strängar då detta är inte en plus operation, utan snarare prestanda problemet som förekommer när du plusar ihop ett par strängar, speciellt i loopar. För i just C# och Java's fall så är de imutable, dvs de måste skapas om varje gång. Gör du detta ett par tusen ggr så kan detta vara grunden till ett prestanda problem.
Att plusa ihop 2 strängar och detta är allt du ska göra så behövs inte stringbuilder o.s.v men ska du fortsätta att göra det så använd stringbuilder då prestanda skillnaden kan vara enorm.
Fixade själv ett projekt med det för några år sedan, tog ca 10 minuter att köra igenom en viss datamängd med den, efter fixen tog det ca 5 sekunder. Enda skillnaden var att istället för att plussa ihop strängar så använde jag strinbuilder.
Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 5090
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck, Rog Ally + de fiesta konsoler.
Han syftade inte precis på + och att man inte använder . eller något annat för att sätta ihop strängar då detta är inte en plus operation, utan snarare prestanda problemet som förekommer när du plusar ihop ett par strängar, speciellt i loopar. För i just C# och Java's fall så är de imutable, dvs de måste skapas om varje gång. Gör du detta ett par tusen ggr så kan detta vara grunden till ett prestanda problem.
Att plusa ihop 2 strängar och detta är allt du ska göra så behövs inte stringbuilder o.s.v men ska du fortsätta att göra det så använd stringbuilder då prestanda skillnaden kan vara enorm.
Fixade själv ett projekt med det för några år sedan, tog ca 10 minuter att köra igenom en viss datamängd med den, efter fixen tog det ca 5 sekunder. Enda skillnaden var att istället för att plussa ihop strängar så använde jag strinbuilder.
Det är jag medveten om. Samma sak gäller för Ruby: http://www.ruby-doc.org/core-1.9.3/String.html#method-i-2B
Kom-pa-TI-bilitet
Scripting? Och vba och excell vad är dessa för något?
Tack
Öppna microsoft office excell och tryck Alt+F11. Sen kan du börja bygga script dom gör allt du kan göra i excel fast automatiserat via t.ex. knappar, vilkor etc.
Citera för lättare svar!
Main: Core i7 3820 3,6GHz @ Corsair H50 - Asus P9X79 - Corsair Vengance 4x4GB 1600mhz -
80GB Intel X25-M G2 - 240GB Corsair Force GS - 3TB HGST HDD - Corsair HX 1000W - Sapphire Radeon R9 290x Tri-X
NAS: Lagring: 6TB RaidZ - Backup: 3TB Raid 1 - FreeNAS 9.3 Uplink: Telia Fiber 100/100
Varsågod, tyckte att någon behövde styra upp det hela lite och ge dig vad du vill ha
Jag jobbar oftast med flera kunder samtidigt, så det gäller ju att prioritera efter deadlines, men det är inget man tänker på utan det kommer man in rätt lätt i.
Jag har en fast lön (inte timlön alltså) så jag får alltid lika mycket i lön oavsett hur mycket jag jobbar. Så det är ju rätt soft, kan ju också jobba hemifrån och så ibland om jag känner för det. Detta får man ju inte utnyttja allt för mycket dock, utan man får se till att hålla bossen nöjd Lönen brukar ligga någonstans emellan 22000-28000 per månad (inkl min), så det är ju inte överdrivet mycket, men det är ju betydligt mer än alla mina kompisar i samma ålder som jobbar på McDonalds Sen får man ju tänka på att det är ett rätt soft jobb. Man sitter på ett kontor med schysta medarbetare som sysslar med samma grejjer, man står ju inte ute i kylan och sliter liksom.
Jag har kört DDOS attacker mot min egna server, det är inte olagligt och kan diskuteras på detta forumet?
PHP är allt annat en designat, det är en drös samling av många metoder av olika standarder. Det finns ingen design alls i PHP, inte heller struktur på något i huvud taget, Finns massvis med metoder som redan gör lika samt lite till som andra metoder, finns metoder.
PHP vart heller inte precis designat för web i åtanke utan det var en samling små metoder för att underlätta att skriva ihop en gästbok som sedan har vuxit.. T.ex. Största bristen är PHP's hantering av UTF-8... De har ingen hantering i huvud taget. Det finns bibliotek för att plåstra på problemen men det löser inte allt. Bra läsning om det ämnet hittar du här http://www.phpwact.org/php/i18n/utf-8 doc löser det inte alla problem men de flesta vanliga i alla fall. Vist de flesta lär aldrig stöta på dessa då de enbart gör sidor för ett litet språk eller av mindre komplex struktur men aja, detta är ändå en allvarlig brist beroende på vad du gör, speciellt för webben.
Sedan andra jobbiga problem är just namn standarder, varför heter str_split just str_split? och strlen just strlen? Vart kom _ ifrån, varför har vissa metoder _ varför har vissa metoder inte _ o.s.v.
Detta har de dock börjat fatta åt andra sidan och börjar röra runt i PHP men det kommer ta dom åratal att fixa alla sina design brister som PHP har.
Men vist PHP kan vara ett bra val att börja med, det är lätt att komma igång t.ex. Men kalla inte PHP designat för web, för PHP är total avsaknad av just design.
DDOS attacker är numera olagliga i Sverige.
prop. 2006/07:66
http://www.idg.se/2.1085/1.105628
Tro mig, de är olagliga.
Tänker dock inte svara på framtida citat...
Ha det!
PHP är visst designat för just webbutveckling, då webbutveckling är det ENDA man kan använda PHP till, så vad föreslår du annars? PHP hanterar UTF-8 alldeles utmärkt bara man vet hur man ska göra, vilket du uppenbarligen inte gör. Ja, att vissa funktioner (inte metoder) har ett understreck i namnet och andra inte måste ju vara något av det värsta som finns inom PHP, eller hur?
DOS räknas (enligt åvanstående artikel) som dataintrång, att DDOS:a sin egen dator skulle då vara olagligt på samma sätt som att hacka sin egen dator (vilket det inte). Skulle man jämföra detta mot den "riktiga" världen så är det inte olagligt att hugga sig själv med en kniv, men är olagligt att hugga andra med kniv.
DOS använd ofta som ett verktyg för att testa hur välbyggd mjukvara man har och liknande, tex hur många requests min webbserver kan ta innan den börjar bli seg och inte kan hantera mer. Att ALL form av DOS skulle vara olagligt vore som att inte tillåta knivar för att vissa använder de för "onska".
Nej, nu tycker jag vi lämnar DDOS, denna tråden handlar om någonting helt annat.
Men eftersom du kan PHP så bra, vill gärna se en implementation i PHP där du löser hantering av t.e.x en string compare där du gämför olika strängar. T.ex. ska den hantera att klara av att jämföra en text med fullwidth karaktärer och halfwidth karaktärer och detta ska ge en match. Notera detta är inte en BYTE compare utan det är en string compare. Om du löser detta så tar jag väldigt emot tipset då du säger att du kan hantera UTF-8. Detta är bara ett av ganska många krångliga UTF-8 problem, Kan ge dig fler om du så önskar då du värkar kunna hantera detta.
Sedan kan man använda PHP till långt mycket mer en web.... Du kan göra desktop applikationer. Det finns inga gränser med vad du kan göra. Bara för att ett språk enbart har en inriktning som standard betyder inte att den inte kan göra annat, och det betyder inte att den gör det bra heller. Du har t.ex. en implementation av dekstop för Windows med PHP här http://winbinder.org/ dock detta är inget vanligt förekommande men som jag sa PHP används inte enbart för web.
Andra saker som används hyfsat är just att skriva skript i PHP för att utföra vissa batch jobb, vist pyton och perl o.s.v är mer vanligt använt för detta men PHP hanterar detta totalt utmärkt. T.ex. har du redan en webbsida eller tjänst skriven i PHP och med bra objekt orienterad struktur kan du lätt skriva batch jobb för att underhålla din data i just PHP och på så vis återanvända kod.
PHP är som du säger ett dåligt designat språk, det betyder dock inte att det är oanvändbart, snarare tvärt om. Facebook är till exempel skrivet i PHP, om än kompilerat till C.
Något jag tycker alla som utvecklar i PHP borde läsa är denna "artikel": http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-des.... Den går igenom några av de riktigt dåligt designade sakerna i PHP, men du borde inte läsa det för att kunna sitta o säga "Fan va PHP är dåligt" eller "Detta är ju bara skitsaker" utan istället för att lära sig. Det är sånna här småsaker som gör just DIG till en expert i PHP. Att lära sig manipulera bilder och skriva ett forum kan i princip vem som helst göra, men att göra det bra är svårare.
Tjurskit! Vi har runt 300 timmar programmering. Plus många många timmar digitalt skapande då vi skapar spel.
1. Det är ingen skillnad mellan att koda eller att programmera? Tror jag.
2. Ett bra gymnasium är LBS skolorna, finns i 12 orter i Sverige, har extremt bra undervisning och många tekniska linjer att välja mellan som till exempel arkitektur och spelutveckling.
3. Systemutveckling gör hemsidor, appar och program, spelutvecklare gör spel.
Svarar på det jag kan något om:
2. Java är ett programmeringsspråk som kan användas till lite av varje.
6. Klart det går att programmera utan en Android mobil, det är bara att skriva program för något annat, t.ex. PC.
Varför är det mer värt att gå natur? Teknik kommer in på högskola/universitet, så varför ha biologi 200 timmar i veckan för att kunna programmera i framtiden, när man kan gå teknik, och faktiskt hålla på med programmering i tre år, för att sedan fortsätta på högskola/universitet?
Jo visst, du kan säkert komma in på KTH eller Chalmers med din natur inriktning om du nu vill det, men man kan komma in på ett vettigt universitet med en teknisk utbildning.
Jag har också läst natur med inr. matte/data och valde till mycket programmering. Så är absolut inte emot att läsa programmering på gymnasienivå. Utan att, som du säger, studera programmering på högre nivå resulterar i en bättre grund.
Visst, om man nu ser till att läsa teknik så att det går att plugga vidare. Jag tycker att det är bra att kunna ha möjligheten att läsa på en utbildning som kan ge en master. Det ger fler valmöjligheter efter gymnasiet och sedan i arbetslivet. Biologin är allmänbildande, den är inte heller speciellt svår på gymnasienivå.
Alla tekniklinjer idag är högskoleförberedande, för fan, det är större delen av gymnasie linjerna idag.
Men man kanske inte vill ha fler möjligheter? Efter teknik så kan du välja det mesta, kan hända att du måste välja till matematik D.
Det handlar inte om svårigheten på biologin, det handlar om att det är så _jävla_ mycket på en och samma gång, vilket jag glädjer mig över att jag inte har.
Det är inte olagligt att snacka om DDOS-attacker.
Felquote?
Det är inte olagligt att diskutera fildelning heller... Jag tycker att det helt enkelt inte hör hemma här att diskutera saker som DDOS som är till för att förstöra.
Först måste jag bara fråga vad "genvägar i språkstrukturen" är. Och vad är ett "brett" språk?
Dessutom, varför tycker du PHP är bättre än Ruby (on Rails)? Kan du Ruby, Java, Python, C#, osv?
Nu har jag inte följt diskussionen, men det kan vara intressant att diskutera även om det "är till för att förstöra".
Jag förstod bara inte vem det var du citerade, mig veterligen har det inte funnits någon diskussion ang. DDOS.
Är väl lite OT, men enligt min mening finns DDOS bara till för att förstöra. Man kan väl diskutera att det kan användas i ett gott syfte, men isåfall det kan ett vapen också användas i gott syfte.
Ljud och bild skolan, har "Spelutveckling" och "Systemutveckling".
Kolla på www.lbs.se för att se vilken stad som är närmast.
Som elev på en LBS skola kan jag inte säga något annat än att de andra lokala skolorna pratar strunt om våran för de är avundsjuka.
Och alla som kommit hälsat på har velat byta till våran skola, är jätte nöjd med den och man får en fet dator också.
Java växer stort inom mobila enheter (notera att jag inte skrev telefoner). Annars kan man ju även lära sig Objective C men då är man lite mer bunden mot smartphones/Mac.
*Tråd rensad*
Personangrepp och svar på dessa borttagna.
Finns en anledning varför jag inte länkar den guide också, mycket där stämmer, men också mycket där stämmer inte alls ( eller längre ) så tycker inte den är precis ett bra grund till alla problem PHP har så som sagt va mycket är felaktigt även om mycket är rätt.
Sedan vill jag punktera att nog kan jag PHP, har utvecklat i det i över 10 år. Skrivit ganska tunga saker under PHP också, dock i dagsläget gör jag ingen ny utveckling i PHP alls, enbart underhåll på grund av de krav vi har på mig och brister i språket. Men vist finns saker jag i dagsläget fortfarande hade skrivit i PHP om jag hade gjort dom.
[QUOTE=Yoshman;13366681]En enkel "hello world" webbserver skrivet i JavaScript
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello world!');
}).listen(8080);
Starta via node.js (ett väldigt populärt ramverk för server-side Java-script som kan användas till att skapa sidor som kan hantera enorm last). Du kan nu "surfa" in på port 8080 och får då en sida med texten "Hello world!". Använder man "cluster" modulen i node.js är det relativt enkelt att skapa server-programvara som skalar brutalt bra på många CPU-kärnor, det är svårt att skriva ett C++/Java/C# program som är lika bra framförallt om servern har flera CPU-socklar.
Enkelt program i PHP5
<?php
function fib($n) {
if ($n < 2)
return $n;
return fib($n-1) + fib($n-2);
}
$n = 30;
echo "fib(" + $n + ") = " + fib($n) . "\n";
?>
Kör via PHP CLI
$ php hello.php
fib(30) = 832040
JavaScript är ett språk som bl.a. används för client-side scripting i webbsidor, men det används även för server side scripting bl.a. av LinkedIn & Microsoft (node.js stöds i Azure).
PHP5 kan används som vilket språk som helst, även för att skriva "vanliga" program. Men kan tänka mig rätt många språk som är bättre lämpade för "vanliga" program, Ruby och Python för att nämna två alternativ.
Och angående Java som utdöende språk... Java och C är de två överlägset mest använda språket idag, båda dessa är långt vanligare än t.ex. C# (som dock är väldigt vanligt i Sverige). Java används dels i högpresterande servers men är också det språk som de flesta Android-applikationer utvecklas i (och det går rätt bra för Android just nu). Skulle säga att Java är ett väldigt lämpligt språk att starta med då det är ett lättare språk än t.ex. C++ och C#, men det är också en plattform som fungerar på alla populära OS.
Edit: Beskrivning av statist vs dynamiskt typade språk som gjordes ovan var inte helt korrekt.
Det första man ska inse är att typ-system klassas i två riktningar
statiskt <-> dynamiskt
start <-> svagt
många blandar ihop dessa koncept och beskriver dynamiskt typade språk som svagt typade. Dessa två koncept är ortogonala, statiskt/dynamiskt är (nästan) helt binärt medan start/svagt är mer gradvis.
I ett statiskt typat språk måste alla typer vara kända vid kompileringstillfället, endera genom att man explicit talar om typen (som krävs i t.ex. Java) eller att kompilatorn kan lura ut vilken typ det måste vara (Haskell fungerar så, i C# och C++11 kan man skriva "var" resp, "auto" för att specificera att kompilatorn ska lura ut typen).
Java:
void foo(int x) {
System.out.println(x);
}
foo(1); // ok
foo("kalle"); // kompilerar inte då det är fel typ
I ett dynamiskt typat språk räcker det om typen är känd först när programmet körs, en viss variabel/parameter kan under programmets livstid ha olika typ.
Python:
def foo(x):
print x
foo(1) # ok, formella parametern 'x' är ett heltal
foo("kalle") # ok, formella parametern 'x' är nu en sträng
I ett starkt typat språk går det inte att använda typ A i lägen där typ B krävs (undantaget är om A är en undertyp av B).
Ex: Python x=1+"1" # blir ett fel då 1 och "1" är olika typer
I svagt typade språk görs ofta försök att "automatiskt" konvertera en eller flera av variablerna till någon typ som gör att operationer blir "vettig".
Ex: PHP $x=1+"1"; # blir 2 då "1" först konverteras till siffran 1
Exempel på starka & statiskt typade språk: Haskell, Java, C++, C#(i alla fall innan någon festade till och uppfann "dynamic" som är nära nog lika illa som void* i C)
Exempel på svaga & statiskt typade språk: C (t.ex. alla pekartyper är implicit konverterbara till void* och vice versa, görs ingen skillnad på "enum" och heltal)
Exempel på svaga & dynamiskt typade språk: PHP, Perl
Exempel på starkt & dynamiskt typade språk: Ruby, Python, Clojure
Sedan finns det ett språk som inte riktigt kan bestämma sig: ObjC. Det är dels svagt/statiskt p.g.a. att det är ett strikt super-set av C, men det är också dynamiskt typat (lite osäker på vart man ska lägga styrkan) i sitt arv från SmallTalk...[/QUOTE]
Vet inte hur jag hamnade i denna tråd men jag var tvungen att skapa ett konto för att påpeka att Ruby är ett underbart språk och PHP är djävulen Lär dig Ruby och du kommer älska programmering.
Tack för mig!
Ruby har mutable strings. Det får mig att rysa.. (inte av välbehag)
[QUOTE=Yoshman;13366896]Fast de funktioner/metoder som modifierar tillståndet på ett existerande objekt är väl markerade då de slutar med "!"
s="abc"
S = s.capitalize # skapar en ny sträng "ABC"
s.capitalize! # modifierar strängen som 's' refererar till
Det finns en väldigt bra anledning till varför man vill kunna ha "mutable" data: det leder till mycket snabbare algoritmer i vissa lägen. Se t.ex. Clojure där man infört "transient" (mutable state som man får använda inuti en funktion) då det kan bli flera tiopotenser snabbare.
Skulle säga att Ruby är Python "done right" (framförallt OO-delen). Men vill för den delen inte dissa Python som är ett väldigt trevligt språk (och som jag använder relativt i ofta i mitt arbetet).[/QUOTE]
Hej alla, Sitter på ett café i Norge, har inte haft internet på hela veckan, Läste igenom tråddel 3 och ska titta på LBS skolorna, Kommer hem på söndag och om jag inte har svarat då får jag be om ursäkt, Ha det bra:)
Motivera?
Java körs på över en miljard enheter, även om språket skulle dö ut så kommer det ta väldigt lång tid att byta ut samtliga system.
Det är ett väldigt bra språk om du inte ska syssla med "prestandakritisk" programmering.
Vill du göra appar till android så är det java som gäller.
Jag skulle rekommendera C++, kan du det så är det relativt enkelt att lära sig Java eller C# senare.
Java skalar otroligt mkt bättre än vad många tror och bör inte uteslutas pga "prestandakritisk" programmering. Vi gjorde ett skalningstest mellan java och C/C++ för några år sedan och java vann den fighten. Värt att notera är att det var en kille från Massive som skrev C/C++ programmet.
OT har jag tyvärr inte mkt att säga.. Jag har jobbat i C/C++, Java och Perl samt pluggat C#. För mig är dock programmeringen ett verktyg för att få jobba med cool hårdvara så jag trivs bäst med C. För tillfället kodar jag i C i Linux kernel och leker med senaste snapdragon hårdvaran
/Knight
Idag kom Athlon64
1. Det är ingen skillnad mellan att koda eller att programmera? Tror jag.
2. Ett bra gymnasium är LBS skolorna, finns i 12 orter i Sverige, har extremt bra undervisning och många tekniska linjer att välja mellan som till exempel arkitektur och spelutveckling.
3. Systemutveckling gör hemsidor, appar och program, spelutvecklare gör spel.
Fick låna dator ikvæll(Norsk)
Ska titta mer på LBS skolorna verkar riktigt bra, Funderar øver en sak, Om du går færdigt Gymnasiet på LBS, På inriktingen Webbutvecklare/Systemutecklare, Ær du klar før jobb eller behøver du gå på Høgskola/Unerversitet?
En till fråga ær om du går på Webb/systemutvecklare lær du dig att gøra Appar så som spel??
Svarar på det jag kan något om:
2. Java är ett programmeringsspråk som kan användas till lite av varje.
6. Klart det går att programmera utan en Android mobil, det är bara att skriva program för något annat, t.ex. PC.
Tack:D
Nej, det är just det det inte är. På högskola/universitet gås allt igenom snabbare och bättre(oftast). Det är, enligt mig i alla fall, mycket mer värt att läsa natur på gymnasiet och sedan ta programmering på högskola/universitet.
Vænlingen motivera dig lite mer?, Skulle vara sjukt snællt av dig.
Jag har läst natur med matematik och datainriktning. Idag studerar jag till civilingenjör i datateknik. Min uppfattning är den att det är onödigt att läsa programering i gymnasienivå. Programeringen på universitet ger mycket god teoretisk och praktisk kunskap, till skillnad från programeringen på gymnasiet som knappt introducerar vad programering är.
Programering på gymnasiet är dock bra då det är kul och mycket enkelt att prestera MVG på.
Så du tycker man ska skippa programmering på gymnasium ?, Vad ska jag satsa på istællet?, Du får tænka så att om du har goda kunskaper på programmering i tidig ålder så gynnar det dig oftast senare?
Java skalar otroligt mkt bättre än vad många tror och bör inte uteslutas pga "prestandakritisk" programmering. Vi gjorde ett skalningstest mellan java och C/C++ för några år sedan och java vann den fighten. Värt att notera är att det var en kille från Massive som skrev C/C++ programmet.
OT har jag tyvärr inte mkt att säga.. Jag har jobbat i C/C++, Java och Perl samt pluggat C#. För mig är dock programmeringen ett verktyg för att få jobba med cool hårdvara så jag trivs bäst med C. För tillfället kodar jag i C i Linux kernel och leker med senaste snapdragon hårdvaran
/Knight
Flera av världens största och snabbaste aktiebörssystem är utvecklade i Java, t.ex. NASDAQ. De har en latency på nedåt 100 mikrosekunder och enorm throughput. C++ är meckigare än Java, och Java ger ungefär lika bra prestanda idag.
Teoretiskt så kan Java ge ännu bättre prestanda än C++, pga Java är adaptivt optimerande. Dvs, när du kompilerar C++ så görs optimeringen precis vid kompileringen. Men, när du kör ett Java program, så optimeras det hela tiden medan du kör det, så t.ex. kanske Java VM upptäcker att din cpu har en viss maskinkodsinstruktion och kommer då att slå på den instruktionen. Detta kan inte C++ göra, eftersom binärkoden optimeras inte hela tiden. Så ett Java program kommer optimeras gång på gång, tills det körs fort som f-n, medan C++ inte optimeras alls.
C++ program brukar inte slå på konstiga maskinkodssinstruktioner, som t.ex. snabbar upp grafik och ljud och vektorinstruktioner. Istället är C++ program bara rena och raka, och använder bara minsta gemensamma nämnare som alla cpuer har. Java anpassar sig till varje cpu, och kan använda alla möjliga konstiga funktioner i cpun.
Slutsatsen är att Java är grymt snabbt idag, och i framtiden kan det mycket väl gå om C++ i prestanda.
PHP är visst designat för just webbutveckling, då webbutveckling är det ENDA man kan använda PHP till, så vad föreslår du annars? PHP hanterar UTF-8 alldeles utmärkt bara man vet hur man ska göra, vilket du uppenbarligen inte gör. Ja, att vissa funktioner (inte metoder) har ett understreck i namnet och andra inte måste ju vara något av det värsta som finns inom PHP, eller hur?
Du kan skriva program med PHP även om det inte är lika optimalt som kanske i andra språk. Som ett slarvigt exempel, när du skriver Unit Test i PHP för PHP så är det sällan en webbapplikation du skriver.
I min bok är mutable helt ok om det utnyttjas ansvarsfullt. Problemet i Rubys fall är att de strängar som skapas av literaler är muterbara; kodstycket
a = "abc"
b = a
a << "def"
resulterar i b == "abcdef" (referens: http://www.ruby-doc.org/core-1.9.3/String.html)
Hur kan jag förhindra att en strängreferens inte muteras okontrollerat i en annan del av koden?
a = "abc"
b = a.dub # Make an copy of a for b
a << "def"
a # => "abcdef"
b # => "abc"
Projekt:Dual Comp
a = "abc"
b = a.dub # Make an copy of a for b
a << "def"
a # => "abcdef"
b # => "abc"
Visst, det går att göra en defensiv kopia av strängen innan man gör något med det, men då har man samtidigt förlorat eventuell vinst av att ha muterbara strängar till att börja med.
a = "hello!"
b = add_smiley(a)
add_smiley:
def add_smiley(text)
text + " :)"
end
I exemplet ovan sker en defensiv kopiering av indatan, men funktionen hade lika gärna kunnat göra text.concat(" :)"). Vems ansvar är det att kopiera defensivt; funktionen eller anroparen av funktionen?
Kom-pa-TI-bilitet
Flera av världens största och snabbaste aktiebörssystem är utvecklade i Java, t.ex. NASDAQ. De har en latency på nedåt 100 mikrosekunder och enorm throughput. C++ är meckigare än Java, och Java ger ungefär lika bra prestanda idag.
Teoretiskt så kan Java ge ännu bättre prestanda än C++, pga Java är adaptivt optimerande. Dvs, när du kompilerar C++ så görs optimeringen precis vid kompileringen. Men, när du kör ett Java program, så optimeras det hela tiden medan du kör det, så t.ex. kanske Java VM upptäcker att din cpu har en viss maskinkodsinstruktion och kommer då att slå på den instruktionen. Detta kan inte C++ göra, eftersom binärkoden optimeras inte hela tiden. Så ett Java program kommer optimeras gång på gång, tills det körs fort som f-n, medan C++ inte optimeras alls.
C++ program brukar inte slå på konstiga maskinkodssinstruktioner, som t.ex. snabbar upp grafik och ljud och vektorinstruktioner. Istället är C++ program bara rena och raka, och använder bara minsta gemensamma nämnare som alla cpuer har. Java anpassar sig till varje cpu, och kan använda alla möjliga konstiga funktioner i cpun.
Slutsatsen är att Java är grymt snabbt idag, och i framtiden kan det mycket väl gå om C++ i prestanda.
Nja, det är rätt mycket konstigheter här. När ett C++-program kompileras så anger man vilken "target platform" man vill kompilera för. På mitt jobb så har många kunder gammal hårdvara så vi kompilerar för WinXP med x86 Pentium Pro eller bättre. Men det går som sagt att ange andra CPUer eller nyare OS också.
Vad gäller Java: Först kompileras källkoden till Bytekod, en gång. Denna kod kan beskrivas som nån slags mellankompromiss mellan alla processorarkitetkurer. Sedan tolkas bytekoden till native CPUn, mha Java Runtime. Denna andra kompilering kan ske mer eller mindre effektivt, och kan snabbas upp med JIT, som jag tror att du är ute efter när du pratar om att "Java kompileras flera gånger".
Java är hyggligt effektivt och mycket bättre idag än på 90-talet, framförallt för att man utvecklar Java Runtime mycket på de vanligaste plattformarna. Men jag har väldigt svårt att tro att det skulle kunna "gå om" C++. Det ligger alltid en prestandaförlust i att javan inte är färdigkompilerad native för målplattformen när ett javaprogram startas. Det ligger alltid en prestandaförlust i att java alltid jobbar med referenser och inte med rådata. Det ligger alltid en prestandaförlust i att java har en skräpinsamlare som måste köras regelbundet istället för att programmet självt friar upp resurser vid rätt tillfälle.
Java är ett trevligt språk som man kan göra mycket med. Titta t.ex. på alla appar och spel som finns till android. De jag känner som jobbar med java idag brukar skriva serverkod, mest för att java gör att köra på vilken sorts server som helst (plattformsoberoende). Men vill man jobba hårdvarunära så är C eller C++ överlägset, detta gäller även för tidskritiska tillämpningar, extrema 3D-spel, drivrutiner osv.
Motivera?
Java körs på över en miljard enheter, även om språket skulle dö ut så kommer det ta väldigt lång tid att byta ut samtliga system.
Det är ett väldigt bra språk om du inte ska syssla med "prestandakritisk" programmering.
Vill du göra appar till android så är det java som gäller.
Jag skulle rekommendera C++, kan du det så är det relativt enkelt att lära sig Java eller C# senare.
Det här tycker jag var ett rätt bra råd. Om man kan C++ hyggligt så är det en enkel match att lära sig java eller C#. Däremot så är omvändingen inte sann, alltså javaprogrammerare och C# programmerare som försöker sig på C++ brukar bli otroligt förvirrade åtminstone inledningsvis.
I C++ får man mycket hjälp av att allt är väldigt konsekvent uppbyggt och namngivet.
Exempelvis:
I C# så är en namnrymd en samling med klasser. I C++ så är en namnrymd en samling med namn/identifierare.
I C++ så finns det pekare, och det finns det pekare, och det finns funktioner. En pekare till en funktion kallas i C++ en funktionspekare. I C# kallas en pekare till en funktion för en "delegate".
I C++ så kan man "ärva" kod (medlemsdata och medlemsmetoder) från en annan klass, detta hänger ihop med objektorientering. Oavsett vad man skall ärva så använder man alltid samma skrivsätt, och man kan ärva från hur många klasser som helst, och man kan ärva vilken typ av medlemmar som helst (även tomma deklarationer).
I Java och C# så får man bara ärva från enda klass. Det finns restriktioner på vad man får ärva. Om man vill ärva tomma deklarationer så kallas det istället för "Interfaces" och räknas som en separat och annorlunda mekanism.
I exemplet ovan sker en defensiv kopiering av indatan, men funktionen hade lika gärna kunnat göra text.concat(" :)"). Vems ansvar är det att kopiera defensivt; funktionen eller anroparen av funktionen?
Lösningen är trivial i Ruby: om du vill att din sträng ska vara ett värde, anropa "freeze" i samband med skapandet av strängen. Detta är både elegant och konsekvent då "freeze" kan anropas på precis vilket typ (inte bara strängar) som helst och därmed göra instansen "immutable". Och då "freeze" är en envängsfunktion så måste saker starta i "mutable" tillstånd om man överhuvudtaget vill tillåta detta, vilket man typiskt vill av effektivitetsskäl.
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Lösningen är trivial i Ruby: om du vill att din sträng ska vara ett värde, anropa "freeze" i samband med skapandet av strängen. Detta är både elegant och konsekvent då "freeze" kan anropas på precis vilket typ (inte bara strängar) som helst och därmed göra instansen "immutable". Och då "freeze" är en envängsfunktion så måste saker starta i "mutable" tillstånd om man överhuvudtaget vill tillåta detta, vilket man typiskt vill av effektivitetsskäl.
Så om jag inte misstar mig måste man då alltid kontrollera om en sträng är frusen innan man anropar muterande funktioner på den. Jag vet inte om jag tycker det är en vettig lösning och får samma känsla över att kunna frysa arbiträra objekt.
Kom-pa-TI-bilitet
Så om jag inte misstar mig måste man då alltid kontrollera om en sträng är frusen innan man anropar muterande funktioner på den. Jag vet inte om jag tycker det är en vettig lösning och får samma känsla över att kunna frysa arbiträra objekt.
Allt kommer ner till att man måste göra kompromisser, tycker personligen att Ruby gör en kompromiss här som är väldigt konsekvent samt enkelt att förklara/förstå.
Om du har en typ i Python/Java/C# som har metoder som förändrar tillståndet och de som inte förändrar tillståndet, hur säkerställer du då att ingen ändrar tillståndet på ett sätt som pajar något antagande du gör om tillståndet? Du gör en defensiv kopia, är det bättre/sämre än freeze?
I Ruby kan du alltid välja att enbart anropa metoder som inte förändrar tillståndet, då har du effektivt fått beteendet från Clojure (vilket är trevligt) men även prestandaegenskaperna (vilket i vissa lägen är mindre trevligt). Till en mindre grad gäller detta även Scala och nästan den enda anledningen till att ett typiskt Java program är snabbare än ett motsvarande typiskt Scala är att Scala normalt sätt använder "persistent data types" som skapar mer "skräp" (objekt som inte längre kan nås) när man bygger upp strukturerna. I teorin är "persistent data types" på alla sätt överlägset "mutable data types", men i praktiken måste man rätt ofta ta hänsyn till effektiviteten också.
På vilket sätt är valet man gjort i C#/Java bättre? Där är vissa typer "immutable" medan andra inte är det. För de som är "immutable", t.e.x strängar, så måste alla programmerare vara medveten om detta och använda andra metoder för att effektivt bygga strängar (StringBuilder). Inget större fel med denna lösning heller, men är den inte svårare att förklara för någon?
C++ har en ganska elegant lösning där man kan returnera en referens till en instans där själva referensen är markerad const. Alla metoder som inte förändrar tillståndet kan man markera som const metoder. Det är då möjligt att ha en typ med både metoder som förändrar tillståndet och de som inte förändrar tillståndet. Vill man säkerställa att instansen inte ändras av den som får en referens till den så ger man en referens som är markerad const. Effekten är snarlik den man får med "freeze", men fördelen i C++ är att eventuellt felaktig användning (anrop av "mutable" metod på "immutable" referens) ger ett kompileringsfel i stället för run-time fel.
Så det finns många lösningar, alla med sin beskärda del av fördelar och nackdelar. Själv gillar jag stark saker som är konsekventa, även om det ibland orsakar lite vassa kanter. Är det konsekvent är det i alla fall lätt att förklara, så Ruby, Clojure, Erlang m.fl. är alla bra, då alla är väldigt konsekventa även om de löser problemet olika.
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Hej SaP! Kul att du är intresserad av programmering. Du bör börja med HTML/HTML5/CSS och bemästra dessa språk. Sedan kan du gå vidare till något jag rekommenderar alla nybörjade, nämligen http://polserver.com/ (eScript). Tyvärr har alltför få hört talas om Ultima Online (som mer eller mindre byggde upp hela MMORPG-branschen). eScript är en förenklat version av C#, sätt upp en Ultima Online server till dig och dina vänner, börja scripta lite enkelt och ha samtidigt kul med dina kompisar. När du börjar få koll på eScript går du sedan över till PHP/MySQL för att sedan köra Java/C++ med mera. Ha det så bra!
Med vänliga hälsningar,
Robin Viktorsson
Lär dig några språk som är (ganska) oberoende av vilket operativ du använder, och som inte är alltför lika varandra.Något i stil med Python, Java, Javascript är bra exempel som sådant. Kanske C samt C++ istället för Python o Java. C# är väldigt bundet till just Windowsmiljön, och därmed lite begränsat där - Java o C# är också väldigt lika varandra. C++ är ganska tufft att börja med, men mycket kraftfullt. Just Python och Java tror jag är bra "kom-igång-språk" som man också kan jobba professionellt med. Javascript är ett måste att behärska idag för en utvecklare,
Sedan är det bra att komplettera med något funktionellt, men ingen brådska - skynda långsamt med antalet språk.
En gammal men fortfarande aktuell artikel : http://norvig.com/21-days.html
"Your opionions may differ"
Flera av världens största och snabbaste aktiebörssystem är utvecklade i Java, t.ex. NASDAQ. De har en latency på nedåt 100 mikrosekunder och enorm throughput. C++ är meckigare än Java, och Java ger ungefär lika bra prestanda idag.
Teoretiskt så kan Java ge ännu bättre prestanda än C++, pga Java är adaptivt optimerande. Dvs, när du kompilerar C++ så görs optimeringen precis vid kompileringen. Men, när du kör ett Java program, så optimeras det hela tiden medan du kör det, så t.ex. kanske Java VM upptäcker att din cpu har en viss maskinkodsinstruktion och kommer då att slå på den instruktionen. Detta kan inte C++ göra, eftersom binärkoden optimeras inte hela tiden. Så ett Java program kommer optimeras gång på gång, tills det körs fort som f-n, medan C++ inte optimeras alls.
C++ program brukar inte slå på konstiga maskinkodssinstruktioner, som t.ex. snabbar upp grafik och ljud och vektorinstruktioner. Istället är C++ program bara rena och raka, och använder bara minsta gemensamma nämnare som alla cpuer har. Java anpassar sig till varje cpu, och kan använda alla möjliga konstiga funktioner i cpun.
Slutsatsen är att Java är grymt snabbt idag, och i framtiden kan det mycket väl gå om C++ i prestanda.
Börjar med det sista: håller helt och fullt med, prestanda i Java är sedan Java6 extremt bra. Java6/7 är i många fall helt i nivå med C/C++ program och i genomsnitt så är Java betydligt snabbare än C#/.Net som saknar finesser som re-JIT (har bara JIT), escape analysis, m.fl.
Som redan nämns så är det inte på Java-koden som man kör JIT och hotspot "re-JIT" utan på bytekoden. När saker kompilerats till bytekod så har en hel del information om programmet redan gått förlorat. Om JIT/re-JIT var helt överlägset så skulle man bara kompilera C++ till bytekod (finns sådana kompilatorer) och köra det. Eller så kompilerar man C++ t.ex. till PPC/MIPS-assembler (båda dessa arkitekturer anses vara väldigt väldesignade) och sedan kör man "JIT" till underliggande CPUn.
Men så gör man inte då det i praktiken blir långsammare (fast typiskt inte med stor marginal, man kan nå 90-95% av "native" hastighet) och framförallt långt mycket mer resurshungrig. Kolla hur mycket RAM en hotspot optimerande JVM vill ha för att fungera optimalt, det handlar om 100-tals MB.
C++ har en fördel som få andra språk har: template meta-programming. Fördelen med detta över vanlig OO-programming är att kompilator har långt många fler möjliga optimeringar, funktioner som anropar andra funktioner i många led kan i vissa lägen helt optimeras bort och kompilator gör en enda stor funktion utan funktionsanrop (man kan skriva sådan kod direkt, men strukturen på ett sådant program blir typiskt en katastrof). Anledningen till att std::sort är snabbare än qsort() i C eller sort i Java/C# beror på att de senare implementationerna använder hopp via en funktionspekare (funktionspekare/virtuell metod) medan C++ använder sig av templates och kompilatorn kommer skapa de statiska funktioner som behövs för den typ man sorterar och alla anrop blir därmed direkta. Moderna CPUer som kör med "out-of-order execution" blir mycket mer effektiv när hoppen är explicita då det inte krävs någon spekulation i vart man ska hoppa.
Du har i teorin rätt om att en JVM kan använda alla instruktioner på den underliggande CPUn. I praktiken är det C/C++ som oftare drar nytta av de i form av att prestandakritiska bibliotek byggs specifikt för den underliggande arkitekturen och det finns tillägg till bl.a. Intels C/C++ kompilator som gör det mycket enklare att använda SSE/AVX. GCC och MSVC kan idag automatiskt dra nytta av heltalsfunktioner i SSE/AVX för att optimera loopar. I praktiken så utför inte JVM:erna någon autovektorisering, tittar man på formatet på bytekoden så inser man snabbt att det skulle vara extremt svårt att lura ut från den vad som kan vektoriseras.
Och att Java används i prestandakritiska nätverksapplikationer är inte heller så konstigt. Kör man med Java NIO så har man en extremt tunn wrapper ovanpå OSet, i Linux kan man använda finesser som epoll via NIO select, vilket är exakt samma anrop som ett C/C++ kommer att använda. Majoriteten av alla cykler spenderas i OS-kärnan (nätverksstacken) i dessa applikationer, så valet av språk/runtime-plattform blir inte speciellt viktigt mer än att man kommer åt "rätt" OS-funktioner. Ett börssystem är inte heller ett "hårt realtidssystem", så man är bara ute efter genomsnittlig låg latens. Det C/C++ även kan ge, men GC språk som Java/C# inte kan, är garanterade svarstiden.
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Visst, det går att göra en defensiv kopia av strängen innan man gör något med det, men då har man samtidigt förlorat eventuell vinst av att ha muterbara strängar till att börja med ett exempel.
a = "hello!"
b = add_smiley(a)
add_smiley:
def add_smiley(text)
text + " :)"
end
I exemplet ovan sker en defensiv kopiering av indatan, men funktionen hade lika gärna kunnat göra text.concat(" :)"). Vems ansvar är det att kopiera defensivt; funktionen eller anroparen av funktionen?
Det är ditt ansvar som utvecklare att kopiera och förstå vad ruby gör här. Jag ska se om jag lyckas förklara på ett vettigt sett.
# Ditt exempel ovan är ungefär detsamma som att skriva
b = a + " :)"
# eller
b = a
b += " :)"
# Om det är en metod eller inte spelar alltså ingen roll. Du skapar ett nytt objekt enligt ovan.
a = "abc"
b = a
a.object_id # => 70135960936840
b.object_id # => 70135960936840
# a och b går nu till samma object
a << "def" # lägger till "def" till objectet och påverkar då både a och b
a += "def" # (a = a + "def") skapar ett helt nytt object och påverkar därför endast a
Kan rekommendera att du öppnar upp en ruby terminal och leker lite med olika sätt att skapa och ändra variabler och inspekterar object_id regelbundet för att få en bättre förståelse över vad som ändrar objektet och vad som skapar nya objekt
Projekt:Dual Comp
Allt kommer ner till att man måste göra kompromisser, tycker personligen att Ruby gör en kompromiss här som är väldigt konsekvent samt enkelt att förklara/förstå.
Om du har en typ i Python/Java/C# som har metoder som förändrar tillståndet och de som inte förändrar tillståndet, hur säkerställer du då att ingen ändrar tillståndet på ett sätt som pajar något antagande du gör om tillståndet? Du gör en defensiv kopia, är det bättre/sämre än freeze?
I Ruby kan du alltid välja att enbart anropa metoder som inte förändrar tillståndet, då har du effektivt fått beteendet från Clojure (vilket är trevligt) men även prestandaegenskaperna (vilket i vissa lägen är mindre trevligt). Till en mindre grad gäller detta även Scala och nästan den enda anledningen till att ett typiskt Java program är snabbare än ett motsvarande typiskt Scala är att Scala normalt sätt använder "persistent data types" som skapar mer "skräp" (objekt som inte längre kan nås) när man bygger upp strukturerna. I teorin är "persistent data types" på alla sätt överlägset "mutable data types", men i praktiken måste man rätt ofta ta hänsyn till effektiviteten också.
På vilket sätt är valet man gjort i C#/Java bättre? Där är vissa typer "immutable" medan andra inte är det. För de som är "immutable", t.e.x strängar, så måste alla programmerare vara medveten om detta och använda andra metoder för att effektivt bygga strängar (StringBuilder). Inget större fel med denna lösning heller, men är den inte svårare att förklara för någon?
C++ har en ganska elegant lösning där man kan returnera en referens till en instans där själva referensen är markerad const. Alla metoder som inte förändrar tillståndet kan man markera som const metoder. Det är då möjligt att ha en typ med både metoder som förändrar tillståndet och de som inte förändrar tillståndet. Vill man säkerställa att instansen inte ändras av den som får en referens till den så ger man en referens som är markerad const. Effekten är snarlik den man får med "freeze", men fördelen i C++ är att eventuellt felaktig användning (anrop av "mutable" metod på "immutable" referens) ger ett kompileringsfel i stället för run-time fel.
Så det finns många lösningar, alla med sin beskärda del av fördelar och nackdelar. Själv gillar jag stark saker som är konsekventa, även om det ibland orsakar lite vassa kanter. Är det konsekvent är det i alla fall lätt att förklara, så Ruby, Clojure, Erlang m.fl. är alla bra, då alla är väldigt konsekventa även om de löser problemet olika.
Tack för ett bra svar! Jag kan hålla med om att det är en smaksak, uppenbarligen är många väldigt nöjda med Ruby. Men jag har lite svårt att förstå den här kompromissen, det känns som att man målar in sig i ett hörn.
Jag vill återigen passa på att understryka att jag inte har ett problem med muterbara typer i sig. Det är att man har valt att göra en literal muterbar som jag menar är ett misstag, eftersom det inte går att komma ifrån. Det finns ingen literal för en omutbar sträng. En fryst sträng är fortfarande en muterbar sträng, fast en som slänger exceptions när man försöker modifiera den.
Mycket kommer sig av att Ruby är ett dynamiskt språk. Hade man haft en statisk typechecker så hade man inte kunnat skicka en fryst sträng till en metod som krävde en ofryst, men det hade fortfarande gått att frysa en sträng bortom en användares kontroll, eftersom strängar är "mutable by design."
En annan effekt av denna design (av all design där sideffekter i form av okontrollerad mutation uppmuntras) är fördröjda fel till följd av att ett state man tog för givet har ändrats utanför ens kontroll. Man måste misstro alla tredjepartsmetoder som anropas innan man med säkerhet vet vad de gör, vilket resulterar i defensiv kopiering och mer garbage.
En bättre modell hade varit att separera mutable och immutable i standardbiblioteket, precis som man har gjort med Javas String kontra StringBuilder. Detta är en av ett fåtal idéer jag tycker att man fått rätt från början (även om man tidigare använde StringBuffer istället för StringBuilder..). I Scala har man gått ett steg längre och delat collections-biblioteket i separata grenar: collection.mutable och collection.immutable: http://www.scala-lang.org/api/current/index.html#scala.collection.package
Jag upplevde aldrig att Javas String-typ var ett problem innan jag helt hade greppat de här koncepten. Det jag fick höra var att det var ineffektivt att sätta ihop strängar i en loop och att man skulle använda StringBuffer istället. Personligen skulle jag tro att det är svårare för en nybörjare att greppa de olika typerna av metoder på en Ruby-sträng, och när det är läge att använda dem.
Det är ditt ansvar som utvecklare att kopiera och förstå vad ruby gör här. Jag ska se om jag lyckas förklara på ett vettigt sett.
# Ditt exempel ovan är ungefär detsamma som att skriva
b = a + " :)"
# eller
b = a
b += " :)"
# Om det är en metod eller inte spelar alltså ingen roll. Du skapar ett nytt objekt enligt ovan.
[code]
a = "abc"
b = a
a.object_id # => 70135960936840
b.object_id # => 70135960936840
# a och b går nu till samma object
a << "def" # lägger till "def" till objectet och påverkar då både a och b
a += "def" # (a = a + "def") skapar ett helt nytt object och påverkar därför endast a
[/code]
Kan rekommendera att du öppnar upp en ruby terminal och leker lite med olika sätt att skapa och ändra variabler och inspekterar object_id regelbundet för att få en bättre förståelse över vad som ändrar objektet och vad som skapar nya objekt
Tack men jag förstår vad koden gör. Vad jag menar är att du som användare av ett tredjepartsbibliotek aldrig kan veta om din sträng blir modifierad eller kopierad inuti en metod utan att först läsa igenom källkoden. Det enda säkra blir att skicka en kopia av strängobjektet.
Metoden vet inte heller om användaren har skickat in en referens till en kopia av en sträng eller ett original, så den kanske också gör en säkerhetskopia av strängen innan den skickar den vidare. Istället för en referens har man nu tre, och det är inte ens säkert att de någonsin kommer byta värde.
När du anropar en metod som tar en String i Java är det garanterat att ditt strängobjekt inte ändrar värde. När man arbetar med flertrådade applikationer är detta en deal breaker, men även i enkeltrådade applikationer är det en trygghetsfaktor att veta att ett värde inte ändras utanför ens kontroll.
Kom-pa-TI-bilitet
Varsågod, tyckte att någon behövde styra upp det hela lite och ge dig vad du vill ha
Jag jobbar oftast med flera kunder samtidigt, så det gäller ju att prioritera efter deadlines, men det är inget man tänker på utan det kommer man in rätt lätt i.
Jag har en fast lön (inte timlön alltså) så jag får alltid lika mycket i lön oavsett hur mycket jag jobbar. Så det är ju rätt soft, kan ju också jobba hemifrån och så ibland om jag känner för det. Detta får man ju inte utnyttja allt för mycket dock, utan man får se till att hålla bossen nöjd Lönen brukar ligga någonstans emellan 22000-28000 per månad (inkl min), så det är ju inte överdrivet mycket, men det är ju betydligt mer än alla mina kompisar i samma ålder som jobbar på McDonalds Sen får man ju tänka på att det är ett rätt soft jobb. Man sitter på ett kontor med schysta medarbetare som sysslar med samma grejjer, man står ju inte ute i kylan och sliter liksom.
Helt okej lön alltså :), Men har frågor igen
1.Du ville alltså att jag ska börja att lära mig HTML5 OCH CSS3? sedan gå över till java och PHP/MYsql??
2. Funderar på att göra appar efter jag kan göra bra hemsidor vad tycker du om det?
Tack igen för hjälpen
//SaP
Nja, det är rätt mycket konstigheter här. När ett C++-program kompileras så anger man vilken "target platform" man vill kompilera för. På mitt jobb så har många kunder gammal hårdvara så vi kompilerar för WinXP med x86 Pentium Pro eller bättre. Men det går som sagt att ange andra CPUer eller nyare OS också.
Vad gäller Java: Först kompileras källkoden till Bytekod, en gång. Denna kod kan beskrivas som nån slags mellankompromiss mellan alla processorarkitetkurer. Sedan tolkas bytekoden till native CPUn, mha Java Runtime. Denna andra kompilering kan ske mer eller mindre effektivt, och kan snabbas upp med JIT, som jag tror att du är ute efter när du pratar om att "Java kompileras flera gånger".
Java är hyggligt effektivt och mycket bättre idag än på 90-talet, framförallt för att man utvecklar Java Runtime mycket på de vanligaste plattformarna. Men jag har väldigt svårt att tro att det skulle kunna "gå om" C++. Det ligger alltid en prestandaförlust i att javan inte är färdigkompilerad native för målplattformen när ett javaprogram startas. Det ligger alltid en prestandaförlust i att java alltid jobbar med referenser och inte med rådata. Det ligger alltid en prestandaförlust i att java har en skräpinsamlare som måste köras regelbundet istället för att programmet självt friar upp resurser vid rätt tillfälle.
Java är ett trevligt språk som man kan göra mycket med. Titta t.ex. på alla appar och spel som finns till android. De jag känner som jobbar med java idag brukar skriva serverkod, mest för att java gör att köra på vilken sorts server som helst (plattformsoberoende). Men vill man jobba hårdvarunära så är C eller C++ överlägset, detta gäller även för tidskritiska tillämpningar, extrema 3D-spel, drivrutiner osv.
Jag kanske skrev några "konstigheter", men det var för att jag inte ville komplicera saken i onödan genom att gå in på detaljer. De som vet, de förstår vad jag menar. De som inte vet, de förstår ungefär ändå hoppas jag. Precis det jag ville uppnå.
Om du pratar om tidskritiska tillämpningar så kanske du räknar världens största och snabbaste aktiebörser dit? T.ex. NASDAQ som har latency ned mot 100 microsekunder och flera miljoner aktieordrar i throughput. Det finns aktiebörssystem skrivna i C++ också, men NASDAQs är ju en av de snabbaste, om inte absolut snabbast i världen. Hur går detta ihop om Java inte duger för tidskritiska tillämpningar? Mao, så har du fel. En aktiebörs ska vara så snabb som möjligt, då tjänar man stora pengar. Kan man öka hastigheten så gör man det, det ligger stora pengar däri. Då menar jag STORA pengar.
Att du har svårt att tro att Java kan gå om C++, förstår jag. Men du kanske håller med att en adaptivt kompilerande JIT kan optimeras under varje körning, och det kan inte C++? Och du kanske håller med om att t.ex. JIT kan slå på vektorinstruktioner och sånt, som inte C++ binären gör - eftersom den targets en vanlig PC utan fancy instruktioner? Och du kanske håller med om att vektorinstruktioner kan vara många gånger snabbare än vanliga instruktioner? Så då kanske du håller med om att en adaptivt optimerande kompilator som optimerar hela tiden, kan gå om en statisk binär som optimerats en enda gång? Så i teorin kan Java gå om C++. Håller du med om det? I praktiken kanske Java är snabbare än C++ endast på vissa saker idag (t.ex. aktiebörser) men i framtiden kommer Java antagligen vara snabbare än C++ på det mesta, om inte allt.
Nackdelen med C++ är att binären kan inte optimeras för just din PC, eftersom man kompilerar en enda gång och då siktar man in sig på en vanlig PC. Men Java optimerar för just din PC. C# kör ju också en VM, precis som Java, men C# har en kass VM och ligger ljusår efter JVM.
C++ har en fördel som få andra språk har: template meta-programming.
Att du nämner C++ template metaprogramming som en fördel är något som lisp programmerare skulle finna märkligt. C++ templates är ju ett riktigt härke och jag skulle inte ens röra det med en 9 meters påle. Jag läste om nån meta template guru som skrivit auktoritära C++ böcker i det, men som nu givit upp eländet och switchat över till funktionella språk. Riktigt intressant läsning var det. Lisp har ju riktig metaprogrammering, som inte många programspråk är i närheten av, speciellt inte objektorienterade språk.
http://www.paulgraham.com/diff.html
Och att Java används i prestandakritiska nätverksapplikationer är inte heller så konstigt....Majoriteten av alla cykler spenderas i OS-kärnan (nätverksstacken) i dessa applikationer, så valet av språk/runtime-plattform blir inte speciellt viktigt mer än att man kommer åt "rätt" OS-funktioner.
Jag är inte så säker på det. Börssystem har inte så himla mycket trafik som genereras faktiskt. Hela NASDAQ börsens trafik på Wall Street får lätt plats i en Gigabit NIC, t.ex. Däremot ska det vara extremt låg latens, och det är många små ordrar som kommer in hela tiden. Så servern har extremt mycket att göra.
Ett börssystem är inte heller ett "hårt realtidssystem", så man är bara ute efter genomsnittlig låg latens. Det C/C++ även kan ge, men GC språk som Java/C# inte kan, är garanterade svarstiden.
Börsystem som använder C/C++ har också genomsnittsliga svarstider, de är inte realtidssystem. Om nu GC vore ett problem i Java, så skulle man inte använda Java i börssystem. Det skulle aldrig accepteras att börsen stannade upp i 10 millisekunder - det vore helt oacceptabelt. Kunderna dvs Investmentbankerna och hedgefonderna skulle byta aktiebörs på stört och utan kunder, inga kourtageavgifter till börsen. Börsrobotarna handlar där det går snabbt, på snabba system.
Att du nämner C++ template metaprogramming som en fördel är något som lisp programmerare skulle finna märkligt. C++ templates är ju ett riktigt härke och jag skulle inte ens röra det med en 9 meters påle. Jag läste om nån meta template guru som skrivit auktoritära C++ böcker i det, men som nu givit upp eländet och switchat över till funktionella språk. Riktigt intressant läsning var det. Lisp har ju riktig metaprogrammering, som inte många programspråk är i närheten av, speciellt inte objektorienterade språk.
http://www.paulgraham.com/diff.html
Använder både elisp och Clojure, så är fullt medveten om vad man kan göra i Lisp. Det fundamentala skillnaden i Lisp jämfört med andra språk är att kod och data är samma sak, vilket betyder att man kan via sitt program direkt modifiera programmets AST (Abstract Syntax Tree). Lisp program är däremot inte ens in närhet så effektiva som motsvarande C++ (eller för den delen Java) program om programmet i fråga är CPU-bundet.
Det ändrar ändå inte det faktum att C++ template meta-programmering kan leda till program som är snabbare än vad du kan åstadkomma med andra språk. Att template meta-programmering är komplicerat må vad sant, men rätt använt så är det enkelt att använda resultatet även om det är svårt att skriva själva implementationen. Eller på vilket sätt är detta komplicerat?
sort(begin(lista), end(lista)); // C++
lista.sort(); // sortera Java, C#
Linq i C++
int nums[] = {3,1,4,1,5,9,2,6,5,4};
auto result = from_array(nums)
>> where ([](int n) {return n%2==0;})
>> sum ();
}
Linq i C#
int[] nums = new int[]{3,1,4,1,5,9,2,6,5,4};
var result = nums.Where(n => n % 2 == 0).Sum();
Skillnaden här är att C++ versionen typiskt är långt mycket snabbare då C++ linq är ett template-bibliotek så det blir inga indirekta funktionsanrop och i lite mer komplexa uttryck så blir effekten av att C++ kan optimera bort massa mellansteg med temporära resultat riktigt stor. Har uppmätt skillnaden på runt två tiopotenser i prestanda mellan C# och C++ när data-set:et man jobbade på var ~1GB data.
Frågan var ju om C++ är mer effektiv än t.ex. Java, i "vanlig" kod är inte skillnaden relevant, men om template-meta programmering kan användas så kan det ge C++ en enorm fördel då en rad optimeringar kan göras vi kompilering som inte är möjligt i andra språk (inte ens i Lisp).
Jag är inte så säker på det. Börssystem har inte så himla mycket trafik som genereras faktiskt. Hela NASDAQ börsens trafik på Wall Street får lätt plats i en Gigabit NIC, t.ex. Däremot ska det vara extremt låg latens, och det är många små ordrar som kommer in hela tiden. Så servern har extremt mycket att göra.
Jobbar bl.a. med att utveckla OS-kärnor och nätverksstackar för högprestandasystem, så har hyfsad koll på tiderna det tar att processa paket. Jobbar däremot inte med börssystem, men som jag förstått det ligger man idag på latenser ner mot eller ibland till och med under 10µs. Vid den latensen har man inte mer än 20k-30k CPU cykler på sig per paket och det inkluderar den tid paketet ska DMA:as in och ut från NIC då jag utgår från att den latens man specifierar är latens sett från en extern box. Windows behöver ganska exakt denna tid bara på att leverera och skicka paketet genom OSet (sist jag mätte, vilket var på Win7), Linux klarar detta på strax under 10k cykler och en specialdesignat TCP/IP stack kan komma ner till kanske 2k-3k cykler.
Som jag förstått det kör NASDAQ en "vanlig" Linux, så Java-delen kan max stå för ~50% av cyklerna i genomsnitt.
Börsystem som använder C/C++ har också genomsnittsliga svarstider, de är inte realtidssystem. Om nu GC vore ett problem i Java, så skulle man inte använda Java i börssystem. Det skulle aldrig accepteras att börsen stannade upp i 10 millisekunder - det vore helt oacceptabelt. Kunderna dvs Investmentbankerna och hedgefonderna skulle byta aktiebörs på stört och utan kunder, inga kourtageavgifter till börsen. Börsrobotarna handlar där det går snabbt, på snabba system.
Linux är inte ett RTOS, så man har inte garanterad svarstiden. Men det är ändå så att med Java inför du än mer jitter då GC sker vid tillfällen du inte kan kontrollera. I majoritet av fallen handlar det om några 10-tals eller i värsta fall 100-tals µs som GC tar och det kan vara ganska långt mellan dessa tillfällen, men GC kommer att hända. C/C++ måste ta hand om minneshantering manuellt, vilket i genomsnitt faktiskt kan vara långsammare, men tiden det tar är jämt utspritt och ligger framförallt på samma ställe varje gång.
Men bevisligen spelar genomsnittstiden mest roll i börssystem.
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
- Elsparkcykel från F1-ingenjörer når 160 knyck14
- Dagens fynd — Diskussionstråden54k
- Ny dator, okänd "Љ" enhet ansluten?3
- Plats för lite gubbgnäll12k
- [FAQ] Vilken router ska jag köpa?4,6k
- Microsoft slutar sälja film och serier23
- Fick för en tid sedan råd av er, är det ff en bra rekommendation? 25k gamingrigg2
- Sverige tappar fart i 5G-racet47
- Fråga om höga temperaturer på SSDs och hårddiskar16
- Vad gör du först på datorn vid ominstallation/ nyinstallation?71
- Skänkes Ger bort grejer som samlar damm!
- Säljes NAS QNAP TS-253D-4G (+ 1x6 TB disk)
- Köpes RTX 3090 + vattenblock till TR4
- Säljes 32 gb ram, CMK32GX5M2X7200C34 Säljes
- Säljes ASUS RTX 2080 OC
- Köpes Köpes: RTX 4070 Ti Super (Billigt?)
- Säljes Intel Arc b580 limited edition
- Säljes Wooting 80HE (ISO-Nordic, TTC KOM RGB, Glorious Aura Keycaps, ABS Ghost)
- Säljes Äldre PC till salu - GPU eller HDD ingår ej
- Skänkes NYTT Skärmskydd till iPhone 11/XR
- Elsparkcykel från F1-ingenjörer når 160 knyck14
- Microsoft slutar sälja film och serier24
- Programmerare besegrar Chat GPT i kodmaraton64
- AMD:s Threadripper Pro med 96 kärnor kostar 113 000 kronor22
- Civilization VI med alla expansioner gratis hos Epic 40
- Navigera rätt i grafikkortsdjungeln102
- Telia kan köpa Bredband290
- Adware i populära Crystaldiskinfo8
- Säkerhetsbrist hos Gigabyte-moderkort berör över 240 modeller19
- Kivra testar att ta betalt för tjänsten238
Externa nyheter
Spelnyheter från FZ