¿Qué características del lenguaje se consideran perjudiciales? [cerrado]

20

Por favor, explique por qué y enumere qué idiomas tienen implementada la función (errónea) Hasta donde usted sabe.

Publique lo que considera una característica dañina, no lo que no le gusta.

conocidos
fuente
2
@sbi También puede leer en la misma página "XMLHttpRequest Considered
Damful
1
Todos ellos son considerados dañinos, por alguien u otro, con la posible excepción de las expresiones básicas.
David Thornley
3
@David Thornley: a = 1/0- expresión básica, dañina. ;-)
Orbling

Respuestas:

37

Registre Globals en PHP

Información: http://php.net/manual/en/security.globals.php

Esta es, con mucho, la peor característica que se haya implementado por razones de legibilidad y seguridad. Básicamente, todos los parámetros GET recibidos se transforman en variables.

Por ejemplo con esta URL: /index.php?value=foobar

Puedes hacer lo siguiente:

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

Cuando estás leyendo código, es muy confuso saber de dónde viene la variable.

Además, si la función se usa incorrectamente, puede provocar un agujero de seguridad. Aquí hay un ejemplo de código de php.net que muestra cómo puede 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";
}
?>
HoLyVieR
fuente
Esto es horrible. Si bien puedo entender lo que quiero, mantenerlo
activado de manera
14
Cabe señalar y enfatizar que el registro global no se ha habilitado de forma predeterminada desde PHP 4.2 (hasta 2000), está en desuso en PHP 5.3 (2009) y se eliminará por completo en PHP 6, pero la gente sigue retrocediendo para el "OMG registro global" bien incluso después de 10 años.
1
PHP bastante desesperado
Ming-Tang el
@SHiNKiROU No es inútil, esa característica fue desaprobada y se eliminará en PHP 6.
HoLyVieR
1
No es inútil, está tan lejos de tantos otros idiomas que la única razón por la que alguien lo usa es porque hasta hace poco era mucho más fácil obtener alojamiento web barato que otros idiomas.
intuido
22

Permitir nulo por defecto, el error "billón" * dólar. Lo siento Tony Hoare. Casi todos los idiomas disponibles en el planeta.

Tony Hoare explica

* Ajusté la expresión acuñada por Tony Hoare para reflejar la pérdida real en estos días :-)

revés bigown
fuente
Esto no es una característica o un error, sino una falta de características. Tener tipos de referencia no anulables no es algo que se pueda colocar a la ligera en un idioma; Requiere mucho pensamiento y buen diseño, y es muy difícil de hacer de una manera que no tenga ganas de pelear con el compilador. Spec # y Singularity muestran lo difícil que es.
imgx64
@ imgx86, no, definitivamente es un error. Los tipos de referencia no anulables son una característica agregada en respuesta al error nulo para permitir la compatibilidad con un sistema de tipos que normalmente permite nulo.
Matt Olenik
@ Kyralessa: ¿Tal vez quiere estar seguro de que HoLyVieR recibe la insignia populista? :-) Estoy de acuerdo, no tiene sentido aceptar su propia respuesta como esta.
Macneil
18

MACROS C y C ++. Si alguna vez tengo que ver otro error del compilador debido a que alguien elige un nombre de función estándar para su macro que arruina mi código, voy a gritar. Veamos el último ofensor:

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

Aaarg! ¿Qué has hecho con mi vector STL?

Wheaties
fuente
El espacio de nombres es una de las cosas que hace que typedefs y plantillas sean más amigables de inmediato.
Shog9
44
De acuerdo, pero solo porque los lenguajes modernos han encontrado reemplazos para la funcionalidad de las macros textuales. Cuando se inventaron, las macros eran una buena cosa porque la tecnología del compilador era muy primitiva.
dsimcha
¿Dónde encontraste esta macro?
rwong
@dsimcha - No sé sobre esto. Las macros de Lisp han existido durante mucho tiempo.
Jason Baker,
2
@Jason: No voy a tocar macros AST "reales" de estilo Lisp, que siguen siendo útiles y geniales. Solo odio las macros de estilo C / C ++ que funcionan puramente a nivel textual, no tienen un concepto de alcance, permiten crear abstracciones ridículamente permeables y código ofuscado, y pueden quedar completamente obsoletas por características más modernas, una de las cuales, irónicamente , es macros "reales".
dsimcha
14

Fallthrough por defecto en las declaraciones de cambio C y C ++.

Niall C.
fuente
18
Esta es siempre una característica útil en todo el código que he escrito. ¿Cómo es esto una mala característica?
greyfade
66
@greyfade: es útil hasta que olvide la breakdeclaración, o alguien agregue un caso entre dos casos (o los vuelva a ordenar), sin darse cuenta de que hubo una falla entre ellos. No veo ninguna forma de que el fracaso sea mejor que la forma C # de requerir un descanso o un caso de goto, etc.
Tim Goodman,
99
¡El dispositivo de Duff se burla de tu impunidad!
Jesse C. Slicer
3
estoy de acuerdo. Por defecto no es una buena característica.
11
¿Nadie lee? Dijo fallthrough POR DEFECTO
Matt Olenik
13

Conversiones de tipo implícitas cuando los tipos que se convierten no tienen una relación obvia. Por ejemplo, convertir un azar, no numérico stringen un int, como en PHP.

Chinmay Kanchi
fuente
77
Cabe señalar que una vez que lo entiendes, este tipo de cosas se convierte en un problema. Solo es realmente un problema si no realiza ninguna verificación en áreas críticas para los valores ingresados ​​por el usuario, pero es infinitamente útil si, por ejemplo, sabe que algo será un número, pero viene como una cadena. Por ejemplo, un campo de un DB probablemente se devolverá como una cadena, y no debe preocuparse por enviarlo.
Tarka
2
@Slokun: ¿Puedes encontrar un mejor ejemplo? ¿Por qué almacenar valores integrales en una base de datos utilizando un tipo de cadena?
Steven Evers
@SnOrfus Obtener un número pasado en una URL, entrada del usuario, funciones y otras cosas comunes a los idiomas no estáticamente tipados.
TheLQ
Esto también es un problema en C, ya que el valor de una cadena entre comillas es un puntero, que se puede convertir en un número entero, y esto puede hacer que las construcciones parezcan tener sentido compilar correctamente pero producir tonterías. En C ++, puede definir funciones de conversión con la palabra clave explicit, que detiene las conversiones de tipo implícito, pero aún hay problemas.
David Thornley
@TheLQ: si es una entrada del usuario, debe validarlo para determinar si es un número. Como dijo @Slokun. Si está leyendo datos de un archivo, puede esperar que los datos numéricos estén donde se supone que deben hacerlo, pero tener una excepción en el caso de corrupción del disco a menudo es mejor que simplemente tener un 0valor aleatorio para algún valor.
intuido
12

goto : aunque está bien en casos raros, se usa con mayor frecuencia y conduce a programas difíciles de leer.

Brian R. Bondy
fuente
Buen dios si. xkcd.com/292
TheLQ
3
He visto lo contrario donde permitir el uso juicioso de goto habría salvado un programa de 3 millones de líneas de código.
Dave
2
Ah, hipérbole ... Una técnica literaria válida.
Robert Harvey
11

NINGUNA

El hecho de que una característica se use mal con frecuencia no la hace dañina.

En mi humilde opinión, todo el "se considera perjudicial" es la Reductio ad Hitlerum de las discusiones en lenguaje de programación.

La mayoría, si no todas, las características "dañinas" tienen, o tuvieron originalmente, un caso de uso muy válido o son simplemente métodos de conveniencia en primer lugar. Depende de los desarrolladores comprender los pros y los contras y codificar en consecuencia.

Si sus preguntas pretendieran ser algo similar a "qué características del lenguaje tienen dificultades comunes o efectos secundarios desafortunados", mi respuesta sería diferente.

[editar] Para ser claros: no me refiero al uso continuado de métodos obsoletos. Si los desarrolladores están depreciando / eliminando una característica, debe usar el reemplazo. Me refiero al concepto de que una parte actual del lenguaje se considera dañina porque a algunos no les gusta lo que alienta o la compensación que implica el uso que muchas personas discuten.

Bill
fuente
13
No estoy de acuerdo, un buen ejemplo contrario es mi respuesta. El registro global de PHP fue simplemente malo, no importa cómo los use. Esta es la razón por la que ha quedado en desuso y le recomendamos que nunca lo use en una versión anterior de PHP.
HoLyVieR
55
Poner en manos equivocadas, cualquier construcción de lenguaje es dañina
mouviciel
55
Buen punto ... incluso si el 95% de los gotos son malos, vale la pena tener la característica en sí para el otro 5%
eds
1
Creo que es más como poner el botón del asiento del eyector al lado del botón de encendido / apagado de la radio. La característica en sí misma puede no ser mala, pero no lo es para evitar daños por el uso accidental de la misma.
LennyProgrammers
1
Creo que este es el equivalente de programación de "las armas no matan a la gente, la gente lo hace".
Orbling
7

La autovivificación (u otra función bind-variable-on- (asignar | usar)) es la característica que descubrí que me da más errores.

Paul Nathan
fuente
+1: es posible que no estemos de acuerdo con el azúcar iterador, pero esto es algo con lo que puedo estar de acuerdo al 100%.
ChaosPandion
7

PLEASEen INTERCAL. No lo uses lo suficiente, se queja. Úselo demasiado, se queja.

Alan Pearce
fuente
2
Se supone que ese lenguaje no debe usarse en serio. Fue creado para ser un lenguaje de programación muy 'único', por lo que está lleno de cosas (por ejemplo, que vienen de mi mente) que no tienen sentido.
ShdNx
44
Pensé que sería obvio, pero sí, soy consciente de que no es un lenguaje serio.
Alan Pearce
2
Lo sentimos, algunas personas son demasiado serias por aquí.
Mark C
1
Acabo de descubrir el idioma la semana pasada en Wikipedia y me sorprendió lo popular que era (y todavía no es O_O).
Oliver Weiler, el
Hay varios idiomas de "desafío" y siempre son populares, porque los codificadores tienden a hacer el trabajo por amor a la persecución. También es muy popular para las preguntas de la entrevista, ya que son deliberadamente obtusas, estimulantes y difíciles.
Orbling
7

Aunque algunas personas no están de acuerdo con el hombre o con varias cosas que dice, mucho JavaScript de Douglas Crockford : The Good Parts es básicamente esta pregunta aplicada a JS. Entre las quejas de Crockford:

  • Alcance global de manera predeterminada para todo (DC muestra cómo usar funciones / objetos como espacios de nombres y delimitadores de alcance para resolver esto).

  • Declaraciones como with, cuyo comportamiento de falla es definir cosas en el espacio de nombres global. (¡Gah! ¡Es como si el lema de JS es que si fallas, fallas tan duro como puedas !)

  • Comportamiento inesperado con el ==operador, que básicamente requiere que siempre use el ===operador.

  • Inserción de punto y coma.

Realmente un montón de JS debería considerarse dañino, tal vez incluso todo el lenguaje, pero las partes buenas son tan buenas que lo compensan (al menos para mí).

CodexArcanum
fuente
6

"Error en silencio" en Flash Player como comportamiento predeterminado

Ok, en realidad no es una característica del lenguaje en sí, pero aún está bastante relacionado.

De repente, su aplicación Flash / Flex deja de funcionar y nadie puede darle la más mínima pista de lo que sucedió. Sin mensaje de error, sin stacktrace, sin nada. Es solo que de repente la transición de la pantalla no ocurre (o sucede de una manera completamente incorrecta), o los botones ya no reaccionan a los clics, o los cuadros combinados están vacíos en lugar de estar llenos de algunas entradas.

Esa "característica" sola es responsable de varios informes de encogimiento de hombros y un montón de canas que he estado recibiendo. -.- Si bien mostrar un mensaje críptico en la cara del usuario tampoco es deseable, al menos puede ayudar al desarrollador a solucionar el problema.

Pero Flash Player te deja apuñalando en la oscuridad, dependiendo de la descripción del usuario (mientras que el problema puede originarse en una ubicación completamente diferente en el código que no tiene nada que ver con lo que el usuario estaba haciendo). Solo si usa el reproductor de depuración obtendrá la ventana emergente con un mensaje de error y un seguimiento de pila.

Sin embargo, puede ser bastante interesante ver películas incrustadas en flash en ciertos sitios de noticias y recibir mensajes repetidos sobre referencias nulas del SWF del reproductor incrustado utilizado. :RE

revs Baelnorn
fuente
Las aplicaciones de iPhone también se bloquean sin previo aviso a veces, en ciertos momentos extraños
Ming-Tang
3
Fallar silenciosamente en algo es bastante pésimo.
6

En C / C ++: las asignaciones también son expresiones COMBINADAS CON operadores de asignación = y comparación == muy similares. No es una característica dañina per se, pero es una forma fácil de introducir errores (a veces sutiles) al escribir incorrectamente el operador.

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}
Sebastian Negraszus
fuente
... combinado con el hecho de que un entero o un puntero es una condición válida.
barjak
5

Acceda a los modificadores en Java con el paquete de idioma privado predeterminado y la convención de programación privada predeterminada.

Hoa Long Tam
fuente
5

Sustitución de variables no definidas por una cadena vacía con cáscara y sin ninguna advertencia: rm -rf $nosuchvar/*.

duros
fuente
+1 Argh! LOL - horrible incumplimiento (y ejemplo divertido / aterrador)
Orbling
@ Organizar algo así ${varname:-/dev/null}puede ser una solución alternativa ...
duros
Bueno, demuestra la necesidad de verificar siempre defensivamente la existencia y el contenido de las variables antes de su uso.
Orbling
4

La capacidad de girar en sentido antihorario en LOGO. Wtf, vamos a girar 360 - xgrados en sentido horario .

jjnguy
fuente
Bueno, ha pasado un tiempo desde que usé LOGO. ¿Por qué es esto dañino?
Mason Wheeler
55
El logotipo se puede usar para controlar un robot tortuga real y físico. A veces quieres que la tortuga gire en una dirección específica, o que gire más de una vez. Por ejemplo, tal vez lo estás programando para hacer algún tipo de baile.
Daniel Cassidy
@Mason, se suponía que era una broma.
jjnguy
3
Sí, especialmente en LOGO For Clocks.
intuido
1
Me encanta el logotipo (ver programmers.stackexchange.com/questions/21028/… ) y es un excelente lenguaje de enseñanza, especialmente para los jóvenes. Cuando tenía 11 años y usé Logo por primera vez, la mayoría de mi clase no sabía tanta geometría, pero les dijeron que 90 era un cuarto de vuelta y sabían de izquierda a derecha. Por lo tanto, no es una característica negativa, lo mismo que por qué no multiplicamos por recíprocos en lugar de tener un operador de división. Sí, sé que es una broma.
Orbling
4

Detener el hilo de otro hilo

En Java y en otro lenguaje, puede detener un hilo de otro arbitrariamente sin dar tiempo para que el hilo que detuvo finalice correctamente. Esta capacidad ha quedado en desuso teniendo en cuenta la gran cantidad de problemas que podría traer en casi todas las situaciones.

HoLyVieR
fuente
Si bien supongo que esto puede ser dañino, a veces es extremadamente útil (por ejemplo, un depurador que admite pasos únicos y puntos de interrupción).
Jerry Coffin
1
@Jerry Debugging es otra cosa, no detiene el proceso, lo detiene.
HoLyVieR
más bien al contrario, detiene el hilo. Aparentemente, estás hablando de matar el hilo, no solo detenerlo. Eso es un poco más difícil de justificar ...
Jerry Coffin
Sin embargo, no veo esto necesariamente como una característica del lenguaje. Más una cosa de biblioteca estándar.
Jason Baker,
4

Variable Variables en PHP

Solo porque $canno te refieres a ti$$should

Kendall Hopkins
fuente
1
Como de costumbre, Perl ... tiene la función (potencialmente peligrosa) disponible, tiene una forma fácil de usar las mejores prácticas para apagarla ( use strict) y una manera fácil de encenderla nuevamente en los casos exactos en los que lo desee ( no strict 'refs').
1
Nunca he encontrado un uso para tener un nombre de variable dinámica. Y las únicas veces que lo hice, hizo que el código fuera ilegible y un momento WTF unos meses después cuando volví a visitar el código.
TheLQ
Mmm, las aplicaciones incluyen metaprogramación con las variables de paquetes desagradables de otras personas o la tabla de símbolos (que es un poco diferente, supongo).
1
@ Joe, te desafío a que me muestres un ejemplo en el que las variables variables aclaran la solución.
Kendall Hopkins, el
1
El comentario fue una broma, lo siento, no lo dejé claro, pero como preguntas aquí, este es el mejor ejemplo donde las variables variables aclaran la solución . Sin embargo, admito que es un mal ejemplo.
Joe D el
3

La Withdeclaración en Delphi viene a la mente, aunque hay casos en que es muy útil.

Remko
fuente
Un buen caso cuando porté algo de Delphi a Lazarus y mi descendiente TControl contenía "con Canvas do ... Width, Height" que hacía referencia a los tamaños de control, pero Lazarus TCanvas tenía su propio Width y Delphi, por lo que esto condujo a un código compilado incorrectamente
Maksee
3

¡Matrices en AWK que comienzan en el índice 1 !

Oliver Weiler
fuente
2
¡Arreglos en C y C ++ que comienzan en el índice 0!
David Thornley
44
¡Arreglos en lisp que comienzan en el índice car! : P
Joe D
En Lua también, ¡imperdonable!
Tobu
2

En Perl, el contexto escalar frente al contexto de lista puede ser complicado. Tiene algunos puntos buenos que hacen que ciertas operaciones sean convenientes, pero ocasionalmente te encuentras con algo terrible, como cambiar completamente el significado de un operador (potencialmente desde una distancia significativa en el 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)

Eso no está bien.

(Surge de tratar de hacer algo que actúe como el operador de rango regular, por lo que puede decir algo como un bucle next if /start_regex/ .. /end_regex/).

usuario2348
fuente
Hombre que es tan confuso. Lo peor de aprender Perl fue tratar de entenderlo.
glenatron
Siempre pensé que cualquier cosa que permita que una función regrese de múltiples maneras era una conveniencia práctica.
Orbling
2

La sintaxis de importación relativa de Python 2.x. Supongamos que tengo un paquete x.pluginsque agrega soporte para varias otras bibliotecas para x. Y supongamos que tengo un sqlalchemymódulo x.pluginspara poder agregar soporte de sqlalchemy x. ¿Qué crees que sucederá si agrego la siguiente línea a sqlalchemy.py?

import sqlalchemy

La respuesta es que el módulo intentará importarse a sí mismo. Lo que hace esta sintaxis es esencialmente hacer que sea imposible importar el paquete global sqlalchemy real. Python 2.5 agregó una forma de especificar que esta es una importación relativa:

from . import sqlalchemy

... pero no es hasta Python 3 que se eliminó la primera sintaxis (aunque se puede deshabilitar en Python 2.6+ con from __future__ import absolute_import).

Jason Baker
fuente
1

sun.misc.unsafe es mi favorito de todos los tiempos; la colección de "necesitábamos esto para implementar cosas, pero realmente, realmente no creo que debas usarlo".

Dean J
fuente
77
Todo buen lenguaje debe tener un paquete inseguro en la biblioteca estándar. La importación de este paquete muestra claramente su intención de hacer cosas de bajo nivel que no se pueden transmitir. Las alternativas son: 1- Tener características inseguras en el lenguaje mismo (C ++ por ejemplo) y 2- Tener que usar un lenguaje diferente como C para hacer cosas de bajo nivel (Python y Ruby por ejemplo). El enfoque de paquete inseguro me parece mucho mejor.
imgx64
1

FORTRAN bloques comunes. Si cometió un simple error, una parte de una aplicación podría golpear a los globales de otra parte.

FORTRAN asignó la declaración goto / la declaración alter COBOL. Código auto modificable. ¡Peligro, advertencia, monstruos espaguetis voladores!

Stephen C
fuente
FORTRAN no tenía una declaración ALTER. FORTRAN tenía la declaración ASSIGN, con el GOTO asignado. COBOL tenía la declaración ALTER, que tenía un propósito similar.
John R. Strohm
@ John - gracias. Mi memoria de asignar / alterar es tenue ... sobre todo porque me enseñaron a nunca usarlos.
Stephen C
1

Orientación a objetos (de todos los idiomas escritos estáticamente). Apuesto a que esta característica tiene, y continuará, costar mucho más que punteros nulos. La orientación a objetos solo es buena en un mensaje dinámico que pasa el lenguaje. Por lo tanto, también debe eliminarse de lenguajes dinámicos como Python (ya que no utiliza el paso de mensajes sino llamadas de subrutinas convencionales).

Yttrill
fuente
Python admite (para todos los efectos) el modismo de transmisión de mensajes de smalltalk. Simplemente no se llama así. En segundo lugar, creo que es al menos un poco discutible llamar dañina a una característica de lenguaje tan dominante.
Jason Baker,
La orientación a objetos todavía mejora la reutilización de código y la encapsulación de código / datos. Independientemente de los usos estáticos / dinámicos de la función.
Orbling
@Orbling: ¿Comparado con qué? En mi opinión, los lenguajes de programación funcional tienen una mayor reutilización de código y creo que el sistema de módulos de Haskell es bastante bueno para la encapsulación de código / datos.
LennyProgrammers
@ Lenny222 En comparación con la programación imperativa estándar. Yo también prefiero el enfoque funcional, Haskell es mi lenguaje preferido.
Orbling
@ Jason Baker: bueno, ciertamente es discutible, ¡pero ser tan dominante es precisamente lo que lo hace tan dañino! El OP pidió mi opinión, y se la di. El hecho de que un montón de Lemmings salte de un acantilado no hace que el comportamiento sea sensato. En este caso se ha demostrado matemáticamente programación orientada a objetos no funciona, y el paradigma correcto es bien aceptada: la teoría de categorías es manera de representar abstracciones (de hecho, es la teoría de abstracciones)
Yttrill
1

magic_quotesen PHP .

Los desarrolladores sin experiencia confían en que esté habilitado y, por lo tanto, suponen que se escapen todas las entradas del usuario para su uso en una consulta SQL o confían en que esté deshabilitado y, por lo tanto, siempre escapan de su entrada.

Al suponer que está habilitado y luego ejecutar el código en un sistema donde no lo está, se abren grandes agujeros de inyección SQL.

Al suponer que está deshabilitado y no lo está, dará lugar a que las barras invertidas se almacenen realmente en la base de datos, causando cadenas feas / incorrectas.

Tampoco hay una forma extremadamente simple de manejar ambos casos: debe verificar si está habilitado usando get_magic_quotes_gpc()y luego aplicar stripslashes()a todos los valores en las $_*matrices, ya array_mapque no es recursivo, necesita una función personalizada para esto.

ThiefMaster
fuente
O simplemente podría usar consultas parametrizadas.
Pieter B
Incluso entonces obtendrá barras diagonales inversas si las comillas mágicas están habilitadas y no lo esperaba.
ThiefMaster
-3

La función de lenguaje que permite a los programadores escribir código comentado sin comentarios o sin sentido.

tia
fuente
1
¿Y cómo arreglar esto?
Maniero
1
@bigown: implementando la función de comentar o morir: D.
tia
3
Eso se llama programación literaria. en.wikipedia.org/wiki/Literate_programming
Barry Brown
2
Esa no es una característica, pero es un error extremadamente famoso en la interfaz del usuario, la mayoría de la gente lo conoce por su nombre en latín: Homo Sapiens.
Joe D
-3

salir un poco de las extremidades aquí - funciones nulas. una función siempre hace algo, por lo tanto, debe devolver el resultado o alguna otra información sobre su éxito o fracaso.

Brad Clawsie
fuente
3
Pascal tenía procedimientos (sin valor de retorno) así como funciones (valor de retorno).
Jon Onstott
Las funciones siempre hacen algo (bueno, por lo general, ¿la función de marcador de posición a alguien?) , Pero con frecuencia no es necesario que se lo digas a nadie.
Orbling
-4

POKE en BÁSICO ...

chirrido
fuente
77
POKE fue increíble.
Shog9
2
En los primeros días, el empuje era la única forma razonable de lograr ciertas cosas en básico. Music on an Apple] [viene a mi mente ...
Bill
2
No podría hacer mucho sin POKE en un Commodore 64, si no recuerdo mal.
MetalMikester
1
No olvides PEEK, ambos esenciales.
Orbling
-5

Tendría que decir recolección de basura. No elimina la necesidad de pensar en la administración de la memoria, pero elimina la percepción de la necesidad de pensar en la administración de la memoria, que con demasiada frecuencia elimina el pensamiento real, y luego obtienes enormes recursos y no sabes por qué. Especialmente cuando el comportamiento de los GC generacionales modernos podría describirse sin demasiada hipérbole como "una gran pérdida de memoria por diseño" de todos modos.

Mason Wheeler
fuente
2
Si tiene referencias en alguna colección, tiene otros problemas.
Chinmay Kanchi
2
Es por eso que los idiomas gc'ed tienen referencias débiles :)
Chinmay Kanchi
44
Si bien GC ciertamente tiene fortalezas y debilidades, debo decir que Mason tiene más razón que error en este caso. De hecho, he visto a personas que usan GC dedicar mucho tiempo extra a la administración de la memoria porque terminaron tratando de piratear las cosas después del hecho en lugar de planificarlo por adelantado. GC también generalmente evita la destrucción determinista, lo que lleva a un trabajo adicional que se ocupa de administrar todos los recursos que no sean la memoria.
Jerry Coffin
3
@ChaosPandion: ¿Soy realmente un tonto si pienso que, en una máquina multitarea moderna, para evitar que la paginación arruine el rendimiento de su sistema, la memoria debería liberarse lo antes posible? Ningún GC ha logrado siquiera acercarse a lograr ese resultado, y de hecho, el recolector de basura generacional, que se supone que es la mejor y más moderna variedad que existe, hace exactamente lo contrario: para obtener el mejor rendimiento, tiene que liberar recuerdo lo más tarde posible. No veo que esa sea la herramienta adecuada para cualquier trabajo, no cuando ralentiza mis otros programas. ¿Soy un tonto por eso?
Mason Wheeler
2
@Barry: es determinista dentro del programa. Si terminé con un bloque de memoria de 5 KB, solicite otros 5 KB poco después, ¿qué sucede? En un sistema de recolección de basura, necesita solicitar un nuevo bloque de 5 KB, a pesar de que hay un bloque perfectamente bueno sin usar, a menos que el GC se haya ejecutado mientras tanto, en cuyo caso puede reciclar el bloque anterior. Con malloc y gratis, siempre podrás reciclar el bloque viejo. Multiplique esto por unos cientos de miles y se convertirá en un problema real.
Mason Wheeler
-5

C, y definitivamente C ++: aritmética de puntero. Permitir que las personas conviertan números enteros en direcciones de memoria es un problema.

¿Y tal vez incluso acceso bruto a punteros por completo?

En C ++ tiene referencias que hacen que los punteros sean casi completamente innecesarios. Para los casos restantes, los punteros inteligentes deben considerarse obligatorios.

Java también demuestra que puede crear un lenguaje de programación que use punteros sin permitir que las personas accedan al valor del puntero.

Aparte de null... pero esa es una historia diferente.

Asgeir S. Nilsen
fuente
55
Los punteros, aunque a veces son difíciles de usar correctamente, son muy necesarios para una gran cantidad de operaciones de memoria eficientes.
Bill
1
Cierto. Pero permitir que las personas conviertan números enteros en referencias de memoria de forma regular, o agregar números a las direcciones de memoria es, en mi opinión, principalmente dañino en estos días. En C ++ tiene referencias como una alternativa perfectamente buena, y punteros inteligentes / punteros automáticos para cuando realmente necesita que sea un puntero.
Asgeir S. Nilsen
44
Esta respuesta solo es válida si está trabajando en una pila de software construida para ocultar punteros. En todos los demás casos, esta respuesta es incorrecta.
Paul Nathan
3
Algunos lenguajes de programación deben tener punteros disponibles para que pueda escribir todos los sistemas operativos y máquinas virtuales para los otros lenguajes de programación.
2
-1. Hay una razón por la que necesita aritmética ptr: iterar un punto es más rápido que indexar. for(int i=0;i<SIZE;++i) ++arr[i]es más lento que for(int*i=arr;i<arr+SIZE;++i)*i++. Todo lo que Java logró demostrar es que necesitas un puntero, ¿o nunca lo has mirado sun.misc.Unsafe? Si no necesita punteros, explique cómo escribir una función de intercambio genérica utilizando Java. (por ejemplo, int a = 1, b = 2; swap (a, b); afirmar (a == 2 && b == 1);). Sin mencionar todos los problemas en c / c ++ que tendrías si tuvieras que usar referencias. ¿Cómo llamaría a una función virtual en una estructura opaca sin punteros?
KitsuneYMG