{"id":119,"date":"2007-04-21T14:18:20","date_gmt":"2007-04-21T20:18:20","guid":{"rendered":"http:\/\/www.lastdragon.net\/?p=119"},"modified":"2007-04-21T15:04:09","modified_gmt":"2007-04-21T21:04:09","slug":"%c2%bfcual-es-el-lenguaje-adecuado","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=119","title":{"rendered":"\u00bfCual es el lenguaje adecuado?"},"content":{"rendered":"<p>Existen muchos lenguajes de programaci\u00f3n, y ma\u00f1ana, seguramente alguien escribir\u00e1 un nuevo lenguaje, pero la pregunta es. \u00bfPor qu\u00e9 hacer mas, que no hay suficientes?<\/p>\n<p>Los lenguajes de programaci\u00f3n tienen un prop\u00f3sito, se han escrito para resolver un determinado problema. Los mejores lenguajes son los de prop\u00f3sito general, pero eso significa mucho c\u00f3digo para realizar la tarea mas simple de lo que un lenguaje especializado requiere.<\/p>\n<p>Esta de moda el lenguaje PHP, su prop\u00f3sito fue ser un script para WEB y eso es algo que hace muy bien, cuando alguien decide escribir un programa para WEB. PHP es la opci\u00f3n viable<\/p>\n<p>Si se trata de manipular texto, Perl no tiene rival<\/p>\n<p>PHP es un lenguaje especializado por lo tanto su mejor uso esta en la WEB.<\/p>\n<p>Ahora un lenguaje de prop\u00f3sito general como C o Pascal, podr\u00edan hacer lo mismo que hace PHP por eso son de prop\u00f3sito general =) sin embargo, lo que PHP arregla con una sola l\u00ednea de c\u00f3digo, C requiere muchas mas para hacer una tarea que es facil en PHP<\/p>\n<p>Algo tan simple como mostrar un String despu\u00e9s de procesar un formulario puede requerir m\u00e1s de 100 l\u00edneas en C<\/p>\n<p>Es aqu\u00ed donde demuestro lo inviable de no usar el lenguaje correcto, a continuaci\u00f3n manipulare un formulario en PHP y en C, har\u00e1n exactamente lo mismo. Pero hasta quien no sepa de programaci\u00f3n notara la diferencia de c\u00f3digo y complejidad para hacer algo tan simple.<\/p>\n<p>Escribir\u00e9 un formulario para enviar v\u00eda POST un String, el formulario preguntara nuestro nombre y el servidor lo procesara y devolver\u00e1 un saludo =), algo simple<\/p>\n<p><a href=\"https:\/\/www.lastdragon.net\/misarchivos\/ejemlenguajes\/conc.html\" target=\"_blank\">Con C<\/a><br \/>\n<a href=\"https:\/\/www.lastdragon.net\/misarchivos\/ejemlenguajes\/conphp.html\" target=\"_blank\">Con PHP<\/a><\/p>\n<p>El c\u00f3digo que se ejecuta con C<\/p>\n<p><strong>1 #include &lt;string.h&gt;<br \/>\n2 #include &lt;stdio.h&gt;<br \/>\n3<br \/>\n4 char *getpost(int numparam)<br \/>\n5 {<br \/>\n6 char *post;<br \/>\n7 int lengthstring;<br \/>\n8 int contador;<br \/>\n9 int deletrado = 0;<br \/>\n10 int nparam = 0;<br \/>\n11 static char cadena[10000];<br \/>\n12 static char cache[10000];<br \/>\n13 static int reentrante = 0;<br \/>\n14 char campo[10000];<br \/>\n15<br \/>\n16<br \/>\n17 if (reentrante == 0)<br \/>\n18 {<br \/>\n19 lengthstring = atoi (getenv (&quot;CONTENT_LENGTH&quot;));<br \/>\n20 post = malloc (lengthstring + 1);<br \/>\n21 fread (post,lengthstring,1,stdin);<br \/>\n22 post [lengthstring] = &#8216;\\0&#8217;;<br \/>\n23<br \/>\n24 strcpy (cadena,post);<br \/>\n25 strcpy (cache,cadena);<br \/>\n26 reentrante++;<br \/>\n27 }<br \/>\n28 else strcpy (cadena,cache);<br \/>\n29<br \/>\n30<br \/>\n31 for (contador=0;strlen(cadena) != contador;contador++)<br \/>\n32 {<br \/>\n33 if (cadena[contador] != &#8216;&amp;&#8217;)<br \/>\n34 {<br \/>\n35 campo [deletrado] = cadena [contador];<br \/>\n36 deletrado++;<br \/>\n37 } else<br \/>\n38 {<br \/>\n39 nparam++;<br \/>\n40 if (nparam == numparam) break;<br \/>\n41 deletrado = 0;<br \/>\n42 }<br \/>\n43 }<\/strong><\/p>\n<p><strong>44<br \/>\n45 strcpy (cadena,&quot; &quot;);<br \/>\n46 for (contador=0;contador != deletrado;contador++)<br \/>\n47 {<br \/>\n48 cadena [contador] = campo[contador];<br \/>\n49 }<br \/>\n50 cadena[contador] = &#8216;\\0&#8217;;<br \/>\n51<br \/>\n52<br \/>\n53 return cadena;<br \/>\n54 }<br \/>\n55<br \/>\n56<br \/>\n57 int getpostlen()<br \/>\n58 {<br \/>\n59 int lengthstring;<br \/>\n60 lengthstring = atoi (getenv (&quot;CONTENT_LENGTH&quot;));<br \/>\n61 return lengthstring;<br \/>\n62 }<br \/>\n63<br \/>\n64 char x2c( char *x ) {<br \/>\n65 register c;<br \/>\n66<br \/>\n67 c = ( x[0] &gt;= &#8216;A&#8217; ? ( (x[0] &amp; 0xdf) &#8211; &#8216;A&#8217;) + 10 : (x[0] &#8211; &#8216;0&#8217;) );<br \/>\n68 c *= 16;<br \/>\n69 c += ( x[1] &gt;= &#8216;A&#8217; ? ( (x[1] &amp; 0xdf) &#8211; &#8216;A&#8217;) + 10 : (x[1] &#8211; &#8216;0&#8217;) );<br \/>\n70 return(c);<br \/>\n71 }<br \/>\n72<br \/>\n73<br \/>\n74 void decodificarurl(char *url)<br \/>\n75 {<br \/>\n76 register int i, j;<br \/>\n77<br \/>\n78 for (i=0, j=0; url[j]; ++i,++j)<br \/>\n79 {<br \/>\n80 if ((url[i] = url[j]) == &#8216;%&#8217;)<br \/>\n81 {<br \/>\n82 url[i] = x2c( &amp;url[ j + 1] ); <br \/>\n83 j+=2;<br \/>\n84 }<br \/>\n85 else if (url[i] == &#8216;+&#8217;)<br \/>\n86 url[i]=&#8217; &#8216;;<br \/>\n87 }<br \/>\n88 url[i]=&#8217;\\0&#8242;; \/*terminar en la nueva longitud *\/<br \/>\n89 }<br \/>\n90<br \/>\n91 char *getvalue (char *campo)<br \/>\n92 {<br \/>\n93 int contador;<br \/>\n94 int continuecont;<br \/>\n95 int deletrado = 0;<br \/>\n96 static char valortext[1000];<br \/>\n97 char auxtext[1000];<br \/>\n98<br \/>\n99<br \/>\n100 for (contador = 0;strlen(campo) != contador;contador++)<br \/>\n101 {<br \/>\n102 if (campo[contador] == &#8216;=&#8217;)<br \/>\n103 {<br \/>\n104 contador++;<br \/>\n105 for (continuecont=contador;strlen(campo) !=<br \/>\n106 continuecont;continuecont++)<br \/>\n107 {<br \/>\n108 auxtext [deletrado] = campo [continuecont];<br \/>\n109 deletrado++;<br \/>\n110 }<br \/>\n111 auxtext [deletrado] = &#8216;\\0&#8217;;<br \/>\n112 break;<br \/>\n113 }<br \/>\n114 }<br \/>\n115<br \/>\n116 strcpy (valortext,auxtext);<br \/>\n117 return valortext;<br \/>\n118 }<br \/>\n119<br \/>\n120<br \/>\n121<br \/>\n122 int main ()<br \/>\n123 {<br \/>\n124 char parametros [getpostlen()];<br \/>\n125 strcpy (parametros,getvalue (getpost(1)));<br \/>\n126 decodificarurl (parametros);<br \/>\n127 printf (&quot;\\n\\nHola, mucho gusto: %s&quot;,parametros);<br \/>\n128 return 0;<br \/>\n129 }<\/strong><\/p>\n<p>Mucho codigo \u00bfno?<\/p>\n<p>El c\u00f3digo que se ejecuta con PHP<\/p>\n<p><strong>1 &lt;?php<br \/>\n2 echo &quot;Hola, mucho gusto: &quot;.$_POST[&quot;nombre&quot;];<br \/>\n3 ?&gt;<\/strong><\/p>\n<p>3 Lineas, definitivamente el lenguaje correcto para esta tarea es PHP<\/p>\n<p>Al igual que en los ejemplos anteriores antes podr\u00eda ser inviable programar en C para DOS, era preferible programar en Pascal, el c\u00f3digo generado por el compilador de borland era muy peque\u00f1o y r\u00e1pido de ejecutar. Adem\u00e1s Borland Pascal tiene librer\u00edas para programar de forma visual en modo texto.<\/p>\n<p>A continuaci\u00f3n un ejemplo de programaci\u00f3n en Pascal para un editor de texto.<\/p>\n<p><strong>{$M 8192,8192,655360}<br \/>\n{$X+,S-}<\/p>\n<p>\nuses Objects, Drivers, Memory, Views, Menus, Dialogs,<br \/>\nStdDlg, MsgBox, App, Editors;<\/p>\n<p>\nconst<br \/>\nHeapSize = 32 * (1024 div 16);<\/p>\n<p>const<br \/>\ncmportapapeles = 102;<br \/>\ncmsoftdav = 103;<br \/>\ncmmensajeenlabarra = 104;<\/p>\n<p>\ntype<br \/>\nPsoftdav = ^Tsoftdav;<br \/>\nTsoftdav = object(TApplication)<br \/>\nconstructor Init;<br \/>\nprocedure HandleEvent(var Event: TEvent); virtual;<br \/>\nprocedure InitMenuBar; virtual;<br \/>\nprocedure InitStatusLine; virtual;<br \/>\nprocedure OutOfMemory; virtual;<br \/>\nend;<\/p>\n<p>var<\/p>\n<p>softdav: Tsoftdav;<br \/>\nClipWindow: PEditWindow;<\/p>\n<p>function OpenEditor(FileName: FNameStr; Visible: Boolean): PEditWindow;<br \/>\nvar<br \/>\nP: PWindow;<br \/>\nR: TRect;<br \/>\nbegin<br \/>\nDeskTop^.GetExtent(R);<br \/>\nP := New(PEditWindow, Init(R, FileName, wnNoNumber));<br \/>\nif not Visible then P^.Hide;<br \/>\nOpenEditor := PEditWindow(Application^.InsertWindow(P));<br \/>\nend;<\/p>\n<p>constructor Tsoftdav.Init;<br \/>\nvar<br \/>\nH: Word;<br \/>\nR: TRect;<br \/>\nbegin<br \/>\nMaxHeapSize := HeapSize;<br \/>\ninherited Init;<br \/>\nDisableCommands([cmSave, cmSaveAs, cmCut, cmCopy, cmPaste, cmClear,<br \/>\ncmUndo, cmFind, cmReplace, cmSearchAgain]);<br \/>\nEditorDialog := StdEditorDialog;<br \/>\nClipWindow := OpenEditor(&#8221;, False);<br \/>\nmessagebox (&#8216;Bienvenidos a ENEDIT.&#8217;,nil,mfokbutton);<br \/>\nif ClipWindow &lt;&gt; nil then<br \/>\nbegin<br \/>\nClipboard := ClipWindow^.Editor;<br \/>\nClipboard^.CanUndo := False;<br \/>\nend;<br \/>\nend;<\/p>\n<p>procedure Tsoftdav.HandleEvent(var Event: TEvent);<\/p>\n<p>procedure mensajebarra;<br \/>\nbegin<br \/>\nmessagebox (&#8216;Editor de texto para DOS https:\/\/www.lastdragon.net&#8217;,nil,mfokbutton);<br \/>\nend;<\/p>\n<p>procedure softdav;<br \/>\nbegin<br \/>\nmessagebox (&#8216;Sistema programado por: David Rivero&#8217;,nil,mfokbutton);<br \/>\nend;<\/p>\n<p>procedure abrir;<br \/>\nvar<br \/>\nFileName: FNameStr;<br \/>\nbegin<br \/>\nFileName := &#8216;*.TXT&#8217;;<br \/>\nif ExecuteDialog(New(PFileDialog, Init(&#8216;*.TXT&#8217;, &#8216;Archivos&#8217;,<br \/>\n&#8216;Nombre&#8217;, fdopenButton, 100)), @FileName) &lt;&gt; cmCancel then<br \/>\nOpenEditor(FileName, True);<br \/>\nend;<\/p>\n<p>procedure nuevo;<br \/>\nbegin<br \/>\nOpenEditor(&#8221;, True);<br \/>\nend;<\/p>\n<p>\nprocedure ShowClip;<br \/>\nbegin<br \/>\nClipWindow^.Select;<br \/>\nClipWindow^.Show;<br \/>\nend;<\/p>\n<p>\nbegin<br \/>\ninherited HandleEvent(Event);<br \/>\ncase Event.What of<br \/>\nevCommand:<br \/>\ncase Event.Command of<br \/>\ncmOpen: abrir;<br \/>\ncmNew: nuevo;<br \/>\ncmportapapeles: ShowClip;<br \/>\ncmsoftdav : softdav;<br \/>\ncmmensajeenlabarra :mensajebarra;<\/p>\n<p>else<br \/>\nExit;<br \/>\nend;<br \/>\nelse<br \/>\nExit;<br \/>\nend;<br \/>\nClearEvent(Event);<br \/>\nend;<\/p>\n<p>procedure Tsoftdav.InitMenuBar;<br \/>\nvar<br \/>\nR: TRect;<br \/>\nbegin<br \/>\nGetExtent(R);<br \/>\nR.B.Y := R.A.Y + 1;<br \/>\nMenuBar := New(PMenuBar, Init(R, NewMenu(<br \/>\nnewsubmenu (&#8216;Comandos estandar&#8217;,hcnocontext,newmenu(<br \/>\nnewitem (&#8216;Nueva hoja de texto&#8217;,&#8221;,kbnokey,cmnew,hcnocontext,<br \/>\nnewitem (&#8216;Abrir hoja de texto&#8217;,&#8221;,kbnokey,cmopen,hcnocontext,<br \/>\nnewitem (&#8216;Guardar hoja de texto&#8217;,&#8221;,kbnokey,cmsave,hcnocontext,<br \/>\nnewitem (&#8216;Guardar como&#8230;&#8217;,&#8221;,kbnokey,cmsaveas,hcnocontext,<br \/>\nnewitem (&#8216;Salir de ENEDIT&#8217;,&#8221;,kbnokey,cmquit,hcnocontext,<br \/>\nnil)))))),<\/p>\n<p>newsubmenu (&#8216;Editar&#8217;,hcnocontext,newmenu(<br \/>\nnewitem (&#8216;Deshacer lo ultimo hecho&#8217;,&#8221;,kbnokey,cmundo,hcnocontext,<br \/>\nnewitem (&#8216;Pasar al portapapel&#8217;,&#8221;,kbnokey,cmcopy,hcnocontext,<br \/>\nnewitem (&#8216;Traer del portapapel&#8217;,&#8221;,kbnokey,cmpaste,hcnocontext,<br \/>\nnewitem (&#8216;Borra y manten en el portapapel&#8217;,&#8221;,kbnokey,cmcut,hcnocontext,nil))))),<\/p>\n<p>NewSubMenu(&#8216;Buscar&#8217;, hcNoContext, NewMenu(<br \/>\nNewItem(&#8216;Buscar cadena&#8217;, &#8221;, kbNoKey, cmFind, hcNoContext,<br \/>\nNewItem(&#8216;Remplazar cadena&#8217;, &#8221;, kbNoKey, cmReplace, hcNoContext,<br \/>\nNewItem(&#8216;Otra busqueda&#8217;, &#8221;, kbNoKey, cmSearchAgain, hcNoContext,<br \/>\nnil)))),<\/p>\n<p>newsubmenu (&#8216;Hojas&#8217;,hcnocontext,newmenu(<br \/>\nnewitem (&#8216;Acomodar hojas en el escritorio&#8217;,&#8221;,kbnokey,cmtile,hcnocontext,<br \/>\nnewitem (&#8216;Cerrar la hoja activa&#8217;,&#8221;,kbnokey,cmclose,hcnocontext,<br \/>\nnewitem (&#8216;Hoja siguiente&#8217;,&#8221;,kbnokey,cmnext,hcnocontext,nil)))),<\/p>\n<p>newsubmenu (&#8216;Programaci\u00a2n&#8217;,hcnocontext,newmenu(newitem(<br \/>\n&#8216;Acerca del sistema&#8217;,&#8221;,kbnokey,cmsoftdav,hcnocontext,nil)),<br \/>\nnil))))))));<br \/>\nend;<\/p>\n<p>procedure Tsoftdav.InitStatusLine;<br \/>\nvar<br \/>\nR: TRect;<br \/>\nbegin<br \/>\nGetExtent(R);<br \/>\nR.A.Y := R.B.Y &#8211; 1;<br \/>\nNew(StatusLine, Init(R,<br \/>\nNewStatusDef(0, $FFFF,<br \/>\nnewstatuskey (&#8216;Editor de texto para DOS https:\/\/www.lastdragon.net 1996-2007&#8217;,<br \/>\nkbnokey,cmmensajeenlabarra,<br \/>\nnewstatuskey (&#8216;~F10~ Acceso al men\u00a3&#8217;,kbf10,cmmenu,nil)),nil)));<br \/>\nend;<\/p>\n<p>procedure Tsoftdav.OutOfMemory;<br \/>\nbegin<br \/>\nMessageBox(&#8216;Memoria agotada&#8217;,<br \/>\nnil, mfError + mfOkButton);<br \/>\nend;<\/p>\n<p>begin<br \/>\nsoftdav.Init;<br \/>\nsoftdav.Run;<br \/>\nsoftdav.Done;<br \/>\nend.<br \/>\n<\/strong><\/p>\n<p>\u00bfMucho codigo?, Imaginatelo en C. Este tipo de programacion era la que usaba en 1996,<br \/>\ncuando escribia mis primeros programas orientados a objetos en el DOS<\/p>\n<p><a href=\"https:\/\/www.lastdragon.net\/misarchivos\/ejemlenguajes\/enedit.exe\">Bajar el ejecutable de<br \/>\nmi editor de texto, recompilado en su compilador original, as\u00ed que es c\u00f3digo de 8086<\/a><\/p>\n<p>En resumen, se requiere conocer varios lenguajes de programaci\u00f3n, pero lo mas importante<br \/>\nno se trata solo de saberlos, se trata de saber donde aplicar cada uno. Si eliges el<br \/>\nlenguaje equivocado para un problema, terminaras en el hoyo o con muchas dificultades para<br \/>\nterminar el proyecto.<\/p>\n<p>Video relacionado con este articulo<\/p>\n<p><object width=\"425\" height=\"350\"><param name=\"movie\" value=\"http:\/\/www.youtube.com\/v\/jnlJhQtnLTA\"><\/param><embed src=\"http:\/\/www.youtube.com\/v\/jnlJhQtnLTA\" type=\"application\/x-shockwave-flash\" width=\"425\" height=\"350\"><\/embed><\/object><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Existen muchos lenguajes de programaci\u00f3n, y ma\u00f1ana, seguramente alguien escribir\u00e1 un nuevo lenguaje, pero la pregunta es. \u00bfPor qu\u00e9 hacer mas, que no hay suficientes? Los lenguajes de programaci\u00f3n tienen un prop\u00f3sito, se han escrito para resolver un determinado problema. Los mejores lenguajes son los de prop\u00f3sito general, pero eso significa mucho c\u00f3digo para realizar&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-119","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/119","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=119"}],"version-history":[{"count":0,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/119\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}