julian-gamboa-ensino / aula-microservicos-2022

2 stars 0 forks source link

Comparaçoes com linguagens tradicionais (C, Java, etc..) #3

Open julian-gamboa-bahia opened 6 months ago

julian-gamboa-bahia commented 6 months ago
Característica C Go
Paradigma Principalmente procedural Multi-paradigma, suporta procedural, funcional e orientada a objetos (de forma limitada)
Gerenciamento de Memória Manual, com gerenciamento explícito do programador (malloc/free) Automático, com coletor de lixo
Concorrência Suporta através de bibliotecas externas como pthreads Concorrência é um recurso de primeira classe com goroutines e canais
Pacotes e Reuso Uso de headers e arquivos de fonte para reutilização de código Sistema de pacotes integrado e espaço de nome para funções, métodos, etc.
Erro Handling Principalmente por meio de códigos de erro e verificações manuais Uso de valores de retorno múltiplos para erros, e panic/recover para exceções
Compilação Compiladores como GCC, múltiplos passos para ligar (linking) Compilação em um único passo com o compilador 'go', ferramentas de construção integradas
Tipos de Dados Não suporta tipo string nativamente, uso de arrays de char Suporta tipo string nativamente e possui um sistema de tipo mais rico (slices, maps, etc.)
Sintaxe Sintaxe mais flexível e complexa para algumas operações Sintaxe simplificada e mais rigorosa para evitar erros comuns
Padrões de Projeto Flexibilidade na organização do código, dependente do desenvolvedor Encoraja padrões específicos, como o layout de workspace e formato de pacote
julian-gamboa-bahia commented 6 months ago
Go Type Description Java Equivalent Notes
rune Represents a Unicode code point char In Go, rune is an alias for int32. Java's char is a 16-bit type, but doesn't directly represent all Unicode code points without using surrogate pairs.
uint, uint8, uint16, uint32, uint64 Unsigned integers of various sizes None Java does not have native unsigned integers. Unsigned data can be handled but with more complex operations.
complex64, complex128 Complex numbers with float32 and float64 parts None Java does not support complex numbers natively; they require a library or custom implementation.
int, uint, uintptr Integers with sizes that vary with the platform None Java's integer sizes are fixed, whereas Go's int and uint can vary based on the platform, similar to C/C++. uintptr is an integer large enough to hold the bit pattern of any pointer.
[]byte Slice of bytes (dynamically-sized) byte[] While Java has byte[], Go's []byte is a slice with more flexibility in manipulation and length management, integrated deeply with Go's slice capabilities.
chan Channels for goroutine communication None Java uses different concurrency models, typically involving more complex synchronizations like locks or concurrent data structures.
julian-gamboa-bahia commented 6 months ago

image

julian-gamboa-bahia commented 6 months ago
Característica Go Java
Modelo de Concorrência Baseado em goroutines e canais. Goroutines são mais leves que threads de sistema e gerenciadas pelo runtime de Go. Baseado em threads, que são mapeadas diretamente para threads do sistema operacional, utilizando APIs como Thread, Runnable, etc.
Sincronização Utiliza canais para sincronizar e comunicar entre goroutines, além de primitivas de sincronização como sync.Mutex. Utiliza objetos de sincronização como synchronized, ReentrantLock, além de construções como volatile para controle de visibilidade.
Facilidade de Uso Simples e integrado na linguagem, com uma sintaxe e abordagem que encoraja o uso de goroutines e canais para tarefas concorrentes. Requer uma compreensão mais explícita de threads, gerenciamento de vida e sincronização, o que pode ser mais complexo de implementar corretamente.
Escalabilidade Muito alta devido à leveza das goroutines, permitindo que milhões delas sejam criadas e gerenciadas sem grande sobrecarga de memória ou contexto. Menos escalável devido ao uso de threads do sistema operacional, que são mais pesadas e limitadas em número comparado às goroutines.
Padrões de Design Encoraja um design baseado em mensagens e eventos, utilizando canais para comunicação entre tarefas. Tradicionalmente baseado em compartilhamento de estado e sincronização, embora frameworks modernos e bibliotecas possam facilitar modelos reativos ou baseados em mensagens.
Bibliotecas e Frameworks O próprio runtime de Go oferece robusto suporte para paralelismo e concorrência, com pouca necessidade de bibliotecas externas. Extensivo suporte através de bibliotecas como java.util.concurrent, Akka (para sistemas atores), e outras frameworks para paralelismo e concorrência.
Desempenho em Carga Alta Alto desempenho sob cargas concorrentes devido à menor sobrecarga de troca de contexto entre goroutines. Pode sofrer com a sobrecarga de gerenciamento de muitas threads, especialmente em aplicações com muitas operações de bloqueio e sincronização.
julian-gamboa-bahia commented 6 months ago
Característica Array Slice
Definição Coleção de elementos com tamanho fixo e definido na declaração. Vista dinâmica sobre um array, com tamanho flexível.
Tamanho Fixo, definido na declaração e imutável. Dinâmico, pode mudar durante a execução do programa.
Tipo O tamanho do array é parte do tipo. Por exemplo, um array de tamanho 5 é diferente de um array de tamanho 6. O tipo de um slice não inclui seu tamanho ou capacidade.
Declaração var arr [5]int define um array de 5 inteiros. s := arr[1:4] cria um slice usando um array existente.
Armazenamento de Dados Possui seu próprio espaço de armazenamento. Não possui seu próprio espaço de armazenamento; é uma "visão" sobre um array existente.
Componentes Não aplica. Ponteiro para o elemento inicial, comprimento (número de elementos visíveis) e capacidade (máximo de elementos a partir do ponteiro inicial).
Criação Alocado estaticamente ou durante a inicialização. Pode ser criado a partir de um array existente ou com make, que aloca um array e retorna um slice referenciando ele.
Flexibilidade Menos flexível, pois o tamanho e os elementos são fixos. Mais flexível, permitindo subconjuntos dinâmicos de arrays e redimensionamento.
Eficiência Mais controlado em termos de uso de memória quando o tamanho é conhecido e constante. Mais eficiente ao manipular subconjuntos de dados sem a necessidade de copiar elementos.
Uso na Linguagem Menos utilizado diretamente na maioria das APIs Go. Amplamente usado nas APIs Go devido à sua flexibilidade e facilidade de uso.
julian-gamboa-bahia commented 6 months ago
Característica Windows Linux
Modelo de Escalonamento Baseado em prioridades, com múltiplos níveis de prioridade e quanta de tempo variável. Baseado em prioridades com um escalonador de tempo compartilhado (Completely Fair Scheduler - CFS) que busca a equidade na execução dos processos.
Granularidade do Thread Suporta tanto threads de usuário quanto threads do kernel. Threads de usuário são leves e gerenciados em espaço de usuário, enquanto threads do kernel são gerenciados pelo sistema operacional. Usa um modelo de 1:1 para threads, onde cada thread em espaço de usuário corresponde a um thread em espaço de kernel.
Interação com o Hardware Interface direta com a HAL (Camada de Abstração de Hardware) para gerenciar hardware específico e otimizações. Uso de módulos do kernel e drivers que podem ser carregados e descarregados para otimização do hardware, mas com uma abordagem mais uniforme.
Administração de Carga de Trabalho Usa o Windows Scheduler, que pode ajustar a prioridade dos threads dinamicamente com base no uso e outros critérios. Usa o CFS que tenta distribuir a carga de trabalho de forma justa entre todos os threads, permitindo ajustes via nice e outras políticas de escalonamento.
Eficiência em Multi-Core Eficiente em distribuir threads por múltiplos cores para maximizar o desempenho, com políticas avançadas para evitar a migração frequente de threads entre cores. Também eficiente, com suporte a NUMA (Non-Uniform Memory Access) e otimizações para reduzir a latência e maximizar o throughput em sistemas multi-core.
Afinidade de Thread Suporta a configuração de afinidade de thread para determinar em quais cores específicos threads podem ser executados. Similar ao Windows, suporta a configuração de afinidade de thread para otimizar o desempenho em sistemas com múltiplos processadores ou cores.
Escalabilidade Projetado para escalar bem em sistemas com muitos processadores, usando grupos de processadores e sofisticadas técnicas de balanceamento de carga. Altamente escalável, especialmente em ambientes de servidor e data centers, com técnicas robustas para balanceamento de carga e gerenciamento de processos.
Transparência e Configurabilidade Menos transparente devido ao seu modelo comercial. Oferece algumas ferramentas de administração, mas detalhes mais profundos do escalonador são menos acessíveis. Altamente configurável e transparente, com a capacidade de modificar e ajustar o kernel e o escalonador conforme necessário, devido à sua natureza open source.
julian-gamboa-bahia commented 6 months ago
Característica WSL (Windows Subsystem for Linux) Linux Tradicional
Integração de Sistema Executa em cima do Windows, usando uma camada de compatibilidade para executar binários do Linux. Sistema operacional completo que gerencia diretamente o hardware e os recursos do sistema.
Desempenho Bom desempenho para a maioria das aplicações de desenvolvimento, mas com potenciais gargalos em operações específicas de I/O ou gráficas devido à camada de abstração. Desempenho nativo, com acesso direto ao hardware, oferecendo performance superior para a maioria das tarefas, especialmente aquelas que são intensivas em recursos.
Gerenciamento de Hardware Limitado pelo Windows. O acesso ao hardware é abstraído e controlado pelo Windows, o que pode limitar a funcionalidade de certos programas que necessitam acesso direto ao hardware. Controle completo sobre o hardware, com a capacidade de modificar drivers e ajustar o sistema para otimizar o desempenho e a funcionalidade.
Compatibilidade de Software Alta compatibilidade com software de linha de comando Linux, mas pode enfrentar problemas com softwares que requerem componentes específicos do kernel Linux não implementados no WSL. Suporta todo o software projetado para Linux, sem restrições de compatibilidade relativas ao sistema operacional.
Ambiente de Desenvolvimento Ideal para desenvolvedores que usam Windows como sistema principal mas querem a flexibilidade de ferramentas e ambientes Unix. Ideal para desenvolvimento que requer um ambiente Unix/Linux completo, incluindo a capacidade de executar aplicativos de servidor, dockers, etc., em produção.
Suporte a Ferramentas de Rede Alguns comandos e ferramentas de rede podem não funcionar como esperado devido às diferenças na implementação de rede entre Windows e Linux. Suporte completo para todas as ferramentas e comandos de rede nativos do Linux.
Manutenção e Atualizações Dependente das atualizações do Windows e do desenvolvimento do próprio WSL pela Microsoft. Os usuários têm controle total sobre atualizações e manutenção, com acesso a várias distribuições e versões do kernel.
Uso de Recursos Geralmente mais leve em termos de uso de recursos do que uma VM completa, mas ainda sujeito ao overhead geral do sistema Windows. Pode ser otimizado para ser extremamente eficiente em termos de recursos, especialmente em configurações de servidor ou sistemas embarcados.
julian-gamboa-bahia commented 6 months ago
Característica Java (try-catch) Go (gerenciamento de erros)
Mecanismo Baseado em exceções que podem ser lançadas e capturadas usando blocos try e catch. Baseado em retornar valores de erro que devem ser verificados explicitamente.
Fluxo de controle O fluxo de controle é interrompido quando uma exceção é lançada. O controle pode ser transferido para um bloco catch correspondente se disponível. O fluxo de controle continua normalmente a menos que um erro seja explicitamente verificado e manipulado.
Verificação de erros As exceções podem ser capturadas de forma genérica com um único bloco catch que pode tratar múltiplos tipos de exceções. Os erros são valores, normalmente do tipo error. Cada chamada de função que pode falhar retorna um erro que deve ser verificado explicitamente.
Tipos de erro Suporta a criação de muitos tipos de exceções, incluindo exceções personalizadas. Normalmente utiliza um único tipo de erro, o interface error, mas pode ser personalizado implementando o método Error() string.
Forçar tratamento Exceções verificadas forçam o chamador a tratar ou declarar a exceção. Não há exceções verificadas; o tratamento de erros é sempre opcional (embora fortemente aconselhado).
Impacto na assinatura do método As exceções que um método pode lançar são parte de sua assinatura (exceções verificadas). A possibilidade de erro é indicada na assinatura do método/função pela presença de um retorno error.
Código de manutenção Pode levar a um código poluído com muitos blocos try-catch para funções que lançam várias exceções. Promove um código mais limpo, com verificações de erro lineares que seguem o fluxo normal do código.
Performance Tratar exceções pode ser caro em termos de performance, especialmente se muitas exceções são lançadas e capturadas. Menos custoso em termos de performance, pois não há custo associado ao lançamento de exceções; os erros são apenas valores retornados.
julian-gamboa-bahia commented 6 months ago
Característica Descrição das Goroutines
Definição Goroutines são funções ou métodos que executam de forma concorrente como threads leves dentro de um programa Go.
Criação Criadas usando a palavra-chave go seguida por uma chamada de função. Exemplo: go f(x, y, z). Isso inicia a execução de f(x, y, z) como uma goroutine.
Custo de Memória Goroutines têm um custo de memória muito baixo comparado a threads. Uma nova goroutine pode ser iniciada com apenas 2 KB de pilha, que é dinamicamente ajustável.
Escalonamento Gerenciadas pelo runtime de Go, não pelo sistema operacional. O runtime de Go contém um escalonador interno que mapeia as goroutines em um número menor de threads do sistema.
Sincronização Frequentemente sincronizadas usando canais, que permitem a troca de valores entre goroutines de maneira segura. Outras primitivas de sincronização incluem mutexes e wait groups.
Uso Ideais para operações concorrentes, como manipulação de múltiplas conexões de rede, onde cada conexão pode ser tratada por uma goroutine separada.
Modelo de Concorrência Promove um modelo de programação baseado em comunicação em vez de compartilhamento de memória. O mantra é: "Não comunique compartilhando memória; em vez disso, compartilhe memória comunicando."
Vantagens Extremamente leves em termos de overhead de memória e tempo de troca de contexto. Facilita a escrita de programas concorrentes limpos e modulares.
Desvantagens Pode ser desafiador gerenciar estados compartilhados e garantir que as goroutines não causem deadlocks ou outros problemas de sincronização.
julian-gamboa-bahia commented 6 months ago
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
julian-gamboa-bahia commented 6 months ago
Palavra Reservada Exemplo de Uso Comentário Didático
break for i := 0; i < 10; i++ { if i == 5 { break } } Encerra o loop mais interno quando i é igual a 5.
case switch x { case 1: fmt.Println("Um") } Define uma condição dentro de um bloco switch.
chan c := make(chan int) Declara um canal para comunicação concorrente.
const const Pi = 3.14 Define uma constante numérica.
continue for i := 0; i < 10; i++ { if i%2 == 0 { continue } } Pula para a próxima iteração do loop se i é par.
default switch x { default: fmt.Println("Padrão") } Caso padrão em um switch se nenhum outro case corresponder.
defer defer fmt.Println("Finalizado") Agenda uma função para ser chamada após a função atual terminar.
else if x > 0 { fmt.Println("Positivo") } else { fmt.Println("Negativo") } Bloco executado se a condição if não for verdadeira.
fallthrough switch x { case 0: fallthrough case 1: fmt.Println("Menor que 2") } Força a execução do próximo case no switch.
for for i := 0; i < 10; i++ { fmt.Println(i) } Estrutura de loop que repete o bloco de código.
func func soma(a int, b int) int { return a + b } Define uma função chamada soma.
go go func() { fmt.Println("Hello, goroutine") }() Inicia uma nova goroutine, uma thread leve.
goto goto End; End: fmt.Println("Fim") Salta para o rótulo End dentro do mesmo código.
if if x > 0 { fmt.Println("Maior que zero") } Condicional que executa um bloco se a condição for verdadeira.
import import "fmt" Importa o pacote fmt para uso no programa.
interface type Geometric interface { Area() float64 } Define uma interface chamada Geometric.
map m := map[string]int{"a": 1, "b": 2} Cria um mapa de strings para inteiros.
package package main Declara o pacote em que o arquivo de código reside.
range for key, value := range map { fmt.Println(key, value) } Itera sobre elementos de um mapa, slice, array ou string.
return func getTen() int { return 10 } Retorna um valor da função.
select select { case msg := <-c: fmt.Println(msg) } Espera por várias operações de comunicação concorrente.
struct type Pessoa struct { Nome string; Idade int } Define uma estrutura de dados com nome Pessoa.
switch switch x { case 0: fmt.Println("Zero") } Estrutura de controle que executa um bloco de código com base no valor de x.
type type Numero int Define um novo tipo chamado Numero baseado em int.
var var x int Declara uma variável x do tipo int.
julian-gamboa-bahia commented 6 months ago
Versão Data de Lançamento Componentes Afetados Descrição da Segurança
Go 1.22.1 2024-03-05 crypto/x509, html/template, net/http, net/http/cookiejar, net/mail Inclui correções de segurança para múltiplos pacotes.
Go 1.22.2 2024-04-03 net/http Inclui uma correção de segurança específica para o pacote net/http.
Go 1.21.1 2023-09-06 cmd/go, crypto/tls, html/template Corrige quatro vulnerabilidades de segurança em diversos pacotes.
Go 1.21.3 2023-10-10 net/http Correção de segurança para o pacote net/http.
Go 1.21.4 2023-11-07 path/filepath Correções de segurança para o pacote path/filepath.
Go 1.21.5 2023-12-05 go command, net/http, path/filepath Correções de segurança envolvendo o comando go e pacotes net/http e path/filepath.
Go 1.21.8 2024-03-05 crypto/x509, html/template, net/http, net/http/cookiejar, net/mail Semelhante à Go 1.22.1, várias correções de segurança em pacotes essenciais.
Go 1.21.9 2024-04-03 net/http Correção de segurança específica para o pacote net/http.
Go 1.20.1 2023-02-14 crypto/tls, mime/multipart, net/http, path/filepath Correções de segurança em vários pacotes essenciais para a segurança das comunicações.
Go 1.20.2 2023-03-07 crypto/elliptic Correção de segurança no pacote crypto/elliptic.
Go 1.20.3 2023-04-04 go/parser, html/template, mime/multipart, net/http, net/textproto Várias correções de segurança que afetam o processamento de dados e protocolos HTTP.
Go 1.20.4 2023-05-02 html/template Correções de segurança no pacote html/template para prevenir ataques de script cross-site.
Go 1.20.6 2023-07-11 net/http Correção de segurança no pacote net/http.
Go 1.20.7 2023-08-01 crypto/tls Correção de segurança em crypto/tls para fortalecer a segurança do transporte.
Go 1.20.10 2023-10-10 net/http Correção de segurança no pacote net/http.
julian-gamboa-bahia commented 6 months ago
Detalhes de segurança : Versão Data de Lançamento Componentes Afetados Descrição da Segurança
Go 1.22.1 2024-03-05 crypto/x509, html/template, net/http, net/http/cookiejar, net/mail Correções de segurança para múltiplos pacotes.
Go 1.22.2 2024-04-03 net/http Correção de segurança específica para o pacote net/http.
Go 1.21.1 2023-09-06 cmd/go, crypto/tls, html/template Corrige quatro vulnerabilidades de segurança em diversos pacotes.
Go 1.21.2 2023-10-05 cmd/go Correção de segurança no comando go.
Go 1.21.3 2023-10-10 net/http Correção de segurança para o pacote net/http.
Go 1.21.4 2023-11-07 path/filepath Correções de segurança para o pacote path/filepath.
Go 1.21.5 2023-12-05 go command, net/http, path/filepath Correções de segurança envolvendo o comando go e pacotes net/http e path/filepath.
Go 1.21.6 2024-01-09 crypto/tls Atualizações e correções no pacote crypto/tls.
Go 1.21.7 2024-02-06 crypto/x509 Correções e atualizações no pacote crypto/x509.
Go 1.21.8 2024-03-05 crypto/x509, html/template, net/http, net/http/cookiejar, net/mail Semelhante à Go 1.22.1, várias correções de segurança em pacotes essenciais.
Go 1.21.9 2024-04-03 net/http Correção de segurança específica para o pacote net/http.
Go 1.20.1 2023-02-14 crypto/tls, mime/multipart, net/http, path/filepath Correções de segurança em vários pacotes essenciais para a segurança das comunicações.
Go 1.20.2 2023-03-07 crypto/elliptic Correção de segurança no pacote crypto/elliptic.
Go 1.20.3 2023-04-04 go/parser, html/template, mime/multipart, net/http, net/textproto Várias correções de segurança que afetam o processamento de dados e protocolos HTTP.
Go 1.20.4 2023-05-02 html/template Correções de segurança no pacote html/template para prevenir ataques de script cross-site.
Go 1.20.5 2023-06-06 cmd/go, runtime Correções de segurança e atualizações no comando go e no runtime.
Go 1.20.6 2023-07-11 net/http Correção de segurança no pacote net/http.
Go 1.20.7 2023-08-01 crypto/tls Correção de segurança em crypto/tls para fortalecer a segurança do transporte.
Go 1.20.8 2023-09-06 html/template Correções de segurança no pacote html/template.
Go 1.20.9 2023-10-05 cmd/go Correção de segurança no comando go.
Go 1.20.10 2023-10-10 net/http

| Correção de segurança no pacote net/http. | | Go 1.20.11| 2023-11-07 | path/filepath | Correções de segurança no pacote path/filepath. | | Go 1.20.12| 2023-12-05 | go command, net/http, path/filepath | Correções de segurança envolvendo o comando go e pacotes net/http e path/filepath. | | Go 1.20.13| 2024-01-09 | crypto/tls | Atualizações e correções no pacote crypto/tls. | | Go 1.20.14| 2024-02-06 | crypto/x509 | Correções e atualizações no pacote crypto/x509. |

julian-gamboa-bahia commented 6 months ago
Característica C GoLang
Tipo Personalizado typedef int Inteiro; type Inteiro int
Declaração Inteiro dobrar(Inteiro i) { func (i Inteiro) Dobrar() Inteiro {
Corpo da Função return i * 2; return i * 2
Encerramento } }
Chamada da Função Inteiro resultado = dobrar(num); resultado := num.Dobrar()
Comentário // Função que simula o método 'Dobrar' em Go // Método que retorna o dobro do valor do receptor