`

Linguaggio D versione 2(转)

阅读更多

Linguaggio D versione 2

转自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.

分享到:
评论

相关推荐

    ristoro-gobettivolta:P. Gobetti A. Volta

    Linguaggio: ORM: Web框架: Sistema di autenticazione: 开始吧 按照后端配置文件./setup-backend.sh配置,可以防止问题的发生,请使用chmod +x setup-backend.sh配置。 文件资料 香格里拉documentazione每...

    chi-plus-plus:每个原始的开源Proposta

    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-crx插件

    ELEA Desktop Link的意大利语设置("linguaggio: italiano")表明,这款工具主要面向意大利用户,提供了符合当地语言习惯的界面和服务。对于非意大利语使用者来说,这可能意味着该插件的界面和帮助文档都是用意大利...

    电子商务之价格优化算法:梯度下降:机器学习在价格优化中的角色.docx

    电子商务之价格优化算法:梯度下降:机器学习在价格优化中的角色.docx

    ToadforOracle与Oracle数据库版本兼容性教程.docx

    ToadforOracle与Oracle数据库版本兼容性教程.docx

    browser360-cn-stable-13.3.1016.4-1-amd64.deb

    360浏览器银河麒麟版 for X86 适配兆芯 / 海光 / intel / AMD CPU

    基于React.js和Material-UI个人作品集网站模板(附源码+说明文档).zip

    使用React.js构建,提供多种主题可供选择,并且易于定制。该项目旨在帮助开发者和自由职业者创建自己的个性化投资组合。 主要功能点 多种主题可供选择,包括绿色、黑白、蓝色、红色、橙色、紫色、粉色和黄色 易于定制,可以在src/data文件夹中更新个人信息 包含主页、关于、简历、教育、技能、经验、项目、成就、服务、推荐信、博客和联系等多个部分 支持通过Google表单收集联系信息 提供SEO优化建议 支持多种部署方式,如Netlify、Firebase、Heroku和GitHub Pages 技术栈主要 React.js Material-UI Axios React-fast-marquee React-helmet React-icons React-reveal React-router-dom React-router-hash-link React-slick Slick-carousel Validator

    中小型企业财务管理系统 SSM毕业设计 附带论文.zip

    中小型企业财务管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    apsw-3.38.5.post1-cp39-cp39-win_amd64.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    电子商务之价格优化算法:线性回归:价格优化策略实施.docx

    电子商务之价格优化算法:线性回归:价格优化策略实施.docx

    工业数字化转型的关键技术及其应用场景解析

    内容概要:报告详细介绍了企业数字化转型的驱动因素、数字化转型方案分类及其应用场景,重点关注了云计算、超连接、数字孪生、人工智能、分布式账本、增材制造、人机接口、数据共享、工业物联网等关键技术。这些技术不仅支持了企业的运营效率提升和业务模式创新,也为实现更快、更开放、更高效的数字化转型提供了支撑。报告最后提出了企业实施数字化转型的六个步骤。 适合人群:企业高级管理人员、技术人员、咨询顾问,以及对工业数字化转型感兴趣的读者。 使用场景及目标:帮助企业制定和实施数字化转型策略,优化运营模式,提升业务效率,增强市场竞争力。同时,也可作为政府部门、研究机构和行业协会的参考文献。 其他说明:报告中提到的关键技术及其应用场景对企业数字化转型具有重要的指导意义,特别是对于那些希望通过数字化转型实现业务创新和升级的企业。

    基于java的线上选课系统的设计与实现答辩PPT.pptx

    基于java的线上选课系统的设计与实现答辩PPT.pptx

    原版aggdraw-1.3.15-cp311-cp311-win_arm64.whl-下载即用直接pip安装.zip

    安装前的准备 1、安装Python:确保你的计算机上已经安装了Python。你可以在命令行中输入python --version或python3 --version来检查是否已安装以及安装的版本。 个人建议:在anaconda中自建不同python版本的环境,方法如下(其他版本照葫芦画瓢): 比如创建python3.8环境,anaconda命令终端输入:conda create -n py38 python==3.8 2、安装pip:pip是Python的包管理工具,用于安装和管理Python包。你可以通过输入pip --version或pip3 --version来检查pip是否已安装。 安装WHL安装包 1、打开命令行(或打开anaconda命令行终端): 在Windows上,你可以搜索“cmd”或“命令提示符”并打开它。 在macOS或Linux上,你可以打开“终端”。 2、cd到whl文件所在目录安装: 使用cd命令导航到你下载的whl文件所在的文件夹。 终端输入:pip install xxx.whl安装即可(xxx.whl指的是csdn下载解压出来的whl) 3、等待安装完成: 命令行会显示安装进度,并在安装完成后返回提示符。 以上是简单安装介绍,小白也能会,简单好用,从此再也不怕下载安装超时问题。 使用过程遇到问题可以私信,我可以帮你解决! 收起

    电子商务之价格优化算法:贝叶斯定价:贝叶斯网络在电子商务定价中的应用.docx

    电子商务之价格优化算法:贝叶斯定价:贝叶斯网络在电子商务定价中的应用.docx

    IMG_20241105_235746.jpg

    IMG_20241105_235746.jpg

    基于java的毕业设计选题系统答辩PPT.pptx

    基于java的毕业设计选题系统答辩PPT.pptx

    专升本考试资料全套.7z

    专升本考试资料全套.7z

    Trustwave DbProtect:数据库活动监控策略制定.docx

    Trustwave DbProtect:数据库活动监控策略制定.docx

    VB程序实例-CD-ROM开关.zip

    基于VB的程序实例,可供参考学习使用

    课设毕设基于SpringBoot+Vue的教育资源共享平台源码可运行.zip

    本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac

Global site tag (gtag.js) - Google Analytics