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".
Respostas:
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.
fonte
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.
fonte
restrict
em C99 (10 anos atrás!).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.
fonte
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.
fonte
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.
fonte
restrict
ponteiro C99 não teria a mesma semântica de aliasing do Fortran? E o que mais há que faça alguma diferença?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".
fonte