PDF generado usando el kit de herramientas de fuente
PDF generado usando el kit de herramientas de fuente abierta mwlib. Ver http://code.pediapress.com/ para mayor informaci€nabierta mwlib. Ver http://code.pediapress.com/ para mayor informaci€n.. PDF generated at: Sat, 10
PDF generated at: Sat, 10 Nov 2012 15:34:35 UTCNov 2012 15:34:35 UTC
Programaci€n en Vala
Programaci€n en Vala
Art€culos
Art€culos
P
Prrooggrraammaaccii••nneennVVaallaa 11
IInnttrroodduuccccii••nn 33
S
SuupprriimmeerrpprrooggrraammaaeennVVaallaa 44 C
Coonncceeppttoossbb‚‚ssiiccoossddeelllleenngguuaajjee 66 P
Prrooggrraammaaccii••n n oorriieennttaadda a a a oobbjjeettoos s een n VVaallaa 2266 F
Fuunncciioonnaalliiddaaddees s aavvaannzzaaddaas s ddeel l lleenngguuaajjee 4411 F
Fuunncciioonnaalliiddaaddees s eexxppeerriimmeennttaallees s ddeel l lleenngguuaajjee 6633 B
Biibblliiootteeccaassddeelllleenngguuaajjee 6655 H
Heerrrraammiieennttaass 6666
O
Ottrraassttƒƒccnniiccaass 6699
Referencias
Referencias
F
Fuueennttees s y y ccoonnttrriibbuuyyeennttees s ddeel l aarrtt€€ccuulloo 7722 F
Fuueennttees s dde e iimmaaggeenn, , LLiicceenncciiaas s y y ccoonnttrriibbuuyyeenntteess 7733
Licencia
Licencias d
s de ar
e art€
t€culos
culos
L
Programaci€n en Vala
Programaci€n en Vala
Pr€logo
Pr€logo
Este libro pretende ser un manual de iniciaci€n al lenguaje de programaci€n Vala
Este libro pretende ser un manual de iniciaci€n al lenguaje de programaci€n Vala [1][1]. Este documento es. Este documento es principalmente una traducci€n del documento original
principalmente una traducci€n del documento original [2][2], aunque tambi•n aportar‚ material propio., aunque tambi•n aportar‚ material propio.
•ndice
•ndice
1. 1. 1.
1. InIntrtrododucuccici€n€n 1.
1. 1.
1. ƒQƒQu• u• es Ves Valala?a? 2.
2. 2.
2. ƒA quƒA qui•n vi•n va diria dirigidgido este lo este libroibro?? 3.
3. 3.
3. ConConvenvenciociones denes del lengl lenguajuajee 2.
2. 2.
2. Su prSu primeimer pror progragrama en ma en ValValaa 1.
1. 1.
1. CompiCompilado lado y ejey ejecuci€cuci€n den del prol programagrama 3.
3. 3.
3. ConConcepceptos b‚stos b‚sicoicos del lengs del lenguajuajee 1.
1. 1.
1. ArchiArchivos vos de cde c€digo €digo y cy compilaompilaci€nci€n 2.
2. 2.
2. VisVisi€n gi€n geneeneral dral de la sie la sintantaxisxis 3.
3. 3.
3. CoComementntararioioss 4.
4. 4.
4. TiTipopos s de de dadatotoss 1.
1. 1.
1. CoConsnstatantnteses 2.
2. 2.
2. TiTipopos b‚s b‚sisicocoss 3. 3. 33.. CCaaddeennaass 4. 4. 4.
4. VVecectotoreress 5.
5. 5.
5. ReRefefererencnciaiass 6.
6. 6.
6. ConConverversi€si€n est‚n est‚tictica de tipa de tiposos 7.
7. 7.
7. ConveConversi€n drsi€n din‚miin‚mica de ca de tipos tipos (Infere(Inferencia)ncia) 5.
5. 5.
5. OpOpereradadororeses 6.
6. 6.
6. EstrEstructucturauras ds de ce contontrolrol 1. 1. 11.. BBuucclleess 2. 2. 2.
2. EstrucEstructuras turas de cde control ontrol condiccondicionaleionaless 7.
7. 7.
7. EleElemenmentos tos del del lenlenguaguajeje 1. 1. 11.. MM••ttooddooss 2. 2. 2.
2. M•M•totododos deles delegagadodoss 3.
3. 3.
3. M•todM•todos os an€nian€nimos mos (Claus(Clausura/Cura/Closure)losure) 4.
4. 4.
4. EsEspapacicios de nos de nomombrbreses 5.
5. 5.
5. EsEstrtrucuctuturarass 6. 6. 66.. CCllaasseess 7. 7. 7.
7. InInteterfrfacaceses 8.
8. 8.
8. AtrAtribuibutos tos del del c€dc€digoigo 4.
4. 4.
4. PrograProgramaci€maci€n orien orientada ntada a obja objetos eetos en Valn Valaa 1.
1. 1.
1. C€C€didigo go b‚b‚sicsicoo 2.
2. 2.
2. CoConsnstrutructctororeses 3.
3. 3.
3. DeDestrstrucuctotoreress 4. 4. 44.. SSee„„aalleess 5. 5. 5.
6. 6. 6.
6. HHererenencciaia 7.
7. 7.
7. ClClasases abes abststraractctasas 8.
8. 8.
8. InInteterfarfaceces/s/MixMixininss 9.
9. 9.
9. PoPolilimomorfrfisismomo 10.
10. 10.
10. InformInformaci€n aci€n de tipde tipos en tios en tiempo de empo de ejecuejecuci€nci€n 11.
11. 11.
11. ConConverversi€si€n de tipon de tipos din‚s din‚micmicaa 12.
12. 12
12.. TiTipopos ges gen•n•riricocoss 13.
13. 13.
13. EsquemEsquema de a de constrconstrucci€ucci€n tipn tipo GOo GObjectbject 5.
5. 5.
5. FunciFuncionalidonalidades ades avanzavanzadas dadas del lenel lenguajeguaje 1.
1. 1.
1. AseAsercircioneones y Dise„s y Dise„o por cono por contratratoto 2.
2. 2.
2. MaManenejo djo de ere errorroreses 3.
3. 3.
3. DirDireccecci€n i€n de pade par‚mr‚metretrosos 4.
4. 4.
4. CoColeleccccioioneness 5.
5. 5.
5. M•tM•todoodos con sos con soporporte de site de sintantaxisxis 6.
6. 6.
6. MuMultltihihililoo 7.
7. 7.
7. El buEl buclcle prie princncipipalal 8.
8. 8.
8. M•M•totododos s asas…n…ncrcrononosos 9.
9. 9.
9. RefRefereerencincias as d•bd•bileiless 10.
10. 10.
10. ProPropiepiedad de ladad de las refes referenrenciaciass 11.
11. 11.
11. Listas Listas de pade par‚metrr‚metros de os de longitlongitud vaud variableriable 12.
12. 12
12.. PuPunnteteroross 13.
13. 13.
13. ClaseClases que s que no heno heredan redan de GLide GLib.Objb.Objectect 6.
6. 6.
6. FunciFuncionalidonalidades eades experimxperimentalentales del es del lengualenguajeje 7.
7. 7.
7. BibBiblioliotectecas deas del lenl lenguaguajeje 1.
1. 1.
1. AcceAcceso a ficso a ficheros eheros en Vala n Vala (bibli(biblioteca oteca GIO)GIO) 2.
2. 2.
2. FunciFuncionalidonalidad de read de redes en Vades en Vala (biblla (bibliotecioteca GIO y SOUa GIO y SOUP)P) 3.
3. 3.
3. FiFichchereros Xos XML eML en Van Valala 4.
4. 4.
4. PruPruebaebas unis unitartarias eias en Van Valala 5.
5. 5.
5. DesarDesarrollo de introllo de interfacerfaces gr‚fices gr‚ficas de usuarias de usuario en Vala (Gto en Vala (Gtk+)k+) 8.
8. 8.
8. HeHerrarramimienentatass 1.
1. 1.
1. El coEl compimpiladlador de Vaor de Vala (vala (valaclac)) 2.
2. 2.
2. Las heLas herramierramientas pntas para gara generar enerar bibliobibliotecatecass 3.
3. 3.
3. DepDepurauraci€ci€n de pn de progrogramramasas 9.
9. 9.
9. OtOtraras ts t•c•cninicacass 1.
1. 1.
1. UsaUsando tondo toda la poda la potentencia de Gcia de GLibLib Programaci€n en Vala/Desarrollo Programaci€n en Vala/Desarrollo
Referencias
Referencias
[1
[1]] hthttptp:/ :/ / / live.live.gnome.gnome.org/ org/ ValaVala [2
Introducci€n
Introducci€n
Introducci€n
Introducci€n
El lenguaje de programaci€n Vala
El lenguaje de programaci€n Vala [1][1]es un proyecto relativamente nuevo y por ello est‚ sujeto a cambios. Este libroes un proyecto relativamente nuevo y por ello est‚ sujeto a cambios. Este libro intentar‚ transmitir lo mejor posible cuales son los objetivos que persigue este lenguaje de programaci€n y los intentar‚ transmitir lo mejor posible cuales son los objetivos que persigue este lenguaje de programaci€n y los convenios que se deben seguir cuando se desarrolla con este lenguaje de programaci€n.
convenios que se deben seguir cuando se desarrolla con este lenguaje de programaci€n.
‚Quƒ es Vala?
‚Quƒ es Vala?
Vala es un nuevo lenguaje de programaci€n
Vala es un nuevo lenguaje de programaci€n [2][2]que permite usar t•cnicas de programaci€n modernas para desarrollarque permite usar t•cnicas de programaci€n modernas para desarrollar aplicaciones que se ejecutan usando las bibliotecas de GNOME
aplicaciones que se ejecutan usando las bibliotecas de GNOME [3][3], aunque tambi•n es posible ejecutarlo en otros, aunque tambi•n es posible ejecutarlo en otros sistemas operativos y entornos gr‚ficos, debido a sus bajas dependencias (GLib
sistemas operativos y entornos gr‚ficos, debido a sus bajas dependencias (GLib [4][4]y GObjecty GObject[5][5]). Esta plataforma de). Esta plataforma de desarrollo provee de un entorno completo de programaci€n; con funcionalidades como el sistema de tipos din‚micos desarrollo provee de un entorno completo de programaci€n; con funcionalidades como el sistema de tipos din‚micos y el gestor de memoria asistida. Antes de la existencia de Vala, la †nica forma de programar para la plataforma era y el gestor de memoria asistida. Antes de la existencia de Vala, la †nica forma de programar para la plataforma era con la API nativa de C, o utilizando un lenguaje de programaci€n de alto nivel que usan m‚quinas virtuales, como con la API nativa de C, o utilizando un lenguaje de programaci€n de alto nivel que usan m‚quinas virtuales, como Python o C#, que necesitan un wrapper
Python o C#, que necesitan un wrapper [6][6]para usar esa biblioteca.para usar esa biblioteca.
Vala es un lenguaje totalmente diferente de otros lenguajes y otras t•cnicas, ya que el compilador genera c€digo en Vala es un lenguaje totalmente diferente de otros lenguajes y otras t•cnicas, ya que el compilador genera c€digo en lenguaje C
lenguaje C [7][7], que puede ser compilado para ser ejecutado sin ninguna biblioteca extra ni wrapper intermedio. Esto, que puede ser compilado para ser ejecutado sin ninguna biblioteca extra ni wrapper intermedio. Esto tiene una serie de consecuencias, pero entre las mas importantes se encuentran:
tiene una serie de consecuencias, pero entre las mas importantes se encuentran: 1.
1. 1.
1. Los programas escritos Los programas escritos en Vala deen Vala deber…a tener un ber…a tener un desempe„o similar al desempe„o similar al mismo programa directamismo programa directamente escrito enmente escrito en lenguaje C. Siendo mucho m‚s f‚cil y r‚pido de escribir y mantener.
lenguaje C. Siendo mucho m‚s f‚cil y r‚pido de escribir y mantener. 1.
1. 1.
1. Una aplicaci€n escrita Una aplicaci€n escrita en Vala no pueen Vala no puede hacer nada que de hacer nada que un programa equivalente un programa equivalente escrito en lenguaje C escrito en lenguaje C no puedano pueda hacer. Sin embargo Vala introduce una serie de funcionalidades que no est‚n disponibles en C, las cuales se hacer. Sin embargo Vala introduce una serie de funcionalidades que no est‚n disponibles en C, las cuales se mapean en construcciones escritas en C, siendo estas †ltimas dif…ciles y complejas de escribir directamente. mapean en construcciones escritas en C, siendo estas †ltimas dif…ciles y complejas de escribir directamente.
Vala es, por lo tanto, un lenguaje de programaci€n moderno con todas las funcionalidades que se puede esperar de Vala es, por lo tanto, un lenguaje de programaci€n moderno con todas las funcionalidades que se puede esperar de una plataforma actual (Python, .NET, etc).
una plataforma actual (Python, .NET, etc).
‚A quiƒn va dirigido este libro?
‚A quiƒn va dirigido este libro?
Este libro no est‚ pensado para aprender los conceptos de programaci€n b‚sicas (para eso existen libros que puede Este libro no est‚ pensado para aprender los conceptos de programaci€n b‚sicas (para eso existen libros que puede consultar
consultar [8][8]). Este libro va dirigido a aquellos que quieran aprender a usar este lenguaje de programaci€n y algunas). Este libro va dirigido a aquellos que quieran aprender a usar este lenguaje de programaci€n y algunas de las bibliotecas que existen para el sistema. Se aconseja conocer alg†n lenguaje de programaci€n y en concreto un de las bibliotecas que existen para el sistema. Se aconseja conocer alg†n lenguaje de programaci€n y en concreto un lenguaje de programaci€n orientado a objetos.
lenguaje de programaci€n orientado a objetos.
Vala comparte bastante sintaxis con C#, pero algunas otras no se corresponden con construcciones de este lenguaje, Vala comparte bastante sintaxis con C#, pero algunas otras no se corresponden con construcciones de este lenguaje, por tanto no se entrar‚ en comparaci€n a menos que sea necesario, para evitar que este libro est• enfocado a por tanto no se entrar‚ en comparaci€n a menos que sea necesario, para evitar que este libro est• enfocado a programadores de C#.
programadores de C#.
Tambi•n ser…a conveniente que el lector tuvieras nociones de C, aunque esto no es necesario en si mismo, es Tambi•n ser…a conveniente que el lector tuvieras nociones de C, aunque esto no es necesario en si mismo, es importante darse cuenta que Vala realmente se ejecuta como un programa escrito en C compilado, y puede importante darse cuenta que Vala realmente se ejecuta como un programa escrito en C compilado, y puede interactuar con bibliotecas escritas en C. Por tanto un conocimiento de C puede hacer comprender el funcionamiento interactuar con bibliotecas escritas en C. Por tanto un conocimiento de C puede hacer comprender el funcionamiento de Vala.
Convenciones del lenguaje
Convenciones del lenguaje
El c€digo ir‚ en formato wiki normal al igual que los comandos necesarios para compilar y ejecutar los programas. El c€digo ir‚ en formato wiki normal al igual que los comandos necesarios para compilar y ejecutar los programas. El c€digo ir‚ acompa„ado de comentarios explicativos siempre que sea necesario para entenderlo.
El c€digo ir‚ acompa„ado de comentarios explicativos siempre que sea necesario para entenderlo.
Referencias
Referencias
[1
[1]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ Vala_(lenguaje_de_programaci€n)Vala_(lenguaje_de_programaci€n) [2
[2]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ Lenguaje_de_programaci€nLenguaje_de_programaci€n [3
[3]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ GNOMEGNOME [4
[4]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ GLibGLib [5
[5]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ GObjectGObject [6
[6]] hthttptp:/ :/ / / en.en.wikipedia.wikipedia.org/ org/ wiki/ wiki/ Wrapper_libraryWrapper_library [7
[7]] hthttptp:/ :/ / / es.es.wikibooks.wikibooks. org/ org/ wiki/ wiki/ Programaci€n_en_CProgramaci€n_en_C [8
[8]] hthttptp:/ :/ / / es.es.wikibooks.wikibooks. org/ org/ wiki/ wiki/ Fundamentos_de_programaci€nFundamentos_de_programaci€n
Su primer programa en Vala
Su primer programa en Vala
Su primer programa en Vala
Su primer programa en Vala
Como no puede ser de otro modo el primer programa en Vala va a ser el conocido como "Hola Mundo" que es el Como no puede ser de otro modo el primer programa en Vala va a ser el conocido como "Hola Mundo" que es el programa m‚s simple (sin contar con el programa vac…o) que se puede escribir en un lenguaje de programaci€n. programa m‚s simple (sin contar con el programa vac…o) que se puede escribir en un lenguaje de programaci€n. El listado de c€digo ser…a algo como lo que sigue:
El listado de c€digo ser…a algo como lo que sigue:
class
class DemoDemo.HelloWorld : GLib.Object {.HelloWorld : GLib.Object {
public
public staticstatic intint mainmain((stringstring[] args) {[] args) {
stdout.printf(
stdout.printf("Hola, mundo!\n""Hola, mundo!\n"););
return return 00;; } } } }
A continuaci€n se explicar‚n algunas de las caracter…sticas que contiene el c€digo, para entenderlas es necesario A continuaci€n se explicar‚n algunas de las caracter…sticas que contiene el c€digo, para entenderlas es necesario conocer los fundamentos de la programaci€n orientada a objetos
conocer los fundamentos de la programaci€n orientada a objetos [1][1]. La primera l…nea que se ve es:. La primera l…nea que se ve es:
class
class DemoDemo.HelloWorld : GLib.Object {.HelloWorld : GLib.Object {
Esta l…nea de c€digo representa la
Esta l…nea de c€digo representa la definici€n de una nueva clasedefinici€n de una nueva clase [2][2]llamada HelloWorld. Se puede observar que antesllamada HelloWorld. Se puede observar que antes del nombre de la clase se encuentra la palabra "Demo" seguida de un punto. Bien, esto indica el espacio de nombres del nombre de la clase se encuentra la palabra "Demo" seguida de un punto. Bien, esto indica el espacio de nombres
[3]
[3]en el que se mueve el programa. Asien el que se mueve el programa. Asimismo, se puede observar que despu•s mismo, se puede observar que despu•s del nombre de la nueva clase le siguendel nombre de la nueva clase le siguen
dos puntos y la cadena "Glib.Object". Esta cadena va en el mismo formato que la anterior, es decir, "espacio de dos puntos y la cadena "Glib.Object". Esta cadena va en el mismo formato que la anterior, es decir, "espacio de nombres"."nombre de la clase" e indica una clase de la que hereda
nombres"."nombre de la clase" e indica una clase de la que hereda [4][4]la clase anterior. La mayor…a de las nuevasla clase anterior. La mayor…a de las nuevas clases heredar‚n de la clase "GLib.Object" que puede ser considerada como la clase b‚sica en el lenguaje Vala, ya clases heredar‚n de la clase "GLib.Object" que puede ser considerada como la clase b‚sica en el lenguaje Vala, ya que, una parte importante de las funcionalidades del lenguaje est‚n supeditadas a que la clase sobre las que se que, una parte importante de las funcionalidades del lenguaje est‚n supeditadas a que la clase sobre las que se aplican hereden de esta clase o de una clase descendiente de •sta. Como se ha podido ver la sintaxis de definici€n de aplican hereden de esta clase o de una clase descendiente de •sta. Como se ha podido ver la sintaxis de definici€n de una clase es bastante similar a otros lenguajes de programaci€n como C++, Java o C#.
una clase es bastante similar a otros lenguajes de programaci€n como C++, Java o C#.
Siguiendo con el mismo listado de c€digo tenemos que la siguiente l…nea de c€digo es la que sigue a continuaci€n: Siguiendo con el mismo listado de c€digo tenemos que la siguiente l…nea de c€digo es la que sigue a continuaci€n:
public
Esta l…nea de c€digo define un m•todo
Esta l…nea de c€digo define un m•todo [5][5]de la clase HelloWorld llamado "main". Este m•todo va precedido por lade la clase HelloWorld llamado "main". Este m•todo va precedido por la palabra reservada "public" que indica que se trata de un m•todo p†blico (es decir, puede ser llamado externamente a palabra reservada "public" que indica que se trata de un m•todo p†blico (es decir, puede ser llamado externamente a la clase a la que pertenece). La palabra reservada "static" nos indica que se trata de un m•todo est‚tico (est‚ asociado la clase a la que pertenece). La palabra reservada "static" nos indica que se trata de un m•todo est‚tico (est‚ asociado a la clase y no a un objeto en concreto, es decir, puede ser llamado sin instanciar ning†n objeto de esa clase). a la clase y no a un objeto en concreto, es decir, puede ser llamado sin instanciar ning†n objeto de esa clase). Adem‚s se indica que el tipo de datos que devuelve este m•todo es de tipo entero, lo que se hace mediante la palabra Adem‚s se indica que el tipo de datos que devuelve este m•todo es de tipo entero, lo que se hace mediante la palabra reservada "int". Por †ltimo, entre los par•ntesis se indican los par‚metros (los datos que utilizar‚ internamente el reservada "int". Por †ltimo, entre los par•ntesis se indican los par‚metros (los datos que utilizar‚ internamente el m•todo para trabajar). El par‚metro es una lista
m•todo para trabajar). El par‚metro es una lista [6][6] de cadenasde cadenas [7][7] que contendr‚ los par‚metros con los que fu•que contendr‚ los par‚metros con los que fu• llamado el programa desde la l…nea de comandos
llamado el programa desde la l…nea de comandos [8][8]. El hecho de que el m•todo definido se llame "main" no es. El hecho de que el m•todo definido se llame "main" no es casual, ya que, Vala considera a este m•todo concreto como el punto de entrada del programa, es decir, que una vez casual, ya que, Vala considera a este m•todo concreto como el punto de entrada del programa, es decir, que una vez compilado un programa escrito en Vala •ste ser‚ el primer m•todo en ser ejecutado. Este m•todo es el que contiene compilado un programa escrito en Vala •ste ser‚ el primer m•todo en ser ejecutado. Este m•todo es el que contiene la correspondientes inicializaciones que requiere el programa que estemos desarrollando, por ejemplo la la correspondientes inicializaciones que requiere el programa que estemos desarrollando, por ejemplo la inicializaci€n de la interfaz gr‚fica de usuario
inicializaci€n de la interfaz gr‚fica de usuario [9][9].. La siguiente l…nea de c€digo es la que sigue: La siguiente l…nea de c€digo es la que sigue:
stdout.printf(
stdout.printf("Hola, mundo!\n""Hola, mundo!\n"););
Esta l…nea de c€digo imprime por la salida est‚ndar (normalmente ser‚ la pantalla del ordenador) el mensaje Esta l…nea de c€digo imprime por la salida est‚ndar (normalmente ser‚ la pantalla del ordenador) el mensaje encerrado entre comillas. Es una llamada al m•todo "printf" del objeto "stdout". En el lenguaje de programaci€n encerrado entre comillas. Es una llamada al m•todo "printf" del objeto "stdout". En el lenguaje de programaci€n Vala existen una serie de objetos predefinidos a los cuales tenemos acceso por que se encuentran definidos dentro Vala existen una serie de objetos predefinidos a los cuales tenemos acceso por que se encuentran definidos dentro del espacio de nombres GLib que est‚ definido por defecto en cualquier programa Vala. El objeto "stdout" nos del espacio de nombres GLib que est‚ definido por defecto en cualquier programa Vala. El objeto "stdout" nos permite el acceso a la salida est‚ndar de la m‚quina y entre otros m•todos contiene el m•todo "printf" que muestra permite el acceso a la salida est‚ndar de la m‚quina y entre otros m•todos contiene el m•todo "printf" que muestra un mensaje formateado por dicha salida.
un mensaje formateado por dicha salida.
La †ltima l…nea importante del c€digo inicial es la siguiente: La †ltima l…nea importante del c€digo inicial es la siguiente:
return
return 00;;
Esta l…nea hace que el programa finalice y devuelva un valor de 0 al sistema. Este valor normalmente se usa para Esta l…nea hace que el programa finalice y devuelva un valor de 0 al sistema. Este valor normalmente se usa para indicar si un programa ha finalizado de forma correcta o no. Si estuviera definido en otro m•todo cualquiera (que no indicar si un programa ha finalizado de forma correcta o no. Si estuviera definido en otro m•todo cualquiera (que no fuera el punto de entrada del programa) devolver…a el valor y se almacenar…a en una variable. Por ejemplo:
fuera el punto de entrada del programa) devolver…a el valor y se almacenar…a en una variable. Por ejemplo:
int
int valor = objeto.metodo(); valor = objeto.metodo();
Las †ltimas l…neas del listado †nicamente cierran la definici€n de la clase y el m•todo definido como en cualquier Las †ltimas l…neas del listado †nicamente cierran la definici€n de la clase y el m•todo definido como en cualquier otro lenguaje como por ejemplo C++ o Java.
otro lenguaje como por ejemplo C++ o Java.
Compilado y ejecuci€n del programa
Compilado y ejecuci€n del programa
Una vez que se entiende el funcionamiento del programa, el siguiente paso es compilar dicho programa. Vala al ser Una vez que se entiende el funcionamiento del programa, el siguiente paso es compilar dicho programa. Vala al ser un lenguaje de programaci€n compilado
un lenguaje de programaci€n compilado [10][10] y por lo tanto necesita de un compiladory por lo tanto necesita de un compilador [11][11]. El lenguaje de. El lenguaje de programaci€n Vala dispone de un compilador llamado "valac" y que es compilador al mismo tiempo del lenguaje de programaci€n Vala dispone de un compilador llamado "valac" y que es compilador al mismo tiempo del lenguaje de programaci€n Genie
programaci€n Genie [12][12]..
Asumiendo que tenemos el compilador de Vala instalado en nuestra m‚quina, para compilar el primer programa Asumiendo que tenemos el compilador de Vala instalado en nuestra m‚quina, para compilar el primer programa "Hola mundo" suponiendo que est‚ escrito en un fichero llamado "hola.vala" ser…a:
"Hola mundo" suponiendo que est‚ escrito en un fichero llamado "hola.vala" ser…a:
valac hola.vala valac hola.vala
Esto generar…a un fichero
Esto generar…a un fichero ejecutable llamada "hola" (dependiendo del sistema operativo en el ejecutable llamada "hola" (dependiendo del sistema operativo en el que nos encontremos elque nos encontremos el fichero binario resultante tendr‚ o no una extensi€n como por ejemplo la ".exe" en Windows). Para ejecutar dicho fichero binario resultante tendr‚ o no una extensi€n como por ejemplo la ".exe" en Windows). Para ejecutar dicho programa habr‚ que escribir en la l…nea de comandos algo como:
programa habr‚ que escribir en la l…nea de comandos algo como:
./hola ./hola
Y nos mostrar‚ la salida: Y nos mostrar‚ la salida: Hola mundo!
Hola mundo!
Referencias
Referencias
[1
[1]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ Programaci€n_orientada_a_objetosProgramaci€n_orientada_a_objetos [2
[2]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ Clase_(inform‚tica)Clase_(inform‚tica) [3
[3]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ C%2B%2B#Espacios_de_nombresC%2B%2B#Espacios_de_nombres [4
[4]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ Herencia_(programaci€n_orientada_a_objetos)Herencia_(programaci€n_orientada_a_objetos) [5
[5]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ M•todo_(progM•todo_(programaci€n_orientadramaci€n_orientada_a_objetos)a_a_objetos) [6
[6]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ Lista_(estructura_de_datos)Lista_(estructura_de_datos) [7
[7]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ Cadena_(inform‚tica)Cadena_(inform‚tica) [8
[8]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ L…nea_de_comandosL…nea_de_comandos [9
[9]] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ Interfaz_gr‚fica_de_usuarioInterfaz_gr‚fica_de_usuario [1
[10]0] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ Lenguaje_compiladoLenguaje_compilado [1
[11]1] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ CompiladorCompilador [1
[12]2] hthttptp:/ :/ / / es.es.wikipedia.wikipedia.org/ org/ wiki/ wiki/ Genie_(lenguaje_de_programaci€n)Genie_(lenguaje_de_programaci€n)
Conceptos b„sicos del lenguaje
Conceptos b„sicos del lenguaje
Conceptos b„sicos del lenguaje
Conceptos b„sicos del lenguaje
Archivos de c€digo y compilaci€n
Archivos de c€digo y compilaci€n
Los archivos de c€digo fuente de vala tienen, normalmente, la extensi€n ".vala". El lenguaje de programaci€n Vala Los archivos de c€digo fuente de vala tienen, normalmente, la extensi€n ".vala". El lenguaje de programaci€n Vala no fuerza a que los proyectos tengan una determinada estructura, en cuanto a los paquetes o los nombres de los no fuerza a que los proyectos tengan una determinada estructura, en cuanto a los paquetes o los nombres de los archivos que contiene una clase, como hacen otros lenguajes como Java. En lugar de eso la estructura se define archivos que contiene una clase, como hacen otros lenguajes como Java. En lugar de eso la estructura se define dentro de los archivos de c€digo mediante texto, definiendo la localizaci€n y estructura l€gica mediante elementos dentro de los archivos de c€digo mediante texto, definiendo la localizaci€n y estructura l€gica mediante elementos como los espacios de nombres. Cuando se quiere compilar c€digo Vala, se le pasa al compilador una lista de los como los espacios de nombres. Cuando se quiere compilar c€digo Vala, se le pasa al compilador una lista de los archivos de c€digo fuente necesarios, y el compilador determina como ensamblarlos todos juntos.
archivos de c€digo fuente necesarios, y el compilador determina como ensamblarlos todos juntos.
La ventaja de todo esto es que se pueden definir tantas clases o funciones como se desee dentro de un †nico archivo La ventaja de todo esto es que se pueden definir tantas clases o funciones como se desee dentro de un †nico archivo de c€digo, incluso combinando distintos espacios de nombres todos dentro del mismo archivo (aunque no se de c€digo, incluso combinando distintos espacios de nombres todos dentro del mismo archivo (aunque no se demasiado recomendable por cuestiones de legibilidad y estructura). Vala por lo tanto no exige de manera inherente demasiado recomendable por cuestiones de legibilidad y estructura). Vala por lo tanto no exige de manera inherente una determinada estructura para los proyectos que se desarrollan usando esta plataforma. Sin embargo, si existen una determinada estructura para los proyectos que se desarrollan usando esta plataforma. Sin embargo, si existen ciertas convenciones a la hora de estructurar un proyecto desarrollado en Vala. Un buen ejemplo ser…a como se ciertas convenciones a la hora de estructurar un proyecto desarrollado en Vala. Un buen ejemplo ser…a como se estructura el propio proyecto del compilador de Vala.
estructura el propio proyecto del compilador de Vala.
Todos los archivos de c€digo que pertenezcan al mismo proyecto son suministrados al compilador "valac" mediante Todos los archivos de c€digo que pertenezcan al mismo proyecto son suministrados al compilador "valac" mediante la l…nea de comandos, junto con los correspondientes par‚metros de compilaci€n. Esto funciona de forma similar a la l…nea de comandos, junto con los correspondientes par‚metros de compilaci€n. Esto funciona de forma similar a como se har…a con el c€digo fuente compilado en Java. Por ejemplo:
como se har…a con el c€digo fuente compilado en Java. Por ejemplo:
$ valac
$ valac compiler.vacompiler.vala --pkg libvalala --pkg libvala
Esa l…nea de c€digo producir…a un archivo binario llamado "compiler" que ser…a enlazado
Esa l…nea de c€digo producir…a un archivo binario llamado "compiler" que ser…a enlazado [1][1]con el paquete "libvala"con el paquete "libvala" (cuando nos referimos a paquete lo estamos haciendo a un concepto similar a biblioteca de funciones o la mal (cuando nos referimos a paquete lo estamos haciendo a un concepto similar a biblioteca de funciones o la mal traducida librer…a). De hecho, as… es como se genera el compilador de Vala en realidad.
traducida librer…a). De hecho, as… es como se genera el compilador de Vala en realidad.
Si se quiere que el archivo ejecutable producido tenga un nombre espec…fico (distinto al que el compilador le da) o si Si se quiere que el archivo ejecutable producido tenga un nombre espec…fico (distinto al que el compilador le da) o si se le pasan varios archivos al compilador, es posible especificar el nombre del fichero ejecutable mediante la opci€n se le pasan varios archivos al compilador, es posible especificar el nombre del fichero ejecutable mediante la opci€n "-o":
$ valac
$ valac source1.valsource1.vala source2.vala -o myprograma source2.vala -o myprogram $ ./myprogram
$ ./myprogram
Como se ha comentado anteriormente el compilador de vala es capaz de generar c€digo en lenguaje C en lugar de un Como se ha comentado anteriormente el compilador de vala es capaz de generar c€digo en lenguaje C en lugar de un archivo ejecutable. As… para realizar esto existe la opci€n "-C" que indicar‚ al compilador que genere todo el c€digo archivo ejecutable. As… para realizar esto existe la opci€n "-C" que indicar‚ al compilador que genere todo el c€digo C necesario para crear el ejecutable del proyecto. El compilador crear‚ un archivo con extensi€n ".c" por cada C necesario para crear el ejecutable del proyecto. El compilador crear‚ un archivo con extensi€n ".c" por cada archivo con extensi€n ".vala" que le pasemos. Si abrimos el contenido de esos archivos generados se puede ver el archivo con extensi€n ".vala" que le pasemos. Si abrimos el contenido de esos archivos generados se puede ver el c€digo C equivalente al programa que hemos desarrollado en Vala. Se puede observar como se crean las mismas c€digo C equivalente al programa que hemos desarrollado en Vala. Se puede observar como se crean las mismas clases que en Vala pero mediante la biblioteca GObject y c€mo se registran de forma din‚mica en el sistema. Este es clases que en Vala pero mediante la biblioteca GObject y c€mo se registran de forma din‚mica en el sistema. Este es un ejemplo del poder que tiene la plataforma de desarrollo de GNOME. Sin embargo, todo esto es a t…tulo un ejemplo del poder que tiene la plataforma de desarrollo de GNOME. Sin embargo, todo esto es a t…tulo informativo, ya que, por suerte no es necesario generar todos estos ficheros, ni entender como funcionan informativo, ya que, por suerte no es necesario generar todos estos ficheros, ni entender como funcionan internamente para poder programar en Vala. Si en lugar de generar el fichero de c€digo C s€lo necesitamos generar internamente para poder programar en Vala. Si en lugar de generar el fichero de c€digo C s€lo necesitamos generar la cabecera (por ejemplo si estamos generando una biblioteca de funciones
la cabecera (por ejemplo si estamos generando una biblioteca de funciones ser‚ necesario para poder usarla en C o enser‚ necesario para poder usarla en C o en otro lenguaje) existe la opci€n "-H" con la que conseguiremos ese objetivo. A continuaci€n un ejemplo que genera otro lenguaje) existe la opci€n "-H" con la que conseguiremos ese objetivo. A continuaci€n un ejemplo que genera los dos ficheros (un fichero de c€digo C y su correspondiente cabecera ".h"):
los dos ficheros (un fichero de c€digo C y su correspondiente cabecera ".h"):
$ valac hello.vala -C -H
$ valac hello.vala -C -H hello.hhello.h
Visi€n general de la sintaxis
Visi€n general de la sintaxis
La sintaxis de Vala est‚ fuertemente inspirada en la sintaxis del lenguaje de programaci€n C#, por lo que la mayor…a La sintaxis de Vala est‚ fuertemente inspirada en la sintaxis del lenguaje de programaci€n C#, por lo que la mayor…a de lo explicado aqu… ser‚ muy
de lo explicado aqu… ser‚ muy familiar para los programadores de C# familiar para los programadores de C# e incluso para los que se incluso para los que sepan alg†n lenguaje conepan alg†n lenguaje con un sintaxis similar a C. Independientemente de eso se intentar‚ dar explicaciones breves de los conceptos que se un sintaxis similar a C. Independientemente de eso se intentar‚ dar explicaciones breves de los conceptos que se estimen oportunos, aunque no en demasiada profundidad por que no es el cometido del presente documento.
estimen oportunos, aunque no en demasiada profundidad por que no es el cometido del presente documento. Al igual que en otros lenguaje de programaci€n, en Vala existe el concepto de visibilidad o ‚mbito
Al igual que en otros lenguaje de programaci€n, en Vala existe el concepto de visibilidad o ‚mbito [2][2] de lasde las variables. Un objeto o referencia †nicamente es v‚lida dentro del ‚mbito definido mediante corchetes ({}) d€nde se variables. Un objeto o referencia †nicamente es v‚lida dentro del ‚mbito definido mediante corchetes ({}) d€nde se defini€ dicho objeto. Estos delimitadores son los mismos que se usan para delimitar las definiciones de las clases, los defini€ dicho objeto. Estos delimitadores son los mismos que se usan para delimitar las definiciones de las clases, los m•todos, los bloques de c€digos, etc; por lo que todos estos conceptos tienen su propio ‚mbito. Por ejemplo:
m•todos, los bloques de c€digos, etc; por lo que todos estos conceptos tienen su propio ‚mbito. Por ejemplo:
int
int funcion1funcion1 ( (void void ) {) { int
int a= a=00;; }
} int
int funcion2funcion2 ( (void void ) {) { int
int a= a=11;;
stdout.printf(
stdout.printf("%d\n""%d\n", a);, a); }
}
El c€digo anterior define dos funciones que tiene sendas variables "a" definidas con distintos valores. La funci€n El c€digo anterior define dos funciones que tiene sendas variables "a" definidas con distintos valores. La funci€n "funcion2" mostrar‚ el valor de "a", el c†al ser‚ de 1 ya que la variable que se encuentra definida en el ‚mbito de la "funcion2" mostrar‚ el valor de "a", el c†al ser‚ de 1 ya que la variable que se encuentra definida en el ‚mbito de la funci€n "funcion2" vale 1.
funci€n "funcion2" vale 1.
El lenguaje Vala, a diferencia de otros, no es estricto en la localizaci€n de la definici€n de variables. As… no existe El lenguaje Vala, a diferencia de otros, no es estricto en la localizaci€n de la definici€n de variables. As… no existe una localizaci€n fija para este prop€sito, si bien es cierto que se aconseja por temas de legibilidad y estructura una localizaci€n fija para este prop€sito, si bien es cierto que se aconseja por temas de legibilidad y estructura definirlas al inicio del ‚mbito en el que van a ser usadas.
definirlas al inicio del ‚mbito en el que van a ser usadas.
Una variable se define mediante un tipo y un nombre despu•s del tipo. Es decir si queremos definir un entero de Una variable se define mediante un tipo y un nombre despu•s del tipo. Es decir si queremos definir un entero de nombre edad ser…a algo as…:
nombre edad ser…a algo as…:
int
int edad; edad;
En caso de que el tipo fuera una clase (en lugar de un tipo de datos b‚sico) se crea una instancia de una clase. Si se En caso de que el tipo fuera una clase (en lugar de un tipo de datos b‚sico) se crea una instancia de una clase. Si se crea una referencia que no se inicia esta no apunta a ning†n objeto. El concepto de referencia aqu… es el mismo que crea una referencia que no se inicia esta no apunta a ning†n objeto. El concepto de referencia aqu… es el mismo que
en el lenguaje de programaci€n Java, es
en el lenguaje de programaci€n Java, es decir, un punterodecir, un puntero [3][3]que apunta a un objeto. As… para que apunta a un objeto. As… para definir un nuevo objetodefinir un nuevo objeto de una clase se usar‚ el operador new:
de una clase se usar‚ el operador new:
// Referencia no inicializada
// Referencia no inicializada
Clase
Clase objeto;objeto;
// Referencia inicializada que apunta al nuevo objeto
// Referencia inicializada que apunta al nuevo objeto
Clase
Clase objeto objeto == newnew Clase(); Clase();
Comentarios
Comentarios
Los comentarios se definen mediante los mismos s…mbolos que en C#, es decir, "//" para los comentarios de 1 l…nea y Los comentarios se definen mediante los mismos s…mbolos que en C#, es decir, "//" para los comentarios de 1 l…nea y "/**/" para los comentarios de m‚s l…neas. As… tenemos:
"/**/" para los comentarios de m‚s l…neas. As… tenemos:
// Comentario de una l€nea
// Comentario de una l€nea
/*
/*
Comentario
Comentario escrito escrito enen
m•s
m•s de de una una l€neal€nea
*/
*/
/*
/*
*
* Comentario Comentario especial especial para para sistema sistema de de documentaci‚documentaci‚nn
*
* autom•tica.autom•tica.
*/
*/
En relaci€n al †ltimo tipo de comentarios, el lenguaje de programaci€n Vala dispone de un sistema generador de En relaci€n al †ltimo tipo de comentarios, el lenguaje de programaci€n Vala dispone de un sistema generador de documentaci€n autom‚tica
documentaci€n autom‚tica [4][4]propio cuyo nombre es Valadocpropio cuyo nombre es Valadoc [5][5]..
Tipos de datos
Tipos de datos
Hablando en general podemos separar los tipos de datos en Vala en dos grandes subgrupos, los tipos de referencia y Hablando en general podemos separar los tipos de datos en Vala en dos grandes subgrupos, los tipos de referencia y los de valor. As… estos nombres nos indican la forma en la que estos valores son pasados en el sistema. De esta forma los de valor. As… estos nombres nos indican la forma en la que estos valores son pasados en el sistema. De esta forma un tipo de valor es copiado en todos los lugares en los que es asignado a otro identificador (otra variable), mientras un tipo de valor es copiado en todos los lugares en los que es asignado a otro identificador (otra variable), mientras que un valor de referencia se copia la referencia pero apunta al mismo objeto.
que un valor de referencia se copia la referencia pero apunta al mismo objeto.
Constantes
Constantes
Las constantes no son propiamente un tipo de dato ya que una constante define un valor de cualquier tipo de dato que Las constantes no son propiamente un tipo de dato ya que una constante define un valor de cualquier tipo de dato que no se modifica durante la ejecuci€n del programa. As… una constante se define mediante la palabra reservada "const" no se modifica durante la ejecuci€n del programa. As… una constante se define mediante la palabra reservada "const" seguida del tipo de constante que se define. As… una constante de tipo real se definir…a mediante:
seguida del tipo de constante que se define. As… una constante de tipo real se definir…a mediante:
const
Tipos b„sicos
Tipos b„sicos
Vala dispone de un conjunto amplio de datos b‚sicos entre los que se encuentran los siguientes: Vala dispone de un conjunto amplio de datos b‚sicos entre los que se encuentran los siguientes:
‡‡‡‡ Byte (chByte (char, uchaar, uchar): Es un valor qur): Es un valor que ocupa el m…e ocupa el m…nimo posinimo posible en memoble en memoria (1 byteria (1 byte) y que se utiliz) y que se utiliza para almaa para almacenarcenar 1 car‚cter o valores enteros de 0 a 255.
1 car‚cter o valores enteros de 0 a 255.
‡‡ CharaCharacter cter (unich(unichar): Ear): Es un s un car‚ccar‚cter dter de tipe tipo unio unicodecode [6][6]por lo que ocupar‚ en memoria 2 bytes.por lo que ocupar‚ en memoria 2 bytes.
‡‡‡‡ IntegeInteger (int, uintr (int, uint): Entero): Enteros positivos positivos que van desds que van desde 0 a 65536 (o desde 0 a 65536 (o desde -32768 a 32e -32768 a 32767 si es con sign767 si es con signo), ocupo), ocupa 2a 2 bytes en memoria.
bytes en memoria.
‡‡‡‡ Long InteLong Integer (longger (long, ulong), ulong): Es un entero lar: Es un entero largo que ocugo que ocupa 4 bytes en mempa 4 bytes en memoria y que puoria y que puede reprede representaesentar desde 0 ar desde 0 a 4294967296.
4294967296.
‡‡‡‡ Short InteShort Integer (shortger (short, ushort), ushort): Es un entero que o: Es un entero que ocupa 2 bytecupa 2 bytes en memoria y qus en memoria y que funcioe funciona como un Intna como un Integer.eger.
‡‡‡‡ EnteroEnteros de tama„o fijo garas de tama„o fijo garantizantizado: Estos tipos gardo: Estos tipos garantizantizan que indepan que independienendientementtemente de la platafore de la plataforma de ejecucma de ejecuci€ni€n del programa el entero ocupa el mismo tama„o en memoria y tiene por lo tanto los mismos l…mites. Estos tipos de del programa el entero ocupa el mismo tama„o en memoria y tiene por lo tanto los mismos l…mites. Estos tipos de datos son: int8, int16, int32 e int64 (para los enteros con signo) y uint8, uint16, uint32 y uint64 (para los enteros datos son: int8, int16, int32 e int64 (para los enteros con signo) y uint8, uint16, uint32 y uint64 (para los enteros sin signo).
sin signo).
‡‡‡‡ N†meroN†meros de coma flots de coma flotante: Haante: Hay dos tipos de daty dos tipos de datos de coma floos de coma flotantetante, float y doub, float y double. Los n†mele. Los n†meros float ocros float ocupan enupan en memoria 4 bytes y los double 8 bytes. La principal diferencia es la precisi€n del n†mero. Un n†mero double memoria 4 bytes y los double 8 bytes. La principal diferencia es la precisi€n del n†mero. Un n†mero double permite representar n†meros con m‚s precisi€n que un float.
permite representar n†meros con m‚s precisi€n que un float.
‡‡‡‡ BooleBoolean (bool)an (bool): Tipo de dato bo: Tipo de dato booleanoleano con dos valoo con dos valores posibres posibles ciertles cierto (true) y falso (true) y falso (false)o (false)..
‡‡‡‡ Datos compDatos compuestos (struuestos (struct): Permict): Permite definite definir datos compur datos compuestos mediestos mediante la palaante la palabra reservbra reservada strucada struct. Ejemplot. Ejemplo: struct: struct persona { int edad, String nombre };
persona { int edad, String nombre };
‡‡‡‡ EnumerEnumeracionaciones (enum): Cones (enum): Conjunto de valjunto de valores enterores enteros enumeros enumerados, es deciados, es decir, salvo que no se indiqur, salvo que no se indique otra cosa see otra cosa se incrementan los valores.
incrementan los valores.
Normalmente los valores que se especifican ocupan lo establecida en la lista, sin embargo s€lo se garantiza para los Normalmente los valores que se especifican ocupan lo establecida en la lista, sin embargo s€lo se garantiza para los enteros de tama„o fijo garantizado. Para determinar el tama„o en memoria de una variable se usa la palabra enteros de tama„o fijo garantizado. Para determinar el tama„o en memoria de una variable se usa la palabra reservada "sizeof". Se puede ver el valor m‚ximo y m…nimo que pueden tener un tipo de dato se usan los valores reservada "sizeof". Se puede ver el valor m‚ximo y m…nimo que pueden tener un tipo de dato se usan los valores MIN y MAX definidos. Por ejemplo int.MIN y int.MAX.
MIN y MAX definidos. Por ejemplo int.MIN y int.MAX.
Cadenas
Cadenas
Las cadenas de texto en Vala se definen mediante la palabra reservada string. Estas cadenas son de tipo UTF-8, es Las cadenas de texto en Vala se definen mediante la palabra reservada string. Estas cadenas son de tipo UTF-8, es decir, son cadenas de texto unicode que pueden representar cualquier texto.
decir, son cadenas de texto unicode que pueden representar cualquier texto.
string
string a = a = "Hola""Hola";;
Adem‚s de este tipo de cadenas existen las cadenas literales, es decir, que no se interpretan los caracteres de escape Adem‚s de este tipo de cadenas existen las cadenas literales, es decir, que no se interpretan los caracteres de escape como "\n". Estas cadenas se definen mediante una triple comillas. Cualquier car‚cter que se encuentre entre el par de como "\n". Estas cadenas se definen mediante una triple comillas. Cualquier car‚cter que se encuentre entre el par de tres comillas se inserta dentro de la cadena literal, por ejemplo un tabulador. Ejemplo:
tres comillas se inserta dentro de la cadena literal, por ejemplo un tabulador. Ejemplo:
string
string literal = literal = """Esto es una cadena """"Esto es una cadena "literalliteral" y puede contener" y puede contener
cualquier car€cter.\n\tTexto tabulado.\n cualquier car€cter.\n\tTexto tabulado.\n """;""";
Las cadenas que empiezan mediante una @ son plantillas. Estas plantillas pueden eval†an variables y/o expresiones Las cadenas que empiezan mediante una @ son plantillas. Estas plantillas pueden eval†an variables y/o expresiones que est‚n definidas mediante $. Por ejemplo:
que est‚n definidas mediante $. Por ejemplo:
string
string plantilla = plantilla = @"$a * $b = $(a*b)"@"$a * $b = $(a*b)";; // Devolver• una cadena como// Devolver• una cadena como
"6 * 7 = 42"
"6 * 7 = 42"
Los operadores == y != se utilizan en las cadenas y su comportamiento es distinto a otros lenguajes. As… en Vala los Los operadores == y != se utilizan en las cadenas y su comportamiento es distinto a otros lenguajes. As… en Vala los operadores == y != compara el contenido de las cadenas y no la referencias de las mismas. Por ejemplo en Java: operadores == y != compara el contenido de las cadenas y no la referencias de las mismas. Por ejemplo en Java: C€digo Java
String
String aa == "hola""hola";;
String
String bb == "hola""hola";;
if if ((aa ==== b b)) {{ } } elseelse {{ } } C€digo Vala C€digo Vala string
string a = a = "hola""hola";; string
string b = b = "hola""hola";; if if (a == b) { (a == b) { } } elseelse { { } }
El c€digo Java indicar‚ que las variables apuntes a dos objetos distintos (dos referencias distintas) mientras que en El c€digo Java indicar‚ que las variables apuntes a dos objetos distintos (dos referencias distintas) mientras que en Vala si se devolver‚ el valor de cierto ya que ambas cadenas son iguales, aunque se encuentren almacenadas en dos Vala si se devolver‚ el valor de cierto ya que ambas cadenas son iguales, aunque se encuentren almacenadas en dos variables distintas.
variables distintas.
Al igual que en otros lenguajes de programaci€n como Python, las cadenas se pueden partir en partes mediante los Al igual que en otros lenguajes de programaci€n como Python, las cadenas se pueden partir en partes mediante los operadores [inicio:fin]. As… si queremos seleccionar desde el car‚cter 5 hasta el 9 podemos hacer lo siguiente:
operadores [inicio:fin]. As… si queremos seleccionar desde el car‚cter 5 hasta el 9 podemos hacer lo siguiente:
string
string a = a = "hola mundo""hola mundo";; string
string b = a[ b = a[55::99];];
Se puede acceder a un determinado car‚cter mediante los corchetes indicando el …ndice del car‚cter, teniendo en Se puede acceder a un determinado car‚cter mediante los corchetes indicando el …ndice del car‚cter, teniendo en cuenta que los vectores en Vala empiezan en el …ndice 0.
cuenta que los vectores en Vala empiezan en el …ndice 0.
string
string a = a = "hola mundo""hola mundo";; unichar
unichar c c = = a[a[00];];
Sin embargo esta forma de acceso a las cadenas es de s€lo lectura, es decir, no se puedes escribir un car‚cter (o una Sin embargo esta forma de acceso a las cadenas es de s€lo lectura, es decir, no se puedes escribir un car‚cter (o una cadena) indicando la posici€n en la que debe ser insertado. Por ejemplo el siguiente c€digo es inv‚lido:
cadena) indicando la posici€n en la que debe ser insertado. Por ejemplo el siguiente c€digo es inv‚lido: C€digo INVALIDO en Vala
C€digo INVALIDO en Vala
string
string a = a = "hola mundo""hola mundo";; a[
a[00] =] = "a""a";;
Existen, asimismo, diversos m•todos para poder realizar conversiones entre cadenas y otros tipos de datos b‚sicos y Existen, asimismo, diversos m•todos para poder realizar conversiones entre cadenas y otros tipos de datos b‚sicos y viceversa. A continuaci€n se presentan algunos ejemplos:
viceversa. A continuaci€n se presentan algunos ejemplos: Ejemplos de conversiones entre cadenas y
Ejemplos de conversiones entre cadenas y otros datos b„sicos y viceversaotros datos b„sicos y viceversa
bool
bool b = b = "false""false".to_bool();.to_bool(); // => false// => false
int
int i = i = "-52""-52".to_int();.to_int(); // => -52// => -52
double
double d = d = "6.67428E-11""6.67428E-11".to_double();.to_double(); // => // => 6.67428E-116.67428E-11
string
string s1 = s1 = truetrue.to_string();.to_string(); // => "true"// => "true"
string
string s2 = s2 = 21.21.to_string();to_string(); // => "21"// => "21"
string
Vectores
Vectores
Los vectores se declaran en Vala mediante el tipo de vector (el tipo de dato) seguido de "[]" y un nombre al final. Los vectores se declaran en Vala mediante el tipo de vector (el tipo de dato) seguido de "[]" y un nombre al final. Antes de usar el vector adem‚s de declararlo lo debemos inicializar indicando el tama„o del mismo o en su caso los Antes de usar el vector adem‚s de declararlo lo debemos inicializar indicando el tama„o del mismo o en su caso los valores que lo componen. Por ejemplo si queremos declarar un vector de 100 n†meros enteros llamado valores que lo componen. Por ejemplo si queremos declarar un vector de 100 n†meros enteros llamado "lista_primos" ser…a algo as…:
"lista_primos" ser…a algo as…:
int
int[] lista_primos =[] lista_primos = newnew intint[[100100];];
// Para saber el tamaƒo de un vector se usa la propiedad "length"
// Para saber el tamaƒo de un vector se usa la propiedad "length"
stdout.printf(
stdout.printf("%d\n""%d\n", lista_primos.length);, lista_primos.length);
Al igual que con las cadenas, los vectores tambi•n pueden ser divididos en varias partes usando los operadores "[]". Al igual que con las cadenas, los vectores tambi•n pueden ser divididos en varias partes usando los operadores "[]". As… teniendo definido un vector de enteros tal que "{ 2, 4, 6, 8 }" podemos trocearlo de la siguiente forma:
As… teniendo definido un vector de enteros tal que "{ 2, 4, 6, 8 }" podemos trocearlo de la siguiente forma:
int
int[] lista = {[] lista = { 22,, 44,, 66,, 88 }; }; int
int[] c = lista[[] c = lista[ 11::33];]; // => { 4, 6 }// => { 4, 6 }
El nuevo vector es un vector completamente independiente del original y los cambios realizados sobre el segundo no El nuevo vector es un vector completamente independiente del original y los cambios realizados sobre el segundo no afectan al primero.
afectan al primero.
Adem‚s de vectores se pueden definir matrices multidimensionales posicionando una coma (o m‚s dependiendo del Adem‚s de vectores se pueden definir matrices multidimensionales posicionando una coma (o m‚s dependiendo del n†mero de dimensiones que se quiera) dentro de los corchetes. As… por ejemplo para definir una matriz n†mero de dimensiones que se quiera) dentro de los corchetes. As… por ejemplo para definir una matriz bidimensional vac…a de 3x3 se realizar…a de la siguiente forma:
bidimensional vac…a de 3x3 se realizar…a de la siguiente forma:
int
int[,] c =[,] c = newnew intint[[33,,33];];
// Si se quiere una matriz con los valores s‚lo tenemos que
// Si se quiere una matriz con los valores s‚lo tenemos que
indicarlos despu•s del = indicarlos despu•s del =
int int[,] d = {{[,] d = {{22,, 44,, 66},}, { {33,, 55,, 77},}, { {11,, 33,, 55}};}};
Este tipo de matrices se representa internamente en memoria como un bloque contiguo. Los vectores de vectores Este tipo de matrices se representa internamente en memoria como un bloque contiguo. Los vectores de vectores "[][]" en los cuales cada fila tiene un tama„o distinto no est‚n soportados a†n.
"[][]" en los cuales cada fila tiene un tama„o distinto no est‚n soportados a†n.
Se pueden a„adir elementos al vector mediante el uso del operado "+=". Sin embargo, esto s€lo funciona para Se pueden a„adir elementos al vector mediante el uso del operado "+=". Sin embargo, esto s€lo funciona para vectores definidos como locales o privados. El vector ser‚ redimensionado en caso de ser necesario. En caso de que vectores definidos como locales o privados. El vector ser‚ redimensionado en caso de ser necesario. En caso de que esto pase, internamente se incrementa en potencias de 2 por temas de eficiencia y velocidad. Sin embargo la esto pase, internamente se incrementa en potencias de 2 por temas de eficiencia y velocidad. Sin embargo la propiedad ".length" indicar‚ el n†mero actual de elementos y no el valor interno. Por ejemplo:
propiedad ".length" indicar‚ el n†mero actual de elementos y no el valor interno. Por ejemplo:
int
int[] e = {}[] e = {} e
e +=+= 1212;; // Ahora e tiene un tamaƒo interno de 2 (Aunque la propiedad // Ahora e tiene un tamaƒo interno de 2 (Aunque la propiedad
length vale length vale 11))
e
e +=+= 55;; // Ahora e tiene un tamaƒo interno de 2 (La propiedad length// Ahora e tiene un tamaƒo interno de 2 (La propiedad length
vale vale 22))
e
e +=+= 3737;; // Se aƒade otro elemento y se vuelve a redimensionar// Se aƒade otro elemento y se vuelve a redimensionar
internamente. Ahora su tama‚o interno sera de
internamente. Ahora su tama‚o interno sera de 44 elementos (La propiedad elementos (La propiedad length valdr€
length valdr€ 33))
Si despu•s de los par•ntesis despu•s del identificador junto con un tama„o se obtendr‚ un vector de tama„o fijo. Este Si despu•s de los par•ntesis despu•s del identificador junto con un tama„o se obtendr‚ un vector de tama„o fijo. Este tipo de vectores se aloja en memoria en la pila
tipo de vectores se aloja en memoria en la pila [7][7]o mediante "in-line allocated" (si se o mediante "in-line allocated" (si se usa como variable de una claseusa como variable de una clase y no puede ser redimensionado despu•s. Ejemplo:
int
int e[ e[1010];]; // No necesita new. No se le pueden aƒadir m•s elementos.// No necesita new. No se le pueden aƒadir m•s elementos.
Vala no realiza comprobaciones de l…mites en el acceso a los vectores en tiempo de ejecuci€n. Si se necesita m‚s Vala no realiza comprobaciones de l…mites en el acceso a los vectores en tiempo de ejecuci€n. Si se necesita m‚s seguridad sobre esta tem‚tica se recomienda el uso de estructuras de datos m‚s sofisticadas como por ejemplo los seguridad sobre esta tem‚tica se recomienda el uso de estructuras de datos m‚s sofisticadas como por ejemplo los "ArrayList". M‚s adelante se tratar‚n m‚s en profundidad esta familia de estructuras de datos (colecciones, lista, etc). "ArrayList". M‚s adelante se tratar‚n m‚s en profundidad esta familia de estructuras de datos (colecciones, lista, etc). As… por ejemplo en el siguiente ejemplo se accede a una posici€n inexistente del vector; en lugar de mostrarnos un As… por ejemplo en el siguiente ejemplo se accede a una posici€n inexistente del vector; en lugar de mostrarnos un error mostrar‚ el contenido de una posici€n de memoria externa al vector y de contenido indeterminado (basura): error mostrar‚ el contenido de una posici€n de memoria externa al vector y de contenido indeterminado (basura):
int
int[] vector =[] vector = newnew intint[[1010];]; stdout.printf(
stdout.printf("%d\n""%d\n", vector[, vector[300300]);]); // Puede mostrar // Puede mostrar cualquier valor,cualquier valor,
pero no mostrar€ errores pero no mostrar€ errores
Referencias
Referencias
El tipo de dato conocido como referencia
El tipo de dato conocido como referencia [8][8]es un tipo de dato que contiene un valor que permite el acceso indirectoes un tipo de dato que contiene un valor que permite el acceso indirecto al contenido de una variable. El termino referencia es muy similar al termino puntero que se usa en otros lenguajes al contenido de una variable. El termino referencia es muy similar al termino puntero que se usa en otros lenguajes de programaci€n como C, sin embargo en este caso una referencia normalmente se usar‚ para los objetos creados, de programaci€n como C, sin embargo en este caso una referencia normalmente se usar‚ para los objetos creados, mientras que un puntero puede ser de cualquier tipo de variable (entero, coma flotante, cadena, etc). As… cada vez mientras que un puntero puede ser de cualquier tipo de variable (entero, coma flotante, cadena, etc). As… cada vez que dentro de un programa escrito en Vala pasemos un objeto a una funci€n o m•todo de otra clase, en realidad que dentro de un programa escrito en Vala pasemos un objeto a una funci€n o m•todo de otra clase, en realidad estar…amos pasando una referencia. El sistema es capaz de tener un registro de cuantas referencias siguen en uso, con estar…amos pasando una referencia. El sistema es capaz de tener un registro de cuantas referencias siguen en uso, con el fin de que pueda realizar la gesti€n de memoria por nosotros. Entre otras cosas el sistema de gesti€n de memoria el fin de que pueda realizar la gesti€n de memoria por nosotros. Entre otras cosas el sistema de gesti€n de memoria de Vala se encarga de liberar la memoria que ocupa un objeto cuando todas las referencias que apuntan a •l hayan de Vala se encarga de liberar la memoria que ocupa un objeto cuando todas las referencias que apuntan a •l hayan dejado de usarse. El valor de una referencia que no apunte a ninguna parte ser‚
dejado de usarse. El valor de una referencia que no apunte a ninguna parte ser‚ nullnull. M‚s informaci€n acerca de las. M‚s informaci€n acerca de las
referencias en el cap…tulo de Programaci€n orientada a objetos en Vala referencias en el cap…tulo de Programaci€n orientada a objetos en Vala [9][9]..
Conversi€n est„tica de tipos
Conversi€n est„tica de tipos
Cuando nos encontramos desarrollando un programa en cualquier lenguaje de programaci€n fuertemente tipado Cuando nos encontramos desarrollando un programa en cualquier lenguaje de programaci€n fuertemente tipado [10][10],, normalmente nos encontramos ante el problema de pasar de un tipo de datos a otro con bastante frecuencia. En una normalmente nos encontramos ante el problema de pasar de un tipo de datos a otro con bastante frecuencia. En una conversi€n de datos est‚tica el compilador sabe cuales son los tipos de datos origen y destino antes de ejecutar el conversi€n de datos est‚tica el compilador sabe cuales son los tipos de datos origen y destino antes de ejecutar el programa compilado. As… en Vala se puede realizar este tipo de conversi€n de datos estableciendo el tipo de datos programa compilado. As… en Vala se puede realizar este tipo de conversi€n de datos estableciendo el tipo de datos entre par•ntesis despu•s de una igualdad. En una conversi€n est‚tica de datos no se establece ning†n tipo de entre par•ntesis despu•s de una igualdad. En una conversi€n est‚tica de datos no se establece ning†n tipo de comprobaci€n de seguridad. Este tipo de conversiones son v‚lidas para todos los tipos de datos en Vala. Por comprobaci€n de seguridad. Este tipo de conversiones son v‚lidas para todos los tipos de datos en Vala. Por ejemplo:
ejemplo:
int
int i = i = 1010;; float
float j = ( j = (floatfloat) i;) i;
Conversi€n din„mica de tipos
Conversi€n din„mica de tipos (Inferencia)
(Inferencia)
Existe otro tipo de conversi€n de tipos de datos conocida como conversi€n din‚mica o inferencia de tipos
Existe otro tipo de conversi€n de tipos de datos conocida como conversi€n din‚mica o inferencia de tipos [11][11]que seque se usa sobre todo en lenguajes de programaci€n funcionales
usa sobre todo en lenguajes de programaci€n funcionales [12][12]. As… dado que Vala permite definir variables sin tipo. As… dado que Vala permite definir variables sin tipo inicial usando para ello la palabra reservada
inicial usando para ello la palabra reservada varvar, es necesario que se pueda establecer el tipo de una variable con, es necesario que se pueda establecer el tipo de una variable con posterioridad a su definici€n, es decir, inferir ese tipo a partir de una expresi€n que se encuentra a la derecha de una posterioridad a su definici€n, es decir, inferir ese tipo a partir de una expresi€n que se encuentra a la derecha de una igualdad. Por ejemplo el siguiente c€digo ser…a legal en Vala:
igualdad. Por ejemplo el siguiente c€digo ser…a legal en Vala:
var
var p p == newnew Person(); Person(); // es lo mismo que: Person p = // es lo mismo que: Person p = new Person();new Person();
var
var s s == "hello""hello";; // es lo mismo que: string s = // es lo mismo que: string s = "hello";"hello";
var
var l l == newnew List< List<intint>();>(); // es lo mismo que: List<int> l = new List<int>();// es lo mismo que: List<int> l = new List<int>();
var
Este tipo de variables sin tipo s€lo est‚n permitidas como variables locales
Este tipo de variables sin tipo s€lo est‚n permitidas como variables locales [13][13]. Este mecanismo es muy †til para. Este mecanismo es muy †til para usar en los par‚metros de los m•todos gen•ricos.
usar en los par‚metros de los m•todos gen•ricos.
Operadores
Operadores
Como otros lenguajes de programaci€n, Vala tiene a disposici€n de los programadores una gran variedad de Como otros lenguajes de programaci€n, Vala tiene a disposici€n de los programadores una gran variedad de operadores para usar con distintos prop€sitos. Podemos separar los operadores de Vala en varios tipos seg†n el tipo operadores para usar con distintos prop€sitos. Podemos separar los operadores de Vala en varios tipos seg†n el tipo de datos sobre el que operan.
de datos sobre el que operan.
Operadores aritmƒticos
Operadores aritmƒticos
Estos operadores se aplican a todos los tipos num•ricos definidos anteriormente. Estos operadores son los que Estos operadores se aplican a todos los tipos num•ricos definidos anteriormente. Estos operadores son los que aparecen en la siguiente tabla:
aparecen en la siguiente tabla:
Operadores aritmƒticos I (identificador =
Operadores aritmƒticos I (identificador = expresi€nA OPERADOR expresi€nB)
expresi€nA OPERADOR expresi€nB)
Ope
Operadradoror DesDescricripcipci€n€n
== El oEl operperadoador de r de asiasignagnaci€ci€n se n se utiutilizliza paa para rra realealizaizar asr asignignaciacionones ees entrntre une una vaa variariable ble y el y el resresultultado ado de ude una ena exprxpresiesi€n o €n o un vun valoalor (or (otratra variable). A la izquierda de
variable). A la izquierda de este operador debe aparecer un identificador (una variable) y a este operador debe aparecer un identificador (una variable) y a la derecha del mismo puede aparecer unla derecha del mismo puede aparecer un valor, una expresi€n o otra variable.
valor, una expresi€n o otra variable.
++ El oEl operperadoador de r de sumsuma rea realializa lza la ada adiciici€n €n de lde las as expexpresresioniones qes que ue tietiene ne a su a su izqizquieuierda rda y a y a su dsu dereerechacha. Es. Este ote operperadoador es r es aplaplicaicable ble a laa lass cadenas de texto ("string").
cadenas de texto ("string").
-- El oEl opeperaradodor de rr de resesta rta reaealiliza lza la rea reststa de a de la ela expxpreresisi€n q€n que tue tieiene a lne a la dea dererechcha soa sobrbre la e la exexprpresesi€i€n qun que tie tienene a su e a su izizququieierdrda.a. ** El oEl opeperaradodor de mr de mulultitiplplicicacaci€i€n ren realaliziza el pa el proroduductcto eno entrtre la ee la expxpreresisi€n q€n que tue tieiene a ne a su isu izqzquiuiererda y da y a su a su dedererechcha.a.
/ / El operador de divisi€El operador de divisi€n realiza esta operaci€n usann realiza esta operaci€n usando como dividdo como dividendo la expresi€n qendo la expresi€n que tiene a su izquierda y coue tiene a su izquierda y como divisor la expmo divisor la expresi€nresi€n que tiene a su derecha.
que tiene a su derecha. %
% El oEl operperadoador de mr de m€du€dulo clo calcalcula ula el reel resto sto de ude una dna diviivisi€si€n sin siendendo la eo la exprxpresiesi€n q€n que tue tieniene a su ie a su izquzquierierda eda el col cocieciente nte y la ey la expxpresresi€n i€n que que exiexisteste a su derecha el
a su derecha el divisor.divisor.
Operadores aritmƒticos II (identificador OPERADOR
Operadores aritmƒticos II (identificador OPERADOR expresi€n)
expresi€n)
Ope
Operadradoror DesDescricripcipci€n€n +=
+= EstEste oe operperadoador rer realializa lza la ada adiciici€n €n de lde la exa exprepresi€si€n sn sobrobre el e el concontentenido ido que que tentenga ga el iel idendentiftificaicador dor a su a su izqizquieuierdarda.. -=
-= EstEste oe operperadoador rr realealiza iza la la resresta ta de de la la expexpresresi€n i€n sobsobre re el el concontentenido ido que que tentenga ga el el ideidentintificficadoador a r a su su izqizquieuierdarda.. *=
*= EstEste ope operaerador dor rearealizliza el pa el prodroductucto eno entre etre el col contentenidnido deo del idl idententifiificadcador a sor a su izu izququierierda y lda y la exa exprepresi€si€n a su n a su derderechecha. El a. El resresultultado ado sese almacena en el identificador.
almacena en el identificador. /=
/= Este operador realiza la divisi€Este operador realiza la divisi€n tomando comn tomando como dividendo el coo dividendo el contenido del identintenido del identificador y como divisficador y como divisor el resultado de la expresi€or el resultado de la expresi€n den de la derecha. El resultado de
la derecha. El resultado de la divisi€n se almacena en el identificador.la divisi€n se almacena en el identificador. %=
%= EstEste opee operadrador caor calculcula el m€la el m€duldulo (reso (resto) dto) de la dive la divisiisi€n€n, tom, tomandando como como divo divideidendo endo el conl contentenido dido del idel idententifiificadcador y coor y como dimo divisvisor elor el resultado de la expresi€n de la derecha.