Anuncios

Bienvenidos sean a este post, hoy veremos un tema que tratamos muy superficialmente.

Anuncios
Anuncios

Hasta ahora siempre que hablamos de rango (scope) nos referimos principalmente a la visibilidad de las funciones o las variables, cuando nos referimos a visibilidad es la disponibilidad de una funcion para poder ver, acceder o modificar una variable, por lo general si la variable es visible, esta puede ser accedida y modificada, salvo que la hayamos declarada como constante (const) donde podremos acceder pero no modificarla, otro tema que define su visibilidad son cuando son globales o locales, siendo las globales accedidas por todo el codigo y las locales por un determinado bloque de instrucciones, pero la visibilidad es solo una parte del rango ya que ademas tenemos a extent (el tiempo de vida de la variable) y el linkage (el archivo donde la variable existe), estos tres componentes de las variables y las funciones dependen principalmente de donde y cuando fueron declarados, sin embargo mas alla del cuando y donde son declarados esto debe ser definido antes de que cualquiera de ellas sean accedidos, si bien esto se aplica para ambos tienen sutiles diferencias de las cuales hablaremos mas adelante, pasemos a explotar los tres componentes del rango o scope.

Anuncios

Explorando la visibilidad

Cuando hablamos de visibilidad de una variable este es determinado por su ubicacion dentro del archivo, si bien sobre algunas ubicaciones ya las hemos mencionado y utilizado a continuacion veamos un listado de que determina la visibilidad de una variable:

  • local, cuando hablamos de variables locales nos referimos a la variables en un bloque o funcion y se borrara cuando salgamos del mismo
  • Parametro de funcion, es el que recibe la funcion y al igual que el anterior se borrara cuando salgamos de la funcion
  • Rango archivo, son las variables que son declaradas por fuera de funciones o bloques y son accedidas por todos los elementos del archivo, tambien se la denomina como variable externa
  • Global, cuando una variable externa se referencia de tal forma que puede ser accedida desde varios archivos, tambien se los denomina como rango de programa
  • Static, este tipo de variable son las que viven mas alla del tiempo de vida de una variable automatica y existira en todas partes hasta que termine el programa
Anuncios

Si observan que hasta ahora hemos trabajado con todos los tipos de variables, ya sea desde un bloque en una funcion o condicional hasta las de tipo estaticas para poder trabajarlas durante todo el programa, pero como dijimos antes esto no es lo unico que afecta a las variables.

Anuncios

Explorando a extent

Anuncios

Como dijmos la visibilidad es una parte del scope, la otra es extent y con este tema nos referimos al tiempo de vida de una variable, durante el curso en otros posts y mismo aqui dijimos que una variable existira dependiendo de su tipo, siendo las locales que viviran mientras el bloque donde se definieron exista en el programa, en cambio las globales o estaticas lo haran mientras el programa exista, ese rango de existencia de la variables es llamado extent y mientras exista podremos trabajar con nuestra variable en todas las formas habilitadas, siguiendo con el tema al extent de una variable tambien se lo especifica por una clase de almacenamiento (storage class), o como es ubicado, usado y finalmente desubicado, para todo esto disponemos de cinco clases de almacenamiento:

  • auto, es la clase predeterminada sino se especifica alguna, su duracion depende de donde lo usemos si es en un bloque es interno fuera de este es externo
  • register, similar al anterior pero le sugiere al compilador que ponga la variable en uno de los registros del CPU, es ignorado por los compiladores modernos
  • extern, especifica que la variable existe en otro archivo a su vez en ese archivo debe ser externa, lo cual hara que existira mientras exista el programa
  • static, esta clase da a la variable la visibilidad de un rango de bloque/local pero durara em todo el programa, tal como extern
  • typedef, formalmente tambien es una clase de almacenamiento si bien cuando lo usamos se encarga de declarar un nuevo tipo y ningun almacenamiento es ubicado lo cual nos lleva a decir que su rango es similar a una funcion.
Anuncios
Nota:
Sobre algunos temas hablaremos en otros posts mas adelante.
Anuncios

Aca podemos ver como la asignacion y desasignacion en memoria estan muy relacionadas con el tiempo de un componente en un rango, pasemos a hablar sobre el siguiente tema.

Anuncios

Explorando linkage

En programas de un solo archivo de origen, tal como los vistos en muchos posts anteriores, no se aplica realmente el tema del linkage (enlazado) porque todo sucede en un solo archivo, esto incluye a cuando trabajamos con archivos de encabezado, pero si tuvieramos varios archivos de codigo para un programa, el rango de las variables tambien estara determinado por el linkage, este envuelve las declaraciones en un solo archivo o unidad de compilacion, pero que es una unidad de compilacion?

Anuncios
Anuncios

Basicamente es un codigo fuente y un archivo de encabezado, este codigo puede ser completamente un programa o pueden ser un monton de archivos con muchos codigos fuente que convergen en un ejecutable, en la fase de compilacion se preprocesa y compila individualmene cada codigo fuente, dando como resultado un archivo de objeto intermedio y este sabe sobre las funciones externas y variables mediante las declaraciones del archivo de encabezado pero difiere la resolucion de sus actuales direcciones hasta mucho despues, solo cuando todos los codigos fuentes fueron compilados exitosamente en archivos objetos se ingresa a la fase de linkage, haciendo que las direcciones de funciones en otros archivos o librerias sean resueltas y lo mismo para las direcciones de las variables globales externas, y solo cuando todas las direcciones sin resolver son resueltas (se enlazan entre todas) se procede a combinar todos los archivos objetos en un solo ejecutable.

Anuncios

Entonces podemos decir, todo denro de una unidad de compilacion es visible y accesible a todo lo demas en la unidad de compilacion, el linkage de las funciones y variables es tipicamente limitado a solamente la unidad de compilacion, pero si queremos superar los limites debemos usar los archivos de encabezado con las clases de almacenamiento apropiadas, para las variables (extern) asi como typedef para declaraciones y prototipos de funciones, asi que el componente linkage de un rango envuelve no solo a las declaraciones dentro de un simple codigo fuente sino que hace disponible estas declaraciones disponibles en otras unidades de compilacion, un ejemplo sobre esto es el codigo que desarrollamos en este post.

Anuncios

Con esto comentado ya tenemos una mejor idea de todo lo que envuelve al rango o scope, dentro de un archivo solitario los componentes de visibilidad y extent estan levemente interralacionadas y merecen cierta consideracion pero con multiples archivos el componente de linkage debe llevar mas consideraciones, a su vez podemos pensar que el rango va desde una pequeña parte hasta el programa entero, siendo que los bloques y las funciones seran los rangos mas chicos y por el otro lado las variables externas y los prototipos de funciones seran de un rango mas amplio que pueden incluir el archivo completo.

Anuncios

En resumen, hoy hemos visto un poco mas de rango (scope), de que se trata realmente, como se compone, hablamos sobre que es la visibilidad, sobre el extent (tiempo de vida), y sobre el linkage, tambien un poco mas sobre la compilacion, por ultimo de como estos tres elementos se relacionan entre si, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50