2.05.2017

Дуже Швидке Порівняння Популярних Мов для Навчання Комп’ютерному Програмуванню

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

У відділі комп’ютерних наук, де я в даний час навчання я недавно був залучений в суперечку, якою мовою програмування слід використовувати для навчання початківців. Java і C є найбільш часто використовуваними мовами у відділі, і для багатьох суб’єктів це необхідно, але не (я вважаю) для абсолютних новачків. Я вважаю, що Python є набагато кращим вибором для початківців, так і ущільнювати свою власну позицію я виконав дуже коротко, дуже ненауковий тест, описаний нижче.

***

Тест

Я хотів би подивитися на те, що був залучений в письмовій формі дуже прості програми в (маленький) на різних мовах. Мови, які я вибрав були BASIC, C, Java і Python. Я використовував C і Java, тому що вони знаходяться в загальному користуванні в відділі (і в інших навчальних закладах. Я вибрав Python, тому що я люблю його, і думаю, що це відмінний вибір для навчання, і я вибрав BASIC, тому що, ну, це просто було дуже легко…

«Hello World», здавалося, трохи занадто тривіальний, тому я вирішив на відносно простий завдання читання двох чисел від користувача, додаючи їх разом і роздруківку результату. Мене цікавило

• Скільки часу потрібно, щоб писати і налагоджувати код
Скільки речей робить студент повинен розуміти, щоб написати цей код

Час, відведений для написання коду, очевидно, не мав на увазі, щоб бути представником від часу, необхідного студентом, але я вважаю, що вони дають приблизно точну міру порівняння. Я досить досвідчений (1-5 років професійного досвіду) на кожній мові, тому я не думаю, що я був необгрунтовано упередженим.


BASIC

Я навчився програмувати, ще в кінці 70-х років, на рівні I TRS-80, а також на обмін часу системи, що моя середня школа мала випадковий доступ. Програма тривіальна в старому доброму BASIC:

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

RUN

Час написання:

15 секунд. Я визнаю, що я не маю BASIC інтерпретатора зручним і не перевірити це, але я просто знаю, що це працює. (Добре, я розпалив TRS-80 емулятор і фактично запустив його – він працює…)

Те, що потрібно пояснити:

  • Номери рядків
  • Змінні
  • INPUT (ввід)
  • PRINT (друк)
  • RUN (запуск)

За і проти

BASIC дуже легко для початківців, щоб почати с, але це старий, погано розроблений мовою, не вистачає майже кожна сучасна особливості. Візуальний BASIC додає багато «старий добрий BASIC», але він не підходить (я вірю), щоб навчити однієї платформи власну мову. І це ще не дуже гарна мова…


С

#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

Час написання:

близько трьох хвилин, включаючи налагодження.

Те, що потрібно пояснити:

  • #include, функції (головні), типи повернень, argc, argv
  • змінні, типи (вст.)
  • scanf (і досить скоро це обмеження і як працювати навколо них)
  • printf, рядки формату
  • вказівники (уже!!)
  • компілювання, фігурні дужки і крапка з комою

За і проти

C був розроблений провідними хакерами для їх власного використання. Він був розроблений для написання операційних систем, компіляторів та інших системних інструментів, і в цій ролі вона стала майже повністю домінує.

Це може забезпечити відмінну продуктивність (за умови, хороший вибір алгоритму і хороших навичок C) і дозволяє доступ до апаратних засобів низького рівня, але це звичайно не всі необхідні новачкові. Використання C в покажчиків є джерелом розчарування і плутанини для початківців, але вони мають важливе значення навіть в досить тривіальних програм (як той вище, хоча і тривіальним чином).

Крім того, обробка рядків C слабка в порівнянні з багатьма іншими сучасними мовами (функція зсапЕ використовується вище, як відомо, проблематично).

C є одним з основних і дуже важливий мову, і все програмісти повинні мати значний вплив на нього. Це, однак, жахливий мову, щоб навчити початківців. Існує дуже багато C, що має бути пояснено, залишаючи менше часу для пояснення програмування.


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

Час написання:

19 хвилин! Насправді, я провів близько 15 хвилин, не вдався, а потім шукав Google для прикладу. Наведений вище код копіюється з веб-сторінки, яка, виразно я подумав, починається зі слів «Можна було б подумати, що програма, яка зчитує два користувача, що вводиться в цілих числах і виводить їх суму буде простий шматок коду».

Очевидно, що цей код не зовсім відповідає іншим програмам, представлені тут, так як це робить перевірку власне помилок, однак Java робить його важко не робити перевірку на наявність помилок. Ви повинні ловити виключення, і отримавши їх, ви могли б також зробити щось з ними.

Я насправді вид збентежений У мене було так багато проблем з цим – я працював на комерційному пакеті Java протягом двох років, а тому, що це графічний інтерфейс я рідко доводиться мати справу з читанням з консолі. Реальні Java програмісти, ймовірно, дивляться на мене з сумішшю жалості і відрази. Таке життя.

Те, що потрібно пояснити:

  • імпорт, класи, фігурні дужки з крапками з комами
  • публічний, статичний, недійсний, Рядок, основні параметри[]
  • InputStreamReader, BufferedReader, System.in
  • змінні, типи
  • спробувати, схопити, винятки, readLine, parseInt
  • System.out.println, компіляція, виконання

За і проти

Java є корисним мовою для розробки крос-платформних GUI, є надійною платформою для розробки ОО, і має великий і високорозвинених набір бібліотек класів. Може бути, найголовніше, це найпопулярніший мову навколо і є багато робочих місць для Java-програмістів.

Велика бібліотека класів, проте, досить складно. Виявляється, є клас для майже все, і велика частина «програмування на Java», здається, складається з «пошук потрібного класу». Навіть після двох років я знаходжу, що я не можу робити в Java без постійного звернення до документації.

Java забезпечує дотримання орієнтації об’єкта, перевірка виключень і суворої типізації – все це (можливо) хороші речі – вони роблять це простіше для групи програмістів робастний створення великих систем. Але для невеликих завдань (наприклад, з якими стикаються у вступних класах програмування) ці речі стають не більше ніж складна, час смоктання навантаження.

Причина зайнятості самотужки досить, щоб зробити Java «повинен навчити» мову, але я вважаю, що ми робимо нашим студентам погану послугу, якщо це кращий мову ми показуємо їх.


Python

import sys

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

%> python add.py

Час написання:

близько однієї хвилини, включаючи тестування і налагодження.

Те, що потрібно пояснити:

  • імпорт
  • змінні
  • sys.stdin
  • readline (читає рядок)
  • int (перетворює рядок на ціле число)
  • друк

За і проти

Python має дуже багато хороших моментів:

• нав’язує хороший стиль програмування (відступи мають сенс)
OO доступні, але не дотримується
• винятки використовуються, але не дотримуються
• це не іграшка або академічний мова – дуже реальний світ робота виконується в Python
дозволяє сконцентрувати на алгоритми і завдання, а не на особливостях мови і недолік.
крос-платформний і має потужний набір бібліотек
безпечний – він має динамічний під час виконання перевірки типу і перевірки кордонів масивів
має потужні вбудовані типи даних – словники, списки, послідовності, функції множин (в 2.4)
має потужні вбудовані структури управління – простий цикл по послідовності, карти, генератори, спискові, регулярні вирази…
вимагає менше рядків коду для будь-якої даної проблеми, і зручнішим для читання – таким чином, більш висока продуктивність.

Для навчання в якості першої мови, проте він має деякі специфічні переваги. Як можна бачити з наведених вище (без урахування BASIC) прикладів, Python вимагає менше часу, менше рядків коду, і менше концепцій, щоб навчити, щоб досягти заданої мети. Це дозволяє більше часу, щоб витратити на важливі речі. Крім того, деякі поширені помилки студентів повністю byassed в Python:

• кінець лінії кінець рядка (незабутня коми)
• немає оголошень типу
неістинна структура блоку завжди очевидна (не вистачає помилок брекетів)
динамічний розподіл пам’яті та збирання сміття

Нарешті програмування в Python це весело! Веселість і частий успіх порода довіру і інтерес до студента, який потім краще вміщеної продовжити навчання програми.

Однак Python – це просто скриптова мова
Python часто звільнений як «просто мова сценаріїв» (Perl і Ruby також страждають від цього дурного фанатизму). Це просто невірно. Це не «просто мова сценаріїв» – це повнофункціональний дуже високий рівень мови, який ідеально підходить для багатьох додатків, в тому числі простих сценаріїв обов’язків.

Той факт, що ви можете написати «швидкий і брудний» сценарії в Python є перевагою, а не недоліком, оскільки сценарії насправді є невід’ємною частиною професійного програмування. Якщо студенти не знають Python (або Perl, або Ruby, або….), вони будуть витрачати багато часу, намагаючись вирішити скрипт як проблеми в Java.

Проте Python повіііііііііііільний

Python є інтерпретується мовою, і це дійсно додає деякі накладні витрати. Динамічні кордону перевірки, динамічна типізація і інші розумні речі Python уповільнити його ще далі. Python може бути на кілька порядків повільніше, ніж еквівалентний код C. Проте

• Багато, багато програм не пов’язані обчислювальними зв’язками. Щоб використовувати мову високої продуктивності для них служить приклад гріха ранньої оптимізації.
Інтерфейси Python добре C – величезні вигоди можуть бути отримані шляхом кодування критичних секцій в C.
Економія часу кодування в Python, і набагато більше, простота коду, написаного, дозволяє набагато більше часу для експериментів в більш ефективних алгоритмів – часто набагато більш плідним, ніж просто працює поганий алгоритм дуже швидко.


Висновок

C і Java є важливими мовами – для концепцій, які вони втілюють, для перспектив працевлаштування, а також для класів задач, які вони вирішують. Студенти повинні дати ґрунтовну на цих мовах. Вони, однак, не утворюють достатній арсенал для професійного програміста – хороший «мова сценаріїв» є обов’язковим – вони не є хорошими мовами, щоб навчити студентів нові програмування. Вони мають багато накладних та інших перешкод, які займають багато задоволення з, і зробити як студентські та робочі місця вчителя більш важким, ніж вони повинні бути.

Є люди, які стверджують, що перешкоди є частиною дисциплінипрограмування – студенти повинні навчитися ловити їх виключення, використовувати покажчики, оголосити всі їх тип і так далі. Може бути, може бути, немає – але є час для цього пізніше. Давайте нехай студенти мають просту радість невеликих успіхів, які ми (ну, «я» в будь-якому випадку) були, коли ми починали. Патрік Джордан – patrick@ariel.com.au – 2004-12-14


Постскриптум (лютий 2006 р.)

Крім вищевказаних зауважень, величезна кількість людей написали мені після того, як ця стаття з’явилася у Дейлі Python, щоб вказати на те, що існує більш простий спосіб зробити це в Python:

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

%> python add.py

(різні лайнери, як «print input()+input()» також були запропоновані і працювати так само добре, але я б посперечався менш корисні для навчальних цілей). Далі, так як вхід () приймає будь-яке припустиме вираз Python, ця програма просто працює для цілого ряду входів – інтс, поплавці й струни (це буде об’єднувати їх – але врахуйте, що вони повинні бути в лапках інакше вони будуть інтерпретовані як імена змінних) або такі вирази, як «3.14**2». Ще один доказ того, як якщо б це було необхідно, про красу Python.

Коментарі

Я отримав ряд зауважень з цього питання, зокрема, на мовах я не згадував (Ruby, C++, Smalltalk, LISP)…

Читати коментарі
Читати навіть більше коментарів

About The Author

admin

Comments are closed.