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

1347

    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ä.

    Luetuimmat keskustelut

    1. Ja taas ammuttu kokkolassa

      Kokkolaisilta pitäisi kerätä pois kaikki ampumaset, keittiöveitset ja kaikki mikä vähänkään paukku ja on terävä.
      Kokkola
      30
      3521
    2. Kukka ampu taas Kokkolassa?

      T. olisi hetkeä aiemmin lähtenyt johonkin. Naapuri kai tekijä J.K., ei paljasjalkainen Kokkolalainen, vaan n. 100km pääs
      Kokkola
      9
      1578
    3. Kuinka kauan

      Olet ollut kaivattuusi ihastunut/rakastunut? Tajusitko tunteesi heti, vai syventyivätkö ne hitaasti?
      Ikävä
      113
      1483
    4. Milli-helenalla ongelmia

      Suomen virkavallan kanssa. Eipä ole ihme kun on etsintäkuullutettu jenkkilässäkin. Vähiin käy oleskelupaikat virottarell
      Kotimaiset julkkisjuorut
      224
      1275
    5. Kun näen sinut

      tulen iloiseksi. Tuskin uskallan katsoa sinua, herätät minussa niin paljon tunteita. En tunne sinua hyvin, mutta jotain
      Ikävä
      34
      893
    6. Purra saksii taas. Hän on mielipuuhassaan.

      Nyt hän leikkaa hyvinvointialueiltamme kymmeniä miljoonia. Sotea romutetaan tylysti. Terveydenhoitoamme kurjistetaan. ht
      Maailman menoa
      242
      893
    7. Yhdelle miehelle

      Mä kaipaan sua niin paljon. Miksi sä oot tommonen pösilö?
      Ikävä
      60
      879
    8. Helena Koivu on äiti

      Mitä hyötyä on Mikko Koivulla kohdella LASTENSA äitiä huonosti . Vie lapset tutuista ympyröistä pois . Lasten kodista.
      Kotimaiset julkkisjuorut
      131
      879
    9. Ja taas kerran hallinto-oikeus että pieleen meni

      Hallinto-oikeus kumosi kunnanhallituksen päätöksen vuokratalojen pääomituksesta. https://sysmad10.oncloudos.com/cgi/DREQ
      Sysmä
      66
      854
    10. Löydänköhän koskaan

      Sunlaista herkkää tunteellista joka jumaloi mua. Tuskin. Siksi harmittaa että asiat meni näin 🥲
      Ikävä
      98
      819
    Aihe