Citat:
Originalno napisao bojan_bozovic
@ivanhoe
Upravo u tradicionalnim jezicima ne brines o tipovima, a u skript jezicima moras recimo
class nesto {
var $broj1;
function promenibroj1($vrednost) {
if (is_float($vrednost){
$this->$broj1=$vrednost;
}
}
}
|
Ček, ček, ...
Python:
Kôd:
>>> a=1
>>> a+="1"
Traceback (most recent call last):
File "<pyshell#1>", line 1, in -toplevel-
a+="1"
TypeError: unsupported operand type(s) for +=: 'int' and 'str'
Kôd:
class Foo:
def __init__(self):
self.broj1 = 1
def promeni_broj(self, vrednost):
self.broj1 = vrednost
def promeni_broj2(self, vrednost):
# safe
try:
self.broj1 = int(vrednost)
except ValueError, err:
# vrednost nije int, do something
promeni_broj2 je ekvivalentna sa:
Kôd:
void promeni_broj2(int vrednost) {
broj1 = vrednost;
}
I šta je tu gore od "strongly typed" jezika, ili je try:...except: blok komplikovan? Osim sitnice, da kada dobijem (nekako) pogrešan podatak (npr. prosledim string "ABCD" umesto int-a, vrednost će imati vrednost
pointera na string bez ikakve poruke o grešci.
Tačnije kod "strongly typed" jezika ja
moram unapred i kroz ceo kod da brinem o tipu podataka (a i veličini osim ako ne radim dinamičku alokaciju memorije što stvara druge probleme), kada koristim "loose typed" jezik brinuću o tipu podatka samo tamo gde taj podatak koristim.
BTW zar PHP5 nije dobio nesto slično za rad sa exception-ima?
Najveća razlika između "skript" jezika i "compiled" jezika je u brzini (koja već odavno nije toliko bitna - hardver je daaaaaleko jeftiniji od programerskog vremena) i velike razlike u brzini razvoja aplikacija (za par redova veličine na štetu "compiled" jezika). Da ne pominjem "čuda" kao metaklase, dinamičko generisanje metoda, .....
Bottom line je da kod "strongly typed" jezika greška u tipu prosleđenog podatka (ako se provuče, a moguće je) će dovesti do core dump-a (ili ako je Win u pitajnju čak i do BOD-a), dok će "loose typed" jezik "baciti" exception koji će lako moći da bude "uhvaćen" i obrađen tamo gde treba (ako ne, onda je to bug, a podaci koji budu prijavljenu u exp (stack trace i sl.) će biti sasvim dovoljni da se "nalovi" mesto gde je do toga došlo - mnogo lakše nego da provodim vreme uz debager "loveći" mesto).
I kao što neko reče
A right tool for the right job™. Sigurno neću pisati OS u Python-u, ali za web app (a o tome je ovde priča) koristiti C/C++ je definitivno
overkill.
Korisno štivo:
http://www.sitepoint.com/article/typ...dynamic-typing
p.s. Python (za ostale nisam siguran - ne koristim ih sada previše) ima daleko bolju podršku za exception-e od C++ i Jave IMHO. Takođe za Python postoji pychecker koji moža da uradi (skoro) sve provere oko tipova podataka i sl. kao da se koristi "strongly typed" jezik.
p.p.s. "strongly typed" se ne odnosi na Javu/C# jer su kod njih uspeli da isprave dosta problema sa C/C++.
p.p.p.s. Moj razvojni put
se kretao: Z80 asm -> MC68K asm -> C -> (C++, perl, PHP) -> Python. Tako da sam prilično upoznat sa prednostima (a i manama) većine njih.