{"id":32464,"date":"2019-10-31T21:47:12","date_gmt":"2019-10-31T18:47:12","guid":{"rendered":"https:\/\/prohoster.info\/blog\/eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools\/"},"modified":"2019-10-31T21:47:12","modified_gmt":"2019-10-31T18:47:12","slug":"eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools","title":{"rendered":"Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Probabilmente, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/\">Eclipse<\/a><\/noindex> non ha pi\u00f9 bisogno di presentazioni particolari. Molti conoscono Eclipse grazie agli Eclipse Java development tools (<noindex><a rel=\"nofollow\" href=\"http:\/\/www.eclipse.org\/jdt\/\">JDT<\/a><\/noindex>). Questa popolare IDE Java open-source \u00e8 associata da molti sviluppatori alla parola \u201cEclipse\u201d. Tuttavia, Eclipse \u00e8 anche una piattaforma estensibile per l'integrazione degli strumenti di sviluppo (Eclipse Platform), e una serie di IDE costruite su di essa, tra cui JDT. Eclipse \u00e8 anche l'Eclipse Project, un progetto di alto livello che coordina lo sviluppo dell'Eclipse Platform e di JDT, e l'Eclipse SDK, il risultato di tale sviluppo. Infine, Eclipse \u00e8 una Fondazione open-source con una vasta comunit\u00e0 di progetti, non tutti scritti in Java o correlati agli strumenti di sviluppo (ad esempio, progetti <noindex><a rel=\"nofollow\" href=\"https:\/\/iot.eclipse.org\/\">Eclipse IoT<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/science.eclipse.org\/\">Eclipse Science<\/a><\/noindex>). Il mondo di Eclipse \u00e8 molto variegato.<\/p>\n<p>In questo articolo, di natura panoramica, cercheremo di esaminare alcune basi dell'architettura di Eclipse come piattaforma per la costruzione di strumenti di sviluppo integrati e fornire un'introduzione ai componenti di Eclipse che costituiscono la base della piattaforma tecnologica per il \u201cnuovo Configuratore\u201d 1C: Enterprise, <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/release_IDE\/\">1C:Enterprise Development Tools<\/a><\/noindex>. Naturalmente, tale esame sar\u00e0 inevitabilmente superficiale e piuttosto limitato, anche perch\u00e9 ci rivolgiamo non solo agli sviluppatori Eclipse come pubblico target. Tuttavia, speriamo che anche gli sviluppatori Eclipse esperti possano trovare informazioni interessanti nell'articolo. Ad esempio, parleremo di uno dei \u201csegreti di Eclipse\u201d, un progetto relativamente nuovo e poco conosciuto fino ad ora, <noindex><a rel=\"nofollow\" href=\"http:\/\/eclipse.org\/handly\/\">Eclipse Handly<\/a><\/noindex>, che \u00e8 stato fondato e sostenuto dalla societ\u00e0 1C.<br \/>\n<img decoding=\"async\" alt=\"Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/eb399a50bf86b6acce1df9e3d40848d4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Introduzione all'architettura di Eclipse<\/h2>\n<p>\nIniziamo esaminando alcuni aspetti generali dell'architettura di Eclipse utilizzando come esempio <noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/jdt\/overview.php\">Eclipse Java development tools<\/a><\/noindex> (JDT). La scelta di JDT come esempio non \u00e8 casuale. Questa \u00e8 stata la prima integrazione dell'ambiente di sviluppo apparsa in Eclipse. Gli altri progetti *DT di Eclipse, come Eclipse C\/C++ Development Tooling (CDT), sono stati creati in seguito e hanno preso in prestito sia i principi architetturali di base, sia frammenti di codice sorgente da JDT. Le basi architettoniche stabilite in JDT sono ancora oggi rilevanti per praticamente qualsiasi IDE costruita sopra l'Eclipse Platform, incluso 1C:Enterprise Development Tools.<\/p>\n<p>Innanzitutto, va sottolineato che Eclipse presenta una netta separazione architettonica, con una distinzione tra le funzionalit\u00e0 indipendenti dal linguaggio e quelle destinate a supportare specifici linguaggi di programmazione, e una separazione tra i componenti \"core\" (nucleo) indipendenti dall'interfaccia utente e i componenti legati al supporto dell'interfaccia utente.<\/p>\n<p>La piattaforma Eclipse definisce un'infrastruttura generale e indipendente dal linguaggio, mentre gli strumenti di sviluppo Java aggiungono a Eclipse un IDE Java completamente funzionale. Sia la piattaforma Eclipse che JDT sono composti da pi\u00f9 componenti, ciascuna delle quali appartiene o al \"nucleo\" indipendente dall'interfaccia utente o allo strato dell'interfaccia utente (fig. 1).<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/230825124962e721ecca7dfb7dee9a0c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Fig. 1. Piattaforma Eclipse e JDT<\/b><\/p>\n<p>Elencare i componenti principali della piattaforma Eclipse:<\/p>\n<ul>\n<li><b>Runtime<\/b> \u2014 Definisce l'infrastruttura dei plugin. Eclipse presenta un'architettura modulare. In sostanza, Eclipse \u00e8 una raccolta di \"punti di estensione\" e \"estensioni\".<\/li>\n<li><b>Workspace<\/b> \u2014 Gestisce uno o pi\u00f9 progetti. Un progetto \u00e8 composto da cartelle e file che si riflettono direttamente nel file system.<\/li>\n<li><b>Standard Widget Toolkit (SWT)<\/b> \u2014 Fornisce gli elementi di base dell'interfaccia utente, integrati con il sistema operativo.<\/li>\n<li><b>JFace<\/b> \u2014 Fornisce una serie di framework UI costruiti sopra SWT.<\/li>\n<li><b>Workbench<\/b> \u2014 Definisce la paradigma UI di Eclipse: editor, viste, prospettive.<\/li>\n<\/ul>\n<p>\nVale la pena dire che la piattaforma Eclipse offre anche molti altri componenti utili per la realizzazione di strumenti di sviluppo integrati, tra cui Debug, Compare, Search e Team. \u00c8 opportuno menzionare JFace Text, la base per la costruzione di \"editor intelligenti\" del codice sorgente. Purtroppo, anche una rapida panoramica di questi componenti, cos\u00ec come dei componenti dello strato UI, non \u00e8 possibile in questo articolo, pertanto, nella restante parte di questa sezione ci limiteremo a fornire una panoramica dei principali componenti \"core\" della piattaforma Eclipse e di JDT.<\/p>\n<h4>Core Runtime<\/h4>\n<p>\nL'infrastruttura dei plugin di Eclipse si basa su <noindex><a rel=\"nofollow\" href=\"https:\/\/www.osgi.org\/developer\/specifications\/\">OSGi<\/a><\/noindex> ed \u00e8 fornita dal progetto <noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/equinox\/\">Eclipse Equinox<\/a><\/noindex>. Ogni plugin Eclipse \u00e8 un bundle OSGi. La specifica OSGi definisce, tra le altre cose, i meccanismi di versioning e risoluzione delle dipendenze. Oltre a questi meccanismi standard, Equinox introduce il concetto di <i>punto di estensione<\/i>. Ogni plugin pu\u00f2 definire i propri punti di estensione e aggiungere funzionalit\u00e0 al sistema (\u00abestensioni\u00bb), utilizzando i punti di estensione definiti dallo stesso o da altri plugin. Una descrizione dettagliata dei meccanismi OSGi e Equinox esula da questo articolo. Si noti solo che la modularizzazione in Eclipse \u00e8 totale (ogni sottosistema, incluso il Runtime, \u00e8 composto da uno o pi\u00f9 plugin), e praticamente tutto in Eclipse \u00e8 un'estensione. Questi principi erano gi\u00e0 stati incorporati nell'architettura di Eclipse molto prima dell'implementazione di OSGi (all'epoca veniva utilizzata una tecnologia proprietaria, in gran parte analoga a OSGi).<\/p>\n<h4>Core Workspace<\/h4>\n<p>\nQuasi tutti gli ambienti di sviluppo integrati basati sulla Eclipse Platform funzionano con l'Eclipse workspace. \u00c8 proprio lo workspace a contenere normalmente il codice sorgente dell'applicazione in fase di sviluppo nell'IDE. Lo workspace \u00e8 direttamente mappato sul file system e consiste in progetti che contengono cartelle e file. Questi progetti, cartelle e file vengono definiti <i>risorse<\/i> workspace. L'implementazione dello workspace in Eclipse funge come una sorta di cache rispetto al file system, permettendo di accelerare notevolmente la navigazione nell'albero delle risorse. Inoltre, lo workspace offre una serie di servizi aggiuntivi, tra cui <noindex><a rel=\"nofollow\" href=\"https:\/\/eclipse.org\/articles\/Article-Resource-deltas\/resource-deltas.html\">il meccanismo di notifica delle modifiche alle risorse<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/eclipse.org\/articles\/Article-Builders\/builders.html\">l'infrastruttura dei builder incrementali<\/a><\/noindex>.<\/p>\n<p>La componente Core Resources (plugin org.eclipse.core.resources) \u00e8 responsabile del supporto dello workspace e delle sue risorse. In particolare, questa componente fornisce accesso programmatico allo workspace sotto forma di <i>modello di risorse<\/i>. Per lavorare in modo efficace con questo modello, i client necessitano di un modo semplice per rappresentare un riferimento a una risorsa. Dovrebbe essere desiderabile nascondere l\u2019oggetto che memorizza direttamente lo stato della risorsa nel modello dall'accesso ai client. Altrimenti, nel caso, ad esempio, di cancellazione di un file, il client potrebbe continuare a trattenere un oggetto che non \u00e8 pi\u00f9 presente nel modello, creando problemi. Eclipse risolve questo problema utilizzando il cosiddetto <i>handle<\/i> della risorsa. L\u2019handle funge da chiave (conosce solo il percorso della risorsa nello workspace) e controlla completamente l'accesso all'oggetto interno del modello che memorizza direttamente le informazioni sullo stato della risorsa. Questo design \u00e8 una variazione del pattern <noindex><a rel=\"nofollow\" href=\"http:\/\/wiki.c2.com\/?HandleBodyPattern\">Handle\/Body<\/a><\/noindex>.<\/p>\n<p>La figura 2 illustra l'idioma Handle\/Body applicato al modello delle risorse. L'interfaccia IResource rappresenta l'handle della risorsa ed \u00e8 un'API, a differenza della classe Resource, che implementa questa interfaccia, e della classe ResourceInfo, che rappresenta il body e che non \u00e8 un'API. \u00c8 importante sottolineare che l'handle conosce solo il percorso verso la risorsa rispetto alla radice del workspace e non contiene alcun riferimento alle informazioni sulla risorsa. Gli oggetti delle informazioni sulla risorsa formano il cosiddetto \u00abalbero degli elementi\u00bb (element tree). Questa struttura dati \u00e8 completamente materializzata in memoria. Per trovare un'istanza delle informazioni sulla risorsa corrispondente a un determinato handle, si esegue una scansione dell'albero degli elementi secondo il percorso memorizzato in questo handle.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/9d17cd95be3730ab6b5b9e6e3ed71ace.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Fig. 2. IResource e ResourceInfo<\/b><\/p>\n<p>Come vedremo in seguito, il design di base del modello delle risorse (che pu\u00f2 essere definito come basato su handle) \u00e8 utilizzato in Eclipse e anche in altri modelli. Per ora, elenchiamo alcune caratteristiche distintive di questo design:<\/p>\n<ul>\n<li>L'handle \u00e8 un oggetto di valore (value object). Gli oggetti di valore sono oggetti immutabili (immutable) la cui uguaglianza non si basa sull'identit\u00e0. Tali oggetti possono essere utilizzati in sicurezza come chiavi nei contenitori hash. Pi\u00f9 istanze di handle possono riferirsi alla stessa risorsa. Per il loro confronto, \u00e8 necessario utilizzare il metodo equals(Object).<\/li>\n<li>L'handle definisce il comportamento della risorsa, ma non contiene informazioni sullo stato della risorsa (le uniche informazioni che memorizza sono la \u00abchiave\u00bb, il percorso verso la risorsa).<\/li>\n<li>L'handle pu\u00f2 riferirsi a una risorsa inesistente (o a una risorsa che deve ancora essere creata, o a una risorsa gi\u00e0 eliminata). L'esistenza della risorsa pu\u00f2 essere verificata tramite il metodo IResource.exists().<\/li>\n<li>Alcune operazioni possono essere implementate a partire unicamente dalle informazioni memorizzate nello stesso handle (le cosiddette operazioni handle-only). Esempi includono IResource.getParent(), getFullPath(), ecc. La risorsa non deve necessariamente esistere per il successo dell'esecuzione di tale operazione. Le operazioni che richiedono che la risorsa esista per essere eseguite correttamente generano un'eccezione (CoreException) se la risorsa non esiste.<\/li>\n<\/ul>\n<p>\nEclipse fornisce un meccanismo di notifica efficace per le modifiche alle risorse del workspace (fig. 3). Le risorse possono variare sia a seguito delle azioni eseguite all'interno della stessa Eclipse IDE, sia per effetto della sincronizzazione con il file system. In entrambi i casi, ai clienti iscritti alle notifiche viene fornita una dettagliata informazione sui cambiamenti sotto forma di \"delta delle risorse\" (resource delta). Il delta descrive le modifiche tra due stati (sub-)alberi delle risorse del workspace ed \u00e8 esso stesso un albero, ogni nodo del quale descrive la modifica di una certa risorsa e contiene un elenco di delta di livello successivo, che descrivono le modifiche delle risorse figlie.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/8af412412ee97d205137ab70c8444a50.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Fig. 3. IResourceChangeEvent e IResourceDelta<\/b><\/p>\n<p>Il meccanismo di notifica basato sui delta delle risorse presenta le seguenti caratteristiche:<\/p>\n<ul>\n<li>Una singola modifica e molteplici modifiche si descrivono utilizzando la stessa struttura, poich\u00e9 il delta \u00e8 costruito secondo il principio della composizione ricorsiva. I clienti abbonati possono gestire le notifiche di modifica delle risorse attraverso una discesa ricorsiva nell'albero dei delta.<\/li>\n<li>Il delta contiene tutte le informazioni riguardanti la modifica di una risorsa, incluso il suo spostamento e\/o le modifiche ai \"marker\" ad essa associati (i marker rappresentano, ad esempio, gli errori di compilazione).<\/li>\n<li>Poich\u00e9 i riferimenti a una risorsa vengono effettuati tramite handle, il delta pu\u00f2 naturalmente riferirsi a risorse remote.<\/li>\n<\/ul>\n<p>\nCome vedremo tra poco, i principali componenti del design del meccanismo di notifica delle modifiche al modello delle risorse sono validi anche per altri modelli basati su handle.<\/p>\n<h4>JDT Core<\/h4>\n<p>\nIl modello delle risorse del workspace di Eclipse \u00e8 un modello fondamentale indipendente dal linguaggio. Il componente JDT Core (plugin org.eclipse.jdt.core) fornisce un'API per la navigazione e l'analisi della struttura del workspace dal punto di vista di Java, il cosiddetto \"modello Java\" (<i>modello Java<\/i>). Questa API \u00e8 definita in termini di elementi Java, a differenza dell'API sottostante del modello delle risorse, che \u00e8 definita in termini di cartelle e file. Le principali interfacce dell'albero degli elementi Java sono illustrate nella fig. 4.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/67bfd31e93eaa66aa94b30281693a318.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Fig. 4. Elementi del modello Java<\/b><\/p>\n<p>Il modello Java utilizza la stessa idiom handle\/body del modello delle risorse (fig. 5). IJavaElement \u00e8 il handle, mentre JavaElementInfo gioca il ruolo di body. L'interfaccia IJavaElement definisce un protocollo comune a tutti gli elementi Java. Alcuni dei suoi metodi sono handle-only: getElementName(), getParent(), ecc. L'oggetto JavaElementInfo memorizza lo stato dell'elemento corrispondente: la sua struttura e gli attributi.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/5b473cccfc8f258d563033ce334cb94f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Fig. 5. IJavaElement e JavaElementInfo<\/b><\/p>\n<p>Il modello Java presenta alcune differenze nell'implementazione del design di base handle\/body rispetto al modello delle risorse. Come accennato in precedenza, nel modello delle risorse, l'albero degli elementi, i cui nodi sono oggetti di resource info, \u00e8 completamente contenuto in memoria. Ma nel modello Java pu\u00f2 esserci un numero significativamente maggiore di elementi rispetto all'albero delle risorse, poich\u00e9 il modello rappresenta anche la struttura interna dei file .java e .class: tipi, campi e metodi.<\/p>\n<p>Per evitare la completa materializzazione dell'intero albero degli elementi in memoria, l'implementazione del modello Java utilizza una cache LRU di dimensioni limitate per l'element info, dove la chiave \u00e8 il handle IJavaElement. Gli oggetti element info vengono creati su richiesta mentre avviene la navigazione dell'albero degli elementi. In questo modo, gli elementi meno frequentemente utilizzati vengono espulsi dalla cache, mantenendo il consumo di memoria del modello limitato alla dimensione specificata della cache. Questo \u00e8 un ulteriore vantaggio del design basato su handle, che nasconde completamente tali dettagli di implementazione dal codice client.<\/p>\n<p>Il meccanismo di notifica per le modifiche agli elementi Java \u00e8, in generale, simile al meccanismo di monitoraggio delle modifiche alle risorse della workspace descritto in precedenza. Il client che desidera monitorare le modifiche nel modello Java si iscrive alle notifiche, che sono presentate sotto forma di oggetto ElementChangedEvent contenente IJavaElementDelta (fig. 6).<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/0402ec362078eaf50f47756e7f24de01.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Fig. 6. ElementChangedEvent e IJavaElementDelta<\/b><\/p>\n<p>Il modello Java non contiene informazioni sul corpo dei metodi o sulla risoluzione dei nomi, pertanto per un'analisi dettagliata del codice Java, JDT Core fornisce un ulteriore modello (non basato su handle): <noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/articles\/Article-JavaCodeManipulation_AST\/index.html\">albero di sintassi astratta<\/a><\/noindex> (abstract syntax tree, AST). L'AST rappresenta il risultato dell'analisi sintattica del testo sorgente. I nodi dell'AST corrispondono agli elementi della struttura del modulo sorgente (dichiarazioni, operatori, espressioni, ecc.) e contengono informazioni sulle coordinate dell'elemento corrispondente nel testo sorgente, oltre a (opzionalmente) informazioni sulla risoluzione dei nomi sotto forma di riferimenti a cosiddetti <i>bindings<\/i>I binding sono oggetti che rappresentano entit\u00e0 nominate, come tipi, metodi e variabili, noti al compilatore. A differenza dei nodi AST che formano un albero, i binding supportano riferimenti incrociati e, in generale, formano un grafo. La classe astratta ASTNode \u00e8 la classe base comune per tutti i nodi AST. Le sottoclassi di ASTNode corrispondono a specifiche costruzioni sintattiche del linguaggio Java.<\/p>\n<p>Poich\u00e9 gli alberi sintattici possono consumare una quantit\u00e0 significativa di memoria, JDT memorizza nella cache solo un AST per l'editor attivo. A differenza del modello Java, l'AST \u00e8 generalmente considerato un modello \"intermedio\" o \"temporaneo\", i cui elementi i clienti non dovrebbero mantenere riferimenti al di fuori del contesto dell'operazione che ha portato alla creazione dell'AST.<\/p>\n<p>I tre modelli elencati (modello Java, AST, binding) costituiscono insieme la base per la costruzione di \"strumenti di sviluppo intelligenti\" in JDT, tra cui un potente editor Java con vari \"assistenti\", diverse azioni per la manipolazione del codice sorgente (tra cui l'organizzazione dell'elenco di importazione dei nomi e la formattazione secondo lo stile impostato), strumenti di ricerca e refactoring. Il modello Java gioca un ruolo particolare, poich\u00e9 \u00e8 utilizzato come base per la rappresentazione visiva della struttura dell'applicazione in fase di sviluppo (ad esempio, in Package Explorer, Outline, Search, Call Hierarchy e Type Hierarchy).<\/p>\n<h2>Componenti Eclipse utilizzati in 1C:Enterprise Developments Tools<\/h2>\n<p>\nNella figura 7 sono mostrati i componenti di Eclipse che formano le fondamenta della piattaforma tecnologica per 1C:Enterprise Development Tools.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/248cceea47ee507b9ad22d6964738ee7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Figura 7. Eclipse come piattaforma per 1C:Enterprise Development Tools<\/b><\/p>\n<p><b>Piattaforma Eclipse<\/b> fornisce l'infrastruttura di base. Abbiamo esaminato alcuni aspetti di questa infrastruttura nella sezione precedente.<\/p>\n<p><b><noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/modeling\/emf\/\">Eclipse Modeling Framework<\/a><\/noindex><\/b> (<b>EMF<\/b>) fornisce strumenti generali per la modellazione dei dati strutturati. EMF \u00e8 integrato con Eclipse Platform, ma pu\u00f2 essere utilizzato anche separatamente, in normali applicazioni Java. Piuttosto spesso, i principianti nello sviluppo di Eclipse sono gi\u00e0 abbastanza familiari con EMF, anche se non comprendono del tutto le complessit\u00e0 di Eclipse Platform. Una delle ragioni di questa meritata popolarit\u00e0 \u00e8 il design universale, che include, tra l'altro, un'API unificata di meta-livello, che consente di lavorare in modo generico con qualsiasi modello EMF. Le implementazioni di base fornite da EMF per gli oggetti modello e il sottosistema di generazione del codice modello da meta-modello aumentano notevolmente la velocit\u00e0 di sviluppo e riducono il numero di errori. Inoltre, EMF include meccanismi di serializzazione dei modelli, tracciamento delle modifiche nel modello, e molto altro. <\/p>\n<p>Come qualsiasi strumento veramente universale, EMF \u00e8 adatto a una vasta gamma di compiti legati alla modellazione, ma alcune classi di modelli (ad esempio, i modelli basati su handle discussi sopra) potrebbero avere bisogno di strumenti di modellazione pi\u00f9 specializzati. Parlarne \u00e8 un compito ingrato, specialmente nei limiti di un solo articolo, poich\u00e9 \u00e8 un argomento di un libro a s\u00e9, e piuttosto spesso. Notiamo solo che un sistema di astrazioni di qualit\u00e0, alla base di EMF, ha permesso la nascita di una vasta gamma di progetti dedicati alla modellazione, che rientrano nel progetto di livello superiore <noindex><a rel=\"nofollow\" href=\"https:\/\/eclipse.org\/modeling\/\">Eclipse Modeling<\/a><\/noindex> insieme allo stesso EMF. Uno di questi progetti \u00e8 Eclipse Xtext.<\/p>\n<p><b><noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/Xtext\/\">Eclipse Xtext<\/a><\/noindex><\/b> fornisce un'infrastruttura di \u00abmodellazione testuale\u00bb. Xtext utilizza <noindex><a rel=\"nofollow\" href=\"http:\/\/www.antlr.org\/\">ANTLR<\/a><\/noindex> per l'analisi sintattica del testo sorgente e EMF per la rappresentazione del risultato ASG (grafo semantico astratto, che \u00e8 fondamentalmente una combinazione di AST e bindings), chiamato anche \"modello semantico\". La grammatica del linguaggio modellato tramite Xtext \u00e8 descritta nel proprio linguaggio Xtext. Questo consente non solo di generare una descrizione della grammatica per ANTLR, ma anche di ottenere un meccanismo di serializzazione dell'AST (cio\u00e8, Xtext fornisce sia il parser che l'unparser), suggerimenti contestuali e una serie di altri componenti linguistici. D'altro canto, il linguaggio di descrizione della grammatica utilizzato in Xtext \u00e8 meno flessibile rispetto, per esempio, al linguaggio di descrizione della grammatica in ANTLR. Quindi, a volte \u00e8 necessario \"modellare\" il linguaggio realizzato per Xtext, il che di solito non \u00e8 un problema quando si tratta di un linguaggio sviluppato da zero, ma pu\u00f2 essere inaccettabile per lingue con una sintassi gi\u00e0 consolidata. Nonostante ci\u00f2, Xtext \u00e8 attualmente lo strumento pi\u00f9 maturo, completamente funzionale e versatile in Eclipse per la costruzione di linguaggi di programmazione e degli strumenti di sviluppo per essi. In particolare, \u00e8 lo strumento ideale per il rapido prototipaggio. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA\">linguaggi specifici per domini<\/a><\/noindex> (domain-specific language, DSL). Oltre al \"nucleo linguistico\" menzionato sopra basato su ANTLR e EMF, Xtext offre molti componenti utili di livello superiore, inclusi meccanismi di indicizzazione, costruzione incrementale, \"editor intelligente\", e molto, molto altro, ma tralascia i modelli di lingua basati su handle. Come EMF, Xtext merita un libro a parte, e probabilmente non riusciremo nemmeno a dare una panoramica delle sue capacit\u00e0.<\/p>\n<p>1C:Enterprise Development Tools utilizza attivamente sia EMF in s\u00e9 che una serie di altri progetti Eclipse Modeling. In particolare, Xtext \u00e8 uno dei fondamenti degli strumenti di sviluppo per linguaggi 1C:Enterprise, come il linguaggio di programmazione embedded e il linguaggio delle query. Un altro fondamento di questi strumenti di sviluppo \u00e8 il progetto Eclipse Handly, di cui parleremo pi\u00f9 dettagliatamente (tra i componenti elencati di Eclipse \u00e8 attualmente il meno conosciuto).<\/p>\n<p><b><noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/handly\/\">Eclipse Handly<\/a><\/noindex><\/b>, sottoprogetto del progetto a livello superiore Eclipse Technology, \u00e8 nato dal contributo iniziale di codice nella Eclipse Foundation fornito dall'azienda 1C nel 2014. Da allora, l'azienda 1C continua a supportare lo sviluppo del progetto: i committers di Handly sono dipendenti dell'azienda. Il progetto \u00e8 piccolo, ma occupa una nicchia piuttosto unica in Eclipse: il suo obiettivo principale \u00e8 supportare lo sviluppo di modelli basati su handle.<\/p>\n<p>I principali principi architettonici dei modelli basati su handle, come l'idioma handle\/body, sono stati discussi sopra utilizzando il modello delle risorse e il modello Java come esempi. \u00c8 stato also notato che sia il modello delle risorse sia il modello Java sono fondamentali per gli strumenti di sviluppo Java di Eclipse (JDT). E poich\u00e9 praticamente tutti i progetti *DT di Eclipse hanno un'architettura simile a quella di JDT, non sarebbe un'esagerazione affermare che i modelli basati su handle formano la base di molti, se non di tutti, gli IDE costruiti sopra la piattaforma Eclipse. Ad esempio, in Eclipse C\/C++ Development Tooling (CDT) c'\u00e8 un modello basato su handle per C\/C++, che ha lo stesso ruolo nell'architettura di CDT che ha il modello Java in JDT.<\/p>\n<p>Fino all'arrivo di Handly, Eclipse non offriva librerie specializzate per costruire modelli linguistici basati su handle. I modelli esistenti sono stati creati principalmente attraverso un'adattamento diretto del codice del modello Java (alias copia\/incolla), <i>in quei casi in cui ci\u00f2 \u00e8 permesso<\/i> dalla Eclipse Public License (EPL). (\u00c8 chiaro che, per progetti come quelli di Eclipse, questo di solito non rappresenta un problema dal punto di vista legale, il che non si pu\u00f2 dire per i prodotti con codice sorgente chiuso.) Oltre alla tipica mancanza di sistematicit\u00e0, questo approccio porta a problemi ben noti: duplicazione del codice, errori introdotti durante l'adattamento, ecc. Anche peggio, i modelli risultanti rimangono \u00abun'entit\u00e0 a s\u00e9 stante\u00bb e non sfruttano il potenziale esistente per l'unificazione. In effetti, l'estrazione di concetti e protocolli comuni per i modelli linguistici basati su handle potrebbe portare alla creazione di componenti riutilizzabili per lavorarci, molto simile a quanto \u00e8 accaduto nel caso di EMF.<\/p>\n<p>Non si pu\u00f2 dire che in Eclipse non ci fosse una consapevolezza di questi problemi. Gi\u00e0 nel 2005 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.xing.com\/profile\/Martin_Aeschlimann\">Martin Aeschlimann<\/a><\/noindex>, riassumendo l'esperienza di sviluppo del prototipo CDT, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/org\/langsymp\/position_paper_martin_aeschlimann.html\">ha argomentato<\/a><\/noindex> la necessit\u00e0 di creare un'infrastruttura comune per i modelli linguistici, comprese le modelli basate su handle. Ma, come spesso accade, a causa di compiti pi\u00f9 prioritari non si \u00e8 mai arrivati all'implementazione di queste idee. Nel frattempo, la fattorizzazione del codice dei *progetti DT rimane uno dei temi ancora poco sviluppati in Eclipse.<\/p>\n<p>In un certo senso, il progetto Handly \u00e8 destinato a risolvere pi\u00f9 o meno gli stessi problemi di EMF, ma per modelli basati su handle, e prima di tutto per quelli linguistici (cio\u00e8 rappresentanti gli elementi della struttura di un certo linguaggio di programmazione). Di seguito sono elencati gli obiettivi principali che sono stati posti nella progettazione di Handly:<\/p>\n<ul>\n<li>L'individuazione delle principali astrazioni del dominio.<\/li>\n<li>Ridurre gli sforzi e migliorare la qualit\u00e0 dell'implementazione dei modelli linguistici basati su handle attraverso il riutilizzo del codice.<\/li>\n<li>Fornire un'API unificata di meta-livello ai modelli risultanti, rendendo possibile la creazione di componenti IDE comuni che lavorano con i modelli linguistici basati su handle.<\/li>\n<li>Flessibilit\u00e0 e scalabilit\u00e0.<\/li>\n<li>Integrazione con Xtext (in un livello separato).<\/li>\n<\/ul>\n<p>\nPer identificare concetti e protocolli comuni, sono state analizzate implementazioni esistenti di modelli linguistici basati su handle. Le principali interfacce e le implementazioni di base fornite da Handly sono mostrati in Fig. 8.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/47f4bf74093245334b8d67b149734dfc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Fig. 8. Interfacce comuni e implementazioni di base degli elementi Handly<\/b><\/p>\n<p>L'interfaccia IElement rappresenta l'handle di un elemento ed \u00e8 comune a tutti gli elementi dei modelli basati su Handly. La classe astratta Element implementa il meccanismo generico handle\/body (Fig. 9).<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/0651c1f284b7edfa36313d4b51d72f08.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Fig. 9. IElement e implementazione generica handle\/body<\/b><\/p>\n<p>Inoltre, Handly fornisce un meccanismo generico per la notifica delle modifiche agli elementi del modello (Fig. 10). Come si pu\u00f2 vedere, in linea generale \u00e8 analogo ai meccanismi di notifica implementati nel modello delle risorse e nel modello Java, e utilizza IElementDelta per una rappresentazione unificata delle informazioni riguardanti la modifica di un elemento.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/cbdec8cf874308e0fa9dd96d04f62703.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Fig. 10. Interfacce comuni e implementazioni di base del meccanismo di notifica di Handly<\/b><\/p>\n<p>La parte di Handly sopra discussa (Fig. 9 e 10) pu\u00f2 essere usata per rappresentare praticamente qualsiasi modello basato su handle. Per creare <i>modelli linguistici<\/i> il progetto offre funzionalit\u00e0 aggiuntive \u2013 in particolare, interfacce comuni e implementazioni di base per gli elementi della struttura del testo sorgente, i cosiddetti <i>source elements<\/i> (fig. 8). L'interfaccia ISourceFile rappresenta il file sorgente, mentre ISourceConstruct \u00e8 l'elemento all'interno del file sorgente. Le classi astratte SourceFile e SourceConstruct implementano meccanismi generali per supportare il lavoro con i file sorgenti e i loro elementi, come ad esempio la gestione dei buffer di testo, il collegamento alle coordinate dell'elemento nel testo sorgente, la riconciliazione del modello con il contenuto attuale del buffer working copy, e cos\u00ec via. L'implementazione di questi meccanismi \u00e8 di solito un compito abbastanza complesso, e Handly pu\u00f2 ridurre significativamente gli sforzi di sviluppo per modelli basati su handle grazie a fornitura di implementazioni di base di alta qualit\u00e0.<\/p>\n<p>Oltre ai meccanismi principali sopra menzionati, Handly fornisce un'infrastruttura di buffer di testo e 'istantanee' (snapshots), supporto per integrazioni con editor di codice sorgente (comprese le integrazioni 'out of the box' con l'editor Xtext), oltre a alcuni componenti UI generali che lavorano con i modelli basati su Handly, come il framework outline. Per illustrare le sue capacit\u00e0, il progetto offre diversi esempi, inclusa l'implementazione di un modello Java su Handly. (Rispetto all'implementazione completa del modello Java in JDT, questo modello \u00e8 intenzionalmente semplificato per maggiore chiarezza.)<\/p>\n<p>Come gi\u00e0 accennato, durante la progettazione iniziale di Handly e il suo sviluppo ulteriore \u00e8 stata prestata e continua a essere prestata una seria attenzione alla scalabilit\u00e0 e flessibilit\u00e0. <\/p>\n<p>In linea di principio, i modelli basati su handle scalano abbastanza bene 'per design'. Ad esempio, l'idioma handle\/body consente di limitare la quantit\u00e0 di memoria utilizzata dal modello. Tuttavia, ci sono delle sfumature. Durante i test di scalabilit\u00e0 di Handly \u00e8 stato riscontrato un problema nell'implementazione del meccanismo di notifica: quando venivano modificati un gran numero di elementi, la costruzione delle delta richiedeva troppo tempo. \u00c8 emerso che lo stesso problema era presente anche nel modello Java JDT, da cui \u00e8 stato adattato il codice corrispondente. Abbiamo corretto l'errore in Handly e abbiamo preparato una patch analoga per JDT, che \u00e8 stata accettata con gratitudine. Questo \u00e8 solo uno dei tanti esempi in cui l'integrazione di Handly in implementazioni esistenti di modelli potrebbe rivelarsi potenzialmente utile, poich\u00e9 in tal caso tale errore potrebbe essere corretto in un solo luogo.<\/p>\n<p>Per rendere l'integrazione di Handly nelle implementazioni esistenti dei modelli tecnicamente possibile, la libreria deve possedere una notevole flessibilit\u00e0. Il problema principale consiste nel mantenere la retrocompatibilit\u00e0 con l'API del modello. Questa sfida \u00e8 stata risolta in <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.eclipse.org\/Handly\/NewIn05\">Handly 0.5<\/a><\/noindex> attraverso una chiara separazione dell'API specifica del modello, definita e completamente controllata dallo sviluppatore, dall'API unificato a livello meta fornito dalla libreria. Questo non solo rende tecnicamente possibile l'integrazione di Handly nelle implementazioni esistenti, ma fornisce anche agli sviluppatori di nuovi modelli una notevole libert\u00e0 nella progettazione dell'API.<\/p>\n<p>La flessibilit\u00e0 ha anche altri aspetti. Ad esempio, Handly impone quasi nessuna restrizione sulla struttura del modello e pu\u00f2 essere utilizzato sia per la modellazione di linguaggi di programmazione generali sia per linguaggi specifici. Nella costruzione della struttura del file sorgente, Handly non prescrive alcuna forma specifica per la rappresentazione dell'AST e in linea di principio non richiede nemmeno la presenza di un AST, garantendo cos\u00ec la compatibilit\u00e0 con praticamente qualsiasi meccanismo di analisi sintattica. Infine, Handly supporta un'integrazione completa con l'ambiente di lavoro di Eclipse, ma pu\u00f2 anche funzionare direttamente con i file system, grazie all'integrazione con <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.eclipse.org\/EFS\">Eclipse File System<\/a><\/noindex> (EFS).<\/p>\n<p>L'attuale versione <noindex><a rel=\"nofollow\" href=\"https:\/\/projects.eclipse.org\/projects\/technology.handly\/releases\/0.6\">Handly 0.6<\/a><\/noindex> \u00e8 stata rilasciata nel dicembre 2016. Nonostante il progetto sia attualmente in fase di incubazione e l'API non sia ancora definitiva, Handly \u00e8 gi\u00e0 utilizzato in due grandi prodotti commerciali che hanno osato essere \"primi adottatori\" e, bisogna dire, finora non si sono pentiti di questa scelta.<\/p>\n<p>Come menzionato in precedenza, uno di questi prodotti \u00e8 1C:Enterprise Development Tools, dove Handly \u00e8 utilizzato fin dall'inizio per modellare gli elementi della struttura ad alto livello di linguaggi come il linguaggio di programmazione incorporato e il linguaggio di query. L'altro prodotto \u00e8 meno noto al grande pubblico. Questo \u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.codasip.com\/custom-processor\/\">Codasip Studio<\/a><\/noindex>, un ambiente integrato per la progettazione di processori specifici per applicazioni (application-specific instruction-set processor, ASIP), utilizzato sia all'interno della stessa azienda ceca Codasip che dai suoi clienti, tra cui <noindex>AMD<\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.avg.com\/\">AVG<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.mobileye.com\/\">Mobileye<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.sigmadesigns.com\/\">Sigma Designs<\/a><\/noindex>. Codasip utilizza Handly in produzione dal 2015, a partire dalla versione Handly 0.2. L'ultima versione di Codasip Studio attualmente rilasciata utilizza la versione 0.5, rilasciata a giugno 2016. Ond\u0159ej Il\u010d\u00edk, che guida lo sviluppo dell'IDE in Codasip, \u00e8 in contatto con il progetto, fornendo feedback estremamente importante da parte di un \u00abadattatore esterno\u00bb. \u00c8 riuscito anche a trovare un po' di tempo libero per partecipare direttamente allo sviluppo del progetto, implementando il livello UI (~ 4000 righe di codice) per uno degli esempi di Handly, un modello Java. Maggiori informazioni <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.eclipse.org\/Handly\/Adopters\">Storie di Successo<\/a><\/noindex> del progetto.<\/p>\n<p>Speriamo che, dopo il rilascio della versione 1.0 con garanzia di stabilit\u00e0 dell'API e il termine dello stato di incubazione del progetto, Handly possa avere nuovi adattatori. Nel frattempo, il progetto continua a essere testato e a migliorare ulteriormente l'API, rilasciando due 'grandi' versioni all'anno \u2013 a giugno (nella stessa data del rilascio simultaneo di Eclipse) e a dicembre, garantendo un programma prevedibile su cui gli adattatori possono contare. Inoltre, va aggiunto che il tasso di bug del progetto rimane costantemente basso e Handly ha funzionato in modo affidabile nei prodotti dei primi adattatori fin dalle prime versioni. Per una maggiore familiarit\u00e0 con Eclipse Handly, puoi utilizzare <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pisv\/gethandly\/wiki\">Introduzione al Tutorial<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"http:\/\/www.eclipse.org\/downloads\/download.php?file=\/handly\/docs\/handly-overview.pdf&amp;r=1\">Panoramica Architettonica<\/a><\/noindex>.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/1c\/blog\/323508\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, Eclipse \u0434\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043e\u0431\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u041c\u043d\u043e\u0433\u0438\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 Eclipse \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f Eclipse Java development tools (JDT). \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f open-source Java IDE \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e \u0441\u043b\u043e\u0432\u043e\u043c \u201cEclipse\u201d. \u041e\u0434\u043d\u0430\u043a\u043e Eclipse \u2013 \u044d\u0442\u043e \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (Eclipse Platform), \u0438 \u0446\u0435\u043b\u044b\u0439 \u0440\u044f\u0434 IDE, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435, \u0432 \u0442\u043e\u043c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24268,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32464","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, Eclipse \u0434\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043e\u0431\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Eclipse \u043a\u0430\u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f 1C:Enterprise Development Tools | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, Eclipse \u0434\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043e\u0431\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:47:12+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:47:12+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Eclipse come piattaforma tecnologica per 1C:Enterprise Development Tools | ProHoster","description":"Probabilmente, Eclipse non ha pi\u00f9 bisogno di presentazioni particolari.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Eclipse \u043a\u0430\u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f 1C:Enterprise Development Tools | ProHoster","og:description":"\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, Eclipse \u0434\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043e\u0431\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:47:12+00:00","article:modified_time":"2019-10-31T18:47:12+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32464","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 11:00:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:58:24","updated":"2026-01-21 11:00:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/32464","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=32464"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/32464\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/24268"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=32464"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=32464"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=32464"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}