Por que o C ++ ainda é preferido para criar aplicativos pesados ​​da interface gráfica do usuário sobre as mais recentes linguagens dinâmicas? [fechadas]


46

Vejo que a maioria dos aplicativos que incluem conteúdo pesado da GUI geralmente é desenvolvida em C ++. A maioria dos jogos / navegadores é codificada em C ++.

Não podemos simplesmente desenvolver aplicativos GUI melhores com os idiomas dinâmicos mais recentes? Eu sei que java não seria uma ótima escolha. Mas e linguagens como python, nativamente construídas em C? Os idiomas mais recentes não deveriam ser melhores que seus ancestrais? Por que ainda precisamos preferir o C ++ antigo aos idiomas mais recentes?

E também gostaria de saber, o que é responsável em C ++ pela melhor velocidade de processamento da GUI? Por outro lado, o que falta nos outros idiomas mais recentes?


22
Se você acha que Java é uma linguagem 'dinâmica', fica profundamente confuso sobre o que essa palavra significa neste contexto.
Mike Baranczak

15
@ Mike Baranczak: Essa é uma longa história. Basicamente, havia um projeto de pesquisa primeiro em Stanford, depois na Sun Research, chamado Self. Self é uma linguagem de programação da família Smalltalk que é mais simples, mais poderosa, mais expressiva e, mais importante, significativamente mais dinâmica que o Smalltalk. Por ter sido projetado como uma linguagem de programação para desenvolver sistemas inteiros (como todos os dialetos do Smalltalk), incluindo (mas não se limitando a) aplicativos de desktop, servidores, sistemas operacionais, drivers de dispositivos, ele próprio teve que ser incrivelmente rápido. Assim, a equipe de Auto inventou um monte de novo ...
Jörg W Mittag

15
... técnicas de otimização, e quando a Self VM foi lançada em 1987 (e mais ainda na segunda geração em 1992), ela foi rápida. Era mais rápido que qualquer outra VM Smalltalk. O sistema Self era fornecido com muitos códigos de exemplo, e um desses exemplos era um intérprete do Smalltalk escrito em Self, e até isso era mais rápido do que qualquer outra VM do Smalltalk. O self era mais rápido do que muitas implementações de C ++ na época e até competitivo com o C. Bem, você entendeu. Foi rápido . No entanto, a Sun decidiu que eles não têm uma necessidade de uma linguagem de programação orientada a objeto ou uma VM rápido, então eles ...
Jörg W Mittag

15
... basicamente morreu de fome o projeto Self secando o financiamento. Quando os engenheiros da Self VM deixaram a Sun por frustração, eles foram rapidamente contratados por uma startup do Smalltalk chamada LongView (mais conhecida pelo nome de seu produto, um sistema de tipo estático opcional para Smalltalk: StrongTalk). O LongView sabia que nunca seria capaz de vender a digitação estática para o Smalltalk, então eles pensaram que prefeririam vender o Smalltalk mais rápido do planeta e incluir o StrongTalk no pacote em uma espécie de jogo do tipo Trojan Horse. Eles também perceberam que nenhum dos cool ...
Jörg W Mittag

15
... otimizações Self VM fez foram de alguma forma especial para si mesmo, mas eram aplicáveis a praticamente qualquer linguagem orientada a objetos (ou mesmo apenas qualquer linguagem em tudo ). Portanto, os engenheiros da Self VM começaram a trabalhar em uma VM Smalltalk chamada VM Animorphic. Novamente, a VM animórfica foi incrivelmente rápida (e ainda é, na verdade, mesmo que a base de código não tenha sido tocada em 15 anos ou mais, ela ainda pode competir com Smalltalks, JVMs e .NET modernos e de alto desempenho, especialmente se você usar em conta que ele usa muito menos recursos do que aqueles, desde que foi projetado para 486s com 20 meg ...
Jörg W Mittag

Respostas:


58

Eu sou uma daquelas pessoas que escrevem aplicativos C ++ GUI (principalmente para Windows). Com o Qt, para ser mais preciso. Minhas razões:

  • Eu gosto de C ++. Sou freelancer e geralmente posso escolher minhas ferramentas (sorte minha!)
  • Em um ambiente gerenciado, você pode ter dificuldade em usar algum código não gerenciado (declarações longas da WinAPI em C #, alguém?)
  • Menos dependências implantadas com mais facilidade
  • Mais controle sobre tudo.
  • RAII (vs. GC). E mesmo se eu alocar com new, raramente faço deletealgo explicitamente, porque uso ponteiros inteligentes ou QObjecthierarquia.
  • Atualmente, o C ++ é muito empolgante; mal posso esperar por um compilador para dar suporte total ao novo padrão.
  • Velocidade (apenas no final da lista. Sei que não é tão importante para a GUI em si, mas tende a ser mais rápida porque os programas C ++ não sofrem com a sobrecarga que os tempos de execução, compilação de JIT por código de byte e tecnologias semelhantes adicionam a o programa.)

Como você pode ver, essas são principalmente preferências pessoais. Acho importante que meu trabalho seja agradável e o C ++ fornece isso para mim.


11
A velocidade +1 é definitivamente a principal razão aqui, além da preferência pessoal. No entanto, eu gosto de "C ++ é muito emocionante nos dias de hoje". Para responder às perguntas , não @ Tamás Szelei: Certamente, a computação muda rapidamente com novas idéias, paradigmas, tecnologias, produtos, mas as melhores e mais recentes não são uma virtude. O C ++ já existe há algum tempo e não significa que está desatualizado, mas possui um histórico comprovado há muito tempo em comparação com as tecnologias mais recentes. O texto original do Stroustrup (o livro do inventor) é pesado, mas existem alguns bons livros por aí - verifique oreilly.com por exemplo.
Therobyouknow

1
@Tarnas Eu acho que "sempre será mais rápido" é um pouco narrowminded / authorative, mas não o suficiente para justificar uma downvote ...
Max

2
Como suporte anedótico: participei de diferentes projetos para criar GUIs de tamanho significativo no Windows usando C ++ e JavaScript. Também estive envolvido em diferentes projetos de console de jogos em C ++ e JavaScript. Nos dois casos, houve significativamente mais problemas de velocidade e memória com o JavaScript.
Gort the Robot,

2
Tarde para a festa, mas você pode elaborar as "dependências menos / facilmente implantáveis"?
weberc2

2
Uso C ++ há mais de 20 anos. Muitos recursos novos e ótimos são adicionados desde 11, 14 e 17. Você quase pode usar o C ++ como uma linguagem de script e ainda obter o benefício da velocidade rápida. Quando trabalho com dados GRANDES, quase preciso usar C ++ porque qualquer outro idioma será 10-1000 mais lento.
Kemin Zhou

32

Porque a velocidade é importante.

  • Os jogos usam C ++ para tarefas principais, onde o desempenho é importante. Eles usam linguagens dinâmicas para tarefas de script em que a flexibilidade é importante.

  • Aplicativos da GUI da área de trabalho : o Visual Studio, por exemplo, é escrito em .NET e não em C ++ nativo. Parece funcionar muito bem para um IDE, pois o próprio IDE não precisa executar muitas tarefas intensas de desempenho. (O compilador, o vinculador e outras ferramentas não são necessariamente escritos no .NET - embora, como apontamos em um comentário, alguns pareçam estar (por exemplo, VB.NET))

  • Os navegadores também precisam ser rápidos. Afinal, eles são uma espécie de sistema operacional secundário. Por outro lado, você pode argumentar que grandes partes do Firefox são realmente "escritas em" javascript, pois a estrutura Mozilla parece depender muito do javascript.

Resumindo: eu não diria que C ++ é necessariamente preferido, mas se você tiver um gargalo de desempenho, precisará se aproximar do metal e conhecer C ++ (bom ou C). Às vezes, será mais fácil fazer tudo em C ++ - uma linguagem.


1
+1 Melhor resposta: tem a ver apenas com a velocidade como o principal motivo para o uso do C ++. Até a própria Microsoft admite que o C ++ é melhor para desempenho em comparação com c # e visual basic - veja-o nas páginas do Visual Studio. Um segundo muito próximo é a portabilidade - se você usar bibliotecas de plataforma cruzada, como o Qt. Melhor resposta também porque é objetivo e não subjetivo.
Therobyouknow

2
Seu segundo ponto não é inteiramente verdade. O compilador VB.NET é gravado no VB.NET e o compilador F # é escrito em F #. O compilador C # não é, mas pelo que foi lançado sobre o projeto Roslyn, acho que o compilador C # está sendo reescrito em C #.
Wesley Wiser

5
O visual studio gui (o chrome) é gravado (do vs2010) em c # e WPF. O gerenciador de soluções, o sistema de compilação, o navegador de códigos e a caixa de ferramentas são escritos em c # / c ++ com winforms. O compilador é escrito em c ++.
Martin Beckett

Para a maioria dos aplicativos de desktop, apenas os mecanismos de renderização e layout (por exemplo, o View) precisam ser rápidos. De qualquer maneira, o Modelo não costuma gastar muito tempo, e o Controlador passa a maior parte do tempo apenas esperando que o usuário faça alguma coisa (e poucos usuários podem clicar 10 vezes por segundo com alguma confiabilidade).
Donal Fellows

@ MartinBa: Eu observaria que o compilador atual para C # e VB (Roslyn) está escrito em C #.
jmoreno

17

Os aplicativos da GUI que você vê escritos em C ++ geralmente são feitos por motivos herdados. O Python (com Qt ou Gtk) é muito viável para aplicativos da GUI, assim como o C # se você trabalha em uma casa Windows. Ao iniciar algo novo, ou é muito muito preferido para C ++ por causa da falta de trabalho de canalização que tem de ser feito.


5
O código existente com +1 é importante. É raro para começar completamente do zero no desenvolvimento de novos programas

7
como o Python com Qt é mais preferível ao C ++ com Qt? Se eu fosse iniciar um novo projeto hoje, ainda usaria C ++ para a GUI. Porque: a) É o que eu sei, b) faz bem o trabalho. Só porque o C ++ já existe há algum tempo não o torna "desatualizado".
TZHX

2
@TZHX: "É o que eu sei" é um argumento viável. Se isso não for dado, não ter mais que cuidar do gerenciamento de memória é um enorme aumento de desempenho e pode compensar o esforço de aprender Python, mesmo para um único projeto. Outro motivo para usar o Python seria a plataforma cruzada - com o C ++, você deve ter cuidado e tomar medidas especiais, enquanto o python provavelmente funcionará.
Tdammers

4
Não vejo nenhuma vantagem em usar o PyQt em vez do Qt com C ++ para alguém que conhece C ++.
BenjaminB

13
É provável que o C ++ funcione também. Com o Python, você precisa se preocupar com qual versão do python o usuário instalou ou com o empacotamento. Realmente não há muito trabalho a ser feito "cuidando da memória", a menos que você cometa erros estúpidos. Eu acho que muitas pessoas dão "gerenciamento de memória" como um grande obstáculo para trabalhar com C ++ sem realmente saber quanta diferença isso faz.
TZHX

16

Como não importa quantos testes de desempenho o .NET e as multidões mostrem, não importa o quão próximos eles cheguem nos benchmarks, no final, o aplicativo C ++ é o melhor. É mais rápido na inicialização a frio, é mais rápido e tem mais maneiras de melhorar.

Ouvi inúmeras provas, nas fases iniciais do projeto, de que o .NET é o caminho a percorrer, mas, uma vez escolhido, eles sempre acabam sendo um grande problema.

Além disso, hoje em dia o C ++ é bastante seguro e fácil de usar, especialmente com estruturas como Qt ou WTL.


2
+1: "Além disso, hoje em dia o C ++ é bastante seguro e fácil de usar, especialmente com estruturas como o Qt ..." Concordo totalmente: acho que uma grande força não é (apenas) o C ++ em si, mas o fato de que (1) ) é compilado em código nativo, (2) possui um conjunto razoável de recursos (OOP, modelos), (3) possui estruturas muito boas como o Qt. Isso compensa o fato de a linguagem ser bastante grande e difícil de aprender: depois de dominar um subconjunto decente da linguagem e algumas boas bibliotecas, você pode ser realmente produtivo com ela.
Giorgio

10

A maioria dos mecanismos de jogos é codificada em C ++. Muitos mecanismos de navegador também são codificados em C ++. Mas a GUI do navegador geralmente é codificada usando algum script leve (JavaScript, Python). Com exceção notável do Source Engine, a maioria dos mecanismos de jogos também usa linguagens de script (como Lua ou Python). [para referência: lista de jogos com script Lua ]

Também pegue a popular biblioteca C ++ GUI como o Qt. Na versão atual (4.7), ele usa QML para a GUI. QML é basicamente JavaScript com ligações Qt.

Então, realmente não há C ++ vs linguagens dinâmicas, é misto.


[Citação necessária]. Eu sei que muitos jogos usam linguagens de script para permitir que os usuários os estendam, mas até onde eu sei não existem muitos jogos usando linguagens de script para a funcionalidade binária de lançamento.
ProdigySim

1
@ProdigySim: Eu sei de vários que fazem. No topo da minha cabeça, World of Warcraft (Lua + XML), a série Uncharted da Naughty Dog (Lisp), a série Unreal (UnrealScript), jogos baseados nos motores de torque e unidade, Dungeon Siege, NeverWinter Nights e muitos outros. Os jogos controlados por dados estão se tornando a norma, onde o host de scripts assume a maioria dos recursos da interface do usuário (se não todos) e o estado do jogo de cima para baixo.
Greyfade 31/05

@ProdigySim: mesmo que oculto aos usuários normais, não significa que internamente eles não usem mecanismos de script. Basicamente, os desenvolvedores de jogos têm duas opções - criar sua própria linguagem de script para modelos ou usar uma das de uso geral. Lua é especialmente bom para jogos, pois geralmente é bom para sistemas em tempo real.
Vartec 31/05

O mecanismo de origem usa a linguagem de script Squirrel.
precisa saber é o seguinte

6

A primeira razão será: (antigo) hábito

Segundo motivo: menos confiabilidade em máquinas virtuais, intérpretes que precisam ser instalados etc.

E ainda existem excelentes IDEs para desenvolver código em C ++.


1
' ainda excelentes IDEs'. Eu diria que o Visual Studio e o Eclipse são de ponta e já existem há muito tempo.
JBRWilkinson

@JBRWilkinson: Eu não disse que outro idioma também não os tem.
Roalt 28/06

6

O motivo é que você tem muito mais controle sobre tudo o que acontece. Se você fosse escrever photoshop em C #, teria sérios problemas de desempenho para algumas tarefas. Em um idioma de nível inferior e com mais controle, você pode usar atalhos, otimizar onde necessário para coisas mais intensas. Obviamente, isso pressupõe que você esteja usando C ++ em código não gerenciado, não C ++ em .NET.

Veja aqui um exemplo rápido.


2
O Adobe Lightroom, que é basicamente um subconjunto do Photoshop, é escrito em Lua.
Jörg W Mittag

4
@ Jörg: e o resto é C ++. na verdade, essa é provavelmente a melhor combinação disponível, C ++ para a fundação e Lua para o resto (embora eu ainda prefira C sobre C ++ para coisas de baixo nível).
Javier

2
@Javier: Sim, o Lightroom é basicamente os algoritmos de manipulação de imagem do Photoshop (que provavelmente são escritos principalmente na montagem MMX / SSE) e SQLite3 (que é escrito no ANSI C pré-histórico para portabilidade) colados com Lua. A Adobe também desenvolveu seu próprio IDE Lua, completamente em Lua. Alguém sabe que kit de ferramentas gráficas eles usam? O AFAIR Photoshop antecede praticamente todos os kits de ferramentas modernos, então provavelmente é algo caseiro.
Jörg W Mittag

4
Sem ofensa, mas se você pensar ANSI C é pré-histórico, você foi lendo as amostras de código errado
Javier

6

C ++ é digitado estaticamente. Isso permite otimizar a execução do código antecipadamente, solicitando que um compilador ajuste suas abstrações ao processo do sistema disponível em uma determinada plataforma. Até agora, as linguagens dinâmicas precisam de uma camada de software adicional (= o intérprete), que diminui o acesso aos recursos do sistema.


4

A maioria dos motivos apresentados são técnicos ou "acima da tabela" ... aqui estão os motivos comerciais ou "abaixo da tabela":

distribuir código compilado vs distribuir código fonte. ao desenvolver em c / c ++, você distribui os binários. se você estiver desenvolvendo em um dos idiomas modernos, você distribui a fonte. é difícil vender a idéia de ofuscadores para a gerência que precisa responder aos acionistas / investidores para não se incomodar.

usuários estúpidos: pelo menos nas mentes da gerência. eles ainda percebem que seus usuários mal conseguem clicar duas vezes em um "setup.exe". Se você incluir a instalação de um intérprete como parte da configuração, eles sacudirão a cabeça de um lado para o outro.

desenvolvedores antigos: a maioria das pessoas com experiência existe há muito tempo e não se mantém atualizada. eles programam em C ++ e não nas linguagens mais recentes, porque não conhecem as linguagens mais recentes.


Eu diria que você está perturbando o código-fonte ao liberar um aplicativo .NET. Observe o Visual Studio que grande parte da interface foi projetada com formulários WPF. É claro que alguns de seus pontos de vista são válidos, grande parte do gerenciamento de hoje foram os desenvolvedores de ontem, as más notícias de que é improvável que muitas das estruturas de hoje sejam válidas por causa das alterações nos computadores atuais.
Ramhound 31/05

Muitas pessoas com muita experiência ganharam sua experiência mantendo-se atualizadas. Eles tendem a não aprender novas línguas quentes (como Pascal no início dos anos 80) apenas porque são gostosas, mas apenas se tiverem algum uso ou tiverem idéias interessantes (Haskell, por exemplo).
David Thornley

4

Eu estenderia o escopo do problema da GUI para o software que se espera ser competitivo. O C ++ não impõe nenhum imposto na plataforma de destino, pois diz respeito ao poder de processamento, tempo de execução instalado, estruturas etc. Portanto, ele funcionará em hardware de cliente mais limitado do que em uma solução semelhante escrita em uma linguagem gerenciada / interpretada. No caso de um software comercial bem-sucedido, o custo de desenvolvimento (potencialmente mais alto no caso de C ++) é amortizado pelo número de vendas.

Além disso, o C ++ geralmente oferece acesso direto às APIs do sistema (como a GUI), o que oferece a melhor oportunidade de otimizar a utilização e diferenciar-se de soluções semelhantes.


3

Eu acho que muito disso tem a ver com as APIs para kits de ferramentas da GUI. Todos eles têm uma API C / C ++, mas nem todos possuem (digamos) ligações Python. E, às vezes, os kits de ferramentas foram escritos com o C ++ em mente, portanto, mesmo que eles tenham suporte para outras linguagens, eles não os suportam totalmente (por exemplo, eles não suportam um Python tuplecomo argumento).


Ah, eles não os apoiam totalmente, porque não querem, ou não têm tempo para implementá-lo. Não porque isso é impossível.
precisa saber é o seguinte

2

Você está mencionando navegadores e jogos como exemplos. Ambos são aplicativos bastante críticos para o desempenho; portanto, tê-los em um idioma de baixo nível para velocidade faz sentido.

Muitos outros aplicativos são menos limitados ao desempenho e podem ser facilmente escritos em outros idiomas. C # em particular parece ser muito usado. (E Obj-C, mas realmente não se qualifica como de alto nível, eu acho. Melhor que C ++.)

No entanto, há uma certa falta de estruturas para as linguagens de programação mais recentes. Por exemplo, realmente não existe uma biblioteca GUI nativa viável para Python. Claro, você pode usar PyQt ou PyGtk e eles funcionam bem, mas no final, isso só faz interface com o código C novamente. Novamente, o C # (e possivelmente o Obj-C) parece ser a exceção e, talvez, o MacRuby ou o IronPython possam mudar esse jogo.


0

Para que uma linguagem substitua C ++ ou Java, ela precisa fazer o que há muita falta nessas linguagens, além de executá-las com seus próprios pontos fortes. Além disso, grandes investimentos foram direcionados para esses idiomas. Isso significa que há uma biblioteca C ++ padrão em muitas plataformas, que navegadores, jogos e programas podem usar facilmente. Portanto, é provável que haja alguma inércia. Os idiomas tendem a decolar lentamente, ao contrário de outros softwares.

Se você observar, o Anaconda (programa de instalação do RedHat) existe há 10 anos, escrito em Python desde o início. Python não era tão popular quando o Anaconda era novo.

O Go do Google (golang.org) está evoluindo muito rápido. O compilador ainda está para ser inicializado. Para sua popularidade decolar, sua biblioteca precisa se estabilizar, o compilador deve ser inicializado e mais pessoas precisam usá-lo. Ouvi dizer que um programa de produção fora do Google está escrito em Go e é relatado que ainda não houve um tempo de inatividade em pouco mais de um ano.


1
Na verdade, há um compilador Go comercial para Windows que é escrito em Go, então não é um compilador bootstrapped para Go. (É ainda em beta fechado, no entanto.)
Jörg W Mittag

Oh, eu estava sem contato, então. Obrigado por dizer :)
vpit3833

2
Chama-se erGo e é produzido por uma empresa chamada Newquist Solutions .
Jörg W Mittag
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.