我如何为它创建YP和编译器长达12年



故事中的事件是按时间顺序排列的,如果您觉得任何事件都无关紧要,那么很可能并非如此,只是稍后的一刻就可以清楚地知道为什么我会提到此事件。 我创建的语言已经随着时间而改变,如果您阅读并理解该语言不是很好并且无法继续阅读,我仍然建议您通读至最后,也许您的意见会改变。 本文的图像未反映该语言的主要功能,但该语言确实没有任何链接。

读者好! 我的名字叫亚历山大(Alexander),我出生在白俄罗斯的一个小镇(不到10,000人)。 我的家人很穷,几乎没有玩具,关于电脑和任何游戏机,您都不会口吃。 尽管家庭很穷,母亲却没有可怜的亲戚,有时他们给了我们一些不便宜的东西。 然后有一天(2001年的某个时候),这些相同的亲戚给了我们一台Byte计算机(ZX Spectrum 48k的苏联类似物)。 我的快乐无止境! 我立即开始在上面发布游戏。 这台计算机上的游戏是从普通盒式磁带下载的。 下载一个游戏持续了大约5分钟,并且由于信号质量差而停止下载的可能性很小。 为了增加成功下载的可能性,我必须用酒精擦拭并调整磁带录音机读取头的位置。 加载过程中的所有这些萨满教义,加载的持续时间以及无法继续玩游戏,导致我逐渐开始对游戏失去兴趣。 但是,与Byte一起,我还得到了一本有关使用此计算机的书。 我决定读这本书以了解有关Byte功能的更多信息。 这本书原来是关于Byte内置的BASIC编程语言的教科书。

我刚刚拿起并将从书中获得的第一个程序复制到计算机上,然后启动了它。 当我在屏幕上看到一个圆圈时,我简直st住了-这是一种难以形容的感觉。 来到时,我开始在程序中更改各种数字,并且在启动图形更改形状后,我更改了数字并一次又一次地启动程序,感觉就像我在另一个宇宙中一样,开始研究它。 在阅读了本书基本内容之后,我开始创建自己的程序。 最初,我将它们写在一张纸上,编译并在脑海中启动,然后将其传输到计算机上,然后看结果如何。 当我自己写了第一本没有教科书的程序后,我意识到-这是我的,这是我一生中要做的事情。 我整天开始在纸上写各种程序(包括游戏)。

大约一年后,发生上述事件后,计算机科学出现在我的学校里。 随着时间的流逝,在课程中,我们开始学习IntAl程序中的编程。 在课程中,我们进行了一些编程,因为还有许多其他与编程无关的资料,并且我们还依次使用计算机(计算机少于学生)。 但是我们学校有一所计算机科学选修课,所以我决定就读该校,希望他们能给我更多编程机会。 从我真的很喜欢这门语言的第一刻起,我们就开始学习Turbo Pascal。 有记录(它们是结构),单元(它们也是模块和库),过程和功能。 那是一种新的美丽世界,比我以前知道的一切都美丽。 开始学习Pascal之后,我终于决定要成为一名程序员。

从学校九年级毕业后,我可以选择去任何大学还是十年级。 我决定去一家专门从事计算机操作员工作的大学,对物理学,数学,天文学和计算机科学进行深入研究。 许多人说,如果我从这个专业毕业,我将更容易以程序员的身份进入大学。 我花了三个小时来解决入学考试,我只用了30分钟,其中10分钟检查了一切是否正确。 收到! 在Lyceum,我继续学习Pascal,但同时也开始学习Photoshop,Corel Draw,Excel,Windows命令行和.bat文件。

在了解了我的工作后,给我“字节”的亲戚给了我一台具有以下特征的新计算机:单核Intel Celeron 800 Mhz,64 Mb RAM,14 Gb硬盘驱动器,分辨率为640 x 480的内置视频和16种颜色。 父母购买了64 Mb的RAM和Matrox Milenium g400 16 Mb的视频卡进行了升级和升级,可支持1600万种颜色,分辨率为800 x 600(显示器限制)。 那时,几乎没有人可以访问Internet,所有信息主要来自商店出售的磁盘。

我的一个朋友买了几张Delphi编程CD,这些CD包括Borland Delphi 7,一堆教程,一堆组件和一个程序,其中包含有关Delphi的许多问题以及这些问题的答案(至少是一种脱机StackOverflow)。

一切是如此简单和方便,以至于程序是一个接一个地编写的。 在lyceum的图书馆中,还有一本有关C语言编程的教科书。读完它后,我意识到我根本不喜欢C语言,我更喜欢Pascal,尤其是Delphi。 C更为复杂且不太方便,我唯一喜欢的是使用花括号而不是begin end。 但是我不需要认为Pascal对我来说是一种理想的语言,随着时间的流逝,语言中的许多东西开始让我烦恼(除了开始结局之外)。 例如,我希望字符串和数组成为具有以下字段的结构:指向具有数据的存储区的指针,元素数,指针可以在该存储区中容纳的最大元素数,以便多个数组或行可以指向同一存储区您可以从另一个数组中创建一个数组而无需复制元素。 后来证明,我想要的这种数组称为切片。 然后我想写一个翻译器,将这种修改过的pascal转换成常规的pascal,但是我放弃了这个想法。

向我介绍Delphi的同一个朋友说,某家公司使用Ubuntu和Kubuntu发送免费磁盘。 我什至不知道那是什么,但他免费给了我2张光盘。 Ubuntu并不是从我开始的,但是Kubuntu可以启动并且运行良好。 我很惊讶-事实证明,除了Windows和Dos之外还有其他功能。 我真的很想将Kubuntu放在计算机上进行研​​究,但是14 Gb驱动器绝对反对它。 另外,到这个时候我已经可以访问Internet(5 Kb / s),而Kubuntu中的调制解调器无法正常工作。 因此,带有Kubuntu的磁盘被扔到了架子上。 突然,同一个朋友开始疯狂地使用某种汇编程序,上面的一切都显示了某种程序,但它们只是让我微笑,因为用一行Delphi代替了50行汇编器,但是一位朋友说服我尝试使用FASM制作了一个磁盘和组装书。 我不喜欢汇编器,尽管FASM中的宏很酷。

所以我中学毕业了,该上大学了。 但是在学堂结束前不久,我开始在互联网上赚钱。 互联网上有很多骗子,他们假装自己是成功的企业家,并为不知情的用户提供以下优惠:“给我们至少一美元,两周后我们将退还您两美元”。 如果您给这些诈骗者一美元,很奇怪,在2周后他们确实会返还2美元,但是如果您在10周后再给2美元,则表明我的帐户中有20美元,但将无法取款。 我创建了许多邮箱,并使用各种邮箱并更改了IP地址(我有一个动态IP),我在骗局网站上注册了很多帐户,每次都向它们投入1美元。 考虑到我已经以这种方式赚了一点钱,我开始被这样的想法所吸引:“也许我不应该去上大学? 我可以不用大学就可以随意编程。” 我也倾向于这种想法,因为互联网经常会写到程序员不需要塔。 当我在思考-“要采取行动还是不采取行动?”时,生活本身就为我决定了。 父亲在一个约会网站上签约,发现了对自己的新爱,并把我和他的母亲扔了出去。 意识到我的母亲无法在我学习期间支持我,所以我没有开始上大学。 讲习班结束后,我不得不在一家企业工作一年。 我在一家杂货店找到了一份工作,从事提取TTN并将其输入计算机中的商品的操作。 在商店中工作了一段时间之后,我编写了一个程序来分析商店中的产品数据库并查找潜在的问题。 此后,这家商店的拥有者提议以程序员的身份转给他们,但当他们发现我没有受过高等教育时,他们改变了主意。 我继续在商店里工作。 我的薪水还不错,但是骗子的收入很少。 收入很低,因为注册帐户花费了很多时间,在白俄罗斯,很难使用互联网资金。 自由储备金(Liberty Reserve)-互联网货币,由哥斯达黎加的一家银行提供,其工作没有向政府提供有关其客户的信息,这就是大多数诈骗者使用自由储备金的原因。

在白俄罗斯,要购买这笔钱特别困难,因为在自动换热器中,您必须多付七倍的钱(如果有记性的话),而从人那里买钱是冒险的生意。 我停止欺骗骗子,只从工作中获得收入。 经过一年的工作,我决定寻找更好的东西。 我手头上有很多钱,所以决定升级计算机。 新PC的功能:AMD Athlon 64 x2 2600(支持以前的处理器中没有的SSE2指令。这很重要!),1 Gb RAM,80 Gb硬盘驱动器。 记得我想学习Kubuntu但我的硬盘驱动器太小,我决定同时安装Linux和Windows,因为该驱动器没有问题。 当我去计算机驱动器商店时,我购买了openSUSE 10.2驱动器。 我的新工作是在我市的一家公司修理计算机,试用期为一个月。 该公司的负责人以及他的妻子正在开发某种会计软件,得知我很喜欢编程,他们愿意加入一部分未来的销售中,但是由于他们正在使用Visual FoxPro和SQL进行开发,因此我需要学习这些语言。 我同意了 一个月后,事实证明他们并不想带我去工作,但是他们需要我替换这位在他返回时休假的雇员,他们说他们不再需要我,但仍然希望我帮助他们随着发展,我当然拒绝了,并开始寻找新工作。 几个月的不成功搜寻导致我成为辅助工人来到了建筑工地。

辅助人员的薪水比商店中计算机操作员的薪水低3.5倍,但我必须说,工作要容易得多(我是个坚强的人)。 周末,我使用FASM开始为我学习这些新的SSE2指令。 经过试验,我意识到在某些任务中,这些说明可以显着提高生产率。 我想知道软件开发人员如何在他们的SSE2应用程序中嵌入指令,因为如果使用它们解决了所有有意义的使用SSE2的任务,那么该程序将无法在没有SSE2支持的计算机上运行,​​但是如果您不使用它们,那么该程序会变慢。 当然,您可以在程序开始时确定处理器是否支持SSE2,并根据结果执行不同的代码,但是在这种情况下,开发和测试的复杂性会增加,RAM和处理器缓存的消耗也会增加。 在分析了几个程序之后,我发现大多数程序都不使用SSE2。 然后我问自己:“为什么编译器不将宏编译为汇编器,而在最终用户的计算机上,只有在创建二进制文件之后,某些实用程序才会填写宏所必需的常量?”。 而且,我想起了我在Lyceum发明的修改过的Pascal,因此决定编写这样的编译器。 我还决定将泛型添加到该语言中,并且该语言开始看起来像这样:

type Point(a){
    x, y: a;
}

type Line(a){
    a, b: Point(a);
}

function createLine(a, b: Point(a)) Line(a){
    result.a = a;
    result.b = b;
}

Windows Linux( Windows, Linux ). Ubuntu 8.10, . , Gentoo. Gentoo use- , . , , , , . , - LLVM, LLVM IR. , , FASM, LLVM IR, , , , LLVM , , . . LLVM IR , , , , , . , , LLVM IR, , , . :

function inc(a: ^Integer) Integer{
    result = a^ + 1;
}

procedure foo(){
    var
        a: ^Integer;
        b: Integer;
    ...
    // 
    ...
    b = inc(ro nocp a) //   inc       ,     
}

, (800 $/), . , Haskell, : « », « », , - , . . Haskell . , — , , , — , , , ( , ) — , , , — , . « Haskell ». , . , . , , Haskell, - , . Haskell , Haskell( Python), .

, . Haskell . - Junior Haskell Developer , . . , , IDE, firefox + google , . . Haskell .

, Haskell , , , Haskell , , Haskell — ! Haskell , , ( Haskell). :

function lineLength(line: Line) Real
    result = sqrt(sqr(line.a.x - line.b.x) + sqr(line.a.y - line.b.y))

- 800$ 400$, 120$ + + 250$. 250$, ? . , — , , . 35$ . , , , . , , , , , - . 2 . , - . , , , , , « , . » — . , , , (14 ). , , , , , , . , ( ), , , , 1-2 . . , , , 3 , . , 3 . , . ( ).

: , , , . ( ), , , , . , , , , , ( ). , . , - (, , , ), , - , . ( , , ), 60% . , , , . , , :

  1. , ( ).
  2. , LLVM IR . , A m, , LLVM IR , B A, m LLVM IR .
  3. .
  4. .

, . , :

  • Haskell?

    , , . :

    abstract class Printable
    
    require method (Printable) print()
    method (Printable) printLn()
        this.print()
        String.eol().print()
    

  • ?

    , , , . :

    class Some(SomeParent)
        a, b String
    
    class Some(Some, Printable)
    
    override method (Some) print()
        this.a.print()
        this.b.print()
    

  • ?

    ( 2 , — ).
  • , ?

    , . . :

    method (Some) foo(a :String, b String) // a -  , b - 
        c := 10 // c  
        d .= 12 // d  
        :someMethod() //   someMethod, c    
        c.someMethod() //   someMethod, c    
        //2  ,     ,    ,     
    

  • ?

    , . :

    class Point
        x,y Number
    
    method (Some) foo(a Point<x UInt64, y UInt64>) // a   ,     Point,      x  y.    ,     .
    
  • , Point x y .

    class Point
        x, y !Number //   x  ,  y   x
    

  • ?

    , , . :

    class Point
        numberClass #Number
        private x, y .numberClass
    
    method (Point) createPoint(x, y .numberClass) This //This -           
        result:x = x
        result:y = y
    

  • , LLVM IR ?

    ( ) , . :

    method (Some) foo(a .z, b Point<numberClass .f>, c UInt64)
    //a      z     
    //b       Point      numberClass,           f     
    //c    UInt64,     
    

  • ?

    , , , - , , . 0 — .

, . . , , , , , , . , , , — , . - 5 . , . : . — 170 $/. , , , , . , , .

, , , . , O0 O2, O1 O3. , LLVM IR, . LLVM IR, , clang C. - , C LLVM IR , LLVM IR. LLVM IR? .

C LLVM IR? LLVM IR C: , , , C . LLVM IR C. , . , , , . , this 2 ( ) 4. , , 20 — 40 ( ). , , . , 2 , , , , , , . , , — . , . , .

, :

  • , .
  • , .

— « , ?». , , , , . , this ( ). :

method (#Some) foo(a String, b `String, c ~String, d :String)
//this  
//a   
// b    ,         
//c        ,        
//d  ,  

. , , , ( ) , , , ( ) : , , , , this ( , ), , , , . , :

method (~Some) veryBadMethod(value This)
 this = value

method (#Some) foo()
    a := Some
    b .= Some#randomValue() //,    b    
    a~veryBadMethod(b)
    a:someMethod() //  ,   

, . , , . , , , . — 2 , , , , , — .

, , . , «! ! .». , . — . , , 150-180. 11 . , , , - , . (? , ). , . , , 30- , , , 200$ ( ), , , .

, . (Disciples 3) — , , — « !». , , , ? , ! , , . , « ? Haskell.». 10 , , , , , . -, , ( , ) , , .

, . , , . , , , , , .

, , , , , , . . . , , . :

type Point(a)
    x,y a

type SimplePoint
    x,y Double

//-  
a := Point(UInt64)

Haskell, , , , . , - . . :

group Equal
//equal(a, a) -> Bool

, Equal, equal, 2 , Bool.

(rules) — , . . :

rules
    1 = type == [_] //    
    2 = type[0] > Equal //      Equal
    3 = 1 & 2
    join 3 Equal //      Equal

. , , , , — . , 1 9 ( 5), , , , . :

func notEqual(a, b)
    rules
        final = a > Equal & a == b
        result = Bool
    result = !(a == b) //!  ==  ,    result = (neg(equal(a, b))  a.equal(b).neg()

, , , , . , , , , , . , bash , . ( ) .

, : cine, , fei. github:

cine fei.
.
.
( ).
XML Kate.

Linux x86_64( ) clang.

, , cine.

:

  • cine fei n-kine enfei.
  • cine C.
  • cine ( ).
  • 4ernika, , .
  • , , . size count , size count, . , , , .
  • , ( ).
  • , , ( , ). , , . .
  • cine , cine — UInt8, , .
  • LLVM IR C, clang GCC. , , , clang.
  • SIMD , 0.1 SIMD ( ), , SIMD .

Source: https://habr.com/ru/post/zh-CN481276/


All Articles