2013-08-09 6 views
6

Il nuovo standard C++ 11 supporta le funzioni lambda, che ritengo sia una funzionalità utile. Capisco che gli standard C e C++ differiscano l'uno dall'altro, ma non capisco perché C11 non supporta le funzioni lambda. Penso che potrebbe avere molto uso.Perché C11 non supporta le funzioni lambda

C'è un motivo per cui gli sviluppatori dello standard C11 scelgono di non includere questa funzione?

+0

Benvenuto in SO. Questo sito è per domande tecniche, quindi penso che la tua domanda sia una sorta di limite, qui. Faresti meglio a chiedere questo in un forum o in un gruppo di discussione. Altrimenti si potrebbero anche trovare facilmente i verbali delle sessioni del comitato per gli standard C online e vedere cosa discutono. Non ricordo che questo sia stato discusso di recente. –

risposta

3

Questa è davvero solo la mia opinione, dal momento che non so cosa pensa la commissione.

Da un lato, Lisp supporta l'espressione lambda sin dalla sua nascita, che risale al 1958. Il linguaggio di programmazione C è nato nel 1972. Quindi l'espressione lambda ha in realtà una storia più lunga di C. Quindi se si chiede perché C11 non supporta l'espressione lambda, la stessa domanda può essere posta su C89.

D'altra parte, l'espressione lambda è sempre una cosa di programmazione funzionale ed è assorbita gradualmente nei linguaggi di programmazione imperativi. Alcune delle lingue "superiori" (ad es. Java, prima del previsto Java 8) non lo supportano ancora.

Infine, C e C++ si stanno sempre imparando gli uni dagli altri, quindi forse sarà nel prossimo standard C. Per ora, puoi dare un'occhiata a Blocks, un'estensione non standard aggiunta da Apple. Questo è un esempio di codice da Wikipedia:

#include <stdio.h> 
#include <Block.h> 
typedef int (^IntBlock)(); 

IntBlock MakeCounter(int start, int increment) { 
     __block int i = start; 

     return Block_copy(^ { 
       int ret = i; 
       i += increment; 
       return ret; 
     }); 

} 

int main(void) { 
     IntBlock mycounter = MakeCounter(5, 2); 
     printf("First call: %d\n", mycounter()); 
     printf("Second call: %d\n", mycounter()); 
     printf("Third call: %d\n", mycounter()); 

     /* because it was copied, it must also be released */ 
     Block_release(mycounter); 

     return 0; 
} 
/* Output: 
     First call: 5 
     Second call: 7 
     Third call: 9 
*/ 
7

2016 aggiornamento: lambda-stile di Apple con chiusure sono state ancora una volta presentato al gruppo di lavoro nel corso della riunione di Londra 2016, in un new proposal document che cerca di affrontare molti dei mancanze del precedente tentativo, riordinare la terminologia e le spiegazioni e approfondire il modo in cui le chiusure e le lambda possono essere fatte "a forma di C".

Dal the reception was cautiously positive (7-0-9 Sì/No/Astenuta), sembra molto probabile che qualcosa di simile a questo sarà presto disponibile nella lingua.


La risposta breve è semplicemente che il C non include le funzioni lambda perché nessuno ha ancora fatto una proposta accettabile per il gruppo di lavoro ISO C per includere funzioni lambda.

È possibile dare un'occhiata a un elenco di alcune delle proposte discusse dal gruppo di lavoro qui: http://www.open-std.org/jtc1/sc22/wg14/www/documents

L'unica proposta di lambda di ogni tipo che posso trovare in tale elenco sono blocchi di Apple (come dimostrato nella risposta di Yu Hao), nel documento N1451. Tale proposta è ulteriormente discussa in N1483, che lo confronta con lambda C++ e N1493 e N1542 che sono i verbali delle riunioni in cui sono stati presentati tali documenti.

C'erano diversi motivi per cui non poteva essere accettata la proposta di N1451, N1542 riportate in:

  • inizialmente la commissione ha avuto difficoltà a comprendere la proposta
  • utilizza citazioni errate e la terminologia che contraddice l'esistente C standard
  • è apparentemente vago e incompleto
  • Apple stava tentando di brevettare la funzione (non è chiaro se questo è un ostacolo alla standardizzazione o meno, ma assumerei così).210
  • Una caratteristica completamente nuova con completamente nuova semantica proposto nel 2010 avuto precisamente zero possibilità di essere pronto in tempo per il 2011, e avrebbe sostenuto il rilascio di C11
  • blocchi come presentato non sono compatibili con il C++ 11 lambdas

Sembra anche che non erano convinti che al momento dimostrasse un'utilità sufficiente. La standardizzazione C sembra essere molto conservativa e, con un solo compilatore principale che implementa la funzione, è probabile che vorrebbe aspettare e vedere come compete con i lambda C++ e se qualcun altro lo raccoglie. Non è realmente una funzione "C" in contrasto con una funzione "Clang" fino a quando più compilatori lo stanno offrendo.

Detto questo, i voti della commissione apparentemente si appoggiano leggermente a favore del lungometraggio (6-5-4 Sì/No/Astenuto), ma non abbastanza per il consenso necessario per includerlo.

Per quanto ne so, l'altro grande, C++ 11 lambda, non è stato proposto per l'inclusione in C da parte di nessuno; e se non lo chiedi non ottieni.

Qualsiasi proposta di lambda in C aggiungerebbe un gran numero di nuove regole su vite e luoghi variabili e la copia e l'allocazione e ... ecc. Per molte persone questo potenzialmente inizia a sembrare molto simile a un C, con valori che vengono spostati dietro la parte posteriore del programmatore o che hanno improvvisi cambiamenti imprevisti nel loro ciclo di vita - evitare questo genere di cose è la metà del motivo per cui le persone scelgono di scrivere in C al giorno d'oggi. Quindi deve esserci anche una proposta che in realtà coincide con la "filosofia" di C prima che possa essere presa sul serio. Sono sicuro che questo può essere fatto, ma entrambe le grandi proposte finora sono state progettate per linguaggi con una "filosofia" molto diversa in cui questo genere di cose è meno di un ostacolo, e non necessariamente riflettono lo scopo di C e personaggio come stanno attualmente.

+0

Come suggeriamo funzionalità al gruppo di lavoro ISO C senza essere membri di ISO o ANSI? Mi piacerebbe suggerire il supporto del tipo UTF-8 a C2x. – MarcusJ

+0

@MarcusJ? Il supporto UTF-8 è già in C11. – Leushenko

+0

Non utilizzabile in nessuna forma. – MarcusJ

8

C è pensato per essere un linguaggio piccolo e semplice. Omette deliberatamente funzioni di alto livello quando le stesse cose possono essere fatte con mezzi più semplici. Ha lo scopo di fornire solo le funzionalità di base che sono assolutamente necessarie per la programmazione portatile.

C non ha riferimenti perché sono solo indicatori. C non ha classi, ereditarietà e funzioni virtuali, perché puoi semplicemente usare le strutture e creare vtables tu stesso usando i puntatori di funzione. Non ha un garbage collector perché i programmatori possono tenere traccia delle allocazioni di memoria, non ha template perché sono in realtà solo macro. Se hai bisogno di eccezioni puoi usare longjmp, e invece di namespace devi semplicemente aggiungere prefissi ai nomi.

L'aggiunta di una di queste scorciatoie di alto livello potrebbe rendere la programmazione un po 'più comoda, ma ciò comporta il costo di rendere la lingua più complicata, che non deve essere sottovalutata. È una pendenza scivolosa che conduce direttamente al caos che è diventato C++.

C non ha funzioni lambda perché non sono realmente necessarie. Invece puoi semplicemente usare una funzione statica e inserire il contesto in una struttura.

+0

Non sono d'accordo con l'ultimo paragrafo. Non è "non proprio necessario". I puntatori di funzione hanno meno probabilità di essere in linea rispetto a lambdas https://stackoverflow.com/questions/13722426/why-can-lambdas-be-better-optimized-by-the-compiler-than-plain-functions che causa chiamate di funzione ripetitive con il puntatore rallenta per operazioni come qsort – texasbruce