Next Previous Contents

10. Στοιχεία Προγραμματισμού

10.1 Σενάρια φλοιού: κατά πολύ ανώτερα των αρχείων .bat

Αν χρησιμοποιούσατε αρχεία .BAT για να κατασκευάσετε συντομεύσεις πολύ μεγάλων εντολών στο DOS(εγώ το έκανα συχνά), τώρα στο Linux μπορείτε να εισάγετε κατάλληλα alias (δείτε το παραπάνω παράδειγμα) στο profile ή το .bash_profile. Αν όμως τα αρχεία .BAT σας ήταν πιο πολύπλοκα, τότε θα τρελαθείτε με την γλώσσα σεναρίων (scripting language) που σας παρέχει το κέλυφος: είναι το ίδιο δυνατή όσο και η παλιά καλή QBasic, αν όχι δυνατότερη. Έχει μεταβλητές, δομές όπως while, for, case, if... then... else, και πολλές άλλες δυνατότητες: είναι μια καλή εναλλακτική σε μία «πραγματική» γλώσσα προγραμματισμού.

Για να γράψετε ένα σενάριο - το αντίστοιχο του αρχείου .BAT στο DOS - αρκεί να γράψετε ένα απλό αρχείο ASCII που να περιέχει τις εντολές σας, να το σώσετε και να το κάνετε εκτελέσιμο με την εντολή chmod +x <scriptfile>. Για να το εκτελέσετε, γράψτε το όνομά του.

Μία προειδοποίηση: ο βασικός συντάκτης κειμένου του συστήματος είναι ο vi, και από την εμπειρία μου συνάγω ότι οι περισσότεροι χρήστες δυσκολεύονται πολύ κατά τη χρήση του. Δεν θα εξηγήσω τη χρήση του: διαβάστε το βιβλίο του Matt Welsh ή ψάξτε για έναν οδηγό στο Διαδίκτυο. Θα πω όμως ότι:

Ένας καλός συντάκτης κειμένου για αρχαρίους είναι ο joe που ξεκινά πληκτρολογώντας jstar. Έχετε τις ίδιες συντομεύσεις πλήκτρων όπως στους συντάκτες του DOSWin editor. Ο jed στο WordStar ή σε μορφή IDE είναι ακόμη καλύτερος. Αν θέλετε συμβουλευτείτε την ενότητα Πού θα βρείτε εφαρμογές για να δείτε πού θα βρείτε αυτούς τους συντάκτες.

Η συγγραφή σεναρίων στο bash είναι ένα εξαιρετικά αχανές θέμα και χρειάζεται ένα βιβλίο από μόνο του! Γι' αυτό και δε θα υπεισέλθω περισσότερο. Θα σας δώσω όμως ένα παράδειγμα σεναρίου κελύφους (shell script), εκ του οποίου μπορείτε να εξάγετε μερικούς βασικούς κανόνες:


#!/bin/sh
# sample.sh
# I am a comment
# don't change the first line, it must be there
echo "This system is: `uname -a`" # use the output of the command
echo "My name is $0" # built-in variables
echo "You gave me the following $# parameters: "$*
echo "The first parameter is: "$1
echo -n "What's your name? " ; read your_name
echo notice the difference: "hi $your_name" # quoting with "
echo notice the difference: 'hi $your_name' # quoting with '
DIRS=0 ; FILES=0
for file in `ls .` ; do
  if [ -d ${file} ] ; then # if file is a directory
    DIRS=`expr $DIRS + 1`  # DIRS = DIRS + 1
  elif [ -f ${file} ] ; then
    FILES=`expr $FILES + 1`
  fi
  case ${file} in
    *.gif|*jpg) echo "${file}: graphic file" ;;
    *.txt|*.tex) echo "${file}: text file" ;;
    *.c|*.f|*.for) echo "${file}: source file" ;;
    *) echo "${file}: generic file" ;;
  esac
done
echo "there are ${DIRS} directories and ${FILES} files"
ls | grep "ZxY--!!!WKW"
if [ $? != 0 ] ; then # exit code of last command
  echo "ZxY--!!!WKW not found"
fi
echo "enough... type 'man bash' if you want more info."

10.2 Η πιο C-μαντική γλώσσα

Στο UNIX, γλώσσα του συστήματος είναι η C, είτε μας αρέσει είτε όχι. Παρ' όλ' αυτά είναι διαθέσιμες και άλλες γλώσσες, όπως οι Java, FORTRAN, Pascal, Lisp, Basic, Perl, κλπ.

Θεωρώντας ως δεδομένο ότι γνωρίζετε C, ιδού κάποιες κατευθυντήριες γραμμές για εσάς που έχετε «χαλάσει» από την Turbo C++ ή όποια άλλη υλοποίηση της C στο DOS. Στο Linux, ο μεταγλωττιστής C λέγεται gcc και δεν έχει καμία από τις φανφάρες που κατά κανόνα συνοδεύουν τις DOS-άδικες υλοποιήσεις: δεν υπάρχει IDE, βοήθεια on-line, ενσωματωμένη υπηρεσία αποσφαλμάτωσης (integrated debugger) κλπ. Είναι απλώς και μόνον ένας μεταγλωττιστής για τη γραμμή εντολών, πολύ δυνατός και αποτελεσματικός. Για να μεταγλωττίσετε τον κώδικα hello.c θα πληκτρολογήσετε:

$ gcc hello.c

το οποίον θα δημιουργήσει ένα εκτελέσιμο αρχείο ονόματι a.out. Για να δώσετε στο εκτελέσιμο άλλο όνομα, πληκτρολογείστε:

$ gcc -o hola hello.c

Για να συνδέσετε μία βιβλιοθήκη με ένα πρόγραμμα, προσθέστε το διακόπτη -l<όνομα_βιβλιοθήκης>. Παραδείγματος χάριν, για να συνδέσετε τη μαθηματική βιβλιοθήκη:

$ gcc -o mathprog mathprog.c -lm

(Ο διακόπτης -l<libname> αναγκάζει τον gcc να συνδέσει τη βιβλιοθήκη /usr/lib/lib<όνομα_βιβλιοθήκης>.so· οπότε, ο -lm συνδέει το /usr/lib/libm.so).

Ωραία μέχρι στιγμής. Όταν, όμως, το πρόγραμμά σας αποτελείται από διάφορα πηγαία αρχεία, τότε χρειάζεστε το πρόγραμμα make. Ας υποθέσουμε ότι έχετε γράψει έναν expression parser. Το πηγαίο αρχείο του είναι το parser.c και αυτό περιέχει (#includes) δύο αρχεία header, τα parser.h και xy.h. Θέλετε τώρα να χρησιμοποιήσετε τις ρουτίνες του parser.c σε ένα άλλο πρόγραμμα, έστω το calc.c, το οποίο στη συνέχεια περιέχει (#includes) το parser.h. Μπλέξιμο! Τί πρέπει να κάνετε για να μεταγλωττίσετε το calc.c;

Θα πρέπει να γράψετε το λεγόμενο Makefile, το οποίο δείχνει στον μεταγλωττιστή τις εξαρτήσεις μεταξύ των πηγαίων αρχείων και των αρχείων object. Στο παράδειγμά μας:


# This is Makefile, used to compile calc.c
# Press the <TAB> key where indicated!

calc: calc.o parser.o
<TAB>gcc -o calc calc.o parser.o -lm
# calc depends on two object files: calc.o and parser.o

calc.o: calc.c parser.h
<TAB>gcc -c calc.c
# calc.o depends on two source files

parser.o:  parser.c parser.h xy.h
<TAB>gcc -c parser.c
# parser.o depends on three source files

# end of Makefile.

Σώστε αυτό το αρχείο ως Makefile και πληκτρολογείστε make για να μεταγλωττίσετε το πρόγραμμά σας· εναλλακτικά, σώστε το ως calc.mak, πληκτρολογείστε make -f calc.mak, και βεβαίως RMP! Μπορείτε να βρείτε κάποια βοήθεια σχετικά με τις συναρτήσεις της C που καλύπτονται από τις σελίδες εγχειριδίου (man pages), τομέας 3· για παράδειγμα,

$ man 3 printf

Για να αποσφαλματώσετε τα προγράμματά σας (debug) χρησιμοποιείστε το gdb. Για να μάθετε πώς να το χρησιμοποιείτε: info gdb.

Υπάρχουν πολλές διαθέσιμες βιβλιοθήκες· ανάμεσα στις πρώτες που θα θελήσετε να χρησιμοποιήσετε είναι οι ncurses (εφέ σε textmode), και svgalib (γραφικά κονσόλας). Αν είστε αρκετά γενναίοι να ασχοληθείτε με τον προγραμματισμό στο X11 (δεν είναι τόσο δύσκολο), ιδού κάποιες βιβλιοθήκες που διευκολύνουν τη συγγραφή προγραμμάτων σε Χ11. Δείτε στο http://www.xnet.com/~blatura/linapp6.html, έχοντες υπ' όψη ότι το Gtk άρχισε να γίνεται το πρότυπο στο Linux.

Πολλοί συντάκτες κειμένου δρουν ως IDE, για παράδειγμα οι emacs και jed, έχουν τη δυνατότητα για φωτισμό σύνταξης (syntax highlighting), αυτόματη παραγραφοποίηση (indent), και άλλα. Εναλλακτικά, κατεβάστε το πακέτο rhide από τον τόπο ftp://sunsite.unc.edu:/pub/Linux/devel/debuggers/. Είναι ένας κλώνος του Borland IDE και πιστεύω θα σας αρέσει.


Next Previous Contents