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

1371

    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. Tulipalossa henkilövahinkoja, itsenäisyyspäivä alkoi huonosti, poliisi tiedottaa lisää

      Savonlinna https://www.como.fi/uutiset/savonlinna-henkilovahinkoja-tulipalossa-poliisi-tiedottaa-lisaa/
      Savonlinna
      159
      8488
    2. Ennen ei ollut persuja ja työttömyyttä, lääkäriinkin pääsi

      Ennen oli kaikilla töitä Kauppiaille kelpasi kun saivat voittoa Yritystukia ei ollut Lääkäriin pääsi kaikki haluklaat Nu
      Maailman menoa
      99
      4025
    3. Millaista läheisyyttä

      Toivoisit ikävästi kohteesi kanssa?
      Ikävä
      114
      3892
    4. 55
      3363
    5. Antifasismi - mitä se on?

      Se on äärivasemmistolaista anarkistista toimintaa joka käyttää fasisminvastaisuutta keppihevosena oikeuttaakseen toimint
      Maailman menoa
      42
      2694
    6. Heräsin taas ikävään

      Ja aivan valtavaan haluun. Tahdon sinua R. ❤️
      Ikävä
      53
      1854
    7. Somali ei kätellyt Stubbia Linnan juhlissa

      Miksei somali osaa noudattaa hyviä käytöstapoja. https://www.iltalehti.fi/viihdeuutiset/a/563a3dea-fa3f-41f3-b64f-406d2
      Maailman menoa
      363
      1834
    8. Yliajo Heinolassa

      Mikä ihme ihmisiä vaivaa nykyään? Vähän ensin kähistellään nakkikioskilla ja sen jälkeen kostoksi murhataan autolla! Voi
      Heinola
      44
      1783
    9. Kuka on menehtynyt?

      https://yle.fi/a/74-20198293 Kuulemani mukaan ryyppyporukka ollut hapualla ja kuolemanenkeli (F.G) eli mies jonka seuras
      Kankaanpää
      11
      1741
    10. Kauhea ikävä iski

      Mietin vain, mitä olet juuri nyt tekemässä. Mietin myös, välittyykö se sinulle, kun olet koko ajan mielessäni, tunnetko
      Ikävä
      20
      1501
    Aihe