Gli autori : Yue Wang, wang.y@salesforce.com (Salesforce Research Asia) Weishi Wang, weishi.wang@salesforce.com (Salesforce Research Asia; Nanyang Technological University, Singapore) Shafiq Joty, sjoty@salesforce.com (Salesforce Research Asia; Nanyang Technological University, Singapore) Steven C.H. Hoi, shoi@salesforce.com (Salesforce Research Asia) Gli autori : Yue Wang, wang.y@salesforce.com (Ricerca di Salesforce Asia) Weishi Wang, weishi.wang@salesforce.com (Salesforce Research Asia; Nanyang Technological University, Singapore) Shafiq Joty, sjoty@salesforce.com (Salesforce Research Asia; Nanyang Technological University, Singapore) Steven C.H. Hoi, shoi@salesforce.com (Salesforce Research Asia) astratto I modelli semistrutturati per i linguaggi naturali (NL) come BERT e GPT sono stati recentemente dimostrati di trasferire bene ai linguaggi di programmazione (PL) e di beneficiare in larga misura di un ampio set di compiti correlati al codice. Nonostante il loro successo, la maggior parte dei metodi attuali si basano su un codice-only (o decoder-only) pre-training che è subottimale per la generazione (resp. comprensione) dei compiti o il trattamento del snippet del codice allo stesso modo di NL, trascurando le caratteristiche speciali di PL come i tipi di token. Abbiamo presentato CodeT5, un modello di codice-decoder-transformer unificato pre-trenato che sfrutta meglio la semantica del codice trasmesso dai codice-assegnati . https://github.com/salesforce/CodeT5 1 Introduzione Modelli di linguaggio pre-addestrati come BERT ( di Il Pd ( di T1 e T5 ( di In genere impiegano un paradigma pre-allenamento e poi fine-tune che mira a derivare rappresentazioni linguistiche generiche attraverso una formazione auto-supervisionata su dati non etichettati su larga scala, che possono essere trasferiti a vantaggio di molteplici compiti a valle, specialmente quelli con annotazione di dati limitata. Ispirati al loro successo, ci sono molti tentativi recenti di adattare questi metodi pre-allenamento per il linguaggio di programmazione (PL) ( di · di · di ), mostrando risultati promettenti su compiti correlati al codice. Devlin et al. 2019 Radford et al. 2019 Raffaele et al. 2020 Svizzera e di al. 2020 Canada e al. 2020 Feng et al. 2020 Tuttavia, nonostante il loro successo, la maggior parte di questi modelli si basa su un modello solo codificatore simile a BERT ( di · di ) o un modello solo decoder come il GPT ( di In questo caso, è necessario eseguire un'analisi del sistema di controllo e di controllo dei dati (ad esempio, CodeBERT ( , Inoltre, la maggior parte dei metodi esistenti semplicemente impiegano le tecniche di pre-allenamento NLP convenzionali sul codice sorgente considerandolo come una sequenza di token come NL. Questo in gran parte ignora le ricche informazioni strutturali nel codice, che è vitale per comprendere pienamente la semantica del codice. Svitkovskiy et al. 2020 Feng et al. 2020 canadese e di al. 2020 Feng et al. 2020 In questo lavoro, presentiamo CodeT5, un modello pre-addestrato di codice-decodificatore che considera le informazioni di tipo token nel codice. di (Seq2Seq) pre-addestramento e ha dimostrato di beneficiare sia la comprensione che i compiti di generazione in lingua naturale. Inoltre, proponiamo di sfruttare gli identificatori assegnati dallo sviluppatore nel codice. Quando scrivono programmi, gli sviluppatori tendono ad impiegare identificatori informativi per rendere il codice più comprensibile, in modo che questi identificatori generalmente preservino la ricca semantica del codice, l’identificatore “binarySearch” nella figura Per unire tali conoscenze specifiche del codice, proponiamo un nuovo obiettivo consapevole dell'identificatore che addestra il modello a distinguere quali token sono identificatori e a recuperarli quando sono mascherati. Raffaele et al. 2020 e.g., 2 Inoltre, proponiamo di sfruttare il codice e i commenti che lo accompagnano per imparare un migliore allineamento NL-PL. Gli sviluppatori spesso forniscono documentazione per i programmi per facilitare una migliore manutenzione del software ( di ), in modo che tali coppie PL-NL siano ampiamente disponibili nella maggior parte del codice sorgente. In particolare, consideriamo la generazione NL→PL e la generazione PL→NL come attività duali e ottimizziamo simultaneamente il modello su di esse. de Souza et al. 2005 Iniziamo con il codice CodeT5 sui dati CodeSearchNet ( di di seguito ( di Per quanto riguarda i dati relativi alle attività di gestione dei dati, è opportuno sottolineare che i dati relativi alle attività di gestione dei dati relativi ai dati relativi alle attività di gestione dei dati relativi ai dati relativi alle attività di gestione dei dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati relativi ai dati. di ), tra cui due compiti di comprensione: rilevamento di difetti di codice e rilevamento di cloni, e compiti di generazione come la sintesi di codice, la generazione, la traduzione e il raffinamento. , esploriamo anche l'apprendimento multi-task per raffinare CodeT5 su più attività contemporaneamente utilizzando un codice di controllo delle attività come prompt sorgente. Giuseppe et al. 2019 Feng et al. 2020 Lu et al. 2021 1 Presentamo uno dei primi modelli unificati di codec-decoder CodeT5 per supportare sia la comprensione del codice che le attività di generazione, e permette anche l'apprendimento multi-task. Proponiamo un nuovo obiettivo di pre-allenamento consapevole dell'identificatore che considera le informazioni cruciali di tipo token (identificatori) dal codice.Inoltre, proponiamo di sfruttare le coppie NL-PL che sono naturalmente disponibili nel codice sorgente per imparare un migliore allineamento cross-modale. Espansivi esperimenti dimostrano che CodeT5 fornisce risultati all'avanguardia sui quattordici sottotatti di CodeXGLUE. Ulteriori analisi mostrano che il nostro CodeT5 può catturare meglio la semantica del codice con la proposta di pre-allenamento consapevole dell'identificatore e la doppia generazione bimodale beneficia principalmente i compiti NL↔PL. 2 Lavori correlati Pre-trained models based on Transformer architectures ( di In questo caso, è possibile eseguire un'analisi del sistema di controllo delle emissioni, che può essere suddivisa in tre categorie: ( di Rottola ( di ), and ELECTRA ( di , solo i modelli di decoder come il GPT ( di , e modelli di codice-decoder come MASS ( di Il Barcellona ( di T1 e T5 ( di Rispetto ai modelli solo-encoder e solo-decoder che favoriscono rispettivamente le attività di comprensione e di generazione, i modelli di encoder-decoder possono ben supportare entrambi i tipi di attività. Essi impiegano spesso obiettivi di pre-allenamento denoising sequenza-a-sequenza che corrompono l'ingresso sorgente e richiedono che il decoder li recuperi. Pre-training on Natural Language. Vasconi e al. 2017 Devlin et al. 2019 Liu e di al. 2019b Clark et al. 2020 Radford et al. 2019 La canzone et al. 2019 di Lewis et al. 2020 Raffaele et al. 2020 La formazione preliminare sul linguaggio di programmazione è un campo nascente in cui molti lavori recenti tentano di estendere i metodi di preparazione NLP al codice sorgente. di ) e Codebert ( , L'obiettivo di modellazione del linguaggio mascherato di BERT utilizza CuBERT per derivare la rappresentazione specifica del codice generico, e CodeBERT aggiunge ulteriormente una rilevazione token sostituita ( di ) compito di imparare la rappresentazione cross-modale NL-PL. Oltre ai modelli di stile BERT, ( di ) e ( di L’applicazione di GNU/Linux ( di (per il codice di completamento del compito). di Diversamente da loro, esploriamo modelli di codec-decoder basati su T5 per la preparazione del linguaggio di programmazione e supportiamo un set più completo di compiti. Pre-training on Programming Language. Canada e al. 2020 Il Feng e di al. 2020 Clark et al. 2020 Svitkovskiy et al. 2020 Liu et al. 2020 Dong e al. 2019 Rossi et al. 2020 Alcuni lavori emergenti ( di · di · di ) nella letteratura recente esplorano anche il quadro T5 sul codice, ma si concentrano solo su un sottoinsieme limitato di compiti di generazione e non supportano compiti di comprensione come noi. di ) basato su un altro codec-decoder modello BART può anche supportare sia le attività di comprensione e di generazione. Tuttavia, tutti i precedenti lavori semplicemente elaborano il codice nello stesso modo del linguaggio naturale e ignorano in gran parte le caratteristiche specifiche del codice. Clement et al. 2020 Mastropaolo et al. 2021 di Elnaggar et al. 2021 Ahmad et al. 2021 In questo caso, il codice di calibro ( di Incorpora il flusso di dati estratto dalla struttura del codice in CodeBERT, mentre ( di Proporre un obiettivo di deobfuscation per sfruttare l'aspetto strutturale di PL. Questi modelli si concentrano solo sulla formazione di un codice specifico migliore. ( di Per contro, ci concentriamo specificamente sugli identificatori che riservano la semantica del codice ricco e fondiamo tali informazioni in un modello Seq2Seq attraverso due nuovi compiti di tagging e di previsione dell'identificatore. Guo et al. 2021 Rossi et al. 2021 Guglielmo et al. 2021 3 Codice5 Il nostro CodeT5 si basa su un framework codificatore-decoder con la stessa architettura di T5 ( , ). It aims to derive generic representations for programming language (PL) and natural language (NL) via pre-training on unlabeled source code. As illustrated in Figure , estendiamo l'obiettivo denoising Seq2Seq in T5 proponendo due identificatori tagging e attività di previsione per consentire al modello di sfruttare meglio le informazioni di tipo token da PL, che sono gli identificatori assegnati dagli sviluppatori. per migliorare l'allineamento NL-PL, proponiamo ulteriormente un obiettivo bimodale dual learning per una conversione bidirezionale tra NL e PL. Raffaele et al. 2020 2 In seguito, introduciamo come CodeT5 codifica le entrate PL e NL (§ ) e le nostre proposte di identificazione-consapevolezza pre-allenamento compiti (§ ), followed by the fine-tuning with task-specific transfer learning and multi-task training (§ e) il 3.1 3.2 3.3 3.1 Codifica NL e PL Nella fase di pre-addestramento, il nostro modello riceverebbe PL-only o NL-PL come input a seconda che il snippet di codice abbia o meno le descrizioni NL accompagnate. Per gli in-puts bimodali NL-PL, li concateneremo in una sequenza con un token delimitatore [SEP] e rappresenteremo l'intera sequenza di input nel formato come = ([ClS] è il 1*, ..., n. 1*, [SEP], 1*, ..., cm*, [SEP]), dove e Denota il numero di token di parola NL e token di codice PL, rispettivamente. La sequenza di parole NL sarà vuota per le entrate unimodali PL-solo. x w c n m Al fine di catturare più caratteristiche specifiche del codice, proponiamo di sfruttare le informazioni di tipo token dal codice. Nomi di funzione e variabili) in quanto sono una delle caratteristiche più PL-agnostiche e riservano una ricca semantica di codice. In particolare, convertiamo il segmento PL in un albero di sintesi astratta (AST) e estrattiamo i tipi di nodi per ogni token di codice. Infine, costruiamo una sequenza di etichette binarie ∈ {0*, * 1} per il segmento PL, dove ciascuno ∈ {0*,* 1} rappresenta se il token di codice È un identificatore o no. di G, y m Il Yi Ci 3.2 I compiti di preparazione Ora introduciamo i nostri compiti di pre-allenamento proposti che consentono a CodeT5 di apprendere modelli utili da dati bimodali PL-only o NL-PL. L'applicazione del metodo di preparazione per la preparazione per l'applicazione per la preparazione per l'applicazione per l'applicazione per l'applicazione per l'applicazione per l'applicazione per l'applicazione ( di · di · di Questo obiettivo denoisante di solito prima corrompe la sequenza sorgente con alcune funzioni rumorose e quindi richiede il decoder per recuperare i testi originali. di che maschera in modo casuale spazi con lunghezze arbitrarie e poi prevede questi spazi mascherati combinati con alcuni token sentinel al decoder. Come illustrato nella figura di A. Identifier-aware Denoising Pre-training. La canzone et al. 2019 Raf-fel et al. 2020 di Lewis et al. 2020 Raffaele et al. 2020 Masked Span Prediction (MSP) 2 In particolare, impieghiamo lo stesso tasso di corruzione del 15% di T5 e assicuriamo che la lunghezza media dell'intervallo sia di 3 mediante campionamento uniforme di intervalli da 1 a 5 token. per il campionamento degli spazi prima della tokenizzazione dei sottoscrizioni, che mira a evitare di mascherare i sottoscrizioni parziali e si dimostra utile ( di In particolare, abbiamo pre-allenato un modello condiviso per vari PL per imparare robuste rappresentazioni cross-linguistiche. descriviamo la perdita di previsione mascherata come: Tutte le parole di maschera Sole e al. 2019 dove θ sono i parametri del modello, x \mask è l'ingresso mascherato, x mask è la sequenza mascherata da prevedere dal decoder con k indicando il numero di token in x mask, e xmask <t è la sequenza di span generata finora. Per integrare più informazioni strutturali specifiche al codice (il tipo di nodo di identificazione in AST) nel modello, proponiamo due compiti aggiuntivi: e Per completare il pre-allenamento. Identifier Tagging (IT) Previsioni di identificatori mascherati (MIP) • di Ha lo scopo di notificare il modello con la conoscenza se questo token di codice è un identificatore o meno, che condivide uno spirito simile di sintesi evidenziando in alcuni strumenti assistiti da sviluppatori. (b), mappiamo gli stati finali nascosti del segmento PL presso l'encoder CodeT5 in una sequenza di probabilità è ( 1*, ..., pm*), e calcolare una perdita di entropia incrociata binaria per l'etichettatura di sequenza: Identifier Tagging (IT) 2 p p dove are the encoder parameters. Note that by casting the task as a sequence labeling problem, the model is expected to capture the code syntax and the data flow structures of the code. θe • Different from the random span masking in MSP, we mask all identifiers in the PL segment and employ a unique sentinel token for all occurrences of one specific identifier. In the field of software engineering, this is called where changing identifier names does not impact the code semantics. Inspired by ( ), we arrange the unique identifiers with the sentinel tokens into a target sequence Come mostrato nella figura (c). We then predict it in an auto-regressive manner: Masked Identifier Prediction (MIP) obfuscation Rozière et al. 2021 I 2 where \I is the masked input. Note that è un compito più impegnativo che richiede al modello di comprendere la semantica del codice basata su codice oscurato e collegare le incidenze degli stessi identificatori insieme. x deobfuscation We alternately optimize these three losses with an equal probability, which constitutes our proposed identifier-aware denoising pre-training. In the pre-training phase, the decoder only sees discrete masked spans and identifiers, which is disparate from the downstream tasks where the decoder needs to generate either fluent NL texts or syntactically correct code snippets. To close the gap between the pre-training and fine-tuning, we propose to leverage the NL-PL bimodal data to train the model for a bidirectional conversion as shown in Figure (d). Specifically, we regard the NL→PL generation and PL→NL generation as dual tasks and simultaneously optimize the model on them. For each NL- Bimodal Dual Generation. 2 L'applicazione del codice di calcolo è stata eseguita con l'applicazione di un codice di calcolo e di un codice di calcolo con il codice di calcolo ( <java> e <en> per Java PL e inglese NL, rispettivamente). Questa operazione può anche essere vista come un caso speciale di mascherare la distanza di T5 mascherando l'intero segmento NL o PL dalle entrate bimodali. di G, 3.3 Fine-tuning CodeT5 After pre-training on large-scale unlabeled data, we adapt CodeT5 to downstream tasks via either task-specific transfer learning or multi-task learning. Code-related tasks can be categorized into generation and understanding tasks. For the former one, our CodeT5 can be naturally adapted with its Seq2Seq framework. For understanding tasks, we investigate two ways of either generating the label as a unigram target sequence ( , ), or predicting it from the vocabulary of class labels based on the last decoder hidden state following ( di ). Task-specific Transfer Learning: Generation vs. Understanding Tasks. Raffel et al. 2020 di Lewis et al. 2020 L'apprendimento multi-task è in grado di ridurre i costi di calcolo riutilizzando la maggior parte dei pesi del modello per molti compiti e ha dimostrato di migliorare la capacità di generalizzazione dei modelli nel pre-allenamento NL ( , 1) Noi seguiamo ( di ) to employ the same unified model for all tasks without adding any task-specific networks but allow to select different best checkpoints for different tasks. To notify the model with which task it is dealing with, we design a unified format of task control codes and prepend it into the source inputs as shown in Figure . For instance, we employ “Translate Java to CSharp:” as the source prompt for the code-to-code translation task from Java to CSharp. Multi-task Learning. Liu et al. 2019A Raffaele et al. 2020 1 As different tasks have different dataset sizes, we follow Conneau and Lample (2019) to employ a balanced sampling strategy. For N number of datasets (or tasks), with probabilities {qi} N i=1, we define the following multinomial distribution to sample from: dove ni è il numero di esempi per i-th attività e α è impostato su 0.7. Questo campionamento equilibrato mira ad alleviare il pregiudizio verso attività ad alta risorsa. 4 Experimental Setup 4.1 Set di dati pre-allenamento We follow Feng et al. (2020) to employ CodeSearchNet (Husain et al., 2019) to pre-train CodeT5, which consists of six PLs with both unimodal and bimodal data. Apart from that, we additionally collect two datasets of C/CSharp from BigQuery1 to ensure that all downstream tasks have overlapped PLs with the pre-training data. In total, we employ around 8.35 million instances for pretraining. Table 1 shows some basic statistics. To obtain the identifier labels from code, we leverage the tree-sitter2 to convert the PL into an abstract syntax tree and then extract its node type information. We filter out reserved keywords for each PL from its identifier list. We observe that PLs have different identifier rates, where Go has the least rate of 19% and Ruby has the highest rate of 32%. 4.2 Tokenizzatore specifico del codice Tokenization is a key ingredient for the success of pre-trained language models like BERT and GPT. They often employ a Byte-Pair Encoding (BPE) to-kenizer ( , ) to alleviate the Out-of-Vocabulary (OoV) issues. Specifically, we train a Byte-level BPE tokenizer following ( ) and set the vocabulary size to 32,000 as T5. We add additional special tokens ([PAD], [CLS], [SEP], [MASK0], ..., [MASK99]). This tokenzier is trained on all of our pre-training data with non-printable characters and low-frequent tokens (occurring <3 times) filtered. We compare it with T5’s default tokenizer and find that our tokenizer largely reduces the length of tokenized code sequence by 30% - 45% on downstream tasks. This will accelerate the training and especially benefit generation tasks due to the shorter sequence to predict. We also spot a severe problem for applying the T5’s default tokenizer on source code, where it would encode some common code tokens such as brackets [‘{’, ‘}’] into unknown tokens. Sennrich et al. 2016 Radford et al. 2019 4.3 Task Downstream e metriche Abbiamo coperto la maggior parte dei compiti di generazione e comprensione nel benchmark CodeXGLUE ( di ) and employ the provided public datasets and the same data splits following it for all these tasks. Lu et al. 2021 We first consider two cross-modal generation tasks. aims to summarize a function-level code snippet into English descriptions. The dataset consists of six PLs including Ruby, JavaScript, Go, Python, Java, and PHP from CodeSearchNet ( , ). We employ the smoothed BLEU-4 ( , ) to eval-uate this task. is the task to gen-erate a code snippet based on NL descriptions. We employ the Concode data ( , ) in Java where the input contains both NL texts and class environment contexts, and the output is a function. We evaluate it with BLEU-4, exact match (EM) accuracy, and CodeBLEU ( di che considera le corrispondenze sintattiche e semantiche basate sulla struttura del codice in aggiunta alla corrispondenza n-gramma. Code summarization Husain et al. 2019 Lin and Och 2004 Code generation Iyer et al. 2018 Ren et al. 2020 Inoltre, consideriamo due compiti di generazione code-to-code. aims to migrate legacy software from one PL to another, where we focus on translating functions from Java to CSharp and vice versa. aims to convert a buggy function into a correct one. We employ two Java datasets provided by ( ) with various function lengths: small (fewer than 50 tokens) and medium (50-100 tokens). We use BLEU-4 and exact match to evaluate them. Code translation Code refinement Tufano et al. 2019 We also investigate how CodeT5 performs on two understanding-based tasks. The first one is that aims to predict whether a code is vulnerable to software systems or not. We use the C dataset provided by ( di ) for experiment. The second task is which aims to measure the similarity between two code snippets and predict whether they have the same functionality. We experiment with the Java data provided by ( di ). We employ F1 score and accuracy for evaluating these two tasks respectively. In total, our CodeT5 supports six tasks and fourteen sub-tasks in CodeXGLUE with a unified encoder-decoder model. defect detection Zhou et al. 2019 clone detection Wang et al. 2020 4.4 Comparison Models Confrontiamo CodeT5 con modelli pre-addestrati SOTA (State-of-the-art) che possono essere classificati in tre tipi: codec-only, decoder-only e codec-decoder modelli. I modelli, si considera ROBERTA ( , ), RoBERTa (code) trained with masked language modeling (MLM) on code, CodeBERT ( , ) trained with both MLM and replaced token detection ( , ), GraphCode-BERT ( di ) using data flow from code, and DOBF ( , ) trained with the identifier deobfuscation objective. Note that although DOBF employs a Seq2Seq model during pre-training, it only aims to train a better encoder for downstream tasks without exploring the poten-tial benefit of the pre-trained decoder. encoder-only Liu et al. 2019b Feng et al. 2020 Clark et al. 2020 Guo et al. 2021 Rozière et al. 2021 For models, we compare GPT-2 ( , ) and its adaptations on code domain including CodeGPT-2, and CodeGPT-adapted. The difference is that the latter one utilizes a GPT-2 checkpoint for model initialization while the former one is trained from scratch. As models, the current SOTA model for the CodeXGLUE benchmark is PLBART ( di ) based on BART ( , ) architecture. For pre-training data, most of these models employ CodeSearchNet ( , ) except DOBF and PLBART. DOBF is pre-trained on 7.9M Java and 3.6M Python files from BigQuery while PLBART employs a much larger data with 470M Python and 210M Java functions, and 47M NL posts from StackOverflow. decoder-only Radford et al. 2019 encoder-decoder Ah-mad et al. 2021 Lewis et al. 2020 Husain et al. 2019 4.5 Model Configurations We build CodeT5 based on Huggingface’s T5 ( , ) PyTorch implementation e impieghiamo due dimensioni di CodeT5-small (60M) e CodeT5-base (220M). Abbiamo impostato le lunghezze massime di sorgente e di sequenza bersaglio rispettivamente a 512 e 256. Utilizziamo la precisione mista di FP16 per accelerare il pre-allenamento. Abbiamo impostato la dimensione del lotto a 1024 e impiegato il tasso di apprendimento di picco di 2e-4 con decomposizione lineare. Abbiamo pre-allenato il modello con l'obiettivo denoising per 100 epoche e l'allenamento dual bimodale per ulteriori 50 epoche su un cluster di 16 GPU NVIDIA A100 con memoria 40G. Il tempo totale di allenamento per CodeT5-small e CodeT5-base è di 5 e 12 giorni Raf-fel et al. 2020 3 In the fine-tuning phase, we find that the tasks in CodeXGLUE ( , ) sono abbastanza sensibili ad alcuni parametri ipertestuali come il tasso di apprendimento, i passaggi di formazione e la dimensione del lotto. condurre una ricerca di griglia e selezionare i migliori parametri in base al set di convalida. Lu et al. 2021 5 Results and Analysis In questa sezione, confrontiamo CodeT5 con i modelli SOTA su un ampio set di compiti CodeXGLUE (§ ), and investigate the effects of our bimodal dual generation and multi-task learning (§ ), followed by a detailed analysis on the proposed identifier-aware pre-training (§ ). 5.1 5.2 5.3 5.1 CodeXGLUE Downstream Tasks We evaluate two sizes of our model: CodeT5-small and CodeT5-base that are pre-trained with identifier-aware denoising. In addition, we consider the model that continues to train with bimodal dual generation (dual-gen) and show the results with multi-task fine-tuning. The results of all comparison models are obtained from their original papers and also the CodeXGLUE paper ( , ). Lu et al. 2021 We show code summarization results of smoothed BLEU-4 on six PL data in Table . We observe all our model variants significantly outperform prior work with either an encode-only (RoBERTa, CodeBERT, DOBF) or encoder-decoder framework (PLBART). Moreover, the salient performance gap between these two groups of models confirms that encode-only frameworks are suboptimal for generation tasks. Compared to the SOTA encoder-decoder model PLBART, we find that even our CodeT5-small yields better overall scores (also on Python and Java) given that our model is much smaller (60M vs. 140M) and PLBART is pre-trained with much larger Python and Java data (> 100 times). We attribute such improvement to our identifier-aware denoising pre-training and better employment of bi-modal training data Aumentando la dimensione del modello, la nostra base CodeT5 aumenta le prestazioni complessive di oltre 1,2 punti assoluti rispetto a PLBART. Code Summarization. 2 4 We compare CodeT5 with GPT-style models and PLBART in Table . Our CodeT5-small outperforms all decoder-only mod-els and also the SOTA PLBART, which again confirms the superiority of encoder-decoder models at generating code snippets. Moreover, our CodeT5-base further significantly pushes the SOTA results across three metrics. Particularly, it achieves around 4.7 points improvement on CodeBLEU over PLBART, indicating our CodeT5 can better comprehend the code syntax and semantics with the __help of identi__fier-aware pre-training. Code Generation. 3 Confrontiamo due compiti di generazione di codice per codice: traduzione di codice e raffinamento di codice in Tabella and further consider one naive copy baseline by copying the source input as the target prediction. In the code translation task, our CodeT5-small outperforms most of base-lines and obtains comparable results with PLBART, which shows the advantages of encoder-decoder models in the code-to-code generation setting. Our CodeT5-base further achieves consistent improvements over PLBART across various metrics for translating from Java to C# and vice versa. Code-to-Code Generation Tasks. 4 Qui mostriamo l'uscita di un CodeT5 di tradurre C# in Java in Figura . In this case, despite the poor BLEU score, CodeT5 is able to generate a function that reserves the same functionality and even has better readability compared to the ground-truth. This reveals that CodeT5 has a good generalization ability instead of memorizing and repeating what it has seen before. On the other hand, it also suggests that BLEU score is not a perfect evaluation metric for code generation tasks, where sometimes a higher score can instead reflect the problematic copy issues of neural models. 3 Un altro compito di generazione di codice a codice è il raffinamento del codice, un compito impegnativo che richiede di rilevare quali parti del codice sono buggy e correggerle generando una sequenza di codice senza bug. A causa della grande sovrapposizione del codice sorgente e del codice di destinazione, anche l'approccio di copia ingenua rilascia punteggi BLEU molto alti ma zero corrispondenze esatte. Pertanto, ci concentriamo sulla misura esatta (EM) per valutare questo compito. Come mostrato nella Tabella , we observe that EM scores for the small data are consistently higher than the medium one, indicating that it is harder to fix bugs for a longer code snippet. Our CodeT5-base significantly outperforms all baselines on EM and especially boosts over 4.8 points for the more challenging medium task (13.96 vs. GraphCodeBERT’s 9.10), reflecting its strong code understanding capability. 4 We compare with two understanding tasks of defect detection and clone detection in Table 5. Understanding Tasks. Specifically, we generate the binary labels as a unigram sequence from the decoder for the defect detection task, while for the clone detection task, we first obtain the sequence embedding of each code snippet using the last decoder state following ( ) and then predict the labels by measuring their similarity. Both CodeT5-small and CodeT5-base outperform all baselines on the defect detection task while CodeT5-base yields 2.6 accuracy score improvement than PLBART. For the clone detection task, our CodeT5 models achieve comparable results to the SOTA GraphCodeBERT and PLBART models. These results demonstrate that with an encode-decoder framework, our CodeT5 can still be adapted well for understanding tasks. Lewis et al. 2020 5.2 Effetti della doppia generazione bimodale e dell'apprendimento multitasking Esaminiamo gli effetti della doppia generazione bimodale sul pre-allenamento e l'apprendimento multi-task al fine-tuning. Il pre-allenamento bimodale porta miglioramenti costanti per la sintesi del codice e le attività di generazione sia sulla base CodeT5-small che sulla base CodeT5. Tuttavia, questo compito di pre-allenamento non aiuta e talvolta anche leggermente danneggia le prestazioni per la generazione PL-PL e le attività di comprensione. Ci aspettiamo che questo sia perché la doppia generazione bimodale impara un miglior allineamento tra PL e NL che beneficia naturalmente le precedenti attività che coinvolgono sia PL che NL. Come effetto collaterale, questo obiettivo potrebbe biasare il modello verso le attività PL-NL e influenzare le sue prestazioni sulle attività PL- Nell'apprendimento multi-task, in genere migliora la maggior parte dei compiti a valle tranne la traduzione del codice e la rilevazione dei difetti. In particolare, migliora notevolmente le prestazioni sulla sintesi del codice, il che non sorprende, poiché la sintesi del codice occupa la maggior parte dei sottotatti (sei su tredici) e quindi beneficia maggiormente dall'apprendimento multi-task. Un'altra possibile ragione è che la formazione multi-task con rilevamento dei difetti permetterebbe al modello di comprendere meglio la semantica del codice per la rilevazione dei bug, che è anche un passo intermedio necessario per il raffinamento del codice. 5.3 Analyzing Identifier-aware Pre-training We provide an ablation study to examine the contribution of each component in our identifier-aware objective. Specifically, we compare the performance of our CodeT5-small on four selected tasks by ablating each of the three objectives: masked span prediction (MSP), identifier tagging (IT), and masked identifier prediction (MIP). As shown in Table , we observe that generally removing one of the objectives would reduce the performance for all tasks, indicating that all objectives contribute to the better code understanding of our CodeT5. However, the effect of each objective differs across tasks. Specifically, removing MSP would largely reduce the performance of all generation tasks but instead increase the defect detection performance. This shows that masked span prediction is more crucial for capturing syntactic information for generation tasks. On the contrary, removing MIP would hurt the defect detection task the most, indicating that it might focus more on code semantic understanding. By combining these objectives, our CodeT5 can better capture both syntactic and semantic information from code. 6 We further provide outputs from CodeT5 and its variant without MIP and IT on code generation in Figure Abbiamo osservato che CodeT5 può generare correttamente la funzione esatta, mentre il modello senza MIP e IT non riesce a recuperare gli identificatori di “s2” e “hasField”. 4 We also investigate the identifier tagging performance and find it achieves over 99% F1 for all PLs, showing that our CodeT5 can confidently distinguish identifiers in code. We then check whether MSP and MIP tasks would have conflicts as they employ the same sentinel tokens for masking. In identifier masking, all occurrences of one unique identifier are replaced with the same sentinel token, resulting in a many-to-one mapping compared to the one-to-one mapping in span prediction. We compare models pre-trained with either MSP or MIP, and both on these two tasks in Table . We report the prediction accuracy and also the ratio of how often they can generate the same number of predictions as the sentinel tokens. We observe that pre-training only with either MIP or MSP would bias the model towards that task, achieving poor accuracy and higher mismatch in number of predictions when applied to the other task. Interestingly, we find that MIP-only objective can better recover the correct number of predictions in the MSP task than MSP-only does for the MIP task, meaning that it is easier to adapt from many-to-one mapping to one-to-one mapping and difficult for the opposite. At last, combining them can help our model to make a good trade-off on both tasks. 7 6 Conclusion We have presented CodeT5, a pre-trained encoder-decoder model that incorporates the token type information from code. We propose a novel identifier-aware pre-training objective to better leverage the identifiers and propose a bimodal dual generation task to learn a better NL-PL alignment using code and its comments. Our unified model can support both code understanding and generation tasks and allow for multi-task learning. Experiments show that CodeT5 significantly outperforms all prior work in most CodeXGLUE tasks. Further analysis also reveals its better code comprehension capability across various programming languages. Broader Impact and Ethical Consideration Our work generally belongs to NLP applications for software intelligence. With the goal of improving the development productivity of software with machine learning methods, software intelligence research has attracted increasing attention in both academia and industries over the last decade. Software code intelligence techniques can help developers to reduce tedious repetitive workloads, enhance the programming quality and improve the overall software development productivity. This would considerably decrease their working time and also could potentially reduce the computation and operational cost, as a bug might degrade the system performance or even crash the entire system. Our work addresses the fundamental challenge of software code pre-training, our study covers a wide range of code intelligence applications in the software development lifecycle, and the proposed CodeT5 method achieves the state-of-the-art performance on many of the benchmark tasks, showing its great potential benefit towards this goal. We further discuss the ethical consideration of training CodeT5 and the potential risks when applying it into real-world downstream applications: The training datasets in our study are source code including user-written comments from open source Github repositories and publicly available, which do not tie to any specific application. However, it is possible that these datasets would encode some stereotypes like race and gender from the text comments or even from the source code such as variables, function and class names. As such, social biases would be intrinsically embedded into the models trained on them. As suggested by ( ), interventions such as filtration or modulation of generated outputs may help to mitigate these biases in code corpus. Dataset bias. Chen et al. 2021 Our model pre-training requires non-trivial computational resources though we have tried our best to carefully design our experiments and improve experiments to save unnecessary computation costs. In fact, compared to the recent large-scale language model Codex ( , ), our CodeT5-base has a much smaller model size of 220M than theirs of 12B (∼ 55×). In addition, we experiment on Google Cloud Plat-form which purchases carbon credits to reduce its carbon footprint, training CodeT5-base produced around 49.25 kg CO2 which was totally off-set by the provider. Furthermore, we release our pre-trained models publicly to avoid repeated training for the code intelligence research community. Computational cost. Chen et al. 2021 e.g., As CodeT5 can be deployed to provide coding assistance such as code generation for aiding developers, automation bias of machine learning systems should be carefully considered, especially for developers who tend to over-rely on the model-generated outputs. Sometimes these systems might produce functions that superficially appear correct but do not actually align with the developer’s intents. If developers unintentionally adopt these incorrect code suggestions, it might cause them much longer time on debugging and even lead to some significant safety issues. We suggest practitioners using CodeT5 should always bear in mind that its generation outputs should be only taken as references which require domain experts for further correctness and security checking. Automation bias. Il codice di codice di codice di codice di codice di codice di codice di codice di codice di codice ( , ) and a small fraction of Google BigQuery, both of which are originally collected from public Github repositories. Pre-trained mod-els might encode some sensitive information ( personal addresses or identification numbers) from the training data. Though we have conducted multi-rounds of data cleaning to mitigate this before training our models, it is still possible that some sensitive information cannot be completely removed. Besides, due to the non-deterministic nature of generation models like CodeT5, it might produce some vulnerable code to harmfully affect the software and even be able to benefit more advanced malware development when deliberately misused. Security implications. Husain et al. 2019 di G, Riconoscimenti We thank Akhilesh Deepak Gotmare, Amrita Saha, Junnan Li, and Chen Xing for valuable discussions. We thank Kathy Baxter for the ethical review. We also thank our anonymous reviewers for their insightful feedback on our paper. References Wasi Uddin Ahmad, Saikat Chakraborty, Baishakhi Ray, and Kai-Wei Chang. 2021. e in , pages 2655–2668. Association for Computational Linguistics. Pre-allenamento unificato for program understanding and generation Proceedings of the 2021 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies, NAACL-HLT 2021, Online, June 6-11, 2021 Mark Chen, Jerry Tworek, Heewoo Jun, Qiming Yuan, Henrique Ponde de Oliveira Pinto, Jared Kaplan, Harrison Edwards, Yuri Burda, Nicholas Joseph, Greg Brockman, Alex Ray, Raul Puri, Gretchen Krueger, Michael Petrov, Heidy Khlaaf, Girish Sastry, Pamela Mishkin, Brooke Chan, Scott Gray, Nick Ryder, Mikhail Pavlov, Alethea Power, Lukasz Kaiser, Mohammad Bavarian, Clemens Win-ter, Philippe Tillet, Felipe Petroski Such, Dave Cum-mings, Matthias Plappert, Fotios Chantzis, Eliza-beth Barnes, Ariel Herbert-Voss, William Hebgen Guss, Alex Nichol, Alex Paino, Nikolas Tezak, Jie Tang, Igor Babuschkin, Suchir Balaji, Shantanu Jain, William Saunders, Christopher Hesse, Andrew N. Carr, Jan Leike, Joshua Achiam, Vedant Misra, Evan Morikawa, Alec Radford, Matthew Knight, Miles Brundage, Mira Murati, Katie Mayer, Peter Welin-der, Bob McGrew, Dario Amodei, Sam McCandlish, Ilya Sutskever, and Wojciech Zaremba. 2021. . , abs/2107.03374. Evaluating large language models trained on code Corr Kevin Clark, Minh-Thang Luong, Quoc V. Le e Christopher D. Manning. . In . OpenReview.net. ELECTRA: pre-training text encoders as discriminators rather than generators 8th International Conference on Learning Representations, ICLR 2020, Addis Ababa, Ethiopia, April 26-30, 2020 Colin B. Clement, Dawn Drain, Jonathan Timcheck, Alexey Svyatkovskiy, and Neel Sundaresan. 2020. . In , pagine 9052–9065. associazione per la linguistica computazionale. Pymt5: multi-mode translation of natural language and python code with transformers Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing, EMNLP 2020, Online, 16-20 novembre 2020 Alexis Conneau and Guillaume Lample. 2019. e in , pages 7057–7067. Modello di preparazione linguistica interlinguale Progressi nei sistemi di elaborazione delle informazioni neurali 32: Conferenza annuale sui sistemi di elaborazione delle informazioni neurali 2019, NeurIPS 2019, 8-14 dicembre 2019, Vancouver, BC, Canada Sergio Cozzetti B. de Souza, Nicolas Anquetil e Káthia Marçal de Oliveira. e in , pages A study of the documentation essential to software maintenance Proceedings of the 23rd Annual International Conference on Design of Communication: documenting & Designing for Pervasive Information, SIGDOC 2005, Coventry, UK, September 21-23, 2005 68 – 75 di ACM. Jacob Devlin, Ming-Wei Chang, Kenton Lee e Kristina Toutanova. . In , pages 4171–4186. BERT: pre-training of Trasformatori bidirezionali profondi per la comprensione del linguaggio Procedure della conferenza 2019 del capitolo nordamericano dell'Associazione per la linguistica computazionale: tecnologie del linguaggio umano, NAACL-HLT 2019, Minneapolis, MN, USA, 2-7 giugno 2019, Volume 1 (documenti lunghi e brevi) Li Dong, Nan Yang, Wenhui Wang, Furu Wei, Xi-aodong Liu, Yu Wang, Jianfeng Gao, Ming Zhou e Hsiao-Wuen Hon. . In Pagine da 13042 a 13054. Lingua unificata Modello di pre-allenamento per la comprensione e la generazione della lingua naturale Progressi nei sistemi di elaborazione delle informazioni neurali 32: Conferenza annuale sui sistemi di elaborazione delle informazioni neurali 2019, NeurIPS 2019, 8-14 dicembre 2019, Vancouver, BC, Canada Ahmed Elnaggar, Wei Ding, Llion Jones, Tom Gibbs, Tamas Feher, Christoph Angerer, Silvia Severini, Florian Matthes e Burkhard Rost. . , abs/2104.02443. Code-trans: Towards cracking the language of silicone’s codifica attraverso l'apprendimento profondo auto-supervisionato e l'alta Computing delle prestazioni CoRR Zhangyin Feng, Daya Guo, Duyu Tang, Nan Duan, Xi-aocheng Feng, Ming Gong, Linjun Shou, Bing Qin, Ting Liu, Daxin Jiang, and Ming Zhou. 2020. . In , pagine 1536–1547. associazione per la linguistica computazionale. Code-bert: un modello pre-addestrato per la programmazione e i linguaggi naturali Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing: Findings, EMNLP 2020, Online Event, 16-20 November 2020 Daya Guo, Shuo Ren, Shuai Lu, Zhangyin Feng, Duyu Tang, Shujie Liu, Long Zhou, Nan Duan, Alexey Svyatkovskiy, Shengyu Fu, Michele Tu-fano, Shao Kun Deng, Colin B. Clement, Dawn Drain, Neel Sundaresan, Jian Yin, Daxin Jiang, and Ming Zhou. 2021. e in di OpenReview.net. Graphcodebert: Pre-allenamento code representations with data flow 9a Conferenza internazionale sulle rappresentazioni dell’apprendimento, ICLR 2021, evento virtuale, Austria, 3-7 maggio 2021 Hamel Husain, Ho-Hsiang Wu, Tiferet Gazit, Miltiadis Allamanis, and Marc Brockschmidt. 2019. . , abs/1909.09436. Code-searchnet challenge: Evaluating the state of semantic code search CoRR Srinivasan Iyer, Ioannis Konstas, Alvin Cheung e Luke Zettlemoyer. . In , pages 1643–1652. Association for Computational Linguistics. Mappa del linguaggio al codice in programmatic context Procedure della conferenza 2018 sui metodi empirici nel trattamento del linguaggio naturale, Bruxelles, Belgio, 31 ottobre - 4 novembre 2018 Aditya Kanade, Petros Maniatis, Gogul Balakrishnan e Kensen Shi. . In , volume 119 of , pages 5110–5121. PMLR. Learning and evaluating Inserimento contestuale del codice sorgente Proceedings of the 37th International Conference on Machine Learning, ICML 2020, 13-18 luglio 2020, Virtual Event Procedure di ricerca sull'apprendimento automatico Mike Lewis, Yinhan Liu, Naman Goyal, Marjan Ghazvininejad, Abdelrahman Mohamed, Omer Levy, Veselin Stoyanov, and Luke Zettlemoyer. 2020. . In , pages 7871–7880. Association for Computational Linguistics. BART: pre-allenamento di sequenza a sequenza per la generazione di linguaggio naturale, la traduzione, and comprehension Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics, ACL 2020, Online, July 5-10, 2020 Chin-Yew Lin e Franz Josef, nel 2004. e in . di Orange: a method for evaluating automatic evaluation metrics for machine translation COLING 2004, 20th International Conference on Computational Linguistics, Proceedings of the Conference, 23-27 August 2004, Geneva, Switzerland Fang Liu, Ge Li, Yunfei Zhao e Zhi Jin. e in , pages 473–485. IEEE. Multi-task learning based pre-trained language model for Codice di completamento 35th IEEE/ACM International Conference on Automated Software Engineering, ASE 2020, Melbourne, Australia, September 21-25, 2020 Xiaodong Liu, Pengcheng He, Weizhu Chen e Jian-feng Gao. . In , pages 4487–4496. Association for Computational Linguistics. Reti neurali profonde multi-task for natural language understanding Proceedings of the 57th Conference of the Association for Computational Linguistics, ACL 2019, Florence, Italy, July 28- August 2, 2019, Volume 1: Long Papers Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Man-dar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer e Veselin Stoyanov. di . , abs/1907.11692. Roberta: A robustly optimized BERT pretraining approach Corr Shuai Lu, Daya Guo, Shuo Ren, Junjie Huang, Alexey Svyatkovskiy, Ambrosio Blanco, Colin B. Clement, Dawn Drain, Daxin Jiang, Duyu Tang, Ge Li, Li-dong Zhou, Linjun Shou, Long Zhou, Michele Tu-fano, Ming Gong, Ming Zhou, Nan Duan, Neel Sun-daresan, Shao Kun Deng, Shengyu Fu, and Shujie Liu. 2021. . , abs/2102.04664. Codexglue: un set di dati di riferimento per l'apprendimento automatico per la comprensione e la generazione di codice CoRR Antonio Mastropaolo, Simone Scalabrino, Nathan Cooper, David Nader-Palacio, Denys Poshyvanyk, Rocco Oliveto e Gabriele Bavota. e in , pages 336–347. IEEE. Utilizzo di un trasformatore di trasferimento testo-testo Supporto per compiti correlati al codice 43a IEEE/ACM International Conference on Software Engineering, ICSE 2021, Madrid, Spagna, 22-30 maggio 2021 Alec Radford, Jeffrey Wu, Rewon Child, David Luan, Dario Amodei e Ilya Sutskever. . , 1(8):9. Language I modelli sono apprendisti multitasking non supervisionati Apri il blog Colin Raffel, Noam Shazeer, Adam Roberts, Katherine Lee, Sharan Narang, Michael Matena, Yanqi Zhou, Wei Li e Peter J. Liu. . , 21:140:1–140:67. Exploring the limits di trasferimento dell'apprendimento con un unificato trasformatore testo-testo J. Mach. Learn. Res. Shuo Ren, Daya Guo, Shuai Lu, Long Zhou, Shujie Liu, Duyu Tang, Neel Sundaresan, Ming Zhou, Am-brosio Blanco e Shuai Ma. . , abs/2009.10297. Codebleu: a Metodo per la valutazione automatica della sintesi del codice Corr Baptiste Rozière, Marie-Anne Lachaux, Lowik Chanussot e Guillaume Lample. . In Traduzione senza supervisione di linguaggi di programmazione Advances in Neural Information Processing Systems 33: Annual Conference on Neural Information Processing Systems 2020, NeurIPS 2020, December . 6-12 gennaio 2020, virtuale Baptiste Rozière, Marie-Anne Lachaux, Marc Szafraniec, and Guillaume Lample. 2021. di . , abs/2102.07492. DOBF: A deobfuscation pre-training objective for programming languages Corr Rico Sennrich, Barry Haddow e Alexandra Birch. . In . The Association for Computer Linguistics. Neural machine translation of rare words with subword units Proceedings of the 54th Annual Meeting of the Association for Computational Linguistics, ACL 2016, August 7-12, 2016, Berlin, Germany, Volume 1: Long Papers Kaitao Song, Xu Tan, Tao Qin, Jianfeng Lu e Tie-Yan Liu. . In Il volume 97 , pages 5926–5936. PMLR. MASS: sequenza mascherata a pre-allenamento di sequenza per la generazione linguistica Proceedings of the 36th International Conference on Machine Learning, ICML 2019, 9-15 June 2019, Long Beach, California, USA Proceedings of Machine Learning Research Yu Sun, Shuohuan Wang, Yu-Kun Li, Shikun Feng, Xuyi Chen, Han Zhang, Xin Tian, Danxiang Zhu, Hao Tian e Hua Wu. . , abs/1904.09223. ERNIE: enhanced representation through knowledge integration CoRR Alexey Svyatkovskiy, Shao Kun Deng, Shengyu Fu, and Neel Sundaresan. 2020. . In , pagine 1433 – 1443 ACM. Intellicode compose: code generation using transformer ESEC/FSE ’20: 28th ACM Joint European Software Engineering Conference and Symposium on the Foundations of Software Engineering, Virtual Event, USA, November 8-13, 2020 Michele Tufano, Cody Watson, Gabriele Bavota, Massimiliano Di Penta, Martin White, and Denys Poshy-vanyk. 2019. . , 28(4) 19:1 19:29. An empirical study on learning bug-fixing patches in the wild via neural machine translation ACM Trans. Software Ing. Metodolo. Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, and Illia Polosukhin. 2017. e in , pages 5998–6008. Attention is all you need Avanti nei sistemi di elaborazione delle informazioni neurali 30: Conferenza annuale sui sistemi di elaborazione delle informazioni neurali 2017, 4-9 dicembre 2017, Long Beach, CA, USA Wenhan Wang, Ge Li, Bo Ma, Xin Xia, and Zhi Jin. 2020. . In , pages 261–271. IEEE. Detecting code clones with graph neural network and flow-augmented abstract syntax tree 27th IEEE International Conference on Software Analysis, Evolution and Reengineering, SANER 2020, London, ON, Canada, February 18-21, 2020 Yaqin Zhou, Shangqing Liu, Jing Kai Siow, Xiaon-ing Du, and Yang Liu. 2019. . In Pagine 10197 – 10207 Devign: Effective vulnerability identification by learning comprehensive program semantics via graph neural networks Progressi nei sistemi di elaborazione delle informazioni neurali 32: Conferenza annuale sui sistemi di elaborazione delle informazioni neurali 2019, NeurIPS 2019, 8-14 dicembre 2019, Vancouver, BC, Canada Daniel Zügner, Tobias Kirschstein, Michele Catasta, Jure Leskovec, and Stephan Günnemann. 2021. . In di OpenReview.net. Imparare la rappresentazione agnostico-linguistica della fonte code from structure and context 9th International Conference on Learning Representations, ICLR 2021, Virtual Event, Austria, May 3-7, 2021 Questo documento è disponibile in archivio sotto la licenza CC by 4.0 Deed (Attribution 4.0 International). Questo documento è under CC by 4.0 Deed (Attribution 4.0 International) license. Disponibile in archivio