# data[].attributes.attachment_link.readable_text
C#

Desarrollador(es)

Microsoft
https://docs.microsoft.com/en-us/dotnet/csharp/, https://docs.microsoft.com/de-de/dotnet/csharp/, https://docs.microsoft.com/ja-jp/dotnet/csharp/, https://docs.microsoft.com/fr-fr/dotnet/csharp/ y https://docs.microsoft.com/it-it/dotnet/csharp/

Información general

Extensiones comunes

.cs .csx .cshtml .razor

Paradigma

Multiparadigma: estructurado, imperativo, orientado a objetos, dirigido por eventos, funcional, genérico, reflexivo

Apareció en

2000

Diseñado por

Microsoft

Última versión estable

12.0 (14 de noviembre de 2023 (6 meses y 11 días))

Última versión en pruebas

13.0 (07 de mayo de 2024 (18 días))

Sistema de tipos

Estático, dinámico, fuerte, seguro, nominal

Implementaciones

Microsoft .NET, Microsoft .NET Core, Mono y DotGNU

Dialectos

Cω, Spec Sharp, Polyphonic C#

Influido por

Java, C++, Eiffel, Modula-3, Pascal

Ha influido a

D, F#, Java 5, Vala

Sistema operativo

Multiplataforma

"C#" (pronunciado cii sharp en inglés) es un lenguaje de programación multiparadigma desarrollado y estandarizado por la empresa Microsoft como parte de su plataforma .NET, que después fue aprobado como un estándar por la ECMA (ECMA-334) e ISO (ISO/IEC 23270). C# es uno de los lenguajes de programación diseñados para la infraestructura de lenguaje común.

Su sintaxis básica deriva de C/ C++ y utiliza el modelo de objetos de la plataforma .NET, similar al de Java, aunque incluye mejoras derivadas de otros lenguajes.

El nombre C Sharp fue inspirado por el signo ♯, el cual se lee como sharp en inglés para notación musical. Es un juego de palabras, pues '"C#" significa, musicalmente hablando, "do sostenido", donde el símbolo # indica que una nota (en este caso do, representada por C) debe ser un semitono más alta. Esto es una metáfora de la superioridad de C# sobre su antecesor C++ y a su vez hace alusión a la misma metáfora que se ideó para dar nombre a C++.​ Además, el símbolo # puede ser imaginado como la unión de cuatro símbolos +, continuando así con el sentido de progresión de los lenguajes C.

Aunque C# forma parte de la plataforma .NET, esta es una API, mientras que C# es un lenguaje de programación independiente diseñado para generar programas sobre dicha plataforma. Ya existe un compilador implementado que provee el marco Mono - DotGNU, el cual genera programas para distintas plataformas como Microsoft Windows, Unix, Android, iOS, Windows Phone, Mac OS y GNU/Linux.

Durante el desarrollo de la plataforma .NET, las bibliotecas de clases fueron escritas originalmente usando un sistema de código gestionado llamado Simple Managed C (SMC). En abril de 1999, Anders Hejlsberg formó un equipo con la misión de desarrollar un nuevo lenguaje orientado a objetos. Este nombre tuvo que ser cambiado debido a problemas de marca, pasando a llamarse C#.​ La biblioteca de clases de la plataforma .NET fue migrada entonces al nuevo lenguaje, y este después fue modificado por Joseth M.

Hejlsberg lideró el proyecto de desarrollo de C#. Anteriormente ya había participado en el desarrollo de otros lenguajes como Turbo Pascal, Delphi y J++.

C# contiene veinte categorías generales de tipos de datos integrados: tipos de valor y tipos de referencia. El término tipo de valor indica que esos tipos contienen directamente sus valores. Tipos para definir números enteros:

Los tipos de coma flotante pueden representar números con componentes fraccionales. Existen dos clases de tipos de coma flotante: float y double. El tipo double es el más utilizado porque muchas funciones matemáticas de la biblioteca de clases de C# usan valores double. Quizá, el tipo de coma flotante más interesante de C# es decimal, dirigido al uso de cálculos monetarios. La aritmética de coma flotante normal está sujeta a una variedad de errores de redondeo cuando se aplica a valores decimales. El tipo decimal elimina estos errores y puede representar hasta 28 lugares decimales.

Los caracteres en C# no tienen un tamaño de 8 bits como en muchos otros lenguajes de programación, sino que usan un tamaño de 16 bits. Este tipo de dato se llama char y utiliza la codificación Unicode. No existen conversiones automáticas de tipo entero a char.

Para los tipos de datos lógicos no existen conversiones automáticas de tipo entero a bool.

En ocasiones, resulta más sencillo usar un sistema numérico en base 16 en lugar de 10, para tal caso C# permite especificar números enteros en formato hexadecimal, y se define anteponiendo 0x, por ejemplo: 0xFF, que equivale a 255 en decimal. Asimismo, también permite poner estos en formato binario anteponiendo 0b.

C# tiene caracteres denominados secuencias de escape para facilitar la escritura con el teclado de símbolos que carecen de representación visual.

C#, al igual que C++, define un tipo de cadena de caracteres. Dentro de la cadena de caracteres se pueden usar secuencias de escape. Una cadena de caracteres puede iniciarse con el símbolo @ seguido por una cadena entre comillas ("), en tal caso, las secuencias de escape no tienen efecto, y además la cadena puede ocupar dos o más líneas.

Las variables son identificadores asociados a valores. Se declaran indicando el tipo de dato que almacenará y su identificador.

Un identificador puede:

Un identificador no puede:

empezar por un número.

empezar por un símbolo, ni aunque sea una palabra clave.

contener más de 511 caracteres.

Declarar una variable:

int miNumero ; // Declaramos la variable, pero no la inicializamos con ningún valor.

Para asignar un valor a una variable, se indica el identificador de la misma, seguido del símbolo igual (=) y el valor que queremos que almacene:

Se puede declarar y asignar un valor al mismo tiempo:

También puedes declarar una variable sin especificar el tipo de dato, utilizando el mecanismo de inferencia mediante la palabra clave var donde el compilador determina el tipo de dato que se le asignará a la variable y solamente es permitida para variables locales, no para parámetros o datos miembro.

Las conversiones de tipo de variables en C# se representan en la siguiente tabla en donde la fila es el origen y la columna el destino.

Toda conversión implícita no ocasiona pérdida de información, truncamientos o redondeos.

Es posible (aunque no siempre ocurre) que en una conversión explícita haya pérdida de información, truncamientos o redondeos.

En toda conversión implícita el tipo de dato destino es mayor que el tipo de dato origen.

La conversión explícita se realiza indicando el tipo de dato al que se quiere convertir entre paréntesis, seguido del valor:

Además de realizarse dentro de una asignación, las conversiones de tipos también tienen lugar dentro de una expresión, pues en cada operación ambos operandos deben de ser del mismo tipo. Si la conversión es del tipo implícito se efectúa el siguiente algoritmo en dicho orden:

1. Si un operando es decimal, el otro operando se transforma a decimal.

2. Si un operando es double, el otro operando se transforma a double.

3. Si un operando es float, el otro operando se transforma a float.

4. Si un operando es ulong, el otro operando se transforma a ulong.

5. Si un operando es long, el otro operando se transforma a long.

6. Si un operando es uint, y si el otro operando es de tipo sbyte, short o int, los dos se transforman a long.

7. Si un operando es uint, el otro operando se transforma a uint.

8. Si no es ninguno de los casos anteriores, los dos operandos se transforman a int.

Las constantes son valores inmutables, y por tanto no se pueden cambiar.

const

Cuando se declara una constante con la palabra clave const, también se debe asignar el valor. Tras esto, la constante queda bloqueada y no se puede cambiar. Son implícitamente estáticas ( static).

readonly

A diferencia de const, no requiere que se asigne el valor al mismo tiempo que se declara. Pueden ser miembros de la instancia o miembros estáticos de la clase ( static).

Los operadores aritméticos funcionan igual que en C y C++.

El resultado de los operadores relacionales y lógicos es un valor de tipo bool.

Los operadores de cortocircuito evalúan el segundo operando solo cuando es necesario.

Los operadores a nivel de bits no se pueden aplicar a tipos bool, float, double o decimal.

if-else

switch

for

while

do-while

foreach

Las instrucciones if-else, for, while, do-while, switch, return, break, continue son, básicamente, iguales que en C, C++ y Java.

La instrucción foreach, al igual que en Java, realiza un ciclo a través de los elementos de una matriz o colección. En este ciclo se recorre la colección y la variable recibe un elemento de dicha colección en cada iteración.

La instrucción goto se sigue utilizando en C# a pesar de la polémica sobre su uso.

Todo método debe ser parte de una clase, no existen métodos globales (funciones).

Por defecto, los parámetros se pasan por valor. (Nótese que las listas y otras colecciones son variables por referencia (referencias al espacio reservado para esa lista en la pila) y que se pasa por valor al método la referencia, pero el espacio reservado para la lista es común, por lo que si elimina un elemento lo hace también de la original).

El modificador ref fuerza a pasar los parámetros por referencia en vez de pasarlos por valor y obliga a inicializar la variable antes de pasar el parámetro.

El modificador out es similar al modificador ref, con la diferencia de que no se obliga a inicializar la variable antes de pasar el parámetro.

Cuando ref y out modifican un parámetro de referencia, la propia referencia se pasa por referencia.

El modificador params sirve para definir un número variable de argumentos los cuales se implementan como una matriz.

Un método debe tener como máximo un único parámetro params y este debe ser el último.

Un método puede devolver cualquier tipo de dato, incluyendo tipos de clase.

Ya que en C# las matrices se implementan como objetos, un método también puede devolver una matriz (algo que se diferencia de C++ en que las matrices no son válidas como tipos de valores devueltos).

C# implementa sobrecarga de métodos, dos o más métodos pueden tener el mismo nombre siempre y cuando se diferencien por sus parámetros.

El método Main es un método especial al cual se refiere el punto de partida del programa.

ref

out

params

Sobrecarga de métodos

Main

En C# las matrices se implementan como objetos.

Los índices de las matrices comienzan en 0.

Ya que C# implementa las matrices como objetos, cada matriz tiene una propiedad Length que contiene el número de elementos que puede alojar o tiene alojados.

Declarar una matriz:

Declarar e inicializar una matriz (el tamaño de la matriz se puede omitir):

Acceder a un elemento:

Declarar una matriz multidimensional:

Declarar e inicializar una matriz multidimensional (el tamaño de la matriz se puede omitir):

Acceder a un elemento de una matriz multidimensional:

Más información en: Tutorial de matrices (C#) (en inglés).

Una variable de objeto de cierta clase no almacena los valores del objeto sino su referencia (al igual que Java)

El operador de asignación no copia los valores de un objeto, sino la referencia al mismo (al igual que Java).

Un constructor tiene el mismo nombre que su clase y es sintácticamente similar a un método.

Un constructor no devuelve ningún valor (ni siquiera void).

Al igual que los métodos, los constructores también pueden ser sobrecargados.

Si no se especifica un constructor en una clase, se usa uno por defecto que consiste en asignar a todas las variables el valor 0, null o false según corresponda.

Cuando un objeto no es referenciado por ninguna variable, el recolector de basura ejecuta el destructor de dicha clase y libera la memoria utilizada.

El destructor de una clase no se llama cuando un objeto sale del ámbito.

Todos los destructores se llamarán antes de que finalice un programa.

La palabra clave this es una referencia al mismo objeto en el cual se usa.

La palabra clave base es una referencia a la clase padre del objeto en la que se usa (por defecto, Object).

La palabra clave static hace que un miembro pertenezca a una clase en vez de pertenecer a objetos de dicha clase. Se puede tener acceso a dicho miembro antes de que se cree cualquier objeto de su clase y sin referencias a un objeto.

Un método static no tiene una referencia this.

Un método static puede llamar solamente a otros métodos static.

Un método static solamente debe tener acceso directamente a datos static.

Un constructor static se usa para inicializar atributos que se aplican a una clase en lugar de aplicarse a una instancia.

C# permite la sobrecarga de operadores (+, -, *, etc.) con la palabra clave operator.

Declarar una clase:

Iniciar una clase (también llamado crear un objeto de la clase o instanciar una clase):

Constructor (como si fuera un método, pero con el nombre de su clase):

Destructor (como si fuera un método, precedido del símbolo '~'):

Comparación de objetos:

El tipo de dato para las cadenas de caracteres es string.

Realmente la palabra clave string es un alias de la clase System.String de la plataforma .NET.

En C# las cadenas son objetos y no una matriz de caracteres; aun así, se puede obtener un carácter arbitrario de una cadena por medio de su índice (pero no modificarlo).

Las cadenas son inmutables, una vez creadas no se pueden modificar, solo se pueden copiar total o parcialmente.

El operador == determina si dos referencias hacen referencia al mismo objeto, pero al usar dicho operador con dos variables tipo string se prueba la igualdad del contenido de las cadenas y no su referencia. Sin embargo, con el resto de los operadores relacionales, como < y >=, sí se comparan las referencias.

Se pueden concatenar (unir) dos cadenas mediante el operador +.

Las cadenas se pueden usar en las instrucciones switch.

Declarar una cadena de caracteres (como si fuera una variable de un tipo de dato como int o double):

Longitud de una cadena:

Comparar dos cadenas:

Concatenar cadenas:

La clase System.String, y una instancia de la misma, string, poseen algunos métodos para trabajar con cadenas, como:

static string Copy(string str): devuelve una copia de str.

int CompareTo(string str): devuelve menor que cero si la cadena que llama es menor que str, mayor que cero si la cadena que llama es mayor que str, y cero si las cadenas son iguales.

int IndexOf(string str): devuelve el índice de la primera coincidencia de la subcadena especificada en str, o -1 en caso de error.

int LastIndexOf(string str): devuelve el índice de la última coincidencia de la subcadena especificada en str, o -1 en caso de error.

string ToLower: devuelve una copia de la cadena en minúsculas.

string ToUpper: devuelve una copia de la cadena en mayúsculas.

string Substring: devuelve una subcadena, indicando la posición de inicio y la longitud que se desea.

Más información en: String (Clase) (System) (en inglés).

LINQ (Language-Integrated Query)

Language-Integrated Query (LINQ) es el nombre de un conjunto de tecnologías que consiste en la integración directa de funciones de consulta en el lenguaje C# (también en Visual Basic y potencialmente en cualquier otro lenguaje de .NET). Con LINQ, ahora una consulta es una construcción de lenguaje de primera clase, igual que las clases, los métodos, los eventos, etc.

Para un programador que escribe consultas, la parte integrada en el lenguaje más visible de LINQ es la expresión de consulta. Las expresiones de consulta se escriben en la sintaxis de consulta declarativa que se introdujo en C# 3.0. Al usar sintaxis de consulta, se pueden realizar incluso operaciones complejas de filtrado, ordenación y agrupamiento en orígenes de datos con código mínimo. Los mismos patrones de expresión de consulta básicos se usan para consultar y transformar datos de bases de datos SQL, conjuntos de datos de ADO.NET, secuencias y documentos XML, y colecciones de .NET.

En el siguiente ejemplo se muestra la operación de consulta completa. La operación completa incluye la creación de un origen de datos, la definición de la expresión de consulta y la ejecución de la consulta en una instrucción foreach.

https://msdn.microsoft.com/es-es/library/bb397676(v=vs.120).aspx

Ejemplo básico " Hola mundo":

Suma y concatenación:

Uso de clases, métodos, propiedades y sobrecarga:

Ejemplo de Vectores o Arreglos paralelos:

Problema 1:

Desarrollar un programa que permita cargar 5 nombres de personas y sus edades respectivas. Luego de realizar la carga por teclado de todos los datos imprimir los nombres de las personas mayores de edad (mayores o iguales a 18 años).

Programa:

Cabe destacar que los controles comunes que ofrece la plataforma .NET se pueden personalizar y/o editar para satisfacer las diferentes necesidades de los desarrolladores. El tomar la decisión de crear un control personalizado llega cuando se desea hacer una componente en donde se tiene el control total sobre su aspecto funcional y visual; con la posibilidad de no cargar las funcionalidades innecesarias para el desarrollo.

Los casos comunes en donde se suelen usar estas características son:

Controles simples con funcionalidad limitada (como un botón al que se le agrega movimiento).

Controles en donde se tengan características innecesarias para el desarrollo (un botón sin los márgenes).

Controles en donde se necesite la misma funcionalidad en un diseño diferente (botones en forma de línea para representar una arista).

Compiladores e IDE's

En la actualidad existen los siguientes compiladores o IDE para el lenguaje C#:

El estándar ECMA-334 lista las siguientes metas en el diseño para C#:

Lenguaje de programación orientado a objetos simple, moderno y de propósito general.

Inclusión de principios de ingeniería de software tales como revisión estricta de los tipos de datos, revisión de límites de vectores, detección de intentos de usar variables no inicializadas, y recolección de basura automática.

Capacidad para desarrollar componentes de software que se puedan usar en ambientes distribuidos.

Portabilidad del código fuente.

Fácil migración del programador al nuevo lenguaje, especialmente para programadores familiarizados con C, C++ y Java.

Soporte para internacionalización.

Adecuación para escribir aplicaciones de cualquier tamaño: desde las más grandes y sofisticadas como sistemas operativos hasta las más pequeñas funciones.

Aplicaciones económicas en cuanto a memoria y procesado.

En castellano

# data[].attributes.attachment_link.title
C Sharp - Wikipedia, la enciclopedia libre

# data[].attributes.attachment_link.description
C# Desarrollador(es) Microsoft https://docs.microsoft.com/en-us/dotnet/csharp/, https://docs.microsoft.com/de-de/dotnet/csharp/, https://docs.microsoft.com/ja-jp/dotnet/csharp/, https://docs.microsoft.com/fr-fr/dotnet/csharp/ y https://docs.microsoft.com/it-it/dotnet/csharp/ Información general Extensiones comunes .cs .csx .cshtml .razor Paradigma Multiparadigma: estructurado, imperativo, orientado a objetos, dirigido por eventos, funcional, genérico, reflexivo Apareció en 2000 Diseñado por Microsoft Última versión estable 12.0 (14 de noviembre de 2023 (6 meses y 11 días))

# data[].attributes.attachment_link.readable_text
C++

Desarrollador(es)

Bjarne Stroustrup, Laboratorios Bell
https://isocpp.org/ y http://www.open-std.org/jtc1/sc22/wg21/

Información general

Extensiones comunes

.h .hh .hpp .hxx .h++ .cc .cpp .cxx .c++

Paradigma

Multiparadigma: Programación Estructurada, imperativo, programación genérica

Apareció en

1983

Diseñado por

Bjarne Stroustrup

Última versión estable

ISO/IEC 14882:2020 ( C++20)[1] ​ (Diciembre de 2020)

Última versión en pruebas

C++23 (2023)

Sistema de tipos

Fuerte, estático, nominativo

Implementaciones

C++ Builder, clang, Comeau C/C++, GCC, Intel C++ Compiler, Microsoft Visual C++, Sun Studio, Code::Blocks, Zinjai

Dialectos

ISO/IEC C++ 1998, ISO/IEC C++ 2003, ISO/IEC C++ 2011

Influido por

C, Simula, Ada 83, ALGOL 68, CLU, ML[2] ​

Ha influido a

Perl, LPC, Lua, Pike, Ada 95, Java, PHP, D, C99, C#, Falcon

Sistema operativo

Multiplataforma

Bjarne Stroustrup, creador de C++.

C++ es un lenguaje de programación diseñado en 1979 por Bjarne Stroustrup. La intención de su creación fue extender al lenguaje de programación C y añadir mecanismos que permiten la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, C++ es un lenguaje híbrido.

Posteriormente se añadieron facilidades de programación genérica, que se sumaron a los paradigmas de programación estructurada y programación orientada a objetos. Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma.

Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría de los fabricantes de compiladores más modernos. Existen también algunos intérpretes, tales como ROOT.

El nombre "C++" fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C.

Su sintaxis es heredada del lenguaje C.

Programa orientado a objetos (POO).

Permite la agrupación de instrucciones.

Es portátil y tiene un gran número de compiladores en diferentes plataformas y sistemas operativos.

Permite la separación de un programa en módulos que admiten compilación independiente.

Es un lenguaje de alto nivel.

A continuación se cita un programa de ejemplo Hola mundo escrito en C++:

Al usar la directiva #include se le dice al compilador que busque e interprete todos los elementos definidos en el archivo que acompaña la directiva (en este caso, iostream). Para evitar sobrescribir los elementos ya definidos al ponerles igual nombre, se crearon los espacios de nombres o namespace del singular en inglés. En este caso hay un espacio de nombres llamado std, que es donde se incluyen las definiciones de todas las funciones y clases que conforman la biblioteca estándar de C++. Al incluir la sentencia using namespace std le estamos diciendo al compilador que usaremos el espacio de nombres std por lo que no tendremos que incluirlo cuando usemos elementos de este espacio de nombres, como pueden ser los objetos cout y cin, que representan el flujo de salida estándar (típicamente la pantalla o una ventana de texto) y el flujo de entrada estándar (típicamente el teclado).

La definición de funciones es igual que en C, salvo por la característica de que si main no va a recoger argumentos, no tenemos por qué ponérselos, a diferencia de C, donde había que ponerlos explícitamente, aunque no se fueran a usar. Queda solo comentar que el símbolo << se conoce como operador de inserción, y grosso modo está enviando a cout lo que queremos mostrar por pantalla para que lo pinte, en este caso la cadena "Hola mundo". El mismo operador << se puede usar varias veces en la misma sentencia, de forma que gracias a esta característica podremos concatenar el objeto endl al final, cuyo resultado será imprimir un retorno de línea.

C++ tiene los siguientes tipos fundamentales:

El modificador unsigned se puede aplicar a enteros para obtener números sin signo (por omisión los enteros contienen signo), con lo que se consigue un rango mayor de números naturales.

Según la máquina y el compilador que se utilice los tipos primitivos pueden ocupar un determinado tamaño en memoria. La siguiente lista ilustra el número de bits que ocupan los distintos tipos primitivos en la arquitectura x86.

Otras arquitecturas pueden requerir distintos tamaños de tipos de datos primitivos. C++ no dice nada acerca de cuál es el número de bits en un byte, ni del tamaño de estos tipos; más bien, ofrece solamente las siguientes "garantías de tipos":

De acuerdo al estándar C99, un tipo char debe ocupar exactamente un byte compuesto de un mínimo de 8 bits independientemente de la arquitectura de la máquina.

El tamaño reconocido de char es de 1. Es decir, sizeof(char) siempre devuelve 1.

Un tipo short tiene al menos el mismo tamaño que un tipo char.

Un tipo long tiene al menos el doble tamaño en bytes que un tipo short.

Un tipo int tiene un tamaño entre el de short y el de long, ambos incluidos, preferentemente el tamaño de un apuntador de memoria de la máquina. Su valor máximo es 2147483647, usando 32 bits.

Un tipo unsigned tiene el mismo tamaño que su versión signed.

Para la versión del estándar que se publicó en 1998, se decidió añadir el tipo de dato wchar_t, que permite el uso de caracteres UNICODE, a diferencia del tradicional char, que contempla simplemente al código de caracteres ASCII extendido. A su vez, se ha definido para la mayoría de las funciones y clases, tanto de C como de C++, una versión para trabajar con wchar_t, donde usualmente se prefija el carácter w al nombre de la función (en ocasiones el carácter es un infijo). Por ejemplo:

Cabe resaltar que en C se define wchar_t como:

Mientras que en C++ es en sí mismo un tipo de dato.

La palabra reservada void define en C++ el concepto de no existencia o no atribución de un tipo en una variable o declaración. Es decir, una función declarada como void no devolverá ningún valor. Esta palabra reservada también puede usarse para indicar que una función no recibe parámetros, como en la siguiente declaración:

Aunque la tendencia actual es la de no colocar la palabra "void".

Además se utiliza para determinar que una función no retorna un valor, como en:

Cabe destacar que void no es un tipo. Una función como la declarada anteriormente no puede retornar un valor por medio de return: la palabra clave va sola. No es posible una declaración del tipo:

En este sentido, void se comporta de forma ligeramente diferente a como lo hace en C, especialmente en cuanto a su significado en declaraciones y prototipos de funciones.

Sin embargo, la forma especial void * indica que el tipo de datos es un puntero. Por ejemplo:

Indica que memoria es un puntero a alguna parte, donde se guarda información de algún tipo. El programador es responsable de definir estos "algún", eliminando toda ambigüedad. Una ventaja de la declaración " void *" es que puede representar a la vez varios tipos de datos, dependiendo de la operación de cast escogida. La memoria que hemos apuntado en alguna parte, en el ejemplo anterior, bien podría almacenar un entero, un flotante, una cadena de texto o un programa, o combinaciones de estos. Es responsabilidad del programador recordar qué tipo de datos hay y garantizar el acceso adecuado.

Además de los valores que pueden tomar los tipos anteriormente mencionados, existe un valor llamado NULL, sea el caso numérico para los enteros, carácter para el tipo char, cadena de texto para el tipo string, etc. El valor NULL, expresa, por lo regular, la representación de una Macro, asignada al valor "0".

Tenemos entonces que:

El valor de las variables anteriores nos daría 0. A diferencia de la variable "caracter", que nos daría el equivalente a NULL, '\0', para caracteres.

Para evitar ambigüedad en funciones sobrecargadas, puede emplearse la palabra clave nullptr. Esta palabra clave siempre representa un puntero. Por ejemplo:

Todo programa en C++ debe tener la función principal main() (a no ser que se especifique en tiempo de compilación otro punto de entrada, que en realidad es la función que tiene el main())

La función principal del código fuente main debe tener uno de los siguientes prototipos:
int main()
int main(int argc, char** argv)

Aunque no es estándar algunas implementaciones permiten
int main(int argc, char** argv, char** env)

La primera es la forma por omisión de un programa que no recibe parámetros ni argumentos. La segunda forma tiene dos parámetros: argc, un número que describe el número de argumentos del programa (incluyendo el nombre del programa mismo), y argv, un puntero a un array de punteros, de argc elementos, donde el elemento argv[i] representa el i-ésimo argumento entregado al programa. En el tercer caso se añade la posibilidad de poder acceder a las variables de entorno de ejecución de la misma forma que se accede a los argumentos del programa, pero reflejados sobre la variable env.

El tipo de retorno de main es un valor entero int. Al finalizar la función main, debe incluirse el valor de retorno (por ejemplo, return 0;, aunque el estándar prevé solamente dos posibles valores de retorno: EXIT_SUCCESS y EXIT_FAILURE, definidas en el archivo cstdlib), o salir por medio de la función exit. Alternativamente puede dejarse en blanco, en cuyo caso el compilador es responsable de agregar la salida adecuada.

Los objetos en C++ son abstraídos mediante una clase. Según el paradigma de la programación orientada a objetos un objeto consta de:

1. Identidad, que lo diferencia de otros objetos (Nombre que llevará la clase a la que pertenece dicho objeto).

2. Métodos o funciones miembro.

3. Atributos o variables miembro.

Un ejemplo de clase que podemos tomar es la clase perro. Cada perro comparte unas características (atributos). Su número de patas, el color de su pelaje o su tamaño son algunos de sus atributos. Las funciones que lo hagan ladrar, cambiar su comportamiento... esas son las funciones de la clase.

Este es otro ejemplo de una clase:

Son unos métodos especiales que se ejecutan automáticamente al crear un objeto de la clase. En su declaración no se especifica el tipo de dato que devuelven, y poseen el mismo nombre que la clase a la que pertenecen. Al igual que otros métodos, puede haber varios constructores sobrecargados, aunque no pueden existir constructores virtuales.

Como característica especial a la hora de implementar un constructor, justo después de la declaración de los parámetros, se encuentra lo que se llama "lista de inicializadores". Su objetivo es llamar a los constructores de los atributos que conforman el objeto a construir.

Cabe destacar que no es necesario declarar un constructor al igual que un destructor, pues el compilador lo puede hacer, aunque no es la mejor forma de programar.

Tomando el ejemplo de la Clase Punto, si deseamos que cada vez que se cree un objeto de esta clase las coordenadas del punto sean igual a cero podemos agregar un constructor como se muestra a continuación:

Si compilamos y ejecutamos el anterior programa, obtenemos una salida que debe ser similar a la siguiente:

Coordenada X: 0 Coordenada Y: 0

Existen varios tipos de constructores en C++:

1. Constructor predeterminado. Es el constructor que no recibe ningún parámetro en la función. Si no se definiera ningún constructor, el sistema proporcionaría uno predeterminado. Es necesario para la construcción de estructuras y contenedores de la STL.

2. Constructor de copia. Es un constructor que recibe un objeto de la misma clase, y realiza una copia de los atributos del mismo. Al igual que el predeterminado, si no se define, el sistema proporciona uno.

3. Constructor de conversión. Este constructor, recibe como único parámetro, un objeto o variable de otro tipo distinto al suyo propio. Es decir, convierte un objeto de un tipo determinado a otro objeto del tipo que estamos generando.

Constructores + Memoria heap Un objeto creado de la forma que se vio hasta ahora, es un objeto que vive dentro del scope(las llaves { }) en el que fue creado. Para que un objeto pueda seguir viviendo cuando se saque del scope en el que se creó, se lo debe crear en memoria heap. Para esto, se utiliza el operador new, el cual asigna memoria para almacenar al objeto creado, y además llama a su constructor(por lo que se le pueden enviar parámetros). El operador new se utiliza de la siguiente manera:

Además, con el operador new[] se pueden crear arrays (colecciones o listas ordenadas) de tamaño dinámico:

Los destructores son funciones miembro especiales llamadas automáticamente en la ejecución del programa, y por tanto no tienen por qué ser llamadas explícitamente por el programador. Sus principales cometidos son:

Liberar los recursos computacionales que el objeto de dicha clase haya adquirido en tiempo de ejecución al expirar este.

Quitar los vínculos que pudiesen tener otros recursos u objetos con este.

Los destructores son invocados automáticamente al alcanzar el flujo del programa el fin del ámbito en el que está declarado el objeto. El único caso en el que se debe invocar explícitamente al destructor de un objeto es cuando este fue creado mediante el operador new, es decir, que este vive en memoria heap, y no en la pila de ejecución del programa. La invocación del destructor de un objeto que vive en heap se realiza a través del operador delete o delete[] para arrays. Ejemplo:

Si no se utilizara el operador delete y delete[] en ese caso, la memoria ocupada por unEntero y arrayDeEnteros respectivamente, quedaría ocupada sin sentido. Cuando una porción de memoria queda ocupada por una variable que ya no se utiliza, y no hay forma de acceder a ella, se denomina un 'memory leak'. En aplicaciones grandes, si ocurren muchos memory leaks, el programa puede terminar ocupando bastante más memoria RAM de la que debería, lo que no es para nada conveniente. Es por esto, que el manejo de memoria heap debe usarse conscientemente.

Existen dos tipos de destructores pueden ser públicos o privados, según si se declaran:

Si es público se llama desde cualquier parte del programa para destruir el objeto.

Si es privado no se permite la destrucción del objeto por el usuario.

El uso de destructores es clave en el concepto de Adquirir Recursos es Inicializar.

Función miembro es aquella que está declarada en ámbito de clase. Son similares a las funciones habituales, con la salvedad de que el compilador realizara el proceso de Decoración de nombre ( Name Mangling en inglés): Cambiará el nombre de la función añadiendo un identificador de la clase en la que está declarada, pudiendo incluir caracteres especiales o identificadores numéricos. Este proceso es invisible al programador. Además, las funciones miembro reciben implícitamente un parámetro adicional: El puntero this, que referencia al objeto que ejecuta la función.

Las funciones miembro se invocan accediendo primero al objeto al cual refieren, con la sintaxis: myobject.mymemberfunction(), esto es un claro ejemplo de una función miembro.

Caso especial es el de las funciones miembro estáticas. A pesar de que son declaradas dentro de la clase, con el uso de la palabra clave static no recibirán el puntero this. Gracias a esto no es necesario crear ninguna instancia de la clase para llamar a esta función, sin embargo, solo se podrá acceder a los miembros estáticos de la clase dado que estos no están asociados al objeto sino al tipo. La sintaxis para llamar a esta función estática es mytype::mystaticmember().

Las plantillas son el mecanismo de C++ para implantar el paradigma de la programación genérica. Permiten que una clase o función trabaje con tipos de datos abstractos, especificándose más adelante cuales son los que se quieren usar. Por ejemplo, es posible construir un vector genérico que pueda contener cualquier tipo de estructura de datos. De esta forma se pueden declarar objetos de la clase de este vector que contengan enteros, flotantes, polígonos, figuras, fichas de personal, etc.

La declaración de una plantilla se realiza anteponiendo la declaración template <typename A,....> a la declaración de la estructura (clase, estructura o función) deseado.

Por ejemplo:

La función max() es un ejemplo de programación genérica, y dados dos parámetros de un tipo T (que puede ser int, long, float, double, etc.) devolverá el mayor de ellos (usando el operador >). Al ejecutar la función con parámetros de un cierto tipo, el compilador intentará "calzar" la plantilla a ese tipo de datos, o bien generará un mensaje de error si fracasa en ese proceso.

Especialización

El siguiente ejemplo:

crea una plantilla bajo la cual pueden ser definidas en el código de cabecera cualesquiera funciones especializadas para un tipo de datos como int myfunction(int), int myfunction(std::string), int myfunction(bool), etcétera:

Cada una de estas funciones tiene su propia definición (cuerpo). Cada cuerpo diferente, no equivalente ("no convertible") corresponde a una especialización. Si una de estas funciones no fuera definida, el compilador tratará de aplicar las conversiones de tipos de datos que le fuesen permitidas para "calzar" una de las plantillas, o generará un mensaje de error si fracasa en ese proceso.

Todas las definiciones habilitadas de una plantilla deben estar disponibles al momento de la compilación, por lo cual no es posible actualmente "compilar" una plantilla como archivo de objeto, sino simplemente compilar especializaciones de la plantilla. Por lo tanto, las plantillas se distribuyen junto con el código fuente de la aplicación. En otras palabras, no es posible compilar la plantilla std::vector< > a código objeto, pero sí es posible, por ejemplo, compilar un tipo de datos std::vector<std::string>.

En C++ es posible definir clases abstractas. Una clase abstracta, o clase base abstracta (ABC), es una que está diseñada solo como clase padre de las cuales se deben derivar clases hijas. Una clase abstracta se usa para representar aquellas entidades o métodos que después se implementarán en las clases derivadas, pero la clase abstracta en sí no contiene ninguna implementación -- solamente representa los métodos que se deben implementar. Por ello, no es posible instanciar una clase abstracta, pero sí una clase concreta que implemente los métodos definidos en ella.

Las clases abstractas son útiles para definir interfaces, es decir, un conjunto de métodos que definen el comportamiento de un módulo determinado. Estas definiciones pueden utilizarse sin tener en cuenta la implementación que se hará de ellos.

En C++ los métodos de las clases abstractas se definen como funciones virtuales puras.

En el ejemplo, la clase ConcretaA es una implementación de la clase Abstracta, y la clase ConcretaB es otra implementación. Debe notarse que el= 0 es la notación que emplea C++ para definir funciones virtuales puras.

Una adición a las características de C son los espacios de nombre ( namespace en inglés), los cuales pueden describirse como áreas virtuales bajo las cuales ciertos nombres de variable o tipos tienen validez. Esto permite evitar las ocurrencias de conflictos entre nombres de funciones, variables o clases.

El ejemplo más conocido en C++ es el espacio de nombres std::, el cual almacena todas las definiciones nuevas en C++ que difieren de C (algunas estructuras y funciones), así como las funcionalidades propias de C++ ( streams) y los componentes de la biblioteca STL.

Por ejemplo:

Como puede verse, las invocaciones directas a mi_valor darán acceso solamente a la variable descrita localmente; para acceder a la variable del espacio de nombres mi_paquete es necesario acceder específicamente el espacio de nombres. Un atajo recomendado para programas sencillos es la directiva using namespace, que permite acceder a los nombres de variables del paquete deseado en forma directa, siempre y cuando no se produzca alguna ambigüedad o conflicto de nombres.

Existen varios tipos de herencia entre clases en el lenguaje de programación C++. Estos son:

Herencia simple

La herencia en C++ es un mecanismo de abstracción creado para poder facilitar y mejorar el diseño de las clases de un programa. Con ella se pueden crear nuevas clases a partir de clases ya hechas, siempre y cuando tengan un tipo de relación especial.

En la herencia, las clases derivadas "heredan" los datos y las funciones miembro de las clases base, pudiendo las clases derivadas redefinir estos comportamientos (polimorfismo) y añadir comportamientos nuevos propios de las clases derivadas. Para no romper el principio de encapsulamiento (ocultar datos cuyo conocimiento no es necesario para el uso de las clases), se proporciona un nuevo modo de visibilidad de los datos/funciones: "protected". Cualquier cosa que tenga visibilidad protected se comportará como pública en la clase Base y en las que componen la jerarquía de herencia, y como privada en las clases que NO sean de la jerarquía de la herencia.

Antes de utilizar la herencia, nos tenemos que hacer una pregunta, y si tiene sentido, podemos intentar usar esta jerarquía: Si la frase <claseB> ES-UN <claseA> tiene sentido, entonces estamos ante un posible caso de herencia donde clase A será la clase base y clase B la derivada.

Ejemplo: clases Barco, Acorazado, Carguero, etc. Un Acorazado ES-UN Barco, un Carguero ES-UN Barco, un Trasatlántico ES-UN Barco, etc.

En este ejemplo tendríamos las cosas generales de un Barco (en C++)

y ahora las características de las clases derivadas, podrían (a la vez que heredan las de barco) añadir cosas propias del subtipo de barco que vamos a crear, por ejemplo:

Por último, hay que mencionar que existen 3 clases de herencia que se diferencian en el modo de manejar la visibilidad de los componentes de la clase resultante:

Herencia pública (class Derivada: public Base ): Con este tipo de herencia se respetan los comportamientos originales de las visibilidades de la clase Base en la clase Derivada.

Herencia privada (clase Derivada: private Base): Con este tipo de herencia todo componente de la clase Base, será privado en la clase Derivada (las propiedades heredadas serán privadas aunque estas sean públicas en la clase Base)

Herencia protegida (clase Derivada: protected Base): Con este tipo de herencia, todo componente público y protegido de la clase Base, será protegido en la clase Derivada, y los componentes privados, siguen siendo privados.

Herencia múltiple

La herencia múltiple es el mecanismo que permite al programador hacer clases derivadas a partir, no de una sola clase base, sino de varias. Para entender esto mejor, pongamos un ejemplo: Cuando ves a quien te atiende en una tienda, como persona que es, podrás suponer que puede hablar, comer, andar, pero, por otro lado, como empleado que es, también podrás suponer que tiene un jefe, que puede cobrarte dinero por la compra, que puede devolverte el cambio, etc. Si esto lo trasladamos a la programación sería herencia múltiple (clase empleado_tienda):

Por tanto, es posible utilizar más de una clase para que otra herede sus características.

La sobrecarga de operadores es una forma de hacer polimorfismo. Es posible definir el comportamiento de un operador del lenguaje para que trabaje con tipos de datos definidos por el usuario. No todos los operadores de C++ son factibles de sobrecargar, y, entre aquellos que pueden ser sobrecargados, se deben cumplir condiciones especiales. En particular, los operadores sizeof y :: no son sobrecargables.

No es posible en C++ crear un operador nuevo.

Los comportamientos de los operadores sobrecargados se implementan de la misma manera que una función, salvo que esta tendrá un nombre especial: Tipo de dato de devolución operator<token del operador>(parámetros)

Los siguientes operadores pueden ser sobrecargados:

Dado que estos operadores son definidos para un tipo de datos definido por el usuario, este es libre de asignarles cualquiera semántica que desee. Sin embargo, se considera de primera importancia que las semánticas sean tan parecidas al comportamiento natural de los operadores como para que el uso de los operadores sobrecargados sea intuitivo. Por ejemplo, el uso del operador unario - debiera cambiar el "signo" de un "valor".

Los operadores sobrecargados no dejan de ser funciones, por lo que pueden devolver un valor, si este valor es del tipo de datos con el que trabaja el operador, permite el encadenamiento de sentencias. Por ejemplo, si tenemos 3 variables A, B y C de un tipo T y sobrecargamos el operador = para que trabaje con el tipo de datos T, hay dos opciones: si el operador no devuelve nada una sentencia como "A=B=C;" (sin las comillas) daría error, pero si se devuelve un tipo de datos T al implementar el operador, permitiría concatenar cuantos elementos se quisieran, permitiendo algo como "A=B=C=D=...;"

Los lenguajes de programación suelen tener una serie de bibliotecas de funciones integradas para la manipulación de datos a nivel más básico. En C++, además de poder usar las bibliotecas de C, se puede usar la nativa STL (Standard Template Library), propia del lenguaje. Proporciona una serie plantillas (templates) que permiten efectuar operaciones sobre el almacenado de datos, procesado de entrada/salida.

Las clases basic_ostream y basic_stream, y los objetos cout y cin, proporcionan la entrada y salida estándar de datos (teclado/pantalla). También está disponible cerr, similar a cout, usado para la salida estándar de errores. Estas clases tienen sobrecargados los operadores << y >>, respectivamente, con el objeto de ser útiles en la inserción/extracción de datos a dichos flujos. Son operadores inteligentes, ya que son capaces de adaptarse al tipo de datos que reciben, aunque tendremos que definir el comportamiento de dicha entrada/salida para clases/tipos de datos definidos por el usuario. Por ejemplo:

De esta forma, para mostrar un punto, solo habría que realizar la siguiente expresión:

Es posible formatear la entrada/salida, indicando el número de dígitos decimales a mostrar, si los textos se pasarán a minúsculas o mayúsculas, si los números recibidos están en formato octal o hexadecimal, etc.

Tipo de flujo para el manejo de ficheros. La definición previa de ostreams/istreams es aplicable a este apartado. Existen tres clases (ficheros de lectura, de escritura o de lectura/escritura): ifstream, ofstream y fstream.

Como abrir un fichero: (nombre_variable_fichero).open("nombre_fichero.dat/txt", ios::in); para abrirlo en modo lectura. (nombrevariablefichero).open("nombre_fichero.dat/txt", ios::out); para abrirlo en modo escritura.

Ejemplo: f.open("datos.txt", ios::in);

Como cerrar el fichero: nombre_variable_fichero.close();

Ejemplo: f.close();

Leer un fichero:

1-Si es fichero de texto plano:

2-Si es un fichero binario(.dat);
  nombre_variable_fichero.read((char*)&nombre_variable, sizeof(tipo_variable));

Ejemplo:

f.read((char*)&e, sizeof(int));

Escribir un fichero:

1-Si es fichero de texto(.txt):
  nombrevariable<<"texto"; donde "texto" puede ser también una variable de cualquier tipo primitivo, o un string.

  Ejemplo: f<<HOLA;

2-Si es un fichero binario(.dat);
  nombre_variable_fichero.write((char*)&nombre_variable, sizeof(tipo_variable));

Ejemplo:

f.write((char*)&e, sizeof(int));

Pueden abrirse pasando al constructor los parámetros relativos a la ubicación del fichero y el modo de apertura:

Se destacan dos clases, ostringstream e istringstream. Todo lo anteriormente dicho es aplicable a estas clases. Tratan a una cadena como si de un flujo de datos se tratase. ostringstream permite elaborar una cadena de texto insertando datos cual flujo, e istringstream puede extraer la información contenida en una cadena (pasada como parámetro en su constructor) con el operador>>. Ejemplos:

Son clases plantillas especiales utilizadas para almacenar tipos de datos genéricos, sean cuales sean. Todos los contenedores son homogéneos, es decir, una vez que se declaran para contener un tipo de dato determinado, en ese contenedor, solo se podrán meter elementos de ese tipo. Según la naturaleza del almacenado, disponemos de varios tipos:

Para añadir elementos al final del vector, se utiliza el método push_back(const T&). Por otro lado, para eliminar un elemento del final del vector, se debe usar el método pop_back().

Colas dobles: son parecidas a los vectores, pero tienen mejor eficiencia para agregar o eliminar elementos en las "puntas".

deque<tipo_de_dato> nombre_de_la_cola;

Además de los métodos push_back(const T&) y pop_back(), se agregan los métodos push_front(const T&) y pop_front(), que realizan lo mismo que los ya explicados, pero en el comienzo de la cola.

Listas: Son eficientes a la hora de agregar elementos. La diferencia con las colas dobles, es que son más eficientes para eliminar elementos que no estén en alguna de las "puntas"
list<tipo_de_dato> nombre_de_la_lista;

Adaptadores de secuencia.

Contenedores asociativos: map y multimap, que permiten asociar una "clave" con un "valor". map no permite valores repetidos, mientras que multimap si.

map<tipo_de_llave, tipo_de_dato> nombre_del_map;
multimap<tipo_de_llave, tipo_de_dato> nombre_del_multimap;

Contenedores asociativos: set y multiset, que ofrecen solamente la condición de "pertenencia", sin la necesidad de garantizar un ordenamiento particular de los elementos que contienen.

Pueden considerarse como una generalización de la clase de "puntero". Un iterador es un tipo de dato que permite el recorrido y la búsqueda de elementos en los contenedores. Como las estructuras de datos (contenedores) son clases genéricas, y los operadores (algoritmos) que deben operar sobre ellas son también genéricos (funciones genéricas), Stepanov y sus colaboradores tuvieron que desarrollar el concepto de iterador como elemento o nexo de conexión entre ambos. El nuevo concepto resulta ser una especie de punteros que señalan a los diversos miembros del contenedor (punteros genéricos que como tales no existen en el lenguaje).

Combinando la utilización de templates y un estilo específico para denotar tipos y variables, la STL ofrece una serie de funciones que representan operaciones comunes, y cuyo objetivo es "parametrizar" las operaciones en que estas funciones se ven involucradas de modo que su lectura, comprensión y mantenimiento, sean más fáciles de realizar.

Un ejemplo es la función copy, la cual simplemente copia variables desde un lugar a otro. Más estrictamente, copia los contenidos cuyas ubicaciones están delimitadas por dos iteradores, al espacio indicado por un tercer iterador. La sintaxis es:

copy (inicio_origen, fin_origen, inicio_destino);

De este modo, todos los datos que están entre inicio_origen y fin_origen, excluyendo el dato ubicado en este último, son copiados a un lugar descrito o apuntado por inicio_destino.

Un algoritmo muy importante que viene implementado en la biblioteca STL, es el sort. El algoritmo sort, ordena cualquier tipo de contenedor, siempre y cuando se le pasen como argumentos, desde donde y hasta donde se quiere ordenarlo.

Entre las funciones más conocidas están swap (variable1, variable2), que simplemente intercambia los valores de variable1 y variable2; max (variable1, variable2) y su símil min (variable1, variable2), que retornan el máximo o mínimo entre dos valores; find (inicio, fin, valor) que busca valor en el espacio de variables entre inicio y fin; etcétera.

Los algoritmos son muy variados, algunos incluso tienen versiones específicas para operar con ciertos iteradores o contenedores, y proveen un nivel de abstracción extra que permite obtener un código más "limpio", que "describe" lo que se está haciendo, en vez de hacerlo paso a paso explícitamente.

El 12 de agosto de 2011, Herb Sutter, presidente del comité de estándares de C++, informó la aprobación unánime del nuevo estándar.​ La publicación del mismo se realizó en algún momento del 2011.

Entre las características del nuevo estándar se pueden destacar:

Funciones lambda;

Referencias rvalue;

La palabra reservada auto;

Inicialización uniforme;

Plantillas con número variable de argumentos.

Además se ha actualizado la biblioteca estándar del lenguaje.

En 2011 C++11 inauguró una nueva era en la historia de C++, iniciando un ciclo trienal de lanzamiento de nuevas versiones. A C++11 le siguió C++14 y luego C++17, que es la versión actual en 2019; C++20 se encuentra próximo a estandarizarse, y ya se está trabajando en la versión C++23. Los compiladores intentan adelantarse incorporando de manera experimental algunas novedades antes de los lanzamientos oficiales. Pero cada nueva versión de C++ incluye tal cantidad de agregados que los compiladores más adelantados no suelen terminar de incorporarlos hasta dos o tres años después del lanzamiento de esa versión.

En C++, cualquier tipo de datos que sea declarado completo ( fully qualified, en inglés) se convierte en un tipo de datos único. Las condiciones para que un tipo de datos T sea declarado completo son a grandes rasgos las siguientes:

Es posible al momento de compilación conocer el espacio asociado al tipo de datos (es decir, el compilador debe conocer el resultado de sizeof(T)).

T Tiene al menos un constructor, y un destructor, bien declarados.

Si T es un tipo compuesto, o es una clase derivada, o es la especificación de una plantilla, o cualquier combinación de las anteriores, entonces las dos condiciones establecidas previamente deben aplicar para cada tipo de dato constituyente.

En general, esto significa que cualquier tipo de datos definido haciendo uso de las cabeceras completas, es un tipo de datos completo.

En particular, y, a diferencia de lo que ocurría en C, los tipos definidos por medio de struct o enum son tipos completos. Como tales, ahora son sujetos a sobrecarga, conversiones implícitas, etcétera.

Los tipos enumerados, entonces, ya no son simplemente alias para tipos enteros, sino que son tipos de datos únicos en C++. El tipo de datos bool, igualmente, pasa a ser un tipo de datos único, mientras que en C funcionaba en algunos casos como un alias para alguna clase de dato de tipo entero.

Uno de los compiladores libres de C++ es el de GNU, el compilador G++ (parte del proyecto GCC, que engloba varios compiladores para distintos lenguajes). Otros compiladores comunes son Intel C++ Compiler, el compilador de Xcode, el compilador de Borland C++, el compilador de CodeWarrior C++, el compilador g++ de Cygwin, el compilador g++ de MinGW, el compilador de Visual C++, Carbide.c++, entre otros.

A pesar de su adopción generalizada, muchos programadores han criticado el lenguaje C ++, incluyendo Linus Torvalds,​ Richard Stallman,​ y Ken Thompson.​ Los problemas incluyen una falta de reflexión o recolector de basura, tiempos de compilación lentos, perceived feature creep,​ y mensajes de error detallados, particularmente de la metaprogramación de plantilla.​

Para evitar los problemas que existen en C ++, y para aumentar la productividad,​ algunas personas sugieren lenguajes alternativos más recientes que C ++, como D, Go, Rust y Vala.​

Bjarne Stroustrup, El lenguaje de programación C++, Addison Wesley, Madrid, 1998, ISBN 84-7829-019-2

Bjarne Stroustrup, The C++ Programming Language, Addison-Wesley Pub Co; Tercera edición (15 de febrero de 2000); ISBN 0-201-70073-5

Bjarne Stroustrup, The Design and Evolution of C++, Addison-Wesley Pub Cp; Primera edición (29 de marzo de 1994); ISBN 0-201-54330-3

Margaret A. Ellis y Bjarne Stroustrup, The Annotated C++ Reference Manual, Addison-Wesley Pub Co; (1 de enero de 1990); ISBN 0-201-51459-1

# data[].attributes.attachment_link.description
C++ Desarrollador(es) Bjarne Stroustrup, Laboratorios Bell https://isocpp.org/ y http://www.open-std.org/jtc1/sc22/wg21/ Información general Extensiones comunes .h .hh .hpp .hxx .h++ .cc .cpp .cxx .c++ Paradigma Multiparadigma: Programación Estructurada, imperativo, programación genérica Apareció en 1983 Diseñado por Bjarne Stroustrup Última versión estable ISO/IEC 14882:2020 ( C++20)[1] ​ (Diciembre de 2020) Última versión en

# data[].attributes.attachment_link.readable_text
Por favor, En este artículo se detectaron varios problemas. edítalo y/o discute los problemas en la discusión para mejorarlo:

Este aviso fue puesto el 11 de enero de 2024.

Puedes avisar al redactor principal pegando lo siguiente en su página de discusión: {{sust:Aviso PA|JavaScript|formato de referencias|referencias adicionales}} ~~~~

JavaScript

?

Información general

Extensiones comunes

.js

Paradigma

Multiparadigma, programación funcional,[1] ​ programación basada en prototipos, imperativo, interpretado (scripting)

Apareció en

4 de diciembre de 1995

Diseñado por

Netscape Communications, Fundación Mozilla

Última versión estable

ECMAScript 2021 (01 de junio de 2021 (2 años, 11 meses y 23 días))

Sistema de tipos

Débil, dinámico, duck

Implementaciones

SpiderMonkey, Rhino, KJS, JavaScriptCore, V8, Chakra.

Dialectos

ECMAScript

Influido por

Java, Perl, Self, Python, C, Scheme

Ha influido a

ObjectiveJ, JScript .NET, TIScript

JavaScript (abreviado comúnmente JS) es un lenguaje de programación interpretado, dialecto del estándar ECMAScript. Se define como orientado a objetos,​ basado en prototipos, imperativo, débilmente tipado y dinámico.

Se utiliza principalmente del lado del cliente, implementado como parte de un navegador web permitiendo mejoras en la interfaz de usuario y páginas web dinámicas​ y JavaScript del lado del servidor ( Server-side JavaScript o SSJS). Su uso en aplicaciones externas a la web, por ejemplo en documentos PDF, aplicaciones de escritorio (mayoritariamente widgets) es también significativo.

JavaScript se diseñó con una sintaxis similar a C++ y Java,​​ aunque adopta nombres y convenciones del lenguaje de programación Java. Sin embargo, Java y JavaScript tienen semánticas y propósitos diferentes. Su relación es puramente comercial, tras la compra del creador de Java (Sun Microsystems) de Netscape Navigator (creador de LiveScript) y el cambio de nombre del lenguaje de programación.

Todos los navegadores modernos interpretan el código JavaScript integrado en las páginas web. Para interactuar con una página web se provee al lenguaje JavaScript de una implementación del Document Object Model (DOM). Javascript es el único lenguaje de programación que entienden de forma nativa los navegadores.

Tradicionalmente se venía utilizando en páginas web HTML para realizar operaciones y únicamente en el marco de la aplicación cliente, sin acceso a funciones del servidor. Actualmente es ampliamente utilizado para enviar y recibir información del servidor junto con ayuda de otras tecnologías como AJAX. JavaScript se interpreta en el agente de usuario al mismo tiempo que las sentencias van descargándose junto con el código HTML.

Desde el lanzamiento en junio de 1997 del estándar ECMAScript 1, han existido las versiones 2, 3 y 5, que es la más usada actualmente (la 4 se abandonó​). En junio de 2015 se cerró y publicó la versión ECMAScript 6.​

JavaScript fue desarrollado originalmente por Brendan Eich de Netscape con el nombre de Mocha, el cual fue renombrado posteriormente a LiveScript, para finalmente quedar como JavaScript. El cambio de nombre coincidió aproximadamente con el momento en que Netscape agregó compatibilidad con la tecnología Java en su navegador web Netscape Navigator en la versión 2002 en diciembre de 1995. La denominación produjo confusión, dando la impresión de que el lenguaje es una prolongación de Java, y fue considerada por muchos como una estrategia de mercadotecnia de Netscape para obtener prestigio e innovar en el ámbito de los nuevos lenguajes de programación web.​​

"JAVASCRIPT" es una marca registrada de Oracle Corporation.​ Es usada con licencia por los productos creados por Netscape Communications y entidades actuales como la Fundación Mozilla.​​

Microsoft dio como nombre a su dialecto de JavaScript " JScript", para evitar problemas relacionadas con la marca. JScript fue adoptado en la versión 3.0 de Internet Explorer, liberado en agosto de 1996, e incluyó compatibilidad con el Efecto 2000 con las funciones de fecha, una diferencia de los que se basaban en ese momento. Los dialectos pueden parecer tan similares que los términos "JavaScript" y "JScript" a menudo se utilizan indistintamente, pero la especificación de JScript es incompatible con la de ECMA en muchos aspectos.

Para evitar estas incompatibilidades, el World Wide Web Consortium diseñó el estándar Document Object Model (DOM, o Modelo de Objetos del Documento en español), que incorporan Konqueror, las versiones 6 de Internet Explorer y Netscape Navigator, Opera la versión 7, Mozilla Application Suite y Mozilla Firefox desde su primera versión.[cita requerida]

En 1997 los autores propusieron​ JavaScript para que fuera adoptado como estándar de la European Computer Manufacturers 'Association ECMA, que a pesar de su nombre no es europeo sino internacional, con sede en Ginebra. En junio de 1997 fue adoptado como un estándar ECMA, con el nombre de ECMAScript. Poco después también como un estándar ISO.

Netscape introdujo una implementación de la programación del lado del servidor con Netscape Enterprise Server, lanzada en diciembre de 1994 (poco después del lanzamiento de JavaScript para navegadores web).​​ A partir de mediados de la década de los 2000, ha habido una proliferación de implementaciones de JavaScript para el lado servidor. Node.js es uno de los notables ejemplos de JavaScript en el lado del servidor, siendo usado en proyectos importantes.​​

JavaScript se ha convertido en uno de los lenguajes de programación más populares en internet y más usados. Al principio, sin embargo, muchos desarrolladores renegaban del lenguaje porque el público al que va dirigido lo formaban publicadores de artículos y demás aficionados, entre otras razones.​ La llegada de AJAX devolvió JavaScript a la fama y atrajo la atención de muchos otros programadores. Como resultado de esto hubo una proliferación de un conjunto de frameworks y bibliotecas de ámbito general, mejorando las prácticas de programación con JavaScript, y aumentado el uso de JavaScript fuera de los navegadores web, como se ha visto con la proliferación de entornos JavaScript del lado del servidor. En enero de 2009, el proyecto CommonJS fue inaugurado con el objetivo de especificar una biblioteca para uso de tareas comunes principalmente para el desarrollo fuera del navegador web.​

En junio de 2015 se cerró y publicó el estándar ECMAScript 6​​ con un soporte irregular entre navegadores​ y que dota a JavaScript de características avanzadas que se echaban de menos y que son de uso habitual en otros lenguajes como, por ejemplo, módulos para organización del código, verdaderas clases para programación orientada a objetos, expresiones de flecha, iteradores, generadores o promesas para programación asíncrona.

La versión 7 de ECMAScript se conoce como ECMAScript 2016,​ y es la última versión disponible, publicada en junio de 2016. Se trata de la primera versión para la que se usa un nuevo procedimiento de publicación anual y un proceso de desarrollo abierto.​

Las siguientes características son comunes a todas las implementaciones que se ajustan al estándar ECMAScript, a menos que especifique explícitamente en caso contrario.

JavaScript es compatible con gran parte de la estructura de programación de C (por ejemplo, sentencias if, bucles for, sentencias switch, etc.). Con una salvedad, en parte: en C, el ámbito de las variables alcanza al bloque en el cual fueron definidas; sin embargo JavaScript no es compatible con esto, puesto que el ámbito de las variables es el de la función en la cual fueron declaradas. Esto cambia con la versión de ECMAScript 2015, ya que añade compatibilidad con block scoping por medio de la palabra clave let. Como en C, JavaScript hace distinción entre expresiones y sentencias. Una diferencia sintáctica con respecto a C es la inserción automática de punto y coma, es decir, en JavaScript los puntos y coma que finalizan una sentencia pueden ser omitidos.​

Tipado dinámico

Como en la mayoría de lenguajes de scripting, el tipo está asociado al valor, no a la variable. Por ejemplo, una variable x en un momento dado puede estar ligada a un número y más adelante, religada a una cadena. JavaScript es compatible con varias formas de comprobar el tipo de un objeto, incluyendo duck typing.​ Una forma de saberlo es por medio de la palabra clave typeof.

Objetual

JavaScript está formado casi en su totalidad por objetos. Los objetos en JavaScript son arrays asociativos, mejorados con la inclusión de prototipos (ver más adelante). Los nombres de las propiedades de los objetos son claves de tipo cadena: obj.x = 10 y obj['x'] = 10 son equivalentes, siendo azúcar sintáctico la notación con punto. Las propiedades y sus valores pueden ser creados, cambiados o eliminados en tiempo de ejecución. La mayoría de propiedades de un objeto (y aquellas que son incluidas por la cadena de la herencia prototípica) pueden ser enumeradas por medio de la instrucción de bucle for... in. JavaScript tiene un pequeño número de objetos predefinidos como son Function y Date.

Evaluación en tiempo de ejecución

JavaScript incluye la función eval que permite evaluar expresiones expresadas como cadenas en tiempo de ejecución. Por ello se recomienda que eval sea utilizado con precaución y que se opte por utilizar la función JSON.parse() en la medida de lo posible, pues puede resultar mucho más segura.

Funciones de primera clase

A las funciones se les suele llamar ciudadanos de primera clase; son objetos en sí mismos. Como tal, poseen propiedades y métodos, como .call() y .bind().​ Una función anidada es una función definida dentro de otra. Esta es creada cada vez que la función externa es invocada. Además, cada función creada forma una clausura; es el resultado de evaluar un ámbito conteniendo en una o más variables dependientes de otro ámbito externo, incluyendo constantes, variables locales y argumentos de la función externa llamante. El resultado de la evaluación de dicha clausura forma parte del estado interno de cada objeto función, incluso después de que la función exterior concluya su evaluación.​

Prototipos

JavaScript usa prototipos en vez de clases para el uso de herencia.​ Es posible llegar a emular muchas de las características que proporcionan las clases en lenguajes orientados a objetos tradicionales por medio de prototipos en JavaScript.​

Funciones como constructores de objetos

Las funciones también se comportan como constructores. Prefijar una llamada a la función con la palabra clave new crear una nueva instancia de un prototipo, que heredan propiedades y métodos del constructor (incluidas las propiedades del prototipo de Object).​ ECMAScript 5 ofrece el método Object.create, permitiendo la creación explícita de una instancia sin tener que heredar automáticamente del prototipo de Object (en entornos antiguos puede aparecer el prototipo del objeto creado como null).​ La propiedad prototype del constructor determina el objeto usado para el prototipo interno de los nuevos objetos creados. Se pueden añadir nuevos métodos modificando el prototipo del objeto usado como constructor. Constructores predefinidos en JavaScript, como Array u Object, también tienen prototipos que pueden ser modificados. Aunque esto sea posible se considera una mala práctica modificar el prototipo de Object ya que la mayoría de los objetos en Javascript heredan los métodos y propiedades del objeto prototype, objetos los cuales pueden esperar que estos no hayan sido modificados.​

Entorno de ejecución

JavaScript normalmente depende del entorno en el que se ejecute (por ejemplo, en un navegador web) para ofrecer objetos y métodos por los que los scripts pueden interactuar con el "mundo exterior". De hecho, depende del entorno para ser capaz de proporcionar la capacidad de incluir o importar scripts (por ejemplo, en HTML por medio del tag <script>). (Esto no es una característica del lenguaje, pero es común en la mayoría de las implementaciones de JavaScript.)

Funciones variádicas

Un número indefinido de parámetros pueden ser pasados a la función. La función puede acceder a ellos a través de los parámetros o también a través del objeto local arguments. Las funciones variádicas también pueden ser creadas usando el método .apply().

Funciones como métodos

A diferencia de muchos lenguajes orientados a objetos, no hay distinción entre la definición de función y la definición de método. Más bien, la distinción se produce durante la llamada a la función; una función puede ser llamada como un método. Cuando una función es llamada como un método de un objeto, la palabra clave this, que es una variable local a la función, representa al objeto que invocó dicha función.

Arrays y la definición literal de objetos

Al igual que muchos lenguajes de script, arrays y objetos (arrays asociativos en otros idiomas) pueden ser creados con una sintaxis abreviada. De hecho, estos literales forman la base del formato de datos JSON.

Expresiones regulares

JavaScript también es compatible con expresiones regulares de una manera similar a Perl, que proporcionan una sintaxis concisa y poderosa para la manipulación de texto que es más sofisticado que las funciones incorporadas a los objetos de tipo string.​

JavaScript se encuentra oficialmente bajo la organización de Mozilla Foundation, y periódicamente se añaden nuevas características del lenguaje. Sin embargo, solo algunos motores JavaScript son compatibles con estas características:

Las propiedades get y set (también compatibles con WebKit, Opera,​ ActionScript y Rhino).​

Cláusulas catch condicionales.

Protocolo iterador adoptado de Python.

Corrutinas también adoptadas de Python.

Generación de listas y expresiones por comprensión también adoptado de Python.

Establecer el ámbito a bloque a través de la palabra clave let.

Desestructuración de arrays y objetos (forma limita de emparejamiento de patrones).

Expresiones concretas en funciones (function(args) expr).

ECMAScript para XML (E4X), una extensión que añade compatibilidad nativa XML a ECMAScript.

A considerar los comentarios en el ejemplo de arriba, los cuales van precedidos con 2 barras diagonales.

... en efecto, no existen provisiones en esta especificación para entrada de datos externos o salida para resultados computados.

Sin embargo, la mayoría de los entornos de ejecución tiene un objeto​ llamado console que puede ser usado para imprimir por el flujo de salida de la consola de depuración. He aquí un simple programa que imprime "Hello world!":

Una función recursiva:

Ejemplos de función anónima (o función lambda) y una clausura:

Las expresiones con invocación automática permiten a las funciones pasarle variables por parámetro dentro de sus propias clausuras.

El siguiente código muestra varias características de JavaScript.

El siguiente ejemplo muestra la salida que debería ser mostrada en la ventana de un navegador.

LCMCalculator: a = 28, b = 56, gcd = 28, lcm = 56
LCMCalculator: a = 21, b = 56, gcd = 7, lcm = 168
LCMCalculator: a = 25, b = 55, gcd = 5, lcm = 275
LCMCalculator: a = 22, b = 58, gcd = 2, lcm = 638

El uso más común de JavaScript es escribir funciones embebidas o incluidas en páginas HTML y que interactúan con el Document Object Model (DOM o Modelo de Objetos del Documento) de la página. Algunos ejemplos sencillos de este uso son:

Cargar nuevo contenido para la página o enviar datos al servidor a través de AJAX sin necesidad de recargar la página (por ejemplo, una red social puede permitir al usuario enviar actualizaciones de estado sin salir de la página).

Animación de los elementos de página, hacerlos desaparecer, cambiar su tamaño, moverlos, etc.

Contenido interactivo, por ejemplo, juegos y reproducción de audio y vídeo.

Validación de los valores de entrada de un formulario web para asegurarse de que son aceptables antes de ser enviado al servidor.

Transmisión de información sobre los hábitos de lectura de los usuarios y las actividades de navegación a varios sitios web. Las páginas Web con frecuencia lo hacen para hacer análisis web, seguimiento de anuncios, la personalización o para otros fines.​

Dado que el código JavaScript puede ejecutarse localmente en el navegador del usuario (en lugar de en un servidor remoto), el navegador puede responder a las acciones del usuario con rapidez, haciendo una aplicación más sensible. Por otra parte, el código JavaScript puede detectar acciones de los usuarios que HTML por sí sola no puede, como pulsaciones de teclado. Las aplicaciones como Gmail se aprovechan de esto: la mayor parte de la lógica de la interfaz de usuario está escrita en JavaScript, enviando peticiones al servidor (por ejemplo, el contenido de un mensaje de correo electrónico). La tendencia cada vez mayor por el uso de la programación Ajax explota de manera similar esta técnica.

Un motor de JavaScript (también conocido como intérprete de JavaScript o implementación JavaScript) es un intérprete que interpreta el código fuente de JavaScript y ejecuta la secuencia de comandos en consecuencia. El primer motor de JavaScript fue creado por Brendan Eich en Netscape Communications Corporation, para el navegador web Netscape Navigator. El motor, denominado SpiderMonkey, está implementado en C. Desde entonces, ha sido actualizado (en JavaScript 1.5) para cumplir con el ECMA-262 edición 3. El motor Rhino, creado principalmente por Norris Boyd (antes de Netscape, ahora en Google) es una implementación de JavaScript en Java. Rhino, como SpiderMonkey, es compatible con el ECMA-262 edición 3.

Un navegador web es, con mucho, el entorno de acogida más común para JavaScript. Los navegadores web suelen crear objetos no nativos, dependientes del entorno de ejecución, para representar el Document Object Model (DOM) en JavaScript. El servidor web es otro entorno común de servicios. Un servidor web JavaScript suele exponer sus propios objetos para representar objetos de petición y respuesta HTTP, que un programa JavaScript podría entonces interrogar y manipular para generar dinámicamente páginas web.

A continuación se muestra un breve ejemplo de una página web (ajustándose a las normas del estándar para HTML5) que utiliza JavaScript para el manejo del Document Object Model (DOM):

Debido a que JavaScript se ejecuta en entornos muy variados, una parte importante de las pruebas y la depuración es probar y verificar que el código JavaScript funciona correctamente en múltiples navegadores. La interfaz DOM para acceder y manipular páginas web no es parte del estándar ECMAScript, o de la propia JavaScript. El DOM es definido por los esfuerzos de estandarización del W3C, una organización independiente. En la práctica, las implementaciones que hacen de JavaScript los distintos navegadores difieren tanto entre ellos mismos como de las normas del estándar.

Para hacer frente a estas diferencias, los autores de JavaScript pudieron ser capaces de escribir código compatible con los estándares que también fuera capaz de ejecutarse correctamente en la mayoría de los navegadores, o en su defecto, que al menos se pudiera escribir código capaz de comprobar la presencia de ciertas funcionalidades del navegador y que se comportase de manera diferente si no se dispusiese de dicha funcionalidad.​ Existen casos en los que dos navegadores pueden llegar a implementar la misma característica, pero con un comportamiento diferente, hecho que a los programadores les puede resultar de ayuda para detectar qué navegador se está ejecutando en ese instante y así cambiar el comportamiento de su escritura para que coincida.​​ Los programadores también suelen utilizar bibliotecas o herramientas que tengan en cuenta las diferencias entre navegadores.

Además, los scripts pueden no funcionar para algunos usuarios. Por ejemplo, un usuario puede:

Utilizar un navegador antiguo sin compatibilidad completa con la API DOM,

Utilizar un navegador PDA o teléfono móvil que no puede ejecutar JavaScript

Tener la ejecución de JavaScript deshabilitada, como precaución de seguridad,

Utilizar un navegador de voz debido a, por ejemplo, una discapacidad visual.

Para apoyar a estos usuarios, los programadores web suelen crear páginas que sean tolerante de fallos según el agente de usuario (tipo de navegador) que no admita JavaScript. En particular, la página debe seguir siendo útil aunque sin las características adicionales que JavaScript habría añadido. Un enfoque alternativo que muchos encuentran preferible es primero crear contenido utilizando las tecnologías que funcionan en todos los navegadores, y mejorar el contenido para los usuarios que han permitido JavaScript.

Los lectores de pantalla, utilizados por los ciegos y deficientes visuales, pueden ser tenidos en cuenta por JavaScript y así poder acceder y leer los elementos DOM de la página. El código HTML escrito debe ser lo más conciso, navegable y semánticamente rico posible, tanto si JavaScript se ejecuta como si no.

JavaScript no debería de ser totalmente dependiente de los eventos de ratón del navegador y debería ser accesible para aquellos usuarios que no quieran hacer uso del ratón (informática) para navegar o que opten por utilizar solamente el teclado. Hay eventos independientes del dispositivo, tales como onfocus y onchange que son preferibles en la mayoría de los casos.​

JavaScript y el DOM permite que existan programadores que hagan un uso inapropiado para introducir scripts que ejecuten código con contenido malicioso sin el consentimiento del usuario y que pueda así comprometer su seguridad.

Los desarrolladores de los navegadores tienen en cuenta este riesgo utilizando dos restricciones. En primer lugar, los scripts se ejecutan en un sandbox en el que solo se pueden llevar a cabo acciones relacionadas con la web, no con tareas de programación de propósito general, como la creación de archivos. En segundo lugar, está limitada por la política del mismo origen: los scripts de un sitio web no tienen acceso a la información enviada a otro sitio web (de otro dominio) como pudiera ser nombres de usuario, contraseñas o cookies. La mayoría de los fallos de seguridad de JavaScript están relacionados con violaciones de cualquiera de estas dos restricciones.

Existen proyectos como AdSafe o Secure ECMA script (SES) que proporcionan mayores niveles de seguridad, en especial en el código creado por terceros (tales como los anuncios).​​

La Política de Contenido Seguro (CSP) es el método principal previsto para garantizar que solo código de confianza pueda ser ejecutado en una página web.

Un problema común de seguridad en JavaScript es el cross-site scripting o XSS, una violación de la política de mismo origen. Las vulnerabilidades XSS permiten a un atacante inyectar código JavaScript en páginas web visitadas por el usuario. Una de esas webs podría ser la de un banco, pudiendo el atacante acceder a la aplicación de banca con los privilegios de la víctima, lo que podría revelar información secreta o transferir dinero sin la autorización de la víctima. Una solución para las vulnerabilidades XSS es utilizar HTML escaping cuando se muestre información de fuentes no confiables.

Otra vulnerabilidad es la falsificación de petición de sitio cruzado o CSRF. En CSRF, el código del sitio web atacante engaña al navegador de la víctima, permitiendo al atacante realizar peticiones en nombre de la víctima, haciendo imposible saber a la aplicación de destino (por ejemplo, la de un banco haciendo una transferencia de dinero) saber si la petición ha sido realizada voluntariamente por el usuario o por un ataque CSRF.

El ataque funciona porque, si el sitio de destino hace uso únicamente de las cookies para autenticar las solicitudes de la víctima, las peticiones iniciadas por el código del atacante tendrán las mismas credenciales de acceso legítimo que las solicitudes iniciadas por el propio usuario.

En general, la solución a CSRF consiste en introducir un campo de formulario oculto cuyo valor se utilice para realizar la autenticación, y no solo por medio de las cookies, en solicitudes que puedan tener efectos duraderos. La comprobación de la cabecera HTTP referer también puede servir de ayuda.

"Hijacking JavaScript" es un tipo de ataque CSRF en el que una etiqueta <script> en el sitio web del atacante explota una vulnerabilidad en la página del sitio de la víctima que le hace devolver información privada, en forma de JSON o código JavaScript. Las posibles soluciones son:

que se requiera un token de autenticación en los parámetros de las peticiones POST y GET para aquellas peticiones que requieran devolver información privada del usuario.

usar POST y nunca GET para solicitudes que devuelven información privada

Existen tres depuradores disponibles para Internet Explorer: Microsoft Visual Studio es el más avanzado de los tres, seguido de cerca por Microsoft Script Editor (un componente de Microsoft Office)​ y, finalmente, Microsoft Script Debugger, que es mucho más básico que el otro dos, aunque es gratuito. El IDE gratuito Microsoft Visual Web Developer Express ofrece una versión limitada de la funcionalidad de depuración de JavaScript en el Microsoft Visual Studio. Internet Explorer ha incluido herramientas de desarrollo desde la versión 8 (se muestra pulsando la tecla F12). Las aplicaciones web dentro de Firefox se pueden depurar usando el Firebug add-on o el antiguo depurador Venkman. Firefox también tiene integrada una consola de errores básica, que registra y evalúa JavaScript. También registra errores de CSS y advertencias. Opera incluye un conjunto de herramientas llamado Dragonfly.​ El Inspector Web de WebKit incluye un depurador de JavaScript​ utilizado en Safari, junto con una versión modificada de Google Chrome.

Existen algunas herramientas de ayuda a la depuración, también escritas en JavaScript y construidas para ejecutarse en la Web. Un ejemplo es el programa JSLint, desarrollado por Douglas Crockford, quien ha escrito extensamente sobre el lenguaje. JSLint analiza el código JavaScript para que este quede conforme con un conjunto de normas y directrices y que aseguran su correcto funcionamiento y mantenibilidad.

Hay frameworks de programación como PaulaJS que ofrece funciones para realizar sistemas de frontend con más utilidades que no hay que programar directamente, mejoras en estética y experiencia de usuario.

# data[].attributes.attachment_link.title
JavaScript - Wikipedia, la enciclopedia libre

# data[].attributes.attachment_link.description
Por favor, En este artículo se detectaron varios problemas. edítalo y/o discute los problemas en la discusión para mejorarlo: Este aviso fue puesto el 11 de enero de 2024. Puedes avisar al redactor principal pegando lo siguiente en su página de discusión: {{sust:Aviso PA|JavaScript|formato de referencias|referencias adicionales}} ~~~~ JavaScript ?

# data[].attributes.attachment_link.title
Introducción al lenguaje Python - Tutorial #1 Python

# data[].attributes.attachment_link.readable_text
Lenguaje de programación de propósito general, orientado a objetos, que también puede utilizarse para el desarrollo web.

Queremos presentar un lenguaje de programación de propósito general, cuya expansión y popularidad es relativamente reciente. Se trata de Python, una apuesta por la simplicidad, versatilidad y rapidez de desarrollo. A continuación veremos unas notas imprescindibles del lenguaje, extractadas básicamente de la página de inicio del lenguaje que se puede ver en www.python.org

Python es un lenguaje de scripting independiente de plataforma y orientado a objetos, preparado para realizar cualquier tipo de programa, desde aplicaciones Windows a servidores de red o incluso, páginas web. Es un lenguaje interpretado, lo que significa que no se necesita compilar el código fuente para poder ejecutarlo, lo que ofrece ventajas como la rapidez de desarrollo e inconvenientes como una menor velocidad.

En los últimos años el lenguaje se ha hecho muy popular, gracias a varias razones como:

La cantidad de librerías que contiene, tipos de datos y funciones incorporadas en el propio lenguaje, que ayudan a realizar muchas tareas habituales sin necesidad de tener que programarlas desde cero.

La sencillez y velocidad con la que se crean los programas. Un programa en Python puede tener de 3 a 5 líneas de código menos que su equivalente en Java o C.

La cantidad de plataformas en las que podemos desarrollar, como Unix, Windows, OS/2, Mac, Amiga y otros.

Además, Python es gratuito, incluso para propósitos empresariales.

De dónde viene Python
El creador del lenguaje es un europeo llamado Guido Van Rossum. Hace ya más de una década que diseño Python, ayudado y motivado por su experiencia en la creación de otro lenguaje llamado ABC. El objetivo de Guido era cubrir la necesidad de un lenguaje orientado a objetos de sencillo uso que sirviese para tratar diversas tareas dentro de la programación que habitualmente se hacía en Unix usando C.

El desarrollo de Python duró varios años, durante los que trabajó en diversas compañías de Estados Unidos. En el 2000 ya disponía de un producto bastante completo y un equipo de desarrollo con el que se había asociado incluso en proyectos empresariales. Actualmente trabaja en Zope, una plataforma de gestión de contenidos y servidor de aplicaciones para el web, por supuesto, programada por completo en Python.

Características del lenguaje

Propósito general
Se pueden crear todo tipo de programas. No es un lenguaje creado específicamente para la web, aunque entre sus posibilidades sí se encuentra el desarrollo de páginas.

Multiplataforma
Hay versiones disponibles de Python en muchos sistemas informáticos distintos. Originalmente se desarrolló para Unix, aunque cualquier sistema es compatible con el lenguaje siempre y cuando exista un intérprete programado para él.

Interpretado
Quiere decir que no se debe compilar el código antes de su ejecución. En realidad sí que se realiza una compilación, pero esta se realiza de manera transparente para el programador. En ciertos casos, cuando se ejecuta por primera vez un código, se producen unos bytecodes que se guardan en el sistema y que sirven para acelerar la compilación implícita que realiza el intérprete cada vez que se ejecuta el mismo código.

Interactivo
Python dispone de un intérprete por línea de comandos en el que se pueden introducir sentencias. Cada sentencia se ejecuta y produce un resultado visible, que puede ayudarnos a entender mejor el lenguaje y probar los resultados de la ejecución de porciones de código rápidamente.

Orientado a Objetos
La programación orientada a objetos está soportada en Python y ofrece en muchos casos una manera sencilla de crear programas con componentes reutilizables.

Funciones y librerías
Dispone de muchas funciones incorporadas en el propio lenguaje, para el tratamiento de strings, números, archivos, etc. Además, existen muchas librerías que podemos importar en los programas para tratar temas específicos como la programación de ventanas o sistemas en red o cosas tan interesantes como crear archivos comprimidos en .zip.

Sintaxis clara
Por último, destacar que Python tiene una sintaxis muy visual, gracias a una notación identada (con márgenes) de obligado cumplimiento. En muchos lenguajes, para separar porciones de código, se utilizan elementos como las llaves o las palabras clave begin y end. Para separar las porciones de código en Python se debe tabular hacia dentro, colocando un margen al código que iría dentro de una función o un bucle. Esto ayuda a que todos los programadores adopten unas mismas notaciones y que los programas de cualquier persona tengan un aspecto muy similar.

Conclusión

Python está en movimiento y en pleno desarrollo, pero ya es una realidad y una interesante opción para realizar todo tipo de programas que se ejecuten en cualquier máquina. El equipo de desarrollo está trabajando de manera cada vez más organizada y cuentan con el apoyo de una comunidad que está creciendo rápidamente.

Algunas empresas que utilizan Python son Yahoo, Google, Walt Disney, la NASA, Red Hat, etc. Se pueden ver más en www.python.org/community/users.html

Aunque la documentación de este lenguaje se encuentra en Inglés, poco a poco aparecen nuevas páginas que tratan de acercar el lenguaje a los usuarios hispanos. Se puede ver más información sobre el lenguaje en nuestra categoría en el buscador.

# data[].attributes.attachment_link.description
Lenguaje de programación de propósito general, orientado a objetos, que también puede utilizarse para el desarrollo web. Queremos presentar un lenguaje de programación de propósito general, cuya expansión y popularidad es relativamente reciente. Se trata de Python, una apuesta por la simplicidad, versatilidad y rapidez de desarrollo.

# data[].attributes.body
lenguajes de programacion
-java
-python
-javascrip
-c++
-c#
-php
-perl
-visual, basic net
-c
assamblylenguage(asl)

# data[].attributes.attachment_link.title
Tutorial Java - 1. Introducción y Primer Programa "Hola Mundo"

# data[].attributes.attachment_link.readable_text
Esta es probablemente una de las preguntas más populares entre las personas que quieren adentrarse en el mundo de la programación. Puedes preguntar cuál es el mejor para a diez programadores, y te darán diez respuestas diferentes. A continuación, os ofrecemos algunos consejos y sugerencias para intentar ayudaros a decidir.

Hay miles de opciones, y el mejor lenguaje de programación para empezar no solo depende de lo intuitivo, o no, que sea, también depende del tipo de proyectos que quieras hacer, por qué quieres programar, o si quieres dedicarte a ello profesionalmente. Ahí va una pequeña guía.

¿Por qué quieres aprender a programar?

Es probable que, dependiendo de lo que quieras programar o para qué, la elección ya esté tomada aunque tú todavía no lo sepas. Para programar páginas web, por ejemplo, deberías aprender HTML, CSS, JavaScript y quizás PHP para la interactividad. Si tu objetivo es solo desarrollar aplicaciones móviles, lo que deberías aprender, para empezar, sería Objective-C para iOS o Java para Android.

Si lo que quieres es ir más allá de un proyecto específico, o quieres aprender varios lenguajes, lo mejor para empezar es aprender fundamentos de programación, y aprender a 'pensar como un programador'. En este sentido hasta las aplicaciones y métodos para enseñar a programar a los niños pueden serte útiles.

Por poner un ejemplo, el primer curso formal de programación al que asistí más allá de Basic fue Harvard CS50. Se puede acceder a este de forma gratuita desde proyectos interactivos como Codeacademy. Este principio, sin embargo, nos sigue dejando con la duda de qué lenguaje es el mejor para empezar. Veamos las recomendaciones contrastadas con los lenguajes más populares.

Los lenguajes de programación más recomendados para principiantes

La mayor parte de lenguajes de programación populares como C, Java, C#, Perl, Ruby, o Python, sirven para hacer más o menos las mismas cosas. Java, por ejemplo, es un sistema multiplataforma utilizado para aplicaciones web y . Ruby también sirve para hacer grandes aplicaciones web, y las de Python corren igualmente en Linux o Windows.

Como indica , el hecho de que los lenguajes estén desarrollados unos sobre otros hace que muchas veces la sintaxis entre ellos sea idéntica o muy parecida, así que aprender uno de ellos hará que te sea más fácil aprender el siguiente. Por ejemplo, imprimir la expresión 'Hello World' en Java y C# es similar, como también lo es entre Perl y Python.

Estos lenguajes, sin embargo, se diferencian en lo fácil o difícil que es comenzar a operar con ellos. Mirando el ejemplo anterior, hay lenguajes que necesitan más comillas, otros menos. En general, SOA World recomienda empezar con lenguajes sintácticamente más simples, o sea, que tengan menos reglas sintácticas o lógicas. Así podremos ir de menos a más. A continuación os ofrecemos un breve resumen de los lenguajes más comunes.

C: Te enseña a programar de manera eficiente

C es uno de los lenguajes de programación más usados y esta popularidad tiene sus razones. En palabras del programador Joel Spolsky: " C es el equivalente a aprender anatomía básica en medicina"". C es un lenguaje que funciona a nivel de máquina, así que sirve para entender cómo interacciona un programa con la capa de hardware.

Con C se aprende a hacer cosas como depurar código, o a gestionar la memoria. También ofrece una visión panorámica de cómo funciona un ordenador que no ofrecen otros lenguajes. En ese sentido C es el 'abuelo' de otros lenguajes de alto nivel como Java, C# o JavaScript.

Dicho esto, programar en C también es más rígido y su curva de aprendizaje no es muy fácil. Si no tienes pensado trabajar en programas que interactúan con la capa de hardware (utilizando, por ejemplo, unidades de disco, o extensiones del sistema operativo) C quizá prolongue de manera innecesaria tu tiempo de aprendizaje.

Personalmente, me alegra haber aprendido algo de C, pero no creo que sea un lenguaje especialmente amistoso con el principiante. Ayuda a convertirte en un programador minucioso y disciplinado, pero su rigidez y el largo tiempo que pasará antes de que puedas crear algo realmente útil puede acabar frustrándote.

Java: Uno de los lenguajes más útiles de aprender

Java es el segundo lenguaje de programación más popular, y es el protagonista del célebre curso gratuito Introducción a la programación de la Universidad de Stanford. Java es muy útil para aprender los principios de la programación orientada a objetos que se usa en otros lenguajes modernos como C++, Perl, Pyython, o PHP. Una vez que has aprendido Java, es más fácil aprender estos otros lenguajes.

Java tiene la ventaja de que es un lenguaje muy maduro y con una larga trayectoria. Hay infinidad de plantillas y tutoriales, y se usa en una gran cantidad de entornos, incluido el desarrollo de aplicaciones en Android, así que es un lenguaje muy práctico. Con Java no aprenderás control de dispositivo a nivel de hardware como con C, pero aprenderás a acceder y gestionar las partes más importantes como el sistema de archivos, los gráficos o el sonido.

Python: Fácil y divertido de aprender

Mucha gente recomienda Python para empezar por sus amplias capacidades y su simplicidad. Su código es fácil de leer y también ayuda a desarrollar un estilo de programación limpio sin necesidad de ser muy estricto con la sintaxis (cosas como olvidar un paréntesis al final de una línea). Patrick Jordan, de Ariel Computing, compara el tiempo que se tarda en escribir una instrucción simple en distintos lenguajes (Basic, C, J, Java y Python) y concluye que:

Aunque los demás lenguajes no deben ser descuidados, Python lleva menos tiempo, menos líneas de código, y menos conceptos que aprender para alcanzar un determinado objetivo. Programar en Python es divertido, y eso genera interés y confianza en el alumno, lo que siempre es bueno para animarle a continuar con su formación en otros lenguajes más austeros.

En la SOA consideran a Python como un auténtico imprescindible para principiantes, sobre todo para los que ya estén un poco familiarizados con entornos Linux. Python está, además, creciendo debido a su uso en sites tan populares como Pinterest o Instagram.

Javascript: Para dar el salto a la programación web

A pesar de su nombre, Javascript no tiene mucha relación con Java. Su puesta en marcha es relativamente sencilla ya que prácticamente está integrado ya en todos los navegadores. O'Reilly Media recomienda empezar con JavaScript porque es bastante flexible en sintaxis, puedes ver inmediatamente los resultados de lo que has hecho, y no es necesario aprender muchas herramientas. En su propia escuela nocturna O'Really utiliza JavaScript para enseñar lo más básico como las variables o las funciones. Si quieres programar elementos interactivos para una página web, JavaScript es un imprescindible.

Elegir tu camino

Una última consideración es tener en cuenta si quieres programar solo por Hobby, o vas a convertir esa actividad en algo profesional. En Dev/Code/Hack han separado los lenguajes y conocimientos más necesarios según a qué parte de la programación te quieras dedicar.

Programador de Servidores o Back-end: Python, Rubyy, PHP, Java o .Net. Conocimientos de bases de datos y posiblemente de administración de sistemas.

Programador de clientes o Front-end: HTML, CSS, Javascript. Posiblemente sean necesarios conocimientos de diseño.

Programador móvil: Objective C o Java (para Android). HTTML / CSS para sitios web móviles. Posibles conocimientos sobre servidores.

Programador 3D o de videojuegos: C/C++, OpenGL, Animación. Es recomendable tener buenas dosis de conocimientos de diseño y artísticos.

Programador de alto rendimiento: C/ C++, Java, conocimientos en matemáticas y análisis cuantitativo.

Al final, no hay una única vía para iniciarse en el arte de la programación. Lo más importante es aprender los fundamentos, y para ello lo mejor es devanarse los sesos intentando realizar un proyecto concreto o una aplicación que queramos construir. Tener un objetivo concreto ayuda mucho. Como dicen en el blog Programming is Terrible:

El primer lenguaje de programación que aprendas será el más duro. Elegir un proyecto pequeño, sencillo y divertido hará de este proceso algo menos duro y más una pequeña aventura. Realmente no importa mucho desde donde empieces siempre y cuando no lo abandones. Sigue leyendo código, sigue escribiendo código, no te olvides de probar lo que hace. Una vez te encuentres cómodo en un lenguaje, avanzar en el siguiente será más sencillo y te aportará nuevas habilidades.

Una vez te hayas decidido, la web es un buen punto en el que localizar fácilmente nuevos recursos para continuar programando.

***

# data[].attributes.attachment_link.title
¿Qué lenguaje de programación debería aprender para empezar?

# data[].attributes.attachment_link.description
Esta es probablemente una de las preguntas más populares entre las personas que quieren adentrarse en el mundo de la programación. Puedes preguntar cuál es el mejor lenguaje para empezar a diez programadores, y te darán diez respuestas diferentes. A continuación, os ofrecemos algunos consejos y sugerencias para...