Ir | ||
Fecha de la primera versión | 10 de noviembre de 2009 | |
---|---|---|
Paradigma | Lenguaje compilado , programación concurrente , imperativa y estructurada | |
Autor |
Robert Griesemer (en) Rob Pike Ken Thompson |
|
Última versión | 1,16,5 (3 de junio de 2021) | |
Versión de desarrollo | 1,16beta1 (17 de diciembre de 2020) | |
Mecanografía | Fuerte , estático , estructural | |
Influenciado por |
C Python Oberon-2 ( en ) Limbo Active Oberon ( en ) Comunicando procesos secuenciales Pascal Oberon Smalltalk Newsqueak ( en ) Modula-2 Alef APL BCPL Modula ( en ) Occam |
|
Sistema de explotación | Windows , GNU / Linux , Mac OS X , FreeBSD , OpenBSD , DragonflyBSD , Solaris , Plan 9 | |
Licencia | Licencia BSD , patentada | |
Sitio web | golang.org | |
Extensión de archivo | ir | |
Go es un lenguaje de programación compilado y concurrente inspirado en C y Pascal . Este lenguaje fue desarrollado por Google a partir de un concepto inicial de Robert Griesemer , Rob Pike y Ken Thompson . Go tiene dos implementaciones: la primera usa gc , el compilador Go; el segundo usa gccgo , " frontend " GCC escrito en C ++ . Go está escrito en C usando yacc y GNU Bison para analizar hasta la versión 1.4, y en Go mismo para versiones posteriores (1.5).
Rob Pike, uno de sus tres creadores, da un objetivo de Go, quien dice de los desarrolladores sin experiencia:
“No pueden entender un lenguaje brillante, pero queremos que hagan buenos programas. Por lo tanto, el lenguaje que les damos debe ser fácil de entender y de adoptar ”.
Go quiere facilitar y acelerar la programación a gran escala: debido a su simplicidad, es concebible utilizarlo también para escribir aplicaciones, scripts o grandes sistemas. Esta simplicidad también es necesaria para garantizar el mantenimiento y la evolución de los programas a lo largo de varias generaciones de desarrolladores.
Si bien también apunta a la velocidad de ejecución, esencial para la programación del sistema, considera que el subproceso múltiple es el medio más robusto de garantizar esta velocidad en los procesadores actuales, al tiempo que facilita el mantenimiento al separar las tareas simples ejecutadas de forma independiente para evitar la creación de "fábricas de gas". Este diseño también permite un funcionamiento sin escritura en arquitecturas de varios núcleos al explotar inmediatamente el aumento de potencia correspondiente.
A continuación, se muestra un ejemplo de un programa típico de Hola mundo escrito en Go:
package main import "fmt" func main() { fmt.Printf("Hello, world\n") }El lenguaje Go fue creado para la programación de sistemas y desde entonces se ha extendido a aplicaciones, que es el mismo objetivo que C y especialmente C ++. Es un lenguaje imperativo y competitivo . Su velocidad de compilación (debido a la simplicidad de su sintaxis) hace que en ocasiones se utilice como lenguaje de scripting.
Go integra directamente, como Java , el procesamiento de código concurrente. La palabra clave gopermite que una llamada de función se ejecute en competencia con la goroutine actual. Una goroutine , llamada así por analogía distante con las corrutinas , es un hilo de ejecución supervisado por el planificador incluido en el tiempo de ejecución. Luego, el programa aprovechará la topología de la computadora para realizar mejor las gorutinas, no necesariamente en un nuevo hilo, pero también es posible que un grupo de gorutinas se multiplexe en un grupo de hilos.
Para llamar a una función f , escribimos f () . Para llamarlo como una goroutine, simplemente escribimos go f () , que es muy similar a la llamada f tarea; de PL / I , un lenguaje que también gestiona la multitarea desde 1970.
Las gorutinas se comunican entre sí pasando mensajes , enviando o recibiendo mensajes a través de canales.
Estos mensajes sincronizan las gorutinas entre sí de acuerdo con el modelo CSP , considerado por los autores como más intuitivo que el modelo multiproceso (con sincronización por semáforos que comprenden cerraduras, noción también introducida por Dijkstra ).
En el estado actual del lenguaje (2018)
El lenguaje contiene aspectos de Pascal y C, pero nos exponemos a muchos errores si olvidamos momentáneamente que no estamos ni en Pascal ni en C.Así que a:=basigna una variable a asignándole el valor y el tipo de b, pero si la variable ya ha sido asignada solo tendrás que escribir a=b. No confundir con a==b(igualdad de valores). La expresión detrás de a ifno necesita paréntesis, pero la expresión que se ejecutará si la prueba pasa debe ir entre llaves. En su estado actual, el compilador no tolera que no se utilice una variable declarada, lo que sin duda fomenta las buenas prácticas, pero hace que el ensayo y error para depurar programas sea muy doloroso.
Go conoce tipos escalares (enteros into int64, flotantes float, cadenas string), matrices indexadas por enteros que comienzan en 0, mapas que son colecciones de objetos indexados por claves (llamados diccionarios , hashes o matrices asociativas en otros idiomas) y porciones que son una generalización dinámica de matrices.
Accede fácilmente a archivos de lectura y escritura, ya sea en modo de línea o de caracteres, o absorbiendo el archivo completo, a través de los paquetes os e io .
Go tiene un sistema de tipo estático , fuertemente tipado , estructural y seguro , basado en la inferencia de tipos con posibilidad de utilizar un tipado explícito.
Para dar un ejemplo, la escritura s := "Camélia", que declara, asigna e inicializa s, es posible y no fuerza la escritura var s string = "Camélia", que sin embargo sigue siendo aceptada.
La compatibilidad del tipo de compuesto se basa en las propiedades más que en el nombre. Es decir, dos tipos compuestos serán equivalentes si sus propiedades son equivalentes: mismo nombre para la propiedad y equivalencia de tipo. Esta es la tipificación estructural .
Esto tiene como consecuencia que el lenguaje no es objeto en el sentido clásico (ya sea con clases o con prototipo ), sin embargo los diseñadores del lenguaje han hecho una elección más original por un lenguaje estático. Es posible definir interfaces que lleven métodos que describan el comportamiento de un objeto (también es posible mezclar fácilmente varias interfaces en una). Las funciones Go pueden declarar que aceptan un argumento de esta interfaz. Un objeto que declara todos los métodos de esta interfaz, con la misma firma, se puede pasar como argumento de este método. La verificación de tipos la realiza el compilador de forma estática.
El hecho de que Go no sea un objeto en el sentido clásico significa que Go no tiene herencia de tipos ni subclases. Esto permite sortear los problemas que plantean estos sistemas como la herencia múltiple en lenguajes que lo permiten (en C ++ por ejemplo), o la herencia simple (en Java por ejemplo). Con la equivalencia de tipos basada en propiedades, Go no necesita herencia de tipos. La subclasificación se emula mediante el "tipo de embarque". Esto facilita la combinación de dos bases de código diseñadas de forma independiente sin tener que compartir tipos comunes.
La visibilidad de estructuras, atributos, variables, constantes, métodos, tipos de nivel superior y funciones fuera de su paquete de declaración se define mediante el caso del primer carácter de sus identificadores .
Go funciona en Unicode tanto para su código fuente como para su procesamiento de cadenas. Sin embargo, su literatura abandona la expresión puntos de código por la abreviatura de runas . Los procedimientos permiten transformar representaciones de personajes en runas (cualquier runa que ocupe un tamaño fijo) y transformar mediante procedimientos estándar una serie de caracteres Unicode en runas de una matriz (una runa por elemento), así como a la inversa, sin tener que hacer malabarismos. representaciones de longitud variable o preocuparse por si la máquina es little-endian o big-endian . Por tanto, la portabilidad está asegurada.
Hablar de runas evita las ambigüedades que estarían presentes con carácter o byte . Para explorar una cadena, usamos las funciones de la cadena directamente o la examinamos de una runa a otra.
La capitalización de los caracteres nacionales (por ejemplo, "è" ⇒ "È") se realiza simplemente con unicode.ToUpper(r rune) rune. Las runas le permiten especificar en cualquier carácter Unicode, tailandés, chino, griego, incluido el idioma APL , y también cualquier emoticón que se encuentre allí.
En Go, la gestión de la memoria la realiza un recolector de basura .
Aún no existe una programación genérica, incluso si los diseñadores del lenguaje están pensando en ello. No hay sobrecarga de métodos ni aritmética de punteros . Finalmente, no hay afirmaciones ni excepciones . Para reemplazar estos dos, GB proporciona palabras clave defer, panicy recoverque proporcionan mecanismos similares a excepción lenguaje sistemas tales como C ++ y Java manipulación (palabras clave try, catch, finallyy throw).
Go puede interactuar con bibliotecas C / C ++, desarrolladores de terceros que ya han desarrollado enlaces para SDL y MySQL .
Go define un formato de código estándar (en términos de sangrías y presentación de estructuras de control) y proporciona una herramienta para aplicarlo (go fmt).
Go también ofrece un sistema de documentación y un marco de pruebas basados en código.
La unidad de compilación de go es el paquete que está representado en la implementación estándar por un directorio y los archivos directamente contenidos en ese directorio.
La importación de un paquete se realiza mediante su ruta de importación y puede especificar una biblioteca estándar o también paquetes de terceros instalados en repositorios de fuentes remotas (actualmente soportado: repositorio bajo svn , git , mercurial y bazaar ).
Aunque Go está inicialmente destinado a producir aplicaciones de sistema robustas y no programas de usuario, los enlaces a OpenGL se están desarrollando de forma experimental.
Al igual que C, Go requiere que indique qué bibliotecas utilizará. A diferencia de C, considera que la compilación es un error si no se utiliza esta biblioteca . De hecho, el compilador Go no contiene ningún mensaje de advertencia por elección de los diseñadores: "No es esencial indicar lo que no sería esencial corregir".
Bibliotecas principales:
Las bibliotecas son a veces independientes, a veces dependientes. También hay varias formas de hacer cosas similares. Por ejemplo, para leer un archivo, puede usar ioutil.ReadAll , file.Read () o bufio.NewScanner () .
Obtenemos la lista de bibliotecas de la línea de comando por go list all.
Go permite la llamada recursiva de programas, lo que a veces puede hacerlos más legibles, sin una pérdida excesiva de velocidad:
package main import "fmt" import "time" var s [61]int func fib(n int) int { if n < 3 { return 1 } if s[n] != 0 { return s[n] } s[n] = fib(n-1) + fib(n-2) return s[n] } func main() { var i int t0 := time.Now() for i = 1; i <= 60; i++ { fmt.Printf("fib(%d) = %-15d\t", i, fib(i)) } println() println("Durée :", time.Since(t0).Seconds()) }Este programa está formateado de la manera estándar por la utilidad gofmt con las opciones -s (simplificar el código si es posible) y -w (escribir el código modificado en el lugar ). Esta utilidad alinea los niveles de profundidad del programa, lo que facilita el mantenimiento, especialmente si varios desarrolladores necesitan mantener el mismo código. Tenga en cuenta que no alinea verticalmente las llaves de apertura y cierre, siendo la mayoría de los editores actuales (2018) los responsables de señalizar visualmente las coincidencias en el modo de edición.
Las opciones sintácticas de Go no son unánimes. Si el lenguaje pretende ser simplista en su redacción, algunos lo critican por tener sesgos demasiado impactantes y dogmáticos al respecto al calificar su sintaxis de confusa y su compilador de cuestionable rigidez, citando entre otros:
El lenguaje ha sido criticado por tener "un motor Ferrari en una carrocería Ford T".
Por otro lado, Go propone simplificar la sintaxis de C, que se mantiene intencionalmente en C ++ para garantizar la compatibilidad con versiones anteriores, por ejemplo, eliminando los paréntesis sintácticamente innecesarios detrás de ify for, proponiendo una falla predeterminada en a switch, etc. Estos cambios pueden proporcionar programas más legibles.
Lista de aplicaciones gratuitas notables escritas en Go: