Clase2-GSoc

El dia 12 de noviembre tuvimos nuestra segunda clase. En la cual aprendimos varios aspectos muy interesantes del lenguaje C.

Pero antes de empezar a contar que hicimos en la clase, quiero agregar dos segmentos muy interesantes que leí mientras investigaba acerca del tema (dejare sus respectivos links al final de cada mencion).

Otra cosa interesante podria ser la importancia del lenguaje C en linux

Mediante una lista de topicos en los cuales se uso del lenguaje C:

  • Kernel y drivers de dispositivos: Tanto los drivers como el kernel funcionan en un nivel realmente bajo de operaciones en el ordenador. Para escribir el kernel del sistema operativo y acceder a las propiedades del hardware tales como los ciclos de la memoria, buses de entrada/salida, etc., se necesita un lenguaje que pueda comunicarse con el hardware con potencia. El kernel Linux hace uso del lenguaje C (aunque en realidad no se trate de un lenguaje de bajo nivel) con una pequeña parte en lenguaje ensamblador.
  • Librerías y utilidades: Las librerías y utilidades básicas del sistema tales como mkdir, chmod, chown, head, tail, chroot, uptime, users también están escritas en lenguaje C.
  • Gestores de paquetes y programas de configuración: Los gestores de paquetes tales como yum, apt, dpkg, etcétera, también están escritos en C, que como veis es la estrella absoluta de los componentes “base” de un sistema GNU/Linux.

Para mas referencias consultar en :

https://www.muylinux.com/2009/06/02/en-que-lenguajes-esta-programado-gnulinux/

Una breve historia de gcc (el principal compilador de C en linux)

El autor original del Compilador de C de GNU (GCC) es Richard Stallman, el fundador del Proyecto GNU.

El Proyecto GNU fué iniciado en 1984 para crear un sistema operativo basado en software libre similar a UNIX y, así promover la libertad y la cooperación entre usarios de ordenadores y programadores. Cualquier sistema operativo basado en UNIX necesita un compilador de C, y no había compiladores libres en ese momento, el Proyecto GNU debía desarrollar uno desde cero. Este trabajo fué financiado por donaciones de individuos y compañias a través de la Free Software Foundation, una organización sin ánimo de lucro destinada a dar soporte al trabajo del Proyecto GNU.

La primera entrega de GCC fué hecha en 1987. Esto fué un significativo progreso, siendo el primer compilador portable para optimizar ANSI C liberado como software libre. Desde este momento GCC ha llegado a ser uno de las más importantes herramientas en el desarrollo de software libre.

Un avance importante en el compilador llega con la serie 2.0 en 1992, que añade la capacidad de compilar C++. En 1997, se creó una rama experimental del compilador (EGCS) para mejorar la optimización y el soporte de C++. Después de este trabajo, EGCS fué adoptado como la principal línea de desarrollo de GCC y, estas funcionalidades llegaron a estar ampliamente disponibles en la versión 3.0 de GCC en 2001.

A través del tiempo GCC ha sido extendido para dar soporte a muchos lenguajes adicionales, incluyendo Fortran, ADA, Java y Objective-C. El acrónimo GCC es ahora usado para referir al “GNU Compiler Collection” (Colección de Compiladores de GNU). Su desarrollo está guiado por el GCC Steering Committee, un grupo compuesto de representantes de las comunidades de usuarios/as de GCC en la industria, la investigación y la academia.

Ahora que acabé de agregar los segmentos de curiosidades, voy a empezar a contar que hicimos en nuestra 2da sesión de LinuxAtUNI.

Primero para calentar vimos una introducción rapida al codigo del clasico “hola mundo” (o hello world en estos casos )

Después de esto vimos las funciones argc y argv

A modo de ejemplo en codigo para entederlas mejor , y su funcionamiento :

argc:: >> es el numero de argumentos que recibe nuestro programa
 cuando cuando es llamado desde la linea de comandos(y desde
 cualquier otro lado)
 
 el primer argumento es el nombre del ejecutable por lo cual 
 si no le pasamos elementos al programa, nos imprimira 1

argv:: >> contiene los valores de los argumentos ingresados por 
 por linea de comandos.
 
 los argumentos ingresados son separados por espacios siempre y
 cuando estos no estes entre comillas o no sean escapados
 (“\<espacio>”)

los argumentos son ordenados en una lista de la sgte forma :

argv[0] : <El nombre del programa>
 argv[1] : argumento 1
 argv[2] : argumento 2
 argv[3] : argumento 3
 argv[4] : argumento 4
 … : …

Ademas de darnos unos cuantas notas a tomar encuenta

>> NOTAS :
 las expresiones como “%d” , “%s” son especificadores de formato
 (format especifiers).

%d y %i son diferentes porque..

d ->> es en formato de base 10
 i ->> es un entero normal

las expresiones como “\t” o “\n” se conocen como secuencias de 
 escape

[modificador] <tipo> <nombre_de_var> [= <valor_de_var>]

Luego vimos el proceso de compilacion , de enlace y ejecucion del codigo

Y despues de entender estos conceptos vimos algunos de los errores que nos pueden salir y como repararlos

Despues de ver esto tratamos de automatizar el proceso de compilacion/ejecucion mediante un makefile

y que hace exactamente un makefile ?

Es un archivo que realiza los procedimientos que deberiamos hacer a mano normalmente en la terminal automaticamente , solo pasandole unos cuantos parametros como los nombres de los archivos y ya puede este script compilar y ejecutar nuestro codigo de C con solo llamarlo por la terminal introduciendo “make” en la terminal.

NOTA : Ademas podemos modificarlo para tener mas funcionalidades y ser multiplataforma.

NOTA 2: Estos tienen reglas virtuales

Es relativamente habitual que además de las reglas normales, los ficheros makefile puedan contener reglas virtuales, que no generen un fichero en concreto, sino que sirvan para realizar una determinada acción dentro de nuestro proyecto software. Normalmente estas reglas suelen tener un objetivo, pero ninguna dependencia.

Y esto es lo que automatiza en makefile

Despues vimos los punteros en C

Los cuales según entendi son basicamente cuando una variable de declara por ejemplo:

int a = 20;

esta variable “a” ocupa un lugar en la memoria y este espacio tiene una direccion especifica en la cual esta se ubica.
Lo que hace el puntero es declarar un variable:

int *puntero =&a;

Entonces la variable “*puntero” contiene el valorde la variable “a”
Y puntero contiene su direccion .

Aqui el ejemplo que tuvimos en clase

& ->> se llama “ampersand” 
 &<var_name> retorna la direccion de memoria de la variable
 [A]mpersand = [A]ddress (Direccion)

*<var_name> Es una variable que recibira una direccion de memoria

// char *z = &x;
// z : La direccion de x (&x)
// *z: El valor de x (x)

Y para finalizar estructuras

Las cuales podrian decirse que son colecciones de variable las cuales pueden ser relacionadas mediante un nombre e invocadas bajo el mismo.

Una estructura es una colección de elemento finita y heterogenea. La cual puede almacenar distintos tipos de elementos primitivos (tales como int , float , double ,etc ..).
¿Pero, para que nos sirve? Las estructuras nos ayudan a agrupar datos de una manera más ordenada y fácil para nosotros. Por ejemplo, supongamos que queremos guardar el nombre, la edad y el número de teléfono de varios contactos en un programa en C de la manera tradicional estos tendrian que declararse asi

string nombre1[20];
int edead1;
int numeroTelefono1;

string nombre2[20];
int edead2;
int numeroTelefono2;

string nombre3[20];
int edead3;
int numeroTelefono3;

….. 
Asi sucesivamente
pero con una estructura…
struct contacto{
int edad;
int numeroTelef;
string nombre[20];

}contacto[30];

Y asi podriamos crear varias “plantillas” las cuales estarian agrupadas por contacto enves de declarar las variables a cada rato .

Para ver los códigos con más detalle consulta mi git

->https://github.com/pystudent1913/FedoraPeruRumbo-GSoC/tree/master/Clase_02

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.