如何创建一个语言可好?(How to create a language these days?)

2019-07-21 23:41发布

我需要时间写的是编程语言,我一直写。 你怎么孩子做这些天? 我一直圈外了十多年; 你现在不同的比我们早在互联网出现之前-,预装Windows天做任何? 你知道,回来时,“真正的”编码器编码在C,使用的命令行,并一再纠缠其外壳是更胜一筹?

只是为了澄清,我的意思是,不是你怎样设计语言(即我可以找出很容易),但你如何建立编译器和标准库等等? 你的孩子使用什么工具,这些天?

Answer 1:

一个考虑这是因为打孔卡新时代已经厚恩提供虚拟机的存在“标准库”。 瞄准JVM或.NET CLR,而不是叶奥尔德“语言围墙花园”的为您节省大量的自举。 如果您要创建一个编译语言,你也可以找到一个比机器代码的Java字节码或MSIL更容易编译目标(当然,如果你在这是创建一个紧密的优化编译器的乐趣,那么你会看到这作为一个bug,而不是一个功能)。

在消极的一面,JVM或CLR的成语可能不是你想要什么,你的语言。 所以,你仍然可能最终建设“标准库”只是为了提供对平台设施惯用的接口。 (一个例子是,每一个语言和它的狗似乎写入到控制台,而不是让用户手动调用的System.out.println或Console.WriteLine提供它自己的方法。)然而,它使惯用的增量发展图书馆,并且意味着更隐蔽库,你从来没有得到全面建设惯用的接口仍然即使丑陋的方式进行访问。

如果你正在考虑一种解释型语言,.NET也有通过动态语言运行时(DLR)有效的解释支持。 (我不知道是否有JVM的等价物。)这应该有助于释放您专注于语言设计,而不必担心翻译的优化这么多。



Answer 2:

我现在已经写了两个编译器在Haskell的小领域特定语言,并发现这是一个令人难以置信的高效体验。 该秒差距库使得与语法容易打,并解释是写在Haskell的数据结构非常简单。 还有的描述写在Haskell一个Lisp解释 ,我发现有帮助的。

如果你有兴趣在一个高性能的后台,我建议LLVM 。 它具有简洁而优雅的字节码和最好的x86 / AMD64发电后端,你可以找到。 有一个可选的垃圾收集器,而一些实验后端定位的JVM和CLR 。

你可以写在产生LLVM字节代码的任何语言的编译器。 如果你足够大胆学习哈斯克尔,但希望LLVM,有一组哈斯克尔-LLVM的绑定。



Answer 3:

什么已发生很大变化,但尚未提的是IDE的支持和互操作性:

如今,我们非常期待的智能感知,一步一步的执行和国家免检“在编辑器窗口中右键”,新类型,告诉调试器如何对待他们,而不是有用的诊断信息。 旧的“编译.X - > .Y”可执行文件是不够的,创造了一种语言。 环境是没有把重点放在第一,但影响乐于采用。

此外,图书馆变得更加强大,没有人希望实现所有以另外一种语言。 尝试借用,可以很容易地调用现有的代码,并可以很容易地被其他代码调用。

针对虚拟机 - 作为itowlson建议 - 可能是开始的好方法。 如果原来的一个问题,它仍然可以通过本地编译器所取代。



Answer 4:

我敢肯定你做什么,总是已经完成。

编写一些代码,并显示你的结果给世界。

相较于从前的时候,有一些工具,让您的工作更容易,但。 我可能会建议ANTLR解析语言的语法?



Answer 5:

说到谁的人刚刚建立了一个非常简单的组装喜欢语言和解释,我开始了与.NET框架或类似。 试图写入大多数东西的时候没有什么可以打败C#的强大的语法+整个.NET社区的支持。 在这里,我设计了一个简单的字节码格式和汇编语法和proceeeded写我的翻译+汇编。

就像我说的,这是一个非常简单的语言。



Answer 6:

你不应该接受喜欢使用最新的工具懦弱的解决方案。 你应该写在Visual Basic中一个最小的编译器,应用程序或类似语言的引导语,然后写在你的新语言所有的编译工具,然后只用语言本身的自我编译。

此外,什么是语言的提议叫什么名字?

我觉得最近有没有与像COBOL和FORTRAN全大写字母名称的语言,所以我希望你会调用它像MIKELANG所有大写字母。



Answer 7:

与其说是一个实现,但是一个设计决策,其作用的实现 - 如果你让你的语言的每条语句都没有上下文的一个独特的解析树,你会得到的东西,很容易手工编写的分析器,并不需要大量的工作来提供语法高亮显示。 同样简单的事情,就像使用不同的符号模块命名空间和对象的命名空间(Java不同,它使用.两个包和类的名称空间),意味着你可以分析代码,无需加载每一个它是指模块。

标准库 - 包括超过了setjmp其他C99标准库的一切是等价的。 添加您需要为您的域任何其他。 制定出一个简单的方法来做到这一点,无论是像SWIG或在线FFI如Ruby的[想不起模块名称]和Python的ctypes的。

建设尽可能多的语言的语言也是一种选择,但开始时做要么放弃项目( Rubinius的移动使用的C ++标准库的一部分),或仅用于研究目的( Mozilla的水仙 )



Answer 8:

我其实是一个孩子,哈哈。 我以前从来没有写一个实际的编译器或设计的语言,但我已经完成了红龙书,所以我想我的有些想法(我希望)。

这将首先取决于语法。 如果它是LR或者LALR我想一样的工具野牛 / Flex的将工作做好。 如果它更LL,我会用精神 ,这是加速的一个组成部分。 它允许你写的语言在C ++语法以EBNF的语法,所以用代码生成周围没有得过且过; C ++编译器编译的语法为您服务。 如果其中任何一个失败,我会写在纸上EBNF语法,然后继续做一些繁重的递归下降解析,这似乎工作; 如果C ++可以使用RDP(如GCC做的话)被解析得很好,然后我有足够的单元测试和耐心想你可以使用RDP编写整个编译器。

一旦我有一个解析器运行和某种中间表示,这则取决于它如何运行。 如果是一些字节码或本地代码编译器,我将使用LLVM或libJIT对其进行处理。 LLVM是更适合于一般的编辑,但我喜欢的libJIT API和文档的质量更好。 或者,如果我真的懒,我会生成C代码,让GCC做实际的汇编。 另一种替代方法,是针对现有的VM,如鹦鹉或JVM或CLR。 鹦鹉是VM被设计为Perl。 如果它只是一个解释,我会走的语法树。

甲基基团的替代方法是使用Prolog的,其具有的语法特征这就显着模拟EBNF。 我与它没有经验不过,如果我没看错的(这我几乎可以肯定将是),如果用于分析重型编程语言有很多语法结构和怪癖(读的Prolog的速度非常之慢:C ++和Perl)。

所有这一切,我会用C ++做的,如果仅仅是因为我更习惯在它比C写我会留在Java / Python或用于实际生产代码,那样的话(在写C / C ++编译器的帮助远使其便携式),但我可以自己使用它们作为原型语言,特别是Python的,对此我向部分看到。 当然,我从来没有真正做过任何此之前,所以我不是人能说清楚。



Answer 9:

在λ-的,最终有一个链接创建您自己的编程语言由马克-安德烈·Cournoyer,这似乎说明如何利用一些现代的工具,用于创建小语言。



Answer 10:

只是为了澄清,我的意思是,不是你怎样设计语言(即我可以找出相当容易)

只是一个提示:看一些完全不同的语言首先,(有一个非常不同的评价策略,即语言)设计新languge之前。 哈斯克尔和奥兹浮现在脑海中。 虽然你也应该知道的Prolog和方案。 一年前,我也很喜欢“嘿,让我们来设计一个表现正是我想要的语言”,但fortunatly我看着那些其他语言的第一个(或者你也可以说, 不幸的是 ,因为现在我不知道我是怎么想语言表现了...)。



Answer 11:

在开始创建语言之前,你应该阅读:

Hanspeter Moessenboeck,尼克劳斯·维尔特的艺术

ftp://ftp.ssw.uni-linz.ac.at/pub/Papers/Moe00b.pdf



Answer 12:

真正的程序员还是代码C.只要它是一个豆蔻更清晰。
嗯...语言设计? 或者写一个编译器? 如果你想要写一个编译器,你会使用Flex +野牛。 (谷歌)



Answer 13:

没有一个简单的答案,但..

你基本上要定义一组写在文本(标记)规则,然后一些解析器,检查这些规则和它们组装成片段。

http://www.mactech.com/articles/mactech/Vol.16/16.07/UsingFlexandBison/

人们可以花几年此,关于使用两个工具(Flex和野牛),可用于将文本转换代码,你可以养活一个编译器上面的文章会谈。



Answer 14:

首先,我花了一年左右的实际认为语言应该是什么样子等。 同时我帮助开发伊欧凯(www.ioke.org)学习语言的内部。

我选择的Objective-C作为实现平台,因为它是快(足够的),操作简单,丰富的语言。 它还提供测试框架,以便敏捷方法是一展身手。 它还具有丰富的标准库,我可以建立在。

因为我的语言是句法层面(没有关键字,只有文字,运营商和消息)简单,我可以用Ragel(去http://www.complang.org/ragel/ )建设扫描仪。 这是快得要命,简单易用。

现在我有一个工作对象模型,扫描仪和简单的操作加上洗牌标准库引导代码。 我甚至可以运行一个简单的程序 - 只要它们适合在一个文件,它是:)



Answer 15:

当然较旧技术仍然共同(例如,使用Flex和野牛)许多较新的语言实现结合词法和解析阶段,通过使用基于一个解析表达式语法(PEG)的分析器。 这适用于使用组合程序,或memoizing Packrat解析器创建递归下降解析器。 许多编译器使用ANTLR的框架还内置。



Answer 16:

使用野牛/柔性是YACC /法的GNU版本。 这本书是非常有用的 。

使用野牛的原因是它捕获在语言的任何冲突。 我用它,它使我的生活了多年容易(行,所以我对我的第二年,但第一6个月是几年前写在C ++和解析/冲突/结果是可怕的!:()。



Answer 17:

如果你想明明写一个编译器,你需要阅读的龙书;)

这是我刚才读另一本好书。 它实用,更容易比龙书就明白了:

http://www.amazon.co.uk/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=language+implementation+patterns&x=0&y=0



Answer 18:

有一个大的快捷方式实现,我没有在这里其他的答案看到的语言。 如果您使用的卢卡西维茨的“加括号”的形式之一(即正向波兰或逆波兰式)你并不需要一个解析器在所有! 随着逆波兰,依赖向右走向左,所以你只是因为它的扫描执行每个令牌。 凭借着上光剂,它是,反向,所以你实际执行计划“倒退”,简化了子表达式,直到达到起始标记。

要理解为什么这个工程,你应该调查3主树遍历算法:预订购,按顺序,后序。 这三种遍历是一个语言的读者(也就是解析器)具有履行解析任务的倒数。 只有有序符号“需要”的递归体面的重新构建表达式树。 与其他两个,你可以逃脱只是一个堆栈。

这可能需要更多的“思考”,少‘实现’。

顺便说一句,如果你已经找到了答案(这个问题是一岁),你可以张贴并接受它。



Answer 19:

迈克 -

如果你有兴趣在一个有效的本地代码生成编译器为Windows,以便您能得到您的轴承 - 无需通过所有不必要的窗口小部件,小工具,以及其它废话涉水,今天混乱的机器 - 我建议Osmosian订单的纯英语开发系统。 它包括一个独特的界面,简单的文件管理器,友好的文本编辑器,方便的十六进制自卸车,(当然)编译器/连接器,以及文档所见即所得的页面布局应用程序。 完全用简单的英语,这是一个快速下载(不到一兆字节),足够小,在短期内了解(的纯英文代码25000行,只有4000的编译器/连接器),但足够强大的自我复制在不到三秒钟一个自下而上的对线的戴尔。 真是:三秒钟。 而且它是免费提供给所有谁写的,并索要副本,包括源代码和和比较幽默舌头在脸颊100页的手册。 见www.osmosian.com关于如何得到一份拷贝,或直接与问题或意见给我写信的细节:Gerry.Rzeppa@pobox.com



文章来源: How to create a language these days?