Permalänk
Avstängd
Skrivet av -=Mr_B=-:

Nja. C sharp är beroende av programbibliotek, inte bara en virtuell maskin en virtuell maskin. Tror jag. I sammanhanget irrelevant, eftersom det inte är plattformsoberoende, precis som jag skrev från början.

Det finns helt enkelt väldigt få språk som genererar körbar kod som fungerar på alla system. Man måste kompilera specifikt för en miljö, och på den burken man avser att köra fanskapet när det är färdigt, måste man ha de nödvändiga biblioteken installerade.
B!

Java har sin VM och .NET sin CLR, ganska snarlikt hur det fungerar under ytan faktiskt. Problemet med Mono har varit att det fram tills nu krävt reverse engineering.

Visa signatur
Permalänk
Avstängd
Skrivet av DeluxXxe:

Håller dock med om att Java funkar bättre till server-lösningar - idag. Vore ju kul med lite konkurrens kring det hade jag tyckt.

Jasså, du får gärna utveckla

Visa signatur
Permalänk
Datavetare
Skrivet av sycrone:

Jag vill ge en annan vinkel, TS skriver att hen vill börja göra spel...
använd unity

  • enkelt att arbeta med

  • massor med guider

  • får snabbt ihop något spelbart

  • kan kompilera till det mesta

  • kan välja antingen c# eller JS

eller tänker jag fel?

TS skrev "enklare text-baserade spel" och att målet till stor del var att lära sig programmera, att dra in ett relativt avancerat ramverk som Unity är kanske inte helt rätt väg.

Skrivet av CyberVillain:

Dependency injection (Fult reflection-stöd möjligör massor med fler grejer på Type-nivå som är svårt eller omöjligt i tex Typescript), delade kontrakt mellan server och klient, state machine I form av yield. Etc etc.

Allt det där får du då CLRn är nästan helt portad.

Typescript är omoget ja, det var inte länge sedan de fick generics tex.

Till skillnad från C#.
Ja det är beta, och i den andra tråden jag länka till är jag tydligen med att man inte borde använda det i produktion riktigt än, dock är det baserat på en Ms produkt Roslyn, vilket gör det hela stabilt redan nu.

Skickades från m.sweclockers.com

Dependency injection = instansiering av data sker separat från användandet, kräver detta reflection så har man inte förstått vad DI är. Använde detta i C (som helt saknar dynamisk typinformation) så sent som idag. Antar att du försöker få det till att "type erasure" är ett problem med generics i TypeScript, det har C# människor sagt om Java också men har ännu inte sett något relevant exempel där det faktiskt är ett problem. DI är har heller inte lika stora fördelar i JS där man bl.a. kan basera polymorfism på "prototypes", beteende för alla instanser av en viss "klass" kan därför ändras i efterhand i JS vilket gör mock-hantering väldigt flexibelt.

Dels kom generics för två år sedan (version 0.9) i TypeScript, dels är det inte helt självklart att man ens behöver generics i ett språk som använder "duck-typing", till sist går det absolut inte att använda det som ett mått på hur moget något är. C# stödjer ännu inte template-meta-programming via generics, något C++ haft sedan 1994, är C# är knappast omoget bara för det...

Microsoft har redan miljoner rader TypeScript i Azure-plattformen, Walmart Stationery är byggt med TypeScript och Mozilla använder det i sitt project Shumway (bygga en Flash VM som bara behöver en JS-motor). Tycker det ser ut som det duger till rätt avancerade saker, duger framförallt till ett enklare spel och med tanke på hur mycket buzz det är kring både JS och TypeScript är det inte helt fel att kunna lite om detta.

Roslyn kommer användas i skarp läge för första gången när VS 2015 släps! Det är inte alltså inte ett problem, men det är ett problem att TypeScript bara haft generics i två år?

"yield" är en form av "goto" då det är en form av "continuation"

"Continuations are the functional expression of the GOTO statement, and the same caveats apply."

Vet inte om man ska sörja allt för mycket att inte ha ett nytt nyckelord för "functional-goto" i TypeScript (men det diskuteras), vid behov är samma beteende trivialt att åstadkomma med closures. I Clojure diskuterades också detta men man valde aktivt att inte lägga till explicit språkstöd just p.g.a. att det finns en hel del problem som att kod med "Continuation" är svårare att följa och mycket svårare att visa att den är korrekt.

Skulle säga att TypeScript är otroligt imponerande med tanke på att det är något relativt nytt från Microsoft. Microsoft har en historia att inte lyckas speciellt bra med sina språkfinesser. Kräves 3 försök kring asynkrona funktioner i C#, det man har nu är långt ifrån felfritt, massor med "leaky abstractions" som man lätt skjuter sig i fötterna med. Finns en hel del på channel9 som tar upp vanliga misstag med async/await och hur de kan undvikas. TPL är ju Thread Parallel Library men skalning över CPU-kärnor där är inte i närheten av Javas fork/join eller executors.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Datavetare
Skrivet av CyberVillain:

Jasså, du får gärna utveckla

Ta molnet, du betalar i princip per spenderad CPU-cykel och >80% av kostnaden kommer efter att man utvecklat programvaran. Vad bör optimeras?

Sedan Java7 har Java fått långt bättre runtime-prestanda än .NET någonsin haft, framförallt på system med många CPU-kärnor. Det är helt enkelt lägre driftkostnad med Java förutsatt att man har ett system med någorlunda hög last.

Skrivet av DeluxXxe:

Det händer tex lite mer i C# världen än vad det gör i Java. T.ex. innan Java 8 så har det inte hänt ett dugg på väldigt många år, medan C# får nya häftiga features för utvecklare hela tiden. Finns också bättre möjligheter för att göra UIn till desktop-applikationer.

Är absolut ingen expert på UI-programmering så det kommenterar jag inte, Java har dock fått JavaFX (standardfiness i Java8) som verkar vara ett rejält lyft.

C# får väldigt mycket nytt, Java får saker som fungerar. Jag föredrar i alla fall det senare...

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Avstängd
Skrivet av Yoshman:

Dependency injection = instansiering av data sker separat från användandet, kräver detta reflection så har man inte förstått vad DI är. Använde detta i C (som helt saknar dynamisk typinformation) så sent som idag. Antar att du försöker få det till att "type erasure" är ett problem med generics i TypeScript, det har C# människor sagt om Java också men har ännu inte sett något relevant exempel där det faktiskt är ett problem. DI är har heller inte lika stora fördelar i JS där man bl.a. kan basera polymorfism på "prototypes", beteende för alla instanser av en viss "klass" kan därför ändras i efterhand i JS vilket gör mock-hantering väldigt flexibelt.

Visst någon form av fattigmans DI kan du ju fixa i Javascript exempel på det finns ju redan tex RequireJS eller Angulars inbyggda AMD. Men du kan inte få äkta IoC, inversion of control utan en runtime som stödjer type checking på ett eller annat sätt. Kod som tex

var container = new Container(); container.Bind<IFoo>().To<FooOne>(); container.Bind<IFoo>().To<FooTwo>(); //Eller ännu mer dynamiskt container .ForAssemblyWithType<FooOne>() .BindAll<IFoo>();

Föra att sedan

public MyConstructor(IEnumerable<IFoo> foos) { this.foos = foos; }

Blir omöjlig med TypeScript då runtimen är helt vanlig javascript till skillnad från DuioCode som har en helt egen mscorelib portad till JS

Eller syntax som denna går inte heller

public class MyViewModel : IHandle<SomeEvent> { public MyViewModel(IEventAggregator eventAggregator) { eventAggregator.Subscribe(this); } public void Handle(SomeEvent message) { ... } }

Form av goto, ja det kan man väl säga då koden som genereras använder en switch case sats för staten iallafall i DuoCode. Men vem bryr sig så länge den kompilerade koden är effektiv, det intressanta är ju vilka sjukt lättlästa mini workflows du kan göra med yield. Om man som jag jobbar med icke trivial system är det sjukt nice att kunna göra detta då det minskar risken för buggar.

edit: Som exempel, denna kod

public IEnumerable<IResult> Click() { var confirm = new ConfirmResult("Proceed?"); yield return confirm; if (confirm.Result == ConfirmResults.Cancel) yield break; yield return new AlertResult("FOOOOO"); }

Blir

$p.Click = function FooViewModel_Click() { var $stateMachineFunc = function() { var $this = this; var $state = 0; var $stateMachine = new (System.YieldIterator$1(Knockout.BindingConventions.DuoCode.IResult).ctor)(); var confirm = null; var $moveNext = function() { $top: while (true) { switch ($state) { case 0: confirm = new ViewModels.ConfirmResult.ctor("Proceed?"); $state = 1; $stateMachine.set_Current(confirm); return true; case 1: if (confirm.get_Result() == 2 /* ConfirmResults.Cancel */) { $state = 3; continue $top; } $state = 2; continue $top; case 2: $state = 5; $stateMachine.set_Current(new ViewModels.AlertResult.ctor("FOOOOO")); return true; case 3: $state = 4; return false; case 4: $state = 2; continue $top; } return false; } }; $stateMachine.System$Collections$IEnumerator$MoveNext = function() { return $moveNext.call($this); }; $stateMachine.Clone = function() { return $stateMachineFunc.call($this); }; return $stateMachine; }; return $stateMachineFunc.call(this); };

Visa signatur
Permalänk
Avstängd

Du har en person på swec som likar allt du skriver

Visa signatur
Permalänk
Avstängd
Skrivet av Yoshman:

Det är helt enkelt lägre driftkostnad med Java förutsatt att man har ett system med någorlunda hög last.

Märkligt att inte Stackexchange har flyttat från .NET till Java då kan man tycka, de lär generera en hel del last. Det kan inte vara så att du överdriver skillnaden i prestanda räääääät rejält? jo det kan det.. lol

Visa signatur
Permalänk
Medlem
Skrivet av CyberVillain:

Märkligt att inte Stackexchange har flyttat från .NET till Java då kan man tycka, de lär generera en hel del last. Det kan inte vara så att du överdriver skillnaden i prestanda räääääät rejält? jo det kan det.. lol

Det var väl främst i nyutveckling Yoshman menade att java var ett bättre alternativ.

Permalänk
Datavetare
Skrivet av CyberVillain:

Visst någon form av fattigmans DI kan du ju fixa i Javascript exempel på det finns ju redan tex RequireJS eller Angulars inbyggda AMD. Men du kan inte få äkta IoC, inversion of control utan en runtime som stödjer type checking på ett eller annat sätt. Kod som tex

var container = new Container(); container.Bind<IFoo>().To<FooOne>(); container.Bind<IFoo>().To<FooTwo>(); //Eller ännu mer dynamiskt container .ForAssemblyWithType<FooOne>() .BindAll<IFoo>();

Föra att sedan

public MyConstructor(IEnumerable<IFoo> foos) { this.foos = foos; }

Blir omöjlig med TypeScript då runtimen är helt vanlig javascript till skillnad från DuioCode som har en helt egen mscorelib portad till JS

Eller syntax som denna går inte heller

public class MyViewModel : IHandle<SomeEvent> { public MyViewModel(IEventAggregator eventAggregator) { eventAggregator.Subscribe(this); } public void Handle(SomeEvent message) { ... } }

Form av goto, ja det kan man väl säga då koden som genereras använder en switch case sats för staten iallafall i DuoCode. Men vem bryr sig så länge den kompilerade koden är effektiv, det intressanta är ju vilka sjukt lättlästa mini workflows du kan göra med yield. Om man som jag jobbar med icke trivial system är det sjukt nice att kunna göra detta då det minskar risken för buggar.

edit: Som exempel, denna kod

public IEnumerable<IResult> Click() { var confirm = new ConfirmResult("Proceed?"); yield return confirm; if (confirm.Result == ConfirmResults.Cancel) yield break; yield return new AlertResult("FOOOOO"); }

Blir

$p.Click = function FooViewModel_Click() { var $stateMachineFunc = function() { var $this = this; var $state = 0; var $stateMachine = new (System.YieldIterator$1(Knockout.BindingConventions.DuoCode.IResult).ctor)(); var confirm = null; var $moveNext = function() { $top: while (true) { switch ($state) { case 0: confirm = new ViewModels.ConfirmResult.ctor("Proceed?"); $state = 1; $stateMachine.set_Current(confirm); return true; case 1: if (confirm.get_Result() == 2 /* ConfirmResults.Cancel */) { $state = 3; continue $top; } $state = 2; continue $top; case 2: $state = 5; $stateMachine.set_Current(new ViewModels.AlertResult.ctor("FOOOOO")); return true; case 3: $state = 4; return false; case 4: $state = 2; continue $top; } return false; } }; $stateMachine.System$Collections$IEnumerator$MoveNext = function() { return $moveNext.call($this); }; $stateMachine.Clone = function() { return $stateMachineFunc.call($this); }; return $stateMachine; }; return $stateMachineFunc.call(this); };

Dold text

Hoppas du inser att JS koden du postade är ungefär som att kompilera C och sedan posta den resulterande assemblerkoden, det säger ingenting om hur motsvarade kod skulle se ut om en människa faktiskt skrev motsvarande.

Varför inte så här

function Click() { var confirm = new ConfirmResult("Proceed?") return new Continuation(confirm, function () { if (confirm.Result == ConfirmResult.Cancel) return new Continuation() return new Continuation(new AlertResult("FOOOOO")) }) }

där Continuation är en klass där man kan ta nuvarande värde (första argument) samt anropa Then() för att gå till nästa steg (köra funktionen som är andra argumentet). Logiskt exakt samma sak som du skrev, fast utan "magi" (programming by coincidence) då det inte är en kompilator som gör något utan all logik finns för allmän beskådan.

Det första du skrev, kan du förklara på svenska vad målet med övningen överhuvudtaget är? Kan riktigt inte se vad du vill visa med detta, men är övertygad att det går att göra något som är logiskt ekvivalent på ungefär samma antal rader i både Java och TypeScript.

Skrivet av CyberVillain:

Du har en person på swec som likar allt du skriver

Nah, det är egentligen mina två hundar som loggar in och gillar. Använder namnet på ena hunden som nick så den andra är lite putt, därför det bara blir en "gilla".

Skrivet av CyberVillain:

Märkligt att inte Stackexchange har flyttat från .NET till Java då kan man tycka, de lär generera en hel del last. Det kan inte vara så att du överdriver skillnaden i prestanda räääääät rejält? jo det kan det.. lol

Eller hur. Vad tror du är största flaskhals på en webbplats som Stack Exchange? Det är I/O, vart utförs I/O? I OS-kärnan, så det skulle lika gärna kunna vara skrivet i t.ex. Node.js utan att prestanda på något sätt ändras.

I stället för att ta mitt ord på detta, skriv lite saker själv med TPL och jämför skalbarhet mot Java. Ett populärt test-fall för de som utvecklar runtime-miljöer för parallellism är att göra en parallell version av den rekursiva version av beräkning av Fibonacci-serien. Anledningen är att den innehåller alla kritiska element, är extremt hög teoretisk parallellism, varje underproblem kan lösas separat men det krävs att man sammanfogar delar för det slutliga svaret.

Java fork/join totalt demolerar TPL redan på 4-kärniga maskiner med HyperThreading, på Xeon E5 maskiner skiljer det mer än en tiopotens.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Avstängd
Skrivet av Yoshman:

Hoppas du inser att JS koden du postade är ungefär som att kompilera C och sedan posta den resulterande assemblerkoden, det säger ingenting om hur motsvarade kod skulle se ut om en människa faktiskt skrev motsvarande.

Ja, det var mer bara ett exempel på vem bryr sig om att den koden ser ut som skräp det är ju koden innan kompilatorn gjort sitt som spelar någon roll ur läsbarhet. Jag skiter fullständigt i hur ful kod den spottar ur sig så länge den gört vad den ska så effektivt det går, och i Javascripts fall att det går att minimera hyffsat

Skrivet av Yoshman:

då det inte är en kompilator som gör något utan all logik finns för allmän beskådan.

Detta synsätt min vän är varje stort systems värsta fiende. Finns absolut ingen som helst logik i att inte gömma logik bakom abstraktioner, speciellt inte när det är en kompilator som ligger bakom den magiska logiken, men även när det är logiska abstraktioner i form av egna ramverk och hjälpmedel etc (Men då krävs ju självkalrt enhetstester etc). Det är exakt det som är mitt jobb som lösningsarkitekt går ut på, att ta fram verktyg och arbetssätt så att mina utvecklare kan skriva bugfri och förvaltningsbar kod.

Skrivet av Yoshman:

Varför inte så här

function Click() { var confirm = new ConfirmResult("Proceed?") return new Continuation(confirm, function () { if (confirm.Result == ConfirmResult.Cancel) return new Continuation() return new Continuation(new AlertResult("FOOOOO")) }) }

I Javascript värden kallas det där för promises, i detta enkla fall kanske det möjligen går att jämföra läsbarhet, men om du har fler chainade sådana samt mer komplex state etc, så blir det rätt snart olästbart.

Skrivet av Yoshman:

Det första du skrev, kan du förklara på svenska vad målet med övningen överhuvudtaget är? Kan riktigt inte se vad du vill visa med detta, men är övertygad att det går att göra något som är logiskt ekvivalent på ungefär samma antal rader i både Java och TypeScript.

Ja det är klart det går, men det blir inte lika bra och förvaltningsbar kod. Tex Event aggregatorer i javascript använder till 99% strängar för att specificera typen av meddelande. Det går faktiskt att implementera någon form av typad meddelande buss även i Javascript, jag har tex gjort det med detta ramverk

https://github.com/AndersMalmgren/SignalR.EventAggregatorProx...

Men lycka till att få Covariance att fungera tex, mao jag kan lyssna på både på IHandle<ICommandEvent<SaveCustomerCommand>> likväl som IHandle<ICommandEvent<Command>> där den senare lyssnar på alla commands medans den första enbart på events av typen SaveCustomerCommand. Allt det där går att lösa i vanilla javascript, men inte med en rad kod och lika fin syntax

Du måste väl förstå styrkan i en fullskalig IoC kontra de simpla som finns i vanilla JS? Tex ett live exempel från mitt projekt just nu (Dock inte exakt äkta kod då jag inte kan visa kundens kod)

I bootstrappern

container .Bind<ITransferProvider>() .To<SomeTransferProvider>() .Named(TransferProviders.SomeTransferProvider>(); //TransferProviders.SomeTransferProvider är en enum

I domänen

public class ListAvailableTransfersQueryHandler : IQueryHandler<ListAvailableTransfersQuery, IEnumerable<Transfer>> { private readonly ITransferProviderLocator transferProviderLocator; public ListAvailableTransfersQueryHandler(ITransferProviderLocator transferProviderLocator) { this.transferProviderLocator = transferProviderLocator; } public Task<IEnumerable<Transfer>> Handle(ListAvailableTransfersQuery query) { //transferProviderLocator.Get är en abstraktion av container.Get då det är ett antipattern att ha beroenden till di containern direkt return transferProviderLocator.Get(query.Provider).ListAvailableTransfers(Mapper.Map<AvailabilityParameters>(query)); } }

edit: De siffrorna låter fishy, men kan inte dementera dem heller. Dock när jag vill åt den formen av råparallellism i ett .NET system har jag delegerat jobbet till tex DirectCompute

Visa signatur
Permalänk
Datavetare
Skrivet av CyberVillain:

Ja, det var mer bara ett exempel på vem bryr sig om att den koden ser ut som skräp det är ju koden innan kompilatorn gjort sitt som spelar någon roll ur läsbarhet. Jag skiter fullständigt i hur ful kod den spottar ur sig så länge den gört vad den ska så effektivt det går, och i Javascripts fall att det går att minimera hyffsat

Varför postade du output från kompilatorn som exempel hur komplicerat det blir i JS om du själv tycker att sådan output är irrelevant?

Skrivet av CyberVillain:

Detta synsätt min vän är varje stort systems värsta fiende. Finns absolut ingen som helst logik i att inte gömma logik bakom abstraktioner, speciellt inte när det är en kompilator som ligger bakom den magiska logiken, men även när det är logiska abstraktioner i form av egna ramverk och hjälpmedel etc (Men då krävs ju självkalrt enhetstester etc). Det är exakt det som är mitt jobb som lösningsarkitekt går ut på, att ta fram verktyg och arbetssätt så att mina utvecklare kan skriva bugfri och förvaltningsbar kod.

Då undrar jag vad du klassar som "stort" system. Hur många rader kod? Hur många utvecklare? Hur många samtida sessioner ska systemet hantera? vilket typ av maskin körs det på?
För konsensus verkar annars vara att explicit slår implicit varje gång när saker ska skalas upp. Den inkapsling jag gjorde med Contination håller reda på två väldigt enkla saker, nuvarande tillstånd (första argumentet) samt en closure som när den anropas returnerar nästa tillstånd i form av en ny Contination (andra argumentet). Vad exakt gör "yield" med en mening? Det finns saker man måste känna till om "yield" för att undvika vissa fel, så det är en "leaky abstraction" och det är "Programming by Coincidence" att inte exakt först det som händer bakom kulisserna.

Skrivet av CyberVillain:

I Javascript värden kallas det där för promises, i detta enkla fall kanske det möjligen går att jämföra läsbarhet, men om du har fler chainade sådana samt mer komplex state etc, så blir det rätt snart olästbart.

Nej, det är inte ett promise. "Promise" är en utfästelse om att någon gång leverera ett värde (av en specifik typ i statiskt typade språk), finns ingen "continuation" (sätt att få tag i nästa tillstånd) associerad med en "promise". Finns två sidor, ett kontext som ska på något sätt leverera värdet och ett kontext som eventuellt väljer att konsumera värdet. Den senare sidan represteras ofta som en typ som kallas future, i C# heter den Task<T>.

Varför är detta

return new Continuation(<state#0>, function() { foo() ... return new Continuation(<state#1>, ...) })

mindre läsbart än detta?

yield return <state#0>; foo(); ...; yield return <state#1>; ...;

I första fallet är det helt explicit vad som sker, man går igenom ett pärlband av [tillstånd, closure-till-nästa-tillstånd], i det andra fallet är det logiskt sett samma sak men kompilatorn kommer generera kod (en tillståndsmaskin) som man inte exakt kan förstå med mindre än att läsa genererad IL/maskinkod.
[QUOTE="CyberVillain;15399559"]

Ja det är klart det går, men det blir inte lika bra och förvaltningsbar kod. Tex Event aggregatorer i javascript använder till 99% strängar för att specificera typen av meddelande. Det går faktiskt att implementera någon form av typad meddelande buss även i Javascript, jag har tex gjort det med detta ramverk

https://github.com/AndersMalmgren/SignalR.EventAggregatorProx...

Men lycka till att få Covariance att fungera tex, mao jag kan lyssna på både på IHandle<ICommandEvent<SaveCustomerCommand>> likväl som IHandle<ICommandEvent<Command>> där den senare lyssnar på alla commands medans den första enbart på events av typen SaveCustomerCommand. Allt det där går att lösa i vanilla javascript, men inte med en rad kod och lika fin syntax

Du måste väl förstå styrkan i en fullskalig IoC kontra de simpla som finns i vanilla JS? Tex ett live exempel från mitt projekt just nu (Dock inte exakt äkta kod då jag inte kan visa kundens kod)

I bootstrappern

container .Bind<ITransferProvider>() .To<SomeTransferProvider>() .Named(TransferProviders.SomeTransferProvider>(); //TransferProviders.SomeTransferProvider är en enum

I domänen

public class ListAvailableTransfersQueryHandler : IQueryHandler<ListAvailableTransfersQuery, IEnumerable<Transfer>> { private readonly ITransferProviderLocator transferProviderLocator; public ListAvailableTransfersQueryHandler(ITransferProviderLocator transferProviderLocator) { this.transferProviderLocator = transferProviderLocator; } public Task<IEnumerable<Transfer>> Handle(ListAvailableTransfersQuery query) { //transferProviderLocator.Get är en abstraktion av container.Get då det är ett antipattern att ha beroenden till di containern direkt return transferProviderLocator.Get(query.Provider).ListAvailableTransfers(Mapper.Map<AvailabilityParameters>(query)); } }

Dold text

Vad är "fullskalig" IoC (Inversion-of-control)? Varför använder du ibland termen IoC och ibland termen DI (Dependency Injection), de är samma sak fast man ansåg att IoC missförstods av så många att det krävdes ett bättre namn. DI är inget mer än separation av skapandet av objekt från dess användande (och det är i de flesta fall en bra design).

Vad du vill göra är alltså att kunna definiera ett uttryck som filtrerar en ström av event för att avgöras om ska släppas igenom eller ej, eller? Varför gör du inte det t.ex. med DI där du stoppar in en closure som när den anropas säger om man är intresserade av händelsen eller ej? Det är långt mer generellt än att bara göra filtrering baserad på typen hos händelsen.

Skrivet av CyberVillain:

edit: De siffrorna låter fishy, men kan inte dementera dem heller. Dock när jag vill åt den formen av råparallellism i ett .NET system har jag delegerat jobbet till tex DirectCompute

Hopblandning av koncept igen, DirectCompute kan i bästa fall användas för att lösa problem som är dataparallella, ett koncept som i stort sett är ortogonalt mot uppgiftsparallella problem. TPL och fork/join är bara vettiga för det senare.

Har du grundläggande kunskap om Java fork/join och C# TPL kan du väldigt enkelt testa själv och se att det stämmer.

C# PLINQ och Java 8 parallel streams är ett annat sådant exempel där Java demolerar C# i skalbarhet. Enligt Microsoft är det överlägset vanligast användningen av LINQ på formen LINQ-to-objects och i det läget går det logiskt att göra motsvara på mycket snarlikt sätt med Java8 steams. Skillnaden är att de som designade Java8 streams begriper sig på map/reduce och vad som kan göras och inte kan göras om man vill få något som går att skala väl över CPU-kärnor. LINQ är broken-by-design för parallellism då det innehåller konstruktioner som inte kan göras korrekt och effektivt över CPU-kärnor, nämns till och med i dokumentationen att vissa saker måste undvikas om det ska bli någon skalning alls att tala om (ofta svårt att ens få x2 speedup).

Edit: PLINQ och parallell streams har fall som är dataparallella, i Java pågår faktiskt arbete att automatiskt utnyttja SIMD (Intel jobbar på det) och även GPGPU (comunity drivet, antagligen baserat på OpenCL) helt automatiskt på system som har stöd för detta (alla moderna x86 har ju SSE/AVX så SIMD finns ju nästan alltid).

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Avstängd

Därför att för varje nivå nivå så nästlar du koden i en ny Continuation, i fallet med två nivåer är skillnaden i läsbarhet fortfarande stor men inte enorm. Ditt sätt är inte mycket bättre än

if(...) { if(...) { } else if (...) { if(..) { } } } else { }

Vi kanske kan släppa detta och återge tråden till TS, tror ändå inte du är mogen att ta till dig förvaltningsbar enterprise kod/arkitektur Och jag är inte mogen att ta mot din suboptimerade kod för att spara några klockcykler med kostnad att koden inte blir läsbar. Vi har olika prio helt enkelt

edit Läs på lite om IoC och DI

http://stackoverflow.com/questions/6550700/inversion-of-contr...

Min poäng är iaf att eftersom du har type erasure vid runtimen så kan du inte på få ut full IoC funktionalitet i vanilla javascript (Och Typescript blir vanilla JS btw). Typiskt kan du göra

//DepOne.js require(function() { }); //DepTwo.js require(["DepOne"], function(depOne) { });

Den använder sökvägarna på jsfilerna som "Typ". Snacka om skillnad i dynamik

edit: Överkurs för den som vill veta mer, DuoCode löser det hela såhär vilket ger rätt lite overhead, plus detta är opt in, om man inte slår på ReflectionLevel.Full så tar den inte med typinformationen och då blir det mer likt TypeScript av det hela.

ViewModels.FooViewModel = $d.declare("ViewModels.FooViewModel", System.Object, 0, $asm, function($t, $p) { $t.$intfs = function() { return [ViewModels.IHandle$1(ViewModels.Message)]; }; $t.$typeInfo = function(t, p) { return [1, null, [[".cctor", t.cctor, 17], ["Click", p.Click, 6, System.Collections.Generic.IEnumerable$1(Knockout.BindingConventions.DuoCode.IResult)], ["Handle", p.Handle, 6, 38, [["message", ViewModels.Message, 0]]]], [["ctor", t.ctor, 6]]]; }; $t.cctor = function() { ///static ctor ... }; $t.$ator = function() { //Default ctor ... }; $t.ctor = function FooViewModel() { $t.$baseType.ctor.call(this); //Main ctor ... }; });

Visa signatur
Permalänk
Medlem
Skrivet av Efrendil:

Hej, jag hade tänkt börja programmera lite för skojs skull. Tänkte genomföra några spelidéer jag har. De ska vara text-äventyr typ.

Varför inte ta en titt på Marmalade?

https://www.madewithmarmalade.com/

Då kan du programmera i C++, Javascript eller LUA för de flesta plattformar. Har själv testat att göra spel till Android mha Marmalade.

Permalänk
Datavetare
Skrivet av CyberVillain:

Därför att för varje nivå nivå så nästlar du koden i en ny Continuation, i fallet med två nivåer är skillnaden i läsbarhet fortfarande stor men inte enorm. Ditt sätt är inte mycket bättre än

if(...) { if(...) { } else if (...) { if(..) { } } } else { }

Och du anser att det du skriver som motsvarar

if (setjmp()) { state#1 longjmp(); } if (setjmp()) { state#2 longjmp(); } }

är bättre?

Skrivet av CyberVillain:

Vi kanske kan släppa detta och återge tråden till TS, tror ändå inte du är mogen att ta till dig förvaltningsbar enterprise kod/arkitektur Och jag är inte mogen att ta mot din suboptimerade kod för att spara några klockcykler med kostnad att koden inte blir läsbar. Vi har olika prio helt enkelt

edit Läs på lite om IoC och DI

Nu har jag tidigare jobbat (som konsult) med "enterprisekod" så har ett visst hum om vad du försöker få att låta som det är väldigt stort och komplicerat (och om det kommer till att "pull rank" så är jag rätt säker att min titel är högre än din men sådant är löjligt att använda på ett teknikforum). Är därför jag frågade om vad du klassar som "stor system". Att skriva affärslogik är jämfört med saker som verkligen är "stort och komplicerat" en parkpromenad, är därför du inte skriver antal rader kod, antal utvecklare etc. på 90-talet fyllde VB och ASP samma nisch, VB var på den tiden det språk med flest aktiva programmerare av alla då existerande språk. BASIC kanske inte var väldens bästa språkval, så C# är ett klart lyft. .NET är inget man kan använda att utveckla saker där det som är svårt och komplicerat inte är databasen och webfront-end, utan faktiskt den kod man själv skriver.

Har läst på om IoC och DI, du har missförstått vad detta är eller så får du helt enkelt hävda att Martin Fowler (en av de största auktoriteterna som finns kring OOP och design patterns ) missförstått det. Finns flera andra stackoverflow diskusioner kring detta och i andra pekar man på att det är ett missförstånd att de inte skulle vara samma sak, IoC var ett dåligt namn för folk missförstår vad det är.

För att ta en annan kort beskrivning kring vad DI är

"Dependency Injection" is a 25-dollar term for a 5-cent concept.
...
Dependency injection means giving an object its instance variables. Really. That's it.

Skrivet av CyberVillain:

Min poäng är iaf att eftersom du har type erasure vid runtimen så kan du inte på få ut full IoC funktionalitet i vanilla javascript (Och Typescript blir vanilla JS btw). Typiskt kan du göra

Min poäng är att allt du skriver här kring problem med "type erasure" har inget med IoC eller DI, de koncepterna är helt frikopplade från sådana detaljer. Du verkar bara se ett verktyg, C#/OOP, sedan anser du att t.ex. TypeScript/JS inte är lika bra för de har eventuellt problem att lösa något på exakt samma sätt (polymorfism baserad enbart på typ, en parametriserad typ i detta fall). TS/JS har så många fler sätt än det som erbjuder polymorfism, så det går att lösa problemet på andra sätt och med bredare/mer flexibla urvalskriterier för polymorfism går det att göra mer generella lösning (och det är ingen hastighetsoptimering, har mer än ett verktyg i min låda )

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Inaktiv

Det går inte utveckla ett program som går att köra på alla datorer, men jag misstänker att TS intresse inte är att försöka få in sitt program på sin tvättmaskin- eller microvågsungsdator utan att TS syftade på ett smalare begrepp av vad "alla datorer" är för något.

Generellt kan man anta persondator även om många skulle vilja ha programmet på sin surfplatta etc, men inom persondatorer så har TS redan nu behov att få programmet att fungera på linux och MacOS?

Jag skulle först vid val av språk noga specificera på vad för maskiner som man ska köra applikationen på, vilket TS inte har gjort.
Men generellt då kör java för att lära sig koda, av anledningar som att det finns på många plattformar t.o.m mikrodatorer och bilar (car entertainment system) Förutom det så finns det hur många java böcker och kunna java personer att fråga som helst.
Att köra java applikationer på en windowsmaskin tycker jag fungerar så där, nu var det dock ett tag sedan jag gjorde det.

Generellt kör många c# idag då det är svårt att överleva utan att ha någon maskin som inte har detta installerat, vilket innebär att i princip alla kan köra det, men inte på alla deras maskiner.

Permalänk
Avstängd
Skrivet av Yoshman:

haha, jag har fan inte pullat någon rank på dig, sluta tönta dig. Och nej din rank är nog inte så hög då du som alla andra bara stirrar dig blind på prestanda och fullständigt skiter i riktiga värden när det kommer till mjukvaruutveckling.

Dina argument börjar bli löjliga och jag tröttnar, hur fan kan du säga att jag bara kollar mot C# och OOP utan att visa ett försök till att kolla på de exempel jag visar på vanilla javascripts begränsningar, det hela blir löjligt.

Och ja, i sin renaste form handlar DI om att ge en variabel sin referens, det är bara det att vägen dit går att göra på så många sätt och vissa är fett mycket bättre än andra. När du kommer med ett sådant påstående som att det bara handlar om det så visar så tydligt vilket nivå du ligger på... Sorry, men så är det, du förstår inte modern arkitektur och hållbar kod, ta det som det är och försök att förbättra dig istället... Utan att försöka pulla rank, för jag lovar dig att du inte vinner

Visa signatur
Permalänk
Datavetare
Skrivet av CyberVillain:

haha, jag har fan inte pullat någon rank på dig, sluta tönta dig. Och nej din rank är nog inte så hög då du som alla andra bara stirrar dig blind på prestanda och fullständigt skiter i riktiga värden när det kommer till mjukvaruutveckling.

Dina argument börjar bli löjliga och jag tröttnar, hur fan kan du säga att jag bara kollar mot C# och OOP utan att visa ett försök till att kolla på de exempel jag visar på vanilla javascripts begränsningar, det hela blir löjligt.

Och ja, i sin renaste form handlar DI om att ge en variabel sin referens, det är bara det att vägen dit går att göra på så många sätt och vissa är fett mycket bättre än andra. När du kommer med ett sådant påstående som att det bara handlar om det så visar så tydligt vilket nivå du ligger på... Sorry, men så är det, du förstår inte modern arkitektur och hållbar kod, ta det som det är och försök att förbättra dig istället... Utan att försöka pulla rank, för jag lovar dig att du inte vinner

Dold text

Vad jag menar med "pull rank" är att du i flera diskussioner med folk nämnt att du minsann är "software architect" men väldigt hög lön och därför vet vad du pratar om. På vilket sätt finns det en relevans mellan den titel du har i din profession och det som diskuteras i ett forum? Förstår man det man ämnet man diskuterar och kan peka på trovärdiga källor som styrker det man hävdar så kvittar det totalt vad man jobbar med. Av den anledningen har jag aldrig nämnt exakt vad jag jobbar med, vilken min titel eller lön är.

Har haft motsvarande position som du tidigare, har en "högre" position nu (och om det spelar någon så är min ersättning högre än din), så i en rank-pulling-pissing-contest står jag nog som "vinnare"

Dold text

Som DI vs IoC. Martin Fowler var den som "uppfann" termen DI, om han säger att det är samma sak som IoC är det ganska svårt att argumentera emot. Han "uppfann" den inte heller på eget bevåg, utan efter diskussion med andra auktoriteter på området. Från länken jag postade ovan

"As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection."

Skulle säga att du använder termer vars definition du inte riktigt har grepp om. T.ex. "Visst någon form av fattigmans DI kan du ju fixa i Javascript". Varför är problemet med detta påstående? Det kräver att man vet vad en "design pattern" är och det är: ett namn på en struktur som löser ett, vanligtvis ofta återkommande, problem. DI är att separera konstruktion från användning, det i sig säger absolut inget mer.

Det "design pattern" erbjuder är ett sätt att diskutera programvarulösningar med en kortfattad men ändå relativt väldefinierad terminologi. Är helt analogt med att säga: jag sorterar med "quick-sort", i stället för att beskriva algoritmer. Med design patterns kan jag säga: strategy pattern används för att algoritm vid sortering. Endera använder man strategy pattern (eller DI) eller så gör man det inte, finns ingen "fattigmansversion".

Ett annat exempel är när du skrev "Men lycka till att få Covariance att fungera tex". Vad är covariance? Det är att om B är en specialisering av A så är även en generisk typ med typparametern satt till B en specialisering av samma generiska typ med typparametern satt till A. Vad är det med type-erasure som skulle hindra detta att fungera? Vad man inte kan göra efter type-erasure är givet den parametriserad typen få reda på typparametern, så problemet i ditt exempel har inte med stödet för covarians att göra men ser vad du är ute efter (typen behövs om den ska vara del i filtreringsbeslutet). Men om du pratar så varmt om DI, varför inte använda just detta där det instoppade objektet är en closure som tar en händelse och returnerar om det ska släppas igenom eller ej? Det är en lika enkelt lösning, fast långt mer flexibel och den löser även problemet du var ute efter då closure-objektet kan t.ex. via reflection kolla om händelsen har en viss relation till en viss typ (fungerar både i TypeScript/Java och C#).

Du hävdade också att TypeScript är "sjukt omoget" (så pass illa att TS inte kan använda det till text-baserade spel kanske?). Det får nog anses vara din rätt ogrundande åsikt. Microsoft passerade som sagt en miljon rader TypeScript i höstas, hur många projekt har du jobbar med som är i den storleken? Hur stora projekt, i rader kod, har du jobbat med? För de personer som jobbat på projekt i denna storlek vet att just "prestanda" (exakt vad det är beror på vad programmet ska utföra) är det som make/break saker i slutändan. Är något "broken-by-design" så går det inte att fixa med lite smarta tricks, exempel på detta är t.ex. PLINQ. Ta en modern webbläsare (>10M rader kod), Google insåg att begränsningar i prestanda hindrade en rad applikationer från att köras på webben. Idag när JS-motorerna och renderingen i webbläsaren är långt bättre optimerad har vi helt nya typer av möjligheter.

De som inte förstår hur viktigt det är att kunna designa för hög prestanda har aldrig jobbat med projekt som verkligen är "stora".

Det jag menade med att du ser allt som OOP/C# är t.ex. ditt JS-exempel. Din utgångspunkt var en lösning du hade i C#, sedan var JS "dåligt" för en line-by-line översättning var inte möjlig utan det blev rejält mycket mer kod. En erfaren JS-programmerare hade överhuvudtaget inte försökt löst problemet genom att implementera funktionen av C# yield. Är själv väldigt grön på JS, men bara genom att läsa vilka programmeringskoncept som stöds gick det att göra något som bortsett från placering av måsvingar/parenteser gör exakt samma sak med enbart JS-språkfunktioner. Varför inte säga "coolt det tänkte jag inte på" i stället för att hitta på krystade "fel" med en sådan lösning?

Massor med svammel från min sida (sorry TS för derail, men tror du fått de tips som behövs redan), men detta är ett diskussionsforum och vet inte vad din drivkraft är för att posta här men i mitt fall är det främst för att det är en väldigt stor möjlighet att lära sig saker. Även om man får sitt ego lite stukat av att ha fel så trycker jag på Gilla direkt någon visat att jag haft fel eller missförstått något, skulle ge den användaren en guldstjärna också om det gick! I det läget har man ju lärt sig något nytt. Vidare det intressant att bara läsa vissa diskussioner, termer/koncept/etc som nämns, när jag ser något folk ofta diskuterar som inte känns bekant så har man ju något att läsa på mer om som tydligen intresserar andra.

Sist. Svårt att få fram tonen i det man skriver, men vill bara säga att jag inte är det minsta irriterad på dig eller det du skriver. Tvärt om är det uppenbart att du sitter på väldigt mycket kunskap, så få en Gilla genom att visa hur fel jag har

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Så här är det för väldigt många moderna språk idag av många olika anledningar. Tycker inte du ska se det som ett problem. Det är lite omständligt men du får också många fördelar från det. Tex. i C# kan du generera en installer som innehåller .net framework så att du slipper ladda ned det separat. Då blir det lite enklare.

Permalänk
Avstängd
Skrivet av Yoshman:

Hade en flaska eller två Bordeaux under västen när jag skrev det där så blev lite hård ton

Jag tycker vi spelat detta så långt det går och orkar faktiskt inte kontra allt du skriver, men det du missat mest under hela denna diskussion är en sak och det är att type erasure visst tar bort mycket möjligheter´, vi kan ta just covariance som ett exemepl. Visst du har covariance vid Compile time (mao kompilarn kommer klaga om du inte uppfyller constrainten. vilket är jättebra och en av styrkorna med statiska språk och varför man vill köra TypeScript eller C# även där JS är target), men det räcker bars så långt. Tex mitt exempel med en IHandle<out T>

Kompilatorn kan inte hjälpa dig här för du måste lägga referens till din IHandle på en kö/lista

När sedan ett medelande kommer in på bussen måste man resolva detta och det går ju inte då vi inte längre har typinformationen vid runtime

Självklart måste man tänka prestanda, det gör jag hela tiden, men jag har aldrig stött på att jag måste välja det syntaxmässigt sämre språket Java över C# av den anledningen. Vi bor i ett land med 9 miljoner invånare, inte ens de flesta slutkundssystem (Web-scale) är ett problem att driva under .NET på en serverinstans

Visa signatur
Permalänk
Datavetare
Skrivet av CyberVillain:

Självklart måste man tänka prestanda, det gör jag hela tiden, men jag har aldrig stött på att jag måste välja det syntaxmässigt sämre språket Java över C# av den anledningen. Vi bor i ett land med 9 miljoner invånare, inte ens de flesta slutkundssystem (Web-scale) är ett problem att driva under .NET på en serverinstans

Är fullt med på det, men det beror på att en extremt vanlig uppgift är att man skriver relativt lite kod som sitter mellan en webfront-end (som typiskt är utvecklad i C++ av prestandaskäl) och en databas (som av prestandaskäl också är utvecklad i C++), detta körs på ett OS som av flera skäl (bl.a. prestandaskäl) är skrivet i C. Affärslogik är på det stora hela en extremt liten del av all kod som körs och det är sällan man gör en speciellt avancerad transform av data -> det spelar i stort sätt ingen roll (ur prestandahänseende) om det är skrivet i ultraoptimerad C eller i Ruby (som inte är känt för att exekvera snabbt, ändå kör man rätt stora webbplatser på Rails).

Om man däremot utvecklar saker som ska köra inuti en OS-kärna, vara del av virtualiseringsinfrastruktur, utvecklare middleware, något som på något sätt utför en lite mer komplex transform på data eller om man ska hantera väldigt många samtida sessioner så är prestanda (som kan betyda många saker) kritiskt. Och det handlar inte om att knacka "smarta saker" i assembler, prestanda i storskaliga system kommer främst från bra arkitektur och rätt val av algoritmer (ligger man riktigt i framkant kanske man måste forska fram nya algoritmer, något som bl.a. är min arbetsuppgift för tillfället).

Att Java (eller C) är sämre syntaxmässigt än C# är däremot en åsikt som långt ifrån alla delar med dig. I stora projekt med många utvecklare är det en fördel om de som ingår verkligen behärskar språket som används. Som språk börjar C# närma sig C++ i antal språkfinesser, ytterst få behärskar alla saker som finns i dessa språk och den delmängd folk kan överlappar inte alltid. Java är ett betydligt enklare språk och det är rimligt att känna till alla språkliga finesser.

Frågan är hur stora projekt C# används i? Största jag hittat är Roslyn som innehåller ca 1.5M rader C# (och faktiskt ungefär likna mycket VB) vilket inte är speciellt mycket (finns flera Java-projekt på GitHub som är större, C/C++ har kodbaser som närmar sig 100M rader). Projekt som räknas i låga 100k rader kod skulle jag på sin höjd klassa som "medelstora", där behöver man inte alls tänka lite mycket på prestanda i sin arkitektur. En av produkterna jag jobbar som arkitekt har ~400k rader Python (där börjar det bli växtvärk men Python används inte i den kritiska delen utan är del av testsystemet), är nästan 10M rader C med riktigt hårda krav på effektivitet i huvudfunktionen.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Avstängd

Mitt förra system hade över 12 000 user stories (En user story kan vara allt från en mycket liten feature till en mycket stor men ofta bryter man upp de stora i mindre del stories). Mao hyfsat mycket funktioner, nu har jag inte tillgång till kodbasen längre och kan inte kolla antal kodrader men kan lova dig att det var långt ifrån några de där sifforna. Ett systems komplexitet räknas inte i antal rader kod utan i vad den löser för problem (Det är snarare ett misslyckade om det är mycket kod, tänk DRY, etc). Just saying.

Du kan få extrem prestanda ut hur .NET btw, tex har jag använt denna produkt för två system där det var höga krav på prestandan. http://www.starcounter.com/

Det finns ofta ingen som helst logik i att lägga den domänära koden i ett språk som C++ för du vinner väldigt lite på det i ren prestanda. App-server etc (Apache, IIS, etc) vinner dock på det.

Visa signatur
Permalänk
Datavetare
Skrivet av CyberVillain:

Mitt förra system hade över 12 000 user stories (En user story kan vara allt från en mycket liten feature till en mycket stor men ofta bryter man upp de stora i mindre del stories). Mao hyfsat mycket funktioner, nu har jag inte tillgång till kodbasen längre och kan inte kolla antal kodrader men kan lova dig att det var långt ifrån några de där sifforna. Ett systems komplexitet räknas inte i antal rader kod utan i vad den löser för problem (Det är snarare ett misslyckade om det är mycket kod, tänk DRY, etc). Just saying.

Du kan få extrem prestanda ut hur .NET btw, tex har jag använt denna produkt för två system där det var höga krav på prestandan. http://www.starcounter.com/

Det finns ofta ingen som helst logik i att lägga den domänära koden i ett språk som C++ för du vinner väldigt lite på det i ren prestanda. App-server etc (Apache, IIS, etc) vinner dock på det.

Med tanke på att en "user story" rimligen borde ha minst en "task" och en "task" rekommenderas beskriva något som i alla fall tar 4 timmar att utföra handlade det alltså om ett rätt projekt med >2000 manmånaders jobb. Det är rätt stort, begriper inte riktigt vad man hållit på med om inte det skulle ha resulterat i >1M rader kod. Mycket kod är i sig knappast ett misslyckande, om det man ska lösa är fundamentalt svårt och komplext så kommer det bli mycket kod. Moderna OS och moderna webbläsare (som faktiskt nästan kan ses som OS) kliver över 10M rader kod utan att de bryter mot DRY. Själv kan jag definitivt inte bryta mot det då min "bibel" säger

"DRY—Don’t Repeat Yourself
Every piece of knowledge must have a single, unambiguous, authoritative representation within a system."

Starcounter verkar om man tittar på patentet bygga på minnesmappad I/O. Även om det finns grundläggande stöd för detta sedan .NET4.0 så räcker det inte alls till för vad man gör här. I deras whitepaper nämns en "C runtime" och vet inte riktigt hur denna kodbas relaterar till det projektet.

Men givet antalet buggar jag hittar i den här filen
https://github.com/Starcounter/Starcounter/blob/develop/src/C...
under de första sekunderna jag läser "push_front()" så skulle jag inte lita på någon data som finns i den databasen... Uppenbarligen har den som skrivit filen hört talas om minneskonsistensmodeller då denne inser att x86 är har en väldigt "strikt" sådan, men det är totalt fel även på x86.

En korrekt implementation behöver 2 "pekare" (kan vara räknare som i denna impl) för consumer och 2 för producer. Den ena är utrymmet den som har för avsikt att läsa/skriva lyckats reserverat, den andra är för producer det data som är redo att konsumeras och för consumer det utrymme man kan (åter)använda. Reseverationen måste göras med en atomär läs nuvarande-värde-om-det-är-det-förväntande-byt-det-till-nytt, d.v.s. en CAS (Compare And Swap). Explicita minnesbarriärer behövs i princip aldrig på x86, sfence/lfence behövs bara om man jobbar med s.k. Non-Temporal SSE/AVX instruktioner (där är ett fel i filen ovan men långt ifrån det enda).

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Avstängd

Det skulle stå 12 000 work items (TFS) vilket kan vara både en task eller en user story
edit: Starcounter är inte open source så jag vet inte riktigt vad det där är faktiskt

Visa signatur