转自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")表明,这款工具主要面向意大利用户,提供了符合当地语言习惯的界面和服务。对于非意大利语使用者来说,这可能意味着该插件的界面和帮助文档都是用意大利...
软件工程第三章实验报告.docx
第三章-第八节通信礼仪.ppt
智能家居股份合作协议.docx
内容概要:本文详细介绍了基于西门子S7-1200 PLC的双轴定位控制系统在电池焊接项目中的应用。主要内容涵盖双轴定位算法的设计与实现,包括使用SCL语言编写的运动控制函数块,以及梯形图用于处理IO互锁和焊接时序控制。文中还讨论了威纶通触摸屏的界面设计,如动态元素映射、宏指令的应用,以及电气图纸的安全回路设计。此外,文章分享了多个调试技巧和注意事项,如加速度参数设置、伺服驱动器订货号核对、BOM清单管理等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和触摸屏界面设计的专业人士。 使用场景及目标:适用于需要深入了解PLC编程、运动控制算法、触摸屏界面设计及电气图纸绘制的工程项目。目标是提高双轴定位控制系统的精度和稳定性,确保电池焊接的质量和安全性。 其他说明:文中提供了完整的工程文件包下载链接,并强调了在实际应用中需要注意的具体事项,如硬件配置检查、参数调整等。
内容概要:本文详细介绍了如何利用Simulink和Carsim进行联合仿真,实现基于PID(比例-积分-微分)和MPC(模型预测控制)的自适应巡航控制系统。首先阐述了Carsim参数设置的关键步骤,特别是cpar文件的配置,包括车辆基本参数、悬架系统参数和转向系统参数的设定。接着展示了Matlab S函数的编写方法,分别针对PID控制和MPC控制提供了详细的代码示例。随后讨论了Simulink中车辆动力学模型的搭建,强调了模块间的正确连接和参数设置的重要性。最后探讨了远程指导的方式,帮助解决仿真过程中可能出现的问题。 适合人群:从事汽车自动驾驶领域的研究人员和技术人员,尤其是对Simulink和Carsim有一定了解并希望深入学习联合仿真的从业者。 使用场景及目标:适用于需要验证和优化自适应巡航控制、定速巡航及紧急避撞等功能的研究和开发项目。目标是提高车辆行驶的安全性和舒适性,确保控制算法的有效性和可靠性。 其他说明:文中不仅提供了理论知识,还有大量实用的代码示例和避坑指南,有助于读者快速上手并应用于实际工作中。此外,还提到了远程调试技巧,进一步提升了仿真的成功率。
内容概要:本文深入探讨了利用MATLAB/Simulink搭建变压器励磁涌流仿真模型的方法和技术。首先介绍了空载合闸励磁涌流仿真模型的搭建步骤,包括选择和配置电源模块、变压器模块以及设置相关参数。文中详细讲解了如何通过代码生成交流电压信号和设置变压器的变比,同时强调了铁芯饱和特性和合闸角控制的重要性。此外,还讨论了电源简化模型的应用及其优势,如使用受控电压源替代复杂电源模块。为了更好地理解和分析仿真结果,文章提供了绘制励磁涌流曲线的具体方法,并展示了如何提取和分析涌流特征量,如谐波含量和谐波畸变率。最后,文章指出通过调整电源和变压器参数,可以实现针对不同应用场景的定制化仿真,从而为实际工程应用提供理论支持和技术指导。 适合人群:从事电力系统研究、变压器设计及相关领域的科研人员、工程师和技术爱好者。 使用场景及目标:适用于希望深入了解变压器励磁涌流特性的研究人员,旨在帮助他们掌握MATLAB/Simulink仿真工具的使用技巧,提高对励磁涌流现象的理解和预测能力,进而优化继电保护系统的设计。 其他说明:文中不仅提供了详细的建模步骤和代码示例,还分享了一些实用的经验和技巧,如考虑磁滞效应对涌流的影响、避免理想断路器带来的误差等。这些内容有助于读者在实践中获得更加准确可靠的仿真结果。
内容概要:本文详细介绍了利用三菱FX3U PLC与Factory IO通讯仿真进行PID液位调节的方法,旨在降低学习PID控制的成本和难度。文中首先指出了传统硬件学习PID控制面临的高昂成本和复杂接线问题,随后介绍了仿真程序的优势,包括PID配置参数、调节参数、自整定和手动整定的学习方法。接着阐述了所需的设备和软件环境,以及具体的代码示例和寄存器配置。最后,通过实例展示了如何通过仿真环境进行PID参数调整和测试,验证了该方案的有效性和实用性。 适合人群:初学者和有一定PLC基础的技术人员,特别是那些希望通过低成本方式学习PID控制的人群。 使用场景及目标:适用于希望在不购买昂贵硬件的情况下,快速掌握PID控制原理和技术的应用场景。目标是通过仿真环境,熟悉PID参数配置和调整,最终能够应用于实际工业控制系统中。 其他说明:本文不仅提供了理论指导,还给出了详细的实践步骤和代码示例,使读者能够在实践中更好地理解和掌握PID控制技术。同时,强调了仿真环境与实际项目的相似性,便于知识迁移。
智慧城市树木二维码智能管理系统概述.docx
内容概要:本文详细介绍了基于.NET框架和Oracle数据库构建的大型MES(制造执行系统)生产制造管理系统的源码结构及其技术特点。该系统采用了BS架构,适用于Web端和WPF客户端,涵盖了从数据库设计、业务逻辑处理到前端展示等多个方面。文中不仅提供了具体的代码示例,还深入剖析了系统的技术难点,如Oracle数据库的高效连接方式、多线程处理、实时数据推送以及高级特性(如分区表、压缩技术和批量操作)的应用。此外,作者还分享了一些关于系统部署和维护的经验。 适合人群:主要面向拥有五年以上.NET开发经验的专业人士,特别是那些对Oracle数据库有一定了解并且参与过大中型项目开发的技术人员。 使用场景及目标:①帮助开发者深入了解MES系统的工作原理和技术实现;②为现有的MES系统提供优化思路;③作为学习资料,用于掌握.NET框架与Oracle数据库的最佳实践。 其他说明:尽管缺少完整的安装说明和数据库备份文件,但凭借丰富的代码片段和技术细节,这套源码仍然是一个宝贵的学习资源。同时,文中提到的一些技术点也可以应用于其他类型的工业控制系统或企业管理信息系统。
lesson6_点阵.zip
OpenNMS 依赖组件 jicmp 的完整解析与安装指南 一、jicmp 的核心作用 ICMP 协议支持 jicmp(Java Interface for ICMP)是 OpenNMS 实现网络设备可达性检测(如 Ping)的关键组件,通过原生代码高效处理 ICMP 报文,替代纯 Java 实现的性能瓶颈17。 依赖版本要求:OpenNMS 33.1.5 需 jicmp >= 3.0.0,以支持 IPv6 及多线程优化7。 与 jicmp6 的协同 jicmp6 是 jicmp 的扩展组件,专用于 IPv6 网络环境检测,二者共同构成 OpenNMS 网络监控的底层通信基础78。 二、jicmp 安装问题的根源 仓库版本不匹配 OpenNMS 官方旧版仓库(如 opennms-repo-stable-rhel6)仅提供 jicmp-2.0.5 及更早版本,无法满足新版 OpenNMS 的依赖需求78。 典型错误:Available: jicmp-2.0.5-1.el6.i386,但 Requires: jicmp >= 3.0.07。 手动编译未注册到包管理器 手动编译的 jicmp 未生成 RPM 包,导致 yum 无法识别已安装的依赖,仍尝试从仓库拉取旧版本57。 三、解决方案:正确安装 jicmp 3.0 通过源码编译生成 RPM 包 bash Copy Code # 安装编译工具链 yum install -y rpm-build checkinstall gcc-c++ autoconf automake libtool # 编译并生成 jicmp-3.0.0 RPM wget https://sourceforge.net/projects/opennms/files/JICMP/stable-3.x/j
机械CAD零件图.ppt
内容概要:本文详细介绍了制冷站智能群控管理系统的构成及其核心技术实现。首先阐述了系统的四大组成部分:环境感知模块、数据处理模块、决策控制模块以及设备控制模块。接着通过具体的Python代码示例展示了如何利用MQTT协议进行设备间的通信,实现了温度控制等功能。此外,文中还探讨了数据处理中的噪声过滤方法、设备控制中的状态锁定机制、以及采用强化学习进行能效优化的具体案例。最后展望了未来的发展方向,如引入能量管理和AI集成等。 适合人群:从事制冷站自动化控制领域的工程师和技术人员,尤其是对智能群控管理系统感兴趣的从业者。 使用场景及目标:适用于希望提升制冷站自动化水平的企业和个人。目标在于提高系统的稳定性和效率,减少人为干预,实现节能减排。 其他说明:文章不仅提供了理论性的介绍,还有大量的实战经验和代码片段分享,有助于读者更好地理解和应用相关技术。
内容概要:本文详细介绍了将卷积神经网络(CNN)从软件到硬件的全过程部署,特别是在FPGA上的实现方法。首先,作者使用TensorFlow 2构建了一个简单的CNN模型,并通过Python代码实现了模型的训练和权值导出。接着,作者用Verilog手写了CNN加速器的硬件代码,展示了如何通过参数化配置优化加速效果。硬件部分采用了滑动窗口和流水线结构,确保高效执行卷积操作。此外,文中还讨论了硬件调试过程中遇到的问题及其解决方案,如ReLU激活函数的零值处理和权值存储顺序的对齐问题。最后,作者强调了参数化设计的重要性,使得硬件可以在速度和面积之间灵活调整。 适合人群:对深度学习和FPGA感兴趣的开发者,尤其是有一定编程基础和技术背景的研究人员。 使用场景及目标:适用于希望深入了解CNN算法硬件实现的人群,目标是掌握从软件到硬件的完整部署流程,以及如何通过FPGA加速深度学习任务。 其他说明:文中提供了详细的代码片段和调试经验,有助于读者更好地理解和实践。同时,项目代码可在GitHub上获取,方便进一步研究和改进。
内容概要:本文详细介绍了无人驾驶车辆高速MPC(模型预测控制)控制系统的复现过程,主要涉及MATLAB和CarSim软件工具的应用。作者通过调整caraim文件、构建Simulink控制逻辑以及优化MPC算法,将原有的直线跟车场景成功转换为双移线场景。文中不仅展示了具体的技术实现步骤,如路径点设置、权重矩阵调整、采样时间对齐等,还分享了调试过程中遇到的问题及其解决方案,如参数不匹配、模型不收敛等。最终实现了车辆在虚拟环境中按预定双移线轨迹行驶的目标。 适合人群:从事无人驾驶车辆研究和技术开发的专业人士,尤其是对MPC控制算法感兴趣的工程师。 使用场景及目标:适用于需要深入了解无人驾驶车辆控制系统的设计与实现的研究人员和技术开发者。目标是帮助读者掌握如何利用MATLAB和CarSim进行无人驾驶车辆的模拟实验,特别是在高速场景下的双移线控制。 其他说明:文章强调了MPC在高速场景下的挑战性和调参技巧,提供了宝贵的实践经验。同时提醒读者注意环境配置、控制器核心代码解析以及联合仿真可能出现的问题。
监控场景下基于CLIP的细粒度目标检测方法.pdf
内容概要:本文详细介绍了如何使用MATLAB进行频谱和功率谱分析,涵盖了从基础概念到高级应用的各个方面。首先,通过生成人工信号并绘制时域图,帮助读者熟悉基本操作。接着,深入探讨了频谱分析的关键步骤,如快速傅里叶变换(FFT)、窗口函数的选择、频谱横坐标的正确转换等。对于功率谱分析,则介绍了Welch法及其具体实现。针对真实数据处理,讨论了如何读取外部数据、处理非均匀采样、去除趋势项等问题,并提供了多种实用技巧,如滑动平均、自动标注主要频率成分等。此外,还强调了一些常见的错误和注意事项,确保读者能够避免常见陷阱。 适用人群:适用于具有一定MATLAB基础的科研人员、工程师和技术爱好者,特别是那些从事信号处理、通信工程、机械振动分析等领域的人士。 使用场景及目标:① 学习如何使用MATLAB进行频谱和功率谱分析;② 掌握处理实际工程中复杂信号的方法;③ 提高对信号特征的理解能力,以便更好地应用于故障诊断、质量检测等实际工作中。 其他说明:文中提供的代码片段可以直接用于实践,读者可以根据自己的需求进行适当修改。通过跟随文中的步骤,读者不仅能够学会如何绘制频谱图和功率谱图,还能深入了解背后的数学原理和技术细节。 标签1,MATLAB,频谱分析,功率谱,Welch法,FFT