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.
new
é principalmente um reforçomalloc
que também pode cuidar de inicializar a memória para você. Com "posicionamento novo" eoperator 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!C+
Disclaimer: Desculpe, eu não poderiat resist. It
01 de abril s;)Respostas:
Estes podem ser os dróides que você está procurando ...
Go - http://golang.org/
D - http://dlang.org/
Rust - http://rust-lang.org/
fonte
struct
s 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.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.
fonte
Desculpe, amigo, alarme de contradição. O manuseio não-cstring requer
new
. É uma necessidade fundamental. Você não pode terstd::string
semnew
. Além disso,new
/delete
é exatamente equivalente amalloc
/free
mas 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 umNULL
retorno e, portanto, é superior em todas as formas imagináveis. No C ++ 11, é muito possível escrever sua próprianew
função de estilo, porque o encaminhamento perfeito permite lidar com qualquer construtor de qualquer tipo. Se você é tímidonew
, 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.
fonte
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.std::bind
suporta essas coisas.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.
fonte
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 ++".
fonte
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 ++.
fonte
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.
fonte
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.
fonte