No artigo: Por que o POCO , existe esta frase:
Maciej Sobczak coloca bem: "Eu simplesmente não gosto quando alguém me dá metade da língua e me diz que é para minha própria proteção".
Eu não entendo o que ele quer dizer, mesmo que o C # seja de propriedade da Microsoft e Java seja de propriedade da Oracle , isso não significa que eles possuem metade da linguagem, não é? Não encontrei nenhuma evidência para provar essa frase, e estou realmente curioso sobre isso. E ainda mais curioso sobre a parte 'para minha própria proteção'.
Respostas:
Sobczak não está falando sobre propriedade corporativa. A "meia" linguagem que ele está perdendo é tudo o que você não pode fazer em muitas línguas modernas, mesmo sendo um especialista em informática bem educado e que saiba que elas podem ser possíveis: herdar de quantas classes você quiser. Atribua qualquer objeto a qualquer outro sem restrições de tipo. Controlar a alocação e liberar recursos manualmente, em vez de confiar no compilador e no tempo de execução para fazer isso por ele.
O fato é que todas essas restrições foram colocadas em linguagens de programação por um motivo. Nós que têm línguas que permitiu tudo isso. Com o tempo, descobrimos que o programador médio está melhor com uma certa quantidade de restrições e manipulação de mãos, porque o potencial de cometer erros muito ruins é grande demais para valer o poder e a expressividade adicionais.
(Obviamente, isso às vezes irrita os programadores que realmente não precisam de tanta ajuda. Suas queixas são às vezes legítimas. Mas as pessoas são notoriamente ruins em avaliar suas próprias habilidades, e muitos que pensam que não precisam das salvaguardas precisam, Nem sempre é fácil distinguir intelectos superiores reais que se sentem impedidos por restrições em linguagens de alto nível dos codificadores comuns que pensam que a reclamação os fará parecer superiores ou que não sabem melhor.)
fonte
dynamic
,?Isso é explicado muito bem na fonte original da citação :
Então, em outras palavras, o autor dessa citação gosta de C ++, e ele não gosta de Java, e sente que Java está perdendo metade do C ++. E isso é tudo o que há nessa citação.
fonte
O artigo vinculado ao blog que você postou foi removido, por isso é difícil ter certeza, mas, como diz Kilian, é provável que quando ele diz "metade da linguagem", ele quer dizer que C # e Java parecem C ++, mas com muito recursos e construções removidos para torná-los mais fáceis de usar ou mais seguros.
Em 2006, quando isso foi escrito, quando o C # era relativamente jovem e o Java era, de muitas maneiras, imaturo, e quando o poder versus a segurança parecia uma troca em que você só podia escolher um, essa não era uma posição totalmente irracional a ser tomada. .
Hoje em dia essa posição não é razoável. Pensando apenas nas linguagens mainstream, o C # e o Java amadureceram enormemente, emprestando recursos de outras linguagens (particularmente funcionais) para promover a escrita de código seguro. Também temos idiomas como Rust e Swift que são criados desde o início para fazer isso.
Se alguém desprezar um idioma porque ele segura sua mão ou disser que um idioma difícil de usar é, de alguma forma, uma coisa boa, eu aceitaria qualquer coisa que eles dissessem com um grão de sal. Você só precisa olhar para o número embaraçoso de bugs encontrados no código de que dependemos todos os dias, escritos pelas mentes mais brilhantes do setor, que teriam sido evitados trivialmente usando linguagens 'seguras', para ver o porquê.
fonte
Olhando para os arquivos , parece que essa citação era de 2003 (apesar do artigo citá-lo de 2006). Naquela época, o C # estava na versão 1. x , e faltava muitos de seus recursos modernos :
Provavelmente é mais compreensível que o C # parecesse meia linguagem nesse contexto, pois faltava muito do que é hoje o C #. É estranho pensar que ele nem tinha
static
aulas!Também faltava mais coisas, já que o C # estava vinculado ao .NET. Por exemplo, o WPF não existia naquela época; era tudo WinForms.
fonte
static
as classes parecem um recurso tão primitivo; Eu meio que imaginei que eles eram anteriores às aulas.static
na maioria dos casos não sou um grande fã de aulas. Honestamente, eu o escolhi como um recurso a ser destacado, porque parecia realmente parte simples e primitiva do C #; Não considerei que eles não estavam em Java.Ele estava reclamando da falta de recursos de linguagem que permitem um controle mais refinado. Isso inclui ferramentas para
const
palavra-chave C ++ )Isso me lembra uma das minhas críticas ao Java:
Nos objetos C ++, ponteiros e referências são três conceitos distintos com semântica clara. Em Java, você apenas possui o pseudo-objeto-ponteiro. Ao unir essas informações e evitar a verdadeira semântica de ponteiros, o modelo de objetos fica menos claro.
Em um programa C ++ bem definido, o programador pode esperar que as referências sejam válidas e não nulas. Devido ao seu modelo simplificado, o Java não pode fazer as mesmas garantias.
Os sintomas desse modelo menos claro incluem o padrão de objeto nulo e condicionais yoda como
5.equals(potentiallyNullIntegerReference)
.fonte
Map.merge
quando você simplesmente deseja atualizar um valor em um mapa).const
. Ele faz menção "programação funcional", no entanto, a linguagem que ele usa como exemplo é Scheme, que é não uma linguagem funcional pura (na verdade, os designers de esquema têm o cuidado de evitar o uso da palavra "função" e falar sobre " procedimentos "), então parece que ele está usando a interpretação de" sub-rotinas de primeira classe "do FP e não a" transparência referencial ".Concordo com a resposta @Kilian, mas adicionarei alguns elementos.
1- Correndo contra uma máquina virtual e não o SO
Como Java e C # estão sendo executados em uma máquina virtual, espera-se logicamente que você não possa fazer exatamente o que deseja quando estiver diretamente no sistema operacional, porque é provável que você corrompa algo na VM. Além disso, com o Java sendo orientado como independente de plataforma, é ainda mais lógico.
2 - Toneladas de aplicativos não exigem que você precise desse tipo de coisa.
Existem muitos aplicativos que realmente não precisam de você pesquisar muitos detalhes, mas se você fizer isso com um idioma que exija que você o faça, você obtém:
3- O idioma é feito com base em algumas opções de ponderação de custo / uso / riscos, como ... tudo.
Com o C ++, você pode fazer praticamente o que deseja, essa é a escolha das pessoas em C ++. No entanto, quanto mais houver, mais você precisará lidar.
Portanto, coisas como herança múltipla não são abandonadas apenas pelo fato de serem perigosas, porque a implementação delas tem um custo (desenvolvimento, manutenção), tudo isso para um recurso que raramente é usado corretamente e pode geralmente são reescritos de maneira diferente.
fonte
B
for substituído na classe médiaM
,B
a versão desse membro será acessível apenas porM
" substituição; (2) dada qualquer referência do tipoT
, convertendo-a em qualquer supertipo e retornando paraT
produzirá uma referência equivalente ao original. Ambas as garantias são úteis, e o suporte à herança múltipla exigiria renunciar a pelo menos uma.Basta colocar todas as restrições em linguagens de alto nível, como C # e Java, para proteger o programador. Eles existem não tanto para proteger o programador de si mesmo, mas para proteger o programador de outros programadores!
Quantas vezes nós, como programadores, encontramos bibliotecas absolutamente terríveis em suas práticas de codificação e design, mas que fomos forçados a usar por um motivo ou outro?
Esses programas geralmente têm as características do antigo método processual de programação, com falta de encapsulamento, muita gravação direta na memória com pouca ou nenhuma captura ou manipulação de erros. Segfaults buscam massa ao tentar usá-los em qualquer projeto de grande escala.
É aí que linguagens como Java e C # são extremamente úteis; não é que eles gostem do fato de não nos deixar fazer todas as coisas legais que outras linguagens fazem, é que gostamos da falta de dores de cabeça que temos de suportar, porque outros programadores abusariam das coisas legais que outras linguagens podem Faz.
As interfaces valem bem qualquer tipo de troca em termos de memória ou velocidade de execução em minha mente. Espero que você possa ver que, em qualquer tipo de aplicativo de missão crítica com tempo limitado, todas essas proteções, tratamento adequado de erros e geralmente ter certeza de que a memória não está sendo manipulada são coisas boas!
fonte
They exist not so much to protect the programmer from him/herself, but rather to protect the programmer from other programmers!
ou é para proteger outros programadores do programador?