Miksi kouluissa/opistoissa

A Aimo

tahkotaan edelleen C-kieltä?
Kun C kielellä voi tehdä täysin samat hommat kuin pelkällä ceellä.
Cee plus plussalla taasen voi tehdä sellaista mitä ceellä ei voi.
Mikä järki tuossa koulutuksessa on?

16

1316

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Ensiksikin, C-kieli on yksinkertaisempi ja helpompi oppia kuin C eikä sen kanssa ole oppimiskynnys jyrkkä kun ei tarvitse ymmärtää olio-ohjelmoinnista mitään.

      Toisekseen, C-kielellä on sellainen vahvuus, että sillä toteutettuja komponentteja voi käyttää vaivatta eri useissa muissa ohjelmointikielissä ja siksi C-kieli on alan standardi yleiskäyttöisissä kirjastoissa. Lisäksi C-kieli kun on yksinkertaisempi, se tarvitsee vähemmän massaa tukikirjastoon ja saa sitten käännettyä jonkin verran kevyempiä ohjelmia. Tällä on merkitystä kevyemmissä laitteissa.

      • C- kieli on muinaisjäänne

        Ihminen, joka aloittaa ensimmäistä kertaa elämässään jonkun ohjelmointikielen opiskelun, oli kyseessä sitten C tai C niin molemmat kielet ovat yhtä vaikeita/helppoja.

        Kiinassa lapset oppivat puhumaan ja kirjoittamaan Kiinaa ihan yhtä vanhoina kuin suomalaiset lapset oppivat puhumaan ja kirjoittamaan suomea. Vaikka joku väittäisikin, että kiinankieli on paljon paljon vaikeampaa.


      • C- kieli on muinaisjäänne kirjoitti:

        Ihminen, joka aloittaa ensimmäistä kertaa elämässään jonkun ohjelmointikielen opiskelun, oli kyseessä sitten C tai C niin molemmat kielet ovat yhtä vaikeita/helppoja.

        Kiinassa lapset oppivat puhumaan ja kirjoittamaan Kiinaa ihan yhtä vanhoina kuin suomalaiset lapset oppivat puhumaan ja kirjoittamaan suomea. Vaikka joku väittäisikin, että kiinankieli on paljon paljon vaikeampaa.

        "Ihminen, joka aloittaa ensimmäistä kertaa elämässään jonkun ohjelmointikielen opiskelun, oli kyseessä sitten C tai C niin molemmat kielet ovat yhtä vaikeita/helppoja."

        Olioparadigmassa on ylimääräistä oppimista, lisäksi C on astetta monimutkaisempi ja siinä on enemmän oppimista että sen hallitsee.


      • yo:laisille
        M-Kar kirjoitti:

        "Ihminen, joka aloittaa ensimmäistä kertaa elämässään jonkun ohjelmointikielen opiskelun, oli kyseessä sitten C tai C niin molemmat kielet ovat yhtä vaikeita/helppoja."

        Olioparadigmassa on ylimääräistä oppimista, lisäksi C on astetta monimutkaisempi ja siinä on enemmän oppimista että sen hallitsee.

        "Olioparadigmassa on ylimääräistä oppimista, lisäksi C on astetta monimutkaisempi ja siinä on enemmän oppimista että sen hallitsee."

        Tästä vastustuksesta huolimatta yliopistoissa koodauksen opettelu aloitetaan (monien kohdalla nollasta) Javalla, joka on jopa C :aa puhtaampi oliokieli.


    • 0000000000000000

      Ehkä sen takia ettei mene tumput suuhun sitten kun pitää kirjoittaa tai suunnitella C -kielisiä ohjelmia tai kirjastoja. Laitteistoläheinen koodi on usein kirjoitettu C:llä ja sulautettujen puolella ei aina edes ole saatavilla C kääntäjää. Lukuisat kirjastot ovat kirjoitettu myös C:llä ilman luokka ajattelua.

      Toisaalta voidaan kysyä mitä järkeä on opetella C :aa eikä esim. C:tä ja Pythonia, C:tä ja Javaa tai C:tä ja C#:ia. Yksi syy C:n opiskeluun on se mitä yhdessä viestissä sanottiin, eli kun opiskelijoille haluaan opettaa perusteita (for, while, do while, jne, muttujat, jne.) ei silloin kannata sotkea mukaan olio käsitteitä.

    • Tahvo Tohveli

      Miksi hankkia koira, kun voi hankkia mustekalan, joka on tehty naulaamalla neljä lautaa koiraan? Se voi tehdä kaiken mitä tavallinen koira voi tehdä, ja lisäksi se on mustekala.

    • Paremmat

      Kunnon opinahjoissa opetetaan paljon parempia kieliä, niin korkeamman tason käsitteet tulevat tutuiksi alusta alkaen. Siitä on ihan tutkittuja tuloksia: C -kielellä aloittavat opiskelijat pärjäävät keskimäärin huonommin jatkokursseilla, kuin erityisesti opetukseen hyvin sopivilla kielillä aloittaneet.

      C ja C voidaan opetella tarpeen mukaan.

    • pitäisi aloittaa

      assemblerilla niin perusasiat kuten muistin rakenne, tavukoodi yms tulee tutuksi

      • Kieltämättä joo. Ihmiset jotka ei lähde opiskelemaan alhaalta ylöspäin, eivät oikeastaan ymmärrä asioista yhtään mitään. Tavukoodilla ei kyllä ole oikeastaan mitään merkitystä mutta CPU:n toiminta yms. pitäisi kyllä olla selvillä.


      • TRRY

        Assemblyllä ohjelmoimalla *ei* tule tavukoodi tutuksi. Jälkimmäinen on ohjelmointikielen tulkin (jota joskus myös virtuaalikoneeksi kutsutaan) käyttämä välikieli, missä perinteisesti yhden käskyn pituus on yksi tavu (tästä tulee myös nimi "tavukoodi"). Tavukoodia suoritetaan hyvin usein pinokoneella, kuten esim. JavaVM ja Python tekevät. Tavukoodin suorittaminen on huomattavasti nopeampaa kuin koodin suora tulkkaaminen.

        Assemblyssä eli symbolisessa konekielessä käännös puolestaan tehdään konekielelle. Konekielisen käskyn pituus riippuu prosessoriarkkitehtuurista, ja joissakin arkkitehtuureissa myös käskystä itsestään. x86:ssakin jotkin käskyt ovat pidempiä kuin toiset.

        Assemblyllä ohjelmoidessa joutuu tuskailemaan monien prosessoriarkkitehtuurista johtuvien ikävyyksien kanssa: esimerkiksi rekisterien määrä ja koko vaihtelevat paljon. Kun rekistereitä on vähän (kuten x86:ssa), niin tylsä osuus kasvaa: tarpeettoman tuntuisia muistihakuja ja -tallennuksia saa tehdä usein. Jos välttämättä haluaa opetella ohjelmoimaan tästä näkökulmasta, olennaiseen voi keskittyä vähemmällä tuskalla ottamalla alustaksi jonkin hieman teoreettisemman Register_machine:n (ks. wikipediaa) kuin oikean prosessoriarkkitehtuurin.

        C on "portattava assembly". Silläkin ohjelmoidessa pääsee ihan riittävästi (ja välillä vähän liiankin läheltä mm. "bus erroreiden" kautta) kiinni mm. muistin rakenteeseen. C puolestaan tarjoaa mahdollisuuden päästä eroon osoittimista, muttei kuitenkaan pakota siihen.


      • TRRY kirjoitti:

        Assemblyllä ohjelmoimalla *ei* tule tavukoodi tutuksi. Jälkimmäinen on ohjelmointikielen tulkin (jota joskus myös virtuaalikoneeksi kutsutaan) käyttämä välikieli, missä perinteisesti yhden käskyn pituus on yksi tavu (tästä tulee myös nimi "tavukoodi"). Tavukoodia suoritetaan hyvin usein pinokoneella, kuten esim. JavaVM ja Python tekevät. Tavukoodin suorittaminen on huomattavasti nopeampaa kuin koodin suora tulkkaaminen.

        Assemblyssä eli symbolisessa konekielessä käännös puolestaan tehdään konekielelle. Konekielisen käskyn pituus riippuu prosessoriarkkitehtuurista, ja joissakin arkkitehtuureissa myös käskystä itsestään. x86:ssakin jotkin käskyt ovat pidempiä kuin toiset.

        Assemblyllä ohjelmoidessa joutuu tuskailemaan monien prosessoriarkkitehtuurista johtuvien ikävyyksien kanssa: esimerkiksi rekisterien määrä ja koko vaihtelevat paljon. Kun rekistereitä on vähän (kuten x86:ssa), niin tylsä osuus kasvaa: tarpeettoman tuntuisia muistihakuja ja -tallennuksia saa tehdä usein. Jos välttämättä haluaa opetella ohjelmoimaan tästä näkökulmasta, olennaiseen voi keskittyä vähemmällä tuskalla ottamalla alustaksi jonkin hieman teoreettisemman Register_machine:n (ks. wikipediaa) kuin oikean prosessoriarkkitehtuurin.

        C on "portattava assembly". Silläkin ohjelmoidessa pääsee ihan riittävästi (ja välillä vähän liiankin läheltä mm. "bus erroreiden" kautta) kiinni mm. muistin rakenteeseen. C puolestaan tarjoaa mahdollisuuden päästä eroon osoittimista, muttei kuitenkaan pakota siihen.

        "Assemblyllä ohjelmoimalla *ei* tule tavukoodi tutuksi."

        Konekieli on tavukoodia.. Sitä vaan ajaa prosessori eikä virtuaalikone.


      • TRRY
        M-Kar kirjoitti:

        "Assemblyllä ohjelmoimalla *ei* tule tavukoodi tutuksi."

        Konekieli on tavukoodia.. Sitä vaan ajaa prosessori eikä virtuaalikone.

        Konekieli on tavukoodia yhtä paljon kuin C on Smalltalkia. Niillä ohjelmoiva huomaa eroaja suoritusalustojen lisäksi komennoissa, kirjastoissa, suoritusnopeuksissa, käyttötarkoituksissa ja joustavuudessa. Siksi niitä ei pidä sekoittaa keskenään.


      • TRRY kirjoitti:

        Konekieli on tavukoodia yhtä paljon kuin C on Smalltalkia. Niillä ohjelmoiva huomaa eroaja suoritusalustojen lisäksi komennoissa, kirjastoissa, suoritusnopeuksissa, käyttötarkoituksissa ja joustavuudessa. Siksi niitä ei pidä sekoittaa keskenään.

        Hölöpönpölöpön. Tavukoodia on monenlaista ja niitä voi ajaa niin virtuaalikoneella kuin raudalla. Olen ajanut esim. x86 -koodia softalla ja raudalla, kuten olen myös ajanut 6502:n koodia. Javaa olen ajanut vain softalla, mutta kyllähän sitä Javaprosessoreitakin löytyy. Ettei vaan olisi kännyköiden ARM -vehkeissä tukea suoraan Javan tavukoodille..

        Niin ja minä sitten osaan muutaman prosessorin konekielen, että kyllä niissä eri arkkitehtuurien tavukoodeissa on kummasti eroja.


      • TRRY
        M-Kar kirjoitti:

        Hölöpönpölöpön. Tavukoodia on monenlaista ja niitä voi ajaa niin virtuaalikoneella kuin raudalla. Olen ajanut esim. x86 -koodia softalla ja raudalla, kuten olen myös ajanut 6502:n koodia. Javaa olen ajanut vain softalla, mutta kyllähän sitä Javaprosessoreitakin löytyy. Ettei vaan olisi kännyköiden ARM -vehkeissä tukea suoraan Javan tavukoodille..

        Niin ja minä sitten osaan muutaman prosessorin konekielen, että kyllä niissä eri arkkitehtuurien tavukoodeissa on kummasti eroja.

        > Tavukoodia on monenlaista ja niitä voi ajaa
        > niin virtuaalikoneella kuin raudalla.

        Päin honkia. Pelkään sinun sekoittavan tavukoodin ja konekielen lisäksi vielä virtuaalikoneetkin pahan kerran. Koitetaan nyt pitää erillään tavukoodia suorittavat virtuaalikoneet (esim. JavaVM ja Python-tulkki) ja joitakin rautaa emuloivat ja tietyn prosessoriarkkitehtuurin konekieltä suorittavat virtuaalikoneet (esim. Qemu, UAE, Vice). Jälkimmäisillä ei ole sen enempää tekemistä tavukoodin kanssa kuin 80386-, 68000- tai 6510-prosessoreillakaan.

        Yritän selvittää tavukoodin ja konekielen eron vielä yhden kerran. Tavukoodi on suunniteltu ajettaviksi softalla. Siksi siinä voidaan käyttää ja käytetään sellaisia käskyjä, joita ei voi toteuttaa suoraan millään järkevällä raudalla. Syy on siinä, ettei monestakaan syystä ole järkevää tehdä rautaa, joka suoriutuisi sellaisista käskyistä. Otetaan yksinkertainen esimerkki: kertolasku.

        Kopioi Python-tulkkiin seuraavat rivit:

        import dis # tavukoodin disassembler
        dis.dis(lambda x,y: x*y) # (1)
        dis.dis(lambda x,y: [x]*y) # (2)

        Rivi (1) tulostaa tavukoodin funktiosta, joka kertoo kaksi parametrina saamaansa alkiota. Rivi (2) tulostaa tavukoodin funktiosta, joka tekee ensimmäisestä parametrista yhden alkion pituisen listan ja kertoo listan toisella parametrilla. (Pythonissa listan kertominen luvulla n tuottaa uuden listan, joka on vanha lista toistettuna n kertaa peräkkäin.)

        Vertaa sitten edellisten tavukoodien kertolaskun suorittavaa käskyä C-kääntäjän tuottamaan assemblyyn (valitse mieleisesi prosessoriarkkitehtuuri).

        Kertolasku kokonaisluvuilla:

        echo "int kerro(int x, int y) { return x*y; }" | gcc -x c -c -o a.o - && objdump -d a.o

        ...pienillä kokonaisluvuilla...

        echo "char kerro(char x, char y) { return x*y; }" | gcc -x c -c -o a.o - && objdump -d a.o

        ...isoilla kokonaisluvuilla...

        echo "long long kerro(long long x, long long y) { return x*y; }" | gcc -x c -c -o a.o - && objdump -d a.o

        ...liukuluvuilla...

        echo "float kerro(float x, float y) { return x*y; }" | gcc -x c -c -o a.o - && objdump -d a.o

        ...ja hieman tarkemmilla liukuluvuilla...

        echo "double kerro(double x, double y) { return x*y; }" | gcc -x c -c -o a.o - && objdump -d a.o

        Luultavasti näit aika monta eri käskyä pelkän kertolaskun suorittamiseen, ellet kääntänyt koodia 6502:lle. :)

        Mutta nuokaan käskyt eivät vielä suoriudu esim. listan monistamisesta. Kuitenkin kummallekin Python-funktiolle kävisi ensimmäiseksi parametriksi pienet luvut, isot luvut, liukuluvut, rajattoman tarkkuuden kokonaisluvut, listat ja merkkijonot ja monen muun tyyppiset arvot. Sama tavukoodi ja erityisesti sama kertolaskukäsky toimii silti.

        Toivottavasti tämä auttaa ymmärtämään eron tavukoodin ja konekielen välillä. Ne on suunniteltu hyvin erilaisiin tarkoituksiin. Konekielen suoritusta on vielä kohtuullisen helppoa simuloida softalla, mutta tavukoodiapa ei ajetakaan raudalla ihan helposti. Yhden ainoan tavukoodin käskyn suorittaminen saattaa kestää tunteja, vaikka prosessorissa gigahertsejä riittäisi jokaiselle sormelle.


      • TRRY kirjoitti:

        > Tavukoodia on monenlaista ja niitä voi ajaa
        > niin virtuaalikoneella kuin raudalla.

        Päin honkia. Pelkään sinun sekoittavan tavukoodin ja konekielen lisäksi vielä virtuaalikoneetkin pahan kerran. Koitetaan nyt pitää erillään tavukoodia suorittavat virtuaalikoneet (esim. JavaVM ja Python-tulkki) ja joitakin rautaa emuloivat ja tietyn prosessoriarkkitehtuurin konekieltä suorittavat virtuaalikoneet (esim. Qemu, UAE, Vice). Jälkimmäisillä ei ole sen enempää tekemistä tavukoodin kanssa kuin 80386-, 68000- tai 6510-prosessoreillakaan.

        Yritän selvittää tavukoodin ja konekielen eron vielä yhden kerran. Tavukoodi on suunniteltu ajettaviksi softalla. Siksi siinä voidaan käyttää ja käytetään sellaisia käskyjä, joita ei voi toteuttaa suoraan millään järkevällä raudalla. Syy on siinä, ettei monestakaan syystä ole järkevää tehdä rautaa, joka suoriutuisi sellaisista käskyistä. Otetaan yksinkertainen esimerkki: kertolasku.

        Kopioi Python-tulkkiin seuraavat rivit:

        import dis # tavukoodin disassembler
        dis.dis(lambda x,y: x*y) # (1)
        dis.dis(lambda x,y: [x]*y) # (2)

        Rivi (1) tulostaa tavukoodin funktiosta, joka kertoo kaksi parametrina saamaansa alkiota. Rivi (2) tulostaa tavukoodin funktiosta, joka tekee ensimmäisestä parametrista yhden alkion pituisen listan ja kertoo listan toisella parametrilla. (Pythonissa listan kertominen luvulla n tuottaa uuden listan, joka on vanha lista toistettuna n kertaa peräkkäin.)

        Vertaa sitten edellisten tavukoodien kertolaskun suorittavaa käskyä C-kääntäjän tuottamaan assemblyyn (valitse mieleisesi prosessoriarkkitehtuuri).

        Kertolasku kokonaisluvuilla:

        echo "int kerro(int x, int y) { return x*y; }" | gcc -x c -c -o a.o - && objdump -d a.o

        ...pienillä kokonaisluvuilla...

        echo "char kerro(char x, char y) { return x*y; }" | gcc -x c -c -o a.o - && objdump -d a.o

        ...isoilla kokonaisluvuilla...

        echo "long long kerro(long long x, long long y) { return x*y; }" | gcc -x c -c -o a.o - && objdump -d a.o

        ...liukuluvuilla...

        echo "float kerro(float x, float y) { return x*y; }" | gcc -x c -c -o a.o - && objdump -d a.o

        ...ja hieman tarkemmilla liukuluvuilla...

        echo "double kerro(double x, double y) { return x*y; }" | gcc -x c -c -o a.o - && objdump -d a.o

        Luultavasti näit aika monta eri käskyä pelkän kertolaskun suorittamiseen, ellet kääntänyt koodia 6502:lle. :)

        Mutta nuokaan käskyt eivät vielä suoriudu esim. listan monistamisesta. Kuitenkin kummallekin Python-funktiolle kävisi ensimmäiseksi parametriksi pienet luvut, isot luvut, liukuluvut, rajattoman tarkkuuden kokonaisluvut, listat ja merkkijonot ja monen muun tyyppiset arvot. Sama tavukoodi ja erityisesti sama kertolaskukäsky toimii silti.

        Toivottavasti tämä auttaa ymmärtämään eron tavukoodin ja konekielen välillä. Ne on suunniteltu hyvin erilaisiin tarkoituksiin. Konekielen suoritusta on vielä kohtuullisen helppoa simuloida softalla, mutta tavukoodiapa ei ajetakaan raudalla ihan helposti. Yhden ainoan tavukoodin käskyn suorittaminen saattaa kestää tunteja, vaikka prosessorissa gigahertsejä riittäisi jokaiselle sormelle.

        "Yritän selvittää tavukoodin ja konekielen eron vielä yhden kerran. Tavukoodi on suunniteltu ajettaviksi softalla."

        Eipä muuta sitä mihinkään vaikka näin olisi.

        "Siksi siinä voidaan käyttää ja käytetään sellaisia käskyjä, joita ei voi toteuttaa suoraan millään järkevällä raudalla."

        Kaikki käskyt on mahdollista toteuttaa raudalla. On eri asia onko siinä mieltä. Javan pinopohjainen tavukoodi on sitten huomattavan lähellä näitä jotka on suunniteltu ajettavaksi prosessorilla suoraan, ja tiedän sen, että Javan ajoon on tehty ihan suoraan rautatason ratkaisuja.

        Nykyaikana ei oikein pidetä x86:stakaan mielekkääksi ajaa raudalla..


    • opiskella...

      ...vähän lisää niin ei pääse lipsahtelemaan tällaisia sammakoita:

      >...voi tehdä sellaista mitä ceellä ei voi.

      Samalla voit miettiä sitä minkähän takia Torvalds ei anna koodata Linuxin kerneliä C :lla kuten Windowsit on tehty. ;)

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Takaisin ylös

    Luetuimmat keskustelut

    1. Katso: Ohhoh! Miina Äkkijyrkkä sai käskyn lähteä pois Farmi-kuvauksista -Kommentoi asiaa: "En ole.."

      Tämä oli shokkiyllätys. Oliko tässä kyse tosiaan siitä, että Äkkijyrkkä sanoi asioita suoraan vai mistä.... Tsemppiä, Mi
      Tv-sarjat
      136
      5778
    2. Voi kun mies rapsuttaisit mua sieltä

      Saisit myös sormiisi ihanan tuoksukasta rakkauden mahlaa.👄
      Ikävä
      33
      3535
    3. Haluan jutella kanssasi Nainen

      Olisiko jo aika tavata ja avata tunteemme...On niin paljon asioita joihin molemmat ehkä haluaisimme saada vastaukset...O
      Ikävä
      17
      1903
    4. Poliisiauto Omasp:n edessä parkissa

      Poliisiauto oli parkissa monta tuntia Seinäjoen konttorin edessä tänään. Haettiinko joku tai jotain pankista tutkittavak
      Seinäjoki
      25
      1895
    5. Onko mies niin,

      että sinulle ei riitä yksi nainen? Minulle suhde tarkoittaa sitoutumista, tosin eihän se vankila saa olla kummallekaan.
      Tunteet
      24
      1730
    6. Voitasko leikkiä jotain tunnisteleikkiä?

      Tietäisi ketä täällä käy kaipaamassa.. kerro jotain mikä liittyy sinuun ja häneen eikä muut tiedä. Vastaan itsekin kohta
      Ikävä
      74
      1576
    7. Tietysti jokainen ansaitsee

      Hän varmasti ansaitsee vain parasta ja sopivinta tietenkin, suon sen onnen hänelle enemmän kuin mielelläni. Aika on nyt
      Ikävä
      14
      1483
    8. Haluisin suudella ja huokailla

      ja purra kaulaasi ja rakastella sinua. Haluisin puristella rintojasi ja pakaroitasi. Ei sinulla taida olla kuitenkaan ni
      Ikävä
      18
      1378
    9. Armi Aavikko Malmin hautausmaa

      Haudattiinko Armi arkussa Malmin hautausmaalle vai tuhkattiinko hänet? Kuka tietää asiasta oikein?
      Kotimaiset julkkisjuorut
      11
      1366
    10. Miksi näin?

      Miksi vihervassut haluaa maahan porukkaa jonka pyhä kirja kieltää sopeutumisen vääräuskoisten keskuuteen? Näin kotoutumi
      Maailman menoa
      24
      1317
    Aihe