Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Noticias (https://www.clubdelphi.com/foros/forumdisplay.php?f=34)
-   -   Google lanzará un nuevo lenguaje de programación, llamado "Dart" (https://www.clubdelphi.com/foros/showthread.php?t=75635)

roman 11-10-2011 19:09:58

C es un buen lenguaje. Que no les guste o no lo entiendan es otra cosa. ;)

// Saludos

Al González 11-10-2011 19:51:42

Yo lo entiendo y me gusta programar en él (no tanto como en Delphi, claro). Lo que no me gusta es que sea tan espantoso y se requiera más esfuerzo para su lectura. :p

roman 11-10-2011 19:58:20

Yo más bien creo que hay mucho código C escrito horriblemente. Porque es cierto, puede ser tan críptico como queramos. Pero un programa C bien escrito no tiene nada de ilegible.

// Saludos

Casimiro Notevi 11-10-2011 20:22:15

Cuando yo usaba C, antes de delphi, mi código fuente era muy entendible. Es cierto que muchos escriben lo que parecen ser "jeroglíficos egipcios", no sé por qué.
Recuerdo que por aquellas fechas mi comentario era algo así como: "El lenguaje C es tan potente como el ensamblador y tan fácil como basic" :D

Julián 12-10-2011 00:45:42

Se puede escribir tan horriblemente con delphi como con c. Y se puede escribir muy bien tanto con uno como con otro.

Nunca entederé a quienes sostienen que tal o cual lenguaje es horrible porque use {llaves} en lugar de "begin" y "end". Que me digan (yo mismo lo digo) que java es lento porque es interpretado o porque produce aplicaciones muy feas pues vale, pero no entendería que es horrible por usar {llaves}.

Un saludo!

mamcx 12-10-2011 01:08:55

Cita:

Empezado por Julián (Mensaje 415299)
Se puede escribir tan horriblemente con delphi como con c. Y se puede escribir muy bien tanto con uno como con otro.

No se puede. Prueba definitiva?

Bsucar en google:

delphi obfuscate code
c obfuscate code
perl obfuscate code

Veran que no hay ejemplos de codigo obscurecido a mano en delphi, en cambio hay hasta TUTORIALES para hacerlo en c & perl.

http://www0.us.ioccc.org/main.html

Cita:

To write the most Obscure/Obfuscated C program under the rules below
Código PHP:

                                  #include\
                                  
<stdio.h>
                     
#include                <stdlib.h>
                     #include                <string.h>

                    #define w "Hk~HdA=Jk|Jk~LSyL[{M[wMcxNksNss:"
                   #define r"Ht@H|@=HdJHtJHdYHtY:HtFHtF=JDBIl"\
                  
"DJTEJDFIlMIlM:HdMHdM=I|KIlMJTOJDOIlWITY:8Y"
                 
#define S"IT@I\\@=HdHHtGH|KILJJDIJDH:H|KID"\
                
"K=HdQHtPH|TIDRJDRJDQ:JC?JK?=JDRJLRI|UItU:8T"
               
#define _(i,j)L[i=2*T[j,O[i=O[j-R[j,T[i=2*\
              
R[j-5*T[j+4*O[j-L[j,R[i=3*T[j-R[j-3*O[j+L[j,
             
#define t"IS?I\\@=HdGHtGIDJILIJDIItHJTFJDF:8J"

    #define y                  yy(4),yy(5),                yy(6),yy(7)
  #define yy(              i)R[i]=T[i],T[i ]            =O[i],O[i]=L [i]
#define Y _(0          ], 4] )_ (1 ], 5] )_ (2      ], 6] )_ (3 ], 7] )_=1
#define v(i)(      (( R[ i ] * _ + T [ i ]) * _ + O [ i ]) * _ + L [ i ]) *2
double b 32  ,,,,,int Q [], T8] ,[], L8] ;
#define q( Q,R ) R= *X ++ % 64 *8 ,R |= *X /8 &7 ,Q=*X++%8,Q=Q*64+*X++%64-256,
# define  p      "G\\QG\\P=GLPGTPGdMGdNGtOGlOG"   "dSGdRGDPGLPG\\LG\\LHtGHtH:"
#  define W         "Hs?H{?=HdGH|FI\\II\\GJlHJ"    "lFL\\DLTCMlAM\\@Ns}Nk|:8G"
# define   U           "EDGEDH=EtCElDH{~H|AJk}"       "Jk?LSzL[|M[wMcxNksNst:"
#  define u                  "Hs?H|@=HdFHtEI"             "\\HI\\FJLHJTD:8H"
char  *   x                   ,*, ( * )[               640],z[3]="4_",
*
"4,8O4.8O4G" r U "4M"u S"4R"u t"4S8CHdDH|E=HtAIDAIt@IlAJTCJDCIlKI\\K:8K"U
 
"4TDdWDdW=D\\UD\\VF\\FFdHGtCGtEIDBIDDIlBIdDJT@JLC:8D"t"4UGDNG\\L=GDJGLKHL\
FHLGHtEHtE:"
p"4ZFDTFLT=G|EGlHITBH|DIlDIdE:HtMH|M=JDBJLDKLAKDALDFKtFKdMK\
\\LJTOJ\\NJTMJTM:8M4aGtFGlG=G|HG|H:G\\IG\\J=G|IG|I:GdKGlL=G|JG|J:4b"
W
S
"4d"W t t"4g"r w"4iGlIGlK=G|JG|J:4kHl@Ht@=HdDHtCHdPH|P:HdDHdD=It\
BIlDJTEJDFIdNI\\N:8N"
w"4lID@IL@=HlIH|FHlPH|NHt^H|^:H|MH|N=J\\D\
J\\GK\\OKTOKDXJtXItZI|YIlWI|V:8^4mHLGH\\G=HLVH\\V:4n" 
u t t
"4p"W"IT@I\\@=HdHHtGIDKILIJLGJLG:JK?JK?=JDGJLGI|MJDL:8M4\
rHt@H|@=HtDH|BJdLJTH:ITEI\\E=ILPILNNtCNlB:8N4t"
W t"4u"
p"4zI[?Il@=HlHH|HIDLILIJDII|HKDAJ|A:JtCJtC=JdLJtJL\
THLdFNk|Nc|\
:8K"
main (
int C,char**        A) {for(x=A[1],i=calloc(strlen(x)+2,163840);
C-1;C<3?Q=_=       0,(z[1]=*x++)?((*x++==104?z[1]^=32:--x), =
strstr(Z,z))      &&(X+=C++):(printf("P2 %d 320 4 ",V=b/2+32),
V*=2,s=Q=0,C     =4):C<4?Q-->0?i[(int)((l+=o)+b)][(int)(k+=B)
]=
1:_?_-=.5/    256,o=(v(2)-(l=v(0)))/(Q=16),B=(v(3)-(k=v(1)
))/
Q:*X>60?y   ,q(L[4],L[5])q(L[6],L[7])*X-61||(++X,y,y,y),
Y:*X>57?++X,  y,Y:*>54?++X,b+=*X++%64*4:--C:printf("%d "
,i[Q][s]+i[][s+1]+i[Q+1][s]+i[Q+1][s+1])&&(Q+=2)<V||(Q=
0,s+=2)<640
||(C=1));} 

Código PHP:

#include <ncurses.h>/*****************************************************/
            
int               m[256                   ] [         256   ],a
 
,b   ;;;   ;;;   WINDOW*w;   char*l=""   "\176qxl"   "q"   "q"   "k"   "w\
xm"   "x"   "t"         "j"         "v"         "u"         "n"         
,Q[
 ]=   
"Z"   "pt!ftd`"   "qdc!`eu"   "dq!$c!nnwf"/**   ***   */"t\040\t";c(
int   u ,         int         v){                     v?m   [u]         [v-
 
1]   |=2,m[u][v-1] &   48?W][v-1   ] &   15]]):0:0;u?m[u   -1][v]|=1   ,m[
 
u-               1][   v]&         48?               W-1   ][v         ]&
15]   ]):0:0;v<   255   ?m[   u][v+1]|=8,m[u][v+1]&   48?   W][   v+1]&15]]
):
0         :0;         <               255   ?m[   u+1         ][v   ]|=
4,m[u+1][   v]&48?W+1][v]&15]]):0:0;W][   v]&   15]   ]);}cu(char*q){   return
 *
q               ?cu   (q+         1)&         1?q   [0]               ++:
q[0   ]--   :1;   }d(   int   u ,   int/**/v,   int/**/x,   int   y){   int
Y
=y   -v,   X=x         -u;   int         S,s   ;Y<         0?Y   =-Y   ,s,
s=-   1:(   s=1);X<0?X=-X,S   =-1  :(S=   1);   Y<<=   1;X<<=1;   if(X>Y){
int   f=Y               -(X   >>1   );;               while(u!=         x){
f>=   0?v+=s,f-=X:0;u   +=S   ;f+=   Y;m[u][v]|=32;mvwaddch(w,v   ,u,   m[u
 
][               v]&   64?   60:         46)         ;if         (m[   u][
v]&16){c(u,v);;   ;;;   ;;;   return;}}   }else{int   f=X   -(Y>>1);;   while
 (
v   !=y         ){f   >=0         ?u   +=S,               f-=         Y:0
 
;v   +=s   ;f+=X;m[u][v]|=   32;mvwaddch(w,v   ,u,m[u][v]&64?60:46);if(m[u
 
][                     v]&         16)   {c(   u,v                     );
  ;   return;;;}}}}
Z(   int/**/a,   int   b){   }e(   int/**/y,int/**/  x){
int               i ;         for         (i=         a;i               <=a
+S;i++)d(y,x,i,b),d(y,x,i,b+L);for(i=b;i<=b+L;i++)d(y,x,a,i),d(y,x,a+   S,i
 
);                     ;;;         ;;;         ;;;               ;;;   ;
  
mvwaddch(w,x,y,64);   ;;;   ;;;   ;;;   prefresh(   w,b,a,0,0   ,L-   1,S-1
);}             main(         int               V ,   char              *C[
  ]   ){
FILE*f=   fopen(V==1?"arachnid.c"/**/   :C[   1],"r");int/**/x,y,c,
v=0         ;;;      initscr              ();               Z(Z         (raw
 
()   ,Z(   curs_set(0),Z(1   ,noecho()))),keypad(    stdscr,TRUE));w   =newpad
  
(   300,  300               ) ;   for         (x=   255   x   >=0   ;x--
  )   for   (
y=   255   ;y>=0;y--   )m[   x][   y]=   0;x=y=0;refresh( );while
  (   (
c=                           fgetc (f)   )+1)                    {if(
0||c==10||  x==   256){x=0;y++;if(y==256  )break;;}   else{m[x][y]=(c   ==
'~'   ?64   c   ==32              ?0:         16)   ;;x               ++;
      }}for(
x=0   ;x<   256;x++)m   [x][0]=16   ,m[   x][   255]=16;for(y=0
;y<         256   y         ++)   m[0         ][y   ] =               16,
m[255][y]   =16   ;a=b=c=0;   x=y   =1;   do{v++;mvwaddch   (w,   y,x   ,m[
x][         y]&               32?   m[x                     ][y   ] &   16?
 
0|   acs_map[l[m[x][y]&15]]:46 :   32);c==0163&&!(m[x][y+1]&16)?y++:   0;c
 
==   119         &&!         (m[                                       x][
 
y-   1]&   16)   ?y--:0;;c   ==97  &&!(m[x-1][y]&16)?x--:0;c==100&&!(m[x+1
 
][   y]&   16)         ? x   ++:0              ;if(                    c==
 
3-   1+1   ){endwin(   );;   return(0)   ;}x   -a<5?a>S-   5?a-=S-5:(a=0):
0;x               -a>         S-5?a<255   -S*         2?a               +=S
-5:(a=256-S):0;   y-b<5?b>L-5?b-=L-5:(b   =0)   :0;   y-b>L-5?b<255-L   *2?
b+=                                       L-5   :(b                     =256
-L)   :0;e(x,y);if(m[x][y]&64)break;}while((c=getch())!=-1);endwin();cu(Q);
printf(Q,v);} 

RETO A QUE IMITEN ESTO EN DELPHI.

P.D: Ese codigo FUNCIONA. Obvio, con PERL SE PUEDE PEOR:

Código PHP:

  #:: ::-| ::-| .-. :||-:: 0-| .-| ::||-| .:|-. :||
                  
open(Q,$0);while(<Q>){if(/^#(.*)$/){for(split('-',$1)){$q=0;for(split){s/\|
                  
/:.:/xg;s/:/../g;$Q=$_?length:$_;$q+=$q?$Q:$Q*20;}print chr($q);}}}print"\n";
                  
#.: ::||-| .||-| :|||-| ::||-| ||-:: :|||-| .:| 

Pero NADA LE GANA A APL:

http://www.microapl.co.uk/apl/learn_apl.html
Código:

X ← 3 3⍴÷⍳9  ⋄ Y ← DATA[⍋DATA] ⍝ A comment

Crandel 12-10-2011 01:13:27

Nadie dice que sea un mal lenguaje, se puede y se realizaron excelentes programas con él. Yo mismo lo utilizo bastante según mis necesidades, pero no siento el mismo placer programando en él como con otros lenguajes.

y no solo uno dice que es horrible:

Linus Torvalds: Why C++ Sucks

Cita:

According to Torvalds — yes, the Linus of Linux — C++ leads to really really bad design choices. He says that developers "invariably start using the 'nice' library features of the language like STL and Boost and other total and utter crap," that may "help" you program, but they cause infinite amounts of pain when they don't work and inefficient abstracted programming models.

mamcx 12-10-2011 01:24:21

Cita:

Empezado por Crandel (Mensaje 415302)
Nadie dice que sea un mal lenguaje

Nadie lo dice, excepto Linus Torvalds?

Bueno, yo tambien lo digo. Todo engendro del C es horrible de nacimiento, y requiere mucha cosmetica para hacerlo medio decente.

Y eso que trabajo objective-c a la lata estos dias...

Casimiro Notevi 12-10-2011 01:39:07

Cita:

Empezado por Crandel (Mensaje 415302)
Nadie dice que sea un mal lenguaje, se puede y se realizaron excelentes programas con él. Yo mismo lo utilizo bastante según mis necesidades, pero no siento el mismo placer programando en él como con otros lenguajes.

y no solo uno dice que es horrible:

Linus Torvalds: Why C++ Sucks

Bueno, no es lo mismo C que C++, realmente hay muuuuucha diferencia.

Ñuño Martínez 12-10-2011 12:20:09

Cita:

Empezado por mamcx (Mensaje 415184)
Pues he leído sobre el lenguaje, y no le veo ninguna gracia.

No tiene una sintaxis mejor en ningún aspecto importante
No tiene un paradigma que realmente mejore algo a javascript
No tiene un caso de uso en donde sea CLARAMENTE superior.

Por ejemplo, node.js tiene como cosa importante que hace facil hacer codigo asincronico. Por eso solo, es popular.

Ruby es mágico. Python es simple.Erlang hace multiprocesamiento como decir "hola mundo". Haskell tiene un sistema de tipado poderoso. Lisp hace de todo, si sobrevives a su aprendizaje. C es acceso bajo. Delphi tiene una mejor interface con el API windows. Etc...

Hay un caso de uso de cada lenguaje, donde es claramente superior y/o diferente a los demas, que lo justifica.

Lo has clavado. Es como C#, que por lo (poco) que sé no es ni más ni menos que Java, solo que le han cambiado el nombre a algunas palabras clave y a las bibliotecas de clases: funcionalmente (y casi siempre sintácticamente) me parece idéntico a Java.
Cita:

Empezado por Casimiro Notevi (Mensaje 415305)
Bueno, no es lo mismo C que C++, realmente hay muuuuucha diferencia.

Cierto. A mi, al igual que varios de vosotros, C me gusta pero aborrezco C++. Cuando quiero programar con objetos usando C, o uso C o uso Objective C.

Algún día tendré que escribir un artículo para enseñaros cómo hacer clases con herencia, métodos y elementos privados en C puro y duro.

roman 12-10-2011 17:13:38

Cita:

Empezado por Ñuño Martínez (Mensaje 415336)
Algún día tendré que escribir un artículo para enseñaros cómo hacer clases con herencia, métodos y elementos privados en C puro y duro.

A ver, y ¿por qué no nos das una idea por adelantado? Suena interesante.

// Saludos

Julián 12-10-2011 17:55:21

Cita:

Empezado por Julián (Mensaje 415299)
Se puede escribir tan horriblemente con delphi como con c. Y se puede escribir muy bien tanto con uno como con otro.

Nunca entederé a quienes sostienen que tal o cual lenguaje es horrible porque use {llaves} en lugar de "begin" y "end". Que me digan (yo mismo lo digo) que java es lento porque es interpretado o porque produce aplicaciones muy feas pues vale, pero no entendería que es horrible por usar {llaves}.

Cita:

Empezado por mamcx (Mensaje 415301)
No se puede. Prueba definitiva?

Bsucar en google:

delphi obfuscate code
c obfuscate code
perl obfuscate code

Veran que no hay ejemplos de codigo obscurecido a mano en delphi, en cambio hay hasta TUTORIALES para hacerlo en c & perl.


Sí, de acuerdo, pero yo no me refería a escribir código ofuscado u obscurecido, cosa que se suele hacer intencionadamente. Me refería a escrir mal código, código horrible. Código dificil de entender, dificil mantener. O imposible. O sea, la clase de código que resulta de la falta de conocimientos, de la incompetencia, de las prisas, de la desidia, de la ausencia de planificación o de analisis. Seguro que todos nos hemos encontrado alguna vez con un código fuente de esos que lo miras y te dan ganas de buscar al autor para denunciarlo o matarlo.

No me acuerdo quien dijo que cualquier mal programador es capáz de escribir código que las maquinas entiendan, pero que sólo un buén programador puede escribir código que entiendan las personas.

Y en delphi he visto mucho código malo, malisimo. A eso me refería, no a la ofuscación.

Un saludo!

mamcx 12-10-2011 18:54:15

Ok Julian, es claro que se puede escribir código como mencionas en lo que sea, pero tambien lo es en mi opinion que hay lenguajes en donde es natural escribir "mal" porque la sintaxis, porque hace parte intrinseca del mismo. La legibilidad del codigo tambien es un atributo del diseño del lenguaje.

Se puede ir en contra o a favor, pero el punto es que requiere esfuerzo semi-conciente del humano hacerlo.

Si debe esforzarse por hacerlo legible, entonces es contra.
Si no debe esforzarse por hacerlo ilegible, tambien es contra.

Una observacion que muchos hemos tenido sobre los lenguajes derivados del C (y el C mismo... los ejemplos de arriba eran en C, no C++) es que por ser optimizados para ahorrar caracteres, atentan de forma intrinseca y fundamental contra la legibilidad del codigo. Que es otra manera de decir que cuestan tiempo, y dinero perdido, a los desarrolladores y empresas, y que perjudican la calidad de los sistemas creados. Un ambiente de pensamiento hostil, donde es natural hacer cosas complicadas, entrena mentes en seguir esa linea de pensamiento. Es un efecto que se nota mucho en muchos programadores: El lenguaje afecta la forma de pensar y atacar los problemas.

Pero afortunadamente, dan para discutir muy bueno!

roman 12-10-2011 20:05:56

Cita:

Empezado por mamcx (Mensaje 415370)
Una observacion que muchos hemos tenido sobre los lenguajes derivados del C [...] es que por ser optimizados para ahorrar caracteres, atentan de forma intrinseca y fundamental contra la legibilidad del codigo. Que es otra manera de decir que cuestan tiempo, y dinero perdido, a los desarrolladores y empresas, y que perjudican la calidad de los sistemas creados. Un ambiente de pensamiento hostil, donde es natural hacer cosas complicadas, entrena mentes en seguir esa linea de pensamiento. Es un efecto que se nota mucho en muchos programadores: El lenguaje afecta la forma de pensar y atacar los problemas.

Sinceramente creo que es una opinión muy exagerada, y que nos pone a los humanos como seres poco aptos para trabajar con la abstracción.

Como comenté en alguna ocasión anterior, haciendo un paralelismo, las matemáticas son una disciplina en la que el uso de símbolos es fundamental. Desde luego que quien no está entrenado para ello, le será difícil leer un texto matemático. Pero eso no es impedimento para que se trabaje con la simbología correctamente, leida por ojos humanos (las matemáticas no están hechas para ser leidas por una máquina) y la productividad no está peleada con la simbología, es más, sería impensable actualmente, hacer matemáticas con lenguaje natural.

Lo mismo sucede con los lenguajes de programación. Pretender que el uso de llaves en lugar de begin-end atenta contra la productividad es simplemente decir: no me gustan las llaves y entonces argumento esto, opinión, desde luego que es válida, pero no por las razones esgrimidas.

// Saludos

ecfisa 12-10-2011 20:16:45

Cita:

Empezado por Ñuño Martínez (Mensaje 415336)
Algún día tendré que escribir un artículo para enseñaros cómo hacer clases con herencia, métodos y elementos privados en C puro y duro.

Hola Ñuño.

Por favor no dejes de hacerlo, ya estoy muy interesado con la sola idea de leerlo.

Un saludo. :)

Delphius 12-10-2011 21:03:43

¿Otra vez la burra al trigo? Yo la dije dos veces:
Post 1
Post 2

Por momentos pienso que cada vez que se crea un nuevo lenguaje C-style es para intentar tirarle bronca a los Pascal-style. Para mi es que están tan celosos que no logran superar el hecho de que Delphi sigue siendo elegido como el mejor lenguaje de programación por Code Project.

Saludos,

Casimiro Notevi 12-10-2011 21:29:28

Cita:

Empezado por Delphius (Mensaje 415388)
Por momentos pienso que cada vez que se crea un nuevo lenguaje C-style es para intentar tirarle bronca a los Pascal-style. Para mi es que están tan celosos que no logran superar el hecho de que Delphi sigue siendo elegido como el mejor lenguaje de programación por Code Project.

je, je... los de google van a cambiar a pascal y están buscando buenos programadores, se rumorea que todos los días visitan clubdelphi y páginas similares, así que no os extrañéis si os llega un email de google para una entrevista.
A mí no me llamarán porque sólo sé teclear el enlace de la guía de estilo :D

Crandel 12-10-2011 21:52:37

Cita:

Empezado por Casimiro Notevi (Mensaje 415392)
je, je... los de google van a cambiar a pascal y están buscando buenos programadores, se rumorea que todos los días visitan clubdelphi y páginas similares, así que no os extrañeéis si os llega un email de google para una entrevista.
A mí no me llamarán porque sólo sé teclear el enlace de la guía de estilo :D

Existen páginas similares a ClubDelphi ???

Al González 13-10-2011 01:51:29

Cita:

Empezado por Crandel (Mensaje 415398)
Existen páginas similares a ClubDelphi ???

Esta, según se comenta. :)

Julián 13-10-2011 19:43:47

Cita:

Empezado por mamcx (Mensaje 415370)
Ok Julian, es claro que se puede escribir código como mencionas en lo que sea, pero tambien lo es en mi opinion que hay lenguajes en donde es natural escribir "mal" porque la sintaxis, porque hace parte intrinseca del mismo. La legibilidad del codigo tambien es un atributo del diseño del lenguaje.

Bueno, puedo estar de acuerdo, y lo estoy, claro, en que hay lenguajes cuya sintaxis es mas críptica o retorcida que otros. Y tambien puedo estar de acuerdo, y lo estoy, en que hay lenguajes que se prestan mas fácilmente que otros a producir mal código. Cosa que has argumentado tu mismo numerosas veces y muy brillantemente.
Pero para eso se precisa de la incompetecia del que lo escribe, pues el que escribe buen código lo escribe bién sea cual sea el lenguaje que use.

Cualquiera puede escribir un churro mal indentado, con nombres de variables en aleman o en chino, con una estrctura de directorios y archivos penosa, llena de dependencias, sin prefijos, ni sufijos, o sin control de errores. En cualquier lenguaje se puede usar un if o un for cuando no se debe, y cienmil cosas mas.

Opino lo mismo que roman, lo mismo dá usar llaves que begin y ends. Lo importante es hacerlo como es debido. Si acaso lo que no me gusta de lenguajes como PHP es el tipado. Eso de que puedas usar una variable sin declararla me parece toda una falta de educación y de deportividad.


Cita:

Empezado por mamcx (Mensaje 415370)
Pero afortunadamente, dan para discutir muy bueno!

Si señor. Nada hay mas saludable para el cerebro que una discusión, pues ademas de mantener y aumentar la actividad de las conexiones neuronales sirve para aprender, para confrontar opiniones, para ver las cosas desde otros puntos de vista. La capacidad de cambiar de opinión es la capacidad de mejorar.

Un saludo!


La franja horaria es GMT +2. Ahora son las 16:59:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi