Fordított és szkript nyelvek összehasonlító elemzése Sergyán Szabolcs
IEEE: The 2016 Top Programming Languages
IEEE: The 2016 Top Programming Language (Enterprise)
Kutatás-fejlesztésben használt nyelvek MATLAB Python R Perl Ruby SAS SPSS SQL C/C++ Java
Fő különbség a szkript és fordított nyelvek között Szkript Fordított A program futása közben az interpreter sorról-sorra (utasításról-utasításra) értelmezi az egyes utasításokat és végrehajtja azokat Az interpreter értelmezi a kódot (az egészet) A fordító futtatható (vagy köztes) kódot állít elő
Mit tanítanak Amerikában? http://cacm.acm.org/blogs/blog-cacm/176450-python-is-now-the-most-popular-introductory-teaching-language-at-top-u-s-universities/fulltext
Az interpretálás egyik következménye Parancsor Tudunk parancssorba írni utasításokat
Hol vannak a típusok? A fordított nyelvek (általában) szigorúan típusosak, (majdnem) minden változónak meg kell adni a típusát. Szkript nyelveknél viszont a változónak egyszerűen csak értéket adunk. Ezek szerint itt nincsenek is típusok? Típusok vannak, de mivel az értelmező magától is rájön minek írjuk ki. Amikor objektumot példányosítunk, akkor persze meg kell adni, hogy milyen osztályból való az objektum. (De a referenciának minek típust adni?)
Python típusai
Python összetett típusai List Elemek listája Egy lista elemei bármilyen típusúak lehetnek (akár különbözők is) Az elemek értéke módosítható A lista mérete dinamikusan változtatható Tuple Nem módosítható lista Dictionary
List
Tuple
Dictionary
List comprehension
List comprehension
Többszörös list comprehension
For ciklus Ez valójában olyan, mint C#-ban a foreach
Indexelés
Indexelés
Indexelés
Függvények A MATLAB programokat függvényenként külön-külön fájlban tároljuk Pythonban ennél egyszerűbb, ha látjuk azt a fájlt, amiben a függvény van
Függvények definiálása
Paraméterátadás Csak érték szerinti paraméterátadás van MATLAB-ban nincs referencia típus Pythonban viszont minden referencia
Paraméterátadás
Objektum orientáltság? Python-ban van Egységbezárás Adatrejtés Öröklés MATLAB-ban van Egységbezárás Ez azért nem igazi OO Interfészek, események?
Objektum orientáltság
Öröklés
Többalakúság? Nincs olyan, hogy egy leszármazott osztályú példányt ősosztályú referencián keresztül érünk el Nem lehet polimorfizmusról beszélni
Interfészek? Van értelme, ha nem erősen típusos a nyelv?
Eseménykezelés Python-ban minden referencia Még a függvények is Interfész alapú eseménykezelés? Nincsenek interfészek Delegált (metódus referencia) alapú eseménykezelés? Ez megvalósítható!
Érdemes Python-t használni? Egyszerű szemlélet Jól átlátható kód Rengeteg letölthető kész megoldás Kutatás-fejlesztésben használható libraryk Minden ingyen és szabadon letölthető
Érdemes MATLAB-ot használni? Ha tudjuk hatékonyan használni az indexelését Mátrixok műveletvégzési sebességében verhetetlen Kutatás-fejlesztésben használt toolbox-ok Minden toolbox mögött ipari szabványokhoz illeszkedő bizonyítottan helyesen működő kód Nem olcsó
Milyen nyelven programozzak? Amivel megoldható az adott probléma Aminek értjük a hátterét is Aminek ismerjük az előnyeit és hátrányait is
Köszönöm a figyelmet!
C# using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BinarisFa class Program static void Main(string[] args) Tree<int> t = new Tree<int>(); t.insertionhappened += ReportInsert<int>; t.add(10); t.add(3); t.add(5); t.add(1); t.add(14); Node<int> actualnode = t.find(5); Console.WriteLine(actualNode.ToString() + " " + actualnode.ertek); t.printtree(); Console.ReadKey(); static void ReportInsert<T>(T ertek) Console.WriteLine("0 beszurva", ertek); class Node<T> Node<T> left; Node<T> right; T ertek; public Node<T> Left get return left; set left = value; public Node<T> Right get return right; set right = value; public T Ertek get return ertek; set ertek = value; public Node(T ertek) this.ertek = ertek;
C# left = null; right = null; class Tree<T> where T : IComparable Node<T> root; public Tree() root = null; public void Add(T ertek) if (root == null) root = new Node<T>(ertek); if (InsertionHappened!= null) InsertionHappened(ertek); else _Add(ertek, root); void _Add(T ertek, Node<T> node) if (ertek.compareto(node.ertek) < 0) if (node.left!= null) _Add(ertek, node.left); else Node<T> newnode = new Node<T>(ertek); node.left = newnode; if (InsertionHappened!= null) InsertionHappened(ertek); else if (node.right!= null) _Add(ertek, node.right); else Node<T> newnode = new Node<T>(ertek); node.right = newnode; if (InsertionHappened!= null) InsertionHappened(ertek); public Node<T> Find(T ertek) if (root!= null) return _Find(ertek, root);
C# else return null; Node<T> _Find(T ertek, Node<T> node) if (ertek.equals(node.ertek)) return node; else if (ertek.compareto(node.ertek) < 0 && node.left!= null) return _Find(ertek, node.left); else if (ertek.compareto(node.ertek) > 0 && node.right!= null) return _Find(ertek, node.right); else return null; public void DeleteTree() root = null; public void PrintTree() if (root!= null) _PrintTree(root); void _PrintTree(Node<T> node) if (node!= null) _PrintTree(node.Left); Console.WriteLine(node.Ertek); _PrintTree(node.Right); public delegate void Report(T ertek); public event Report InsertionHappened;
Python class Node : def init (self, value) : self. left = None self. right = None self. value = value def GetLeft(self) : return self. left def SetLeft(self, left) : self. left = left def GetRight(self) : return self. right def SetRight(self, right) : self. right = right def GetValue(self) : return self. value def SetValue(self, value) : self. value = value class Tree : def init (self) : self. root = None self.insertionhappened = None def Add(self, value) : if self. root == None : self. root = Node(value) if self.insertionhappened!= None : self.insertionhappened(value) else : self. Add(value, self. root) def Add(self, value, node) : if value < node.getvalue() : if node.getleft()!= None : self. Add(value, node.getleft()) else : newnode = Node(value) node.setleft(newnode) if self.insertionhappened!= None : self.insertionhappened(value) else : if node.getright()!= None : self. Add(value, node.getright()) else : newnode = Node(value) node.setright(newnode) if self.insertionhappened!= None : self.insertionhappened(value) def Find(self, value) : if self. root!= None :
Python return self. Find(value, self. root) else : return None def Find(self, value, node) : if value == node.getvalue() : return node elif value < node.getvalue() and node.getleft()!= None : return self. Find(value, node.getleft()) elif value > node.getvalue() and node.getright()!= None : return self. Find(value, node.getright()) else : return None def DeleteTree(self) : self. root = None def PrintTree(self) : if self. root!= None : self. PrintTree(self. root) def PrintTree(self, node) : if (node!= None) : self. PrintTree(node.GetLeft()) print str(node.getvalue()) + ' ' self. PrintTree(node.GetRight()) def SetEvent(self, newevent) : self.insertionhappened = newevent def ReportInsert(value) : print "%d beszurva" % value t = Tree() t.setevent(reportinsert) t.add(10) t.add(3) t.add(5) t.add(1) t.add(14) actualnode = t.find(5) print actualnode, actualnode.getvalue() t.printtree()