[C con Clase] ¿Alguien sabe destripar librerías...?

Steven Davidson srd4121 en njit.edu
Sab Ago 30 02:28:42 CEST 2008


Hola Xonly,

xonly wrote:
> tal vez tengas razón, pero mi forma de pensar no la puedo controlar,
> si algo me da vueltas en la cabeza, no puedo seguir viendo cosas
> nuevas si no he entendido completamente una cosa, que se le va a
> hacer es mi gran problema, de hecho sino fuera por esto,
> probablemente habría terminado ya la carrera y no estaría dándo
> vueltas mil veces a lo mismo. Pero no puedo extirpar ciertas neuronas
> de mi cerebro.
> 

Como ya he dicho, es bueno cuestionar las cosas, pero no puedes dejarte 
llevar por ellas, especialmente cuando estás empezando. Una vez que 
tengas suficientes conocimientos, entonces o bien se aclararán esas 
dudas o bien necesitas aclararlas una vez por todas. Si ocurre lo 
último, entonces para eso estamos nosotros si no puedes aclarar esas 
dudas. Lo que no puedes esperar es que en dos días (o el tiempo que 
hayas dedicado) aclarar todas las dudas de temas más o menos avanzadas. 
Te podemos explicar con todo lujo de detalles todos estos temas, pero 
sin conocimientos no vas a entender nada. Al final, como he visto muchas 
veces ocurrir, uno se desespera con tanta información que abandona la 
idea de aprender.

Mi consejo es que vayas con calma y no afrontes más problemas de los que 
puedas resolver.

> SD> conocimientos que tengas, esto debería ser evidente si ya sabes
> acerca SD> del tema de las plantillas (templates, en inglés).
> 
> pues no, no tengo ni idea, así que esto va con lo de las
> plantillas...
> 

Si sigues nuestro curso, tratamos este tema en el cap. 40, casi al final 
del curso.

> me estoy quedando helado, no me entero bien, un momento, releo...,
> sigo sin cogerlo bien, para empezar entiendo que al parecer hay que
> elegir en algún sitio en la plantilla lo de si escoger el ANSI C o el
> ANSI C++, pero lo de STL no sé muy bien a cual de ellas te estás
> refiriendo, aún así, se supone que estas no están compiladas, por lo
> que imagino que se compilan junto con tu fuente, sin embargo,
> precisamente eso es lo que necesito, y resulta que no veo ese cógigo
> en c++ por ningún lado, lo cual intuyo que en realidad es como dices,
> que en realidad están ya en código binario de esta plataforma en
> concreto, para un pc con windows. Sin embargo, se supone que yo he
> cogido la parte de C++, porqué no veo por ningún sitio esos ficheros
> con código en C++ a parte de las simples declaraciones de los .h
> 

Veamos. Escuetamente, diré lo siguiente:

ANSI C++ = ANSI C + STL

O sea, ANSI C++ es igual que las funciones de ANSI C junto con las STL 
que son propias de C++. Esto significa que puedes usar las funciones 
estándares de ANSI C en un programa de C++.

Dicho lo anterior, esas funciones están en sus bibliotecas que realmente 
contienen las implementaciones ya compiladas en código binario, como 
bien mencionas. Las STL, por su uso y "naturaleza", deben estar en 
código fuente; no se pueden compilar como plantillas. Por lo tanto, si 
usas las STL, estarás agregando más código fuente al tuyo, que al final 
será compilado y enlazado para crear tu propio fichero ejecutable.

Si quieres ver los ficheros de cabecera de las STL, como <iostream>, 
<fstream>, <ios>, <string>, <vector>, <queue>, etcétera, simplemente 
entra en el subdirectorio de tu compilador para los ficheros de 
cabecera. Típicamente, estos ficheros se encuentran en el subdirectorio 
"include". Por ejemplo, "C:\Dev-Cpp\include"; aunque en Dev-C++, estos 
ficheros de las STL están en "C:\Dev-Cpp\include\c++\3.4.2". Usa el 
propio Dev-C++ o cualquier editor de texto para ver el contenido de 
todos estos ficheros de cabecera.

> ciertamente no es que quiera hacer o comparar C con lo que se usaba
> en aquella época, (por cierto añoro esos tiempos de PEEKs y POKE's)

Sí, era muy divertido :)

> pero el caso es que si me encanta el aprovechamiento real 100% de
> toda la máquina, no había otra forma si se quería hacer algo, ahora
> la máquina sobra por todos lados, y no nos damos cuenta de si el
> programa hace lo que nosotros queremos, o hace además otras miles de
> millones de cosas más.
> 

Me temo que es más bien lo último. Como mencionó Programante, las cosas 
han cambiado y el enfoque de los PC's también ha ido evolucionando, y 
por tanto las herramientas (lenguajes, compiladores, etc.) también deben 
evolucionar.

En la época de los Spectrum, éstos no podían hacer cálculos para la 
meteorología, ni permitir varios usuarios simultáneamente, ni repartir 
varias tareas para varios procesadores, ni gestionar múltiples programas 
a ejecutarse aparentemente a la vez, ni "defenderse" de virus, gusanos, 
agentes y otros programas malévolos, ni garantizar que el usuario es 
quien active un programa u otro, ni muchos más temas. Todo esto ha ido 
evolucionando porque había necesidad de tal evolución. Por eso, no 
podemos programar el procesador directamente pensando en nuestro propio 
programa. Existen otros programas; existen otras capas o niveles que el 
propio sistema operativo debe imponer para la seguridad y garantía de la 
ejecución correcta de todos los programas a su cargo.

Lo que tú propones sirve para un sistema específico y no uno de 
propósito general, como el PC y MS-Windows. Por ejemplo, quieres 
programar exclusivamente para un procesador que sirve para controlar un 
robot en particular. Si es así, entonces puedes eliminar el tener un 
sistema operativo y empezar a programar directamente en código binario, 
si quieres. Aprovecharás al máximo posiblemente el tiempo de ejecución y 
el tamaño de la memoria de tus programas. Esto es porque no tienes que 
preocuparte de todos los otros temas de otros sistemas que he mencionado 
anteriormente.

> me interesa no sólo que sea el tamaño mínimo, sino que además pueda
> yo controlar que hacer en cada momento, y con las librerías, pues
> mira, supuestamente en visual, me dice que "debe" hacer una supuesta
> conversión letra a letra del texto a utf, y yo no necesito convertir
> nada, directametne sé si es un fichero o un texto por consola, no
> necesito que compruebe esto, y eso es por culpa de la reutilización
> de funciones para librerías (he de decir que para la versión del
> visual, he cambiado el código y uso printf que es el ejemplo que me
> viene en muchos sitios, aunque reconozco que he de seguir mejor el
> curso que tenéis en la página de c conclase, pero había decidido
> empezar por un curso más "corto" que expliquen menos cosas, pues me
> conozco y le doy mil millones de vueltas a las cosas, y ya ves, casi
> sin comerlo ni beberlo, ala primera compilación, y así llevo más de
> 10 días, dándole vueltas....
> 

Como ya he mencionado anteriormente, es mejor que te centres en lo que 
quieres: aprender C++. Al menos que tengas otro objetivo en mente.

> lo dicho, no me gusta que para hacer una cosa, la libreria me haga
> 20, sé que es ir contracorriente, pero que se le va a hacer, de
> tontos el mundo esta lleno, al parecer yo gano a todos ellos (en lo
> de tonto)
> 

Ten presente que no tienes por qué usar las funciones ni las bibliotecas 
estándares. Nadie te obliga a usar las bibliotecas, si no quieres. Sin 
embargo, para ciertas tareas, es mucho más cómodo usar las funciones que 
han sido probadas miles y miles de veces.

Ahora bien, al crear tus propias bibliotecas y funciones, éstas tienen 
que existir en alguna parte, como por ejemplo en tu fichero ejecutable. 
Al final, vas a tener algo parecido, que quizá funcione o no, 
dependiendo del buen diseñador que eres. Como dije antes, las cosas no 
son tan simples como solían ser.

> ciertamente, sé que vuestra página es "demasiado completa" para mi
> forma de pensar, de todas formas, si algún día puedo continuar, lo
> haré poco a poco y revisaré vuestra página de reojo, hasta que vaya
> cogiendo más conocimientos y me ponga ya a rebuscar lo imposible.
> 

Está a disposición de todos, tanto para los iniciados como para los 
veteranos.

> al menos en mingw32 veo parte de esos códigos, de otras librerías no,
> en fin, si hay otros compiladores que sepas a ciencia cierta que
> traigan más posibilidades de libreías "abiertas" (según mi postura
> que es la de tener por un lado el .h y por otro la implementación de
> esa librería bien en c, c++ o asm)
> 

Personalmente, no me he puesto a mirar si otros compiladores ofrecen los 
ficheros fuentes de sus bibliotecas, pero es cuestión de buscar. 
Posiblemente, DJGPP que un compilador basado en el de GNU. Sin embargo, 
para otras bibliotecas, especialmente las que no sean estándares, 
dependen de sus desarrolladores si quieren ofrecer tales códigos fuentes 
o no.

> ciertamente estoy interesado más que en modificarlas, hacerme unas
> para mi, a pesar de que no sean tan "standard"
>  

No es mala idea, si se basa en curiosidad. Si no, entonces seguramente 
vas a caer en el mismo fallo que muchos han cometido. Crean sus propias 
implementaciones de las bibliotecas pensando que siempre van a 
funcionar, cuando en realidad tienen varios errores o no se comportan 
como deberían. Eso significa que necesitas otras personas que quieran 
comprobar su validez.

Al final, tanto si usas las implementaciones estándares como las tuyas, 
vas a crear otra implementación más de ciertas funciones que 
posiblemente ya existan.

> la verdad es que me encantaría poder hacer como en las antiguas
> "demoscenes" en las que para mi la mejor es la "second reality" que
> no recuerdo muy bien si es del 1992 o del 1993 pero que es
> alucinante, y maneja muy muy bien la máquina, y de esa forma también
> se podrían utilizar las librerías para hacer juegos y demás, pues
> pretendo mejorar lo que se pueda...
> 

La gran mayoría de esas demos fue escrita en ensamblador. Como ya he 
mencionado, MS-Windows gestiona muchas cosas por temas de seguridad, 
compatibilidad, etc.. Por eso hay que agregar algo más de código a tu 
programa para que funcione "bien" bajo MS-Windows. También debes ser 
"bueno" con los diseños del S.O., especialmente si pretendes apropiarte 
de recursos comunes como la parte gráfica; otros programas también 
necesita usar la tarjeta de vídeo. Quizá la mejor solución, dentro de lo 
que quieres hacer, es crear tu programa sin necesidad de un sistema 
operativo.

> más que nada como comentaba antes, lo que pretendo encontrar es un .c
> para ese .h o un c++ o en su defecto un .asm pero lo que me encuentro
> son .lib o .dll, que no tengo posibilidades de mirar nada.
> Supuestamente con el fuente de mingw32 se supone que podría hacer
> algo, pero me gustaría encontrar algo más fácil.
> 

La razón de encontrar ".lib" y ".dll" es que necesitamos estos ficheros 
para desarrollar y usar nuestros propios programas. El hecho de que 
existan ".c", ".cpp", o ".asm" no es de mucha importancia para otros 
desarrolladores que no sean los creadores de tales bibliotecas. Aquellos 
desarrolladores que quieran mejorar o adaptar estas bibliotecas también 
se interesaría por las fuentes.

> en el caso de visual, utiliza sólo la librería stdio.h pero luego
> esta llama a otras muchas en el fichero write.c se hace una
> conversion letra a letra de lo que se ha pasado a utf8 o a utf16 e
> incluso creo recordar que en algún sitio puede poner algo de ascii,
> pero no lo tengo muy claro, la verdad es que me he "destripado"
> muchas librerías, el caso es que he copiado todas estas librerías en
> el fuente, y no consigo compilar adecuadamente, pues resulta que las
> funciones al compilarlas, ya las tiene el "nombradas" así que sigo
> intentado averiguar de donde me faltan "más funciones"
> 

No te faltan funciones, lo que pasa es que existen otras funciones más 
en las bibliotecas. La función 'printf()' puede a su vez invocar otras 
funciones. Al final, tendrá que invocar alguna "función" en la BIOS o 
instrucciones en ensamblador para llevar a cabo su tarea.

> la verdad es que como decía, cuando se me mete algo entre ceja y
> ceja, o lo saco o reviento, y no sé si saldrá bien mi comentario de
> respuesta al compañero anterior, pero comentaba que en un programa
> que nos estubimos "picando" en la universidad, al final se redujo de
> una duración de algo más de 4 horas y media a unos 13 segundos, con
> lo cual ME INTERESA MUCHO INDEPENDIZARME de las librerías estandar.
> 

Si quieres hacerlo, adelante. Eso sí, estarás metido en diseños a bajo 
nivel. Eso significa que necesitas saber principalmente cómo funciona el 
procesador y el sistema operativo. Esto implica que tu implementación no 
podrá ser pasada a otra plataforma tal y como está. Esto puede o no ser 
un problema, pero es otro factor a considerar.

> el caso es que veo que hay muchas cosas que no funcionan como me
> gustarían, y por ello al final necesito algo que funcione no
> sólamente correctamente como dices, sino que además lo haga
> especialmente rápido, y tengo en mente "que hay una conspiración"
> para que esto solo funcionen con máquinas nuevas (en fin me pongo
> peliculero en la época de la guerra fria o bueno no sé si entendéis
> mi simil), pero la realidad es que creo que muchas cosas fallan o no
> se hacen lo suficintemente bien porque se usan librerías que hacen
> cosas a las que el programador bien por error o bien por
> inexperiencia o por imprevisión, mete la gamba a la hora de querer
> utilizar lo mismo para muchas cosas, sé que sino fuera gracias a eso,

Supongo que tienes algún ejemplo en mente, pero no estoy del todo seguro 
a qué te estás refiriendo con estos comentarios. Me imagino que estás 
hablando de algunos programas que no funcionan bajo MS-Windows tan bien 
como en versiones anteriores, por ejemplo. Otro ejemplo puede ser que 
algunos programas antiguos no ejecuten correctamente dando un mensaje de 
error en tiempo de ejecución.

> otras muchas  no se podrían haber llegado, pues creo que en este
> momento se abusa de la reutilidad de las librerías, en lugar de
> usarlas para los tareas convenientes, el caso es que puesto que todo
> el mundo va en otra dirección, hace mucho tiempo que la ola me arolló
> y aún estoy intentando despejarme, siendo fiel a mis principios, para
> hacer esto quiero hacer esto, y no 20 cosas más. Además quiero
> hacerlo cuando yo quiera, no cuando le dé la gana a otro... (proceso
> o programa se entiende...)
> 

Como he dicho, es mejor que te centres en lo que quieres hacer: aprender 
a programar. Puedes meterte en temas avanzados más tarde, porque te 
puedo asegurar que si no sabes programar jamás podrás crear tus propias 
bibliotecas.

> seguré tus consejos, al menos en intenciones, pero no aseguro nada,
> probablemente me tire más de una noche sin dormir....

Mi último consejo es que te centres en lo que quieres hacer. Es 
imposible aprender todo al detalle en tan poco tiempo, especialmente si 
estás empezando.


Hasta pronto,

Steven





Más información sobre la lista de distribución Cconclase