Existen muchos lenguajes de programación, y mañana, seguramente alguien escribirá un nuevo lenguaje, pero la pregunta es. ¿Por qué hacer mas, que no hay suficientes?
Los lenguajes de programación tienen un propósito, se han escrito para resolver un determinado problema. Los mejores lenguajes son los de propósito general, pero eso significa mucho código para realizar la tarea mas simple de lo que un lenguaje especializado requiere.
Esta de moda el lenguaje PHP, su propósito 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ón viable
Si se trata de manipular texto, Perl no tiene rival
PHP es un lenguaje especializado por lo tanto su mejor uso esta en la WEB.
Ahora un lenguaje de propósito general como C o Pascal, podrían hacer lo mismo que hace PHP por eso son de propósito general =) sin embargo, lo que PHP arregla con una sola línea de código, C requiere muchas mas para hacer una tarea que es facil en PHP
Algo tan simple como mostrar un String después de procesar un formulario puede requerir más de 100 líneas en C
Es aquí donde demuestro lo inviable de no usar el lenguaje correcto, a continuación manipulare un formulario en PHP y en C, harán exactamente lo mismo. Pero hasta quien no sepa de programación notara la diferencia de código y complejidad para hacer algo tan simple.
Escribiré un formulario para enviar vía POST un String, el formulario preguntara nuestro nombre y el servidor lo procesara y devolverá un saludo =), algo simple
El código que se ejecuta con C
1 #include <string.h>
2 #include <stdio.h>
3
4 char *getpost(int numparam)
5 {
6 char *post;
7 int lengthstring;
8 int contador;
9 int deletrado = 0;
10 int nparam = 0;
11 static char cadena[10000];
12 static char cache[10000];
13 static int reentrante = 0;
14 char campo[10000];
15
16
17 if (reentrante == 0)
18 {
19 lengthstring = atoi (getenv ("CONTENT_LENGTH"));
20 post = malloc (lengthstring + 1);
21 fread (post,lengthstring,1,stdin);
22 post [lengthstring] = ‘\0’;
23
24 strcpy (cadena,post);
25 strcpy (cache,cadena);
26 reentrante++;
27 }
28 else strcpy (cadena,cache);
29
30
31 for (contador=0;strlen(cadena) != contador;contador++)
32 {
33 if (cadena[contador] != ‘&’)
34 {
35 campo [deletrado] = cadena [contador];
36 deletrado++;
37 } else
38 {
39 nparam++;
40 if (nparam == numparam) break;
41 deletrado = 0;
42 }
43 }
44
45 strcpy (cadena," ");
46 for (contador=0;contador != deletrado;contador++)
47 {
48 cadena [contador] = campo[contador];
49 }
50 cadena[contador] = ‘\0’;
51
52
53 return cadena;
54 }
55
56
57 int getpostlen()
58 {
59 int lengthstring;
60 lengthstring = atoi (getenv ("CONTENT_LENGTH"));
61 return lengthstring;
62 }
63
64 char x2c( char *x ) {
65 register c;
66
67 c = ( x[0] >= ‘A’ ? ( (x[0] & 0xdf) – ‘A’) + 10 : (x[0] – ‘0’) );
68 c *= 16;
69 c += ( x[1] >= ‘A’ ? ( (x[1] & 0xdf) – ‘A’) + 10 : (x[1] – ‘0’) );
70 return(c);
71 }
72
73
74 void decodificarurl(char *url)
75 {
76 register int i, j;
77
78 for (i=0, j=0; url[j]; ++i,++j)
79 {
80 if ((url[i] = url[j]) == ‘%’)
81 {
82 url[i] = x2c( &url[ j + 1] );
83 j+=2;
84 }
85 else if (url[i] == ‘+’)
86 url[i]=’ ‘;
87 }
88 url[i]=’\0′; /*terminar en la nueva longitud */
89 }
90
91 char *getvalue (char *campo)
92 {
93 int contador;
94 int continuecont;
95 int deletrado = 0;
96 static char valortext[1000];
97 char auxtext[1000];
98
99
100 for (contador = 0;strlen(campo) != contador;contador++)
101 {
102 if (campo[contador] == ‘=’)
103 {
104 contador++;
105 for (continuecont=contador;strlen(campo) !=
106 continuecont;continuecont++)
107 {
108 auxtext [deletrado] = campo [continuecont];
109 deletrado++;
110 }
111 auxtext [deletrado] = ‘\0’;
112 break;
113 }
114 }
115
116 strcpy (valortext,auxtext);
117 return valortext;
118 }
119
120
121
122 int main ()
123 {
124 char parametros [getpostlen()];
125 strcpy (parametros,getvalue (getpost(1)));
126 decodificarurl (parametros);
127 printf ("\n\nHola, mucho gusto: %s",parametros);
128 return 0;
129 }
Mucho codigo ¿no?
El código que se ejecuta con PHP
1 <?php
2 echo "Hola, mucho gusto: ".$_POST["nombre"];
3 ?>
3 Lineas, definitivamente el lenguaje correcto para esta tarea es PHP
Al igual que en los ejemplos anteriores antes podría ser inviable programar en C para DOS, era preferible programar en Pascal, el código generado por el compilador de borland era muy pequeño y rápido de ejecutar. Además Borland Pascal tiene librerías para programar de forma visual en modo texto.
A continuación un ejemplo de programación en Pascal para un editor de texto.
{$M 8192,8192,655360}
{$X+,S-}
uses Objects, Drivers, Memory, Views, Menus, Dialogs,
StdDlg, MsgBox, App, Editors;
const
HeapSize = 32 * (1024 div 16);
const
cmportapapeles = 102;
cmsoftdav = 103;
cmmensajeenlabarra = 104;
type
Psoftdav = ^Tsoftdav;
Tsoftdav = object(TApplication)
constructor Init;
procedure HandleEvent(var Event: TEvent); virtual;
procedure InitMenuBar; virtual;
procedure InitStatusLine; virtual;
procedure OutOfMemory; virtual;
end;
var
softdav: Tsoftdav;
ClipWindow: PEditWindow;
function OpenEditor(FileName: FNameStr; Visible: Boolean): PEditWindow;
var
P: PWindow;
R: TRect;
begin
DeskTop^.GetExtent(R);
P := New(PEditWindow, Init(R, FileName, wnNoNumber));
if not Visible then P^.Hide;
OpenEditor := PEditWindow(Application^.InsertWindow(P));
end;
constructor Tsoftdav.Init;
var
H: Word;
R: TRect;
begin
MaxHeapSize := HeapSize;
inherited Init;
DisableCommands([cmSave, cmSaveAs, cmCut, cmCopy, cmPaste, cmClear,
cmUndo, cmFind, cmReplace, cmSearchAgain]);
EditorDialog := StdEditorDialog;
ClipWindow := OpenEditor(”, False);
messagebox (‘Bienvenidos a ENEDIT.’,nil,mfokbutton);
if ClipWindow <> nil then
begin
Clipboard := ClipWindow^.Editor;
Clipboard^.CanUndo := False;
end;
end;
procedure Tsoftdav.HandleEvent(var Event: TEvent);
procedure mensajebarra;
begin
messagebox (‘Editor de texto para DOS https://www.lastdragon.net’,nil,mfokbutton);
end;
procedure softdav;
begin
messagebox (‘Sistema programado por: David Rivero’,nil,mfokbutton);
end;
procedure abrir;
var
FileName: FNameStr;
begin
FileName := ‘*.TXT’;
if ExecuteDialog(New(PFileDialog, Init(‘*.TXT’, ‘Archivos’,
‘Nombre’, fdopenButton, 100)), @FileName) <> cmCancel then
OpenEditor(FileName, True);
end;
procedure nuevo;
begin
OpenEditor(”, True);
end;
procedure ShowClip;
begin
ClipWindow^.Select;
ClipWindow^.Show;
end;
begin
inherited HandleEvent(Event);
case Event.What of
evCommand:
case Event.Command of
cmOpen: abrir;
cmNew: nuevo;
cmportapapeles: ShowClip;
cmsoftdav : softdav;
cmmensajeenlabarra :mensajebarra;
else
Exit;
end;
else
Exit;
end;
ClearEvent(Event);
end;
procedure Tsoftdav.InitMenuBar;
var
R: TRect;
begin
GetExtent(R);
R.B.Y := R.A.Y + 1;
MenuBar := New(PMenuBar, Init(R, NewMenu(
newsubmenu (‘Comandos estandar’,hcnocontext,newmenu(
newitem (‘Nueva hoja de texto’,”,kbnokey,cmnew,hcnocontext,
newitem (‘Abrir hoja de texto’,”,kbnokey,cmopen,hcnocontext,
newitem (‘Guardar hoja de texto’,”,kbnokey,cmsave,hcnocontext,
newitem (‘Guardar como…’,”,kbnokey,cmsaveas,hcnocontext,
newitem (‘Salir de ENEDIT’,”,kbnokey,cmquit,hcnocontext,
nil)))))),
newsubmenu (‘Editar’,hcnocontext,newmenu(
newitem (‘Deshacer lo ultimo hecho’,”,kbnokey,cmundo,hcnocontext,
newitem (‘Pasar al portapapel’,”,kbnokey,cmcopy,hcnocontext,
newitem (‘Traer del portapapel’,”,kbnokey,cmpaste,hcnocontext,
newitem (‘Borra y manten en el portapapel’,”,kbnokey,cmcut,hcnocontext,nil))))),
NewSubMenu(‘Buscar’, hcNoContext, NewMenu(
NewItem(‘Buscar cadena’, ”, kbNoKey, cmFind, hcNoContext,
NewItem(‘Remplazar cadena’, ”, kbNoKey, cmReplace, hcNoContext,
NewItem(‘Otra busqueda’, ”, kbNoKey, cmSearchAgain, hcNoContext,
nil)))),
newsubmenu (‘Hojas’,hcnocontext,newmenu(
newitem (‘Acomodar hojas en el escritorio’,”,kbnokey,cmtile,hcnocontext,
newitem (‘Cerrar la hoja activa’,”,kbnokey,cmclose,hcnocontext,
newitem (‘Hoja siguiente’,”,kbnokey,cmnext,hcnocontext,nil)))),
newsubmenu (‘Programaci¢n’,hcnocontext,newmenu(newitem(
‘Acerca del sistema’,”,kbnokey,cmsoftdav,hcnocontext,nil)),
nil))))))));
end;
procedure Tsoftdav.InitStatusLine;
var
R: TRect;
begin
GetExtent(R);
R.A.Y := R.B.Y – 1;
New(StatusLine, Init(R,
NewStatusDef(0, $FFFF,
newstatuskey (‘Editor de texto para DOS https://www.lastdragon.net 1996-2007’,
kbnokey,cmmensajeenlabarra,
newstatuskey (‘~F10~ Acceso al men£’,kbf10,cmmenu,nil)),nil)));
end;
procedure Tsoftdav.OutOfMemory;
begin
MessageBox(‘Memoria agotada’,
nil, mfError + mfOkButton);
end;
begin
softdav.Init;
softdav.Run;
softdav.Done;
end.
¿Mucho codigo?, Imaginatelo en C. Este tipo de programacion era la que usaba en 1996,
cuando escribia mis primeros programas orientados a objetos en el DOS
En resumen, se requiere conocer varios lenguajes de programación, pero lo mas importante
no se trata solo de saberlos, se trata de saber donde aplicar cada uno. Si eliges el
lenguaje equivocado para un problema, terminaras en el hoyo o con muchas dificultades para
terminar el proyecto.
Video relacionado con este articulo
a la madre esta de locos con todo ese codigo no me imaginaba que tambien con c se podia programar como lo hiciste tu si eres cabron de plano man no te desgastes peliando con megabyte esos cabrones no te llegan ni al talon
compile el programa en c que publicaste compila bien pero no sube como usarlo como le haces tu para que se ejecute como php
YO SOLO HARE UN COMNETARIO…. ME RECUERDAS MIS DIAS EN QUE PROGRAMABA.. AQUELLOS EN QUE JUGABA CON BUSHIDO.. Y TESD DRIVE E ACCOLADE.. QUE EPOCA AQUELLA. NO POR LOS GRAFICOS, NO POR LO CHINGON DE LA TECNOLOGIA… SI NO LA SIMPLE IDEA QUE FUI PARTE DE GRANDES COSAS QUE EXISTEN HOY EN DIA… DIOS Y CON UN POCO DE SOBERBIA. Y CON TODO EL LUJO DE PERMITIRMELA.. CUANTO HE PARTICIPADO EN TODO LO QUE HOY EXISTE… GRACIAS DIOS POR DARME LA OPORTUNIDAD DE PERTENECER A UN PASADO. DEL MONITOR AMBAR. DARME LA OPORTUNIDAD DE CONOCER LOS GRAFICOS AGP. SUPER VGA Y MUCHAS COSAS MAS. Y SOBRE TODO DARME LA OPORTUNIDAD DE PARTICIPAR CON EL PRESENTE Y EL FUTURO. Y CON UN POCO DE MELANCOLIA. FUI UNO DE LOS PRIMEROS TECNICOS EN CD. DEL CARMEN. E INCLUSO DE LOS PRIMEROS TECNICOS EN EL MUNDO. ERAMOS TAN POCOS, QUE NO ME HABIA DADO CUENTA DE QUE TAN GRANDE SOY AL SER TAN PEQUEÑO..
GRACIAS DIOS POR DARME LA OPORTUNIDAD DE VIVIR EN ESTA EPOCA.
y este ejecutable tiene q ver con antrax?
:miedo:(no hay caritas?entonces imaginen un icono)
Bueno, son muchas líneas de código porque lo empezaste desde cero, si usas una librería de las de cgi, boost o miles que hay perdidas en el ciberespacio el programa sería también de una línea de código si no cuentas el #include.
Como decia mi bisabuelo, no hay que trabajar mucho, hay que trabajar inteligentemente.
Syntextec, te falto agradecer por que ahora eres parte del PCI-EXPRESS =)
Yoooooooo, no, nada que ver con ántrax, aunque si vi que la regó, le fue muy mal con su conferencia de seguridad, me pregunto donde ¿habrá sido dada?
Jorge, es tan difícil tener a todos contentos. Tienes muchísima razón, hay mucho código suelto por ahí, pero si lo hubiera hecho así, no hubiera faltado el que dijera, ahh last dragón no programa sus propios códigos =), nunca se tiene a todo el mundo contento.
De todos modos creo conveniente compararlo de esta forma, por que estoy comparando directamente a PHP con C
Donde PHP no usa ninguna librería adicional, uso PHP como es y hago lo mismo con C, usé C como viene, sin requerir de librerías de terceros, para hacer una justa comparativa entre PHP y C definiendo cual es el mejor para un propósito determinado
Inquisidor, Se usa un poco diferente a PHP, mira el URL, va a un directorio especial, llega a CGI-BIN, ahí es donde se ejecutan los CGI, los CGI son programas binarios o de shell (batch) que hacen una tarea determinada cuando son llamados por el navegador.
El código C lee del Standard input el Query enviado del formulario y luego lo procesa para obtener el valor. El cual lo escribe por medio del Standard output que el servidor web toma y reproduce como una salida WEB
Es que esa es la razón por la cual existen distintos lenguajes de programación.
Si necesitaras programar por ejemplo un programa para simular inteligencia artificial lo podrías hacer en C, java, C# o VB, pero quizás Lisp como tal es una opción mas viable ya que el lenguaje fue diseñado de tal manera que resultara más sencillo (aunque su razón de ser no fue esa precisamente) desarrollar mi aplicación, invirtiéndole menos tiempo (por lo consecuente dinero y horas-hombre) y enfocarme quizás a otras partes como presentación o el agregar funcionalidades que le den más valor a mi producto.
Igual pasa ahora con los famosos lenguajes visuales y frameworks (Ruby on rails, Visual C#, Visual Basic .Net, etc), permiten un desarrollo más rápido y en menos tiempo, no necesitas tener a un gurú para desarrollar, si no que alguien más o menos sepa manejar la herramienta y tenga nociones para programar para ese lenguaje. Por lo tanto cualquiera puede hacerlo, pero no cualquiera puede analizar la problemática para hacer un sistema que involucre por ejemplo, el workflow de una empresa y sus procesos, un análisis complejo de datos (algo asi como minería de datos) personalizado al gusto del cliente, pos ahí es donde entran los arquitectos de software y claro siempre se va a necesitar un gurú, para los casos donde tienes que desarrollar componentes o partes de código que requieran hacer algo realmente complejo o que no resulta normal para un programador no experimentado.
Ya me acorde como se llamaba el framework de ventanas de los Turbo de Borland, Turbo visión, era orientado a objetos estaba chido programar. Fue el paso antes del delphi, je je.
Lo que importa en estos dias, es la seguridad, tu ejemplo de php es vulnerable a XSS, lo mas logico es filtrar las entradas de los usuarios, algo que hiciste en c, pero no en php, porque? no se, php trae bastantes funciones para filtrar el user input.
Si, ya me ha hecho notar en articulos anteriores que no siempre los inputs, la ultima vez fue en el articuo de las cookies en php. en aquella vez prometi que advertiria que el codigo que uso es inseguro y que no debe ser usado tal cual en produccion, pero veo que de nuevo olvide hacerlo.
* El ejemplo de PHP no debe ser usado de forma textual es inseguro y es solo un ejemplo como tal.
creo que no entendiste lo que intente decir, no creo que nadie vaya a usar tu ‘ejemplo’ tal cual, ya que es algo muy basico. Haz hecho vulnerable TU instalacion de wordpress, te roban las cookies, luego entran al panel de administracion de wordpress, luego injectan php en el tema, … y lo demas, es historia.
Ahh ya, si entiendo el riesgo, de hecho si habia notado el riesgo, he intentando subir la seguridad “prohibiendo” el acceso a la administracion del wordpress, pero mejor voy reescribiendo el codigo vulnerable, de pronto me ha entrado una dosis de paranoia =)