კომპიუტერული ენების სწავლებისთვის პოპულარული ენების ძალიან სწრაფი შედარება

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

CS დეპარტამენტში, სადაც მე ვასწავლი, ცოტა ხნის წინ ჩავედი დისკუსიაში, რომელზეც პროგრამირების ენა უნდა იქნას გამოყენებული დამწყებთათვის. Java და C არის ყველაზე ხშირად გამოყენებული ენები განყოფილებაში და მრავალი საგნისთვის ეს არის შესაბამისი, მაგრამ არა (მჯერა) აბსოლუტური დამწყებებისთვის. მე მჯერა Python არის ბევრად უკეთესი არჩევანი დამწყებთათვის და მყარი პოზიცია დავამთავრე ქვემოთ მოყვანილი ძალიან მოკლე, ძალიან სამეცნიერო ტესტი.

***

გამოცდა

მინდოდა, შეხედე, რა იყო ჩართული ძალიან მარტივი პროგრამების (მცირე) სხვადასხვა ენებზე. ენები მე აირჩია BASIC, C, Java და Python. მე ვგულისხმობ C და Java ს, რადგან ისინი იყენებენ განყოფილებაში (და სხვა სასწავლო დაწესებულებებში) მე აირჩია პითონი იმიტომ, რომ მე მიყვარს და ვფიქრობ კარგი სწავლებისთვის და მე აირჩია ძირითადი იმიტომ, რომ, ძალიან კარგად იყო ადვილი…..
“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 თარჯიმანი მოსახერხებელია და არ შეამოწმე ეს, მაგრამ მე უბრალოდ ვიცი მუშაობს. (OK, მე გაათავისუფლეს up TRS-80 ემულატორს და რეალურად გაიქცა ეს – მუშაობს…)

რამ ახსნა:

  • ხაზის ნომრები
  • ცვლადები
  • INPUT
  • PRINT
  • RUN

დადებითი და უარყოფითი მხარეები

BASIC ძალიან ადვილია დამწყებთათვის უნდა დავიწყოთ, მაგრამ ეს არის ძველი, ცუდად შექმნილია ენის, აკლია თითქმის ყველა თანამედროვე მხატვრული. Visual Basic დასძენს, რომ “კარგი ძველი BASIC”, მაგრამ ეს არ არის შესაბამისი (მე მჯერა) ასწავლიან ერთი პლატფორმა საკუთრების ენაზე. და ეს ჯერ კიდევ არ არის კარგი ენის…


C

#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

დაწერა დრო:

დაახლოებით სამი წუთი, მათ შორის გამართვა.

რამ ახსნა:

  • მოიცავს, ფუნქციები (მთავარი), დაბრუნების ტიპის, argc, argv
  • ცვლადები, სახის (int)
  • 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 პაკეტი ორი წლის განმავლობაში, არამედ იმიტომ, რომ ის GUI დაფუძნებული მე იშვიათად უნდა გაუმკლავდეთ კითხულობს კონსოლი. უძრავი Java პროგრამისტები, სავარაუდოდ გამოიყურება ჩემზე ნარევი სამწუხაროა და სიძულვილი. ასეთია ცხოვრება.

რამ ახსნა:

  • იმპორტი, კლასი, ნახევარგანოს აფრთხილებს
  • საჯარო, სტატიკური, ბათილად, სიმებიანი, მთავარი args []
  • InputStreamReader, BufferedReader, System.in
  • ცვლადები, სახის
  • ცდილობენ, დაჭერა, გამონაკლისის გარდა, წაკითხვის ხაზი, parseInt
  • System.out.println, შედგენა, გაშვებული

დადებითი და უარყოფითი მხარეები

Java არის სასარგებლო ენის ჯვარი პლატფორმა GUI განვითარების, არის ძლიერი პლატფორმა OO განვითარება, და აქვს ფართო და უაღრესად განვითარდა კომპლექტი კლასის ბიბლიოთეკები. ალბათ, ყველაზე მთავარია, ეს არის ყველაზე პოპულარული ენის გარშემო და არსებობს უამრავი სამუშაო 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 მოითხოვს ნაკლებ დროს, ნაკლები ხაზი კოდი, და ნაკლებად ცნებები უნდა ისწავლებოდეს მიღწევა მოცემულ მიზანს. ეს საშუალებას აძლევს უფრო მეტი დრო დაიხარჯება მნიშვნელოვანი რამ. გარდა ამისა, ზოგი გავრცელებული სტუდენტური შეცდომები მთლიანად გვერდს აუვლის, Python:

  • ბოლოს ხაზი დასასრულს ხაზი (არ დავიწყებია ნახევარგანგონები)
  • არ ტიპის დეკლარაციები
  • ნამდვილი ბლოკი სტრუქტურა ყოველთვის აშკარა (არსებობს დაკარგული აფრთხილებს შეცდომა)
  • დინამიური მეხსიერების გამოყოფის და ნაგვის შეგროვების

ბოლოს პროგრამირების პითონი არის  გართობაგართობა და ხშირი წარმატება ჯიშის ნდობა და ინტერესი სტუდენტი, რომელიც შემდეგ უკეთ სწავლის გაგრძელების პროგრამა.

მაგრამ Python მხოლოდ სკრიფტები ენა

Python ხშირად მას “მხოლოდ სკრიფტინგის ენა” (Perl და Ruby ასევე განიცდიან ამ სულელური ფანატიზმი). ეს არის უბრალოდ არასწორია. ეს არ არის “უბრალოდ სკრიფტინგის ენა” – ეს არის სრული გამორჩეული ძალიან მაღალი დონის ენაზე, რომელიც არის იდეალური ბევრი პროგრამები,  მათ შორის  მარტივი სკრიპტირების მოვალეობებს.

ის ფაქტი, რომ თქვენ შეგიძლიათ დაწეროთ “სწრაფი და ბინძური” სკრიპტები Python უპირატესობა, არ მინუსი, რადგან სკრიფტინგის არის რეალურად განუყოფელი ნაწილია პროფესიული პროგრამირების. თუ სტუდენტებს არ ვიცი Python (ან Perl, ან Ruby, ან…), ისინი დაგვრჩა ბევრი დრო ცდილობს გადაწყვიტოს სცენარი მსგავსი პრობლემა Java.

მაგრამ პითონი არის ძალიან ნელია

Python არის გაგებული ენის, და ეს არ დაამატოთ ზოგიერთი ოვერჰედის. დინამიკა ფარგლებს შემოწმების, დინამიური ფერთა და სხვა ჭკვიანი Python რამ ნელი მას კიდევ უფრო. Python შეიძლება ბრძანებებს მასშტაბები უფრო ნელა, ვიდრე ექვივალენტი C კოდი. თუმცა

  • ბევრი, ბევრი პროგრამები არ გამოთვლაც შეკრული. იმისათვის, რომ გამოიყენოთ მაღალი ხარისხის ენის მათთვის მაგალითია ცოდვა დასაწყისში ოპტიმიზაცია.
  • Python ინტერფეისი, ასევე C – უზარმაზარი მიღწევების შესაძლებელია კოდირების კრიტიკული სექციები C
  • დრო გადაარჩინა კოდირების Python და ბევრად უფრო დიდი სიმარტივე კოდი დაწერილი, საშუალებას აძლევს უფრო მეტი დრო ექსპერიმენტი უფრო ეფექტური ალგორითმების – ხშირად ბევრად უფრო ნაყოფიერი, ვიდრე უბრალოდ გაშვებული ცუდი ალგორითმი ძალიან სწრაფად.

დასკვნა

C და ჯავა მნიშვნელოვანია ენებზე – ამისთვის ცნებები ისინი განასახიერებს, რომ დასაქმების პერსპექტივები და კლასების პრობლემები მათ გადაჭრას. სტუდენტები უნდა მიეცეს საფუძვლიანი დამიწების ამ ენებზე. მათ არ თუმცა შექმნან საკმარისი არსენალი პროფესიული პროგრამისტი – კარგი “სკრიფტინგის ენა” უნდა – არც ისინი კარგი ენებზე ასწავლიან სტუდენტებს ახალი პროგრამირების. მათ აქვთ ბევრი ოვერჰედის და სხვა სირთულეები, რომელიც იღებს ბევრი სიამოვნება, და ორივე სტუდენტის და მასწავლებლის სამუშაო უფრო რთული, ვიდრე უნდა იყოს.

არიან ადამიანები, რომლებიც ამტკიცებს, რომ იმ დაბრკოლებების ნაწილი ვართ დისციპლინის პროგრამირების – მოსწავლეებმა უნდა ისწავლონ დაჭერა მათი გამონაკლისის გარდა, გამოიყენოთ პოინტერები, გამოაცხადოს ყველა მათი ტიპის და სხვ. შესაძლოა, შესაძლოა, არა – მაგრამ არსებობს დრო, რომ მოგვიანებით. მოდით მოდით სტუდენტებს აქვთ მარტივი სიხარული მცირე წარმატებები, რომ ჩვენ (ისე, “მე” მაინც) ჰქონდა, როდესაც ჩვენ ვიწყებთ. Patrick Jordan – [email protected] – 2004-12-14


მინაწერი (Feb 2006)

გარდა იმისა, რომ კომენტარები ზემოთ, დიდი რაოდენობის ხალხი წერდა ჩემთვის შემდეგ ამ მუხლის გამოჩნდა ყოველდღიური Python აღვნიშნო, რომ არ იყო მარტივი გზა ამის გაკეთება Python:

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

%> python add.py

(სხვადასხვა ერთი სამგზავრო, როგორიცაა “ბეჭდვითი input () + input () ასევე შესთავაზა და მუშაობა ისევე, როგორც კარგად, მაგრამ მე ამტკიცებენ, ნაკლებად სასარგებლოა მეცადინეობისათვის). გარდა ამისა, მას შემდეგ, რაც input () ადასტურებს მართებული Python გამოხატვის, ეს პროგრამა უბრალოდ მუშაობს მთელი რიგი საშუალებებით – ints, მოძრავი, სიმები (ეს კიდე აკავშირებს მათ – მაგრამ აღნიშნავენ, რომ ისინი უნდა იყოს შეთავაზებები სხვას ისინი უნდა განიმარტოს, როგორც ცვლადი სახელები) და გამოთქმები, როგორიცაა “3.14 ** 2”. კიდევ ერთხელ ადასტურებს, თითქოს ეს იყო საჭირო, სილამაზე Python.

კომენტარები

მე მივიღე რამდენიმე კომენტარი ამ თემაზე, კერძოდ ენაზე, მე არ უხსენებია (Ruby, C++, Smalltalk, LISP)…
დაწვრილებით კომენტარები 
მოხმარებლის კიდევ უფრო კომენტარები