Hei vaan kaikille nörteille
Jonkun aikaa sitten kysyin samaa kysymystä Javan kohdalla, mutta nyt on tullen suunta kääntynyt C++:aa kohti. Kysymys on ehkä hieman tyhmä, mutta toisaalta, niin olen minäkin. Eli mikä olisi paras kehitysympäristö ja grafiikkakirjasto C++:lle?
Ymmärrän kysymyksen abstraktisuuden ja suhteellisuuden joten tarkennan hieman mitä "paras" minun kohdallani tarkoittaa. Haluan kehitysympäristön jossa on tuki visuaalisille komponenteille ja suora kääntömahdollisuus Windowsille ja Linuxille, mielellään myös MACille ym. Sen lisäksi siihen pitäisi saada suht. tuskattomasti liitettyä OpenGL:ään pohjautuva grafiikkakirjasto. Ilmaisia lounaita ei ole, joten en usko että kysymykseeni edes olisi suoraa vastausta, mutta läheltä liippaavatkin otetaan huomioon.
Kokeilin Visual C++ Expressiä tuossa pari kuukausi sitten. Ohjelma on sinällään ihan hyvä mutta Macit ja Linuxit lisääntyvät varsinkin kannettaviin niin tappovauhtia että jos jotain julkaistavaa yrittäisi saada aikaan niin ei oikein houkuttele noinkaan windows-dominoiva IDE. Lisäksi VisualC++:lla tehtyjä ikkuna/komponenttipohjaisia ohjelmia ajettaessa pitää olla (uskoakseni) .net framework asennettuna koneelle.
Sitten esim. GCC ja SDL olisi jo harkinnanvarainen kombinaatio, mutta kun maitovellissä kerran olen kasvanut niin alkaa varmasti jossain vaiheessa tympimään tekstipohjaisuus.
ideksi dev-cpp
pelkkä tekstimuotoisuus:
g++(=c++kääntäjä)/gcc(=c kääntäjä) molemmat tulevat dev-cpp:n mukana
helppo grafiikan(lähinnä 2d) näppäinsyötteiden audion yms lisäys(yhteensopiva moniin järjestelmiin):
SDL
vaativampi grafiikan(2d + 3d) näppäinsyötteiden audion yms. lisäys(yhteensopiva moniin järjestelmiin):
SDL(näppäinsyötteet, audio, ikkunan luonti yms) + OpenGL(grafiikka)
vaativampi grafiikan(2d + 3d) näppäinsyötteiden audion yms lisäys(yhteensopiva windowsiin):
directx
g++/gcc toimivat kaikkiin yllä esitettyihin vaihtoehtoihin.
älä unohda linkittää kirjastoja :)
Ks. Metabolixin kirjoittama SDL:n ja OpenGL:n yhteiskäytön opas:
https://www.ohjelmointiputka.net/oppaat/opas.
OpenGL kotisivut:
http://www.opengl.org/
SDL kotisivut:
http://www.libsdl.org/
Kääntäjäksi kannattaa valita GCC, jotta on sama vehje joka käyttöjärjestelmässä. Käännökset eri järjestelmiin vaativat erilliset kääntäjät, jotka yleensä joudut itse kääntämään (Google: GCC cross-compiler). Linuxiin tosin saa lähes aina toimivan Windows-kääntäjän suoraan paketinhallinnasta. Käännöksiä varten täytyy saada myös käytettävistä kirjastoista eri järjestelmien versiot.
Nykyään uskallan ehkä suositella C++-ohjelmointiin IDEä nimeltä Code::Blocks, jos vapaavalintainen tekstieditori ei tunnu riittävän. GCC:n epävirallisen Windows-version saa todella helposti irtokappaleena, se on joitakin versionumeroita uudempi kuin virallinen MinGW-GCC. Itse suosin hyvää tekstieditoria ja komentorivikäännöksiä, koska näin on helpointa hallita täsmälleen, mitä käännösprosessissa tapahtuu.
SDL + OpenGL on porttautuva grafiikkavaihtoehto, ja SDL:n tai OpenAL:n kautta löytyy myös äänituki. Jos et halua itse noita käyttää, voit toki valita valmiita apuvälineitä. (Itse päädyin grafiikoissa alustavasti Irrlicht Engineen, tosin haittapuolena on melkoisen suuri koko.)
Jos tarkoitit grafiikkakirjastolla GUI-kirjastoa, esimerkiksi wxWidgets tai GTK+ ovat hyviä vaihtoehtoja.
Metabolix kirjoitti:
Jos tarkoitit grafiikkakirjastolla GUI-kirjastoa, esimerkiksi wxWidgets tai GTK+ ovat hyviä vaihtoehtoja.
Tai sitten Qt, joka on toki paljon muutakin kuin GUI-kirjasto. IDE:ksi tällöin QtCreator.
Metabolix kirjoitti:
Jos tarkoitit grafiikkakirjastolla GUI-kirjastoa, esimerkiksi wxWidgets tai GTK+ ovat hyviä vaihtoehtoja.
Etsin sekä IDEä, grafiikkakirjastoa että GUI-kirjastoa.
Eli DevC++ menee testipenkkiin. SDL+OpenGL kuulostaa myös hyvältä, tosin minun pitää ensin perehtyä hieman yleensä C++:n maailmaan ennenkuin teen mitään päätöksiä. Minulle on todella vaikea vaihtaa kehitysympäristöä tai yleensäkin tuttuja ohjelmia tuntemattomiin. Mutta se nyt on varmaa että Delphi-ajat ovat minun osaltani ohitse.
Janezki kirjoitti:
Eli DevC++ menee testipenkkiin.
Sen huono puoli on, että kehitys on loppunut jo vuosikaudet sitten ja bugeja on jonkin verran. Kannattaa siis harkita Code::Blocksia, joka on myös laajennettavampi ja luultavasti monin osin parempi. Myös tavallinen tekstieditori on aivan hyvä valinta, ja eikös Delphikin taivu C++-IDE:ksi?
OpenWatcom voisi olla yksi vaihtoehto. Paketti sisältää IDE:n, debuggerin, profilerin ja muuta sälää. Tuetut alustat: OS/2, Windows ja Linux.
Metabolix kirjoitti:
Janezki kirjoitti:
Eli DevC++ menee testipenkkiin.
Sen huono puoli on, että kehitys on loppunut jo vuosikaudet sitten ja bugeja on jonkin verran. Kannattaa siis harkita Code::Blocksia, joka on myös laajennettavampi ja luultavasti monin osin parempi. Myös tavallinen tekstieditori on aivan hyvä valinta, ja eikös Delphikin taivu C++-IDE:ksi?
Niin nojoo, eipä välttämättä kannata käyttää DevC++:aa jos sitä ei kerran edes tueta enää. Tuosta Delphijutusta en olisi yhtään varma, Borlandilla kun oli aikoinaan omat alustat C++:lle, liekö enää.
Heippa Janezki!
How about Eclipse CDT/MinGW:GTK:SDL:WxWidgets:...
(kaukaa idästä löytyy aikas mielenkiintoisia palikoita)
neau33 kirjoitti:
How about Eclipse CDT/MinGW:GTK:SDL:WxWidgets:...
Kyllä! Eclipse CDT on ehdottomasti kokeilemisen arvoinen vaihtoehto IDE:ksi ja omasta mielestäni hakkaa vanhan ja bugisen DevCpp:n ihan 100-0 (vaikka onkin aika raskas). Eclipse toimii hyvin myös Linuxilla.
Myös eksoottisemmilla IDEillä, kuten NetBeanssilla voi koodata C++:ssaa useilla käyttiksillä.
Janezki kirjoitti:
Ohjelma on sinällään ihan hyvä mutta Macit ja Linuxit lisääntyvät varsinkin kannettaviin niin tappovauhtia että jos jotain julkaistavaa yrittäisi saada aikaan niin ei oikein houkuttele noinkaan windows-dominoiva IDE.
Siis selvennettäköön tätä vielä sen verran että minä koodaan todennäköisesti vielä pitkään Windows-ympäristössä, mutta halua tehdä ohjelmia jotka pyörivät näissä kolmessa käyttöjärjestelmässä, tai ainakin cross-platforming tapahtuisi ilman kyyneleitä.
No periaatteessa tässä vaiheessa on yks hailee mitä käytän, kunhan tulisi opeteltua C++:aa eikä rupateltua foorumilla.
Ongelmia ei pitäisi tulla, kun kirjoitat standardinmukaista koodia ja valitset kirjastoja, joita aktiivisesti ylläpidetään kaikissa haluamissasi järjestelmissä.
C++ on perusteiltaan Delphin jälkeen aika helppo. Ilmaisu vain on tiiviimpää, kun monet Pascalin "ylimääräiset" sanat puuttuvat. :)
Eclipse on ihan hyvä IDE todellakin, itse käytin jonkin aikaa sitä Javan kanssa ja hyvin toimi ja ominaisuuksia oli riittämiin. Siirryin tosin komentorivikääntämiseen koska haluan pitää asiat yksinkertaisina.
Ihmettelen hiukan tuota siirtymistä Javasta jo hiukan vanhahtavaan C++-kieleen. Itse käytin jääräpäisesti monta vuottaa C++:aa mutta nykyään yksinomaan Javaa. Syitä ovat Javan kehittyneempi ja helpompi kieli (mm. ei osoittimia, täysin luokkapohjainen, roskienkeruu), alustariippumattomuus ja hyvät valmiit kirjastot. Nopeuskin on täysin samaa luokkaa kuin C-kielillä josta poikkeuksena vain ajoittainen roskienkeruun aiheuttama lisäkuormitus, joka ei ole ongelma hyvin suunnitellussa ohjelmassa. Lisäksi JRE optimoi koodin erikseen joka alustalle, kun C++-käännökset eivät voi olla optimoituja joka laitteistolle erikseen (käytännössä). En ole nähnyt mitään syytä palata takaisin, varsinkin kun nykyinen OpenGL:ää käyttävä peliprojektini pyörii vähänkään pelikelpoisella alustalla useita satoja ruutuja sekunnissa, vaikka grafiikat ovat ihan nykyajalta.
Metabolix kirjoitti:
Ongelmia ei pitäisi tulla, kun kirjoitat standardinmukaista koodia ja valitset kirjastoja, joita aktiivisesti ylläpidetään kaikissa haluamissasi järjestelmissä.
C++ on perusteiltaan Delphin jälkeen aika helppo. Ilmaisu vain on tiiviimpää, kun monet Pascalin "ylimääräiset" sanat puuttuvat. :)
Eniten risoo tässä vaiheessa 2 asiaa: Standardien puute ja koodin vaikealukuisuus. Kumpikin asia tietysti korjaantuu ajan myötä.
Päädyin pidemmän pohdinnan jälkeen aikalailla samoihin vaihtoehtoihin kuin sinäkin, eli Code::Blocks, SDL ja MinGW. En ole tehnyt vielä päätöksiä 3D-grafiikkakirjaston suhteen, mutta Ogre ja Irrlicht näyttävät kumpikin ihan miellyttäviltä.
Tumpelo kirjoitti:
Ihmettelen hiukan tuota siirtymistä Javasta jo hiukan vanhahtavaan C++-kieleen. Itse käytin jääräpäisesti monta vuottaa C++:aa mutta nykyään yksinomaan Javaa. Syitä ovat Javan kehittyneempi ja helpompi kieli (mm. ei osoittimia, täysin luokkapohjainen, roskienkeruu), alustariippumattomuus ja hyvät valmiit kirjastot. Nopeuskin on täysin samaa luokkaa kuin C-kielillä josta poikkeuksena vain ajoittainen roskienkeruun aiheuttama lisäkuormitus, joka ei ole ongelma hyvin suunnitellussa ohjelmassa. Lisäksi JRE optimoi koodin erikseen joka alustalle, kun C++-käännökset eivät voi olla optimoituja joka laitteistolle erikseen (käytännössä). En ole nähnyt mitään syytä palata takaisin, varsinkin kun nykyinen OpenGL:ää käyttävä peliprojektini pyörii vähänkään pelikelpoisella alustalla useita satoja ruutuja sekunnissa, vaikka grafiikat ovat ihan nykyajalta.
No minulla lähinnä tuo työllistyminen ja opisklelu vaikuttavat siihen millä kielillä koodaan. On minulla Java ja Python edelleen pinnalla, mutta valitsin C++:an primääriseksi kieleksi koska sen osaamiselle on niin kova kysyntä työelämässä. Työn lisäksi tarvitsen C/C++:aa myös kursseilla. C++ on kuitenkin ohjelmointimaailman selkäranka.
Olet tietysti ihan oikeassa siinä että C++ on vanhahtavaa ja Javasta on tulossa valtavirtaa, mutta C on se joka pitää C++:an kyydissä vielä pitkään, koska C dominoi Assemblyn rinnalla laiteläheisessä ohjelmoinnissa, mihin Java tuskin ikinä pystyy.
Tämä väittely ei välttämättä kuulu tähän keskusteluun, mutta sanotaan nyt.
Itse käytän monesti mieluummin C++:ssaa suurelta osin varmaan todellisuudessa siksi, että se on minulle tutumpi kieli, mutta myös siksi, että Java-kielessä hyvin syvällä muutamia asioita, jotka harmittavat minua suuresti. Päällimmäisin näistä on Javan "kieli osaa resurssienhallinan paremmin kuin sinä" -lähestymistapaan sisältyvä RAII-mallin käytön mahdottomuus.
JVM:t osaavat ilmeisesti muistinhallinan melko hyvin, mutta entä muut resurssit? Socketit, säikeet, tiedostokahvat (keinotekoinen esimerkki), ulkoisten kirjastojen alustus... C++:ssa hoituu kätevästi RAII:n avulla, mutta Javassa voi mennä aika pahaksi finally
-puuroksi.
Wikipediassa tämä ilmaistaan tylysti näin:
http://en.wikipedia.org/wiki/
Java is more prone to leaking non-memory resources, while idiomatic C++ makes that much harder.
Lisäksi Java:n kätevyys perustuu vahvasti siihen, että standardikirjasto sisältää suurella todennäköisyydellä kaikki ohelmassa tarvittavat tietorakenteet ja yleisimmät geneeriset algoritmit. Jos uusi tietorakenne pitää itse implementoida Javalla, muuttuvat pointtereiden puute ja automaattinen roskienkeruu helposti rasitteiksi. (Myönnettäköön tosin, että tämänhetkinen Javan standardikirjasto kyllä pesee C++:n vastaavan mennen tullen)
Entä miksi Javassa ei ole kunnollista const
-määrettä?
C++ on joidenkin mielestä nykyään "matalan tason ohjelmointikieli", jota käytetään vain tilanteissa, joissa Javaa ei syystä tai toisesta voi käyttää, koska Javalla kaikki on helpompaa, kuin C++:lla. C++:ssaa siis kannattaisi käyttää vain esimerkiksi ympäristöissä, joissa JVM ei pyöri tai vaaditaan helppoa liitettävyyttä ulkoisiin C-kirjastoihin yms...
Tämä varmaan pitäisikin paikkansa, jos Java olisi kielenä kaikin puolin C++:ssaa parempi, mutta ainakaan minusta näin ei ole.
Janezki kirjoitti:
Eniten risoo tässä vaiheessa 2 asiaa: Standardien puute ja koodin vaikealukuisuus. Kumpikin asia tietysti korjaantuu ajan myötä.
Mitä tarkoitat standardien puutteella? C++ on erittäin selkeästi standardoitu. Jos viittaat esimerkiksi grafiikkakirjastojen yms. standardointiin, niin tässähän on ongelmana laitteiston ja käyttöjärjestelmien monipuolisuus. OpenGL ja Javan standardikirjastot ovat tässä suhteessa aivan samanlaisia: molemmat toimivat vain niin monella alustalla, kuin ne on toteutettu. Jos ei standardoida yhtä yhteistä käyttöjärjestelmää, kirjastojenkin laajuus on rajoitettu.
Koodin vaikealukuisuus on tottumuskysymys. Hyvin kirjoitettu C++ on varmasti yhtä selkeää kuin hyvin kirjoitettu Pascal. Valitettavasti korrelaatio pätee myös huonosti kirjoitettuun koodiin.
os kirjoitti:
Tämä väittely ei välttämättä kuulu tähän keskusteluun, mutta sanotaan nyt.
Juu lopetetaan tämä heti alkuunsa. Tiedän ja myönnän että Java ei sovellu kaikkeen, mutta ei sitä ole suunniteltukaan käyväksi joka paikkaan. Teollisuus ja laiteläheinen ohjelmointi vaatii ehdottomasti jotain muuta kuin Javan, enkä kritisoi ketään joka käyttää C++:aa esim. peleihin tai muuhun. Java on kuitenkin todella kova kieli ja vie minusta ohjelmointia oikeaan suuntaan.
Metabolix kirjoitti:
Mitä tarkoitat standardien puutteella? C++ on erittäin selkeästi standardoitu. Jos viittaat esimerkiksi grafiikkakirjastojen yms. standardointiin, niin tässähän on ongelmana laitteiston ja käyttöjärjestelmien monipuolisuus. OpenGL ja Javan standardikirjastot ovat tässä suhteessa aivan samanlaisia: molemmat toimivat vain niin monella alustalla, kuin ne on toteutettu. Jos ei standardoida yhtä yhteistä käyttöjärjestelmää, kirjastojenkin laajuus on rajoitettu.
Lähinnä viittasin softapuuroon, mutta se taitaa päteä vain ilmaisten kehitysympäristöjen kohdalla. Esim. Delphissä oli komponentit, IDE, kääntäjä ja alkeellinen grafiikkakirjastokin samassa paketissa. Nyt jokaista osasta pitää hakea ja konffata erikseen. Minulla meni 3 tuntia että sain nuo Code:Blocksin, MinWG:n ja SDL:n toimimaan yhdessä. On kielessäkin aika kummallisia juttuja, niinkuin vakioiden määrittäminen #definellä ja constilla (<---esimerkki johon ei tule takertua), mutta kielen kohdalla luotan enemmän siihen että syyt sotkuisuudelle ovat järkiperäisiä.
Metabolix kirjoitti:
Koodin vaikealukuisuus on tottumuskysymys. Hyvin kirjoitettu C++ on varmasti yhtä selkeää kuin hyvin kirjoitettu Pascal. Valitettavasti korrelaatio pätee myös huonosti kirjoitettuun koodiin.
Ja se mikä on vaikealukuista on myös tottumiskysymys: esimerkiksi minä inhoan yli kaiken esim. funktiokutsun suoraa jakamista usealle riville. Mielummin kirjoitetaan yksittäinen komento samalle riville, jätetään parametrien väliin pilkun jälkeen väli ja käytetään automaagirivittävää editoria; tämä maksimoi tilankäytön ja rivit ovat juuri niin leveitä kuin koodin lukija haluaa. Lisäksi inhoan välien käyttämistä tabulaattorien sijaan, ne tekevät hommasta yhtä tuskaa kun itse aina käyttää vain tabulaattoreita. Ja ylimääräiset välilyönnit operaattorien, sulkujen yms. välissä tekevät minun mielestäni koodista ruman näköistä, käyttäisi niitä vain niiden pilkkujen jälkeen (okei, useimmilla tämä ei varmaan todellakaan ole näin, mutta kunnon syntaksiväritystä ja monospace-fonttia käyttävällä editorilla ylimääräiset välilyönnit ovat hirveän näköisiä ja vain hankaloittavat editointia turhaan). Lisäksi funktioiden ja muuttujien nimeäminen tyyliin foo_bar on minusta jostain syystä kammottavaa (en tiedä mistä tämä kammo minulle on kehittynyt, saattaa johtua aikaisista gtk-kokemuksista, sillä gtk:n c-api on minusta aivan kammottava käyttää, ihan turhaan epämääräistä spagettikoodia. Ja niitä ylimääräisiä rivinvaihtoja. Ja välilyöntejä tabulaattorien sijaan). Funktioiden ja muuttujien nimissä minä tykkään javascriptin tapaista tyyliä fooBar, tai FooBar. En tiedä onko tämä alun perin kotoisin jostain tilaoptimoinnista, mutta tapa siitä on tullut.
Olipa taas kauhea vuodatus offtopicia. En sitten tarkoittanut loukata ketään ilmaisemalla Oikean Mielipiteeni.
Janezki kirjoitti:
On kielessäkin aika kummallisia juttuja, niinkuin vakioiden määrittäminen #definellä ja constilla (<---esimerkki johon ei tule takertua), mutta kielen kohdalla luotan enemmän siihen että syyt sotkuisuudelle ovat järkiperäisiä.
En takerru aiheeseen, mutta kehotan lukemaan oppaan C:n esikääntäjästä. Aivan samat sotkut onnistuvat Pascalissakin, niitä ei vain yleisesti käytetä.
kray kirjoitti:
Lisäksi funktioiden ja muuttujien nimeäminen tyyliin foo_bar on minusta jostain syystä kammottavaa (en tiedä mistä tämä kammo minulle on kehittynyt, saattaa johtua aikaisista gtk-kokemuksista, sillä gtk:n c-api on minusta aivan kammottava käyttää, ihan turhaan epämääräistä spagettikoodia. Ja niitä ylimääräisiä rivinvaihtoja.
Hassua sinänsä, itse aina ihmettelen miten Windows API onkin niin .. sellainen, kun gtk:nkin tekijät ovat näyttäneet että C:lläkin saa käytettävissä olevan GUI-kirjaston tehtyä C:llä. Ikään kuin sattumalta pidän myös tämä_on_muuttuja-nimeämistapaa mixedCasea tai CapWordsia (uhh...) selkeämpänä niin muuttujiin kuin funktioihinkin. Tämä tosin on vain heikohko mieltymys (jota en esim. Qt:n kanssa käytä), mutta en alkuunkaan ymmärrä tapaa laittaa operaattoreita, kuten sijoitusoperaattoria, kiinni operandeihin. Luotaantyöntävää, suorastaan, melkein yhtä paljon kuin (väärinymmärretty) unkarilainen notaatio (tarkoitan juuri sinua, a_crszkvc32Muuttuja ;)
Aihe on jo aika vanha, joten et voi enää vastata siihen.