Hyvin nopea vertailu suosituimpien kielten opetukseen tietokoneohjelmoinnissa

Source: http://www.ariel.com.au/a/teaching-programming.html

Nykyisessä opettajani CS-osastossa olen äskettäin osallistunut keskusteluun, josta ohjelmointikieltä tulisi käyttää opettamaan aloittelijoita. Java ja C ovat osastolla yleisimmin käytettyjä kieliä, ja monille aiheille tämä on tarkoituksenmukaista, mutta ei (uskon) absoluuttisille aloittelijoille. Uskon, että Python on paljon parempi vaihtoehto aloittelijoille, ja vahvistaakseni oma asema olen suorittanut hyvin lyhyen, hyvin epätieteellisen testin, joka on kuvattu jäljempänä.

***

Koe

Halusin tarkastella, mitä kirjoitettiin hyvin yksinkertaisten ohjelmien kirjoittamiseen (pieni) eri kielillä. Kielet, jotka valitsin olivat BASIC, C, Java ja Python. Käytin C: tä ja Javaa, koska ne ovat yleisesti käytössä osastolla (ja muissa oppilaitoksissa.) Valitsin Pythonin koska rakastan sitä ja mielestäni se on erinomainen valinta opetukselle, ja valitsin BASICin, koska se oli aivan liian helppo…..
“Hello World” tuntui hieman liian vähäiseltä, joten päätin suhteellisen yksinkertaisesta tehtävästä lukea kaksi numeroa käyttäjältä, lisätä ne yhteen ja tulostaa tulos. Kiinnostukseni oli

  • Kuinka kauan koodin kirjoittaminen ja virheenkorjaus kesti
  • Kuinka monta asiaa opiskelija tarvitsee ymmärtää tämän koodin kirjoittamiseksi

Koodin kirjoittamiseen annettuja aikoja ei ilmeisesti ole tarkoitettu edustamaan opiskelijan tarvitsemaa aikaa, mutta uskon, että he antavat karkeasti tarkan vertailun. Olen kohtuullisen ammattitaitoinen (1-5 vuoden työkokemus) jokaisella kielellä, joten en usko, että olin kohtuuttomasti puolueellinen.


BASIC

Opetin ohjelmoida 70-luvun loppupuolella tasolle I TRS-80 ja ajankäyttöjärjestelmää, jolla lukiini oli satunnaisesti käytettävissä. Ohjelma on triviaali hyvässä vanha BASIC:

10 INPUT A
20 INPUT B
30 C=A+B
40 PRINT C

RUN

Aika kirjoittaa:

15 sekuntia. Myönnän, että minulla ei ole BASIC-tulkkia kätevä eikä testannut tätä, mutta tiedän vain, että se toimii. (OK, laukaisin TRS-80 emulaattorin ja juoksin sen – se toimii …)

Asiat selittää:

  • Linjanumerot
  • Muuttujat
  • INPUT
  • PRINT
  • RUN

Hyvät ja huonot puolet

BASIC on aloittelijoille helppo aloittaa, mutta se on vanha, huonosti suunniteltu kieli, joka puuttuu lähes jokaisesta modernista ominaisuudesta. Visual BASIC lisää paljon “hyvälle vanha BASIC”, mutta ei ole tarkoituksenmukaista (uskon) opettaa yhden alustan omistamaa kieltä. Ja se ei ole vielä kovin hyvä kieli ….


С

#include <stdio.h>

int main(int argc, char*argv[]) 
{
    int a,b,c;

    scanf("%d",&a);
    scanf("%d",&b);

    c = a+b;
    printf("%d\n",c);
}

%> gcc -o add add.c
%> ./add

Aika kirjoittaa:

Noin kolme minuuttia, mukaan lukien virheenkorjaus.

Asiat selittää:

  • #include, funktiot (pää), paluumatyypit, argc, argv
  • Muuttujat, tyypit (int)
  • Scanf (ja melko pian se on rajoituksia ja miten työskennellä heidän ympärillään)
  • Printf, merkkijonot
  • Osoittimet (jo!)
  • Käännökset, puolustukset ja puolipisteet

Hyvät ja huonot puolet

C on suunnitellut huippukamerat omaan käyttöönsä. Se on suunniteltu käyttöjärjestelmien, kääntäjien ja muiden järjestelmätyökalujen kirjoittamiseen, ja tämä rooli on tullut melkein kokonaan hallitsevaksi.

Se voi tarjota erinomaisen suorituskyvyn (olettaen hyvien algoritmien ja hyvien C-taitojen valinta) ja sallii alhaisen tason laitteiston käytön, mutta nämä eivät yleensä ole aloittelijalle vaadittavia asioita. C: n osoittimien käyttö on turhautumista ja sekaannusta aloittelijoille, mutta ne ovat välttämättömiä jopa melko vähäpätöisissä ohjelmissa (kuten yllä, vaikkakin triviaalit).

Lisäksi C: n merkkijonon käsittely on heikko verrattuna moniin muihin moderneihin kieliin (edellä käytetty scanf-funktio on tunnetusti ongelmallinen).

C on tärkeä ja erittäin tärkeä kieli, ja kaikilla ohjelmoijilla on oltava merkittävä altistuminen sille. Se on kuitenkin kauhea kieli opettaa aloittelijoita. On liian paljon C, joka on selitettävä, jättäen vähemmän aikaa ohjelmoinnin selittämiseen.


Java

import java.io.*;
public class Addup
{
    static public void main(String args[])  {
        InputStreamReader stdin = new InputStreamReader(System.in);
        BufferedReader console = new BufferedReader(stdin);
        int i1 = 0,i2 = 0;
        String s1,s2;
        try {
            s1 = console.readLine();
            i1 = Integer.parseInt(s1);
            s2 = console.readLine();
            i2 = Integer.parseInt(s2);
        }
        catch(IOException ioex) {
            System.out.println("Input error");
            System.exit(1);
        }
        catch(NumberFormatException nfex) {
            System.out.println("\"" + nfex.getMessage() + "\" is not numeric");
            System.exit(1);
        }
        System.out.println(i1 + " + " + i2 + " = " + (i1+i2));
        System.exit(0);
    }
}
%> javac Addup.java
%> java Addup

Aika kirjoittaa:

19 minuuttia! Itse asiassa vietin noin 15 minuuttia, epäonnistui, ja sitten etsin Googlea esimerkkinä. Yllä oleva koodi kopioidaan web-sivulta, joka ajattelevasti ajattelin, alkaa sanoilla “Voidaan ajatella, että ohjelma, joka lukee kahdella käyttäjän syötetyllä kokonaislukuna ja tulostaa summansa, olisi yksinkertainen koodi”.
Tämä koodi ei tietenkään vastaa täysin muita tässä esitettyjä ohjelmia, koska se tekee virheellisiä virheitä. Java kuitenkin vaikeuttaa virheiden tarkistamista. Sinun on otettava poikkeukset, ja kun olet kiinni heistä, voit myös tehdä jotain heidän kanssaan.

Olen todella hauska, minulla oli niin paljon ongelmia – olen työskennellyt kaupallisessa Java-pakettina kahden vuoden ajan, mutta koska se on graafinen käyttöliittymä, harvoin olen joutunut käsittelemään konsolista lukemista. Todelliset Java-ohjelmoijat luultavasti katsovat alas minulle sekaan sääliä ja inhoa. Sellaista on elämä.

Asiat selitettävä

  • Tuonti, luokat, puolipisteiden pääntuki
  • Julkinen, staattinen, tyhjä, merkkijono, tärkein argumentti []
  • InputStreamReader, BufferedReader, System.in
  • Muuttujat, tyypit
  • Yritä, saalis, poikkeukset, lueLine, parseInt
  • System.out.println, kokoaminen, käynnissä

Hyvät ja huonot puolet

Java on käyttökelpoinen kieli graafisen käyttöliittymän kehittämiselle, joka on vankka OO-kehityksen alusta ja jolla on laaja ja kehittynyt joukko luokan kirjastoja. Ehkä tärkeintä, se on suosituin kieltä ja siellä on paljon työpaikkoja Java-ohjelmoijille.

Laaja luokan kirjasto on kuitenkin melko pelottava. Näyttää siltä, ​​että siellä on luokka lähes kaiken, ja suurin osa “Java-ohjelmoinnista” näyttää koostuvan “oikean luokan etsimisestä”. Kahden vuoden kuluttua olen sitä mieltä, että en voi tehdä paljon Javaa ilman jatkuvaa viittausta dokumentaatioon.

Java noudattaa objektien suuntausta, poikkeusten tarkistamista ja tiukkaa kirjoittamista – nämä ovat kaikki (epäilemättä) hyviä asioita – ne helpottavat ryhmäohjelmoijien luotettavuutta suurissa järjestelmissä. Mutta pienille ongelmille (kuten aloitusohjelmaan kuuluville) nämä asiat ovat vain monimutkaista, aikaa imevää taakkaa.

Pelkästään työllisyyden syy on se, että Java on “opettaa” lanaguagea, mutta uskon, että opiskelijoillemme aiheutuu huonoa palvelua, jos tämä on paras kieli, jota näytämme.


Python

import sys

a = sys.stdin.readline()
b = sys.stdin.readline()
c = int(a) + int(b)
print c

%> python add.py

Aika kirjoittaa:

Noin minuutti, mukaan lukien testaus ja virheenkorjaus.

Asiat selitettävä

  • tuonti
  • Muuttujia
  • Sys.stdin
  • Readline (lukee merkkijonon)
  • Int (muuntaa merkkijonon kokonaislukuun)
  • Tulosta

Hyvät ja huonot puolet

Pythona on kauhea hyviä pisteitä:

  • Noudattaa hyvä ohjelmointityyliä (sisennys on merkityksellinen)
  • OO käytettävissä mutta ei pakollista
  • Käytetyt poikkeukset, mutta ei pakollisia
  • Ei ole lelu tai akateeminen kieli – Python on tehnyt paljon todellista työtä
  • Mahdollistaa algoritmien ja ongelmien keskittämisen, ei kielellisten piirteiden ja puutteiden vuoksi.
  • On ristikkäin alustalla ja sillä on tehokas joukko kirjastoja
  • On turvallinen – sillä on dynaaminen ajoaika -tyyppien tarkistus ja rajojen tarkistus matriiseilla
  • On tehokkaita sisäänrakennettuja tietotyyppejä – sanakirjoja, luetteloita, sekvenssejä, funktioita, asetuksia (2.4)
  • On tehokkaita sisäänrakennettuja ohjausrakenteita – yksinkertaisia ​​silmukoita sekvenssien, kartan, generaattoreiden, listan ymmärtämisen, säännöllisten ilmaisujen …
  • Vaatii vähemmän riviä koodia mille tahansa ongelmalle, ja se on luettavissa – siis suurempaa tuottavuutta.

Ensimmäisen kielen opetuksessa on kuitenkin joitain erityisiä etuja. Kuten yllä olevista esimerkeistä voidaan nähdä (BASICin huomiotta jättäminen), Python vaatii vähemmän aikaa, vähemmän koodin rivejä ja vähemmän käsitteitä opettamaan tietyn tavoitteen saavuttamiseksi. Tämä mahdollistaa enemmän aikaa tärkeisiin asioihin. Lisäksi jotkin yleiset oppilasvirheet kokonaan ohitetaan Pythonissa:

  • Rivin loppu on rivin loppu (ei unohdettuja puolipisteitä)
  • Ei tyyppihyväksynnät
  • Todellinen lohkorakenne aina ilmeinen (ei puuttuvia kaappausvirheitä)
  • Dynaamisen muistin jakamisen ja jätteiden keräyksen

Lopuksi ohjelmointi Pythona on hauskaa! Hauska ja usein menestys herättävät luottamusta ja kiinnostusta opiskelijaan, joka on paremmassa asemassa jatkamaan oppimista ohjelmalle.

Mutta Python on vain kirjoituskieli

Python on usein hylätty “vain komentosarjaksi” (Perl ja Ruby myös kärsivät tästä typerästä kiihkeydestä). Tämä on vain väärin. Se ei ole “vain kirjoituskieli” – se on täysin varusteltu erittäin korkean tason kieli, joka on ihanteellinen monille sovelluksille, mukaan lukien yksinkertaiset kirjoitustehtävät.
Se, että voit kirjoittaa “nopeita ja likainen” skriptejä Pythonissa, on etuna, ei haitta, koska komentosarjat ovat itse asiassa olennainen osa ammatillista ohjelmointia. Jos oppilaat eivät tiedä Pythonia (tai Perl tai Ruby tai ….), he menettävät paljon aikaa yrittäessään ratkaista Java-skriptejä.

Mutta Python on hiiiiidaaaas

Python on tulkittua kieltä, ja tämä lisää lisämäärityksiä. Dynaamisten rajojen tarkistaminen, dynaaminen kirjoittaminen ja muut älykkäät Python-asiat hidastavat sitä entisestään. Python voi olla suuruusluokkaa pienempi kuin vastaava C-koodi. kuitenkin

  • Monia, monia sovelluksia ei lasketa sidottuina. Korkea suorituskykyinen kieli heille antaa esimerkin varhaisesta optimoinnista.
  • Python liittää hyvin C: hen – valtava voitto voidaan tehdä koodaamalla kriittisiä osioita C: ssä
  • Aika tallennettu koodaus Pythonissa ja huomattavasti yksinkertaisempi koodin kirjoittaminen mahdollistavat paljon enemmän aikaa kokeilemiseen tehokkaammissa algoritmeissa – usein paljon hedelmällisempää kuin pelkästään huono algoritmin suorittaminen hyvin nopeasti.

Johtopäätös

C ja Java ovat tärkeitä kieliä – niiden käsitteitä, työllisyysnäkymiä ja ongelmien luokkia varten. Opiskelijoille on annettava perusteellinen maadoitus näillä kielillä. Ne eivät kuitenkaan muodosta riittävää arsenaalia ammatilliselle ohjelmoijalle – hyvä “komentokieli” on pakko – eivätkä ne ole hyviä kieliä uusien opiskelijoiden opetusohjelmalle. Heillä on paljon yläpuolisia ja muita esteitä, jotka vievät paljon iloa ja tekevät sekä opiskelijan että opettajan työpaikoista vaikeammat kuin heidän pitäisi olla.

On olemassa ihmisiä, jotka väittävät, että esteet ovat osa ohjelmoinnin kurinalaisuutta – opiskelijoiden on opittava saamaan poikkeuksiaan, käyttämään osoittimia, ilmoittamaan kaikenlaisiaan ja niin edelleen. Ehkä, ehkä ei – mutta myöhemmin on aika. Anna opiskelijoille yksinkertainen ilo pienistä menestyksistä, joita me (hyvin, “minä” joka tapauksessa) olisimme alkaneet. Patrick Jordan – patrick@ariel.com.au – 2004-12-14


Postscript (helmi 2006)

Edellä mainittujen huomautusten lisäksi suuri määrä ihmisiä kirjoitti minulle sen jälkeen, kun tämä artikkeli ilmestyi Daily Python korostamaan, että Pythonissä oli yksinkertaisempi tapa tehdä se:

a = input()
b = input()
c = a + b
print c

%> python add.py

(Erilaisia tulosteita (+ input) (“input input ()”) ehdotettiin myös ja toimivat yhtä hyvin, mutta väittäisin, että ne ovat vähemmän hyödyllisiä opetustarkoituksessa. Lisäksi, koska input () hyväksyy minkä tahansa kelvollisen Python-ilmentymän, tämä ohjelma toimii vain monella eri panolla – ints, floats, strings (se yhdistää ne – mutta huomaa, että niiden on oltava lainausmerkkeinä, mutta niitä tulkitaan Muuttujan nimet) tai lausekkeet kuten “3.14 ** 2”. Muita todisteita Pythonin kauneudesta, ikään kuin tarvittiin.

Kommentit

Olen saanut useita kommentteja tästä aiheesta, erityisesti kielillä, joita en maininnut (Ruby, C ++, Smalltalk, LISP) …

Lue kommentteja
Lue lisää kommentteja

Comments are closed, but trackbacks and pingbacks are open.