Alternativas modernas compiláveis ​​para C / C ++ [fechado]

38

Estou pensando em escrever um novo produto de software. O desempenho será crítico, por isso tenho receio de usar uma linguagem ou interpretação ou uma que use uma camada de emulação (leia java).

O que me leva a pensar em usar C (ou C ++), no entanto, esses dois são bastante longos no dente. Eu também não uso há muito tempo. Achei que nos últimos 20 anos alguém provavelmente criou algo razoavelmente popular, agradável de codificar e compilar.

Que alternativas mais modernas existem para C para escrever código compilado de alto desempenho?

Se C ++ é um animal diferente do que era há 15 anos, eu consideraria isso, acho que tinha a suposição de que ele tinha alguns problemas inerentes.

A paralelização seria importante, mas provavelmente não entre várias máquinas.

Jeremy French
fonte
21
O C ++ moderno é radicalmente diferente de C. É muito mais comparável a algo como Java ou C # do que a C, exceto que apresenta destruição determinística em vez de coleta de lixo e também possui comportamento indefinido, pois não é executado em uma VM ou gerenciado meio Ambiente. Sua outra alternativa é D, que é uma linguagem decente, mas ainda muito imatura em termos de bibliotecas e suporte.
Charles Salvia
11
Você pode elaborar a parte "o desempenho será crítico"? Por que isso será crítico? Você já mediu alguma coisa?
precisa saber é o seguinte
3
15 anos é uma eternidade em termos de computador e, enquanto isso, pessoas como a Ericsson usam linguagens funcionais como Erlang para oferecer suporte a aplicativos distribuídos, tolerantes a falhas, em tempo real suave e sem interrupção em seus sistemas embarcados! Não presuma que apenas o C ++ pode fornecer o desempenho desejado, é melhor você jogar mais hardware no problema e economizar muito tempo de implementação com outro idioma.
Mark Booth
5
@ JeremyFrench: mas você está fazendo uma pergunta com base em suposições falsas, que desempenho => compilação estática.
vartec
4
Pelo que vale, Haskell atualmente serve como meu substituto para C ++ na maioria dos casos.
31412 Jon Purdy

Respostas:

54

Existe uma linguagem em desenvolvimento chamada The Rust Programming Language que busca objetivos semelhantes aos do C ++, notadamente abstrações de custo zero e controle fino sobre o gerenciamento de memória. Dito isto, talvez seja o candidato mais notável, apesar de ainda ser muito jovem.

Além do Rust, não existem outras alternativas populares que compilem o código nativo. Também existem Delphi e D, é claro, mas eles não são tão rápidos, populares ou usados. O idioma Go do Google pode ser um candidato, mas ainda é muito jovem e visa um domínio um pouco diferente.

No entanto, observe que C # (assumindo a plataforma Microsoft) e Java podem não ser tão lentos, mesmo que executados em cima de uma máquina virtual; a compilação just-in-time de código pode fazer algumas otimizações que os compiladores tradicionais antecipadamente não são capazes de aplicar devido à falta de informações do estado e do ambiente do programa.

Sinceramente, pessoalmente, eu não consideraria C um candidato se C ++ for uma opção, principalmente pelo fato de o C ++ moderno ser mais seguro, funcionar em um nível mais alto de abstração, ser mais expressivo e praticamente não ter perda de desempenho em relação a C (em alguns casos C ++ é notavelmente mais rápido). Simplificando, o C ++ fornece tudo o que C fornece e muito mais. A maior parte da funcionalidade C é considerada "obsoleta" e alternativas melhores, mais seguras, mais rápidas e mais intuitivas são fornecidas pela biblioteca padrão C ++.

zxcdw
fonte
5
Eu não diria que a funcionalidade C é "obsoleta", no sentido oficial - apenas que quase não há razão para usar funções da biblioteca C, ponteiros brutos ou matrizes C em C ++.
Charles Salvia
20
+1 por falar contra a suposição falsa 'compilação é necessária para desempenho'.
Telastyn 28/08/12
3
@gbjbaanb tente compilar com o Visual Studio e com o MinGW no Windows e boa sorte com isso: | tente também convencer uma pessoa que fornece uma biblioteca compilada com uma dessas ferramentas que não sabe nada sobre ABIs de que ele está errado e que ele deve fornecer a fonte dessa biblioteca ou aprender como recompilar e fornecer as especificações certas . o horror, às vezes.
user827992
5
@paxRoman: você pode escrever pequenos programas em C ++, e escrevê-los de forma mais segura do que você pode em C.
kevin Cline
3
@JBRWilkinson Até onde eu sei, a popularidade da Objective-C não existe fora da plataforma da Apple.
Zxcdw 29/08/12
19

Há também o Ada , que é compilado em código nativo e é portátil em várias plataformas, dentro dos limites de sua biblioteca padrão. O idioma está ativo e bem, com a atualização mais recente do padrão de idioma atualmente em andamento (conhecida como Ada 2012).

Resumo rápido para aqueles que não estão familiarizados com Ada:

  • Tipo fortemente
  • Suporte interno para simultaneidade
  • Orientado a objetos ou procedimental, dependendo de seus requisitos
  • Suportado pelo GNU toolchain (o GCC contém o Ada frontend)
  • Excelente também para desenvolvimento de software, ou seja, quando você precisa interagir diretamente com o hardware
  • Suporta programação genérica (pacotes, procedimentos, funções genéricos)
  • Os recursos oferecem suporte ao desenvolvimento de software em larga escala (pacotes, pacotes filho, compilação separada, distinção estrita entre especificação e implementação)
Programador
fonte
1
Sem mencionar tarefas Ada (paralelização!)
NWS
6
+1: Tentei aprender um pouco de Ada e acho que é uma linguagem muito robusta e limpa. Pena que não haja tantos empregos quanto em outras linguagens de programação.
Giorgio
3
Boa menção, eu estava procurando por algo mais 'moderno', mas havia me esquecido de Ada
Jeremy French
4
@ Jeremy French: Quais recursos você procura em um idioma mais 'moderno' que a Ada não oferece?
Giorgio
17

Se C ++ é um animal diferente do que era há 15 anos, eu consideraria isso, acho que tinha a suposição de que ele tinha alguns problemas inerentes.

Há 15 anos, não havia um padrão C ++. O segundo foi publicado no ano passado. As melhores práticas do C ++ mudaram muito nos 5 anos após a publicação do padrão 98 e estão mudando novamente com a publicação do 11.

AProgrammer
fonte
12

Por que as pessoas sempre insistem em procurar novos idiomas?

C ++:

  • É o idioma número 4 do TIOBE, mas atrapalha toda a concorrência se combinado com C
  • Tem muitas estruturas
  • É muito fácil codificar
  • É muito fácil de ajustar
  • Tem muito desempenho
  • É muito seguro
  • Tem um suporte muito bom para a indústria
  • É multiplataforma
  • Não precisa de bagunça extra de VMs / Frameworks / implantação se feito corretamente
  • Facilmente conseguirá um emprego
  • Tem todo o material necessário para construir .so / .dll para iniciar em sistemas muito antigos
  • Fácil de solucionar problemas
  • Muito expressivo
  • Muito dinâmico
  • e um monte de outras coisas interessantes

A única desvantagem do C ++ é que você precisa aprender um pouco. É isso aí.

Compare isso com outros idiomas que são um ou mais dos seguintes:

  • Estreitamente suportado (OCML, Fortran, ...)
  • Lento (Java, Javascript)
  • Experimental (Silverlight)
  • Um alvo em movimento (.NET 1/2/3/4/5? Qual é o último agora?)
  • Plataforma bloqueada (.NET)
  • Ter suporte de estrutura insuficiente (Fortran)
  • Tem comunidades pequenas (qualquer coisa fora dos 10 principais)
  • É um pesadelo para solucionar problemas (qualquer coisa com conceitos e coisas de alto nível à prova de idiotas)
  • Precisa de 500 MB de pré-instalação na máquina do cliente (JVM / .NETVM)

IMHO, quanto menos idiomas usaremos e apoiaremos, melhor será a situação.

Isso causa melhorias automáticas nas estruturas do idioma, suporte, documentação, trabalho de comitês de padronização, melhores livros, mais conhecimento, software de suporte mais fácil, melhores padrões, ciclos mais longos de suporte ao idioma e código mais qualificado escrito no idioma.

Eu sei que as pessoas vão votar contra isso, mas pense sobre isso, realmente.

Codificador
fonte
71
C ++ "é muito fácil de codificar" é ridiculamente errado, desculpe. É uma linguagem incrivelmente difícil de aprender e, mesmo que você use expressões idiomáticas modernas em C ++ e evite os ponteiros, será confrontado com vários erros intrigantes de compilador e tempo de execução antes de pegar o jeito. E mesmo depois que você a domina, a sintaxe entra no caminho com bastante frequência. O C ++ seguro geralmente usa uma confusão de modelos aninhados que geram grandes quantidades de código padrão.
Konrad Rudolph
20
Muito expressivo e muito dinâmico não soa como características típicas de C ++, comparando com linguagens dinâmicas.
vartec 29/08/2012
29
@gbjbaanb “um pouco mais difícil de aprender” é, mais uma vez, ridiculamente errado. Desculpe. Eu tenho programado todas essas linguagens há anos, claramente prefiro C ++ (e faço programação mais séria), mas dizer que é fácil é totalmente enganoso. E não estou falando de coisas sofisticadas de metaprogramação, estou falando de erros de compilador produzidos por códigos comuns, causados ​​por ocultação de nomes, ADL, constproblemas de correção e coisas assim. Qualquer pessoa que tenha lido C ++ eficaz (como o Coder afirma ter) e afirma que C ++ é fácil tem uma desconexão mental.
Konrad Rudolph
13
@gbjbaanb Sou programador em C ++. Mais uma vez, não acho que o C ++ seja fácil. E esse tópico de comentários também desaprovou o bate-papo em C ++. Então não é isso. E a diferença entre as dicas do C ++ e as das outras linguagens é que, se você não as conhece em outras linguagens, provavelmente estará bem. Em C ++, você está brindando. E mesmo se você souber sobre eles, ainda poderá obter várias páginas da tela de erros de compilação por um único erro (aconteceu comigo novamente hoje). E mesmo que o erro tenha sido simples de corrigir (um erro de digitação), leva tempo para analisar tudo isso.
31912 Konrad Rudolph
6
Quando um idioma popular já foi bom? O PHP é imensamente popular e nenhuma pessoa séria acha que é uma linguagem "boa", mesmo para seu nicho. A única coisa "boa" das linguagens populares é que existem muitas bibliotecas para facilitar a programação de determinados domínios. O C ++ em si é cheio de frustrações.
Web250
11

C / C ++ é bastante longo no dente .... isso é uma coisa boa . Isso implica que eles foram projetados suficientemente bem (ahem), que ainda são muito úteis, que muitas pessoas os usam para tarefas diárias e que você encontrará um grande corpo de desenvolvedores que são especialistas neles. Maturidade é algo a ser estimado.

Se você gasta todo o seu tempo procurando por algo novo, apenas porque é novo e, portanto, pensa que deve ser de alguma forma melhor, você ficará desapontado. Isso se aplica a linguagens de software, sistemas GUI (tome nota, Microsoft e Gnome) e amantes (tome nota, jovens :))

Agora, é certo que, se sua experiência em C ++ tiver 20 anos, quando o código C ++ geralmente foi codificado como C, talvez seja hora de reavaliar a linguagem, todos os recursos existentes no dia que nunca foram totalmente usados ​​são usados. muito mais hoje, e alguns esforços de padronização expandiram um pouco a linguagem para torná-la muito diferente dos antigos desenvolvimentos no estilo C. Não que C seja ruim também - é uma linguagem perfeita para muitos tipos de tarefas de codificação também!

gbjbaanb
fonte
16
Penso que C e C ++ exemplificam o comentário de Hoare sobre design de software: ou torná-lo tão simples que obviamente não há deficiências ou torná-lo tão complicado que não existem deficiências óbvias.
TMN
1
Como as repetidas vulnerabilidades de segurança devido a alguma forma de buffer exploram uma "coisa boa", independentemente da idade ou do entrincheiramento de um idioma? E isso é realmente diferente de argumentar a continuação de um casamento estabelecido após abuso repetido?
user2864740
@ user2864740 o que você está sugerindo é se divorciar porque a esposa é velha e você quer um modelo novo e empolgante ... Eu digo que você se apega ao que tem, porque conhece os pontos fracos e as peculiaridades. Quantas das linguagens novas e legais resolvem problemas como o estouro de buffer e acabam tendo maneiras sutis de estourar o buffer? Então, o que é melhor - o estouro que você pode evitar por não ser preguiçoso ou usar a construção correta, ou aquela em que você se encaixa porque não sabia que existia?
Gbjbaanb
@gbjbaanb Não, eu nunca disse isso. Eu estava desenhando um símile especificamente para os danos causados por não melhorar o contexto das situações. Geralmente sou bastante racional e não estou propenso a selecionar "fanboi" de tópicos ou ferramentas de tendências (essa é apenas a minha natureza). Além disso, C e C ++ são linguagens diferentes; no entanto, ambos são justificados pela mesma razão de cobertura. E esse é o problema com isso.
user2864740
8

O padrão atual do C ++ é o C ++ 11 , publicado em 2011. Portanto, não é um padrão de 20 anos. E tem havido vários padrões no meio. Cada um deles apresentando inúmeras melhorias de desempenho.

Os compiladores também estão melhorando constantemente. Eles são muito melhores em otimizar do que costumavam ser.

Formatos executáveis ​​também melhoraram, há 20 anos você tinha a.out , agora você tem ELF .

No geral, a sugestão de que o C ++ não mudou em 20 anos não pode estar mais longe da verdade.

Além disso, lembre-se de que C e C ++ são linguagens muito diferentes.

vartec
fonte
2
Minha suposição era de que algo que foi concebido pela primeira vez há 20 anos teria limitações arquitetônicas inerentes que só poderiam ser melhoradas com uma lousa em branco. Eu acho que essa suposição pode estar errada.
Jeremy French
4
@ JeremyFrench: Como a arquitetura x86?
TMN
2
@TMN é isso que prova ou refuta minha suposição?
Jeremy French
6
A arquitetura x86 original era um compromisso desagradável entre a compatibilidade com versões anteriores com o 8080 e um conjunto de recursos para competir com o 68000 e o NS32032. Memória segmentada (com ponteiros "far" e "near"), apenas 4 registradores de uso geral, codificação de instruções de comprimento variável, mais de 50 tipos de instruções JMP, um barramento de sistema tri-state multiplexado ... E ainda hoje, hoje, o mesmo o design básico está mais forte do que nunca, depois que muitos designs "superiores" de ardósia limpa (Alpha, MIPS, PowerPC) falharam em substituí-lo.
TMN
1
@ JeremyFrench não, sua suposição não estava errada, pelo menos no caso de C ++. Os recursos do C ++ 11 são definitivamente úteis; no entanto, neste momento, eles são apenas mais lixo na pilha de lixo. Eles tentam criar recursos de linguagens modernas, mas para lidar com a bagunça C ++ existente, eles devem ter exceções, e essas exceções terão exceções e assim por diante.
precisa saber é o seguinte
6

Não sou um grande especialista nessa linguagem, mas acho que o OCaml pode ser uma opção interessante de se olhar.

OCaml é uma linguagem compilada, funcional / orientada a objetos. Para uma comparação de desempenho com C ++, consulte C ++ vs OCaml: comparação de rastreador de Ray . Obviamente, este é um exemplo muito específico e deve-se fazer testes mais extensos para ter uma melhor noção do desempenho do OCaml.

Giorgio
fonte
O downvoter pode dar uma dica de como essa resposta pode ser melhorada? Obrigado.
Giorgio
3

Depende do que o seu produto fará. Se o desempenho for realmente crítico, o idioma preferido ainda será o FORTRAN . Eu também não descartaria o Java - ele é usado em muitos aplicativos de negociação financeira de alto volume. Erlang vale a pena dar uma olhada se o domínio do problema exigir alta simultaneidade. O Objective-C é bom, embora eu não saiba o quão bem ele é suportado fora do ecossistema da Apple (além de compiladores e tempo de execução básico). Também ouvi coisas boas sobre o desempenho de Haskell, mas não tenho certeza se isso é desempenho absoluto ou apenas desempenho em relação a outras linguagens funcionais.

TMN
fonte
2
todo trabalho financeiro que eu analisei quer desenvolvedores de C / C ++, não Java. Por experiência em Java, não consigo ver nenhum que tenha alto desempenho, a menos que você instale grandes quantidades de hardware nele.
Gbjbaanb
Existem muitos sistemas de negociação Java em operação em Wall Street e em vários bancos de investimento nos EUA e no Reino Unido. Também é muito usado na Bolsa Mercantil de Chicago.
TMN
3

Quando você diz que seu projeto é sensível ao desempenho, você quer dizer todas as linhas de código dele? Ou, como normal, há uma porcentagem menor que é crítica para o desempenho, enquanto o restante é a execução normal do código comercial da fábrica?

Depois de responder, qual é o maior risco para o seu projeto: que o resultado final seja muito lento ou que você nunca o termine em primeiro lugar?

Supondo que você responda a segunda para ambos, você deve desenvolver uma linguagem de nível superior que ofereça suporte à interoperabilidade nativa (Python, Ruby, a família .Net todos têm isso). Primeiro, termine o projeto. Em seguida, perfile, otimize, enxágue, repita. Somente depois disso, considere recriar o segmento de escolha do seu aplicativo no código nativo e integrar esse código nativo ao produto final.

Chris Pitman
fonte
Uma vez que é Java, você não pode salvá-lo se for muito lento.
Coder
6
O @Coder Java possui um FFI (JNI) que permite 'causar estragos' no idioma de sua escolha. Portanto, se você projetou bem as interfaces, basta substituir uma implementação Java por uma implementação nativa. A plataforma Java é bem pensada.
precisa saber é o seguinte
1

O Vala é semelhante ao Java e C #, compila ao código nativo (ou código-fonte C, se você preferir) e é muito rápido . Ele requer GLib para seus bits orientados a objetos e é escrito por hackers Linux para hackers Linux; portanto, se seu domínio for Windows, pode não ser muito bom.

Restabelecer Monica
fonte
1

Objective-C é uma alternativa moderna e compilada para C e C ++ diretos. Ele possui gerenciamento de memória coletado e determinístico de lixo e o tempo de execução do OO que passa a mensagem foi otimizado para desempenho.

Está disponível no GCC e no CLang e existem bibliotecas de aplicativos, como GNUStep e Cocotron, que funcionam em várias plataformas.

Se você estiver realizando um trabalho de alto desempenho, presumirei que seja um tipo de trituração de números ou outro trabalho de divisão e conquista em vez da interface do usuário, o que significa que você poderia fazer a interface do usuário no idioma que for mais fácil para você, por exemplo, HTML através de um mini servidor http.

JBRWilkinson
fonte
0

Eu nunca usei, mas um amigo dos meus jura por Cython, que permite que você use primitivas do estilo C em partes críticas do desempenho, mantendo a sintaxe geral do python e aproveitando ao máximo as construções de alto nível dos pythons para reduzir o desenvolvimento tempo em qualquer outro lugar.

Dan Neely
fonte