Apuntes De RUBY
Total Page:16
File Type:pdf, Size:1020Kb
Apuntes de RUBY Casiano R. Le´on 1 1DEIOC Universidad de La Laguna A Juana For it is in teaching that we learn And it is in understanding that we are understood 1 Agradecimientos/Acknowledgments I'd like to thank A mis alumnos de Lenguajes y Paradigmas de Programaci´ondel Grado de Inform´atica de la Escuela Superior de Inform´atica en la Universidad de La Laguna 2 Parte I LENGUAJES Y PARADIGMAS DE PROGRAMACION 3 Cap´ıtulo1 Introducci´ona los Lenguajes y Paradigmas de Programaci´on Los primeros computadores costaban millones de d´olaresde 1940, ocupaban una o varias habita- ciones y consum´ıantanta electricidad como una f´abricade tama~nomediano. El Colossus fu´eel primer computador electr´onicodigital completamente programable (1943-1944). Los primeros computadores se programaban en lenguaje m´aquina:una secuencia de bits que con- trola directamente al procesador. Los programadores usaban lenguaje m´aquina entre otras cosas por- que estaban convencidos de que el tiempo del computador era mucho mas valioso que el tiempo del programador. El lenguaje ensamblador fue inventado para permitir que las operaciones fueran expresadas me- diante abreviaciones nem´onicas. Al principio la correspondencia era uno-uno entre nem´onicose instrucciones de la m´aquina.Luego se les a~nadieron expansiones de macros, que permiten la abreviaci´onde secuencias parametrizadas de secuencias de instrucciones que aparecen a menudo. Cuando los computadores empezaron a evolucionar y a tener distintos dise~nos,comenz´otambi´en la frustraci´onde tener que reescribir los programas para cada nueva m´aquina.empez´oa ser clara la necesidad de disponer de un lenguaje que fuera independiente de la m´aquina en el cual fuera posible expresar usando una notaci´onmatem´aticalos c´alculos.En la d´ecadade los 50 aparece el lenguaje Fortran. El lenguaje Lisp especificado en 1958 por John McCarthy es s´oloun a~nomas joven. Tambi´en de esa ´epoca es el lenguaje Algol. Los compiladores son los programas del sistema que se encargan de la traducci´ondesde un lenguaje de alto nivel al lenguaje ensamblador o al lenguaje m´aquina. Al comienzo los programadores pod´ıanescribir c´odigoen ensamblador que era mas eficiente que el que el compilador produc´ıa.Hoy en d´ıa,en parte debido a la complejidad del hardware (pipelining, multiples unidades funcionales, etc.) un compilador puede producir mejor c´odigoque el escrito por un humano. Adem´asel coste del trabajador hoy en d´ıasobrepasa con mucho al costo del hardware. Se trata por tanto de economizar en la construcci´onde programas y su mantenimiento. 1.1. Modelos de Programaci´on Programming models bridge the gap between the underlying hardware architecture and the sup- porting layers of software available to applications. Programming models are different from both programming languages and application programming interfaces (APIs). Specifically, a programming model is an abstraction of the underlying computer system that allows for the expression of both algorithms and data structures. In comparison, languages and APIs provide implementations of these abstractions and allow the algorithms and data structures to be put into practice { a programming model exists independently of the choice of both the programming language and the supporting APIs. 4 1.2. Paradigmas de Programaci´on A programming paradigm is a fundamental style of computer programming, a way of building the structure and elements of computer programs. Capabilities and styles of various programming languages are defined by their supported program- ming paradigms; some programming languages are designed to follow only one paradigm, while others support multiple paradigms. Programming paradigms that are often distinguished include imperative (Fortran, C) declarative (Prolog, SQL) functional (Haskell) object-oriented (Smalltalk, Ruby) logic (Prolog) Programming paradigms can be compared with programming models that are abstractions of com- puter systems. For example, the von Neumann model is a programming model used in traditional sequential computers. For parallel computing, there are many possible models typically reflecting different ways processors can be interconnected. The most common are based on shared memory, distributed memory with message passing, or a hybrid of the two. Some programming language researchers criticise the notion of paradigms as a classification of programming languages. They argue that many programming languages cannot be strictly classified into one paradigm, but rather include features from several paradigms. Imperative programming is focused on describing how a program operates. It describes compu- tation in terms of statements that change a program state. Object-oriented programming integrates code and data using the concept of an .object". An object has both state (data) and behavior (code). Declarative programming is a style of programming in which programs describe their desired results without explicitly listing commands or steps that must be performed. Logic programming is a programming paradigm based on formal logic 1.3. El Arte del Dise~node Lenguajes >Por que hay tantos lenguajes de programaci´on? 1. Evoluci´on Fortran Algol Smalltalk Cobol -----> Pascal -----> C++ Basic Ada Eiffel ... ... ... GOTOS STRUCTURED OOP 2. Prop´ositoespec´ıfico Lisp Computaci´onsimb´olica Prolog Relaciones l´ogicas Snobol, Icon Manipulaci´onde texto Perl Manipulaci´onde texto y programaci´onde sistemas 5 3. Preferencias personales Brevedad de C Recursi´on versus iteraci´on Punteros >Que hace que un lenguaje tenga ´exito? 1. Expresividad Basic (priemras versiones) versus Common Lisp 2. Facilidad de aprendizaje Basic Logo, Scratch, Pascal Java 3. F´acilde implementar Basic Pascal 4. Open Source C 5. Calidad de los compiladores Fortran 6. Razones econ´omicas, Patronazgo, Inercia Cobol, PL/I <--- IBM Ada <--- Departamento de Defensa USA C# <--- Microsoft Java <--- Sun, Oracle, Google 1.4. El Espectro de los Lenguajes de Programaci´on Los lenguajes de programaci´onpueden ser clasificados en familias de acuerdo con su modelo de computaci´on[?]. declarativo funcional Lisp, Scheme, Clojure, ML, Haskell, Scala flujo de datos (dataflow) Id, Val logicos, basados-en-restricciones Prolog basados en templates XSLT imperativos von Neuman C, Ada, Fortran scripting Perl, Python, PHP orientados a objetos Smalltalk, Ruby, Eiffel, C++, Scala 6 1. Los lenguajes funcionales usan un modelo computacional basado en la definici´onde funciones recursivas. Se inspiran en el lambda c´alculo(Lisp, ML, Haskell, Erlang, Elixir) 2. Los lenguajes dataflow realizan su c´alculoseg´unel flujo de informaci´onentre nodos funcionales. Son ejemplos de Dataflow los lenguajes Id y Val. Las hojas de c´alculotambi´enpueden conside- rarse un ejemplo, ya que el cambio de una variable fuerza el re-c´alculode todas las celdas que dependen de ella 3. Los lenguajes l´ogicos y los lenguajes de restricciones se inspiran en la l´ogicade predicados 4. Los lenguajes de von Neumann se basan en la ejecuci´onde las sentencias de un programa almacenado en memoria y que cambian los valores de las variables almacenadas en la memoria 5. Los lenguajes de scripting o lenguajes din´amicos facilitan la combinaci´onde componentes que fueron desarrolladas como programas independientes. Son lenguajes de scripting bash, csh, awk, PHP, JavaScript, Perl, Python, Ruby, . 6. Los Lenguajes orientados a objetos describen la soluci´onen base a objetos que interactuan entre si. Los objetos disponen de su propio estado interno y un conjunto de subrutinas (denominadas m´etodos) que modifican dicho estado. el lenguaje orientado a objetos por excelencia es Smalltalk En cuanto a la concurrencia, las mas de las veces es implementada mediante librer´ıas,paquetes y compiladores extendiendo las capacidades de un lenguaje secuencial como C o Fortran. Algunos len- guajes, entre ellos Java, C#, Ada, Modula-3, Erlang y Elixir contienen caracter´ısticasexpl´ıcitamente concurrentes. Para ver como diferentes lenguajes resuelven el mismo problema puede consultarse: Rosetta Code: A site with solutions to the same task in as many different languages as possible, to demonstrate how languages are similar and different 1.5. >Porqu´eestudiar lenguajes? 1. Los lenguajes de prop´osito/dominio espec´ıficopermiten expresar de forma mas sencilla la soluci´on de un determinado problema: a) HTML para escibir p´aginasweb b) CSS para darles estilo c) Make o Rake para describir el workflow de tareas d)L ATEX para escribir documentos e) SQL para la manipulaci´onde datos f ) DOT (GraphViz) para dibujar grafos la mayor parte de los programadores nunca implementaran un lenguaje de programaci´onpero si que posiblemente tendr´anque escribir programas que transformen de un formato a otro o crear su propio lenguaje de configuraci´onpara una cierta aplicaci´on 2. Simular caracter´ısticas ´utilesde un lenguaje en otro 3. Elegir entre varias alternativas para expresar una misma cosa una alternativa ´optima 7 Cap´ıtulo2 Programaci´onImperativa Imperative programming is focused on describing how a program operates. In computer science terminologies, imperative programming is a programming paradigm that des- cribes computation in terms of statements that change a program state. The term is often used in contrast to declarative programming, which focuses on what the program should accomplish without prescribing how to do it in terms of sequences of actions to be taken. V´ease la secci´onImperative Programming de la Wikipedia. 2.1. Estructuras de Datos V´easela secci´onData structure en la Wikipedia