Gå til innhold
🎄🎅❄️God Jul og Godt Nyttår fra alle oss i Diskusjon.no ×

Hvilket programmerings-språk bør man begynne med?


Anbefalte innlegg

Gjest Slettet+9871234

Ved spillutvikling er det ikke uvanlig å integrere et skript språk som for eksempel Python med C++. Spillmotoren skrives i C++ og grensesnittet i Python.

 

God litteratur som behandler dette i større detalj:

 

http://www.amazon.com/Game-Programming-Python-Development/dp/1584502584

 

God bok (som er relativt oppdatert på C++):

 

http://www.amazon.com/C-Game-Programmers-Development/dp/1584504528/

 

Algoritmer og datastrukturer:

 

http://www.amazon.com/Data-Structures-Algorithms-Developers-Development/dp/1584504951

 

Se også:

 

http://wiki.python.org/moin/GameProgramming

 

http://wiki.python.org/moin/PythonGameLibraries

 

Mange kommersielle spill skrives i C++ ja, men ofte fordi kodebasen allerede er skrevet i C++.

Unity og Unreal er skrevet i C++. C++ er også mer flyttbart, samt at de fleste tredjeparts biblioteker er skrevet i C++.

Nemlig.

 

Det er ingen selvfølge at kode skrevet i C++ er raskere enn kode skrevet i for eksempel C#.

Det omvendte er vel heller ingen selvfølge.

 

C++ er omtrent en supermengde av C. Vet ikke om det samme kan sies om C#.

 

Tallknusing kan godt skrives i C. Sparer noen klokkesykler på det.

 

Microsoft has defined C# as follows

 

C# is a simple, modern, object oriented, and type-safe programming language derived from C and C++. C# (pronounced C sharp) is firmly planted in the C and C++ family tree of languages, and will immediately be familiar to C and C++ programmers. C# aims to combine the high productivity of Visual Basic and the raw power of C++.

 

However it is also undeniable that the two languages are very similar in both their syntax and in that they are both designed to facilitate the same paradigm of programming, in which code is based around hierarchies of inherited classes.

 

Below I will briefly summarize the overall differences and similarities between the two languages.

Kilde: http://www.c-sharpcorner.com/UploadFile/gtomar/ComparisionofCandcsharplanguages10242007013053AM/ComparisionofCandcsharplanguages.aspx

 

Min utheving i det sitatet er nok til ikke å velge C#.

 

Se for øvrig:

 

C++ vs. C# - a Checklist from a C++ Programmers Point of View

Endret av Slettet+9871234
Lenke til kommentar
Videoannonse
Annonse

Min utheving i det sitatet er nok til ikke å velge C#.

 

Se for øvrig:

 

C++ vs. C# - a Checklist from a C++ Programmers Point of View

 

Mono har en implementasjon av C# som er fullstendig uavhengig av Microsoft (faktisk støttet av Novell med Microsoft sin velsignelse) og støtter alle de samme språkmulighetene som Visual C# har. Det er open source, og er på full høyde med Microsoft .NET.

 

En kan også peke på garbage collection som C# deler med Java, som faktisk er mer effektiv, og jeg vil påstå, mer egnet til spillutvikling enn C/C++ sin deterministiske minnebehandling. Denne bruker også compactor som rett og slett er defragmentering av minneområdet. Noe som ikke blir gjort i C++ ettersom dette ville krøllet til pekere og referanser.

 

At du har et anti-microsoft handicap får være ditt problem.

Lenke til kommentar
Gjest Slettet+9871234

En kan også peke på garbage collection som C# deler med Java, som faktisk er mer effektiv, og jeg vil påstå, mer egnet til spillutvikling enn C/C++ sin deterministiske minnebehandling.

Hm. Hvorfor ikke skrive sine egen garbage collection / destruktør rutiner? Det anbefales av profesjonelle programmerere. Anser meg selv som profesjonell programmerer. (Programmerte rentekontrollen for Finans Minister Rolf Presthus, overvåking av det norske banksystemet, det første programmet som ble brukt til å plassere - den gang 100 milliarder - Norges Banks valutareserver etc. etc.).

 

Noe som ikke blir gjort i C++ ettersom dette ville krøllet til pekere og referanser.

 

Såvidt jeg vet har ikke C# og Java de samme avanserte peker mulighetene som C++. Dinglende pekere er et velkjent problem. Foretrekker dermed å rydde opp i minnet ved å skrive destruktørene selv. Smarte http://ootips.org/yonat/4dev/smart-pointers.html og andre pekere er det som skiller C++ fra mange andre språk.

 

Se også:

http://www.informit.com/articles/article.aspx?p=31529

 

http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/smart_ptr.htm

 

(Boost biblioteket er et av de mest renomerte C++ bibliotekene - ikke nødvendig å finne opp hjulet på nytt).

 

At du har et anti-microsoft handicap får være ditt problem.

 

Det er ikke hovedgrunnen. Jeg bruker daglig Microsoft sine produkter. Der lukter proprietært av C# lang vei til tross for ditt siste innlegg. C++ er etter mitt personlige syn et langt mer åpent og plattform uavhengig språk. C++ er mer portabelt.

Endret av Slettet+9871234
Lenke til kommentar
Gjest Slettet+9871234

Det er ingen grunn til å bruke C++ i et spill i dag.

Hva med portabilitet? Du mener vel ikke at C# er like portabelt som C++?

 

Det at mange bruker det er heller ikke et argument i utgangspunktet. Svært få bruker Python, er det et ubrukelig språk av den grunn?

Poenget er at et skripting språk ofte kombineres med C++ for spillutvikling. Se mine tideligere innlegg. Python er et av de mest egnede skripting språkene til å kombineres med C++ til spillutvikling. I et fugle perspektiv, er Python en C while løkke. C++ er i det vesentlige en super mengde av C.

 

ISO sertifisering er ikke noe argument. Jeg har hørt / lest at det skal være mulig å fylle en flytevest med sement og få den ISO sertifisert. Kanskje litt satt på spissen, :roll:

 

Det virker som vi kun er enige om å være uenige. :hm:

Lenke til kommentar

"Ingen grunn" er en overdrivelse fra min side. En god grunn er jo portabilitet som du nevner. C++ vil du uansett få til å fungere de aller fleste steder. Men hastighet i seg selv er ikke et argument.

Men for entusiaster som skal utvikle et spill på egenhånd, så er det langt mer realistisk å bruke et annet språk enn C++. Dessuten er ikke C++ programmer portabelt i seg selv. Masse kode må skrives for hver plattform. For eksempel grafikk hvor Xbox 360 bruker Direct3D 9, mobilplattformer bruker OpenGL ES og PS3 bruker et proprietært API som jeg egentlig vet veldig lite om.

 

Skal man utvikle et spill for xbox 360 kan en like gjerne bruke XNA. Fortrinnsvis bruker man en ferdig spillmotor. En sparer mye tid på det, men på småspill er det lite vits i.

 

Når det gjelder C#: hva er kravet ditt for at et språk ikke skal være proprietært? At Microsoft ikke har rørt det? Det finnes Open Source implementasjoner av det, og Microsoft har klart og tydelig sagt at C# ikke er noe som de har noe patenter eller egne rettigheter på.

 

Hva med Web? Ajax er noe som kom direkte ut av Internet Explorer 5.

Endret av GeirGrusom
Lenke til kommentar
Gjest Slettet+9871234

Skal man utvikle et spill for xbox 360 kan en like gjerne bruke XNA. Fortrinnsvis bruker man en ferdig spillmotor. En sparer mye tid på det, men på småspill er det lite vits i.

Jeg vet det. Skroll net til XNA:

 

http://www.kjellbleivik.com/Books/GameDevelopment.php

 

Og den ferdige spillmotoren er vel ofte programmert i C++. Uformelt kaller noen C++ "neste generasjons assembler".

 

 

Hva med Web? Ajax er noe som kom direkte ut av Internet Explorer 5.

AJAX (Asynchronous JAvaScript and Xml) er vel ikke noe nytt og der finnes ulike teknologier basert på iFrames, Frames med null areal samt XMLHttpRequest objektet som ganske riktig ble funnet opp av Microsoft. Google bruker hybride teknologier i noen av sine AJAX applikasjoner.

 

Se også denne https://www.diskusjon.no/index.php?showtopic=1297476 (post #7) tråden for ytterligere informasjon.

Endret av Slettet+9871234
Lenke til kommentar

Er det noen ikke-OOP-programmeringsspråk som er lette å lære seg?

Er rimelig lei av å knote med OOP. Har forårsaket meg hodepine og grå hår i de siste månedene (actionscript 3.0 (både for flash og for flex) og diverse php) og jeg er lut lei.

 

Kunne tenkt meg å lære meg et språk som ikke er objektorientert og som jeg kan dra nytte av senere i livet, til hva enn egentlig.

Det være seg om jeg kunne tenkt meg å skrive kode til spill for Zunen min / den "gamle" Nokiaen min, eller små ikke-GUI-baserte applikasjoner for Windows.

 

Tips?

Endret av Datasmurf
Lenke til kommentar

Jeg vil tørre å påstå at C er et av de enkleste språkene å lære seg.

 

Det er ikke mange gotchas, språket er temmelig rett frem. Motsetning til Ruby, hvor 0 = true, eller Visual Basic sin håpløse implisitte konvertering av datatyper, eller PHP hvor noen funksjoner returnerer forskjellige primitive datatyper avhengig av resultat (dårlig programmeringsskikk spør du meg) og i C# må en være JÆVLIG obs på hvordan closures omslutter lokale variabler.

 

Irrelevant uansett. C er enkelt og greit, men jeg tror du kommer til å savne objektorientering ^^

Endret av GeirGrusom
Lenke til kommentar
Gjest Slettet+9871234

Jeg vil tørre å påstå at C er et av de enkleste språkene å lære seg.

Bortsett fra at utskrift er knotete. Det er god nok grunn til å gå over til C++ som i det alt vesentlige er en supermengde av C.

Lenke til kommentar
Gjest Slettet+9871234

utskrift?...

printf er da enkel i bruk...

Jeg personlig synes cout og cin er enklere.

 

Det går da fint an å bruke en C++ kompilator som om den var en C kompilator.

 

Har du ikke hørt om den finske tømmerhuggeren som brukte håndsag og øks og pleide å hugge 20 trær/dag. Du må bruke en motorsag sa kameraten så kan du kutte 100 trær/dag. Ok, sa finnen og kjøpte seg en motorsag. Etter noen dager klagde han til kameraten og sa at nå kuttet han bare 5 trær/dag. Kameraten startet motorsagen for finnen og viste hvordan det skulle gjøres.

 

Perkele, perkele utbrøt finnen. Brummar hon også?

Endret av Slettet+9871234
Lenke til kommentar

Jeg vil tørre å påstå at C er et av de enkleste språkene å lære seg.

Bortsett fra at utskrift er knotete. Det er god nok grunn til å gå over til C++ som i det alt vesentlige er en supermengde av C.

Utskrift knotete i C? Synes <iostream> er mye mer knot siden den oppfører seg som en weird state machine med tanke på ting som "%.2f" i C osv. Det eneste negative med stdio er at printf, osv ikke er typesafe, men i praksis hjelper kompilatorer og sjekker types for deg med warning. <iostream> er ikke god nok grunn til å gå over til C++, da tenker jeg heller på namespaces, templates, STL, osv. Error handling med iostream er også awkward.

 

// C
printf("%d + %d = %d\n", 1, 2, 3);

// C++ iostreams
std::cout << 1 << " + " << 2 << " = " << 3 << std::endl;

Allerede på helt trivielle eksempler som dette er det mer kode i iostreams og jeg tør påstå vanskeligere å forstå. Legger man til f.eks %02d, osv blir det veldig grisete ...

Endret av TheMaister
Lenke til kommentar

Det går da fint an å bruke en C++ kompilator som om den var en C kompilator.

 

Har du ikke hørt om den finske tømmerhuggeren som brukte håndsag og øks og pleide å hugge 20 trær/dag. Du må bruke en motorsag sa kameraten så kan du kutte 100 trær/dag. Ok, sa finnen og kjøpte seg en motorsag. Etter noen dager klagde han til kameraten og sa at nå kuttet han bare 5 trær/dag. Kameraten startet motorsagen for finnen og viste hvordan det skulle gjøres.

 

Perkele, perkele utbrøt finnen. Brummar hon også?

Selv ville jeg også valgt C++ over C når som helst, men han var ute etter prosedyre-basert språk. Du kan jo unngå å bruke klasser i C++ også, så det er jo et alternativ.

 

Men du kan normalt ikke kompilere et C program i C++ uten å sette kompilatoren i C-modus.

Lenke til kommentar
Gjest Slettet+9871234

Utskrift knotete i C?

 

Hvorfor skal jeg gå rundt å huske dette (se også eksempelet som starter med

 

#include <stdio.h>

 

int main(void)

 

etter kommetaren /* ... */)

 

 

/*
From K&R II page 15:

%d print as decimal integer
%6d print as decimal integer, at least 6 characters wide
%f print as floating point
%6f print as floating point, at least 6 characters wide
%.2f print as floating point, 2 characters after decimal point
%6.2f print as floating point, at least 6 wide and 2 after decimal point

From K&R II page 20:
count characters in input; 2nd version

#include <stdio.h>

main()
{
double nc;
for (nc = 0; gechar() != EOF; ++nc)
;
printf("%.0f\n", nc);
}
printf uses %f for both float and double; %.0f suppresses the printing of the decimal point
and the fraction part, which is zero.
The body of this for loop is empty, because all the work is done in the test and increment
parts. But the grammatical rules of C require that a for statement have a body. The isolated
semicolon, called a null statement, is there to satisfy that requirement. We put it on a separate
line to make it visible.

From K&R II page 37:
The complete set of escape sequences is
\a alert (bell) character
\\ backslash
\b backspace
\? question mark
\f formfeed
\' single quote
\n newline
\" double quote
\r carriage return
\ooo octal number
\t horizontal tab
\xhh hexadecimal number
\v vertical tab

From K&R II page 50:
3.1 Statements and Blocks
An expression such as x = 0 or i++ or printf(...) becomes a statement when it is
followed by a semicolon, as in
x = 0;
i++;
printf(...);
In C, the semicolon is a statement terminator, rather than a separator as it is
in languages like Pascal.
Braces { and } are used to group declarations and statements together into a
compound statement, or block, so that they are syntactically equivalent to a
single statement. The braces that surround the statements of a function are one
obvious example; braces around multiple statements after an if, else, while, or
for are another. (Variables can be declared inside any block; we will talk about
this in Chapter 4.) There is no semicolon after the right brace that ends a block.

From K&R II page 51:
3.3 Else-If
The construction

if (expression)
statement
else if (expression)
statement
else if (expression)
statement
else if (expression)
statement
else
statement

occurs so often that it is worth a brief separate discussion. This sequence of
if statements is the most general way of writing a multi-way decision. The
expressions are evaluated in order; if an expression is true, the statement
associated with it is executed, and this terminates the whole chain. As always,
the code for each statement is either a single statement, or a group of
them in braces.

From K&R II page 52-53:

3.4 Switch
The switch statement is a multi-way decision that tests whether an expression
matches one of a number of constant integer values, and branches accordingly.

switch (expression) {
case const-expr: statements
case const-expr: statements
default: statements
}

Each case is labeled by one or more integer-valued constants or constant
expressions. If a case matches the expression value, execution starts at that
case. All case expressions must be different. The case labeled default is
executed if none of the other cases are satisfied. A default is optional; if it
isn't there and if none of the cases match, no action at all takes place.
Cases and the default clause can occur in any order.

In Chapter 1 we wrote a program to count the occurrences of each digit, white
space, and all other characters, using a sequence of if ... else if ... else.
Here is the same program with a switch:

#include <stdio.h>
main() //count digits, white space, others
{
int c, i, nwhite, nother, ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; i++)
ndigit[i] = 0;
while ((c = getchar()) != EOF) {
	switch (c) {
	case '0': case '1': case '2': case '3': case '4':
	case '5': case '6': case '7': case '8': case '9':
		ndigit[c-'0']++;
		break;
	case ' ':
	case '\n':
	case '\t':
		nwhite++;
		break;
	default:
		nother++;
		break; //Not needed, but good programming practice.
	}
}
printf("digits =");
for (i = 0; i < 10; i++)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %d\n",
nwhite, nother);
return 0;
}

The break statement causes an immediate exit from the switch. Because cases serve
just as labels, after the code for one case is done, execution falls through to
the next unless you take explicit action to escape. break and return are the most
common ways to leave a switch. A break statement can also be used to force an
immediate exit from while, for, and do loops, as will be discussed later in this
chapter.

Falling through cases is a mixed blessing. On the positive side, it allows several
cases to be attached to a single action, as with the digits in this example. But
it also implies that normally each case must end with a break to prevent falling
through to the next. Falling through from one case to another is not robust, being
prone to disintegration when the program is modified. With the exception of
multiple labels for a single computation, fall-throughs should be used sparingly,
and commented.
As a matter of good form, put a break after the last case (the default here) even
though it's logically unnecessary. Some day when another case gets added at the
end, this bit of defensive programming will save you.

From K&R II page 53 -54:
The for statement

for (expr1; expr2; expr3)
statement

is equivalent to

expr1;
while (expr2) {
statement
expr3;
}

except for the behaviour of continue, which is described in Section 3.7.
Grammatically, the three components of a for loop are expressions. Most commonly,
expr1 and expr3 are assignments or function calls and expr2 is a relational
expression. Any of the three parts can be omitted, although the semicolons must
remain. If expr1 or expr3 is omitted, it is simply dropped from the expansion.
If the test, expr2, is not present, it is taken as permanently true, so

for (; {
...
}

is an ``infinite'' loop, presumably to be broken by other means, such as a break
or return. Whether to use while or for is largely a matter of personal preference.
For example, in

while ((c = getchar()) == ' ' || c == '\n' || c = '\t')
; // skip white space characters

there is no initialization or re-initialization, so the while is most natural.

The for is preferable when there is a simple initialization and increment since
it keeps the loop control statements close together and visible at the top of
the loop. This is most obvious in

for (i = 0; i < n; i++)
...

which is the C idiom for processing the first n elements of an array,

From K&R II page 50:
From K&R II page 50:
*/

#include <stdio.h>


int main(void)
{

int i=0, years[3001];
while (i<3001) {
	years[i]=i;
	++i;
}
printf("\n\n");
printf("Some output formatting: ");
printf("\n\n");
for (i= 2000; i < 2100; i++)
	printf("%6d%c", years[i], (i%10==9 || i==99) ? '\n' : ' ');
printf("\n\n");
for (i= 2100; i < 2200; i++)
	printf("%6d\t", years[i], (i%10==9 || i==99) ? '\n' : ' ');
printf("\n\n");
for (i= 2000; i < 2101; i++)
	if ((years[i] % 4 == 0 && years[i] % 100 != 0) || years[i] % 400 == 0)
		printf("%d is a leap year\n", years[i]);
	else
		printf("%d is not a leap year\n", years[i]);
return 0;
}

 

Jeg står ved mitt forrige innlegg, men smak og behag kan som kjent ikke diskuteres.

Endret av Slettet+9871234
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...