Existe uma linguagem entre C e C ++?

18

Gosto muito da natureza simples e transparente de C: quando escrevo código C, sinto-me livre de "abstrações com vazamentos" e quase sempre consigo adivinhar com perspicácia a montagem que estou produzindo. Também gosto da sintaxe simples e familiar para C.

No entanto, o C não possui esses doodads simples e úteis que o C ++ oferece como classes, manipulação simplificada sem cstring etc. Eu sei que é possível implementar em C usando tabelas de salto e afins, mas às vezes é um pouco prolixo , e não muito seguro para o tipo por vários motivos.

Eu não sou fã da ênfase exagerada em objetos em C ++, e sou tímido quanto ao operador 'novo' e similares. O C ++ parece ter muitos problemas para, por exemplo, ser usado como uma linguagem de programação do sistema.

Existe uma linguagem entre C e C ++ na escala de widgets e doodads?

Isenção de responsabilidade: quero dizer isso como uma questão puramente factual. Não pretendo irritá-lo porque não compartilho sua opinião de que C {, ++} é bom o suficiente para fazer o que planejo.

Robert Martin
fonte
10
Você diz que sua pergunta é "puramente factual", mas está descontando o c ++ porque "parece" ter muitos soluços. O que são esses soluços e são razões válidas para descontar o c ++?
Whatsisname
2
Qual é a 'escala de widgets e doodads'? Se você deseja respostas reais para uma pergunta "puramente factual", evite métricas sem sentido.
Caleb
2
E as poucas coisas que você afirma sobre C ++ revelam algumas informações erradas. newé principalmente um reforço mallocque também pode cuidar de inicializar a memória para você. Com "posicionamento novo" e operator new, você pode decidir como e onde ele aloca memória. E quanto à ênfase do objeto: algumas linhas acima indicam que você considera as classes um "doodad simples e útil". Se decidir!
25
Use C+ Disclaimer: Desculpe, eu não poderia t resist. It01 de abril s;)
Knut
2
Isso soa muito como a hipótese do continuum e provavelmente com a mesma resposta. ( en.wikipedia.org/wiki/Continuum_hypothesis )
John Smith

Respostas:

29

Estes podem ser os dróides que você está procurando ...

Go - http://golang.org/

D - http://dlang.org/

Rust - http://rust-lang.org/

Jacks_Gulch
fonte
5
@dtech: D tem que GC inútil / "Tudo herda de objeto" / Valores devem ser péssimos. Eu já tenho C # para isso e ele realmente tem ferramentas decentes. Admito que minha lembrança de por que o descartei é um pouco nebulosa, mas, pelo que me lembro, ele cortou vários recursos muito úteis.
DeadMG
4
-1 para "o que C ++ deveria ter sido". C ++ é o que é e se você não pode lidar com isso, esse é em grande parte o seu problema. Você pode lidar com isso usando uma linguagem que melhor lhe convier, mas isso não significa que o C ++ devesse ter sido assim.
abr2
7
@DeadMG Em D, você fez duas declarações significativas: GC é obrigatório e tudo tem que ser um objeto. Ambos estão errados. Isso me levou a pensar que sua conclusão é mais baseada na ignorância do que no conhecimento real. Eu tenho que concordar com o CodexArcanum.
Deadalnix
5
@deadalnix: Tecnicamente, você pode optar por não usar o GC. Mas como você não tem como saber ou controlar quais funções da biblioteca ou recursos de linguagem usam o GC, não há realmente nenhuma maneira de produzir um programa que não o utilize. E você não pode criar uma classe que não herda de Object. E os structs deles são seriamente comparados aos valores do C ++ - sem herança, sem referências de valor, por exemplo, portanto, é impossível produzir algo tão simples quanto uma classe de cadeia de valor em D que seja tão eficiente quanto equivalente ao C ++. Esses são fatos sobre a linguagem D.
DeadMG 01/04/12
5
@DeadMG: Criar estruturas sem herança é um recurso , não um "gimping". É algo que eles acertaram, algo que praticamente toda linguagem OO da história, não chamada "C ++", acertou (incluindo Simula, a linguagem OO original) e que o C ++ ficou incrivelmente errado. Os tipos de herança e valor não se misturam. Quebra a identidade do objeto, quebra a Substituição de Liskov, quebra todo o paradigma OO.
Mason Wheeler
19

Existem várias linguagens (por exemplo, Java, Go, D, Objective-C) que são aproximadamente paralelas ao C ++, ou tentativas de corrigir problemas que os autores viram no C ++.

Pelo menos a IMO, no entanto, todos eles funcionam substancialmente inferiores ao C ++ para fins mais práticos.

Infelizmente, com base no seu gosto aparente por saber qual código de montagem será produzido, provavelmente podemos descartar o Objective C e Java imediatamente.

Teoricamente, eu consideraria o Go o mais interessante deles - ele tem algumas idéias verdadeiramente originais e abordagens interessantes para resolver problemas que tornam alguns tipos de código muito mais fáceis. Infelizmente, os compiladores atuais não produzem um código muito bom e não houve muitas melhorias nesse sentido nos últimos anos.

Isso praticamente deixa D como o único que tem uma chance. É provavelmente o mais semelhante ao C ++ (desses), mas também o menos provável (IMO) para corrigir o que você vê como problemas.

Isso deixa uma abordagem óbvia: use C ++, mas use apenas as partes desejadas e evite as que você não gosta.

Jerry Coffin
fonte
13
+1 em "use C ++ e evite as partes que você não gosta". E eu sugeriria ao OP que aprendesse mais sobre C ++, as pessoas geralmente recusam as coisas apenas porque não as conhecem bem o suficiente.
Doc Brown
1
@DocBrown Talvez seja porque não é tão fácil conhecer C ++ o suficiente.
Malcolm
3
@ Malcolm: é claro que é difícil aprender C ++ moderno em profundidade. Mas, por outro lado, não há absolutamente nenhuma razão para ser "tímido com o novo operador", isso me parece supersticioso.
Doc Brown
3
@ Malcolm: Provavelmente porque o conceito é muito simples . Preciso de um literal de string UTF-32 ou de um literal UTF-16? Bem, essa é uma pergunta muito fácil de responder, supondo que você saiba o básico das codificações de string wtf. E aquelas inúmeras características difíceis? Eles existem por uma razão . Por exemplo, os genéricos de Java. Eles são patéticos em comparação com os modelos. Claro, há menos a aprender, mas isso é simplesmente porque eles não são muito úteis. É como chamar algo mais complexo do que Brainfuck de difícil.
DeadMG
3
@ Malcolm: Isso não é verdade. A popularidade é influenciada por 99999 itens, independentemente de o idioma ser bom ou útil.
DeadMG
16

No entanto, o C não possui esses doodads simples e úteis que o C ++ oferece como classes, manipulação simplificada sem cstring etc. Eu sei que é possível implementar em C usando tabelas de salto e afins, mas às vezes é um pouco prolixo , e não muito seguro para o tipo por vários motivos.

Eu não sou fã da ênfase exagerada em objetos em C ++, e sou tímido quanto ao operador 'novo' e similares.

Desculpe, amigo, alarme de contradição. O manuseio não-cstring requer new . É uma necessidade fundamental. Você não pode ter std::stringsem new. Além disso, new/ deleteé exatamente equivalente a malloc/ freemas mais seguro , porque garante a correta construção e destruição de objetos de heap (totalmente necessário!) E usa manipulação de exceção em vez de um NULLretorno e, portanto, é superior em todas as formas imagináveis. No C ++ 11, é muito possível escrever sua própria newfunção de estilo, porque o encaminhamento perfeito permite lidar com qualquer construtor de qualquer tipo. Se você é tímido new, sugiro que você simplesmente não saiba com o que está lidando.

Ah, sim, e indicadores inteligentes fazem com que você nunca tenha que lidar com nada disso.

Além disso, em C ++ não há ênfase excessiva. Você não precisa usar nenhum objeto que não queira. Você pode programar funcionalmente com lambdas e outros a qualquer momento. Ninguém está forçando você a usar herança e funções virtuais - na verdade, muitos bons programas C ++ raramente exibem herança. Modelos são a técnica de abstração mais poderosa e útil. Isto não é Java.

DeadMG
fonte
1
Concordo. É muito melhor usar C ++ da maneira que você quer do que para procurar uma alternativa (provavelmente inferior)
DTECH
1
Eu não acho que lambdas sejam suficientes para programar funcionalmente. Eu também esperaria ter um operador de composição de funções, currying e assim por diante. Consulte também stackoverflow.com/questions/1981400/functional-programming-in-c . Para mim parece quase como fazer OOP em C ...
Giorgio
@Giorgio: As respostas dessa pergunta dizem apenas "É difícil!". Eles não mostram nenhuma evidência de que é realmente difícil . Por que você deseja um operador separado para a composição da função? f(g(x))parece funcionar muito bem para mim. E também acredito que o curry pode ser feito como uma biblioteca genericamente em C ++ 11.
DeadMG
1
@DeadMG: Um operador de composição de funções é um conceito básico bastante bem estabelecido em programação funcional. Eu esperaria encontrá-lo em um idioma que suporte FP. Acho muito conveniente (conciso) definir uma função complexa como composição de outras funções (por exemplo, como você faz com pipes no Unix) sem usar variáveis: k = h. g. f
Giorgio
1
@Giorgio: std::bindsuporta essas coisas.
DeadMG
4

C é quase um subconjunto de C ++, então você pode simplesmente usar as partes de C ++ que você gosta e desconsiderar o resto. É até possível escrever C válido que também é C ++ válido.

Você não escreverá C ++ idiomático, mas é o mais intermediário possível.

Como alternativa, você pode verificar outros idiomas que tentam estender C para algo mais poderoso, principalmente D e Objective-C.

E, finalmente, dependendo da natureza do projeto, você pode optar por uma abordagem poliglota: divida seu projeto em módulos e escolha o idioma mais adequado para cada parte. A desvantagem disso é que você precisa que os idiomas funcionem juntos, o que pode ser muito trabalho para valer a pena.

tdammers
fonte
De fato, trabalhar em setores como o desenvolvimento de jogos para console, onde realmente queríamos "uma linguagem entre C e C ++", foi exatamente o que fizemos. Usamos um subconjunto da funcionalidade C ++, com certas coisas fora dos limites, ou mais provavelmente fora dos limites dentro de loops críticos para o desempenho.
precisa saber é o seguinte
3

Apenas para oferecer uma resposta rápida e imediata: se o idioma que você deseja não existe, por que não fazer um você mesmo? Há uma variedade de ferramentas poderosas de desenvolvimento de linguagem por aí, desde os antigos stand-bys de (F) Lex e Yacc / Bison. Como você já conhece C, você só precisa do seu "compilador" para gerar o código C, para o qual você usa sua cadeia de ferramentas existente.

Isso pode ser mais simples e mais poderoso do que você pensa. Comece com um analisador / lexer para C e adicione os recursos extras que você considera importantes. Se as tabelas de salto são irritantes para escrever à mão, descubra uma construção para expressar o resumo e deixe que seu intérprete as escreva para você. Essencialmente, este é apenas um nível mais alto de metaprogramação pré-processador, usando ferramentas externas para fazer a metaprogramação. Você sempre saberá exatamente como será a montagem final, já que conhece o C e sabe em que C suas extensões de idioma serão expandidas.

Obviamente, existem algumas limitações de quão eficaz isso pode ser sem muito trabalho extra. Adicionar um sistema de tipo estático completo pode ser um pouco mais complexo do que você deseja, mas é uma opção que você pode explorar se achar que gosta. Suas extensões DSL são tão poderosas e complexas quanto você tem tempo e energia para produzi-las e, quem sabe, um dia sua linguagem de extensões se tornará "o próximo C ++".

CodexArcanum
fonte
2

Você não disse quais recursos do C ++ são irritantes para você. de qualquer maneira, você pode tentar o Objective-C. Ele enfatiza a Orientação a Objetos, em vez da Biblioteca Padrão em C ++.

nada
fonte
2
imho Objective-C é uma tentativa escassa de introduzir classes em C e inferior de várias maneiras ao C ++. Além disso, é muito pouco usado fora do Mac OS X / iOS.
DTECH
1
@dtech: Interessante, um ex-colega meu que não é fã de Mac (e sim um cara do Debian / Linux) estava convencido de que o Objective-C era uma extensão OO muito mais limpa do C do que o C ++. Eu nunca tentei o Objective-C, então não tenho uma opinião sobre isso.
Giorgio
1
@ tech: Então, humildemente, sugiro que você reconsidere sua opinião;) Objective-C é sobre orientação a objetos, e ele faz um trabalho muito melhor do que C ++, porque introduz a passagem de mensagens. Embora eu concorde que a linguagem seja inferior ao C ++ em muitos aspectos, é igualmente superior em outros aspectos.
abr2
@Giorgio Eu concordo com seu colega, embora o Obj-C também tenha alguns limites (talvez alguns deles tenham desaparecido com o Obj-C 2.0), por exemplo, eu gostaria de sobrecarregar os "métodos" (seletores) - btw eu gostaria função de sobrecarga a la Fortran em C ...
ShinTakezou
2

O mundo incorporado especificou o C ++ incorporado , que pode ser o que você está procurando. Eles removeram coisas como herança múltipla e coisas assim. Até onde eu sei, é praticamente extinto.

mattnz
fonte
0

Você pode achar útil essa comparação lado a lado detalhada de C ++, Objective-C, Java e C # . Pessoalmente, acho que o C # é muito mais limpo para trabalhar do que o C ++. Eu tenho portado várias funções C (numéricas / cálculos) para C # antes, sem que muitas alterações sejam necessárias devido à semelhança da sintaxe e dos tipos de dados numéricos.

dodgy_coder
fonte