Por que não sai uma linguagem mais rápida e "melhor" que C? [fechadas]

147

Com todas as novas linguagens "modernas" hoje em dia, como é que C ainda é anunciado como o mais rápido e "mais próximo da máquina"? Eu realmente não acredito que haja apenas uma maneira correta de fazer as coisas, e C existe há muito tempo (desde os anos 60!). Realmente não criamos nada melhor do que algo escrito há quase 50 anos?

Estou ciente de que as linguagens modernas são de nível superior e cuidamos de certas tarefas, como coleta de lixo e alocação de memória, e utilizamos bibliotecas. Só estou perguntando por que nunca houve uma verdadeira segunda opção para C.

Será que C é tão perfeito que nenhuma outra maneira de operar um computador poderia ser possível (exceto a adoção pelo desenvolvedor)?

EDIT Olha, eu não estou tentando bater C ou qualquer que seja o seu idioma favorito. Estou me perguntando por que C se tornou o padrão e por que outras alternativas nunca surgiram e C foi apenas "aceito".

Jason
fonte
44
C ++ é tão rápido e muito mais produtivo para escrever em <3.
GManNickG
6
hum, você não está esquecendo de c ++?
23
Eu argumentaria que a montagem é a mais rápida e "mais próxima" da máquina.
27
por que todos os movimentos para fechar? Estou muito curioso ... eu não estou tentando iniciar guerras de chamas ou qualquer coisa
Jason
15
fechado de novo? depois de ter sido reaberto pelo próprio jeff atwood? por que você gostaria de encerrar isso?
Jason

Respostas:

164

C é uma linguagem muito simples e, por causa disso, juntamente com sua longevidade, é rápida e otimizada. Também é extraordinariamente amplamente suportado, no que diz respeito a ambientes incorporados, microprocessadores, etc.

É difícil vencer uma linguagem realmente simples e rápida. A única coisa a melhorar em uma linguagem como essa é a usabilidade: diminua o tempo necessário para criar código semelhante e genérico e facilite a modelagem com abstrações.

É aqui que entra o C ++. O C ++ pode ser tão rápido quanto C. O problema é que o C ++ é uma linguagem muito mais complexa, o que significa que definitivamente aumenta a produtividade; desde que as pessoas saibam usá-lo. C ++ e C não são mais quase a mesma linguagem.

Agora, D foi outro passo em frente. A mesma capacidade de código rápido, coleta opcional de lixo, etc., mas nunca pegou. Esperemos que isso mude, porque descarta o que atormenta o C ++: compatibilidade retroativa com C.

Portanto, para responder à sua pergunta, "melhor" é uma coisa difícil de julgar. Em termos de simplicidade e velocidade, C é provavelmente o melhor que podemos fazer. Em termos de produtividade versus simplicidade, C ++ é provavelmente o melhor que podemos fazer, embora essa opinião varie muito mais. Por fim, em termos de uma linguagem aprimorada e limpa, com a velocidade e a simplicidade de C, D vence esse contexto.

GManNickG
fonte
31
Por "Simples" você quer dizer "simples a partir de um POV de compiladores, não dos POV dos programadores". C é simples porque é basicamente montagem com instruções e expressões. Não é simples da maneira que o Python é simples.
Marius
15
Mas para esclarecer, simples para o compilador não significa simples para pegar. Talvez não seja simples de implementar idéias complicadas.
GManNickG 08/12/2009
16
Pelo que vale, o OCaml produz código nativo altamente otimizado tão rápido quanto C e C ++, e o próprio código é tão conciso quanto o Python. Com um pouco de polimento, acho que o OCaml pode corresponder ou superar C como o idioma de escolha quando você precisa escrever um código para obter velocidade máxima e espaço mínimo de memória. O Objective-C também faz um bom trabalho, embora nem sempre seja tão rápido quanto C, ele acerta toda a coisa "C com objetos" de uma maneira que o C ++ nunca poderia e nunca será.
Julieta
2
Concordado com @ Thorbjørn, a compatibilidade retroativa com C é o motivo pelo qual o C ++ pegou e o D não. Se estamos dispostos a desistir disso, não há razão para aceitar o aprimoramento incremental que é D. Poderíamos optar por idiomas muito melhores, completamente fora da família C. Como @Juliet diz, o OCaml pode ser um candidato viável em termos de desempenho. Mas o mesmo poderia acontecer com várias outras linguagens, se os escritores do compilador gastassem tanto tempo com elas quanto em C ou C ++. De qualquer forma, boa resposta e +1 de mim.
jalf
5
@Ferruccio: Sim, mas todos os idiomas podem se vincular às bibliotecas C. Portanto, se estivermos dispostos a concordar com isso, em vez da compatibilidade real do código fonte, como C ++ (mais ou menos) oferece, então podemos escolher uma linguagem completamente diferente, por exemplo, Haskell ou Python. O motivo pelo qual o C ++ pegou não foi o fato de poder vincular-se às bibliotecas C. Era que ele poderia compilar o código C.
jalf
64

Existem mais rápido que os idiomas C.

Existem idiomas mais rápidos que C. Por exemplo, o Fortran, como já mencionado, está indo muito bem porque possui regras de idioma de aliasing muito mais restritas.

Também há assembly experimental como linguagens que estão atacando C na frente, onde é usado como uma linguagem de alto nível para membros, por exemplo, criação de compiladores. Já ouviu falar de C-- ou Janus? Mas esses dois foram mortos pelo projeto LLVM.

Eu apostaria que o APL ou outras linguagens matemáticas soprarão C fora da água nos domínios de aplicativos especiais, pois eles têm suporte para unidades de processamento vetorial. Isso é algo que não é possível para C (e pessoal: NÃO! Bibliotecas otimizadas especiais com ligação C não têm nada a ver com C como idioma).

Os produtores de CPU também removeram todo o material, ajudando os escritores de compiladores em outros idiomas - lembre-se dos códigos de montadores aritméticos marcados para acelerar a implementação do LISP no SPARC? Foi com o vento.

E se você se afastar dos micro benchmarks para o desenvolvimento de aplicativos, haverá linguagens mais rápidas para o desenvolvimento de aplicativos. Meu exemplo pessoal aqui é sempre o SmartEiffel. Ele tem como alvo C, mas está usando otimização global do sistema, o que o torna mais rápido que o C no desenvolvimento de aplicativos no mundo real.

Nesse domínio, mesmo uma simples abstração errada ou de baixo nível pode prejudicar o desempenho de todo o idioma. Como o C não oferece abstrações altas, a maioria das pessoas diz que é um problema de programação, mas não é. Por exemplo, olhe a falta de genéricos. Em C, você terminará com implementações lentas, como a função de biblioteca "qsort", que pode ser escrita uma magnitude mais rápida com os genéricos (onde a chamada de função para comparações de teclas é eliminada).

Basta comparar uma chamada qsort em uma matriz de megabytes de entradas com uma boa implementação escrita à mão, que está usando o acesso à matriz e o operador '<' interno.

Lothar
fonte
9
Muito bom comentário. É importante perceber que alguns aspectos das especificações da linguagem C (como regras de alias de ponteiro) tornam impossível gerar código de máquina realmente ideal. Sendo um montador de alto nível, C não é "o mais rápido", mas apenas "muito rápido".
1
Obrigado, esqueci de mencionar a impossibilidade de retornar vários valores de resultado. Outro aspecto de baixo nível que eu sinto falta muito ao usá-lo como montador de alto nível.
5
O C moderno, escrito corretamente, pode codificar as mesmas suposições de alias que qualquer outro idioma, permitindo que o compilador faça as mesmas otimizações. É um recurso importante da linguagem que também permite que o programador não assuma esses requisitos quando eles não são aplicáveis. Seus outros pontos estão no local, então +1.
Stephen Canon
1
@Rascher: Está certo e aí você vê a influência de C nos designers de CPU, que sempre especificam uma ABI da CPU. E vários valores de retorno é algo que simplesmente não vêm para não mente, mesmo se o número de registos, não seria um problema (SPARC, PowerPC, Itanium)
13
O aliasing de ponteiro em C foi tratado restrictem C99 (10 anos atrás!).
35

Boa pergunta. Eu acho que as línguas têm sucesso ao encontrar um nicho. É importante observar que há muitos idiomas mais novos que C em seus nichos.

  • O C já foi amplamente utilizado como uma linguagem de aplicativo e, nesse domínio, tem perdido terreno constantemente para C ++, Java e, recentemente, todos os tipos de outras linguagens (principalmente as linguagens dinâmicas).

  • C costumava ser um idioma para escrever código de servidor. A Web colocou uma variedade incrível de linguagens nesse espaço - Perl, Java, Python, VBScript, VB.NET, Ruby, C # - e os casos em que C faz algum sentido para o código do servidor são poucos e distantes.

  • C tem sido usado para computação científica, mas enfrenta concorrência de linguagens específicas de domínio como Matlab e Mathematica, além de bibliotecas como SciPy . Muitas pessoas que escrevem código nesse nicho não são codificadores por profissão e C não é uma boa opção para eles.

Mas o nicho de C é o código do sistema. Núcleos do sistema operacional. Drivers. Bibliotecas de tempo de execução. Está tão estabelecido nesse espaço que até o C ++ o desloca lentamente.

C ganhou nos anos 70 por causa do UNIX, porque os idiomas concorrentes eram muito restritivos ou lentos demais e porque o código C era considerado razoavelmente portátil (mentiras, mesmo assim). Hoje, porém, suas maiores vantagens não têm relação e decorrem principalmente de décadas de domínio de seu nicho. Existem boas ferramentas para C: otimizar compiladores, depuradores de kernel, análise estática eficaz para encontrar erros no código do driver, etc. Quase todas as plataformas principais definem uma C ABI, e geralmente é a língua franca para as bibliotecas. Há um grupo de programadores que sabem como codificar C - e que sabem quais são os problemas e armadilhas de C.

A longo prazo, esse nicho não vai desaparecer; e C tem alguns problemas. Mas ainda seria extremamente difícil para qualquer novato competir.

Jason Orendorff
fonte
9
C ainda é amplamente usado para código de servidor. Há não só a Web, a maioria DNS, e-mail, etc servidores são escritos em C. Mesmo para a Web, Apache está em C.
@bortzmeyer: O Apache é bem antigo. Não estou dizendo que não é útil ou foi substituído, ele foi criado apenas quando C era e não havia muitas alternativas boas.
8269 Macke
1
Estou curioso para saber por que você considera C "não um ótimo ajuste" para a computação científica. O Python é reconhecidamente mais agradável de se trabalhar, mas eu achei o C uma alternativa sólida quando código mais rápido é necessário e muitas das alternativas possíveis (C ++) não trazem muito mais para a tabela, ao contrário de outros aspectos da programação .
fomite
1
Além disso, a quantidade de material no SciPy / NumPy etc., escrito em C, já torna útil saber.
fomite
1
@EpiGrad Talvez C seja uma alternativa sólida para você. Mas C tem uma curva de aprendizado super íngreme, especialmente para pessoas que não têm experiência em codificação. Em particular, às vezes ele trava e, se você não é um codificador, tem pouca esperança de descobrir isso. O Mathematica facilita a gravação de um grande número de coisas e você acaba com menos código por fator de centenas. E não falha.
Jason Orendorff
25

Parafraseando um comentário muito bom: não há muitas maneiras diferentes de tornar uma linguagem rápida e "próxima da máquina" - C fez bem, e quase não há espaço para melhorar isso.

Resposta original:

Rápido para executar ou rápido para escrever coisas?

Os idiomas não são rápidos ou lentos para executar, são implementações específicas. Um idioma só pode ser considerado mais rápido que outros quando, de alguma forma, facilita a implementação rápida . Invariavelmente, isso significa "próximo à máquina". Mas com as máquinas cada vez mais rápidas exponencialmente, isso se torna progressivamente menos interessante ao longo do tempo. Em vez disso, facilidade e velocidade de desenvolvimento e portabilidade se tornaram muito mais importantes, então "melhor" passou a significar "longe da máquina" . Praticamente todos os esforços no design de linguagem foram nessa direção nas últimas 5 décadas.

Então, você está: mais perto da máquina e linguagens mais rápidas que C; são aqueles que vieram antes de C : Assembler, Fortran. Provavelmente alguns esquecidos.

Michael Borgwardt
fonte
@michael - mas ainda existe um mercado para programação super enxuta e super rápida, especialmente com o ataque de todos esses dispositivos móveis ... por que C ainda é a melhor opção para alguns desses dispositivos, ou seja, por que não existe outro linguagem nesse nível, como .NET-vs-Python-esque?
Jason
5
Lisp. Adormecido, mas não esquecido! :)
2
@ Jason: A pergunta é: quantos montadores portáteis você precisa? C é bem conhecido e é muito difícil escrever uma linguagem com uma implementação mais rápida, então por que se preocupar? Na linguagem do processo, não há exigência, mercado ou motivação.
4
@ Michael, pede desculpas por comentar sua resposta. A razão pela qual há mais no terreno de python / ruby ​​/ java etc é que, quando você para de tentar a linguagem mais eficiente possível, obtém muito mais opções sobre quais recursos priorizar, e cada abordagem pode gerar uma nova linguagem. Existem muito menos maneiras de escrever o idioma mais rápido possível.
1
-1 para "e quase não há espaço para melhorar isso" - há muito espaço para melhorar o C / C ++ sem afetar o desempenho.
BlueRaja - Danny Pflughoeft 31/03
21

O Fortran é mais rápido que C para tarefas numéricas devido à maneira como lida com referências de memória (é mais difícil otimizar ponteiros C). As bibliotecas numéricas pesadas na base de coisas como Matlab e Numpy ainda estão escritas em Fortran.

Por outro lado, o C ++ pode ser tão rápido quanto o C, mas possui muitos recursos de programação mais avançados. É uma linguagem muito mais nova, desde meados dos anos 80.

zaharpopov
fonte
1
E o C ++ ainda está sendo atualizado.
GManNickG
5
@GMan: assim é C.
3
Corrija-me se eu estiver errado, mas um restrictponteiro C99 não teria a mesma semântica de aliasing do Fortran? E o que mais há que faça alguma diferença?
9
Eu acho que a ideia de que o Fortran é mais rápido que o C é um mito, dependendo do que está sendo codificado e de quem está fazendo isso. A razão pela qual as bibliotecas numéricas pesadas estão no Fortran não é porque o Fortran é mais rápido, mas porque as rotinas foram originalmente codificadas no Fortran e poucas pessoas têm coragem ou precisam reescrevê-lo. O pequeno número de gurus da matemática que escrevem e examinam esses algoritmos está feliz no Fortran e não vê necessidade de mudar, especialmente porque eles imaginam que o Fortran é mais rápido.
precisa saber é o seguinte
16

Que diabos, eu concordo com meus $ 0,02.

Em muitos casos, há uma diferença real ou percebida entre idiomas de "sistemas" e idiomas de nível superior. Ignorarei a maioria das linguagens de "nível superior", pois ninguém (pelo menos não muitas) argumentará que, para muitas tarefas, linguagens como Python, Ruby etc. são mais simples de trabalhar.

C foi projetado para ser uma linguagem de sistemas, o que significa que foi desenvolvido como o idioma em que o sistema operacional Unix foi escrito. Como tal, foi projetado para ser simples, poderoso e rápido. Uma linguagem simples ganha poder por meios que os programadores que não são de sistemas costumam considerar perigosos: ponteiros, gerenciamento manual de memória etc. Como já foi mencionado, C é bastante simples. K&R é o menor livro da minha prateleira de programação (de longe o O'Reilly Pocket References) e é apenas marginalmente "maior" do que o Ruby Pocket Reference. C é bastante poderoso. Se você precisar falar com o hardware, verifique e ajuste manualmente a memória, etc. C possui esse recurso.

Da perspectiva de um programador, no entanto, C não é tão simples. Velocidade e potência custam o gerenciamento manual de memória e não há muito suporte a OOP embutido no idioma. C ++ (não minha linguagem favorita) é muito mais simples do ponto de vista de um programador, mas muito menos simples do ponto de vista de um compilador. O Objective-C (possivelmente meu idioma favorito) tem a mesma vantagem, com uma leve inclinação na direção de manter o idioma simples (a coleta de lixo é uma novidade no Objective-C, por exemplo). Mas como o mundo da computação, como muitos de nós sabemos, foi escrito em C, é difícil para linguagens mais novas, mais complicadas, mas "mais fáceis" obter uma ampla adoção.

Em alguns casos, especialmente quando o "padrão" atual é tão "bom o suficiente" quanto C, simplesmente não há muito incentivo para que algo "melhor" (C ++, Objective-C, D etc.) ganhe tração, quando houver é incentivo suficiente para criar algo "melhor".

alesplin
fonte