转自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.
分享到:
相关推荐
Linguaggio: ORM: Web框架: Sistema di autenticazione: 开始吧 按照后端配置文件./setup-backend.sh配置,可以防止问题的发生,请使用chmod +x setup-backend.sh配置。 文件资料 香格里拉documentazione每...
IL诺姆C'hi ++è未gioco二假释FRA IL termine giapponese C'hi(气,ovvero:SOFFIO Vitale的)在线IL linguaggio二programmazione chiamato:C ++。 不可随意使用的软件:可在软件中使用La Mia intenzioneèquella...
ELEA Desktop Link的意大利语设置("linguaggio: italiano")表明,这款工具主要面向意大利用户,提供了符合当地语言习惯的界面和服务。对于非意大利语使用者来说,这可能意味着该插件的界面和帮助文档都是用意大利...
1.程序功能说明: MATLAB实现多种群遗传算法(完整代码) 逼近C=[9,8,7,6,5,4,3,2,1]的9维向量. 2.代码说明:注释清晰,参数和变量说明清晰,方便更改、方便初学者使用,模块化编程,方便替换目标函数。运行环境Windows7及以上操作系统,MATLAB2014a及以上版本。 3.适用专业:计算机、电子信息工程、数学、物理、机械工程、土木工程等专业的大学生、研究生毕业设计,各类专业的课程设计、海外留学生作业等。 4作者介绍:资深算法工程师, 从事Matlab、Python算法仿真工作15年,专业研究遗传算法、粒子群算法、蚁群算法、鲸鱼算法、狼群算法等. 有问题联系QQ: 1579325979
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
小学元旦晚会PPT 模版
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
MATLAB中的语义分割技术探究与应用实践,matlab,语义分割 ,matlab; 语义分割,Matlab语义分割技术解析
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
1、文件内容:pulseaudio-10.0-6.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pulseaudio-10.0-6.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
"基于OpenCV与深度学习的人脸表情识别系统:利用Python与PyQt构建的可视化实时检测工具",基于OpenCV的人脸表情识别系统 相关技术:python,opencv,pyqt,深度学习 (请自行安装向日葵远程软件,以便提供远程帮助) 可编译为.exe文件。 软件说明:摄像头实时检测,加载照片,视频均可。 有基础的同学,可自行修改完善。 第一张和第二张为运行截图。 ,基于OpenCV的人脸表情识别系统; Python; OpenCV; PyQt; 深度学习; 实时检测; 照片和视频支持; 可编译为.exe文件; 运行截图。,"基于OpenCV与深度学习的人脸表情识别系统"
,步进方案,步进源码,两相步进矢量控制,超前角控制两种模式,成熟产品方案 支持特殊功能定制
三相储能PCS双向能量流动与Matlab仿真控制研究——基于SVPWM调制技术的建模与应用,三相储能PCS(Matlab仿真) 1.可实现Grid to Battery,Battery to Grid的能量双向流动。 2.本仿真基于Matlab仿真建立的模型, 3.采用SVPWM进行控制 ,三相储能PCS; 双向能量流动; Matlab仿真; SVPWM控制,三相储能PCS:能量双向流Matlab仿真模型(SVPWM控制)
deepseek部署教程.md
nodejs010-nodejs-ansicolors-0.3.2-1.el6.centos.alt.noarch.rpm
基于三菱PLC的四路抢答器控制系统原理及实践:含带解释的梯形图与IO分配图解,三菱 MCGS 基于PLC的四路抢答器控制系统 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,三菱MCGS; PLC四路抢答器; 控制系统; 梯形图接线图; 原理图图纸; IO分配; 组态画面。,三菱PLC四路抢答器控制系统原理图及组态画面解析
基于运动数据时空特征提取的人类运动片段.pdf
基于机器学习的选股模型及投资组合研究.pdf
ollama安装包。。。。。。。。。。。。。。。。。