Skip to content

LLVM笔记(2):LLVM的语言(中)

(本文是 http://llvm.org/releases/2.9/docs/LangRef.html 的阅读笔记,前作为《LLVM笔记(1):LLVM的语言(上)》。)

  • Type System
    • Type Classifications
      • integer: i1, i2, i3, … i8, … i16, … i32, … i64
      • floating point: float, double, x86_fp80, fp128, ppc_fp128
      • first class: integer, floating point, pointer, vector, structure, array, label, metadata.
      • primitive: label, void, integer, floating point, x86mmx, metadata.
      • derived: array, function, pointer, structure, packed structure, vector, opaque.
    • Array type
      • [<# elements> x <elementtype>]
    • Function Type
      • <returntype> (<parameter list>)
    • Structure Type
      • { <type list> }
    • Packed Structure Type
      • < { <type list> } >
    • Pointer Type
      • <type> *
    • Vector Type
      • < <# elements> x <elementtype> >
    • Opaque Type: represents unknown type
    • Type Up-references
      • needed by the asmprinter for printing out cyclic types
  • Constants
    • Simple Constants
      • Boolean(true, false)
      • Integer(e.g. 42)
      • Floating point(3.14 or 6.02E+23 or double 0x432ff973cafa8000 (IEEE))
      • Null pointer (null)
    • Complex Constants
      • Structure constants
        • { i32 4, float 17.0, i32* @G }
        • @G = external global i32
      • Array constants
        • [ i32 42, i32 11, i32 74 ]
      • Vector constants
        • [ i32 42, i32 11, i32 74 ]
      • Zero initialization
        • zeroinitializer
      • Metadata node
        • metadata !{ i32 0, metadata !”test” }
    • Global Variable and Function Addresses
    • Undefined Values
      • The string ‘undef’ can be used anywhere a constant is expected, and indicates that the user of the value may receive an unspecified bit-pattern.
    • Trap Values
    • Addresses of Basic Blocks
      • blockaddress(@function, %block)
    • Constant Expressions
      • trunc, zext, sext, fptrunc, fpext, fptoui, fptosi, uitofp, sitofp, ptrtoint, inttoptr, bitcast
      • getelementptr, select, icmp, fcmp, extractelement, insertelement, shufflevector, extractvalue, insertvalue
      • OPCODE
  • Other Values
    • Inline Assembler Expressions
      • Inline Asm Metadata
      • Metadata Nodes and Metadata Strings
  • Intrinsic Global Variables
    • The ‘llvm.used’ Global Variable
      • The @llvm.used global is an array with i8* element type which has appending linkage.
    • The ‘llvm.compiler.used’ Global Variable
    • The ‘llvm.global_ctors’ Global Variable
    • The ‘llvm.global_dtors’ Global Variable

伊藤诚如何拯救世界

那个晚上,我在cc98论坛发完一篇拼命写就的文章后,饥渴难耐,于是想一个人从玉泉30舍走到黄龙麦当劳。

黄龙附近的路,我走过很多遍,但从没一个人走过,所以一直都不熟。我绕了很多圈子,还在途中通过电话向赖聪林班长大发厥词探讨人生的意义,才找到了那家麦当劳。

我在麦当劳点了4号套餐,吃完后觉得它的可乐加冰加太多太冷了,就想要杯咖啡暖暖身子。结果我发现,钱包里的钱距离买一杯咖啡恰好差一块钱,就万幸地没在那个迷离的晚上喝咖啡。

(我后来喝到咖啡了,是在曹光彪楼的自动咖啡机里花一块钱买的。那杯咖啡引发了一个远远更加离奇的故事,并直接导致了我第一次到杭州市第七人民医院的旅行,但是那个故事我现在不想讲。)

在那个晚上,在从黄龙麦当劳返回玉泉30舍的路上,我构思了一部小说,一部《School Days》的同人小说。讲的是伊藤诚演出了鲜血之终末的惨剧之后,又度过了炼狱的忏悔与救赎,最终重新轮回到他第一次在电车上相遇言叶的那一刻。

将动画之剧情称为第0次轮回的话,那么这就是伊藤诚的第1次轮回。

伊藤诚在这次轮回中从一开始就坚定自己的最爱是西园寺世界。他想要拯救世界,让她和自己都能免于惨死的命运,让两人能一直一起幸福地生活下去。

可是拯救世界谈何容易?比身边的所有人都多经历过一次人生的伊藤诚发现,自己与西园寺除了肉欲的沉溺,其实无法好好地交流和沟通。他想改变世界,他想改变世界所读的书,他想改变世界爱看的电影,他想改变世界的审美风格,他想改变世界的一切在他看来不恰当的志趣,他想改变世界使她变成与自己完美契合的另一半的自己⋯⋯

是的,伊藤诚在第1次轮回中由“伊藤诚X西园寺世界”这一世界观设定向下推导走至死胡同时,他用尽了所有的力量想要改变世界,然而西园寺并没有如他所愿的方向发生改变。

第1次轮回的结局虽不像第0次那样血腥,但也是一个伊藤诚形影单只的 BAD END。

伊藤诚在第1次轮回的终末意识到:改变世界是一个复杂的系统工程。例如,不得不考察的是世界所处的环境,那个有着古怪风俗的学校。他应该知道,世界的性格与她所处的环境息息相关。想改变一个人是很难的,如果必须要改变一个人,首先不得不改变的便是她的所处环境。

也许在将来的某次轮回中,伊藤诚会胸怀“要改变世界,先改变校园”的理想去大胆地竞选学生会主席。也许在再将来的某次轮回中,伊藤诚会对学生会的官僚和僵化无法忍受,而组建了自己领导的志在改变校园的亲卫队。也许在再再将来的某次轮回中,伊藤诚的亲卫队会变得如电影《浪潮》中一样躁狂,而伊藤诚正好又为了学校的事务与政府部门有了摩擦,便利用了手下这一股力量来施压,从此走上政治的舞台⋯⋯诸如此般。

他在一次次的轮回中经历了方方面面的成长,经历了层出不穷的挫折,面临了各种各样的失败。最终,在最终回的最后一幕,他与世界一起幸福地慢慢变老⋯⋯

这就是这部未写出的同人小说的构思。

我很羡慕这部小说中的男主角伊藤诚,不是羡慕他具有能够在时空中一次次轮回的能力,而是羡慕他能在一开始就确定这部小说的唯一的女主角,不是桂言叶,不是清浦刹那,不是加藤乙女,更不是从别的地方穿越来的什么路人甲,而是世界。

世界。唯一的世界。西。园。寺。世。界。

我想拯救的也是世界,而唯一让我迷惘的是,在这个以三次元为表现形式的世界中,何处才是我的西园寺?

前两天刚刚更新简历,同时也通知了Facebook那边,放弃了寒假的实习机会。可我还是不确定,我的简历,应该投哪儿?

LLVM笔记(1):LLVM的语言(上)

(本文是 http://llvm.org/releases/2.9/docs/LangRef.html 的阅读笔记,前作为《LLVM笔记(0):在一切开始之前》。)

  • 一句话总结: LLVM is a Static Single Assignment (SSA) based representation that provides type safety, low-level operations, flexibility, and the capability of representing ‘all’ high-level languages cleanly. It is the common code representation used throughout all phases of the LLVM compilation strategy.
  • LLVM语言有三种形式:in-memory compiler IR, on-disk bitcode representation, human readable assembly language representation。三种表现形式是等价的。
  • LLVM语言的目标是:一方面 light-weight and low-level,另一方面expressive, typed, and extensible。
    • “universal IR”
  • Identifiers
    • global: @开头
    • local: %开头
  • ‘;’开始注释
  • High Level Structure
    • Module
      • llvm linker to combine
      • global values: functions and global variables
      • linkage types
        • private, linker_private, linker_private_weak, linker_private_weak_def_auto
        • internal, available_externally, linkonce, weak, common, appending, extern_weak
        • linkonce_odr, weak_odr
        • externally visible (default)
      • Calling Conventions
        • ccc: the C calling convention
        • fastcc: the fast calling convention
        • coldcc: the cold calling convention
      • Visibility styles (for global variables and functions):
        • default, hidden, protected
      • Named types
        • e.g. %mytype = type { %mytype*, i32 }
      • Global variables
        • many aspects can be controlled
      • Functions
        • definition and declaration
        • definition contains a list of basic blocks, Control Flow Graph for the function
          • each basic block optionally starts with a label, contains a list of instructions, and ends with a terminator instruction
          • first basic block is special: 1. immediately executed on entrance; 2. not allowed to have predecessors
      • Aliases
      • Named Metadata: a collection of metadata
      • Parameter Attributes
        • zeroext, signext, inreg, byval, sret, noalias, nocapture, nest
      • Garbage Collector Names
      • Function Attributes
      • Module-Level Inline Assembly
      • Data Layout
        • target datalayout = “layout specification”
      • Pointer Aliasing Rules
        • memory access must be through pointers
        • a pointer value is based on another pointer value according to the rules
      • Volatile Memory Accesses

难讲难学的动态规划

最近在写一本暂名为《动态规划的思考艺术》的书。为了写书,也在读国外的关于动态规划的学术著作。

前几天读了一本成于上世纪七十年代的 The Art and Theory of Dynamic Programming 的前八章(即涉及确定性动态规划的全部章节),并做了一些笔记。深深感到,动态规划这个话题,一方面是相当趣味的理论,另一方面又是难以言说的艺术。那本书中,作者在大量的例子中穿插了大量的书后附有答案的习题,还特别强调,要想学会学好动态规划,光看例题是不够的,看完习题马上就翻答案也是不行的,必须对习题进行了独立的思考后,再翻看答案对照,才可能学好动态规划。

动态规划并没有什么深奥的数学基础,我这几天在看的去年刚刚出版的 Dynamic Programming: Foundations and Principles 一书中就将动态规划的数学基础归纳为几个及其简单(所以也就极其灵活)的式子,然后展开了详细的数学的分析与讨论。(值得一提的是,这本书分为两个部分,第一部分题为Science,第二部分题为Art。)

动态规划很简单,它的要素被作者在第三章中字字珠玑地归纳为五句话:

  1. A sequence consisting of elements denoting the stages of the decision-making process.
  2. A set whose elements represent the state of the process in each stage.
  3. A collection of sets where each set contains elements designating the feasible decisions pertaining to a stage-state pair.
  4. A transition function embodying the dynamics of the states as they evolve over stages.
  5. An objective function stipulating the overall return or cost generated by any sequence of decisions.

但动态规划又很难,因为上面直指本质的五句话如果没有一定的铺垫与积累,初学者看了也是白看。

我希望我的写作能让别人、也让我自己更好地理解动态规划,能让更多人掌握堪称艺术的解动态规划题的思维方法。

是为记。

新学期第3周:弗洛伊德的移情作用

今天又去杭州市第七人民医院玩了,那里有两个专家陪我玩,玩得很开心。

大家都知道,是心理学的先驱者[1]弗洛伊德最先阐明了精神分裂症的发病机理,并提出了精神分裂症的治疗方案。

一般认为,弗洛伊德即是治愈精神分裂症的第一人,其著作《少女杜拉的故事》即是弗氏的治疗方法及过程的病历式的写真。[2]

在弗洛伊德的心理学治疗方案中,其重要方法和步骤便是被精神病学界屡屡使用的专业术语“移情”[3]。关于移情的准确定义的原始出处,读者自可由《梦的解析》《精神分析引论》等著作中自行翻找,我由于手头缺乏文献(我弗洛伊德著作的收藏大部分放在安阳而非杭州),就不引用原文了。

在弗洛伊德的精神分析方法中,移情作用主要是指,患者将未能合理释放的、由幼年记忆符号化的、目标指向其父母的、代表着利比多的前进方向的、人类与生俱来的俄狄浦斯情结或厄勒克特拉情结,转移到其心理医生身上,并借助医生将自身的情结给予释放。换句话说,弗洛伊德的移情是指患者不再将医生当做医生,而妄想为自己的父母或恋人,而医生则借助这种不切实际的情结,将患者的利比多引导到适合的方向,最终达到精神分裂症的治愈。[4]

这就意味着,弗洛伊德式的精神分析师与病人之间的关系将不同于单纯的医患关系,精神分析师将时而像父母般循循善诱,时而像老师般谆谆教诲,时而像恋人般脉脉含情。某些心理咨询学家不能同意这种观点,但又不愿意舍弃“移情作用”这一方便的名词,于是便在重新定义心理咨询师与来访者之间的关系的同时,对“移情作用”之概念的内涵及外延作出了改动。[5]

现在,当心理学家提及“移情”一词或“移情作用”一现象时,如果他/她不事先说清楚自己使用此词的含义,那他/她就是在有意无意地将水搅浑。在精神分析进入到后期,患者对与其亲近之人的复杂情绪全部经由移情作用转移到他的精神分析师身上的时候,如何借助“反移情作用”,使精神分裂症患者再次明晰自己情感和利比多的本来走向,是精神分析学的一个仍未完满解决的重要课题。[6]

[1]: 关于弗洛伊德究竟是不是心理学的开创者,心理学界有着极大的争议,参见《弗洛伊德批判》。

[2]: 关于《少女杜拉的故事》是完全忠于事实、还是半真半假的基于现实的艺术加工、还是哗众取宠的纯粹扯淡,心理学界有着极大的争议,参见《弗洛伊德批判》。

[3]: 关于“移情”这一概念是否有其原始定义,定义得恰当与否,以及这一概念在精神病学中有否实际价值,是否应该扬弃,心理学界有着极大的争议,参见《弗洛伊德批判》。

[4]: 这段话是我将弗洛伊德的精神分裂症治疗方法浓缩成一句话而作成的,也有其它可能的总结方法,例如“骗吃骗喝骗钱骗感情”等;关于弗洛伊德治疗精神分裂症的方法究竟是什么,心理学界有着极大的争议,参见《弗洛伊德批判》。

[5]: 我确信我读过一本持这种观点的心理学著作,但是忘记了作者和名字,谁帮我填下参考文献?不过我确信有一本书虽然我手边没有,但是肯定引用了那个心理学家做参考文献,于是这里也可以参见《弗洛伊德批判》。

[6]: 课后习题:我的《弗洛伊德批判》曾经被我用平邮寄到合肥,但由于收件人未收件,包裹又被退回到紫金港邮局,而我又由于种种原因没有去紫金港邮局将其取回。请对我与这本书的复杂感情进行精神分析。