Ştiri:

Vă rugăm să citiţi Regulamentul de utilizare a forumului Scientia în secţiunea intitulată "Regulamentul de utilizare a forumului. CITEŞTE-L!".

Main Menu

Limbaje de programare

Creat de alina.d, Octombrie 26, 2009, 07:01:24 PM

« precedentul - următorul »

0 Membri şi 1 Vizitator vizualizează acest subiect.

AlexandruLazar

1. Lisp este un limbaj homoiconic, adică orice program Lisp valid este o listă de expresii simbolice care poate fi manipulată -- și invers, orice listă corect definită este un program Lisp valid. O aplicație foarte "perversă" a chestiei ăsteia este manipularea simbolică a funcțiilor. Cei de la Genera aveau prin anii '80 un engine de derivare și integrare simbolică, care putea integra și deriva direct funcțiile definite în LISP. Adică, funcției (integrate f) îi dădeai ca argument funcția scrisă de tine în Lisp (de exemplu, (defun square (x) (* x x)), și îți întorcea direct funcția Lisp cu expresia integralei nedefinite. Nu știu dacă mai există asta și acum, știu că vroiau la un moment dat să implementeze asta în Maxima.

2. Macro-urile, care sunt o consecință directă a homoiconicității (se poate, e drept, și în limbaje nehomoiconice, dar nu sunt la fel de puternice). E ceea ce stă în spatele faptului că poți să scrii direct

(loop for k being the hash-key using (hash-value v) of h do (format t "~a ~a~%" k v))

ca să treci prin fiecare pereche key-value dintr-un hash table.

Tot asta permite să scrii foarte ușor un DSL -- o mare parte din Maxima e implementat de fapt așa.

3. Flexibilitatea în ceea ce privește paradigmele. Poți să scrii foarte ușor un program pur functional, sau pur imperativ, cu sau făra OOP. Ce-i drept, CLOS este destul de greoi de învățat ce-i drept.

Din păcate toate astea sunt trase în jos de lipsa cronică de biblioteci.

Dendros

#91
Interesant. Așa mai învăț și eu câte ceva. Și ceea ce ați enumerat nu este valabil în Scheme/Racket? În privința bibliotecilor, Racket pare să stea destul de bine, din ceea ce scrie în manual. Am căutat și eu, tot de curiozitate, ce alte limbaje funcționale există. Mi-a atras atenția Haskell.
Se poate compara cu Lisp?

Sper că nu vă deranjează că tot întreb, chiar învăț din asta. Știu că aș putea căuta tutoriale și altele pe Internet, dar prefer să comunic. Faptul că întreb de aceste limbaje nu înseamnă că am de gând să le încerc, m-am fixat pe Octave și îl învăț acum, și din când în când Racket. Dar îmi place să învăț, cum spuneam.

AlexandruLazar

Nu întru totul. Scheme nu are un suport la fel de larg pentru macro-uri, și are o abordare mult mai "minimalistă" decât Common Lisp. De asemenea, accentul e pus pe partea de programare funcțională, mai puține sunt facilitățile pentru programare imperativă.

Haskell am încercat și eu sa învăț la un moment dat dar programarea pur funcțională nu e ceva care să îmi placa, te dezleagă de multe limitări ale programării pur imperative dar îți pune alte bețe în roate. Experiența de a învăța Haskell e totuși interesantă, mai ales dacă te pasionează aspecte ale matematicii ca teoria categoriilor.

Dendros

Am scris primul meu (mic) program în Racket/Scheme. Implementează un algoritm simplu, pe care l-am dat pe pag. 2 a acestui topic, ca răspuns la problema lui Adi privind obținerea valorii lui Pi printr-un experiment ce implică o simulare bazată pe valori aleatoare. Scuzați dacă codul are erori de formă, nu am făcut copy/paste, l-am transcris manual fiindcă postez de la alt calculator. Dar este corect scris, altfel nu aș fi putut să-l rulez. Iată-l:
(define (valoare_pi n)
            (let ((n1 0))
               (for ((i (in-range 1 n)))
                  (let ((x (random)))
                     (let ((y (random)))
                       (define z (sqrt (+ (expt x 2) (expt y 2))))
                          (if (<= z 1)
                              (set! n1 (+ n1 1))
                              (set! n1 (+ n1 0))
                              )
                        )
                  )
                )
            (let ((valoare (* 4 (/ n1 n))))
              (display valoare)
              )
            )
         )


Pare să funcționeze, l-am testat, dar are hibe. Oricum, sunt la început și sunt sigur că sunt multe subtilități care îmi scapă. Un aspect este că rezultatele furnizate sunt afișate ca fracții (rapoarte), nu ca numere. De exemplu, am rulat astfel:
(valoare_pi 3445)

Iar rezultatul este afișat așa:
10896/3445

Exact așa, ca fracție, nu valoarea ei numerică. Ce ar trebui îmbunătățit? Și se pare că Racket simplifică automat fracțiile, când se poate. De ex., au fost cazuri când pentru n de ordinul miilor a afișat fracția 22/7, ceea ce îmi spune că a simplificat rezultatul. E normal?

AlexandruLazar

Dap, e normal, tipul număr rațional (i.e. reprezentare ca fracție) e unul din tipurile native în multe dialecte Lisp.

Cred că și în Racket Scheme funcționează asta: forțează tipul float fie prin coerciție manuală (asta chiar nu mai știu cum se face în Scheme, sau dacă se poate face de fapt, dar trebuie să fie prin manual), fie asigurându-te că unul din argumentele de la împărțire este de tip float. Cred că va merge așa:

(let ((valoare (* 4.0 (/ n1 n))))

(deci punând 4.0 în loc de 4)

și/sau punând

(set! n1 (+ n1 1.0))
(set! n1 (+ n1 0))


Dendros

Mulţumesc, am să încerc asta. Pot spune că e destul de greu cu Racket la început, dar apoi începe să meargă. Acum lucrez mai mult empiric, cu o carte de Lisp, manualul Racket şi câte un algoritm exprimat în pseudocod sau limbaj natural.

Thorth

Salutare,

In primul rand pentru incepatori, ca am vazut pe aici ca va incurca pointerii din anumite limbaje de programare. Ceea ce se invata la liceu i se spune C++, dar de fapt si de drept e un mare C si nu C++. Diferenta dintre C++ si C, este urmatoarea: In C++ datorita nevoilor fizice, economice etc, s-au inventat clasele cu toate aplicatiile, principiile, etc (derivare, polimorfism, templeturi, functie virtuale, functii friend, etc.) Asadar recomand cu multa caldura sa va apucati de C si nu de C# sau C++, si nu dpdv economic, sau alte lucruri, pur si simplu se iau notiunile de la baza. In C++ se folosesc acelasi lucruri din C (C++ e o continuare de la C) cu mici diferente, care nu ar trebui sa va puna probleme.
Exemplu:  in C afisarea unor variabile, rezultate se face cu printf iar in C++ cu cout.

In ziua de azi, ca limbaje de programare in aplicatii destop, bineinteles depinde de ce se doreste sa se realize, se folosec urmatoarele:


  • C#(C++ mai rar)
  • Delphi
  • Java

AlexandruLazar

În bună parte sunt de acord, dar mi-am făcut un obicei să amintesc asta de fiecare dată: biblioteca standard a unui limbaj nu e totuna cu limbajul. În C++ se poate folosi în continuare printf fără nicio problemă; suportul pentru stream-uri este suplimentar, dar nu înlocuieşte suportul tradiţional de I/O buffered. printf e în cstdio.h.

Edit: Apropo, cu rare excepţii, Delphi nu se mai foloseşte aproape deloc, iar C++ e în continuare standardul pentru aplicaţii desktop. C# şi Java vin destul de tare din urmă, în special C#.

Thorth

Salutare,

Referitor la primul lucru pe care l-ai enuntat, nu este o problema de programare, un lucru care ar ingreuna programarea, ci este problema programatorului, capacitatea lui de adaptare este rigida.

Referitor la a doua parte, nu stiu ce informatii ai tu si de unde, dar eu iti spun din piata cum e treaba. Inca se cauta joburi in delpfi, un part time e vreo 600 de euro si un full dublu. Referitor la Java: este un limbaj de programare foarte robust, poate cel mai cel dintre toate. Cand s-a lansat s-a folosit la programare cuptoarelor cu microunde, masinilor de spalat, etc. de ce simplu, este foarte robust si aparitia eventualelor erori de limbaj era foarte mica. Mai zilele astea cei de Sun, firma care a creat java, a optimizat destul de mult limbajul si l-a realizat destul de fiabil, inainte era greoi din multe privinte.

C# - seamana destul de mult cu programare de tip Java, chiar si delpi(desi anumite concepte sunt total diferite)


Numai bine!

AlexandruLazar

Şi eu îţi spun informaţiile din aceeaşi piaţă. Se caută în continuare slujbe pentru Delphi dar în bună parte pentru menţinut aplicatii legacy, sau de către tipicul firmelor de la noi care, graţiei audienţei generale a programelor de contabilitate şi gestiune a stocurilor, nu sunt foarte selective când e vorba de cine le scrie programele. Există Lazarus şi FreePascal desigur, dar audienţa lor e mult mai puţin restrânsă decât ar merita. CodeGear Delphi (acum parcă e Embarcadero Delphi? De când l-a vândut Inprise a mai trecut prin câteva mâini) a început să fie ceva mai la zi, dar încă nu are suport nativ pentru aplicaţii 64-bit. Există aplicaţii notabile (FL Studio, AdAware, cred că şi Skype pentru Windows) care îl folosesc dar foarte puţine aplicaţii noi scrise în el, iar ăsta este primul semn de senescenţă -- în momentul în care un limbaj începe să fie folosit mai mult pentru că e neprofitabil să rescrii codebase-uri vechi de 10-15 ani decât pentru aplicaţii noi, îşi pierde momentum-ul. Nu că ar fi ceva rău; COBOL supravieţuieşte bine-mersi şi slujbe pentru COBOL se caută cam la acelaşi nivel cu slujbe pentru Ruby.

Referitor la Java: între lansare şi programarea cuptoarelor cu microunde si masinilor de spălat au trecut vreo trei ani de bancuri pe teama vitezei şi a utilităţii applet-urilor, până când au apărut primele implementări JVM pentru sisteme embedded. Cei de la Sun l-au vrut ca vehicul pentru web, abia prin '98-'99 au început să-i realizeze potenţialul pe zona embedded. Nu vreau să comentez pe tema robusteţii fiindcă asta depinde foarte mult de implementarea JVM pe care o foloseşti (de regulă e vorba ori de cea oferită de Sun (Oracle, *sigh*) ori de cea de la IBM -- dar daca incearca cineva sa te tenteze cu una pe un microcontroller, take a friendly advice and run :D). În reply-ul meu de deasupra mă refeream numai la măsura în care e folosit pentru aplicaţii desktop, şi care nu e chiar predominantă, e chiar destul de mult în urma Delphi. Fără Google, în afară de Eclipse poţi să te mai gândeşti la cinci aplicaţii desktop scrise în Java în mai puţin de 30 de secunde?

Pe partea de aplicaţii web şi enterprise lucrurile stau complet invers. Acolo e partea unde şi Java, şi C# au prins masiv. Pe partea de aplicaţii desktop, va mai dura o vreme până să scăpăm de C++. La fel cum e neprofitabil pentru cei de la ImageLine să arunce la gunoi 12 ani de cod scris în Delphi, e neprofitabil şi pentru ceilalţi jucători mari să arunce la gunoi 15 ani de cod bazat pe MFC. Mai ales ţinând cont de halul în care e MFC  ;D.

Thorth

Da, Embarcadero este compania care a cumparat softul, si acuma embarcadero a scos un pachet denumit Embarcadero RAD Studio  care contine o varientate de limbaje de programare, de la c++ la Delphi Prism(pentru dezvoltare  .NET) chiar si php.

Referitor la PHP versiune 5.3.3 ultima existenta pe piata, mie personal mi se pare suficienta pentru toate dimensiunile proiectelor web.

MFC -  pot zice ca este o gluma foarte buna  ;D

Lasa limbajele COBOL, RUBY, Eclipse -  faceam referire la clasicii programarilor ;D


AlexandruLazar

Citat din: Thorth din August 14, 2010, 09:53:49 PM
MFC -  pot zice ca este o gluma foarte buna  ;D

Din păcate prea mulţi au luat-o în serios ;).

Thorth

mai stau asa si mai cuget cand ma mai lovesc de numele de MFC, cum de acei oameni sunt asa de multumiti de ceea ce le rezulta :))

Dendros

Ce părere aveţi despre limbajul Objective-C? Am aflat de el din documentaţia XCode, se pare că este limbajul nativ al OS X. Întreb doar de curiozitate, nu am de gând să-l învăţ. După denumire, mi se pare că e un fel de C care include POO.

Atunci cu ce diferă de C++, care e tot o extensie a C la POO, dacă am înţeles corect?

AlexandruLazar

E o încrengătură (interesantă altfel) între C și Smalltalk. Partea interesantă nu stă în limbaj ca atare cât în runtime-ul care îl implementează.