哈Ha! 直奔重点。 目前,我正在阅读《龙书》,并正在为我的编程语言开发一种称为Lolo的编译器(以纪念日俄卡通企鹅)。 如果没有任何伤害,我计划在一年内完成。 同时,我将发布翻译,构建中间代码,优化等方面的有趣摘录,今天,我将向您介绍该语言。 坐下吧
该语言是编译式的,命令式的,非面向对象的,语义已从C语言中无意间被注销,并补充了许多有用的功能。 让我们从他们开始。
语义修改
安全指针
您可能现在就考虑过Rust的智能指针,但事实并非如此。 用我的语言,访问内存的安全性由两个习惯用法提供。 第一:缺少指针的解引用操作。 而是在访问声明的指针时,将引用对象本身。 也就是说,您可以并且应该这样写:
int # pointer ~~ new int(5) int variable ~ pointer + 7
变量变量现在包含数字12。现在您看到了一个不熟悉的语法,也许您有些困惑,但是我将在本文中解释所有内容。 第二个成语:缺乏对指针的操作。 同样:访问指针时的所有操作(包括赋值,递增和递减)均在对象上执行。 与指针直接相关的唯一操作是按地址分配,或者我称之为标识。 在上面的代码示例的第一行中,它就是标识。 可以将任何指针设置为仅已分配的存储区的地址,这是返回的新操作。 您还可以将指针指向即使在堆上,甚至在堆栈上分配的另一个变量的地址。 这是一个例子:
int variable ~ 5 int # pointer ~~ variable
这里的“〜”是通常的分配操作。 您还可以使用特殊的空指针来标识指针。 它充当指向空地址的指针。 在标识比较操作和对具有空值的身份(相同地址)进行比较之后,它们将得出true:
int # pointer ~~ null if (pointer = null) nop ;; true if (pointer == nul) nop ;; true
这里“ =”是值的比较,“ ==”是按地址的比较,“ nop”是空操作,在“ ;;”之后。 -评论。 是的,在不检查类型兼容性的情况下,唯一可以使用null的指针操作。
因此,只能将指针分配给已分配的内存或空区域,而不能将其移动到任何地方。 但是,这些措施不能完全防止分段错误。 要获取它,只需执行以下步骤:
int # pointer1 ~~ new int(5) int # pointer2 ~~ pointer1 delete pointer1 int variable ~ pointer2 ;; segmentation fault!
我认为这里一切都清楚了。 但是要犯这样的错误只能是有目的的,然后努力工作。 毕竟,删除操作的作用与垃圾收集器相同,只是安全性较低。 说起他...
垃圾收集器
垃圾收集者-他也是洛洛(Lolo)的收集者。 可能无需解释它是什么。 我只能说可以在编译期间通过特殊选项禁用它。 我们使用收集器对程序进行了测试,一切正常运行-您可以输入选项,并尝试使用手动内存管理来优化程序。
内建阵列
尽管我说过这种语言的语义是从C语言中删除的,但是它们之间的区别是非常明显的。 这里的数组是指针。 数组具有自己的语法和安全寻址。 不,不进行范围检查。 使用它们,原则上很难获得运行时错误。 这是因为每个数组都将长度存储为可变大小(如Java中一样),并且每个索引都从索引中进行索引...除以该大小还有余数! 乍一看,直到我们看到负指数之前,这是一个愚蠢的决定。 如果找到将-1除以数组长度的余数,则会得到一个等于size-1的数字,即最有限的元素。 通过这种操作,我们不仅可以从数组的开头而且可以从数组的结尾访问索引。 另一个技巧是将任何原始类型都转换为byte []数组。 但是,您问如何获得运行时错误? 我将把这个问题留给您作为一个简单的谜语。
参考文献
我不确定当前的C标准是否包括链接,但是它们肯定会出现在Lolo中。 早期版本的C中缺少引用可能是指向指针的主要原因之一。 需要它们将参数传递给地址,以从函数返回值而不进行复制。 指针和数组也可以按引用传递(因为按值传递时,数组将被完全复制,并且通过~~操作设置到新位置的指针不会保存它)。
多线程
一切都越来越美丽。 我已经爱上了我的语言。 他的下一个爱好是多线程。 老实说,我还没有完全确定将提供什么工具。 最有可能是具有ala-Java所有属性的synced关键字,还有可能是非内联函数前面的并发关键字,这意味着“在并行线程中运行这些功能”。
内联字符串
它是字符串,而不是C ++中的字符串文字。 每行都有其自己的长度,索引将在找到其余部分时发生。 通常,Lolo中的字符串与字符数组非常相似,不同之处在于数组没有通过“ +”进行连接,通过“ *”进行动画处理以及通过“ <”和“>”进行比较。 由于我们在谈论线条,因此我们必须提及字符。 与C ++中一样,Lolo中的符号不是数字。 并且它们不包含一个字节,而是DKOTI字符为4个字节,UTF字符为6个字节。 下次我将谈论DKOTI,但是现在,仅知道Lolo支持两种编码的字符和字符串。 是的,甚至可以从常量中获取length属性:
int len ~ "Hello, world!".length ;; len = 13
具有三个值的布尔类型
具有逻辑数据类型的绝大多数编程语言都使用二进制逻辑。 但是在Lolo中它将是三元的,或者说是模糊三元的。 三个值:true-true,false-false和none-无。 到目前为止,我还没有找到不返回任何值的操作语言,但是我记得实践中的许多示例,其中带有三个值的标志将非常有用。 必须使用枚举或整数类型。 不再需要。 那只是我不能选择的这种类型的名字。 最常见的是“逻辑”,但时间太长。 其他选项包括为纪念Jan Lukasevich的“ luk”,为纪念N. P. Brusnetsov的“ brus”和“ trit”,但严格来说,这种类型不是trit。 通常,调查是在文章的结尾。
用于初始化结构的列表和列表
如果在声明结构变量后,在〜之前打上〜号,并用方括号括起来,则可以依次或以字典的形式设置其字段的值。 如果对数组执行此类过程,则只能设置其单元格的值,而无需字典。 没什么特别的,只看代码:
struct { int i; real r; str s; } variable ~ [ i: 5, r: 3.14, s: "Hello!" ] int[5] arr ~ [ 1, 2, 3, 4, 5 ]
从函数返回多个值
就像在Go中一样! 您可以编写多个用逗号分隔的变量名,并一次为它们分配从函数返回的所有值:
int, real function() { return 5, 3.14 } byte § { int i; real r i, r ~ function }
模块而不是标题
这里的一切都清楚了。 Java的模块代替了C害羞的标头。
对于(自动项:数组)
再次是本机Java。 由于我们的数组具有长度,因此不对每个数组使用表达式是一个罪过。
选择运算符不仅适用于int
我不了解您,但是在C和C ++中,我缺乏对非整数变量使用切换大小写操作的能力,这让我非常恼火。 而且语法也很生气。 在帕斯卡,这里是另一回事。 现在在洛洛:
case variable { "hello", "HELLO": nop "world": { nop; nop } "WORLD": nop }
供电和分区运营商
这是来自Python。
real r ~ 3.14 ** 2 int i ~ r // 3
函数参数元组
还记得Lolo禁止使用除指针之外的所有带有指针的操作吗? 现在,让我们记住如何从可变长度参数列表访问函数参数。 您需要声明一个指向第一个元素的指针,然后递增直到真值检查返回true。 您不能在Lolo中增加。 但是没关系。 毕竟,此处的参数列表以固定(与调用相关)长度的元组的形式表示,具有索引安全性(如数组)。 他叫“?” 仅对在功能定义中设置的参数执行类型检查。 其余(“多点”)参数被简化为任何类型,并且由于动作笨拙而无法定义其行为。 但是,与C语言中的宏相比,这样的元组更安全,更方便。
void function(...) { if (?.size > 1) { int i ~ ?[0] real r ~ ?[1] } }
数值区间
另一个字符-一系列的间隔类型(范围,范围,范围等)。 它们由两个整数(通过两个点(..)给出)组成,可以从数组中切出一个数组,从一个字符串中切出一个字符串,通常我认为这是有用的。
int[5] arr ~ [ 1, 2, 3, 4, 5 ] int[3] subarr = arr[1..3] ;; [ 2, 3, 4 ]
在运算符中
从帕斯卡。 适用于字符串,数组,元组吗? 和范围。
int[5] arr ~ [ 1, 2, 3, 4, 5 ] if (4 in arr) nop
功能参数字典
老实说,我已经对如何正确调用此方法感到困惑,因为它可以直接指定非纯函数的参数:
int pos = str_find(string, npos: -1)
默认选项
从C ++开始。 在这里,甚至没有必要举一个例子,因此一切都很清楚。
例外情况
好吧,没有他们在哪里?
try { raise SEGMENTATION_FAULT_EXCEPTION } except (Exception e) { print(e.rus) }
无条件跳
因为在2019年,使用GOTO死亡运算符相似。
句法
好吧,稍微谈谈语法。 如您所见,分号很浅。 没有这种错误源,现代编程语言就可以很好地完成工作。 例如Python,Kotlin。 箭头运算符(->)与点运算符结合在一起。 当调用不带参数的函数时,括号是可选的。 字符串以数字给出,反之亦然。 逻辑和按位运算符组合在一起。 有用于列表的功能修饰符。 嵌套函数 type_of。 最重要的是-多种语言。 是的,我将使用国际交流的所有语言(即英语,俄语,日语,中文,西班牙语,葡萄牙语,阿拉伯语,法语,德语和拉丁语)复制关键字,字符串和数组的属性以及标准库的所有标识符。
实际上,以上所有内容都不包含Lolo的一半功能。 我只是无法立即回忆其所有功能。 我将在编译器准备好后添加。