Este artículo compara un gran número de lenguajes de programación mediante la elaboración de tablas que muestran sus tipos de datos , su sintaxis de expresiones , sentencias y declaraciones , y algunas interfaces comunes de sistemas operativos.
Convenciones de este artículo
Generalmente, var , var o var es la forma en que se representan los nombres de las variables u otros valores no literales que el lector debe interpretar. El resto es código literal. Las comillas angulares ( «y ») delimitan las secciones opcionales. Tab ↹indica una sangría necesaria (espacio en blanco).
Las tablas no están ordenadas lexicográficamente de forma ascendente por nombre de lenguaje de programación de manera predeterminada , y algunos lenguajes tienen entradas en algunas tablas pero no en otras.
Identificadores de tipo
- ^a Lasconstantesestándar
int shortsyint lengthsse pueden usar para determinar cuántasshorts ylongs se pueden anteponer útilmente ashort intylong int. Los tamaños reales deshort int,int, ylong intestán disponibles como las constantesshort max int,max int, ylong max intetc. - ^b Se usa comúnmente para caracteres.
- ^c Los lenguajes ALGOL 68, C y C++ no especifican el ancho exacto de los tipos enteros
short,int,long, y (C99,C++11)long long, por lo que dependen de la implementación. En C y C++short,long, ylong longdeben tener al menos 16, 32 y 64 bits de ancho, respectivamente, pero pueden tener más. Elinttipo debe tener al menos el ancho deshorty como máximo el ancho delong, y suele ser el ancho del tamaño de palabra en el procesador de la máquina (es decir, en una máquina de 32 bits suele tener 32 bits de ancho; en máquinas de 64 bits a veces tiene 64 bits de ancho).C99yC++11también definen lostipos de ancho exacto en elstdint.h. Consultela sintaxis de C#Tipos enterospara obtener más información. Además, los tiposyse definen en relación con el tamaño de la dirección para almacenar enteros sin signo y con signo suficientemente grandes para manejar índices de matrices y la diferencia entre punteros.[u]intN_tsize_tptrdiff_t - ^d Perl 5 no tiene tipos distintos. Los enteros, los números de punto flotante, las cadenas, etc., se consideran todos "escalares".
- PHP tiene dos bibliotecas de precisión arbitraria. La biblioteca BCMath simplemente usa cadenas como tipo de dato. La biblioteca GMP usa un tipo interno de "recurso".
- ^f El valor de
nviene dado por lafunción intrínsecaSELECTED_INT_KIND[ 4 ] . - La opción de tiempo de ejecución de ^g ALGOL 68G
--precision "number"puede establecer la precisión paralong long ints al número requerido de dígitos significativos. Lasconstantesestándarlong long int widthylong long max intse pueden usar para determinar la precisión real. - ^h COBOLpermite especificar la precisión requerida y seleccionará automáticamente un tipo disponible capaz de representar la precisión especificada. "
PIC S9999", por ejemplo, requeriría una variable con signo de cuatro dígitos decimales de precisión. Si se especifica como un campo binario, esto seleccionaría un tipo con signo de 16 bits en la mayoría de las plataformas. - Smalltalk selecciona automáticamente una representación adecuada para los números enteros. Normalmente, existen dos representaciones: una para enteros que se ajustan al tamaño de palabra nativo menos cualquier bit de etiqueta (SmallInteger)y otra que admite enteros de tamaño arbitrario (LargeInteger). Las operaciones aritméticas admiten argumentos polimórficos y devuelven el resultado en la representación compacta más apropiada.
- ^j Los tipos de rango de Adase comprueban para detectar violaciones de límites en tiempo de ejecución (así como en tiempo de compilación para expresiones estáticas). Las violaciones de límites en tiempo de ejecución generan una excepción de "error de restricción". Los rangos no están restringidos a potencias de dos. Los subtipos de enteros predefinidos comúnmente son: Positive () y Natural ().(8 bits),(16 bits) y(64 bits) también se predefinen comúnmente, pero no son requeridos por el estándar de Ada. Las comprobaciones en tiempo de ejecución se pueden deshabilitar si el rendimiento es más importante que las comprobaciones de integridad.
range1..Integer'Lastrange0..Integer'LastShort_Short_IntegerShort_IntegerLong_Integer - ^k Los tipos de módulo de Adaimplementan aritmética de módulo en todas las operaciones, es decir, no son posibles violaciones de rango. Los módulos no están restringidos a potencias de dos.
- ^l Se usa comúnmente para caracteres como el char de Java.
- ^m
inten PHP tiene el mismo ancho quelongel tipo en C en ese sistema. [c] - Erlang es de tipado dinámico. Los identificadores de tipo se utilizan normalmente para especificar los tipos de campos de registro y los tipos de argumentos y de retorno de las funciones. [ 5 ]
- ^o Cuando excede una palabra. [ 6 ]
- ^a Lasconstantesestándar
real shortsyreal lengthsse pueden usar para determinar cuántasshorts ylongs se pueden anteponer útilmente ashort realylong real. Los tamaños reales deshort real,real, ylong realestán disponibles como las constantesshort max real,max realylong max realetc. Con las constantesshort small real,small realyel épsilon de máquinalong small realde cada tipo. - ^b Las declaraciones de precisión simple a menudo no se respetan.
- ^c El valor de
nviene dado por lafunción intrínsecaSELECTED_REAL_KIND[ 8 ] . - ^d La opción de tiempo de ejecución de ALGOL 68G
--precision "number"puede establecer la precisión paralong long reals al "número" de dígitos significativos requeridos. Lasconstantesestándarlong long real widthylong long max realse pueden usar para determinar la precisión real. - ^e EstosIEEEse introducirán en el próximo estándar COBOL.
- ^f Mismo tamaño que
doubleen muchas implementaciones. - ^g Swift admite el tipo de punto flotante de precisión extendidade 80 bits, equivalente a
long doubleen los lenguajes C.
Otros tipos de variables
- ^a específicamente, cadenas de longitud arbitraria y gestionadas automáticamente.
- ^b Este lenguaje representa un valor booleano como un número entero, donde falso se representa con un valor de cero y verdadero con un valor distinto de cero.
- ^c Todos los valores se evalúan como verdaderos o falsos. Todo en
TrueClassse evalúa como verdadero y todo enFalseClassse evalúa como falso. - ^d Este lenguaje no tiene un tipo de carácter separado. Los caracteres se representan como cadenas de longitud 1.
- ^e Las enumeraciones en este lenguaje son tipos algebraicos con constructores únicamente nulos.
- ^f El valor de
nviene dado por lafunción intrínsecaSELECTED_INT_KIND[ 4 ] .
Tipos derivados
- En la mayoría de las expresiones (excepto los
sizeof`and`&), los valores de los tipos de matriz en C se convierten automáticamente a un puntero a su primer argumento. Consulte la sección"Sintaxis de C#Matrices"para obtener más detalles sobre la sintaxis y las operaciones con punteros. - ^b Debido a que todos los tipos en Crystal son objetos, un Array puede contener inherentemente otros Arrays especificándolo en una declaración literal o de tipo (por ejemplo,
Array(Array(Int32 | Float64))especifica un array bidimensional que contiene enteros de 32 bits y números de punto flotante de doble precisión). - ^c El estilo C
type x[]funciona en Java, sin embargo,type[] xes la forma preferida de declaración de matrices. - ^d Los subrangos se utilizan para definir los límites de la matriz.
- ^e Los arrays de JavaScript son un tipo especial de objeto.
- ^f La
DEPENDING ONcláusula en COBOL no crea unaverdaderay siempre asignará el tamaño máximo de la matriz.
Otros tipos
- ^a Solo se admiten clases.
- En C++, las clases con ^b
structson en realidad clases, pero tienen visibilidad pública por defecto ytambiénsonPOD. C++11 amplió aún más esta funcionalidad, permitiendo que las clases se comporten de forma idéntica a los objetos POD en muchos más casos. - ^c par solamente
- ^d Aunque Perl no tiene registros, debido a que el sistema de tipos de Perl permite que diferentes tipos de datos estén en un array, los "hashes" (arrays asociativos) que no tienen un índice variable serían efectivamente lo mismo que los registros.
- ^e Las enumeraciones en este lenguaje son tipos algebraicos con constructores únicamente nulos.
Declaraciones de variables y constantes
- ^a Pascal tiene bloques de declaración. Verfunciones.
- ^b Los tipos son simplemente objetos regulares, por lo que puedes asignarlos sin problema.
- ^c En Perl, la palabra clave "my" limita el alcance de la variable al bloque.
- Técnicamente , esto no declara`name`sea una variable mutable (en ML, todos los nombres solo se pueden vincular una vez); más bien, declara`name`apunta a una estructura de datos de "referencia", que es una celda mutable simple. La estructura de datos se puede leer y escribir utilizando los
!operadores:=`read` y `write`, respectivamente. - Si no se proporciona un valor inicial, se asigna automáticamente un valor no válido (lo que provocará una excepción en tiempo de ejecución si se utiliza antes de que se haya asignado un valor válido). Si bien este comportamiento puede suprimirse, se recomienda para garantizar la previsibilidad. Si no se encuentra ningún valor no válido para un tipo (por ejemplo, en el caso de un tipo entero sin restricciones), se elige un valor válido y predecible.
- ^f En Rust, si no se le da un valor inicial a una
letolet muty nunca se le asigna posteriormente, hay unaadvertencia de "variable no utilizada". Si no se proporciona ningún valor para unaconstostaticostatic mut, hay un error. Hay un"variables globales que no son mayúsculas"para variables que no son mayúsculasconst. Después de ser definida, unastatic mutvariable solo puede ser asignada dentro de ununsafebloque o función.
Declaraciones condicionales
- Una sola instrucción puede escribirse en la misma línea después de los dos puntos. Varias instrucciones se agrupan en unbloqueque comienza en una nueva línea (la sangría es obligatoria). La sintaxis de las expresiones condicionales no sigue esta regla.
- ^b Esto escoincidencia de patronesy es similar a select case pero no es lo mismo. Generalmente se utiliza para descomponertipos de datos algebraicos.
- ^c En los lenguajes de la familia Pascal, el punto y coma no forma parte de la instrucción. Es un separador entre instrucciones, no un terminador.
- ^d
END-IFpuede usarse en lugar del punto al final. - ^e En Rust, la coma (
,) al final de un brazo de coincidencia se puede omitir después del último brazo de coincidencia, o después de cualquier brazo de coincidencia en el que la expresión sea un bloque (termina en corchetes de coincidencia posiblemente vacíos{}).
- ^a "
stepn " se usa para cambiar el intervalo del bucle. Sistepse omite " ", entonces el intervalo del bucle es 1. - ^b Esto implementa elcuantificador universal("para todos" o ∀ ) así como elcuantificador existencial("existe" o ∃ ).
- ^c
THRUpuede usarse en lugar deTHROUGH. - ^d puede usarse en lugar de.
«IS»GREATER «THAN»> - ^e El tipo de expresión de conjunto debe implementar el rasgo
std::iter::IntoIterator.
- ^a Common Lisp permite
with-simple-restartydefinir reinicios para usar conrestart-casedereinicios al usuario antes de desenrollar la pila.restart-bindinvoke-restart - ^b Las excepciones no capturadas se propagan a la ejecución que las contiene dinámicamente más internamente. Las excepciones no se propagan entre tareas (a menos que estas tareas estén sincronizadas en un encuentro).
Otras instrucciones de control de flujo
- ^a Pascal tiene bloques de declaración. Verfunciones.
- La etiqueta ^b debe ser un número entre 1 y 99999.
Consulte la programación reflexiva para llamar y declarar funciones mediante cadenas de texto.
- ^a Pascal requiere "
forward;" paralas declaraciones anticipadas. - ^b Eiffel permite especificar la clase raíz y la característica de una aplicación.
- ^c En Fortran, los parámetros de función/subrutina se denominan argumentos (ya que
PARAMETERes una palabra clave del lenguaje); laCALLpalabra clave es necesaria para las subrutinas. - ^d En lugar de usar
"foo", se puede usar una variable de cadena que contenga el mismo valor. - ^e En Crystal, la
returnpalabra clave es innecesaria. En su lugar, la instrucción final en el flujo de control de una función se considera el valor de retorno. - Las llamadas a funciones de Crystal requieren paréntesis alrededor de los parámetros solo cuando hay ambigüedad sintáctica (por ejemplo, cuando una función que toma varios parámetros se proporciona como parámetro a otra función) o cuando se declara una función.
Donde cadena es un número decimal con signo:
- ^a JavaScript solo utiliza números de punto flotante, por lo que existen algunas cuestiones técnicas. [ 7 ]
- ^b Perl no tiene tipos separados. Las cadenas y los números son intercambiables.
- ^c
NUMVAL-CoNUMVAL-Fpuede usarse en lugar deNUMVAL. - ^
str::parseestá disponible para convertir cualquier tipo que tenga una implementación delstd::str::FromStrrasgo. Ambosstr::parsedevuelvenFromStr::from_strunResultque contiene el tipo especificado si no hay error. Elturbofish() ense puede omitir si el tipo se puede inferir del contexto.::<_>str::parse
- ^a ALGOL 68 además como lasde transput:
read,write,get, yput. - ^b
gets(x)ylee texto sin formato desde stdin. No se recomienda el uso de gets.fgets(x, length, stdin) - ^c
puts(x)yfputs(x, stdout)escribe texto sin formato en la salida estándar. - ^d
fputs(x, stderr)escribe texto sin formato en stderr - ^e INPUT_UNIT, OUTPUT_UNIT, ERROR_UNITestán definidos en elISO_FORTRAN_ENV. [ 15 ]
- ^a En Rust,
std::env::argsystd::env::args_osdevuelven iteradores,std::env::Argsystd::env::ArgsOsrespectivamente.Argsconvierte cada argumento aStringy entra en pánico si llega a un argumento que no se puede convertir aUTF-8.ArgsOsdevuelve una representación sin pérdida de las cadenas sin procesar del sistema operativo (std::ffi::OsString), que puede ser UTF-8 inválido. - ^b En Visual Basic, los argumentos de la línea de comandos no están separados. Para separarlos se requiere una función split.
Split(string) - ^c El estándar COBOL no incluye ningún medio para acceder a los argumentos de la línea de comandos, pero las extensiones comunes del compilador para acceder a ellos incluyen la definición de parámetros para el programa principal o el uso
ACCEPTde sentencias.
Ejecución de comandos
Véase también
Referencias
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Manual de referencia de Ada – Bibliotecas de lenguaje y estándares; ISO/IEC 8652:201x (E), "Manual de referencia" (PDF) . Archivado del original (PDF) el 27 de abril de 2011. Recuperado el 19 de julio de 2013 .
- ↑ "Common Lisp HyperSpec (TM)" . lispworks.com . Consultado el 30 de enero de 2017 .
- ↑ "www.islisp.info: Especificación" . islisp.info . Archivado del original el 22 de enero de 2016. Consultado el 30 de enero de 2017 .
- 1 2 "selected_int_kind en Fortran Wiki" . fortranwiki.org . Consultado el 30 de enero de 2017 .
- ↑ "Erlang — Tipos y especificaciones de funciones" . erlang.org . Consultado el 30 de enero de 2017 .
- ↑ "Erlang — Avanzado" . erlang.org . Consultado el 30 de enero de 2017 .
- 1 2 8.5 El tipo de número
- 1 2 "selected_real_kind en Fortran Wiki" . fortranwiki.org . Consultado el 30 de enero de 2017 .
- ↑ "La biblioteca C de GNU: números complejos" . gnu.org . Consultado el 30 de enero de 2017 .
- ↑ "Grammar vb" . Especificación del lenguaje Visual Basic . 17 de junio de 2016. Archivado del original el 29 de agosto de 2019. Consultado el 29 de agosto de 2019 .
- ↑ "para...de" . mozilla.org . Consultado el 30 de enero de 2017 .
- ↑ "Try-Catch para VB" . google.com . Archivado del original el 16 de abril de 2016. Consultado el 30 de enero de 2017 .
- ↑ Klabnik, Steve; Nichols, Carol. "Manejo de errores" . El lenguaje de programación Rust .
- ↑ "Descomposición prima – Código Rosetta" . rosettacode.org . Consultado el 30 de enero de 2017 .
- ↑ "iso_fortran_env en Fortran Wiki" . fortranwiki.org . Consultado el 30 de enero de 2017 .
- ↑ "Ejecutar un comando del sistema – Rosetta Code" . rosettacode.org . Consultado el 30 de enero de 2017 .
- ↑ "EXECUTE_COMMAND_LINE – El compilador GNU Fortran" . gnu.org . Consultado el 30 de enero de 2017 .
- Estructuras de programación
- Comparación de lenguajes de programación