Não conheço C. E por que devo aprender? [fechadas]


58

Minha primeira linguagem de programação foi PHP ( gasp ). Depois disso, comecei a trabalhar com JavaScript. Eu fiz recentemente trabalho em c #.

Nunca vi línguas de nível baixo ou médio como C.

O consenso geral na comunidade de programação em geral é que "um programador que não aprendeu algo como C, francamente, simplesmente não consegue lidar com conceitos de programação como ponteiros, tipos de dados, passar valores por referência etc."

Eu não concordo. Eu argumento que:

  1. Como as linguagens de alto nível são facilmente acessíveis, mais "não programadores" mergulham e fazem uma bagunça
  2. Para realmente fazer qualquer coisa em uma linguagem de alto nível, é preciso entender os mesmos conceitos semelhantes com os quais a maioria dos defensores do "aprenda primeiro de baixo nível" evangeliza.

Algumas pessoas precisam conhecer C; essas pessoas têm trabalhos que exigem que eles escrevam códigos de nível baixo a médio. Tenho certeza de que C é incrível e de alguns programadores ruins que conhecem C.

Por que o viés? Como um programador bom, honesto e com fome, se eu tivesse que aprender C (por algum motivo imprevisto), eu aprenderia C. Considerando a multiplicidade de idiomas por aí, bons programadores não deveriam se concentrar em aprender o que nos avança? Não devemos aprender o que nos interessa? Não devemos utilizar nosso tempo finito para avançar ? Por que alguns programadores discordam disso?

Acredito que buscar a excelência no que você faz é a característica determinística fundamental entre bons programadores e maus.

Alguém tem exemplos do mundo real de como algo escrito em uma linguagem de alto nível - como Java, Pascal, PHP ou JavaScript - realmente se beneficiou de um conhecimento prévio de C? Exemplos seriam muito apreciados.


@ Stephen Oh, desculpe ... eu entendi errado. (mas u vejo por que u precisa aprender c / c ++ certo?)
ApprenticeHacker

1
@burningprodigy Sim, no caso de eu precisar fazer algo em que C / C ++ seja necessário ou faça mais sentido, é claro que eu aprenderia C. Minha carne é com pessoas que dizem que você precisa aprender C para poder efetivamente desenvolver em idiomas de alto nível. E isso é absurdo.
Stephen


você pode nos dar um contexto (url) em que "não pode lidar com conceitos de programação como ponteiro ..."?
K3b

Se houvesse um idioma que eu gostaria de aprender, seria o Common Lisp, não o C. Como principal desenvolvedor de C #, tenho certeza de que me beneficiaria mais dele. Já temos ponteiros em c #. Principalmente, eu prefiro aprender mais maneiras de abordar um problema do que tentar implementar minha mesma solução de uma maneira mais difícil. (Apenas como uma observação, estou meio mentindo. Eu fiz C e sei que ele tem suas vantagens. Só queria dar crédito a uma linguagem incrivelmente poderosa e expressiva que antecede C por uma década.)
Magus

Respostas:


113

A vantagem de conhecer C é que você tem uma idéia muito boa de como um computador funciona. Não apenas como seu modelo de programação funciona, mas como a memória é organizada e afins.

O único nível abaixo de C é a montagem falada por uma CPU específica.

(Eu acrescentaria que conhecer C também permite que você aprecie quanto menos trabalho você precisa fazer em um idioma de nível superior. E, esperançosamente, uma apreciação do custo envolvido no trabalho nesse idioma de nível superior.)


12
Frank: Você bate na unha na cabeça. Compreender como um computador funciona, gerenciamento de memória e alocação, juntamente com a idéia de que você pode apreciar ainda mais linguagens de alto nível, é o motivo para aprender C. Tenho sorte de termos aprendido C para implementar projetos de classe, como implementar uma camada TCP básica sobre UDP .
Chris

12
Eu concordo com isso, embora: C aproxime você apenas alguns passos das raízes, e não todo o caminho até o chão. Ok, há uma coisa chamada layout de memória. Mas o que isso significa fisicamente? Você entende como o computador funciona se você não entende de eletrônica? Mecânica quântica? E assim por diante. Não tenho certeza se existe uma única mente no mundo que entende profundamente toda a cadeia alimentar, desde uma linguagem de alto nível, via C, até a mecânica quântica.
Joonas Pulakka 26/10/10

14
Minha pergunta é: como você pode se beneficiar ao saber como um computador funciona internamente? O que você está ganhando? Apreciação do que você tem agora não é uma boa razão para aprender uma língua muito baixo nível, como C. É como dizer que eu deveria aprender Fortran para apreciar o que eu tenho agora
TheLQ

18
@TheLQ Estou sem palavras. Como você pode se beneficiar ao saber como um computador funciona internamente? Você está obtendo uma compreensão mais clara do que está fazendo, é o que está obtendo. Em vez disso: você está aprendendo o que realmente está fazendo na máquina em primeiro lugar.
Frank Shearar

15
Vou marcar isso como correto, pois parece ser a resposta favorita. Dito isso, eu realmente não me importo "como um computador funciona" em um nível fundamental, pois isso realmente não me ajuda a desenvolver o próximo recurso interessante do meu aplicativo. É como dirigir um carro: sou muito bom nisso, mas não me importo com o funcionamento da pressão do fluido de freio. Apenas para quando eu pego o freio. Além disso, tenho certeza de que gostaria de dirigir um carro mais se tivesse que andar de cavalo e buggy pela primeira vez por cinco anos. Não significa que sou incapaz de postular o quanto as coisas são melhores com o carro e não com o buggy.
Stephen

72

Eu não acho que nenhuma das respostas aqui seja realmente o que o OP estava procurando, então vou jogar na minha própria opinião.

Olha, sou um esnobe desapaixonado de C. Minha atitude é que, se você não conhece C, até certo ponto não sabe realmente o que está fazendo como programador. Então, acho que sou o tipo de pessoa "tendenciosa" que você está falando aqui.

No entanto, na prática, se você realmente sabe ou não o que está fazendo como programador, não necessariamente o impede de desenvolver um software realmente incrível e útil usando ferramentas de alto nível. Quero dizer, o criador do Stack Overflow, Jeff Atwood, aparentemente nem conhece C, e ainda assim eu diria que o Stack Overflow é um aplicativo da Web muito bom.

Se você decide ou não aprender C (ou C ++, ou assembly) depende de que tipo de programador você deseja ser. Se você quiser apenas para desenvolver legal aplicações web ou aplicativos de negócios, isso é bom - não há necessidade real de aprender C. Mas se você quiser realmente se destacar no que faz - se você quiser trabalhar em realmente interessantes projectos que empurram o estado da arte, você realmente precisa se levar a sério o suficiente como programador para realmente entender como os computadores funcionam. Como C é essencialmente a língua franca do sistema operacional, bem como a linguagem que alimenta praticamente tudo o mais (do kernel do Linux à maioria das VMs Java, aos intérpretes Python e Ruby, bancos de dados SQL, servidores da Web e praticamente todos os drivers de dispositivo) , uma compreensão íntima do idioma é um longo caminho.

Sem mencionar que conhecer C (ou C ++) abre uma enorme oportunidade para contribuir com grandes projetos de código aberto que impactam milhões (ou centenas de milhões) de pessoas. Deseja trabalhar para melhorar o intérprete Python ou o navegador Chromium? Bem, você precisa conhecer C para o primeiro e C ++ para o último.

É por isso que comparar C com idiomas naturais mortos, como o latim ou tecnologias desatualizadas, como o cavalo e a carruagem, está completamente errado. Uma grande parte de nossa infraestrutura de software do século XXI é alimentada por código C, e é por isso que C permanece tão relevante hoje como sempre.

Portanto, se você deve ou não aprender C realmente depende do que deseja da sua carreira como programador.


5
Você não parece tão esnobe. Ok, talvez um pouco. :)
Stephen

7
Excelente resposta. Programei com sucesso por dez anos sem aprender C e C ++ e poderia ter passado o resto da minha carreira sem aprender. Mas desde que o aprendi no ano passado, escrevi um software melhor , não apenas em C ++, mas também em meus outros idiomas.
John M Gant


3
Por que seria "completamente errado" comparar C com latim? Eu acho que é uma excelente analogia. O latim está em toda parte ao nosso redor. 58% do vocabulário em inglês é influenciado pelo latim (diretamente ou através de outras línguas românicas). O latim também é a chave para entender nossa cultura. Direito, democracia, religião, infra-estrutura, planejamento da cidade e várias outras áreas podem ser encontradas no Império Romano. Você pode optar por ignorar C da mesma maneira que pode ignorar o latim, mas nunca pode evitá-los. "O latim e o grego não são línguas mortas. Eles simplesmente deixaram de ser mortais." (JW McKail)
Anders Sjöqvist

2
@ AndersSjöqvist, seria errado porque ninguém mais fala latim, mesmo que tenha influenciado profundamente o desenvolvimento das línguas modernas. Enquanto o C é usado ativamente e em uso em qualquer lugar - em praticamente todos os sistemas operacionais, VMs, bancos de dados ou intérpretes. O latim é mais, digamos ... Simula - uma língua quase morta que influenciou profundamente as línguas vivas, mas não é usada fora da academia.
Charles Salvia

12

Uma regra prática é que você precisa entender pelo menos um nível de abstração abaixo daquele em que normalmente trabalha. Considere que seu intérprete PHP ou JavaScript pode realmente ser implementado em C ou C ++. Eventualmente, você atingirá um bug no intérprete ou mesmo um erro de tempo de execução em C. Se você não entende C, ficará limitado a enviar um relatório de bug ao mantenedor, esperando que ele possa reproduzi-lo e se preocupar com ele, e depois mexer nos polegares. Se você conhece C, pode dizer exatamente onde está o problema e qual é.

Isso também significa que, se você trabalha em C / C ++, deve poder ler pelo menos a montagem em sua plataforma.

Quanto ao aprendizado de C quando você precisar: minha observação é que a maioria dos programadores pode aprender Perl / Python / Javascript sob demanda, mas o assembler / C / Lisp parece exigir muito mais tempo, por isso vale a pena aprender pelo menos alguns conceitos básicos antes da necessidade surge.


9
Ok, "C / C ++" eu posso conviver (advogados de linguagem sejam condenados). E "Perl / Python / Javascript" é perfeitamente razoável. Mas pelo amor de Deus, por que "assembler / C / Lisp"? É como dizer "maçã / laranja / Barrack Obama". Essas três línguas não têm nada a ver uma com a outra.
Jason Baker

@ Jason, a única semelhança que eu estava sugerindo é que a maioria das pessoas acha mais difícil entender rapidamente esse trio de idiomas e, portanto, pode valer a pena o OP passar algum tempo com eles antes que surja uma necessidade imediata de usá-los. A programação aritmética e funcional dos ponteiros não tem muito em comum, exceto que as pessoas parecem ter que encará-las por mais tempo antes que façam sentido.
Charles E. Grant

Eu não poderia concordar mais. Indo de outra maneira, para níveis mais altos de abstração, o “cara de TI do escritório / gal” que pode fazer pelo menos alguma programação geralmente será melhor do que aquele que não pode.
Emmet 27/07

7

Não concordo que você precise aprender C primeiro , mas acredito que você deve aprender C eventualmente . Todas as abstrações estão vazias e o entendimento de C facilita a compreensão do que realmente está acontecendo quando você usa alguma abstração sofisticada de alto nível. Dito isto, também acho que todos os programadores sérios deveriam eventualmente aprender a ler pelo menos o assembler, pelo mesmo motivo.

Aprender esses conceitos de baixo nível oferece uma capacidade surpreendente de raciocinar sobre coisas de alto nível. Por exemplo, em C ++ e D, os argumentos padrão para funções virtuais são determinados pelo tipo estático (tempo de compilação) do objeto, não pelo tipo dinâmico (tempo de execução). Isso não faz sentido, a menos que você entenda como as vtables e as convenções de chamada funcionam e por que seria extremamente difícil implementar funções virtuais da maneira oposta.


2
Aprenda a ler uma linguagem Assembly talvez. O problema é que eu tenho mais de 10 famílias de processadores diferentes que eu uso e aprendendo todas as variantes muito diferentes é uma receita para confusão e caos. Tente comparar o AMD SHARC com o Atmel AVR32 e TI MSP430.
uɐɪ

@Ian: Certo. Idealmente, você deve aprender a linguagem assembly de qualquer arco para o qual você mais desenvolve. Para a maioria das pessoas, acho que será x86 ou ARM.
dsimcha

3
"todos os programadores sérios deveriam eventualmente aprender a ler pelo menos o assembler". São esses comentários que me deram início a essa pergunta. Eu acho que você é simplesmente parcial, senhor. Embora eu goste do que você disse sobre abstrações com vazamentos. Isso faz sentido. Por outro lado, essas coisas não fazem muita diferença no mundo real na minha arena. Ainda estou usando a abstração de alto nível, com vazamento ou não.
26610 Stephen

1
@Stephen, você deve tentar escrever alguma linguagem assembler. As CPUs de 8 bits não são difíceis e tentar implementar a mesma coisa pequena em 6502 (como o C64) e Z80 (como máquinas de negócios CP / M) é realmente muito educativo experiência devido a algumas diferenças muito básicas de design (página de índice versus registradores).

+1, apesar da All abstractions are leakyafirmação flagrantemente falsa .
Thomas Eding

7

O viés é um status quo. Antigamente (anos 80 e anteriores), o C / C ++ era praticamente um requisito para aplicativos de desempenho. Isso mudou, mas os desenvolvedores seniores geralmente vêm desse contexto antigo e vêem coisas nesse contexto.

Para o desenvolvimento real, outras linguagens são usadas - o C # é popular, assim como o Java, enquanto o PHP e o Python são populares para projetos internos e é sempre útil ter alguém disponível com pelo menos conhecimento básico nessa área, caso você escolha uma opção aberta. projeto PHP de origem para, digamos, seu sistema de rastreamento de bugs. No entanto, as especificações de trabalho ainda parecem vir desse modelo padrão que foi escrito há 25 anos.


6
"as especificações de trabalho ainda parecem vir desse modelo padrão que foi escrito há 25 anos." Você não poderia estar mais correto.
Stephen

Parabéns, John!
Mark C

6

Por mais que eu odeie postar o post obrigatório no blog de Joel, concordo com ele aqui . C é a língua franca da programação. Não consigo pensar em nenhuma linguagem de alto nível que não possa interagir com ela de alguma forma. Por causa disso, C ainda é uma escolha popular para coisas do tipo programação de sistemas. Você simplesmente não pode interagir com algumas coisas no nível do sistema operacional sem C.

Além disso, o que você planeja fazer quando seu idioma de alto nível não é rápido o suficiente? Saber escrever C é especialmente importante quando você está usando uma linguagem de alto nível e dinâmica, como Ruby, Python ou PHP. Mas mesmo os programadores de Java e C # precisam passar para o C de tempos em tempos.


ri muito. Joels aconselha na coluna vinculada: "É melhor você ignorar o que estou dizendo aqui e criar algum tipo de software on-line que permita que outros estudantes encontrem pessoas para sair com alguém".
Stephen

3
@ Stephen: Se você quer que as pessoas realmente notem você, faça com que elas sejam feitas ou pagas.
precisa saber é o seguinte

@ Fred Grande conselho, lol.
Stephen

6

Que grande festa de lesmas! (Como eles supostamente dizem: é uma luta particular ou alguém pode participar?)

Eu era professor e o que descobri (depois de algumas tentativas e erros) foi que era muito mais fácil conduzir os alunos pelos intrincados conceitos de programação se eles entendessem, no nível básico, exatamente o que um computador estava fazendo. Não em todos os detalhes, mas no princípio básico, como o que é a memória, o que são as instruções etc. O que eu mais gosto no C é que ele está perto da máquina.

Isso não quer dizer que outros professores vieram para o mesmo lugar. Eles começaram na linguagem de alto nível (BASIC :-) e seguiram em frente a partir daí, sem efeitos negativos óbvios.

Portanto, Stephen, você pode estar certo. Eu não pensaria assim, mas já estive errado antes.


4

Eu acho que isso é progresso.

Vinte anos atrás, a sabedoria convencional era que você precisava aprender assembler para entender o que estava ganhando com linguagens de nível superior como C (e é por isso que eu tive que fazer uma aula de assembler na faculdade usando o VAX Macro; acho que é útil acabou por se formar).

Existe uma superstição de que, como C é um pouco difícil de aprender e que quase não fornece abstrações (ponteiros e fluxos de bytes são praticamente isso), aprendê-lo de alguma forma fará de você um programador melhor ou fornecerá uma melhor compreensão de como as coisas funcionam no hardware nível.

Isto não é necessariamente verdade. O padrão C não o aproxima mais do metal do que qualquer outro 3GL (Pascal, Fortran, etc.). Algumas implementações de C podem fornecer ganchos que oferecem maior acesso a algumas áreas, mas, em geral, ponteiros nus são o mais próximo possível, o que não é nem um pouco fechado. Você não pode acessar diretamente registros ou palavras de status, por exemplo.

No final, tudo se resume aos modos de código e opcode, portanto, se você estiver realmente interessado em como as coisas funcionam no nível inferior, seria melhor aprender aprendendo assembler sobre C.

Por si só, aprender C não (necessariamente) fará de você um programador melhor. Definitivamente, você apreciará os tipos reais de strings e as bibliotecas de contêineres padronizadas.


Eu acho que "apreciação" é uma maneira de colocar isso. Na minha aula de programação do ensino médio, eram apenas perguntas de "Eu preciso usar essa função. Como converter um LOLOMGCHAR * em um WTFBBQCHAR *?"
Katana314

Eu acho que C foi fácil de aprender. pelo menos era para mim apenas lendo Kernighan & Ritchie.
Robert Bristow-johnson

2

Uma linguagem é uma ferramenta. Se você só precisa escrever páginas da Web e coisas do tipo, tenho certeza de que pode se safar sem precisar aprender C, da mesma maneira que, se você criar kits de modelos de plástico, precisará apenas de uma faca e cola afiadas, normalmente não é necessária uma chave.

Eu escrevo código para sistemas embarcados com recursos de memória altamente restritos (o maior que fiz recentemente é 16kbyte e isso foi ENORME). Nesse mercado, C ou assembler são as únicas opções e qualquer uma das linguagens fofas de nível superior simplesmente não funciona.


1
Isso é ótimo ... Mas nem todo mundo faz isso. A implicação parece ser que as pessoas que não estão escrevendo para sistemas embarcados estão apenas brincando e não desenvolvendo um desenvolvimento sério - pelo menos, adotando a analogia do modelo no contexto do ponto em que os sistemas embarcados estão. Isso não é claramente o caso e é possível escrever aplicações de produção em larga escala sem nunca tocar C.
johnl

É claro que é possível escrever aplicativos de produção em larga escala sem chegar perto do C. Escrevi o código por 10 anos antes de começar a usar o C. Utilizei PL / M, Pascal, ADA e montador. Eles eram tão bons quanto C para aprender a mecânica subjacente da máquina e, geralmente, melhores para produzir código sem erros.
uɐɪ

Grande - embora a sua resposta acima não me deu a impressão de que você pensou dessa maneira, daí a minha resposta ...
johnl

Você tem alguma experiência com os mecanismos Java visando o uso incorporado?

2

Na minha experiência, por um tempo o C / C ++ foi um bom buffer que separou os bons programadores dos codificadores VB6. Depois de fazer cinco anos ímpares de C / C ++, consegui um emprego trabalhando no VB6. Fiquei impressionado com a qualidade (ou a falta dela) dos codificadores. Eles tinham pouco interesse nas entranhas da linguagem, no design ou no desempenho. Infelizmente, quando a empresa mudou para .Net, os codificadores C / C ++ e .Net estavam usando as mesmas ferramentas. Os codificadores VB eram ainda piores codificadores VB.Net. A situação piorou quando todo o desenvolvimento foi para o ASP.NET. De repente, qualquer um que pudesse arrastar e soltar um controle era um programador.

No mercado de trabalho, porém, não havia muito o que diferenciar os codificadores de hard-core (ex C / C ++) e os turistas.

Assim, ter C ou C ++ em seu currículo pode ajudar a diferenciá-lo do riff-raff.


2

Perguntativamente, perguntou: Você está pedindo uma confirmação de que não precisa aprender C? Se você aprender C puro (não necessariamente C ++), obterá um entendimento completo do modelo de execução de um computador. Especialmente sobre memória e alocação. Esse material também é importante para as pessoas que programam em idiomas de nível superior.

Para um programador PHP, é apenas menos transparente como o código é executado na máquina especificada. Pode não ser importante para o programador PHP, já que a transferência de rede é o gargalo no aplicativo, etc.

O PHP / Python / C # simples possui muitas camadas de abstração entre a linguagem e a CPU. essas camadas são tão grossas que não permitem que você as veja. Quando você aprende C, há uma folha fina entre você e a CPU e o sistema operacional. Isso não facilita a programação (e pode até não ser melhor). Mas você é capaz de aprender como a CPU funciona. Depois de conhecer o C "intermediário", você pode realmente começar a vincular esse conhecimento para o idioma de nível superior. Este é o benefício imediato que você obterá.

Na minha opinião, um programador sempre deveria dedicar algum tempo aprendendo diferentes conceitos de programação. Definitivamente vale a pena dar uma olhada no C, mas também dar uma olhada nas linguagens de programação de nível ainda mais alto, como Clojure, Haskell, Prolog.

Você não precisa se tornar um mestre neles, eles apenas ensinam a lição de que "níveis" de linguagens de programação não são binários, mas existem muitos níveis. Conheça-os, de cima para baixo (Assembler). Isso fará de você um programador melhor.


2

Você precisa conhecer C suficiente para ler o código escrito em C, devido à grande quantidade de código muito importante escrito no idioma. Isso é tudo o que você evita de passar por um manual completo sobre o assunto (usei a "programação em C" de Kochan) sem realmente precisar codificar na linguagem. Se você acabar em uma situação que exige o uso extensivo do idioma, terá uma boa base para desenvolver. Você provavelmente deseja estudar algo como o livro da Assembléia de Duntemanns, se a máquina é uma caixa preta para você. Eu também recomendo o "Código" de Petzold.

Fora isso - alfabetização básica em C e familiaridade básica com a máquina subjacente - seria melhor gastar seu tempo de estudo com coisas reais, como SICP, TCP / IP Illustrated ou livros sobre matemática concreta, algoritmos ou estrutura de dados . As coisas reais.

Passar muito tempo estudando C enquanto codifica em PHP simplesmente não vale o custo de oportunidade. Há coisas mais úteis para aprender. C realmente é apenas outro idioma que você pode aprender bem apenas estudando e usando, mas pode aprender quando precisa.

Suar as coisas difíceis.


1

C é o idioma usado para escrever outros idiomas. Ele permite que você fique tão íntimo com a CPU e outro hardware quanto desejar.

Se você não conhece C, não sabe como os outros idiomas alcançam os resultados que alcançam.

Abstração é um conceito importante, é claro, e nem todos precisam saber como sua estrutura de escolha está alcançando os resultados que promete. Você não precisa passar 20 anos escrevendo C, ou pensando no que acontece com suas vtables quando você usa herança múltipla, para escrever um bom código.

Agora, você pode dirigir um carro sem entender como funciona um motor a 4 tempos ou mesmo sem poder usar um câmbio manual (caixa de câmbio manual).

No entanto, se você entender o que está acontecendo sob o capô, poderá, de tempos em tempos, obter resultados excepcionais que alguém sem esse conhecimento terá dificuldade em reproduzir.


1

C (e possivelmente C ++) é o mar em que você está nadando. O sistema operacional que executará seu código provavelmente está codificado em C (e C ++). Portanto, sua API nativa para acessar os serviços do SO estará em C.

Se você pode fazer sem saber o que há abaixo, não há necessidade de conhecer C. No entanto, a maioria dos programadores precisa mergulhar em níveis mais baixos em algum momento de suas vidas.

Também é baseado na sua especialização em áreas de desenvolvimento. Por exemplo, um desenvolvedor web que escreve HTML, Javascript e alguns scripts no servidor pode nunca precisar saber nada sobre C, mas um desenvolvedor de sistema ou jogo distribuído precisará.

Nunca é demais passar algumas semanas aprendendo algo tão fundamental para sua profissão.


1

C tem muitas vantagens:

  1. C é uma linguagem de baixo nível. Você pode usar c para desenvolver kernel e driver.
  2. C é o idioma mais rápido. Muitos softwares de potência são desenvolvidos por c. Por exemplo: memcached, redis, nginx, apache, mysql etc.
  3. C é uma linguagem de plataforma cruzada. O programa desenvolvido por c pode ser executado em todas as plataformas. Outros idiomas de plataforma cruzada não podem fazer isso. Java, python, php etc não podem ser executados na plataforma iOS.
  4. O C ++ não pode ser executado em muitos sistemas incorporados.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.