Quali funzionalità linguistiche sono considerate dannose? [chiuso]


20

Per favore, spiega perché ed elenca quali lingue hanno implementato la (mis) funzionalità Per quanto ne sai.

Pubblica ciò che consideri una funzionalità dannosa, non ciò che non ti piace.



2
@sbi Puoi anche leggere nella stessa pagina "XMLHttpRequest Considered Harmful" ...
HoLyVieR

1
Tutti sono considerati dannosi, da qualcuno o da altri, con la possibile eccezione delle espressioni di base.
David Thornley,


3
@ David Thornley: a = 1/0- espressione di base, dannosa. ;-)
orbita il

Risposte:


37

Registra Globals in PHP

Informazioni: http://php.net/manual/en/security.globals.php

Questa è di gran lunga la caratteristica peggiore che sia mai stata implementata per motivi di leggibilità e motivi di sicurezza. Fondamentalmente tutti i parametri GET ricevuti vengono trasformati in variabili.

Ad esempio con questo URL: /index.php?value=foobar

Puoi fare quanto segue:

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

Quando leggi il codice, è molto confuso sapere da dove proviene la variabile.

Inoltre, se la funzionalità viene utilizzata in modo improprio, può causare problemi di sicurezza. Ecco un esempio di codice da php.net che mostra come può essere utilizzato in modo improprio:

<?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";
}
?>

È orribile. Mentre riesco a capire il bisogno, tenerlo acceso per impostazione predefinita non ha assolutamente senso
TheLQ

14
Va notato e sottolineato che globali di registro non è stato abilitato di default da PHP 4.2 (tutta la strada nel 2000), è deprecato in PHP 5.3 (2009) e saranno rimossi interamente in PHP 6, ma la gente ancora andare avanti indietro al "registro globale di OMG" anche dopo 10 anni.

1
Pretty Hopeless PHP
Ming-Tang,

@SHiNKiROU Non è senza speranza, questa funzione è stata deprecata e verrà rimossa in PHP 6.
HoLyVieR

1
Non è senza speranza, è così indietro rispetto a così tante altre lingue che l'unica ragione per cui qualcuno la usa è perché fino a poco tempo fa era molto più facile ottenere un web hosting economico per questo rispetto ad altre lingue.
intuito il

22

Consenti Null per impostazione predefinita, l'errore "trilioni" * di dollari. Scusa Tony Hoare. Quasi tutte le lingue disponibili sul pianeta.

Spiega Tony Hoare

* Ho modificato l'espressione coniata da Tony Hoare per riflettere la perdita effettiva in questi giorni :-)


Questa non è una caratteristica o un errore, ma piuttosto una mancanza di funzionalità. Avere tipi di riferimento non annullabili non è qualcosa che puoi trascinare leggermente in una lingua; Richiede molto pensiero e un buon design ed è molto difficile da fare in un modo che non ha voglia di combattere con il compilatore. Spec # e Singolarità mostrano quanto sia difficile.
imgx64,

@ imgx86, no, è sicuramente un errore. I tipi di riferimento non annullabili sono una funzionalità aggiunta in risposta all'errore null per consentire la compatibilità con un sistema di tipi che normalmente consente null.
Matt Olenik,

@Kyralessa: Forse vuole essere sicuro che HoLyVieR ottenga il badge Populist? :-) Sono d'accordo, non ha senso accettare la tua risposta in questo modo.
Macneil,

18

MACRO C e C ++. Se dovessi mai vedere un altro errore del compilatore dovuto a qualcuno che ha scelto un nome di funzione standard per la sua macro che rovina il mio codice, urlo. Vediamo l'ultimo offensivo:

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

Aaarg! Che cosa hai fatto con il mio vettore STL !?


Lo spazio dei nomi è una delle cose che rende i typedef e i template immediatamente più amichevoli.
Shog9

4
D'accordo, ma solo perché le lingue moderne hanno trovato sostituti della funzionalità delle macro testuali. All'epoca dell'invenzione, le macro erano una buona cosa perché la tecnologia del compilatore era così primitiva.
dsimcha,

dove hai trovato questa macro?
rwong

@dsimcha - Non lo so. Le macro di Lisp sono in circolazione da molto tempo.
Jason Baker,

2
@Jason: non sto bussando alle macro "reali" AST in stile Lisp, che sono ancora utili e interessanti. Odio solo le macro in stile C / C ++ che funzionano puramente a livello testuale, non hanno un concetto di scopo, consentono di creare astrazioni ridicolmente impercettibili e codice offuscato e possono essere completamente rese obsolete da funzionalità più moderne, una delle quali, ironicamente , è macro "reali".
dsimcha,

14

Fallthrough per impostazione predefinita nelle istruzioni switch C e C ++.


18
Questa è sempre una funzione utile in tutto il codice che ho scritto. Come è una cattiva funzionalità?
Greyfade,

6
@greyfade: è utile fino a quando non dimentichi la breakdichiarazione o qualcuno aggiunge un caso tra due casi (o li riordina), senza notare che c'è stato un errore tra di loro. Non vedo in alcun modo che la caduta sia migliore del modo C # di richiedere una pausa o un caso di goto, ecc.
Tim Goodman,

9
Il dispositivo di Duff si fa beffe della tua impunità!
Jesse C. Slicer,

3
sono d'accordo. Di default non è una buona funzionalità.

11
Nessuno legge? Ha detto che è fallito DA DEFAULT
Matt Olenik il

13

Le conversioni di tipo implicite quando i tipi da convertire non hanno una relazione ovvia. Ad esempio, convertendo un casuale, non numerico stringin un int, come in PHP.


7
Va notato che una volta che ci si mette la testa intorno, questo genere di cose diventa un problema. È davvero un problema solo se non si eseguono controlli in aree critiche per i valori immessi dall'utente, ma è infinitamente utile se, ad esempio, si sa che qualcosa sarà un numero, ma viene fornito come una stringa. Ad esempio, un campo da un DB verrà probabilmente restituito come stringa e non devi preoccuparti di lanciarlo.
Tarka,

2
@Slokun: puoi fare un esempio migliore? Perché memorizzare i valori integrali in un db usando un tipo di stringa?
Steven Evers,

@SnOrfus Trasmissione di un numero in un URL, input dell'utente, funzioni e altre cose comuni alle lingue non tipizzate staticamente.
TheLQ

Questo è anche un problema in C, poiché il valore di una stringa tra virgolette è un puntatore, che può essere convertito in un numero intero, e questo può far sì che costrutti che sembrano avere senso compilarsi correttamente ma produrre assurdità. In C ++, puoi definire le funzioni di conversione con la parola chiave explicit, che interrompe le conversioni di tipo implicite, ma ci sono ancora problemi.
David Thornley,

@TheLQ: se si tratta di input dell'utente, devi convalidarlo per capire se è un numero. Come ha detto @Slokun. Se stai leggendo dati da un file, puoi aspettarti che i dati numerici si trovino dove dovrebbero, ma avere un'eccezione sollevata in caso di corruzione del disco è spesso meglio che avere un 0valore casuale per un certo valore.
intuito il

12

goto : anche se in rari casi va bene, è spesso usato male e porta a programmi difficili da leggere.


Buon dio si. xkcd.com/292
TheLQ

3
Ho visto il contrario dove consentire l'uso giudizioso di goto avrebbe salvato un programma da 3 milioni di righe di codice.
Dave

2
Ah, iperbole ... Una valida tecnica letteraria.
Robert Harvey,

11

NESSUNA

Solo perché una funzione viene utilizzata in modo improprio frequentemente non la rende dannosa.

IMHO l'intero "è considerato dannoso" è la Reductio ad Hitlerum delle discussioni sul linguaggio di programmazione.

La maggior parte, se non tutte, delle caratteristiche "dannose" hanno, o avevano originariamente, un caso d'uso molto valido o sono semplicemente metodi di convenienza in primo luogo. Spetta agli sviluppatori comprendere i pro, i contro e il codice di conseguenza.

Se le tue domande fossero pensate per essere qualcosa del tipo "quali caratteristiche del linguaggio hanno insidie ​​comuni o sfortunati effetti collaterali", la mia risposta sarebbe diversa.

[modifica] Per essere chiari: non intendo l'uso continuato di metodi deprecati. Se gli sviluppatori stanno deprezzando / rimuovendo una funzionalità, è necessario utilizzare la sostituzione. Mi riferisco al concetto secondo cui una parte corrente della lingua è considerata dannosa perché ad alcuni non piace ciò che incoraggia o il compromesso implicato nell'usarlo di cui molte persone discutono.


13
Non sono d'accordo, un buon contro esempio è la mia risposta. Il registro PHP globale era semplicemente male, non importa come li usi. Questo è il motivo per cui è stato deprecato e consiglia vivamente di non utilizzare mai sulla versione precedente di PHP.
HoLyVieR,

5
+1 Metti in mani sbagliate, qualsiasi costruzione linguistica è dannosa.
mouviciel,

5
Un buon punto ... anche se il 95% delle goto è cattivo, la funzione stessa vale comunque per l'altro 5%
edizioni

1
Penso che sia più come mettere il pulsante del sedile dell'eiettore accanto al pulsante di accensione / spegnimento della radio. La funzione stessa potrebbe non essere male, ma non prevenire danni da un uso accidentale è.
LennyProgrammers,

1
Penso che questo sia l'equivalente di programmazione di "le pistole non uccidono le persone, le persone lo fanno".
orbita il

7

L'autovivificazione (o altra funzione di associazione variabile sull'assegnazione (assegnazione | uso) è la funzione che ho trovato per darmi il maggior numero di bug.


+1 - Potremmo non essere d'accordo sullo zucchero iteratore ma questo è qualcosa che posso concordare con il 100%.
ChaosPandion,

7

PLEASEin INTERCAL. Non usarlo abbastanza, si lamenta. Usalo troppo, si lamenta.


2
Quel linguaggio non dovrebbe essere usato seriamente. È stato creato per essere un linguaggio di programmazione molto "unico", quindi è pieno di cose (ad es. Come mai - appena sopra la mia mente) che non hanno senso.
ShdNx,

4
Ho pensato che sarebbe stato ovvio, ma sì, sono consapevole che non è un linguaggio serio.
Alan Pearce,

2
Mi dispiace, alcune persone sono troppo serie da queste parti.
Marco C

1
Ho appena scoperto la lingua la scorsa settimana su Wikipedia ed è stato spazzato via da quanto fosse popolare (ed è ancora O_O).
Oliver Weiler,

Esistono diverse lingue "difficili" e sono sempre popolari, perché i programmatori tendono a fare il lavoro a causa dell'amore per l'inseguimento. Molto popolare anche per le domande di intervista in quanto sono deliberatamente ottuse, stimolanti e difficili.
orbita il

7

Sebbene alcune persone non siano d'accordo con l'uomo o le varie cose che dice, molti JavaScript di Douglas Crockford : Le parti buone sono fondamentalmente questa domanda applicata a JS. Tra le lamentele di Crockford:

  • Ambito globale per impostazione predefinita per tutto (DC mostra come utilizzare funzioni / oggetti come spazi dei nomi e delimitatori di ambito per risolvere questo problema.)

  • Dichiarazioni come with, il cui comportamento di fallimento è quello di definire le cose nello spazio dei nomi globale. (Gah! È come se il motto JS fosse se fallisci, quindi fallisci il più duramente possibile !)

  • Comportamento imprevisto con l' ==operatore, che in sostanza richiede di utilizzare sempre l' ===operatore.

  • Inserimento punto e virgola.

Davvero un sacco di JS dovrebbe essere considerato dannoso, forse anche l'intero linguaggio, ma le parti buone sono così dannatamente buone che in qualche modo compensano (almeno per me.)


6

"Errore silenzioso" in Flash Player come comportamento predefinito

Ok, non è proprio una caratteristica della lingua stessa, ma è ancora abbastanza correlata.

All'improvviso l'applicazione Flash / Flex smette di funzionare e nessuno può darti il ​​minimo accenno di cosa sia successo f *. Nessun messaggio di errore, nessuna stacktrace, niente di niente. È solo che improvvisamente la transizione dello schermo non avviene (o avviene in modo completamente sbagliato), o i pulsanti non reagiscono più ai clic o le caselle combinate sono vuote invece di essere popolate con alcune voci.

Quella "caratteristica" da sola è responsabile di diverse segnalazioni di scrollate di spalle e di un sacco di capelli grigi che ho ricevuto. -.- Mentre spuntare qualche messaggio criptico in faccia all'utente non è neppure desiderabile, può almeno aiutare lo sviluppatore a risolvere il problema.

Ma Flash Player ti lascia pugnalare al buio, basandosi sulla descrizione dell'utente (mentre il problema potrebbe effettivamente provenire da una posizione completamente diversa nel codice che non ha nulla a che fare con ciò che l'utente stava facendo). Solo se si utilizza Debug Player si ottiene effettivamente la finestra popup con un messaggio di errore e uno stacktrace.

Tuttavia, può essere piuttosto interessante guardare film flash incorporati su determinati siti di notizie e ricevere messaggi ripetuti sui riferimenti Null dal lettore incorporato SWF utilizzato. : D


Le app per iPhone si bloccano anche senza preavviso a volte, in alcuni tempi strani
Ming-Tang,

3
Fallire in silenzio in qualcosa è piuttosto schifoso.

6

In C / C ++: che gli incarichi sono anche espressioni COMBINATE CON operatori di assegnazione = e confronto == molto simili. Non è una caratteristica dannosa di per sé, ma è un modo per introdurre facilmente bug (a volte sottili) digitando erroneamente l'operatore.

int i = 10;

someCode();

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

... combinato con il fatto che un numero intero o un puntatore è una condizione valida.
Barjak,

5

Modificatori di accesso in Java con impostazione predefinita della lingua privata del pacchetto e impostazione predefinita della convenzione di programmazione privata.


5

Sostituendo variabili non definite da una stringa vuota in guscio senza avvisi: rm -rf $nosuchvar/*.


+1 Argh! LOL - default orribile (ed esempio divertente / spaventoso)
Orbling

@Orbling qualcosa del genere ${varname:-/dev/null}potrebbe essere una soluzione alternativa ...
duros

Bene, ciò dimostra la necessità di controllare sempre in modo difensivo l'esistenza e il contenuto delle variabili prima dell'uso.
orbita il

4

La possibilità di girare in senso antiorario in LOGO. Wtf, consente solo di ruotare in senso orario 360 - x.


Bene, è da un po 'che non uso LOGO. Perché è dannoso?
Mason Wheeler,

5
Il logo può essere utilizzato per controllare un robot tartaruga reale e fisico. A volte vuoi che la tartaruga ruoti in una direzione specifica o giri più di una volta. Ad esempio, forse lo stai programmando per fare una sorta di danza.
Daniel Cassidy,

@ Mason, doveva essere uno scherzo.
jjnguy,

3
Sì, specialmente in LOGO For Clocks.
intuito il

1
Adoro il logo (vedi programmers.stackexchange.com/questions/21028/… ) ed è un linguaggio di insegnamento eccellente, in particolare per i giovani. Quando avevo 11 anni e ho usato per la prima volta il logo, la maggior parte della mia classe non conosceva la geometria, ma mi hanno detto che 90 era un quarto di giro e che conosceva da sinistra a destra. Quindi non è una caratteristica negativa - lo stesso del perché non ci moltiplichiamo per reciprocità invece di avere un operatore di divisione. Sì, lo so che è uno scherzo.
orbita il

4

Interruzione del thread da un altro thread

In Java e in altre lingue è possibile interrompere arbitrariamente un thread da un altro senza dare il tempo necessario per terminare correttamente il thread interrotto. Questa capacità è stata deprecata considerando l'enorme quantità di problemi che potrebbe portare in quasi tutte le situazioni.


Mentre suppongo che questo possa essere dannoso, ci sono volte che è estremamente utile (ad esempio, un debugger che supporta singoli punti di interruzione e di interruzione).
Jerry Coffin,

1
@Jerry Il debugging è un'altra cosa, non ferma il processo, lo mette in pausa.
HoLyVieR,

al contrario, interrompe il thread. Apparentemente, stai parlando di uccidere il thread, non solo di fermarlo. È un po 'più difficile giustificare ...
Jerry Coffin,

Tuttavia, non lo vedo necessariamente come una caratteristica del linguaggio. Più una cosa da biblioteca standard.
Jason Baker,

4

Variabili variabili in PHP

Solo perché $cannon intendi te$$should


1
Come al solito, Perl ... ha a disposizione la funzione (potenzialmente pericolosa), ha un modo semplice per best practice per disattivarlo ( use strict) e un modo semplice per riattivarlo esattamente nei casi in cui lo vorresti ( no strict 'refs').

1
Non ho mai trovato un uso per avere un nome di variabile dinamico. E le uniche volte che l'ho fatto, ha reso il codice illeggibile e un momento WTF qualche mese dopo quando ho rivisitato il codice.
TheLQ

Mmm, le applicazioni includono la metaprogrammazione con le odiose variabili del pacchetto di altre persone o la tabella dei simboli (che è un po 'diversa, suppongo).

1
@Joe Ti sfiderei a mostrarmi un esempio in cui le variabili variabili rendono più chiara una soluzione.
Kendall Hopkins,

1
Il commento era inteso come uno scherzo, mi dispiace non averlo chiarito, ma dato che chiedi qui è il miglior esempio in cui le variabili variabili rendono più chiara una soluzione . Devo ammettere che è un esempio piuttosto negativo.
Joe D,

3

La Withdichiarazione in Delphi viene in mente, anche se ci sono casi in cui è utile.


Un buon caso quando ho portato qualcosa da Delphi a Lazarus e il mio discendente di TControl conteneva "con Canvas do ... Larghezza, Altezza" riferendosi alle dimensioni del controllo, ma Lazarus TCanvas aveva la sua larghezza e Delphi, quindi questo ha portato a un codice compilato erroneamente
Arriva il


2

In Perl, il contesto scalare rispetto al contesto elenco può essere complicato. Ha alcuni punti positivi che rendono convenienti alcune operazioni, ma a volte ti imbatti in qualcosa di terribile, come cambiare completamente il significato di un operatore (potenzialmente da una distanza significativa nel codice).

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)

Non è giusto.

(Nasce dal tentativo di creare qualcosa che si comporta in qualche modo come il normale operatore di distanza, in modo da poter dire qualcosa in un ciclo come next if /start_regex/ .. /end_regex/).


L'uomo è così confuso. La cosa peggiore dell'apprendimento di Perl era cercare di farmi la testa.
glenatron,

Ho sempre pensato che tutto ciò che consente a una funzione di tornare in più modi fosse una comoda comodità.
orbita il

2

Sintassi di importazione relativa di Python 2.x. Supponiamo di avere un pacchetto x.pluginsche aggiunge il supporto per varie altre librerie per x. E supponiamo di avere un sqlalchemymodulo in x.pluginsmodo da poter aggiungere il supporto sqlalchemy a x. Cosa pensi che accadrà se aggiungo la seguente riga a sqlalchemy.py?

import sqlalchemy

La risposta è che il modulo proverà a importare se stesso. Ciò che fa questa sintassi è essenzialmente impossibile importare l'attuale pacchetto sqlalchemy globale. Python 2.5 ha aggiunto un modo per specificare che si tratta di un'importazione relativa:

from . import sqlalchemy

... ma non è fino a Python 3 che la prima sintassi è stata effettivamente eliminata (anche se può essere disabilitata in Python 2.6+ con from __future__ import absolute_import).


1

sun.misc.unsafe è il mio preferito in ogni momento; la raccolta di "ne avevamo bisogno per implementare le cose, ma davvero, davvero non credo che dovresti usarlo".


7
Ogni buon linguaggio dovrebbe avere un pacchetto non sicuro nella libreria standard. L'importazione di questo pacchetto mostra chiaramente la tua intenzione di fare cose insostenibili di basso livello. Le alternative sono: 1- Avere funzionalità non sicure nel linguaggio stesso (C ++ per esempio) e 2- Dover usare un linguaggio diverso come C per fare cose di basso livello (Python e Ruby per esempio). L'approccio del pacchetto non sicuro mi sembra molto meglio.
imgx64,

1

FORTRAN blocchi comuni. Se hai commesso un semplice errore, una parte di un'applicazione potrebbe ostruire i globi di un'altra parte.

FORTRAN assegnato istruzione goto / istruzione alter COBOL. Codice automodificante. Pericolo, avvertimento, mostri di spaghetti volanti !!


FORTRAN non aveva un'istruzione ALTER. FORTRAN aveva l'istruzione ASSIGN, con GOTO assegnato. COBOL aveva la dichiarazione ALTER, che aveva uno scopo simile.
John R. Strohm,

@Giovanni - grazie. La mia memoria di assegnazione / modifica è scarsa ... anche perché mi è stato insegnato a non usarli mai.
Stephen C,

1

Orientamento agli oggetti (da tutte le lingue tipizzate staticamente). Scommetto che questa funzione ha e continuerà a costare molto di più dei puntatori null. L'orientamento agli oggetti è utile solo in un messaggio dinamico che passa la lingua. Quindi dovrebbe essere eliminato anche da linguaggi dinamici come Python (poiché non utilizza il passaggio di messaggi ma la chiamata di subroutine convenzionale).


Python supporta (a tutti gli effetti) il messaggio di passaggio di smalltalk. Non si chiama così. In secondo luogo, penso che sia almeno un po 'discutibile definire dannosa una caratteristica del linguaggio così pervasivo.
Jason Baker,

L'orientamento agli oggetti migliora ancora il riutilizzo del codice e l'incapsulamento del codice / dati. Indipendentemente dagli usi statici / dinamici della funzione.
orbita il

@Orbling: rispetto a cosa? A mio avviso, i linguaggi di programmazione funzionale hanno un riutilizzo del codice più elevato e penso che il sistema di moduli di Haskell sia abbastanza buono per l'incapsulamento di codice / dati.
LennyProgrammers,

@ Lenny222 Rispetto alla programmazione imperativa standard. Anch'io preferisco l'approccio funzionale, Haskell è una mia lingua preferita.
Orbling

@Jason Baker: sicuramente è discutibile, ma essere così pervasivo è proprio ciò che lo rende così dannoso! L'OP ha chiesto la mia opinione e l'ho data. Solo perché un gruppo di Lemmings salta da una scogliera non rende sano il comportamento. In questo caso è matematicamente provato che OOP non funziona e il paradigma corretto è ben accettato: la teoria delle categorie è un modo per rappresentare le astrazioni (in realtà è la teoria delle astrazioni)
Yttrill

1

magic_quotesin PHP .

Gli sviluppatori inesperti fanno affidamento sul fatto che sia abilitato e quindi assumono che tutti gli input dell'utente siano evitati per l'uso in una query SQL o si basano sul fatto che sono disabilitati e quindi sempre sfuggono al loro input.

Quando si presume che sia abilitato e quindi eseguendo il codice su un sistema in cui non lo è, si aprono ampi fori di iniezione SQL.

Se si presume che sia disabilitato e non lo sia, si tradurrà in barre rovesciate effettivamente memorizzate nel DB, causando stringhe brutte / errate.

Inoltre, non esiste un modo estremamente semplice per gestire entrambi i casi: è necessario verificare se è abilitato utilizzando get_magic_quotes_gpc()e quindi applicare stripslashes()su tutti i valori negli $_*array, poiché array_mapnon è ricorsivo, è necessaria una funzione personalizzata per questo.


Oppure potresti semplicemente usare query con parametri.
Pieter B,

Anche allora otterrai barre rovesciate se le virgolette magiche sono abilitate e non te l'aspettavi.
ThiefMaster,

-3

La funzionalità della lingua che consente ai programmatori di scrivere codice non commentato o senza commenti.


1
E come risolvere questo?
Maniero,

1
@bigown: implementando la funzione comment-or-die: D.
tia,

3
Si chiama Literate Programming. en.wikipedia.org/wiki/Literate_programming
Barry Brown

2
Questa non è una funzionalità, ma è un bug estremamente famoso nel front-end dell'utente, la maggior parte delle persone lo conosce con il suo nome latino: Homo Sapiens.
Joe D,

-3

uscendo un po 'su un arto qui - funzioni nulle. una funzione fa sempre qualcosa, quindi dovrebbe restituire il risultato o qualche altra informazione riguardo al suo successo o fallimento.


3
Pascal aveva procedure (nessun valore di ritorno) e funzioni (valore di ritorno).
Jon Onstott,

Le funzioni fanno sempre qualcosa (bene di solito, il segnaposto funziona chiunque?) , Ma spesso non è necessario dirlo a nessuno.
orbita il

-4

POKE in BASIC ...


7
POKE è stato fantastico.
Shog9

2
All'inizio il poke era l'unico modo ragionevole per ottenere certe cose in maniera basilare. Music on a Apple] [mi viene in mente ...
Bill,

2
Non potresti fare molto senza POKE su un Commodore 64, se ricordo bene.
MetalMikester

1
Non dimenticare PEEK, entrambi essenziali.
orbita il

-5

Dovrei dire la raccolta dei rifiuti. Non elimina la necessità di pensare alla gestione della memoria, ma elimina la percezione della necessità di pensare alla gestione della memoria, che troppo spesso elimina il pensiero reale, e quindi ottieni enormi porci di risorse e non sai perché. Soprattutto quando il comportamento dei moderni GC generazionali potrebbe essere descritto senza troppa iperbole come "una grande perdita di memoria in base alla progettazione" comunque.


2
Se hai riferimenti presenti in qualche collezione da qualche parte, hai altri problemi.
Chinmay Kanchi,

2
Ecco perché le lingue gc hanno riferimenti deboli :)
Chinmay Kanchi,

4
Mentre GC ha certamente sia punti di forza che di debolezza, dovrei dire che Mason ha molto più ragione che torto su questo. In effetti, ho visto che le persone che usano GC trascorrono molto tempo extra nella gestione della memoria perché hanno finito per cercare di hackerare le cose dopo il fatto invece di pianificarle in anticipo. In genere, GC impedisce anche la distruzione deterministica, il che comporta un lavoro extra nella gestione di tutte le risorse diverse dalla memoria.
Jerry Coffin,

3
@ChaosPandion: Sono davvero un pazzo se penso che, su una moderna macchina multitasking, per evitare che il paging rovini le prestazioni del tuo sistema, la memoria dovrebbe essere rilasciata il prima possibile? Nessun GC è mai riuscito ad avvicinarsi al raggiungimento di quel risultato, e in effetti il ​​garbage collector generazionale, che dovrebbe essere la migliore varietà più moderna che esista, fa esattamente il contrario: per ottenere le migliori prestazioni, deve rilasciare memoria il più tardi possibile. Non vedo che come sempre lo strumento giusto per qualsiasi lavoro, non quando rallenta i miei altri programmi. Sono un pazzo per quello?
Mason Wheeler,

2
@ Barry: è deterministico all'interno del programma. Se ho finito con un blocco di memoria da 5 KB, chiedo subito altri 5 KB, cosa succede? In un sistema di raccolta dati inutili, è necessario richiedere un nuovo blocco da 5 KB, anche se un blocco perfettamente funzionante è rimasto inutilizzato, a meno che il GC non sia stato eseguito nel frattempo, nel qual caso è possibile riciclare il vecchio blocco. Con malloc e gratuito, sarai sempre in grado di riciclare il vecchio blocco. Moltiplicalo per alcune centinaia di migliaia e diventa un vero problema.
Mason Wheeler,

-5

C, e sicuramente C ++: aritmetica del puntatore. Consentire alle persone di convertire numeri interi in indirizzi di memoria richiede problemi.

E forse anche l'accesso non elaborato ai puntatori?

In C ++ hai riferimenti che rendono i puntatori quasi completamente inutili. Per i restanti casi i puntatori intelligenti devono essere considerati obbligatori.

Java dimostra inoltre che è possibile creare un linguaggio di programmazione che utilizza i puntatori senza consentire alle persone di accedere al valore del puntatore stesso.

Oltre ad null ... ma questa è una storia diversa.


5
I puntatori, sebbene a volte difficili da usare correttamente, sono molto necessari per un gran numero di operazioni di memoria efficienti.
Bill,

1
Vero. Ma consentire alle persone di convertire numeri interi in riferimenti di memoria su base regolare o aggiungere numeri agli indirizzi di memoria è per lo più dannoso in questi giorni secondo me. In C ++ hai riferimenti come un'alternativa perfettamente valida e puntatori intelligenti / puntatori automatici per quando hai davvero bisogno che sia un puntatore.
Asgeir S. Nilsen,

4
Questa risposta è valida solo se stai lavorando su uno stack software creato per nascondere i puntatori. In tutti gli altri casi, questa risposta è sbagliata.
Paul Nathan,

3
Alcuni linguaggi di programmazione devono disporre di puntatori disponibili in modo da poter scrivere tutti i sistemi operativi e le macchine virtuali per gli altri linguaggi di programmazione.

2
-1. C'è una ragione per cui hai bisogno dell'aritmetica ptr: iterare un punto è veloce che indicizzare. for(int i=0;i<SIZE;++i) ++arr[i]è più lento di for(int*i=arr;i<arr+SIZE;++i)*i++. Tutto ciò che Java è riuscito a dimostrare è che hai bisogno di un puntatore o non l'hai mai visto sun.misc.Unsafe? Se non hai bisogno di puntatori, spiega come scrivere una funzione di scambio generica usando Java. (es. int a = 1, b = 2; swap (a, b); assert (a == 2 && b == 1);). Per non parlare di tutti i problemi in c / c ++ che avresti se dovessi usare i riferimenti. Come chiamereste una funzione virtuale su una struttura opaca senza puntatori?
KitsuneYMG
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.