ARCHIVO HTML DE HISTORIA
===========================
La historia del hispascal comienza una aburrida tarde en la que pensé:
¿Por qué no hacer un pascal en Español? Conocía desde hace tiempo el freepascal que tenía
el codigo abierto así que me dije: Cambio el archivo donde tienen especificadas las palabras
reservadas y aú, ya está traducido.
Ja...
Tras varios intentos con un archivo llamado tokens.pas consegui cambiar muchos de ellos, pero...
el compilador no me compilaba porque necesitaba el rtl (run time library) ahora traducido a las
nuevas palabras reservadas.
Y... había muchos archivos... y qué mal... eso era perder tiempo manualmente traducir todos los
archivos. Al principio pensé en hacerme un traductor de palabras reservadas para traducirlo pero
me dijé: ¿Por qué reinventar la rueda? Así que primero les pregunté a los del freepascal en un
foro por algun trozo del codigo del IDE que tienen del fp, concretamente con la función
reemplazar... bueno muy complicado.
Luego me encontré un programa llamado "Another pas to html converter" ¡Guauh! Era bastante
fácil de entender así que... tras una primera versión que tiraba mucho de disco duro (ficheros),
hize otra que usaba listas enlazadas con lo que iba mucho más rápida.
Está version es la versión del pashis.exe que ahí hoy en día pero tiene algun fallo cuando se
encuentra algun numero en algun comentario. Pero bueno... ahí está y me ahorro mucho trabajo.
A la hora de trabajar con el hispascal "a mano" como hay que trabajar ahora hay tres fases:
1- Modificar el codigo fuente del nuevo compilador
2- Modificar el rtl del nuevo compilador
3- Compilar (y más cosas) para crear el nuevo compilador.
4- Probar a compilar archivos hispascal (muy simples e ir complicandolos)
con el nuevo compilador e ir probandolos.
5- Volver al 1 y al 2 hasta que salga bien.
6- Modificar el codigo fuente de algunas librerias muy usadas como puede ser la crt.
7- Otras cosas antes del lanzamiento al publico.
Segun creo estoy en el 84% o así de conseguir que compile cualquier cosa.
Así que vayamos por el punto 1:
ARCHIVO HTML DEL MODIFICAR EL CODIGO FUENTE DEL NUEVO COMPILADOR
=================================================================================
Modificar el codigo fuente del nuevo compilador
================================================
Veamos tenemos el codigo fuente del freepascal... pero necesitamos generar uno nuevo.
Bueno yo trabaja en el directorio d:\bailalo\s6 por razones que no vienen a cuento...
y en d:\bailalo\s6\pp tenía el codigo fuente del freepascal.
Así lo que hize fue hacerme una copia al pp2.
(¿Por qué no pp2... el segundo... rapido de escribir?)
Así que así estamos.
d:\bailalo\s6\pp
d:\bailalo\s6\pp2
Bueno... todo empezo como decía con el tokens.pas...
PONERLO AL PRINCIPIO DEL MODIFICAR EL CODIGO....
=====
Antes de todo.
Vamos a ver los buenos programadores como los del freepascal conforme van cambiando el codigo fuente
lo ponen en forma de comentario abajo del codigo... como yo creía que en dos días estaba hecho no
lo hize. Así que estos cambios conforme me acuerde estarán en estos html o txt si no los
llego a pasar a html.
=== FIN DE PONERLO AL ....
De momento todos los cambios que comente son cambios ya realizados... cuando no estén
realizados se especificará ad hoc.
Aunque creía que todos los cambios los había realizado en pp2 la cosa es que los cambios
relativos al compilador están hechos en pp\source\compiler y todo lo relativo al rtl
está hecho en pp2\source ... um... quizas en el futuro haya que cambiarlo pero por
ahora no merece la pena... porque si lo hice así sería por algo.
pp\source\compiler\tokens.pas
El tokens.pas tiene 3 o mas cambios:
1) Tiene una matriz con palabras reservadas en ingles (las que no están con un _ al principio)
están hay que traducirse al español cuidando dos cosas:
a) Han de estar en orden, primero en tamaño y luego por igual tamaño en orden alfabetico.
Es decir primero se ordena segun la longitud de la palabra y ante dos palabras de la misma longitud
se pone primero la que iría antes en una ordenación alfabetica.
b) Las palabras reservadas tal cual las vemos en pascal equivalen a una matriz más arriba, que
son las palabras tal cual pero con un _ delante de ellas. Por ejemplo, no sé, function tendrá su
equivalente como: _function.
Está matriz superior habrá que ordenarla de tal manera que concuerde con la inferior (palabras
tal cual) que en el apartado anterior hemos ordenado.
2) y 3) Cuando se definen las matrices en el tokens.pas original hay dos lineas que especifican
desde 2 hasta el "la maxima longitud de palabra reservada". Bueno pues como en Español tenemos
las conjunciones o e y, que son las que vamos a usar en vez de OR y AND. Así que esos 2 hay que
cambiarlos a 1.
4) Si os fijais bien hay unos comentarios primero con unos numeros sin orden y otros con orden...
son claro para no perder el orden de correspondencia entre las dos matrices citadas anteriormente. Hay además una traducción explicita en cada linea cambiada. (Por
ejemplo: GOTO --> VESA)
5) Introduje una función o una serie de instrucciones para comprobar que el tokens.pas iba
bien, crea un fichero que no sirve para nada. Estas instrucciones son:
=== Instrucciones
procedure create_tokenidx;
{ create an index with the first and last token for every possible token
length, so a search only will be done in that small part }
var
t : ttoken;
miarchivo : text; (*file of string[tokenidlen];*)
begin
assign(miarchivo,'reserva.txt');
rewrite(miarchivo);
fillchar(tokenidx^,sizeof(tokenidx^),0);
for t:=low(ttoken) to high(ttoken) do
begin
if not arraytokeninfo[t].special then
begin
if ord(tokenidx^[length(arraytokeninfo[t].str),arraytokeninfo[t].str[1]].first)=0 then
begin(* Para que solo escriba con el if*)
tokenidx^[length(arraytokeninfo[t].str),arraytokeninfo[t].str[1]].first:=t;
write(miarchivo,(arraytokeninfo[t].str));
writeln(miarchivo,'');
end;(* Para que solo escriba con el if *)
tokenidx^[length(arraytokeninfo[t].str),arraytokeninfo[t].str[1]].last:=t;
end;
end;
close(miarchivo);
end;
=== Fin de instrucciones
===Estas instrucciones hay que compararlas con el tokens.pas no vaya a ser que hayamos
borrado una cosa que estaba bien del tokens.pas y la hayamos "cagado".
===
===Esto ponerlo con el color "Te estoy contando una historia"
No tarde en darme cuenta que aunque cambiase todo el rtl a las nuevas palabras reservadas
el tokens.pas no era el unico que influia.
=== Esto ponerlo... fin
Nota: La correspondencia de las palabras claves del Pascal al Hispascal están en los archivos
antes.txt(Para Pascal) y despues.txt (Su equivalente en Hispascal) del directorio s6\cambiar tokens
===El antes.txt y despues.txt hay que ponerlos como dos html y diferentes y luego en forma
de tabla en un solo html======
Aquí adjunto "copiado y pegado" el antes.txt y el despues.txt
antes.txt
==========
OR
AND
IN
IS
XOR
MOD
AS
AT
OR
AND
OF
IN
IS
NOT
XOR
IF
WITH
ASM
END
DO
READ
MOD
USES
CASE
AS
NIL
ELSE
TYPE
GOTO
FOR
DOWNTO
NEAR
CLASS
FAIL
FALSE
TO
FAR
STRING
NEW
SET
EXIT
ON
FORWARD
INDEX
BEGIN
NAME
OBJECT
REPEAT
BREAK
UNIT
ARRAY
TRUE
FILE
DEFAULT
WRITE
EXCEPT
EXPORTS
EXTERNAL
FINALLY
FUNCTION
MESSAGE
PRIVATE
PUBLIC
SELF
SYSTEM
ABSOLUTE
CPPCLASS
CONTINUE
DYNAMIC
THEN
LABEL
EXPORT
STORED
UNTIL
INHERITED
INTERFACE
LIBRARY
SYSCALL
STDCALL
WHILE
OPERATOR
PROGRAM
RECORD
REGISTER
ABSTRACT
IOCHECK
NODEFAULT
ASMNAME
OTHERWISE
PROPERTY
PROTECTED
PUBLISHED
RESIDENT
RESULT
OVERLOAD
ASSEMBLER
INLINE
INTERRUPT
SAFECALL
INTERNPROC
FINALIZATION
RESOURCESTRING
PROCEDURE
OPENSTRING
IMPLEMENTATION
INITIALIZATION
SAVEREGISTERS
STATIC
TRY
WRITE
WRITELN
ASSIGNED
READ
READLN
OFS
SIZEOF
TYPEOF
LOW
HIGH
SUCC
EXCLUDE
INCLUDE
BREAK
CONTINUE
STR
ASSERT
ADDR
void
word
ulong
longint
qword
int64
char
widechar
shortstring
longstring
ansistring
widestring
openshortstring
boolean
void_pointer
char_pointer
void_farpointer
openchararray
file
s32real
s64real
s80real
parent
length
mlength
SINGLE
DOUBLE
EXTENDED
POINTER
FARPOINTER
SHORTSTRING
LONGSTRING
STRINGANSI
WIDESTRING
BOOLEAN
BYTEBOOL
WORDBOOL
LONGBOOL
CHAR
WIDECHAR
TEXT
INT64
TYPEDFILE
openchararray
DWORD
NEAR
FAR
LABEL
LLABEL
INTEGER
shortint
smallInt
longword
===Fin del antes.txt ====
despues.txt
===========
O
Y
EN
ES
OR
RES
COMO
A
O
Y
DE
EN
ES
NO
OR
SI
CON
ENS
FIN
HAZ
LEE
RES
USA
CASO
COMO
NULO
SINO
TIPO
VESA
PARA
BAJAA
CERCA
CLASE
FALLO
FALSO
HASTA
LEJOS
LINEA
NUEVO
PONER
SALIR
SOBRE
EMPUJA
INDICE
INICIO
NOMBRE
OBJETO
REPITE
ROMPER
UNIDAD
VECTOR
VERDAD
ARCHIVO
DEFECTO
ESCRIBE
EXCEPTO
EXPORTA
EXTERNO
FINALME
FUNCION
MENSAJE
PRIVADO
PUBLICO
SIMISMO
SISTEMA
ABSOLUTO
CLASECPP
CONTINUA
DINAMICO
ENTONCES
ETIQUETA
EXPORTAR
GUARDADO
HASTAQUE
HEREDADO
INTERFAZ
LIBRERIA
LLAMASIS
LLAMASTD
MIENTRAS
OPERADOR
PROGRAMA
REGISTRO
REGISTRAR
ABSTRACTO
CHEQUEOES
NODEFECTO
NOMBREENS
OTRAFORMA
PROPIEDAD
PROTEGIDO
PUBLICADO
RESIDENTE
RESULTADO
SOBRECARGA
ENSAMBLADOR
ENTRELINEAS
INTERRUMPIR
LLAMASEGURA
PROCINTERNO
FINALIZACION
STRINGFUENTE
PROCEDIMIENTO
STRINGABIERTO
IMPLEMENTACION
INICIALIZACION
SALVAREGISTROS
ESTATICO
PRUEBA
ESCRIBE
ESCRIBELN
ASIGNADO
LEE
LEELN
DES
DETAMANO
DETIPO
BAJO
ALTO
SUC
EXCLUYE
INCLUYE
ROMPER
CONTINUA
LIN
ASERT
DIREC
vacio
palabra
largou
entlargo
palq
ent64
car
caramplio
lincorta
linlarga
linansi
linamplia
lincortaabierta
booleano
puntero_vacio
puntero_car
punterolejano_vacio
vectorcarabierto
archivo
reals32
reals64
reals80
padre
longitud
mlongitud
SIMPLE
DOBLE
EXTENDIDO
PUNTERO
PUNTEROLEJANO
LINCORTA
LINLARGA
LINANSI
LINAMPLIA
BOOLEANO
BOOLBYTE
BOOLPAL
BOOLLARGO
CAR
CARAMPLIO
TEXTO
ENT64
ARCHIVOTIPADO
vectorcarabierto
PALD
CERCA
LEJOS
ETIQUETA
ETIQUETAL
ENTERO
entcorto
Entpequeno
pallarga
====Fin de despues.txt====
===Te cuento una historia
Vamos a ver a parte del tokens.pas tambien modifique otros archivos, lo que como no estoy
seguro cogeré los que me parezcan que no serán seguramente todos. De momento veo que en el
directorio:
bailalo\s6\ppesp hay de esos archivos que son como copias de seguridad de archivos que seguramente haya modificado.
Estos son: scanner.pas ra386att.pas ra386dir.pas psystem.pas symtable.pas
=== Fin te cuento...
==== bailalo\s6\pp\source\compiler\scanner.pas
===Descripción de archivo
Este archivo creo que comprueba la sintaxis o al menos la traduce a tokens para que el
freepascal la pueda entender.
===Fin descripción de archivo
En la función: function is_keyword(const s:string):boolean;
if not (length(s) in [1..tokenidlen]) then
(* Cambio el 1 por el 2 para que admita tokens de 1 char *)
En la función: {****************************************************************************
Token Scanner
****************************************************************************}
procedure tscannerfile.readtoken;
if (pattern[1]<>'_') and (length(pattern) in [1..tokenidlen]) then
(* Cambio el 2 por el 1 para que admita tokens de 1 char *)
==== Para el futuro
scanner.pas se podría usar para sustituto del pashis. Pero eso más en adelante.
=== Fin de Para el futuro
==== bailalo\s6\pp\source\compiler\ra386att.pas
En: const cambio:
token2str : array[tasmtoken] of tasmkeyword=(
(* Cambio .word por .palabra *)
(* Cambio .text por .texto *)
(* Cambio integer por entero *)
'','Label','LLabel','string','entero',
'float',',','(',
')',':','.','+','-','*',
';','identifier','register','opcode','/','$',
'.byte','.palabra','.long','.quad','.globl',
'.align','.balign','.p2align','.ascii',
'.asciz','.lcomm','.comm','.single','.double','.tfloat',
'.data','.texto','FIN',
(* Cambio por end por fin y type por tipo *)
'TIPO','%','<<','>>','!','&','|','^','~');
=== Para el futuro
Ojo con el FIN que está en mayusculas habrá que mirar como estaba el end en el archivo original
y si estaba en minusculas este pasarlo a minusculas.
Podríamos cambiar algunos de estos strings para que concidan con los del tokens.pas es decir
que "los cojan" de ahí para que luego para traducir a otros lenguajes sea más fácil.
En ra386att.pas probablemente haya más cambios, pero mirandolo por encima no he encontrado nada.
=== Fin de Para el futuro
=== bailalo\s6\pp\source\compiler\ra386dir.pas
Aparentemente este no está modificado. Habrá que mirar en el directorio
ppesp si se hizo alguna modificación y... lo miro y aparentemente nada. Pero otro
día hay que mirarlo con mayor detenimiento.
=== bailalo\s6\pp\source\compiler\psystem.pas
=== Te cuento una historia
Aqui la fecha está cambiada así que seguro que hay algún cambio
=== Fin de Te cuento una historia
Viendo el archivo se ve claramente lo que he cambiado, muchas palabras claves han cambiado.
=== Futuro
Habrá que preguntar en la lista de correo si al cambiar el psystem.pas que es el que interpreta
la unidad system estamos obligando a traducir todo el rtl a hispascal cuando no hace falta.
=== Fin de Futuro
=== bailalo\s6\pp\source\compiler\symtable.pas
===Futuro
Estas lineas hay que ver si se han de cambiar y cambiarlas en su caso:
const
overloaded_names : array [first_overloaded..last_overloaded] of string[16] =
('plus','minus','star','slash','equal',
'greater','lower','greater_or_equal',
'lower_or_equal',
'sym_diff','starstar',
'as','is','in','or',
'and','div','mod','not','shl','shr','xor',
'assign');
Además:
No encuentro nada cambiado en un futuro hay que mirar porque seguro que hay algo cambiado
===Fin de Futuro
2- HTML DEL Modificar el rtl del compilador
===================================
Esto no tiene ningun secreto es coger palabra reservada por palabra reservada, y no strings, salvo
excepciones... e ir traduciendo.
Para eso usamos la utilidad PASHIS y luego verificamos que se ha traducido bien al compilar
y ver los fallos que suelen ser:
a) Variables del pascal antiguo que ahora pasan a ser palabras reservadas.
Es decir por ejemplo la variable vesa en pascal es una palabra reservada en hispascal.
Y como bien sabeis las palabras reservadas no se pueden usar como variables y mejor así
porque sino no detectaríamos los fallos.
=== REGLA A SEGUIR PROPIA DEL HISPASCAL
Así que la regla a seguir es: añadir al principio la primera letra de la palabra. vesa pasa a
ser vvesa.
=== FIN REGLA...
b) Numeros de los comentarios, normalmente del final, que se traducen mal... hay que arreglarlos
manualmente respetando el comentario original de los desarrolladores del freepascal.
ESTO A DE ESTAR AQUI DENTRO DEL MODIFICAR EL RTL... Y A LA VEZ
COPIADO EN UN HTML APARTE TITULADO... COMO USAR LA UTILIDAD PASHIS
USO DE LA UTILIDAD PASHIS
==========================
===Te cuento una historia -- Inicio
El PASHIS no tiene una mierda de comentarios... quizas alguno. Pero es un ejemplo de lo que no
se debe hacer en programación. Pero para mi representa una proeza porque consegui que gracias
al algoritmo de otro para aislar palabras reservadas poder cambiarlas y... así poder traducir
el hispascal.
Si necesitais usar el codigo mandadme un email con lo que no entendais. E intentaré
que lo entendais.
Ah, y encima el codigo está mitad en ingles y en español, ya la ostia hay que saber 3 idiomas
para entenderlo: pascal, inglés y español.
===Te cuento una historia -- Fin
La utilidad PASHIS si no mal recuerdo se encuentra en el directorio:
bailalo\s6\cambiar tokens
===Esto añadirlo como nota ====
La utilidad PASHIS tiene bugs y por ello necesita ser mejorada.
El codigo fuente de la misma está en bailalo\s6\cambiar tokens
El archivo principal es: pashis.pas y se necesitan estos dos archivos para poder compilarlo:
upashtm.pp
reser.pp
En un futuro hay que hacer que funcione de la siguiente manera:
***Las variables pascal que van a ser palabras reservadas del hispascal renombrarlas como:
ellas mismas y delante la primera letra de ellas.
ejemplo pasa a ser eejemplo
****
Y luego aplicar el algoritmo que usa ahora el programa.
Hay que tener cuidado de que en el antes.txt y el despues.txt no se encuentren dos palabras
iguales, es decir, por ejemplo var y var que no se traduce, porque entonces var se traduciría
a vvar y nosotros no queremos eso.
El antes.txt y el despues.txt solo tendrán palabras diferentes. Ya haremos una tabla html
con la correspondencia entre Pascal e Hispascal incluyendo palabras reservadas que se incluyen
igual.
Y para que funcione en el directorio donde este el pashis se necesita el antes.txt y el
despues.txt. Por eso el BAT (Más en adelante) los copia temporalmente al directorio donde los
archivos que estes traduciendo.
===Fin de esto añadirlo como nota ====
Su sintaxis es:
PASHIS archivo_origen.ext
o
PASHIS archivo_origen.ex
Donde ext es una extensión de 3 letras y ex es una extensión de 2 letras.
No obstante esto lo podemos automatizar con un BAT llamado:
JAJA.BAT
La explicación esta en el archivo como.txt que aquí "copio y pego":
=Como usar el pashis mediante el jaja
Sintaxis tipo:
jaja jeje *.EXT UNIDAD
Los *.EXT se convertiran en *.sal y entonces
habra que borrar los *.ext y renombrar los *.sal a *.ext.
La palabra UNIDAD habrá cambiarla por la unidad donde teneis descomprimido el zip del
hispascal, es decir si lo teneis en d:\bailalo, como debería de ser para pasar
en directorio los *.inc a *.sal traducidos. Así pues habría que escribir:
jaja jeje *.inc D:
Coge todos los *.pp por ejemplo y los convierte en *.sa
Y coge todos los *.inc por ejemplo y los convierte en *.sal
Recalcar que extensión de longitud 2: sa, longitud 3: sal.
¿Porque esto... tu traduces los inc por ejemplo. Corriges los sal con el original inc
al lado para ver que es lo que tiene que hacer el programa... y una vez has comprobado
todos los ficheros por encima borras los *.inc.
Y renombras los *.sal a *.inc. Analogamente hay que hacer lo mismo con los *.pp
Un esquema:
*.inc ==> *.sal
*.sal ==Corregimos==> *.sal
Borramos *.inc
Renombrarmos los *.sal a *.inc
NOTA MUY IMPORTANTE SOBRE EL PASHIS PARA QUE FUNCIONE EN CUALQUIER DIRECTORIO DEBEIS AÑADIRLO
EN EL PATH EN NUESTRO EJEMPLO ANTERIOR DEBEREIS ESCRIBIR:
PATH=%PATH%;D:\BAILALO\S6\CAMBIA~1
Todo esto hay que repetirlo para todos los directorios del pp2 que cuelgan de source
ARCHIVO HTML DEL: 3- Compilar (y más cosas) para crear el nuevo compilador.
=== Te cuento una historia
Este es el punto del que menos me acuerdo de como se hacía.
=== Fin de Te cuento una historia
He encontrado un archivo readme. en bailalo\s6\pp\source\compiler que me dice de ejecutar:
mppc386.bat
Pero este me sobreescribiría el ppc386 que tengo en ese directorio no me vale.
Y me parece que no lo compilaba así. Veamos en un pdf online.
http://www.freepascal.org/docs/prog.pdf
Este en concreto. Y nos vamos a Compiling the Compiler yourself.
Y a Compiling by hand.
Hay varias opciones, seguramente haya usado varias, y me haya quedado con una de ellos.
No me acuerdo cual use.
Voy a copiar las instrucciones, para tenerlas presentes si alguna vez las cambian.
=== Extracto del prog.pdf
F.4 Compiling by hand
Compiling by hand is difficult and tedious, but can be done. We’ll treat the compilation of RTL and
compiler separately.
F.4.1 Compiling the RTL
To recompile the RTL, so a new compiler can be built, at least the following units must be built, in
the order specified:
loaders the program stubs, that are the startup code for each pascal program. These files have the .as
extension, because they are written in assembler. They must be assembled with the GNU as
assembler. These stubs are in the OS-dependent directory, except for LINUX, where they are
in a processor dependent subdirectory of the linux directory (i386 or m68k).
system the system unit. This unit is named differently on different systems:
Only on GO32v2, it’s called system.
For LINUX it’s called syslinux.
For WINDOWS NT it’s called syswin32.
For OS/2 it’s called sysos2
This unit resides in the OS-dependent subdirectories of the RTL.
strings The strings unit. This unit resides in the inc subdirectory of the RTL.
dos The dos unit. It resides in the OS-dependent subdirectory of the RTL. Possibly other units will
be compiled as a consequence of trying to compile this unit (e.g. on LINUX, the linux unit will
be compiled, on go32, the go32 unit will be compiled).
objects the objects unit. It resides in the inc subdirectory of the RTL.
To compile these units on a i386, the following statements will do:
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 -Us -Sg syslinux.pp
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 ../inc/strings.pp
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 dos.pp
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 ../inc/objects.pp
These are the minimum command-line options, needed to compile the RTL.
For another processor, you should change the i386 into the appropriate processor. For another
operating system (target) you should change the syslinux in the appropriate system unit file, and you
should change the target OS setting (-T).
Depending on the target OS there are other units that you may wish to compile, but which are not
strictly needed to recompile the compiler. The following units are available for all plaforms:
objpas Needed for Delphi mode. Needs -S2 as an option. Resides in the objpas subdirectory.
sysutils many utility functions, like in Delphi. Resides in the objpas directory, and needs -S2 to
compile.
typinfo functions to access RTTI information, like Delphi. Resides in the objpas directory.
math math functions like in Delphi. Resides in the objpas directory.
mmx extensions for MMX class Intel processors. Resides in in the i386 directory.
getopts a GNU compatible getopts unit. resides in the inc directory.
heaptrc to debug the heap. resides in the inc directory.
F.4.2 Compiling the compiler
Compiling the compiler can be done with one statement. It’s always best to remove all units from
the compiler directory first, so something like
rm *.ppu *.o
on LINUX, and on DOS
del *.ppu
del *.o
After this, the compiler can be compiled with the following command-line:
ppc386 -Tlinux -Fu../rtl/linux -di386 -dGDB pp.pas
So, the minimum options are:
1. The target OS. Can be skipped if you’re compiling for the same target as the compiler you’re
using.
2. A path to an RTL. Can be skipped if a correct ppc386.cfg configuration is on your system. If
you want to compile with the RTL you compiled first, this should be ../rtl/OS (replace the OS
with the appropriate operating system subdirectory of the RTL).
3. A define with the processor you’re compiling for. Required.
4. -dGDB is not strictly needed, but is better to add since otherwise you won’t be able to compile
with debug information.
Table F.1: Possible defines when compiling FPC
Define does what
USE_RHIDE Generates errors and warnings in a format recognized
by RHIDE.
TP Needed to compile the compiler with Turbo or Borland Pascal.
Delphi Needed to compile the compiler with Delphi from Borland.
GDB Support of the GNU Debugger.
I386 Generate a compiler for the Intel i386+ processor family.
M68K Generate a compiler for the M68000 processor family.
USEOVERLAY Compiles a TP version which uses overlays.
EXTDEBUG Some extra debug code is executed.
SUPPORT_MMX only i386: enables the compiler switch MMX which
allows the compiler to generate MMX instructions.
EXTERN_MSG Don’t compile the msgfiles in the compiler, always use
external messagefiles (default for TP).
NOAG386INT no Intel Assembler output.
NOAG386NSM no NASM output.
NOAG386BIN leaves out the binary writer.
5. -Sg is needed, some parts of the compiler use goto statements (to be specific: the scanner).
So the absolute minimal command line is
ppc386 -di386 -Sg pp.pas
You can define some other command-line options, but the above are the minimum. A list of recog-nised
options can be found in table (F.1).
This list may be subject to change, the source file pp.pas always contains an up-to-date list.
=== Fin extracto prog.pdf
Bueno ya está. Voy a remirarmela otra vez.
Vamos a ver segun nos dice antes de poder hacer un nuevo compilador tenemos que tener compilado
el rtl.
Deberemos ejecutar:
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 -Us -Sg syslinux.pp
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 ../inc/strings.pp
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 dos.pp
ppc386 -Tlinux -b- -Fi../inc -Fi../i386 -FE. -di386 ../inc/objects.pp
que traducido a lo que es nuestro DOS será:
ppc386 -TGO32V2 -b- -Fi../inc -Fi../i386 -FE. -di386 -Us -Sg system.pp
ppc386 -TGO32V2 -b- -Fi../inc -Fi../i386 -FE. -di386 ../inc/strings.pp
ppc386 -TGO32V2 -b- -Fi../inc -Fi../i386 -FE. -di386 dos.pp
ppc386 -TGO32V2 -b- -Fi../inc -Fi../i386 -FE. -di386 ../inc/objects.pp
Creo que no me equivoco al poner como target GO32V2, DOS no me suena como tal.
Vale y cambio el syslinux.pp por system.pp
Ahora me surge la duda donde demonios (en que directorio) ¿hay que ejecutar esto?
Bueno vamos a suponer... que lo hacemos en ... tal y como están los directorios no veo donde hay que hacerlo... bueno... creo que el rtl al final no lo compile. Este punto más tarde lo revisaré.
=== Futuro
En fpc-devel Preguntar la mejor manera de compilar un nuevo compilador con un nuevo rtl y si ese rtl hay que cambiarlo o no.
=== Fin de Futuro
Vayamos con compilar el compilador.
Primero en el directorio del compilador: bailalo\s6\pp\source\compiler
*** Nota
Para que esto funcione ha de estar en el path, el ppc386 que es el compilador original del
pascal que se encuentra en:
bailalo\s6\pp\bin\go32v2
Por ejemplo, para añadir el path sería:
path=%path%;d:\bailalo\s6\pp\bin\go32v2
*** Fin Nota
hay que borrar los *.ppu y los *.o
del *.ppu
y
del *.o
Luego la instrucción:
ppc386 -Tlinux -Fu../rtl/linux -di386 -dGDB pp.pas
que será para nosotros:
ppc386 -TGO32V2 -Fu..\rtl\go32v2 -di386 -dGDB pp.pas
He estado mirando y... el directorio bailalo\s6\pp\source\rtl\go32v2
no existe... voy a suponer que... YA ME ACUERDO... Compile el compilador sin el rtl.
Y esto se hace así:
ppc386 -di386 -Sg pp.pas
en el directorio: bailalo\s6\pp\source\compiler
Esto te crea, si va bien que aun no lo he comprobado, un pp.exe que es el que se copia
al directorio pp2\bin\go32v2 y se borra el pp.exe de donde estaba antes, es decir del
bailalo\s6\pp\source\compiler.
Con esto ya tenemos nuestro compilador: pp.exe
que sin embargo necesita buscar un rtl... para compilar cualquier tipo de archivo.
=== Futuro
Comprobar que la compilación en verdad es así. Porque sino no se puede repetir el proceso y...
es una faena. Yo tenía un problema con la inclusión de más de 3 directorios en la linea de comandos, o aquí o en el siguiente apartado de compilar archivos hispascal. Hay que ver ese error.
Yo recuerdo que había que hacer algo de ensamblador y que necesitabamos unas utilidades gnu para ensamblar.
=== Fin de Futuro
HTML DEL 4- Probar a compilar archivos hispascal (muy simples e ir complicandolos)
con el nuevo compilador e ir probandolos.
Ahora trabajaremos siempre en el directorio pp2\bin\go32v2
=== Te cuento una historia.
Bueno esto ya me acuerdo más .
=== Fin de Te cuento una historia.
Vamos a ver las instrucciones para hacer esto están en el comando.txt del
pp2\bin\go32v2
Que aqui copio y pego y explico:
pp -Fu..\..\source\rtl\go32v2\ -Fi..\..\source\rtl\inc -Fi..\..\source\rtl\inc\graph -Fi..\..\source\rtl\i386 -di386 -vo -Sg pru.pas
pp -Fu..\..\source\rtl\go32v2\ -Fi..\..\source\rtl\inc -Fi..\..\source\rtl\inc\graph -Fi..\..\source\rtl\i386 -di386 -va -Sg pru.pas
La primera linea de comandos compila enseñando la información minima debug (para encontrar errores) y la segunda la máxima. Cuando haya algun error usaremos la -va pero si compila aparentemente bien ¿por qué ver todo el proceso?
Le estoy diciendo que me incluya los siguientes directorios de unidades:
..\..\source\rtl\go32v2
Y los siguientes directorios de "include". No se muy bien lo que significa pero los otros los incluimos como unidades y estos como incude.
..\..\source\rtl\inc
..\..\source\rtl\inc\graph
..\..\source\rtl\i386
Y el -di386 es obligatorio porque usamos un procesador 386 (No estoy seguro de la explicación
pero este parametro es obligatorio).
Y el -Sg tambien es obligatorio.
=== Nota aclarativa
Estos directorios de antes, son en realidad.
d:\bailalo\s6\pp2\source\rtl\go32v2
d:\bailalo\s6\pp2\source\rtl\inc
d:\bailalo\s6\pp2\source\rtl\inc\graph
d:\bailalo\s6\pp2\source\rtl\i386
=== Fin Nota aclarativa
Claro está el pru2.pas se puede cambiar por otro archivo hispascal, de echo la primera prueba
fue con pru.pas.
=== Nota futuro
Miro un momento los directorios que logro incluir:
d:\bailalo\s6\pp2\source\rtl\go32v2
d:\bailalo\s6\pp2\source\rtl\inc
d:\bailalo\s6\pp2\source\rtl\inc\graph
d:\bailalo\s6\pp2\source\rtl\i386
Y me fijo, a ver, si falta alguno del rtl,
No, aparentemente ninguno. Lo del error de directorios quizas nunca fue.
=== Fin Nota futuro
=== HTML DEL 5- Volver al 1 y al 2 hasta que salga bien. No hay nada que explicar es muy obvio.
=== HTML DEL 6- Por ejemplo lo que es la unidad crt, que en un programa pascal se usa con
uses crt;
que yo creo he traducido como usa.
Entonces será:
usa crt;
Y buscará la libreria crt... y esa libreria tiene por ejemplo...la función:
=== Te cuento una historia
Bueno esto se queda... esto en mi desarrollo no lo probé. Así que no sé si por ejemplo la
unidad crt ya se encuentra ...
=== Fin Te cuento una historia
bueno lo miro un momento...
La libreria está en: PP2\source\rtl\go32v2 así que no hay que incluirla manualmente desde la linea de comandos. Bueno la cosa está... la veo y no está traducida.
Cosas como: clrscr,keypressed y readkey que son muy usadas están sin traducir.
=== Futuro
No hay que traducir todas las librerias. Sólo las fundamentales para el estudio didáctico del
hispascal.
=== Fin Futuro
De esto nos ocuparemos una vez el compilador vaya medio bien.
=== HTML DEL 7- Otras cosas antes del lanzamiento al publico.
Primero hay que hablar con los del fpc-devel para ver:
1) Como instalo la nueva distribución con su instalador,
1a) Sin traducirlo a Español.
1b) Traduciendolo al Español.
2) Como instala su instalador... y ofrecer un instalador como el de nullsoft, freeware,
de interfaz gráfica más comoda.
Segundo hay que portarlo a WIN32 o se hace a partir del win32 del 1.0.4 o a partir del dos
cambiando cuatro cosas nada más. Ya que me parece que en Windows no hay multitarea en DOS.
Tercero. No hay que perder de vista las aplicaciones PASHIS y la posible HISPAS.
Y tampoco la aplicación ipcute, que puede ser el ide por defecto si llegamos a un acuerdo con su desarrollador.
Ipcute tiene actualmente su pagina web en:
www.ipcute.com
http://ipcute.free.fr/ipaccueil.php3
http://ipcute.free.fr/ipwelcome.php3
Cuarto. Hay que buscar los que hicieron manuales en español de Pascal y pedirles renombren unas cuantas palabras clave a hispascal.
Quinto. Un manual para los que quieran portar el hispascal a otro lenguaje. Y bueno una vez lo consigan... download de los ejecutables.
Estado de la documentación:
-----------------------------
Arreglado lo del pashis. Arreglado lo del tokens.pas excepto:
Acordarse, al final de escribir la documentacion, de las instrucciones añadidas en el tokens.pas
que puede ser que sobreescriban una función que sí valía.
Añadido el scanner y el ra386att todos ellos del pp. Añadido el ra386dir.pas,el psystem.pas y el symtable.pas.
Importante de acordarse: Habrá que preguntar en la lista de correo si al cambiar el psystem.pas que es el que interpreta
la unidad system estamos obligando a traducir todo el rtl a hispascal cuando no hace falta.
Establecido un poco de orden ahora sabemos casí seguro que hemos terminado los puntos 1 y 2.
Así que a la próxima hay que seguir con punto 3, recordar que para compilar el compilador hacia la forma paso a paso más larga, antes de mirarlo en el pdf de freepascal, mirar a ver si lo tengo apuntado en algun txt.
Sólo falta pasar la documentación a html. Revisar los puntos escritos ad hoc para revisar. Y crear los html necesarios, a parte de los 7 principales, añadir estos html:
Futuro - (Recopilación de tareas a hacer los desarrolladores)
Documentación "contada"
Documentación sin contar
Como usar basicamente el MSDOS para desenvolverse como desarrollador de hispascal
Principios de pascal con links a manuales de pascal.
Links a manuales de hispascal