自己去创建一个编程语言吧(1)

你一定有过这种困惑,一直想要找到一个完全适合自己编码风格,开发习惯的语言。却发现每一个语言各有优略,没有哪个能完全适合你的…

或者你看到现在层出不穷的各种编程语言,难道就没有想装个逼,自己搞一个玩玩的冲动?

爱装逼的人都拥有同样的气质,所以,我就尝试自己创建了一个编程语言------------Menthol
所以,你也不用想了,自己开发一个吧。

下面我将以我创建Menthol语言过程为例子,一步步说明,如何创建一个基于虚拟机的编程语言。

在你实际编码前,需要有3点,做在编码前,很重要

1.确定你理想中个的编码风格

可能你无数次想过理想中的一个语言,但从来没有实际去写过类似风格的demo。所以,如果只通过思考去架构出一个完整的代码风格,可能比较困难,一个语言不仅要完成功能,还要保证书写的简便性、代码格式的优雅性

所以,用你最常用的语言,开发一个程序,这个程序,最好能稍微复杂一点,能最多的体现出语言的各种逻辑,比如可以写一个,从网页中获取img地址的功能,用C#写一个

private string[] GetHtmlImageUrlList(string sHtmlText)
{
    Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);

    MatchCollection matches = regImg.Matches(sHtmlText);
    int i = 0;
    string[] sUrlList = new string[matches.Count];

    foreach (Match match in matches)
        sUrlList[i++] = match.Groups["imgUrl"].Value;
    return sUrlList;
}
public static string DownloadHtml(string url)
{
    string html = string.Empty;
    try
    {
        var request = WebRequest.Create(url) as HttpWebRequest;
        request.Timeout = RequestModels.Timeout * 1000;
        request.UserAgent = RequestModels.UserAgent;
        request.ContentType = RequestModels.ContentType;
        request.Headers.Add("Cookie", @RequestModels.Cookie);

        using (var response = request.GetResponse() as HttpWebResponse)
        {
            if (response.StatusCode != HttpStatusCode.OK)
            {
                return url;
            }
            try
            {
                StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);//Encoding.GetEncoding("GB2312"));// 
                html = sr.ReadToEnd();
                sr.Close();
            }
            catch (Exception ex)
            {
                html = null;
            }
        }
    }
    catch (System.Net.WebException ex)
    {
        if (ex.Message.Equals("远程服务器返回错误: (306)。"))
        {
            return null;
        }
    }
    catch (Exception ex)
    {
       
        html = null;
    }
    return html;
}



然后把这个段代码,修改成为你理想中的代码风格。至于代码风格是怎样的,随便写,只要你写的顺手就可以。在这个过程中,你要确认,你的类型是静态的,还是动态的。

我们来把他翻译成Menthol语言的编码

 def GetHtmlImageUrlList(var $str)
    {

        var $sUrlList = [];
        var $a = Regex.Exec($str,"<img.*?src=[\'|\"](.*?(?:[\.gif|\.jpg|\.png]))[\'|\"].*?[\/]?>"); 
        for(var $s in $a){      
            Array.Push($sUrlList,$s[1]);     
        }   
    }


    def DownloadHtml(var $url)
    {
         var $curl = CurlSystem.init();
         CurlSetOpt.url($curl, $url);
         CurlCallback.writefunction($curl,test.getsource);
         var $res = CurlSystem.perform($curl);
         CurlSystem.cleanup($curl); 
    }



应为Menthol是无类型语言,所以,所有的变量声明不需要指定类型,在编译或运行时会自动判断,我将局部变量用 开头,因为是函数式语言,没有类的概念,只有模块的概念,所有调用模块方法的是时候,要用模块名 . 函数名调用,例如 C u r l S e t O p t . u r l ( 开头,因为是函数式语言,没有类的概念,只有模块的概念,所有调用模块方法的是时候,要用模块名.函数名调用,例如 CurlSetOpt.url( 开头,因为是函数式语言,没有类的概念,只有模块的概念,所有调用模块方法的是时候,要用模块名.函数名调用,例如CurlSetOpt.url(curl, $url); 还定义了类似C#的foreach的工能:for in。

目前通过上述只能看到这么多,当然,如果你写的程序够复杂的话,那么一次性定义出语法风格的机会就大很多,这个过程可能需要多次执行,才能最终把你需要的代码风格定义出来

应为C#Menthol在类库上的不同,所以,上述翻译不可能完全一样,只作为参考就可以了

2.定义关键字

如果你打算做成静态的话,那么所有的变量,对于编程人员来说,都要有一种类型,比如int,string,double等。如果是动态的话,就没有类型了。所有的类型就一种。我在开发Menthol时,以我的需求,定义了以下关键字

if else for break true false try except throw continue return while null import _mmain def var in typeof module use。

3.定义运算符

一个语言,不能只有关键字,那样逻辑运算无法进行,所以还要定义运算符,比如1中的"=“,”!=“,”[]"等。都可以算是运算符,Menthol,依目前开发需求定义如下运算符

/ () ; , | & ? [] ! % ^ : :: … = < > != <> || && >= <= == += -= /= = %= &= |= ^= << >> *

以上,定义一个语言的基本要素,已经完成.下面开始进行实际的编码操作

  • 23
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 的编译器和解释器是一个很有趣的项目。你可以学习到很多关于语言技术的知识,以及如何将代码转换为机器可以理解的形式。如果你是初学者,你可以先学习一些关于编译原理的基础知识,然后再开始写代码。如果你已经有了一些编程经验,那么你可以直接开始写代码。不管你是初学者还是有经验的开发者,这都是一个很好的学习机会。 Writing a compiler and interpreter for a programming language in Go is a fun project. You can learn a lot about language technology and how to translate code into a form that machines can understand. If you're a beginner, you can start by learning some basics about compilation theory, and then start coding. If you already have some programming experience, you can jump right into coding. Regardless of whether you're a beginner or an experienced developer, this is a great learning opportunity. ### 回答2: Go语言是一种开源的静态类型编程语言,因其简洁、高效和易用的特点,被广泛应用于编写各种类型的软件。而使用Go语言编写一个编程语言本身是可以实现的。 首先,编程语言是一种规则的描述方式,它定义了一套语法规则和语义规则,用于编写可执行的计算机程序。因此,用Go语言编写编程语言实际上是通过定义一系列的词法、语法和语义规则,来构建解析和执行程序的框架。 其次,Go语言自身提供了强大的工具和库,使得编写语言解析器、编译器和虚拟机等组件变得相对容易。通过使用Go语言的语法和工具,可以方便地定义和解析具有特定语法的源代码,将其转换为可执行的二进制代码,并最终在虚拟机或计算机上运行。 在编程语言设计的过程中,需要考虑词法分析、语法分析、符号表管理、类型检查、代码生成等多个方面。使用Go语言的强类型特性,可以方便地进行类型检查和代码生成,同时Go的并发特性也为编写具有并行执行能力的编程语言提供了支持。 最后,编程语言的学习和应用是一个持续改进的过程,使用Go语言编写的编程语言也需要不断进行调试和优化。Go语言的快速编译和执行速度,以及强大的测试和性能分析工具,可以极大地提高编程语言开发效率和质量。 总之,使用Go语言编写编程语言是完全可行的,通过合理地设计和实现,可以创建出功能完备、易用高效的新编程语言。同时,借助Go语言的生态系统和工具,也可以为编程语言提供更好的开发和调试环境。 ### 回答3: 使用Go语言编写一种新的编程语言的过程需要遵循一定的步骤和规则。下面是一个简要的概述: 1. 设计语言的语法:首先,需要确定编程语言的语法结构和规则。这涉及定义关键字、变量和函数声明、控制流语句等。这个设计的目标是使语言易于理解和使用。 2. 编写词法分析器:词法分析器的作用是将源代码分解为符号或记号(tokens)的序列。每个符号代表源代码中的一个词或操作符。在Go语言中,可以使用正则表达式和字符串处理函数来实现词法分析器。 3. 编写语法分析器:语法分析器的任务是将词法分析得到的记号序列转化为抽象语法树(AST)。抽象语法树表示源代码的结构和层次,使得可以进行进一步的分析和操作。Go语言提供了一些强大的工具,如解析器生成器(parser generator)来简化语法分析器的编写。 4. 实现编译器/解释器:根据语法树生成可执行代码的过程称为编译,而将源代码行为直接解释为机器指令的过程称为解释。在Go语言中,可以使用AST作为中间表示(IR),根据IR生成目标代码或直接执行。 5. 定义标准库和扩展:一个完整的编程语言需要一个强大的标准库,提供常用的函数和工具,使得开发者可以通过调用这些库快速实现功能。此外,提供扩展语言的机制和接口,使得其他开发者可以为该编程语言编写自己的库和组件。 6. 测试和优化:在开发过程中,进行充分的测试和优化是必不可少的。编写单元测试、集成测试和性能测试来确保编程语言的正确性和性能。 尽管Go语言本身已经非常适合编写编译器和解释器,但是编写一个全新的编程语言仍然需要耗费大量的时间和精力。编程语言的设计和实现是一个复杂的过程,需要的知识和技能包括编译原理、语言设计、算法和数据结构等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值