转自http://leonardo-m.livejournal.com/93664.html
Non si puo' spiegare tutto un linguaggio in un post, ma una spiegazione di cosa sia puo' velocizzare assai un suo possibile successivo apprendimento. Per cui eccovi lo Zen del D (qui parlo solo della sua versione 2).
Inevitabilmente questo post e' piuttosto sintetico, per cui do' per scontate varie conoscenze informatiche e sui linguaggi di programmazione.
D assomiglia ad una ripulitura del C++0x, a cui siano state aggiunte parti di Java (GC, OOP), e qualche briciola di Python (slice, array associativi, operatori stringa, docstrings) ed Eiffel (Contract Programming).
D vorrebbe essere un system language, ma alcune sue caratteristiche, in particolare il GC, lo rendono inadatto a sostituire il C ad esempio se vuoi scrivere il kernel di un OS, o se vuoi programmare CPU molto piccole con pochissima RAM. Per cui D puoi vederlo come un linguaggio applicativo che pero' ti permette se lo desideri di avere spesso un controllo piu' minuzioso della macchina di quanto si possa fare in Java/C#.
Il D possiede un GC che in teoria e' disattivabile, ma in pratica i programmi un po' piu' ampi non possono farne a meno. La presenza del GC cambia molte cose.
Il D e' tipizzato staticamente, e il compilatore produce un binario che gira sulla CPU reale. Nelle implementazioni attuali non c'e' virtual machine o JIT, al massimo a runtime c'e' il GC, che e' di solito linkato staticamente nell'eseguibile. Gli eseguibili sono al minimo pesanti circa 170 KB.
Il D non e' compatibile con la sintassi del C++, ma in genere quanto una sintassi del C funziona in D, allora fa la stessa cosa che fa in C, con pochissime eccezioni. Per cui se traduci codice da C a D o non compila, o se compila allora da' gli stessi risultati del codice C, questo e' molto utile dato che il mondo e' pieno di codice C (questa scelta di design ha anche effetti negativi, rendendo difficile la correzione di alcuni difetti del C, per cui sfortunatamente anche in D uint+int fa uint, e gli switch hanno fallthrough).
Una delle filosofie del C++ e' "zero overhead", cioe' non aggiungere overhead nel codice per feature che il programmatore non sta usando. D invece accetta un piccolo overhead se questo puo' ad esempio ridurre il numero di bug nel codice. Infatti il D e' progettato per aiutare spesso il progammatore ad evitare i piu' comuni bug. Spesso nel D esiste il modo per ridurre a zero un qualche overhead, ma per default il linguaggio usa la cosa sicura. E usa la cosa insicura e con zero overhead solo dove chi programma la richieda esplicitamente. Ad esempio gli array controllano i loro bounds, anche se puoi compilare un eseguibile finale che omette tali test. Per default la memoria e' sempre thread-local.
D possiede sia una versione ripulita e piuttosto potenziata dei template del C++0x, che l'OOP quasi copiato da Java e poi lievemente esteso. Quindi D e' un linguaggio con tante feature e di complessita' paragonabile a quella del C++0x. Ma moltissime cose sono state ripulite rispetto al C++0x, molti casi particolari sono stati eliminati, per cui di fatto la complessita' del linguaggio e' comunque un bel po' minore di quella del C++0x.
In D non c'e' eredita' delle struct, e gli oggetti possono venire usati solo per riferimento (anche se in certi casi si possono allocare sullo stack). Non possiede le macro del C, e cerca di fare le cose in modo piu' sicuro e pulito. L'inlining e' automatico. E' fatto a moduli, che devono venire importati e non possiede file header.
Come il C, il D cerca di fare il meno possibile a run-time e piu' possibile a tempo di compilazione. Infatti una caratteristica peculiare del D e' poter eseguire tante cose a tempo di compilazione, in particolare e' possibile eseguire le funzioni a tempo di compilazione. Questo, unito ai template, permette di fare molta metaprogrammazione. In D c'e' meno riflessivita' a runtime rispetto a Java, in compenso c'e' molta piu' riflessivita' a tempo di compilazione, per cui ad esempio a tempo di compilazione si possono fare giochi complicati sui tipi.
In D array dinamici, array associativi e array a lunghezza fissa allocati sullo stack sono built-in. Le stringhe sono array dinamici spesso immutabili. L'unicode e' built-in. Gli array hanno una sintassi per lo slicing e concatenation tipo quella di Python, comoda anche grazie al GC che supporta il tutto.
In D esiste un potente sistema per definire costanti, ed e' perfino transitivo, cioe' se qualcosa viene marcato come costante, allora tutto l'"albero" di cio' che contiene e' costante. Questo si spera possa aiutare nella futura programmazione parallela.
D possiede attributi (che il compilatore verifica) per funzioni pure, nothrow. E possiede anche vere closure. Possiede anche lambda con una sintassi non ottimale ma decente.
Il D e' fatto per non richiedere un compilatore dotato di back-end molto moderno (per cui non si pretende che sappia fare inlining di metodi virtuali e di delegate), tipo quelli di Java, per cui anche un back-end di dieci anni fa va bene. Comunque al momento il miglior back-end e' l'assai moderno LLVM.
D e' un linguaggio complesso e giovane, scritto e progettato in gran parte da una singola persona, Walter, che ha grande esperienza nello scrivere compilatori. Al momento contiene parecchi bug, la biblioteca standard e' un po' disastrata, non possiede ottime IDE e ha un GC molto inefficiente. D e' stato progettato per essere compilabile in modo molto pulito, semplice e veloce, e' compilabile anche 20-40 volte piu' in fretta del C++. Il fatto che sia compilabile in modo pulito (e quindi gli stadi della compilazione sono semanticamente separati tra loro in modo molto marcato) e' una forte esigenza del D, forse la principale secondo Walter (questo ha effetti ad esempio sulla sintassi del foreach che e' ottimizzata per il compilatore e non per chi programma).
D e' stato creato da una persona con ampia esperienza di C. Questo significa che molti dei difetti/trappole del C sono stati tappati esplicitamente. Questo pero' significa anche che Walter e' vecchio stile, e quindi D non e' progettato per essere usato con una IDE, e ignora parecchie novita' introdotte in linguaggi come C#3, Scala e Clojure.
Built-in in D ci sono "docstrings" analoghe a quelle di Python, dei sovrasemplificati unit test, e anche una sufficientemente buona implementazione della Contract Programming dell'Eiffel. Cio', ammesso che venga usato da chi programma, aiuta ad evitare bug.
In mezzo al codice D si puo' inserire codice assembly, ma una funzione che contiene assembly non subisce inlining.
Puo' stupire vedere che molti buoni idiomi del C/C++ sono presenti in D sotto forma di sintassi specifiche, esplicite e comode. D contiene quasi tutte le nuove feature del C++0x, alcune semplificate o ripulite.
La versione 2 del D non non e' compatibile con la passata versione 1. In D V.1 ci sono due biblioteche standard doverse e non usabili contemporaneamente. Si spera che lo stesso problema non accada in futuro in D2.
分享到:
相关推荐
ysoserial是一个用于生成利用不安全的Java对象反序列化的有效负载的概念验证工具。它包含一系列在常见Java库中发现的"gadget chains",可以在特定条件下利用执行不安全的反序列化操作的Java应用程序。ysoserial项目最初在2015年AppSecCali会议上提出,包含针对Apache Commons Collections(3.x和4.x版本)、Spring Beans/Core(4.x版本)和Groovy(2.3.x版本)的利用链
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2530上运行,如果是其他型号芯片,请自行移植。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、例程具有一定专业性,非专业人士请谨慎操作。
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
**Oracle 10g DBA学习手册:安装Oracle和构建数据库** **目的:** 本章节旨在指导您完成Oracle数据库软件的安装和数据库的创建。您将通过Oracle Universal Installer (OUI)了解软件安装过程,并学习如何利用Database Configuration Assistant (DBCA)创建附加数据库。 **主题概览:** 1. 利用Oracle Universal Installer (OUI)安装软件 2. 利用Database Configuration Assistant (DBCA)创建数据库 **第2章:Oracle软件的安装与数据库构建** **Oracle Universal Installer (OUI)的运用:** Oracle Universal Installer (OUI)是一个图形用户界面(GUI)工具,它允许您查看、安装和卸载机器上的Oracle软件。通过OUI,您可以轻松地管理Oracle软件的安装和维护。 **安装步骤:** 以下是使用OUI安装Oracle软件并创建数据库的具体步骤:
消防验收过程服务--现场记录表.doc
数据库管理\09-10年第1学期数据库期末考试试卷A(改卷参考).doc。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
职业暴露后的处理流程.docx
Java Web开发短消息系统
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
这是一款可以配置过滤目录及过滤的文件后缀的工具,并且支持多个项目同时输出导出,并过滤指定不需要导出的目录及文件后缀。 导出后将会保留原有的路径,并在新的文件夹中体现。
Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
YOLO算法-挖掘机与火焰数据集-7735张图像带标签-挖掘机.zip
操作系统实验 Ucore lab5
IMG_5950.jpg
竞选报价评分表.docx
java系统,mysql、springboot等框架
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2530上运行,如果是其他型号芯片,请自行移植。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、例程具有一定专业性,非专业人士请谨慎操作。
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
内容概要:本文详细讲解了搜索引擎的基础原理,特别是索引机制、优化 like 前缀模糊查询的方法、建立索引的标准以及针对中文的分词处理。文章进一步深入探讨了Lucene,包括它的使用场景、特性、框架结构、Maven引入方法,尤其是Analyzer及其TokenStream的实现细节,以及自定义Analyzer的具体步骤和示例代码。 适合人群:数据库管理员、后端开发者以及希望深入了解搜索引擎底层实现的技术人员。 使用场景及目标:适用于那些需要优化数据库查询性能、实施或改进搜索引擎技术的场景。主要目标在于提高数据库的访问效率,实现高效的数据检索。 阅读建议:由于文章涉及大量的技术术语和实现细节,建议在阅读过程中对照实际开发项目,结合示例代码进行实践操作,有助于更好地理解和吸收知识点。