Las Cadenas De Texto En .NET

2 02 2009

En cada buen libro que he leido sobre .NET Framework o sobre los lenguajes de programación de .NET (C#, VB.NET, J#), siempre hay una sección especialmente dedicada a las cadenas de texto o strings ( System.String). La razón para esto es que esta clase tiene un comportamiento un tanto especial.

1. Tipos Por Valor vs. Tipos Por Referencia

Los String son un tipo por referencia ya que hereda de System.Object. Para poder asignar una cadena de texto a un objeto de tipo System.String se puede usar la siguiente sintaxis simplificada:


string miCadena = "¡Hola Mundo!";

Si intentamos hacer algo como: string miCadena = new string ("¡Hola Mundo!"); no funcionará – en realidad, ni siquiera compilará porque el constructor de la clase string no está sobrecargado para aceptar una cadena de texto como parametro. En vez de eso, otra manera de crear un objeto de tipo string es:


char[] caracteres = {'a','b','c'};
string miCadena = new string(caracteres);
// Creará un objeto de tipo string conteniendo "abc"

Así, si consideramos como es asignado el valor al objeto, system.String podría ser considerado con un tipo por valor.

Otra situación distinta es cuando System.String es un parametro para algún metodo. Los tipos por valor en .NET pueden ser pasados por valor o por referencia (usando la palabra clave ref). En cambio, los tipos por referencia son siempre pasados por referencia. En el código de abajo, el parametro del metodo “ActualizarValor” es un entero (un tipo por valor).


static void Main(string[] args)
{
int miValor = 10;
ActualizarValor(ref miValor);
Console.WriteLine("Mi valor: {0}", miValor);
}
static void ActualizarValor(ref int valor)
{
valor = 20;
}

Si cambiamos el código reemplazando el tipo por valor con el tipo por referencia System.String, obtendremos el mismo resultado: la variable miValor será diferente – la cadena “Nuevo Valor” será mostrada en pantalla -.


static void Main(string[] args)
{
string miValor = "Valor Actual";
ActualizarString(ref miValor);
Console.WriteLine("Mi valor: {0}", miValor);
}
static void ActualizarString(ref string valor)
{
valor = "Nuevo Valor";
}

Si omitimos la palabra clave “ref” de la llamada al método y también de la definición del parametro del método, entonces la salida será el valor contenido en la variable antes de llamar al método: “Valor Actual”. Así, la pregunta es por qué System.String es un tipo por referencia cuando se comporta como un tipo por valor. Y la respuesta es un poco más compleja. Muchos lenguajes de programación (incluyendo Java, C#) consideran las cadenas de texto como un tipo primitivo, y por lo tanto el compilador lo trata como tal. Nuevamente, por qué es System.String un tipo por referencia? Principalmente porque hereda de System.Object, y por lo tanto en memoria, existe bajo el Heap (el Heap es el área de la memoria donde son almacenados todos los tipos por referencia) y no bajo el Stack(que es donde todos los tipos por valor van a parar).

2. System.Intern

El CLR (Common Language Runtime) internamente crea una tabla de Hash (también llamada “piscina interna” o “intern pool”) donde todos los strings declarados en una aplicación son guardados. El comportamiento de estos strings que son declarados en la aplicación es diferente de una versión a otra del Framework .NET, y por lo tanto no hay que confiar que los strings declarados son automaticamente “internados” (o sea agregados a la tabla de Hash interna). Sin embargo, se puede tener la certeza que todos aquellos para los que el método String.Intertn fue usado están ya agregados a esa tabla.

la clave de la tabla de Hash es el valor del string, y el valor es la referencia al(los) objecto(s) de tipo String. La forma de agregar los strings a la tabla de Hash es mediante una llamada al método System.Intern(string s). Llamando a este método, el CLR revisa si ya hay un string identico en la tabla. Si alguna entrada es encontrada, entonces el método retorna la referencia al string existente. Si ninguna entrada es encontrada, entonces el CLR crea una copia del string la cual es agregada a la tabla de Hash interna y la referencia a la copia es retornada. Otro método relacionado el porceso de internación de los strings es String.IsInterned(string s). Y aunque el nombre del método parece querer decir que el valor de retorno es un valor Booleano, no es así. El tipo que este método retorna es un string, y la lógica es la siguiente: Si el string que está siedo pasado en el método existe en la tabla de Hash interna, entonces el método retorna una referencia a ese objeto. De otro modo, el método retorna null, vale la pena aclarar que el string no es agregado a la tabla de Hash interna si no existe.

También hay una diferencia entre las referencias a objetos de tipo string que existen el Heap y aquellos que están en la tabla de Hash interna de manera que no todos los strings están en la tabla de Hash interna.


string cadena1 = "¡Hola Mundo!";
string cadena2 = "¡Hola Mundo!";
Console.WriteLine("Las refencias son iguales: {0}",
Object.ReferenceEquals(cadena1, cadena2));


string cadena3 = String.Intern("¡Hola Mundo!");
string cadena4 = String.Intern("¡Hola Mundo!");
Console.WriteLine("Las refencias son iguales: {0}",
Object.ReferenceEquals(cadena3, cadena4));

En el primera caso (cadenas 1 y 2), el Framewoek .NET puede agregar los strings a la “piscina interna”. Eso dependerá de la versión del framework y también de la configuración/parametros del compilador. Por lo tanto, el resultado puede ser diferente dependiendo de la plataforma y configuraciones. En el segundo caso, sin embargo, el resultado será siempre el mismo: el método ReferenceEquals retorna ‘true’ porque las cadenas de texto son agregadas a la “piscina interna”. Hasta ahora, hemos visto que el tipo System.String es un tipo por referencia, y en la segunda situación, cadena3 y cadena4 apuntan a la misma referencia(dirección de memoria en el Heap). La pregunta que puede surgir aquí es: ¿qué pasará si cambio el valor de cadena4, cadena3 cambiará también? Y la respuesta es “NO”, para ser más preciso, “No Realmente”.

3. Los Strings son Inmutables

En el mundo de la Programación Orientada a Objetos, un objeto es inmutable es aquel que no puede ser modificado una vez que es creado. Este coportamiento de los strings es lo que hace el proceso de internación posible. Teniendo que los strings son inmutables, una copia de la referencia puede ser creada en vez de copiar todo el objeto. Por lo tanto, multiples objetos pueden apuntar a la misma cadena de texto. Pero, la inmutabilidad no significa que la memoria donde el objeto esta almacenado sea sólo de lectura. Lo que realmente significa es que por abajo el Framework .NET se asegura que no se pueda cambiar el valor de la cadena de texto (o al menos no cuando se trabaja con código manejado/código seguro).


Linea 1: string cadena1 = String.Intern("ABC");
Linea 2: string cadena2 = String.Intern("ABC");
Linea 3: cadena2 = cadena2.ToLower();

En la Linea 1 se agrega la cadena “ABC” a la piscina interna, y retorna la referencia al objeto cadena1. En la Linea 2 se intenta agregar la cadena “ABC” a la piscina interna, pero en este caso, de acuerdo con la documentación de .NET, “ABC” no está agregado ya que existe. A su vez, la misma referencia es retornada al objeto cadena2. Hasta ahora, ambos objetos apuntan a la misma cadena ya que apuntan a la misma referencia. Lo más interesante viene en la linea 3. Aquí, el método “ToLower()” hace lo siguiente: crea una nueva cadena y lo pobla con “abc”. La referencia a la cadena es retornada, y ahora el objeto cadena2 apunta a una nueva posición de memoria. Hay que notar que no significa que la posición de memoría que contiene la cadena “ABC” fuera sobreescrita con el valor “abc”. Por lo tanto, ahora tenemos que cadena1 aun apunta a “ABC” y cadena2 apunta a “abc”. Esta presunción es buena y válida cuando estamos en el contexto de código manejado/código seguro. Si estamos trabajando con código no manejado, necesitareos ser muy cuidadosos al hacer operaciones sobre strings. Como mencioné arriba, la posición de memoria donde está almacenada la cadena no es sólo de lectura, y por lo tanto puede ser sobreescrita si escribimos un código que haga eso. Y con el código no manejado, es posible hacerlo.


static void Main(string[] args)
{
string cadena1 = String.Intern("Esto no puede ser cambiado");
string cadena2 = String.Intern("Esto no puede ser cambiado");
int tamañoBuffer = cadena1.Length;
GetUserName(cadena1, ref tamañoBuffer);
Console.WriteLine("La segunda cadena: {0}",cadena2);
}
[DllImport("Advapi32", CharSet = CharSet.Unicode)]
static extern bool GetUserName(
[MarshalAs(UnmanagedType.LPWStr)] string userName, ref int bufferLength);

Si ejecutamos el código de arriba, el siguiente mensaje desplegado en la consola (NombreUsuario es el nombre de usuario en tu PC): “La segunda cadena : NombreUsuario no puede ser cambiado”.
la esplicación es, Declaramos cadena1 y cadena2, y nos aseguramos que apunten a la misma cadena usando el método String.Intern(string s). A continuación, un trozo de código no manejado/inseguro es llamado: GetUserName desde “Advapi32.dll”. Lo que pasa durante la llamada a este método es la parte interesante: al método se le pasa uno de los strings declarados, y dado que el código no manejado no sigue las reglas del código manejado respetando las reglas de la inmutabilidad de los strings, escribe la respuesta actual a la posición de memoria a la cual apunta cadena1. Pero en el mundo manejado, el objeto cadena2 también apunta a la misma posición, y por lo tanto el contenido de la cadena es cambiado.

Anuncios




UAC en Windows 7

30 01 2009

Una de las nuevas caracteristicas de Windows 7 es la capacidad de finalmente poder configurar la User Account Control (UAC), esa infame y molesta ventanilla introducida en Windows Vista para mejorar la seguridad.

Como Windows no puede diferenciar entre un usuario haciendo click sobre un botón y un programa haciendo click sobre un botón, la UAC fue implementada inicialmente para siempre advertir al usuario via una ventana de dialogo mostrada en un Escritorio Seguro (Secure Destop), similar a la pantalla de inicio de sesión, sobre cualquier cambio en la configuraión del sistema.

Windows 7, sin embargo, ahora incluye la posibilidad de configurar UAC para ocultar estos – molestos a veces – avisos cuando los usuarios cambien configuraciones de Windows. Mientras que este modo aun asegura que las aplicaciones normales no puedan sobreescribir completamente alguna llave del registro, Microsoft ha permitido que los usuarios cambien cualquier configuración de Windows sin ningún aviso advirtiendo de aquello. Sí, incluso se puede cambiar la configuración de UAC – desactivar – de tal modo que Windows no advierta nunca al usuario de estos cambios que se están llevando a cabo en el sistema =O – en realidad en Windows Vista también se puede desactivar, pero nadie lo hace extrañanamente xD -, permitiendo así a las aplicaciones “reinar libremente” en el “modo elevado”.

Pero ¿qué tan dificil es pasar por alto o en otras palabras desactivar la UAC para afectar de alguna forma el normal funcionamiento de Windows?. Windows distingue entre un programa modificando la configuración del sistema y el mismo Windows modificando la configuración mediante un certicado de seguridad. Las aplicaciones que pueden cambiar la configuración del sistema están firmadas con un certificado especial de seguridad. Así, las distintas opciones dentro del panel de control de Windows están, de hecho, firmadas con este certificado y por lo tanto no advierten al usuario si este cambia alguna configuración del sistema.

El talón de Aquiles de todo esto, es que cambiando la configuración del UAC también estamos “cambiando la configuración de Windows”, y de acuerdo al nuevo nivel de seguridad de UAC, Windows no advertirá de tal cambio. Incluso el desactivar por completa la UAC no producirá ninguna advertencia al usuario de tal acción. Así un simple script o programa desarrollado en algún lenguaje puede acceder a desactivar por completo y sin que el usuario sepa la UAC mediante el uso de algunos metódos como SendKeys,Run

El código puede ser visto en withinwindows

Hasta ahora la explicación dada por Microsoft ha sido que esta es una caracteristica hecha “por diseño” y que no será cambiada por ahora. Una solución obvia para esto sería forzar el ajuste de la configuración de la UAC fuera confirmado por el usuario mediante el ingreso de la contraseña de administrador tal como ocurre en Linux o simplemente mantener la configuración del UAC en su valor por defecto o no desactivarla completamente para evitar problemas.

En Windows Vista para desactivar/activar la UAC podemos crear 2 archivos .bat.

Para desactivar la UAC:

Usamos un editor de texto simple como notepad o notepad2, creamos un nuevo archivo de texto y escribimos:


%windir%\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f
pause

  • Guardamos el archivo como:
      Tipo : Todos los archivos
      Nombre: DesactivarUAC.bat
      Click derecho sobre el archivo y seleccionamos “ejecutar Como Administrador”
      Reiniciamos Windows
  • Para activar la UAC:

    Creamos un nuevo archivo de texto y escribimos:


    %windir%\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 1 /f
    pause

  • Guardamos el archivo como:
      Tipo : Todos los archivos
      Nombre: ActivarUAC.bat
      Click derecho sobre el archivo y seleccionamos “ejecutar Como Administrador”
      Reiniciamos Windows




  • Why I don’t Like Linux

    28 01 2009

    Drivers:
    Many distros, such as Ubuntu do have good “out of the box” support but driver support still lags behind nevertheless. I don’t want to spend time searching for drivers and then typing in tons of commands to get things up and running properly. Sure you can go buy specific hardware that is known to be Linux compatible but isn’t that like having to live with a MAC??!??!!???!!

    Packages:
    Every distro has a package manager. However I cannot keep count of the number of times I have seen how friends installed a package that does not work. Then when They go and search in the forums, They get answers telling them “download this” and “type these commands”. Wait a minute! Shouldn’t it just work without all the run around???? Does anyone realize how annoying and confusing that is for users? To them it looks like an easy way to install new software but then they get a nasty surprise. Folks the average user hates that.

    Command Terminal:
    Look it’s 2009. The public doesn’t want to type in commands. GUI’s have been around for how long? It’s obvious by the success of Windows that users want an easier experience. However in Linux you just can’t get many things done without typing in commands. It’s time consuming. Users want to use their software and do things, not spend time typing commands. Users need something easier and intuative. If you don’t want to give up the need for a terminal fine but don’t complain when the public still prefers Windows and it’s easy GUI that does nearly everything by point and click. If Windows is so bad why is it so popular? If what makes it so popular is something you do not want to offer then all the complaining and comparing is pointless. At that point you might as well just accept that you’re never going to be more popular than Windows, be quite, and play with your Linux quietly.

    Support:
    There are many forums. Some of them are good. Some of them are full of arrogant jerks that just hate Windows and turn off nearly every new Linux user they run into. Regardless, as a new Linux user you spend more time in a forum begging for help than you do actually enjoying Linux. PLUS! If you have a serious problem that keeps you from getting on the internet…..how do you get to the forums? Take a guess…using another system. Isn’t it embarrassing to need to use a Windows system to go onto a forum to get Linux help? Doesn’t that make a statement about Linux?

    Software:
    There are some great packages that shine. However the vast majority is of the same quality as shareware for Windows. I understand that it’s free and I shouldn’t complain but look it either fills a need or it doesn’t. I’m not going to use something crappy just because it’s free.

    Linux fails miserably for 3D gaming. I’ve said it a thousand times and I’ll say it again. If Linux could get a standardized 3D system like DirectX and attract gamers, it’s popularity would skyrocket. There are a few 3D games out there but most of them are hacked ports to Linux that are full of bugs, not to mention that the games are old news. Even if a user is not a big gamer, they still will play a game every once in awhile, and they want something that blows their mind. Linux doesn’t offer that.

    Standardization:
    Microsoft has Linux beat hands down in this area. There are so many Linux distros and each of them are doing their own thing. Linux software is a hodgepodge of different packages that may or may not work with your distro. Windows users hate the fact that there are a handful of Windows versions that require different drivers. Do you honestly think that they’re going to like something with even more variations? There is a point when too much freedom becomes chaos.

    File System and Naming:
    In DOS and Windows, file extensions indicate a purpose. In Linux anything goes. People need some kind of clearly defined order to lead them in the right direction. Furthermore it saves time to immediately recognize a file for what it is or how it’s used.

    Also some of the names given to software and commands are well…..nuts. It’s looks like someone dropped scrabble blocks on the floor and randonly selected letters to name things. Overall we come back to the chaos issue.

    Excuses:
    I’m pretty fed up with the excuses. I’m often told stuff like “Linux isn’t meant for that” or “Linux isn’t trying to be Windows”. Own up to the truth. Linux has serious problems. While it may not be trying to be 100% like Windows, to the eye, it has the same general appearance and there is an OBVIOUS reason for that – users want it. So stop covering up the problems and making excuses when things fail. Linux wants to be better than Windows. It wants to be the more popular OS. It wants to offer all the features that Windows offers.

    Until linux developers and supporters stop hating Windows enough to get inside the heads of Windows users, Linux will NEVER beat Windows. Consumers use what they like. OBVIOUSLY they like Windows more, no matter what excuses are offered. Why in the world would users turn down a free OS for a commercial one unless there are big things they don’t like? Stop trying to tell consumers why they should hate Windows. Instead concentrate on making Linux something that consumers really want. Not what you think they should want.

    The fact is that most computer users are novices. You must cater that crowd to be successful at overtaking Windows. There is no honor in being able to use a more complex operating system. Nobody is impressed. Nobody cares. An operating system should make things easier NOT harder. If Linux devs would face the truth and cater to the needs of the public they might be more successful.

    Here’s the killer for Linux and if devs and hardcore fans could wipe the hatred away front their eyes long enough to see it, they would. At the current rate of development, Windows is better equipped to steal ideas from Linux and put it into an easy to use package. Linux, on the other hand cannot develop quickly enough. Unless devs band together, standardize, and get serious about winning over the public, Linux may never catch up.

    I know some Linux fan is going to say something about how wrong I am but that type of response is at the heart of the problem. You can’t tell a consumer how they should feel or how they should perceive a product. You must adapt to the consumer. If the consumer doesn’t like what you have, then YOU are wrong and you will never convince them otherwise.

    Greetings!





    ¿Qué es la Web Semántica?

    16 02 2008

    Esta es una pequeña introducción a la web semántica, en los siguientes minutos hablaré sobre uno de los más duros problemas que enfrenta la web hoy en día, y también explicaré lo que se está haciendo acerca de este problema y como nos afectará.No necesitas ser un desarrollador web o un blogger para entender alguno de los conceptos que se presentan en esta corta introducción.

    Pero antes de ir más lejos es importante saber lo que realmente significa la palabra ‘semántica’. La semántica está relacionada con la sintaxis. En muchos idiomas ‘sintaxis’ es cómo dices algo y ‘semántica’ es el significado detrás de lo que dices. Tomemos a modo de ejemplo la frase: ‘Yo amo la tecnología’ , la sintaxis son las letras, signos de puntuación y acentos en la oración y semántica es lo que realmente significa la oración anterior. En este caso significa que disfrutas aprendiendo sobre las nuevas tecnologías y usandolas.

    Ahora si cambiamos la oración y usamos un simbolo diferente para la palabra ‘amar’ – un corazón – habremos cambiado la sintaxis de la oración aunque la semántica de la oración en si siga siendo la misma. De este modo, si escribimos: ‘Yo la tecnología’ todavía significa que que disfrutas aprendiendo sobre las nuevas tecnologías y usandolas.

    Cuando hablamos de sintaxis y semantica sobre lo que realmente estamos hablando es acerca de comunicación, cuando quieres comunicarte con alguien más lo que usas es tu voz para hacerlo. Internet creo una forma estandar de comunicación entre un computador y otro. En otras palabras le da voz a un computadora para que pueda comunicarse con otro e intercambiar información. Sin embargo aunque le de la capacidad de ‘hablar’ no les da la capacidad de entendimiento y comprensión del significado real la información que están compartiendo.

    La web se convirtió rapidamente en un forma fácil en la que podemos solicitar y ver la información. Podemos imaginar a la web como un gran depósito de documentos, cuando escribimos una dirección web en nuestro navegador este envia una solicitud al sitio web. La solicitud se trata básicamente de decirle al servidor que queremos visualizar el documento que está dirección que le entregamos así el servidor recuperar el documento y lo envia de vuelta a nuestro navegador, este documento está escrito en un lenguaje especial llamado HTML.

    El lenguaje HTML define una sintaxis que el computador puede entender y le dice cómo mostrarnos el documento.Así las 2 cosas que la web hizo es crear una forma de obtener cualquier documento en internet y crear una sintaxis llamada HTML que es usada para mostrarnos el documento. Pero ¿cuál es el problema entonces? Tenemos internet que nos deja comunicarnos unos con otros, tenemos la web que nos permite guardar y obtener cualquier documento en internet y tenemos los motores de busqueda los cuales buscan en los sitios web cualquier cosa que queramos.

    La web parece estar muy bien, así que ¿cómo podremos mejorarla?: ¡Más redes sociales! mmm Creo que no, la respuesta yace en la semántica. Recordemos que actualmente los computadores ciegamente sólo recuperan y muestran información.. bueno ese es el problema porque aun no entienden el significado de las paginas que nos muestran. Y Aunque entienden la sintaxis la semantica es aun algo perdido.

    Ahora, si pudiesemos tener computadores que reconozcan lo que hay en una página web, podrían aprender en lo que estamos interesados y si supieran eso podráin ayudarnos a obtener lo que queremos pasando así de una ayuda pasica a una ayuda activa.Esto es realmente sobre lo que trata la web semántica, ayudar a los computadores a entender el significado de una página web. La web de hoy es sobre documentos, mientras que la web semántica es sobre cosas y cuando digo ‘cosas’ quiero decir ‘cualquier cosa’: personas, lugares, eventos, música, peliculas, organizaciones y cualquier otro concepto sobre el cual puedas pensar.

    Sin embargo, la web semantica no es sólo sobre mostrar estas cosas al computador, sino también dejar que el computador sepa como estas cosas están relacionadas entre si. Esto de la web semántica no es algo que vaya a pasar en el futuro, sino que es sobre algo que está pasando hoy.Las cosas se ponen mucho mejores cuando empezamos explorar las posibilidades que nos brindaría la web semantica. Por ejemplo si una fiesta de cumpleaños ha sido marcada como un evento con una fecha y un lugar entonces podemos decirle al computador que guarde la cita en tu calendario. Otro ejemplo útil ocurre en el mundo de los blogs de música. Los cuales usualmente tienen listas de canciones o albumes en su página de inicio, así si se usará tecnología semántica podríamos decirle a nuestro navegador que muestre todas las canciones del artista en la página o que busque en internet otros albumes del mismo artista.

    Los motores de busqueda también serían más precisos en sus busquedas de lo que son ahora, así cuando buscamos tenemos que decir estamos buscando una persona, un lugar o una canción en especifico. El motor de busqueda podrá referirse a un sitio web de forma mucho más precisa porque ya no sólo dependerá de las ‘keywords’ o palabras claves de busqueda que la suministramos sino tambien de la semantica de la página.

    Así que la web semántica conlleva consigo la gran promesa de hacer nuestra vida más fácil ayudando a los computador para que nos ayuden a nosotros a obtener lo que queremos.





    Unreal Tournament 3

    14 10 2007

    El primer demo de la versión beta de Unreal Tournament 3. Por ahora sólo está disponible la versión para PC, pero según lo que he leido próximamente estaría disponible la versión para PS3 y para Linux, para XBOX 360 estaría disponible el próximo año. Aunque lo bajé no he podido jugarlo, tengo prueba de computación gráfica, así que por ahora estoy algo ocupado.

    Les dejo el trailer del juego 😀

    Saludos!!!





    A propósito de lenguajes…

    21 09 2007

    El otro día estudiando =O para la prueba de Arquitectura de Computadores 2, que consiste basicamente en traducir un programa escrito en C a ensamblador quise publicar algo “computin” que hace tiempo que no publicaba.

    Un lenguaje de programación es un lenguaje inventado para controlar una máquina. Hay muchísimos, de toda clase de tipos y características, inventados para facilitar el abordaje de distintos problemas, el mantenimiento del software, su reutilización, mejorar la productividad, etc.

    Los lenguajes de programación se pueden clasificar según diversos criterios.

    – Nivel de abstracción: según el grado de cercanía a la máquina:

    – Lenguajes de bajo nivel: La programación se realiza teniendo muy en cuenta las características del procesador. Ejemplo: Lenguajes ensamblador.
    – Lenguajes de nivel medio: Permiten un mayor grado de abstracción pero al mismo tiempo mantienen algunas cualidades de los lenguajes de bajo nivel. Ejemplo: C puede realizar operaciones lógicas y de desplazamiento con bits, tratar todos los tipos de datos como lo que son en realidad a bajo nivel.
    – Lenguajes de alto nivel: Más parecidos al lenguaje humano. Manejan conceptos, tipos de datos, etc., de una manera cercana al pensamiento humano ignorando el funcionamiento de la máquina.

    – El propósito: el tipo de problemas a tratar:

    – Lenguajes de propósito general: Aptos para todo tipo de tareas: Ejemplo: C.
    – Lenguajes de propósito específico: Hechos para un objetivo muy concreto.
    – Lenguajes de programación de sistemas: Diseñados para realizar sistemas operativos o drivers. Ejemplo: C.
    – Lenguajes de script: Para realizar tareas varias de control y auxiliares. Antiguamente eran los llamados lenguajes de procesamiento por lotes (batch) o JCL (”Job Control Languages”). Se subdividen en varias clases (shell, GUI, de programación web, etc.). Ejemplos: bash (shell), Lingo (Macromedia Director), mIRC script, JavaScript (programación web).

    – La evolución histórica: Se va incrementando el nivel de abstracción, pero en la práctica, los de una generación no terminan de sustituir a los de la anterior:

    – Lenguajes de primera generación: Código máquina.
    – Lenguajes de segunda generación: Lenguajes ensamblador.
    – Lenguajes de tercera generación: La mayoría de los lenguajes modernos, diseñados para facilitar la programación a los humanos. Ejemplos: C, Java.
    – Lenguajes de cuarta generación: Diseñados con un propósito concreto, o sea, para abordar un tipo concreto de problemas. Ejemplo: NATURAL, Mathematica.
    – Lenguajes de quinta generación: La intención es que el programador establezca el qué problema ha de ser resuelto y las condiciones a reunir, y la máquina lo resuelve. Se usan en inteligencia artificial. Ejemplo: Prolog.

    – La manera de ejecutarse:

    – Lenguajes compilados: Un programa traductor traduce el código del programa (código fuente) en código máquina (código objeto). Otro programa, el enlazador, unirá los archivos de código objeto del programa principal con los de las librerías para producir el programa ejecutable. Ejemplo: C.
    – Lenguajes interpretados: Un programa (intérprete), ejecuta las instrucciones del programa de manera directa. Ejemplo: LISP.

    También los hay mixtos, como Java, que primero pasan por una fase de compilación en la que el código fuente se transforma en “bytecode”, y este “bytecode” puede ser ejecutado luego (interpretado) en computadores con distintas arquitecturas (procesadores) que tengan todos instalados la misma “máquina virtual” Java.

    – La manera de abordar la tarea a realizar:

    – Lenguajes imperativos: Indican cómo hay que hacer la tarea, es decir, expresan los pasos a realizar. Ejemplos: C, Perl.
    – Lenguajes declarativos: Indican qué hay que hacer. Ejemplos: Lisp, Prolog. Otros ejemplos de lenguajes declarativos, pero que no son lenguajes de programación, son HTML o SQL (para consultar bases de datos).

    – El paradigma de programación, es decir, el estilo de programación empleado. Algunos lenguajes soportan varios paradigmas, y otros sólo uno. Se puede decir que históricamente han ido apareciendo para facilitar la tarea de programar según el tipo de problema a abordar, o para facilitar el mantenimiento del software, o por otra cuestión similar, por lo que todos corresponden a lenguajes de alto nivel (o nivel medio), estando los lenguajes ensambladores que están atados a la arquitectura de su procesador correspondiente. Los principales son:

    – Lenguajes de programación procedural: Divide el problema en partes más pequeñas, que serán realizadas por subprogramas (subrutinas, funciones, procedimientos), que se llaman unas a otras para ser ejecutadas. Ejemplos: C, Pascal.
    – Lenguajes de programación orientada a objetos: Crean un sistema de clases y objetos siguiendo el ejemplo del mundo real, en el que unos objetos realizan acciones y se comunican con otros objetos. Ejemplos: C++, Java.
    – Lenguajes de programación funcional: La tarea se realiza evaluando funciones, (como en Matemáticas), de manera recursiva. Ejemplo: Lisp.
    – Lenguajes de programación lógica: La tarea a realizar se expresa empleando lógica formal matemática. Ejemplo: Prolog.

    – En sistemas distribuidos, según dónde se ejecute:

    – Lenguajes de servidor: Se ejecutan en el servidor. Ejemplo: PHP es el más utilizado en servidores web.
    – Lenguajes de cliente: Se ejecutan en el cliente. Ejemplo: JavaScript en navegadores web.

    – Según admitan o no concurrencia de procesos, esto es, la ejecución simultánea de varios procesos lanzados por el programa:

    – Lenguajes concurrentes: Ejemplo: Ada.
    – Lenguajes no concurrentes. Ejemplo: C.

    – Según la interactividad del programa con el usuario u otros programas:

    o Lenguajes orientados a sucesos: El flujo del programa es controlado por la interacción con el usuario o por mensajes de otros programas/sistema operativo, como editores de texto, interfaces gráficas de usuario (GUI). Ejemplo: VisualBasic, lenguajes de programación declarativos.
    – Lenguajes no orientados a sucesos: El flujo del programa no depende de sucesos exteriores, sino que se conoce de antemano, siendo los procesos batch el ejemplo más claro (actualizaciones de bases de datos, colas de impresión de documentos, etc.). Ejemplos: Lenguajes de programación imperativos.

    – Según la realización visual o no del programa:

    – Lenguajes de programación visual: El programa se realiza moviendo bloques de construcción de programas (objetos visuales) en una interfaz adecuado para ello. No confundir con entornos de programación visual, como Microsoft Visual Studio y sus lenguajes de programación textuales (como Visual C#). Ejemplo: Mindscript.
    – Lenguajes de programación textual: El código del programa se realiza escribiéndolo. Ejemplos: C, Java, Lisp.

    De seguro la Xime me molestará por esto despues xD!!!

    BYtEs!!!