Duda acerca de la programación y GitHub

Iniciado por RevolucionVegana, 4 Diciembre 2016, 11:44 AM

0 Miembros y 1 Visitante están viendo este tema.

RevolucionVegana

Hola a todos quería preguntaros algo y es que como bien sabréis algunos últimamente estoy aprendiendo C++ y haciendo algunas cosillas básicas el caso es que llevo un tiempo mirando GitHub y no logro comprender eso de que haya tantas carpetas y todo eso, ya se que es para que todo esté organizado y que directamente cuando quieran modificar algo sepan donde está rápidamente pero cual es el programa es decir, el núcleo desde donde parte todo, es que es super raro normalmente yo que estoy acostumbrado a los programitas que hago que solo utilicen un solo fichero pues esto se me hace raro verlo, si yo por ejemplo quisiera ver el código de Metasploit en GitHub cual sería el fichero inicial es decir cual sería el núcleo de todo o no tiene por que haber núcleo?

Aclaro que esto no es una duda de C++ es una duda de cualquier lenguaje de programación y la organización en proyectos grandes donde mucha gente participa, gracias y un saludo amigos!

https://github.com/rapid7/metasploit-framework
HAS DICHO ALGO NENAAAAAA?!

Orubatosu

No se exactamente como anda GitHub, pero ten en cuenta que C++ no es un "C con vitaminas" únicamente.

C++ integra completamente lo que es la programación orientada al objeto. Un paradigma muy diferente al de la programación "tradicional" que como en el C normal se conoce a veces como imperativa (también procedural y estructurado claro). En estos lenguajes tu dices que quieres hacer, y lo descompones en librerias, rutinas, etc...

En la POO que integra C++ aparecen otros conceptos, como puede ser el de "Evento" asociado a un objeto, además la modularidad es un concepto también de la POO lo que permite descomponer los programas "muy grandes" en varios separados. Esto tiene sus ventajas y desventajas claro está

El concepto de "modular" se basa en cierto modo a lo que se llama en programación tradicional "funciones" o algo por el estilo. En POO existen las "clases" que son "objetos", que son por así decirlo como un modulo o "caja negra" donde tu no necesitas saber a priori que ocurre ahi dentro. Sabes que ese objeto hace algo, que tiene unas propiedades y que le das datos y obtienes resultados. El como y porque no es asunto tuyo, de hecho toda la POO está pensada para que los objetos sean en caso necesario bloques "opacos" donde tu no puedes modificar de modo alguno sus variables internas .

Esto permite que diferentes personas trabajen de forma sencilla en un proyecto, ya que los módulos diferentes interactuan entre si, pero de un modo mucho mas controlado.

Lo cierto es que la POO es un poco "compleja" en este sentido, y se ha pensado con una serie de permisos y jerarquías para impedir que se acceda sin control alguno al contenido de diferentes clases.

Así pues, supongamos que hay varias personas trabajando en un gran programa de gestión de empresas. Tu puedes acceder por ejemplo a los datos de los empleados, pero como lo haces porque estás haciendo un modulo para calcular (por ejemplo) los impuestos, no hay forma de que modifiques los datos de los empleados. Tienes acceso a unos datos pero no puedes modificar esa parte del programa. Los diferentes modulos se  diseñan para que haya comunicación, pero solo la permitida en cada momento.

En la programación tradicional nada te impide desde cualquier parte del programa "meter mano" a las variables de la otra punta del programa (por ejemplo). Aquí existe una serie de permisos y una jerarquía que te lo impide

No se si te he aclarado algo, o te he liado mas.
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

RevolucionVegana

Hola Orubatosu muchas gracias por responder esa parte ya la entendía pero la que no entiendo es que por ejemplo cojo entro aquí:

https://github.com/rapid7/metasploit-framework

Como puedo ver el primer archivo que programaron para ir enlazando todo y ver como se estructura viendo las librerías que importa y en que momento utiliza las funciones y todo eso, no se si me explico

Saludos
HAS DICHO ALGO NENAAAAAA?!

ivancea96

No utilicé ni Metasploit ni suelo programar Ruby, así que te pongo otro ejemplo: SFML

https://github.com/SFML/SFML

SFML no es un programa, es una librería. Una librería no tiene un "main", sino que tiene un funciones y clases.
En el caso de SFML, si por ejemplo quisieras hacer una ventana gráfica, incluirías el header "SFML/Graphics.hpp", para así utilizar la clase "sf::RenderWindow".
El header Graphics.hpp es este: https://github.com/SFML/SFML/blob/master/include/SFML/Graphics.hpp
Como ves, solo tiene includes. También podrías directamente incluir "SFML/Graphics/RenderWindow.hpp".

A donde quiero llegar, es que utilizas lo que necesites (y si utilizas un header, puede estar a su vez incluyendo muchos más headers), pero no hay main.

metasploit-framework es una librería? Siendo así, no sería muy diferente (salvando las diferencias que tenga Ruby). Si es un programa, pues todo sería encontrar el punto de inicio (cada lenguaje tiene su "convención", y no conozco Ruby).
Aquí seguro que encuentras el main xD: https://github.com/ivancea/RogueLikeGame

avesudra

#4
Cita de: RevolucionVegana en  4 Diciembre 2016, 13:23 PM
Hola Orubatosu muchas gracias por responder esa parte ya la entendía pero la que no entiendo es que por ejemplo cojo entro aquí:

https://github.com/rapid7/metasploit-framework

Como puedo ver el primer archivo que programaron para ir enlazando todo y ver como se estructura viendo las librerías que importa y en que momento utiliza las funciones y todo eso, no se si me explico

Saludos
Eso está hecho en Ruby, lo que quiere decir que antes como mínimo deberías tener conocimiento medio de ese lenguaje. Hoy en día hay muchas herramientas para la automatización del despliege de las aplicaciones (proceso requerido para que éstas empiecen a funcionar), normalmente cada lenguaje tiene un conjunto de herramientas que te permiten hacerlo. Esas herramientas suelen tener archivos de configuración que te permiten ver cómo está estructurado ese proceso, algo que te puede aclarar mucho las cosas sobre dónde está el punto de entrada de las mismas.

De todas maneras lo que pides es complicado si no hay documentación de por medio o si el software es muy grande, en ese proyecto han contribuido 400 personas, como supongo que intuirás, habrá gente que no tiene ni idea de cómo está hecha otra parte de la aplicación. Si en el desarrollo de aplicaciones cada programador tuviera que saber cómo está implementado cualquier otro módulo, el desarrollo de software no sería factible, ni en tiempo, ni en coste. De hecho lo tuyo es aún más complicado, estás intentando entender la arquitectura de un software realizándole Ingeniería Inversa al código.

En C++ lo que más se usa son las https://es.wikipedia.org/wiki/GNU_build_system . Y por todo esto que te cuento es tan importante la Ingeniería del Software hoy día, poner de acuerdo a tantísima gente no es fácil.

No es por desanimarte, pero digo que para entender un software al completo te debes dedicar por completo a estudiarlo, y si no tienes a nadie que te introduzca en el tema y no hay documentación, puedes morir en el intento.

Además para cada lenguaje de programación, o ellos mismos u otras empresas establecen guías de estilo, que pueden ir desde convenciones para el nombrado de variables, métodos y clases hasta los nombres y la organización de las carpetas.

EDIT: De hecho se usan patrones de diseño de software, patrones para la arquitectura como el MVC (Modelo Vista Controlador) que está por todos lados. Aunque parezca que no, te aseguro que si metes a 20 personas en una habitación a trabajar conjuntamente en un software, únicamente picando código cada uno por su lado seguramente habrá un 99% de probabilidades de que la aplicación falle en su despliege.

Saludos.
Regístrate en

RevolucionVegana

Hola muchas gracias por responder Ivan eso es un juego en Java que estás haciendo verdad?

Este este el núcleo por así decirlo? https://github.com/ivancea/RogueLikeGame/blob/master/RogueLikeGame/src/es/hol/ivancea/RogueLikeGame.java

Y a ver yo no quiero estudiar al 100% metasploit simplemente he puesto ese ejemplo podría haber puesto cualquier otro pero es más que nada para saber donde se ubica normalmente el corazón del programa, y otra pregunta espero no ser muy pesado, yo ahora mismo mis programas en C++ llego y le pongo esto en la terminal para compilarlos:

g++ programa.cpp -o programa

Funciona de maravilla pero ahora me pregunto yo, y si en vez de un fichero (programa.cpp) fuesen muchos ficheros separados y en diferentes carpetas y todo eso como los compilo todos juntos para que funcione bien? O esto no es así? Muchas gracias a todos!!!! Aunque ahora pensándolo bien Metasploit no ha sido para nada el mejor ejemplo que podía haber puesto ya que según tengo entendido Ruby es un lenguaje interpretado no compilado,

Saludos!!
HAS DICHO ALGO NENAAAAAA?!

avesudra

#6
Cita de: RevolucionVegana en  4 Diciembre 2016, 17:04 PM
Hola muchas gracias por responder Ivan eso es un juego en Java que estás haciendo verdad?

Este este el núcleo por así decirlo? https://github.com/ivancea/RogueLikeGame/blob/master/RogueLikeGame/src/es/hol/ivancea/RogueLikeGame.java

Y a ver yo no quiero estudiar al 100% metasploit simplemente he puesto ese ejemplo podría haber puesto cualquier otro pero es más que nada para saber donde se ubica normalmente el corazón del programa, y otra pregunta espero no ser muy pesado, yo ahora mismo mis programas en C++ llego y le pongo esto en la terminal para compilarlos:

g++ programa.cpp -o programa

Funciona de maravilla pero ahora me pregunto yo, y si en vez de un fichero (programa.cpp) fuesen muchos ficheros separados y en diferentes carpetas y todo eso como los compilo todos juntos para que funcione bien? O esto no es así? Muchas gracias a todos!!!! Aunque ahora pensándolo bien Metasploit no ha sido para nada el mejor ejemplo que podía haber puesto ya que según tengo entendido Ruby es un lenguaje interpretado no compilado,

Saludos!!

Para eso tienes un precioso fichero Makefile en la mayoría de los proyectos de C++.

De hecho si en la carpeta donde tienes el fichero "programa.cpp" creas el fichero "Makefile":

#Makefile prueba
all: prueba.o
g++ prueba.o -o prueba

prueba.o: prueba.cpp


Y luego abres una terminal y haces:
make

Seguramente te compilará el programa( si yo no me he equivocado escribiéndolo claro).

¿Y cómo sé manejar esa sintaxis? Pues léete el manual de make.

Pero vamos básicamente es:


regla1: dependencias
     cosa que hacer cuando se ejecuta la regla1

regla2: dependencias
     cosa que hacer cuando se ejecuta la regla2


Para ejecutar la regla1 puedes hacer:

make regla1

O simplemente make, pues si no pones nada, pilla la primera regla que haya en el fichero Makefile.

Para ejecutar la regla2 forzosamente tienes que poner:

make regla2
Regístrate en

MAFUS

Como dice avesudra se suelen usar los makefile para compilar los archivos, pero en proyectos grandes hay makefiles que llaman a otros makefiles que son los encargados de realizar el trabajo. Puede llegar a ser tan complicado un makefile (es una ironía bastante buena ya que los makefiles sirven para simplificar el compilado) que existen generadores de archivos makefiles, como automake.

Como ves la cosa se puede llegar a complicar bastante. Empieza con compilando un archivo con multiples cabeceras y fuentes. Cuándo sepas manejar el compilador pásate a make. A partir de aquí ve aumentando la complejidad a medida que lo necesites.

RevolucionVegana

Muchísimas gracias a todos por la información sobre todo eso del make gracias !!
HAS DICHO ALGO NENAAAAAA?!