Quais recursos de idioma são considerados prejudiciais? [fechadas]


20

Por favor, explique por que e liste quais idiomas possuem o recurso (mis) implementado Até onde você sabe.

Poste o que você considera um recurso prejudicial, não o que você não gosta.



2
@sbi Você também pode ler na mesma página "XMLHttpRequest considerado prejudicial" ...
HoLyVieR

1
Todos eles são considerados prejudiciais, por alguém ou por outro, com a possível exceção de expressões básicas.
David Thornley


3
@ David Thornley: a = 1/0- expressão básica, prejudicial. ;-)
Orbling

Respostas:


37

Registre Globals em PHP

Informações: http://php.net/manual/en/security.globals.php

Esse é de longe o pior recurso a ser implementado por razões de legibilidade e segurança. Basicamente, todos os parâmetros GET recebidos são transformados em variáveis.

Por exemplo, com este URL: /index.php?value=foobar

Você pode fazer o seguinte:

<?php
echo $value; // return foobar
?>

Quando você está lendo código, é muito confuso saber de onde vem a variável.

Além disso, se o recurso for mal utilizado, pode levar a uma falha de segurança. Aqui está um exemplo de código do php.net que mostra como ele pode ser mal utilizado:

<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>

Isso é horrível. Embora eu possa compreender a necessidade, mantendo-on por padrão fez absolutamente nenhum sentido
TheLQ

14
Deve-se notar e enfatizar que o registro global não foi ativado por padrão desde o PHP 4.2 (desde 2000), está obsoleto no PHP 5.3 (2009) e será removido inteiramente no PHP 6, mas as pessoas ainda continuam voltando para o "OMG register globals" bem, mesmo após 10 anos.

1
PHP sem esperanças
Ming-Tang

@SHiNKiROU Não é impossível, esse recurso foi preterido e será removido em PHP 6.
HoLyVieR

1
Não é inútil, está tão atrasado em tantas outras línguas que a única razão pela qual alguém a usa é porque até recentemente era muito mais fácil obter hospedagem barata para ela do que outras línguas.
intuited

22

Permitir Nulo por padrão, o erro de "trilhão" * dólar. Desculpe Tony Hoare. Quase todas as línguas disponíveis no planeta.

Tony Hoare explica

* Ajustei a expressão cunhada por Tony Hoare para refletir a perda real nos dias de hoje :-)


Isso não é um recurso ou um erro, mas uma falta de recurso. Ter tipos de referência não anuláveis ​​não é algo que você possa colocar levemente em um idioma; Exige muito pensamento e bom design, e é muito difícil de fazer de uma maneira que não parece brigar com o compilador. Spec # e Singularity mostram o quão difícil é.
imgx64 24/09/10

@ imgx86, não, é definitivamente um erro. Tipos de referência não anuláveis ​​são um recurso adicionado em resposta ao erro nulo para permitir a compatibilidade com um sistema de tipos que normalmente permite nulo.
Matt Olenik

@Kyralessa: Talvez ele queira ter certeza de que HoLyVieR recebe o distintivo populista? :-) Eu concordo, não faz sentido aceitar sua própria resposta assim.
Macneil 26/11

18

MACROS C e C ++. Se eu tiver que ver outro erro do compilador devido a alguém escolher um nome de função padrão para sua macro que estraga meu código, vou gritar. Vamos ver o último ofensor:

#define vector(int) new VARIANT[int];

Aaarg! O que você fez com o meu vetor STL !?


O namespacing é uma das coisas que torna os typedefs e modelos imediatamente mais amigáveis.
Shog9

4
Concordou, mas apenas porque as linguagens modernas encontraram substitutos para a funcionalidade das macros textuais. Quando eles foram inventados, as macros eram uma coisa boa porque a tecnologia do compilador era muito primitiva.
dsimcha

onde você encontrou essa macro?
Rwong 02/11/2010

@dsimcha - Eu não sei sobre isso. As macros Lisp existem há muito tempo.
Jason Baker

2
@ Jason: Não estou batendo nas macros "reais" do estilo Lisp, que ainda são úteis e legais. Eu odeio apenas macros no estilo C / C ++ que funcionam puramente no nível do texto, não têm conceito de escopo, permitem criar abstrações ridiculamente vazadas e código ofuscado e podem ser completamente obsoletas por recursos mais modernos, um dos quais, ironicamente , são macros "reais".
dsimcha

14

Descoberta por padrão nas instruções de opção C e C ++.


18
Esse é sempre um recurso útil em todo o código que escrevi. Como isso é uma característica incorreta?
greyfade

6
@greyfade: É útil até você esquecer a breakdeclaração, ou alguém adicionar um caso entre dois casos (ou reordená-los), sem perceber que houve um desentendimento entre eles. Não ver qualquer maneira que fallthrough é melhor do que o C # maneira de exigir qualquer uma ruptura ou Goto caso, etc
Tim Goodman

9
O dispositivo de Duff zomba da sua impunidade!
Jesse C. Slicer

3
concordo. Por padrão, não é um bom recurso.

11
Ninguém lê? Ele disse: POR PADRÃO
Matt Olenik

13

Conversões implícitas de tipo quando os tipos que estão sendo convertidos não têm relação óbvia. Por exemplo, convertendo um aleatório, não numérico stringem um int, como no PHP.


7
Deve-se notar que, assim que você começa a entender, esse tipo de coisa se torna um problema. Isso é realmente realmente um problema se você não fizer nenhuma verificação em áreas críticas para os valores inseridos pelo usuário, mas será infinitamente útil se, digamos, você souber que algo será um número, mas vem como uma string. Por exemplo, um campo de um banco de dados provavelmente será retornado como uma sequência e você não deseja se preocupar em convertê-lo.
Tarka

2
@ Slokun: Você pode criar um exemplo melhor? Por que armazenar valores integrais em um banco de dados usando um tipo de string?
Steven Evers

@SnOrfus Obtendo um número passado em uma URL, entrada do usuário, funções e outras coisas comuns a idiomas de tipo não estaticamente.
TheLQ

Isso também é um problema em C, já que o valor de uma string entre aspas é um ponteiro, que pode ser convertido em um número inteiro, e isso pode criar construções que parecem fazer sentido compilar corretamente, mas produzem disparates. No C ++, você pode definir funções de conversão com a palavra-chave explicit, o que interrompe as conversões implícitas de tipo, mas ainda há problemas.
David Thornley

@TheLQ: Se for uma entrada do usuário, você deve validá-la para descobrir se é um número. Como o @Slokun disse. Se você está lendo dados de um arquivo, pode esperar que os dados numéricos estejam onde deveriam, mas ter uma exceção gerada no caso de corrupção de disco geralmente é melhor do que apenas ter um 0valor aleatório .
intuited

12

goto : apesar de aprovado em casos raros, costuma ser mal utilizado e leva a programas de leitura difícil.


Bom deus sim. xkcd.com/292
TheLQ

3
Eu vi o oposto em que permitir o uso criterioso do goto salvaria um programa de 3 milhões de linhas de código.
Dave

2
Ah, hipérbole ... Uma técnica literária válida.
Robert Harvey

11

NENHUM

Só porque um recurso é mal utilizado com frequência não o torna prejudicial.

IMHO todo o "é considerado prejudicial" é o Reductio ad Hitlerum de discussões de linguagem de programação.

A maioria, se não todos, dos recursos "prejudiciais" possui, ou teve originalmente, um caso de uso muito válido ou são simplesmente métodos de conveniência em primeiro lugar. Cabe aos desenvolvedores entender os prós e contras e o código em conformidade.

Se suas perguntas deveriam ser algo como "quais recursos de linguagem têm armadilhas comuns ou efeitos colaterais infelizes", minha resposta seria diferente.

[edit] Para ser claro: não quero dizer o uso continuado de métodos obsoletos. Se os desenvolvedores estão depreciando / removendo um recurso, você deve usar a substituição. Refiro-me ao conceito de que uma parte atual da linguagem é considerada prejudicial porque alguns não gostam do que ela encoraja ou do compromisso envolvido em usá-la que muitas pessoas discutem.


13
Eu discordo, um bom exemplo de contador é a minha resposta. O registro global do PHP foi ruim, não importa como você os usa. É por isso que foi reprovado e é altamente recomendável nunca usar na versão mais antiga do PHP.
HoLyVieR

5
+1 Em mãos erradas, qualquer construção de idioma é prejudicial.
Mouviciel 14/09/10

5
Bom ponto ... mesmo se 95% dos gotos são ruins, o recurso em si é ainda vale a pena ter para os outros 5%
EDS

1
Acho que é mais como colocar o botão do assento ejetor ao lado do botão liga / desliga do rádio. O recurso em si pode não ser ruim, mas não impedir danos causados ​​pelo uso acidental dele.
LennyProgrammers

1
Eu acho que esse é o equivalente de programação de "armas não matam pessoas, pessoas matam".
Orbling 27/11/10

7

A autovivificação (ou outro recurso bind-variable-on- (assign | use)) é o recurso que eu achei que me deu mais erros.


+1 - Podemos não concordar com o açúcar do iterador, mas posso concordar com 100%.
ChaosPandion

7

PLEASEem INTERCAL. Não use o suficiente, reclama. Use demais, reclama.


2
Essa linguagem não deve ser usada seriamente. Ele foi criado para ser uma linguagem de programação muito 'única', por isso é cheia de coisas (por exemplo, comec - apenas no topo da minha mente) que não fazem sentido.
ShdNx 24/09/10

4
Eu pensei que seria óbvio, mas sim, eu sei que não é uma linguagem séria.
Alan Pearce

2
Desculpe, algumas pessoas são muito sérias por aqui.
Mark C

1
Acabei de descobrir o idioma na semana passada na Wikipedia e fiquei impressionado com o quão popular ele era (e ainda é O_O).
Oliver Weiler

Existem várias linguagens de "desafio" e elas sempre são populares, porque os programadores tendem a fazer o trabalho por causa de um amor à caça. Também muito popular para perguntas da entrevista, pois são deliberadamente obtusas, instigantes e difíceis.
Orbling 27/11/10

7

Embora algumas pessoas discordem do homem ou de várias coisas que ele diz, muito do JavaScript de Douglas Crockford : The Good Parts é basicamente essa pergunta aplicada a JS. Entre as queixas de Crockford:

  • Escopo global por padrão para tudo (o DC mostra como usar a função / objetos como namespaces e delimitadores de escopo para agrupar isso.)

  • Declarações como with, cujo comportamento de falha é definir coisas no espaço de nomes global. (Gah! É como o lema do JS: se você falhar, falhe o máximo possível !)

  • Comportamento inesperado com o ==operador, que basicamente exige que você sempre use o ===operador.

  • Inserção de ponto e vírgula.

Na verdade, muitos JS devem ser considerados prejudiciais, talvez até toda a linguagem, mas as partes boas são tão boas que até compensam (pelo menos para mim).


6

"Falha silenciosamente" no Flash Player como comportamento padrão

Ok, não é realmente um recurso do idioma em si, mas ainda está intimamente relacionado.

De repente, seu aplicativo Flash / Flex para de funcionar e ninguém pode lhe dar a menor idéia do que aconteceu *. Nenhuma mensagem de erro, nenhum rastreamento de pilha, nada. De repente, a transição da tela não acontece (ou acontece de uma maneira completamente errada), ou os botões não reagem mais aos cliques ou as caixas de combinação estão vazias, em vez de serem preenchidas com algumas entradas.

Só esse "recurso" é responsável por vários relatórios de encolher de ombros e por um monte de cabelos grisalhos que eu estou recebendo. -.- Embora não seja desejável exibir uma mensagem enigmática no rosto do usuário, ele pode pelo menos ajudar o desenvolvedor a resolver o problema.

Mas o Flash Player deixa você esfaqueando no escuro, confiando na descrição do usuário (embora o problema possa realmente se originar de um local completamente diferente no código que não tem nada a ver com o que o usuário estava fazendo). Somente se você usar o Debug Player, você receberá a janela pop-up com uma mensagem de erro e um rastreamento de pilha.

No entanto, pode ser bastante interessante assistir a filmes incorporados em flash em determinados sites de notícias e receber mensagens repetidas sobre referências nulas do SWF player incorporado usado. : D


iPhone Apps também falhar sem aviso, por vezes, em certos horários estranhos
Ming-Tang

3
Falhar silenciosamente em qualquer coisa é bastante ruim.

6

Em C / C ++: essas atribuições também são expressões COMBINADAS COM os operadores de atribuição = e comparação == muito semelhantes. Não é um recurso prejudicial por si só, mas é muito fácil introduzir bugs (às vezes sutis) digitando acidentalmente o operador.

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}

... combinado com o fato de um número inteiro ou um ponteiro ser uma condição válida.
Barjak

5

Modificadores de acesso em Java com padrão de linguagem privada de pacote e padrão de convenção de programação privada.


5

Substituir variáveis indefinidas por uma string vazia em shell sem qualquer aviso: rm -rf $nosuchvar/*.


+1 Argh! LOL - padrão horrível (e exemplo divertido / assustador)
Orbling

@Orbling algo como ${varname:-/dev/null}pode ser uma solução alternativa ...
duros

Bem, isso mostra a necessidade de sempre verificar defensivamente a existência e o conteúdo variáveis ​​antes do uso.
Orbling 27/11/10

4

A capacidade de girar no sentido anti-horário no LOGO. Wtf, vamos apenas girar 360 - xgraus no sentido horário .


Bem, já faz um tempo desde que eu usei o LOGO. Por que isso é prejudicial?
Mason Wheeler

5
O logotipo pode ser usado para controlar um robô de tartaruga físico real. Às vezes, você quer que a tartaruga gire uma direção específica ou gire mais de uma vez. Por exemplo, talvez você esteja programando para fazer algum tipo de dança.
Daniel Cassidy

@Mason, era para ser uma piada.
Jjnguy 04/10/10

3
Sim, especialmente no LOGO For Clocks.
intuited

1
Adoro o Logo (consulte programmers.stackexchange.com/questions/21028/… ) e é uma excelente linguagem de ensino, principalmente para jovens. Quando eu tinha 11 anos e usei o Logo pela primeira vez, a maior parte da minha turma não sabia muita geometria, mas eles disseram que 90 era um quarto de volta e que saíam da direita. Portanto, não é um recurso negativo - o mesmo porque não multiplicamos por recíprocos, em vez de termos um operador de divisão. Sim, eu sei que é uma piada.
Orbling 27/11/10

4

Parando o encadeamento de outro encadeamento

Em Java e em outra linguagem, você pode parar um encadeamento de outro arbitrariamente, sem dar tempo para o encadeamento em que você parou para terminar corretamente. Essa capacidade foi preterida, considerando a enorme quantidade de problemas que isso poderia trazer em quase todas as situações.


Embora eu suponha que isso possa ser prejudicial, há momentos em que é extremamente útil (por exemplo, um depurador que suporta pontos de interrupção e interrupção únicos).
Jerry Coffin

1
@Jerry Depuração é outra coisa, não para o processo, faz uma pausa.
HoLyVieR

pelo contrário, para o fio. Aparentemente, você está falando sobre matar o tópico, mas não apenas pará-lo. Isso é um pouco mais difícil de justificar ...
Jerry Coffin

Não vejo isso necessariamente como um recurso de idioma. Mais uma coisa de biblioteca padrão.
Jason Baker

4

Variáveis ​​Variáveis em PHP

Só porque você $cannão significa que você$$should


1
Como sempre, o Perl ... tem o recurso (potencialmente perigoso) disponível, possui uma maneira fácil de desativá-lo ( use strict) e uma maneira fácil de ativá-lo novamente exatamente nos casos que você deseja ( no strict 'refs').

1
Eu nunca encontrei um uso para ter um nome de variável dinâmica. E as únicas vezes que o fiz, tornaram o código ilegível e um momento WTF alguns meses depois, quando eu o revisitei.
TheLQ

Mmm, as aplicações incluem metaprogramação com variáveis ​​desagradáveis ​​de outras pessoas ou com a tabela de símbolos (que é um pouco diferente, suponho).

1
@ Joe Gostaria de desafiá-lo a me mostrar um exemplo em que variáveis ​​variáveis ​​tornam uma solução mais clara.
Kendall Hopkins

1
O comentário foi feito como uma piada, desculpe não ter esclarecido isso, mas como você pergunta aqui, é o melhor exemplo em que variáveis ​​variáveis ​​tornam a solução mais clara . Admito que é um exemplo bastante ruim.
Joe D

3

A Withdeclaração em Delphi vem à mente, embora haja casos em que é útil.


Um bom caso quando eu portava algo do Delphi para o Lazarus e meu descendente do TControl continha "com Canvas do ... Width, Height" referenciando os tamanhos de controle, mas o Lazarus TCanvas tinha sua própria largura e Delphi, então isso levou ao código compilado incorretamente
Maksee


2

No Perl, o contexto escalar versus o contexto da lista pode ser complicado. Existem alguns pontos positivos que tornam certas operações convenientes, mas ocasionalmente você encontra algo terrível, como alterar completamente o significado de um operador (potencialmente a uma distância significativa do código).

sub foo { (1..5) }
my @list = foo();           # (1,2,3,4,5)
my $length = scalar @list;  # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)

Isso não está certo.

(Resulta da tentativa de fazer algo que funciona como o operador de faixa regular, para que você possa dizer algo como um loop next if /start_regex/ .. /end_regex/).


Homem que é tão confuso. A pior coisa de aprender Perl foi tentar entender isso.
glenatron

Eu sempre pensei que qualquer coisa que permitisse que uma função retornasse de várias maneiras era uma conveniência útil.
Orbling 27/11/10

2

Sintaxe relativa de importação do Python 2.x. Suponha que eu tenha um pacote x.pluginsque adicione suporte para várias outras bibliotecas para x. E suponha que eu tenha um sqlalchemymódulo x.pluginspara adicionar suporte ao sqlalchemy x. O que você acha que acontecerá se eu adicionar a seguinte linha ao sqlalchemy.py?

import sqlalchemy

A resposta é que o módulo tentará se importar. O que essa sintaxe faz é essencialmente impossível importar o pacote sqlalchemy global real. O Python 2.5 adicionou uma maneira de especificar que essa é uma importação relativa:

from . import sqlalchemy

... mas não é até Python 3 que a primeira sintaxe foi eliminada (embora possa ser desativada no Python 2.6+ com from __future__ import absolute_import).


1

sun.misc.unsafe é o meu favorito de todos os tempos; a coleção de "precisávamos disso para implementar as coisas, mas realmente não acho que você deva usá-lo".


7
Todo bom idioma deve ter um pacote não seguro na biblioteca padrão. A importação deste pacote mostra claramente sua intenção de fazer coisas não portáveis ​​de baixo nível. As alternativas são: 1- Ter recursos inseguros na própria linguagem (C ++, por exemplo) e 2- Ter que usar uma linguagem diferente, como C, para executar tarefas de baixo nível (Python e Ruby, por exemplo). A abordagem de pacote não seguro parece muito melhor para mim.
imgx64

1

FORTRAN blocos comuns. Se você cometeu um erro simples, uma parte de um aplicativo pode prejudicar os globais de outra parte.

FORTRAN atribuiu a instrução goto / COBOL alter statement. Código auto-modificável. Perigo, aviso, monstros espaguetes voadores !!


FORTRAN não tinha uma instrução ALTER. FORTRAN tinha a instrução ASSIGN, com o GOTO atribuído. COBOL tinha a instrução ALTER, que servia a um propósito semelhante.
John R. Strohm

@ John - obrigado. Minha memória de atribuir / alterar é fraca ... não menos importante, porque me ensinaram a nunca usá-los.
Stephen C

1

Orientação a objetos (de todas as linguagens estaticamente tipadas). Aposto que esse recurso tem e continuará a custar muito mais do que indicadores nulos. A Orientação a Objetos é boa apenas em uma linguagem de transmissão dinâmica de mensagens . Portanto, ele também deve ser retirado de linguagens dinâmicas como Python (já que ele não usa passagem de mensagens, mas chamada de sub-rotina convencional).


O Python suporta (para todos os efeitos) a mensagem do smalltalk passando o idioma. Apenas não é assim nomeado. Em segundo lugar, acho que é pelo menos um pouco discutível chamar um recurso tão difundido de linguagem de prejudicial.
Jason Baker

A Orientação a Objetos ainda melhora a reutilização de código e o encapsulamento de código / dados. Independentemente dos usos estáticos / dinâmicos do recurso.
Orbling 27/11/10

@Orbling: Comparado com o que? Na minha opinião, as linguagens de programação funcional têm uma reutilização de código mais alta e acho que o sistema de módulos de Haskell é muito bom para o encapsulamento de código / dados.
LennyProgrammers

@ Lenny222 Comparado com a programação imperativa padrão. Eu também prefiro a abordagem funcional, Haskell é a minha linguagem preferida.
Orbling 02/12/10

@ Jason Baker: bem, certamente é discutível, mas ser tão difundido é precisamente o que o torna tão prejudicial! O OP pediu minha opinião e eu dei. Só porque um monte de Lemmings pula de um penhasco não torna o comportamento saudável. Neste caso, é matematicamente comprovada OOP não funciona, e o paradigma correto é bem aceito: teoria da categoria é maneira de representar abstrações (que é na verdade a teoria de abstrações)
Yttrill

1

magic_quotesem PHP .

Os desenvolvedores inexperientes dependem da ativação e, portanto, assumem que toda entrada do usuário seja escapada para uso em uma consulta SQL ou dependem da desativação e, portanto, sempre escapam da entrada.

Ao assumir que está ativado e, em seguida, executar o código em um sistema em que não está, ele abre buracos de injeção SQL largos.

Ao assumir que está desabilitado e não está, isso resultará no fato de as barras invertidas serem realmente armazenadas no banco de dados, causando seqüências feias / incorretas.

Também não há uma maneira extremamente simples de lidar com os dois casos - você precisa verificar se está ativado usando get_magic_quotes_gpc()e depois aplicar stripslashes()todos os valores nas $_*matrizes - já que array_mapnão é recursivo, você precisa de uma função personalizada para isso.


Ou você pode simplesmente usar consultas parametrizadas.
Pieter B

Mesmo assim, você terá barras invertidas se as aspas mágicas estiverem ativadas e você não esperava.
ThiefMaster

-3

O recurso de linguagem que permite aos programadores escrever código não comentado ou sem comentários.


1
E como consertar isso?
Maniero

1
@ bigown: implementando o recurso de comentar ou morrer: D.
tia

3
Isso é chamado de programação alfabética. en.wikipedia.org/wiki/Literate_programming
Barry Brown

2
Isso não é um recurso, mas é um bug extremamente famoso no front end do usuário, a maioria das pessoas o conhece pelo seu nome latino: Homo Sapiens.
Joe D

-3

saindo um pouco aqui - funções nulas. uma função sempre faz alguma coisa; portanto, ela deve retornar o resultado ou alguma outra informação sobre seu sucesso ou fracasso.


3
Pascal tinha procedimentos (sem valor de retorno) e funções (valor de retorno).
Jon Onstott 02/11/10

As funções sempre fazem algo (normalmente, o espaço reservado funciona para alguém?) , Mas frequentemente não é necessário contar a ninguém sobre isso.
Orbling 27/11

-4

POKE em BASIC ...


7
POKE foi incrível.
Shog9

2
Nos primeiros dias, o puxão era a única maneira razoável de conseguir algumas coisas básicas. Música em um Apple] [vem à mente ...
Bill

2
Você não poderia fazer muito sem o POKE em um Commodore 64, se bem me lembro.
MetalMikester 01/10/10

1
Não se esqueça do PEEK, ambos essenciais.
Orbling 27/11

-5

Eu teria que dizer coleta de lixo. Ele não elimina a necessidade de pensar em gerenciamento de memória, mas elimina a percepção da necessidade de pensar em gerenciamento de memória, que muitas vezes elimina o pensamento real, e então você obtém enormes recursos e não sabe por quê. Especialmente quando o comportamento dos GCs geracionais modernos pode ser descrito sem muita hipérbole como "um grande vazamento de memória por design" de qualquer maneira.


2
Se você tiver referências em alguma coleção em algum lugar, terá outros problemas.
Chinmay Kanchi

2
É por isso que línguas gc'ed têm referências fracas :)
Chinmay Kanchi

4
Embora a GC certamente tenha pontos fortes e fracos, eu tenho que dizer que Mason está muito mais certo do que errado nessa questão. Na verdade, eu já vi pessoas que usam o GC gastam muito tempo extra em gerenciamento de memória porque acabaram tentando invadir as coisas depois do fato, em vez de planejá-lo com antecedência. O GC também geralmente impede a destruição determinística, o que leva a um trabalho extra no gerenciamento de todos os recursos, exceto a memória.
Jerry Coffin

3
@ChaosPandion: Eu sou realmente um tolo se pensar que, em uma moderna máquina multitarefa, para evitar que a paginação prejudique o desempenho do sistema, a memória deve ser liberada o mais rápido possível? Nenhum GC conseguiu sequer chegar perto de alcançar esse resultado e, de fato, o coletor de lixo geracional, que deveria ser a melhor e mais moderna variedade existente, faz exatamente o oposto: para obter o melhor desempenho, ele precisa liberar memória o mais tarde possível. Não vejo isso como sempre a ferramenta certa para qualquer trabalho, não quando diminui meus outros programas. Eu sou um tolo por isso?
Mason Wheeler

2
@ Barry: É determinístico dentro do programa. Se eu terminar com um bloco de memória de 5 KB, peça outros 5 KB logo depois, o que acontece? Em um sistema de coleta de lixo, ele precisa solicitar um novo bloco de 5 KB, mesmo que haja um bloco perfeitamente bom sem uso, a menos que o GC tenha sido executado nesse meio tempo. Nesse caso, você pode reciclar o bloco antigo. Com malloc e free, você sempre poderá reciclar o antigo bloco. Multiplique isso por algumas centenas de milhares e isso se tornará um problema real.
Mason Wheeler

-5

C e definitivamente C ++: aritmética de ponteiro. Permitir que as pessoas convertam números inteiros em endereços de memória está causando problemas.

E talvez até mesmo acesso bruto a ponteiros?

No C ++, você tem referências que tornam os ponteiros quase completamente desnecessários. Nos demais casos, indicadores inteligentes devem ser considerados obrigatórios.

Java também prova que você pode criar uma linguagem de programação que use ponteiros sem permitir que as pessoas acessem o próprio valor do ponteiro.

Além de null... mas essa é uma história diferente.


5
Os ponteiros, embora difíceis de usar adequadamente às vezes, são muito necessários para um grande número de operações de memória eficientes.
Bill

1
Verdade. Mas permitir que as pessoas convertam números inteiros em referências de memória regularmente ou adicionar números a endereços de memória é mais prejudicial atualmente em minha opinião. No C ++, você tem referências como uma alternativa perfeitamente boa e indicadores inteligentes / indicadores automáticos para quando você realmente precisa que ele seja um ponteiro.
Asgeir S. Nilsen

4
Esta resposta é válida apenas se você estiver trabalhando em uma pilha de software construída para ocultar os ponteiros. Em todos os outros casos, esta resposta está errada.
Paul Nathan

3
Algumas linguagens de programação precisam ter ponteiros disponíveis para que você possa gravar todos os sistemas operacionais e máquinas virtuais para as outras linguagens de programação.

2
-1. Há uma razão para você precisar de aritmética: iterar um ponto é mais rápido que indexar. for(int i=0;i<SIZE;++i) ++arr[i]é mais lento que for(int*i=arr;i<arr+SIZE;++i)*i++. Tudo o que o java conseguiu provar é que você precisa de ponteiro ou nunca olhou para ele sun.misc.Unsafe? Se você não precisar de ponteiros, explique como escrever uma função de troca genérica usando Java. (por exemplo, int a = 1, b = 2; swap (a, b); assert (a == 2 && b == 1);). Sem mencionar todos os problemas em c / c ++ que você teria se tivesse que usar referências. Como você chamaria uma função virtual em uma estrutura opaca sem ponteiros?
usar o seguinte código
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.