开源巨献:Google最紧俏60款开源项目

项目原理

品种是.NET编程中的基本单元。在C#中,类型可以运用class,struct和interface关键字展开宣示。大多数项目由程序员显式创制,可是,在特意的相互操作(interop)处境和长途对象调用(.NET
Remoting)场面中,.NET
CLR会隐式的发出类型,这么些暴发的品类涵盖COM和运行时可调用封装及传输代理(Runtime
Callable Wrappers and Transparent Proxies)。

大家经过一个暗含对象引用的栈最先探究.NET类型原理(典型地,栈是一个对象实例开头生命期的地点)。
图4中显得的代码包含一个粗略的次第,它有一个控制台的入口点,调用了一个静态方法。Method1创办一个SmallClass的品种实例,该项目涵盖一个字节数组,用于演示怎么着在大目的堆创立对象。固然这是一段无聊的代码,不过可以帮助我们开展座谈。

图4 Large Objects and Small Objects

using System;

class SmallClass
{
    private byte[] _largeObj;
    public SmallClass(int size)
    {
        _largeObj = new byte[size];
        _largeObj[0] = 0xAA;
        _largeObj[1] = 0xBB;
        _largeObj[2] = 0xCC;
    }

    public byte[] LargeObj
    {
        get { return this._largeObj; }
    }
}

class SimpleProgram
{
    static void Main(string[] args)
    {
        SmallClass smallObj = SimpleProgram.Create(84930,10,15,20,25);
        return;
    }

    static SmallClass Create(int size1, int size2, int size3,
        int size4, int size5)
    {
        int objSize = size1 + size2 + size3 + size4 + size5;
        SmallClass smallObj = new SmallClass(objSize);
        return smallObj;
    }
}

图5 展现了为止在Create方法”return smallObj;”
代码行断点时的fastcall栈结构(fastcall时.NET的调用规范,它注明在可能的情状下将函数参数通过寄存器传递,而其他参数依照从右到左的一一入栈,然后由被调用函数完成出栈操作)。本地值类型变量objSize内含在栈结构中。引用类型变量如smallObj以一向大小(4字节DWORD)保存在栈中,包含了在一般GC堆中分配的靶子的地点。对于价值观C++,这是目的的指针;在托管世界中,它是目的的引用。不管怎么着,它包含了一个目的实例的地方,大家将运用术语对象实例(ObjectInstance)描述对象引用指向地址地点的数据结构。

图5 SimpleProgram的栈结构和堆

图片 1

诚如GC堆上的smallObj对象实例包含一个名为 _largeObj
的字节数组(注意,图中突显的尺寸为85016字节,是实际上的储备大小)。CLR对超越或等于85000字节的靶子的处理和小目的不同。大目标在大目标堆(LOH)上分红,而小目的在形似GC堆上创造,这样可以优化对象的分红和回收。LOH不会缩减,而GC堆在GC回收时开展压缩。还有,LOH只会在一齐GC回收时被回收。

smallObj的靶子实例包含类型句柄(TypeHandle),指向对应项目标方法表。每个阐明的类型有一个方法表,而平等类型的保有目的实例都指向同一个方法表。它包含了品种的性状音讯(接口,抽象类,具体类,COM封装和代办),实现的接口数目,用于接口分派的接口图,方法表的槽(slot)数目,指向相应实现的槽表。

主意表指向一个名为EEClass的重点数据结构。在措施表创立前,CLR类加载器从元数据中开创EEClass。
图4中,SmallClass的法子表指向它的EEClass。这一个协会指向它们的模块和程序集。方法表和EEClass一般分配在共享域的加载器堆。加载器堆和应用程序域关联,这里涉及的数据结构一旦被加载到其中,就直到应用程序域卸载时才会收敛。而且,默认的施用程序域不会被卸载,所以这多少个代码的生存期是截止CLR关闭结束。

 

接口虚表图和接口图(Interface Vtable Map and Interface Map)

在艺术表的第12字节偏移处是一个关键的指针,接口虚表(IVMap)。如图9所示,接口虚表指向一个采取程序域层次的映射表,该表以进程层次的接口ID作为目录。接口ID在接口类型第两次加载时创立。每个接口的兑现都在接口虚表中有一个笔录。如果MyInterface1被几个类实现,在接口虚表表中就有七个记录。该记录会反向指向MyClass方法表内含的子表的起来地方,如图9所示。这是接口方法分派暴发时采取的引用。接口虚表是基于方法表内含的接口图音讯创立,接口图在章程表布局过程中基于类的元数据创制。一旦类型加载成功,唯有接口虚表用于方法分派。

第28字节地方的接口图会指向内含在章程表中的接口音信记录。在这种意况下,对MyClass实现的多少个接口中的每一个都有两条记下。第一条接口信息记录的始发4个字节指向MyInterface1的体系句柄(见图9图10)。接着的WORD(2字节)被一个声明占用(0代表从父类派生,1代表由方今类实现)。在讲明后的WORD是一个起先槽(Start
Slot),被类加载器用来布局接口实现的子表。对于MyInterface2,起初槽的值为4(从0起先编号),所以槽5和6指向实现;对于MyInterface2,先河槽的值为6,所以槽7和8指向实现。类加载器会在急需时复制槽来发出如此的职能:每个接口有投机的兑现,可是物理映射到平等的法子描述。在MyClass中,MyInterface1.Method2和MyInterface2.Method2会指向相同的实现。

遵照接口的不二法门分派通过接口虚表举办,而一直的模式分派通过保留在各类槽的方法描述地址举办。如从前提及,.NET框架使用fastcall的调用约定,开首2个参数在可能的时候一般通过ECX和EDX寄存器传递。实例方法的首个参数总是this指针,所以通过ECX寄存器传送,可以在“mov
ecx,esi”语句看到这或多或少:

mi1.Method1();
mov    ecx,edi                 ;move "this" pointer into ecx
mov    eax,dword ptr [ecx]     ;move "TypeHandle" into eax
mov    eax,dword ptr [eax+0Ch] ;move IVMap address into eax at offset 12
mov    eax,dword ptr [eax+30h] ;move the ifc impl start slot into eax
call   dword ptr [eax]         ;call Method1

mc.Method1();
mov    ecx,esi                 ;move "this" pointer into ecx
cmp    dword ptr [ecx],ecx     ;compare and set flags
call   dword ptr ds:[009552D8h];directly call Method1

这个反汇编呈现了直白调用MyClass的实例方法没有运用偏移。JIT编译器把办法描述的地点直接写到代码中。基于接口的分担通过接口虚表暴发,和向来分派相相比需要一些外加的命令。一个限令用来得到接口虚表的地址,另一个拿到形式槽表中的接口实现的上马槽。而且,把一个目的实例转换为接口只需要拷贝this指针到对象的变量。在图2中,语句“mi1=mc”使用一个限令把mc的对象引用拷贝到mi1。

56、图像差距对比库 Butteraugli   ★Star 1100

静态变量(Static Variables)

静态变量是情势表数据结构的根本组成部分。作为艺术表的一有些,它们分配在章程表的槽数组后。所有的原始静态类型是内联的,而对于协会和引用的类此外静态值对象,通在句柄表中开创的靶子引用来针对。方法表中的对象引用指向应用程序域的句柄表的目的引用,它引用了堆上创造的目的实例。一旦创造后,句柄表内的靶子引用会使堆上的对象实例保持生存,直到应用程序域被卸载。在图9
中,静态字符串变量str指向句柄表的目的引用,后者指向GC堆上的MyString。

 

方法表

各类类和实例在加载到应用程序域时,会在内存中经过措施表来表示。这是在对象的首先个实例创制前的类加载活动的结果。对象实例表示的是气象,而艺术表表示了表现。通过EEClass,方法表把对象实例绑定到被语言编译器发生的投射到内存的元数据结构(metadata
structures)。方法表包含的新闻和外挂的音讯可以经过System.Type访问。指向方法表的指针在托管代码中可以透过Type.RuntimeTypeHandle属性得到。对象实例包含的品类句柄指向方法表先河地点的撼动处,偏移量默认情形下是12字节,包含了GC音讯。大家不打算在此处对其开展研商。

图 9
显示了法子表的独立布局。我们会申明项目句柄的部分关键的域,然则对于截然的列表,请参考此图。让大家从基实例大小(Base
Instance Size)先导,因为它一直关乎到运行时的内存状态。

图 9 方法表布局

图片 2

 

主意描述(MethodDesc)

形式描述(MethodDesc)是CLR知道的法门实现的一个包装。有三种档次的章程描述,除了用于托管实现,分别用于不同的相互操作实现的调用。在本文中,大家只考察图3代码中的托管方法描述。方法描述在类加载过程中爆发,起始化为指向IL。每个方法描述包含一个预编译代理(PreJitStub),负责触发JIT编译。图12呈现了一个首屈一指的布局,方法表的槽实际上指向代理,而不是事实上的方法描述数据结构。对于实际的法子描述,这是-5字节的撼动,是各样方法的8个叠加字节的一片段。这5个字节包含了调用预编译代理程序的授命。5字节的偏移可以从SOS的DumpMT输出从察看,因为方法描述总是方法槽表指向的地点前面的5个字节。在第一次调用时,会调用JIT编译程序。在编译完成后,包含调用指令的5个字节会被跳转到JIT编译后的x86代码的无偿跳转指令覆盖。

图 12艺术描述

图片 3

图12的办法表槽指向的代码举行反汇编,显示了对预编译代理的调用。以下是在
Method2 被JIT编译前的反汇编的简化展现。

Method2:

!u 0x00955263
Unmanaged code
00955263 call        003C3538        ;call to the jitted Method2()
00955268 add         eax,68040000h   ;ignore this and the rest
                                     ;as !u thinks it as code

最近大家实践此办法,然后反汇编相同的地点:

!u 0x00955263
Unmanaged code
00955263 jmp     02C633E8        ;call to the jitted Method2()
00955268 add     eax,0E8040000h  ;ignore this and the rest
                                 ;as !u thinks it as code

在此地方,只有起首5个字节是代码,剩余字节包含了Method2的形式描述的数量。“!u”命令不明了这或多或少,所以生成的是乱套的代码,你可以忽略5个字节后的保有东西。

CodeOrIL在JIT编译前带有IL中艺术实现的相对虚地址(Relative Virtual
Address
,RVA)。此域用作标志,表示是否IL。在按要求编译后,CLR使用编译后的代码地址更新此域。让我们从列出的函数中精选一个,然后用DumpMT命令分别出口在JIT编译前后的点子描述的始末:

!DumpMD 0x00955268
Method Name : [DEFAULT] [hasThis] Void MyClass.Method2()
MethodTable 9552a0
Module: 164008
mdToken: 06000006
Flags : 400
IL RVA : 00002068

编译后,方法描述的情节如下:

!DumpMD 0x00955268
Method Name : [DEFAULT] [hasThis] Void MyClass.Method2()
MethodTable 9552a0
Module: 164008
mdToken: 06000006
Flags : 400
Method VA : 02c633e8

模式的这些标志域的编码包含了办法的序列,例如静态,实例,接口方法如故COM实现。让我们看方法表此外一个错综复杂的地方:接口实现。它包裹了布局过程具有的错综复杂,让托管环境觉得这点看起来大概。然后,大家将表明接口怎么样开展布局和遵照接口的法门分派的恰当工作章程。

Netstack,使用 Go 语言编写的网络协议栈。通过安装 tun_tcp_echo demo
尝试在 Linux 上使用 。(详情:https://github.com/google/netstack

基实例大小

基实例大小是由类加载器总括的目的的轻重缓急,基于代码中宣示的域。在此之前早已钻探过,当前GC的实现需要一个至少12字节的目的实例。假若一个类没有概念任何实例域,它至少含有额外的4个字节。其余的8个字节被对象头(可能包含syncblk编号)和类型句柄占用。再说五遍,对象的大小会遭到StructLayoutAttribute的震慑。

看看图3中显示的MyClass(有六个接口)的主意表的内存快照(Visual
Studio .NET
2003内存窗口),将它和SOS的输出举办相比较。在图9中,对象大小位于4字节的舞狮处,值为12(0x0000000C)字节。以下是SOS的DumpHeap命令的出口:

!DumpHeap -type MyClass
 Address       MT     Size
00a819ac 009552a0       12
total 1 objects
Statistics:
    MT  Count TotalSize Class Name
9552a0      1        12    MyClass

12、Gson  ★Star 9261

前言

  • SystemDomain, SharedDomain, and DefaultDomain。
  • 对象布局和内存细节。
  • 方法表布局。
  • 办法分派(Method dispatching)。

因为国有语言运行时(CLR)即将成为在Windows上开创应用程序的主角级基础架构,
多精晓点关于CLR的纵深认识会匡助您构建高速的, 工业级健壮的施用程序.
在这篇作品中, 我们会浏览,调查CLR的内在精神, 包括对象实例布局,
方法表的布局, 方法分派, 基于接口的摊派, 和形形色色的数额结构.

咱俩会动用由C#写成的相当简单的代码示例,
所以任何对编程语言的隐式引用都是以C#语言为目标的.
商量的局部数据结构和算法会在Microsoft® .NET Framework 2.0中改变,
不过大部分的概念是不会变的. 我们会拔取Visual Studio® .NET 2003
Debugger和debugger extension Son of Strike (SOS)来窥探一些数据结构.
SOS可以清楚CLR内部的数据结构, 可以dump出有用的信息. 通篇,
我们会谈论在Shared Source CLI(SSCLI)中负有相关兑现的类, 你可以从
http://msdn.microsoft.com/net/sscli 下载到它们.

图表1 会帮衬你在摸索一些布局的时候到SSCLI中的新闻.

ITEM SSCLI PATH
AppDomain sscliclrsrcvmappdomain.hpp
AppDomainStringLiteralMap sscliclrsrcvmstringliteralmap.h
BaseDomain sscliclrsrcvmappdomain.hpp
ClassLoader sscliclrsrcvmclsload.hpp
EEClass sscliclrsrcvmclass.h
FieldDescs sscliclrsrcvmfield.h
GCHeap sscliclrsrcvmgc.h
GlobalStringLiteralMap sscliclrsrcvmstringliteralmap.h
HandleTable sscliclrsrcvmhandletable.h
InterfaceVTableMapMgr sscliclrsrcvmappdomain.hpp
Large Object Heap sscliclrsrcvmgc.h
LayoutKind sscliclrsrcbclsystemruntimeinteropserviceslayoutkind.cs
LoaderHeaps sscliclrsrcincutilcode.h
MethodDescs sscliclrsrcvmmethod.hpp
MethodTables sscliclrsrcvmclass.h
OBJECTREF sscliclrsrcvmtypehandle.h
SecurityContext sscliclrsrcvmsecurity.h
SecurityDescriptor sscliclrsrcvmsecurity.h
SharedDomain sscliclrsrcvmappdomain.hpp
StructLayoutAttribute sscliclrsrcbclsystemruntimeinteropservicesattributes.cs
SyncTableEntry sscliclrsrcvmsyncblk.h
System namespace sscliclrsrcbclsystem
SystemDomain sscliclrsrcvmappdomain.hpp
TypeHandle sscliclrsrcvmtypehandle.h

在我们最先前,请留心:本文提供的音讯只对在X86平台上运行的.NET Framework
1.1得力(对于Shared Source CLI
1.0也多数适用,只是在好几交互操作的事态下必须注意例外),对于.NET
Framework
2.0会有变动,所以请不要在构建软件时依赖于这几个内部结构的不变性。

20、创作艺术和作曲曲子的机械智能 magenta  ★Star 6563

加载器堆(Loader Heaps)

加载器堆的效应是加载不同的运转时CLR部件和优化在域的整个生命期内设有的预制构件。这么些堆的增长基于可预测块,这样可以使碎片最小化。加载器堆不同于垃圾回收堆(或者对称多处理器上的三个堆),垃圾回收堆保存对象实例,而加载器堆同时保留类型系统。平时访问的构件如方法表,方法描述,域描述和接口图,分配在屡次堆上,而较少访问的数据结构如EEClass和类加载器及其查找表,分配在低频堆。代理堆保存用于代码访问安全性(code
access security, CAS)的代办部件,如COM封装调用和平台调用(P/Invoke)。

从高层次了然域后,大家准备看看它们在一个简单易行的应用程序的前后文中的大体细节,见
图3。我们在程序运行时停在mc.Method1(),然后选用SOS调试器扩大命令DumpDomain来输出域的信息。(请查看
Son of
Strike
打探SOS的加载信息)。这里是编制后的出口:

图3 Sample1.exe

!DumpDomain
System Domain: 793e9d58, LowFrequencyHeap: 793e9dbc,
HighFrequencyHeap: 793e9e14, StubHeap: 793e9e6c,
Assembly: 0015aa68 [mscorlib], ClassLoader: 0015ab40

Shared Domain: 793eb278, LowFrequencyHeap: 793eb2dc,
HighFrequencyHeap: 793eb334, StubHeap: 793eb38c,
Assembly: 0015aa68 [mscorlib], ClassLoader: 0015ab40

Domain 1: 149100, LowFrequencyHeap: 00149164,
HighFrequencyHeap: 001491bc, StubHeap: 00149214,
Name: Sample1.exe, Assembly: 00164938 [Sample1],
ClassLoader: 00164a78

using System;

public interface MyInterface1
{
    void Method1();
    void Method2();
}
public interface MyInterface2
{
    void Method2();
    void Method3();
}

class MyClass : MyInterface1, MyInterface2
{
    public static string str = "MyString";
    public static uint   ui = 0xAAAAAAAA;
    public void Method1() { Console.WriteLine("Method1"); }
    public void Method2() { Console.WriteLine("Method2"); }
    public virtual void Method3() { Console.WriteLine("Method3"); }
}

class Program
{
    static void Main()
    {
        MyClass mc = new MyClass();
        MyInterface1 mi1 = mc;
        MyInterface2 mi2 = mc;

        int i = MyClass.str.Length;
        uint j = MyClass.ui;

        mc.Method1();
        mi1.Method1();
        mi1.Method2();
        mi2.Method2();
        mi2.Method3();
        mc.Method3();
    }
}

俺们的控制台程序,山姆ple1.exe,被加载到一个名为”山姆ple1.exe”的使用程序域。Mscorlib.dll被加载到共享域,可是因为它是骨干系统库,所以也在系统域中列出。每个域会分配一个反复堆,低频堆和代办堆。系统域和共享域使用同一的类加载器,而默认应用程序使用自己的类加载器。

出口没有显得加载器堆的保留尺寸和已交给尺寸。高频堆的开头化大小是32KB,每便提交4KB。SOS的出口也不曾显示接口虚表堆(InterfaceVtableMap)。每个域有一个接口虚表堆(简称为IVMap),由自己的加载器堆在域初步化阶段创造。IVMap保留大小是4KB,起初时交由4KB。我们将会在持续部分探究项目布局时研讨IVMap的意义。

图2
突显默认的历程堆,JIT代码堆,GC堆(用于小目的)和大目的堆(用于大小相当于仍然超过85000字节的靶子),它注明了那么些堆和加载器堆的语义区别。即时(just-in-time,
JIT)编译器发生x86指令并且保留到JIT代码堆中。GC堆和大目的堆是用以托管对象实例化的污物回收堆。

54、TensorFlow 深度学习库 Fold   ★Star 1192

目录

 

虚分派(Virtual Dispatch)

现今大家看看虚分派,并且和依照接口的分担举行相比。以下是图3中MyClass.Method3的虚函数调用的反汇编代码:

mc.Method3();
Mov    ecx,esi               ;move "this" pointer into ecx
Mov    eax,dword ptr [ecx]   ;acquire the MethodTable address
Call   dword ptr [eax+44h]   ;dispatch to the method at offset 0x44

虚分派总是通过一个永恒的槽编号爆发,和模式表指针在特定的类(类型)实现层次无关。在点子表布局时,类加载器用覆盖的子类的贯彻代替父类的贯彻。结果,对父对象的方法调用被分派到子对象的落实。反汇编展现了分派通过8号槽暴发,可以在调试器的内存窗口(如图10所示)和DumpMT的输出看到这点。

16、Grumpy  ★Star 7760

结论

咱俩关于CLR一些最首要的内在的探索旅程终于终止了。分明,还有众多问题亟待涉及,而且亟需在更深的层系上谈论,但是我们愿意这可以帮助你看到东西怎样行事。这里提供的成千上万的音讯或者会在.NET框架和CLR的新兴版本中改变,不过即使本文提到的CLR数据结构可能改变,概念应该保持不变。

Leveldb是一个google实现的可怜迅猛的kv数据库,近来的本子1.2能够扶助billion级此外数据量了。
在那多少个数量级别下还怀有非常高的属性,重要归功于它的脍炙人口的规划。特别是LSM算法。(详情:https://github.com/google/leveldb

CLR启动程序(Bootstrap)创造的域

在CLR执行托管代码的率先行代码前,会成立六个利用程序域。其中多少个对于托管代码甚至CLR宿主程序(CLR
hosts)都是不可见的。它们只可以由CLR启动进程创立,而提供CLR启动进程的是shim——mscoree.dll和mscorwks.dll
(在多处理器系统下是mscorsvr.dll)。正如 图2
所示,这么些域是系统域(System Domain)和共享域(Shared
Domain),都是使用了单件(Singleton)格局。第五个域是缺省应用程序域(Default
AppDomain),它是一个AppDomain的实例,也是绝无仅有的有命名的域。对于简易的CLR宿主程序,比如控制台程序,默认的域名由可实施映象文件的名字组成。其余的域可以在托管代码中利用AppDomain.CreateDomain方法创造,或者在非托管的代码中拔取ICORRuntimeHost接口成立。复杂的宿主程序,比如
ASP.NET,对于特定的网站会基于应用程序的多少创设两个域。

图 2 由CLR启动程序创设的域 ↓

图片 4

26、IndexedDB 关系查询引擎 lovefield  ★Star 5532

模式槽表(Method Slot Table)

在章程表中涵盖了一个槽表,指向各样艺术的叙述(MethodDesc),提供了档次的行为能力。方法槽表是遵照方法实现的线性链表,遵照如下顺序排列:继承的虚方法,引入的虚方法,实例方法,静态方法。

类加载器在当下类,父类和接口的元数据中遍历,然后创制方法表。在排列过程中,它替换所有的被掩盖的虚方法和被埋伏的父类方法,创立新的槽,在需要时复制槽。槽复制是必备的,它可以让各样接口有协调的小小的vtable。不过被复制的槽指向平等的物理实现。MyClass包含接口方法,一个类构造函数(.cctor)和目的构造函数(.ctor)。对象构造函数由C#编译器为持有没有显式定义构造函数的目的自动生成。因为大家定义并初步化了一个静态变量,编译器会变卦一个类构造函数。图10显示了MyClass的法门表的布局。布局展现了10个法子,因为Method2槽为接口IVMap举行了复制,下边大家会开展琢磨。图11来得了MyClass的不二法门表的SOS的出口。

图10 MyClass MethodTable Layout
图片 5

图11 SOS Dump of MyClass Method Table

!DumpMT -MD 0x9552a0
  Entry  MethodDesc  Return Type       Name
0097203b 00972040    String            System.Object.ToString()
009720fb 00972100    Boolean           System.Object.Equals(Object)
00972113 00972118    I4                System.Object.GetHashCode()
0097207b 00972080    Void              System.Object.Finalize()
00955253 00955258    Void              MyClass.Method1()
00955263 00955268    Void              MyClass.Method2()
00955263 00955268    Void              MyClass.Method2()
00955273 00955278    Void              MyClass.Method3()
00955283 00955288    Void              MyClass..cctor()
00955293 00955298    Void              MyClass..ctor()

此外类型的起先4个方法总是ToString, Equals, GetHashCode, and
Finalize。这多少个是从System.Object继承的虚方法。Method2槽被开展了复制,不过都指向相同的法门描述。代码显示定义的.cctor和.ctor会分别和静态方法和实例方法分在一组。

57、Go 语言实现的网络协协议栈 Netstack   ★Star 1016

系统域(System Domain)

系统域负责创制和初叶化共享域和默认使用程序域。它将系统库mscorlib.dll载入共享域,并且珍视过程范围之中选取的涵盖或者显式字符串符号。

字符串驻留(string interning)是 .NET Framework
1.1中的一个优化特性,它的处理情势显得略微昏头转向,因为CLR没有给程序集机会采取此特性。就算如此,由于在具有的利用程序域中对一个特定的记号只保留一个遥相呼应的字符串,此特性可以节约内存空间。

系统域还背负发生过程范围的接口ID,并用来成立每个应用程序域的接口虚表映射图(InterfaceVtableMaps)的接口。系统域在经过中保障跟踪所有域,并落实加载和卸载应用程序域的功用。

40、通用编码器&解码器框架 seq2seq  ★Star 2433

初稿地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx
原稿发布日期: 9/19/2005
原稿已经被 Microsoft
删除了,收集过程中窥见众多作品图都不全,这是因为原文的图都不全,所以特收集完整全文。

Brotli 是一个通用目的的无损压缩算法,它经过用变种的 LZ77 算法,Huffman
编码和二阶文本建模举行数据压缩,是一种压缩比很高的缩减方法。在回落速度上跟
Deflate
差不多,可是提供了更密集的削减。(详情:https://github.com/google/brotli

默认域(Default Domain)

默认域是使用程序域(AppDomain)的一个实例,一般的应用程序代码在其间运行。固然有些应用程序需要在运作时创制额外的使用程序域(比如有些使用插件,plug-in,架构或者拓展重大的运作时代码生成工作的应用程序),大部分的应用程序在运作期间只创设一个域。所有在此域运行的代码都是在域层次上有上下文限制。如若一个应用程序有五个应用程序域,任何的域间访问会通过.NET
Remoting代理。额外的域内上下文限制信息方可接纳System.ContextBoundObject派生的类型创设。每个应用程序域有自己的平安描述符(SecurityDescriptor),安全上下文(SecurityContext)和默认上下文(DefaultContext),还有团结的加载器堆(高频堆,低频堆和代理堆),句柄表,接口虚表管理器和顺序集缓存。

图片 6

EEClass

EEClass在艺术表创设前起始生活,它和方式表组成起来,是项目阐明的CLR版本。实际上,EEClass和方法表逻辑上是一个数据结构(它们一起表示一个系列),只可是因为使用频度的不等而被分别。平时利用的域放在方法表,而不平时采用的域在EEClass中。这样,需要被JIT编译函数使用的信息(如名字,域和偏移)在EEClass中,不过运行时需要的信息(如虚表槽和GC新闻)在模式表中。

对每一个连串会加载一个EEClass到应用程序域中,包括接口,类,抽象类,数组和布局。每个EEClass是一个被执行引擎跟踪的树的节点。CLR使用那些网络在EEClass结构中浏览,其目标包括类加载,方法表布局,类型验证和类型转换。EEClass的子-父关系基于继承层次建立,而父-子关系基于接口层次和类加载顺序的结合。在执行托管代码的历程中,新的EEClass节点被参与,节点的涉嫌被补充,新的涉嫌被确立。在网络中,相邻的EEClass还有一个水准的关联。EEClass有五个域用于管理被加载类型的节点关系:父类(Parent
Class),相邻链(sibling chain)和子链(children
chain)。关于图4中的MyClass上下文中的EEClass的语义,请参见图13

图13只突显了和那个议论有关的一些域。因为大家忽略了布局中的一些域,我们从没在图中合适显示偏移。EEClass有一个直接的对于措施表的引用。EEClass也本着在默认使用程序域的多次堆分配的方法描述块。在艺术表创立时,对经过堆上分配的域描述列表的一个引用提供了域的布局信息。EEClass在应用程序域的低频堆分配,这样操作系统可以更好的开展内存分页管理,由此削减了劳作集。

图13 EEClass 布局

图片 7

图13中的另外域在MyClass(图3)的上下文的含义不言自明。我们今日探视使用SOS输出的EEClass的实在的情理内存。在mc.Method1代码行设置断点后,运行图3的程序。首先使用命令Name2EE得到MyClass的EEClass的地方。

!Name2EE C:WorkingtestClrInternalsSample1.exe MyClass

MethodTable: 009552a0
EEClass: 02ca3508
Name: MyClass

Name2EE的首个参数时模块名,可以从DumpDomain命令拿到。现在我们拿到了EEClass的地址,我们输出EEClass:

!DumpClass 02ca3508
Class Name : MyClass, mdToken : 02000004, Parent Class : 02c4c3e4
ClassLoader : 00163ad8, Method Table : 009552a0, Vtable Slots : 8
Total Method Slots : a, NumInstanceFields: 0,
NumStaticFields: 2,FieldDesc*: 00955224

      MT    Field   Offset  Type           Attr    Value    Name
009552a0  4000001   2c      CLASS          static 00a8198c  str
009552a0  4000002   30      System.UInt32  static aaaaaaaa  ui

图13和DumpClass的出口看起来完全一致。元数据令牌(metadata
token,mdToken)表示了在模块PE文件中映射到内存的元数据表的MyClass索引,父类指向System.Object。从相邻链指向名为Program的EEClass,可以知道图13呈现的是加载Program时的结果。

MyClass有8个虚表槽(可以被虚分派的方法)。虽然Method1和Method2不是虚方法,它们可以在经过接口举办摊派时被认为是虚函数并进入到列表中。把.cctor和.ctor出席到列表中,你会博得总共10个主意。最后列出的是类的五个静态域。MyClass没有实例域。其它域不言自明。

 

目标实例

正如大家说过的,所有值类型的实例或者隐含在线程栈上,或者隐含在 GC
堆上。所有的引用类型在 GC 堆或者 LOH 上制造。图 6
显示了一个一级的靶子布局。一个目标可以透过以下途径被引述:基于栈的局部变量,在交互操作依然平台调用处境下的句柄表,寄存器(执行办法时的
this 指针和措施参数),拥有终结器( finalizer )方法的目的的终结器队列。
OBJECTREF 不是指向目的实例的起来地方,而是有一个 DWORD 的偏移量( 4
字节)。此 DWORD 称为对象头,保存一个针对性 SyncTableEntry 表的目录(从 1
起头计数的 syncblk
编号。因为经过索引举行连续,所以在需要增添表的高低时, CLR
可以在内存中活动那多少个表。 SyncTableEntry 维护一个反向的弱引用,以便 CLR
可以跟踪 SyncBlock 的所有权。弱引用让 GC
可以在未曾另外强引用存在时回收对象。 SyncTableEntry 还保存了一个针对
SyncBlock
的指针,包含了很少需要被一个对象的装有实例使用的有效性的音信。这一个音讯包括对象锁,哈希编码,任何转换层
(thunking) 数据和行使程序域的目录。对于大多数的靶子实例,不会为实在的
SyncBlock 分配内存,而且 syncblk 编号为 0 。那一点在实施线程境遇如
lock(obj) 或者 obj.GetHashCode 的说话时会发生变化,如下所示:

SmallClass obj = new SmallClass()
// Do some work here
lock(obj) { /* Do some synchronized work here */ }
obj.GetHashCode();

图 6 对象实例布局
图片 8

在上述代码中, smallObj 会动用 0 作为它的最先的 syncblk 编号。 lock
语句使得 CLR 创立一个 syncblk 入口并利用相应的数值更新对象头。因为 C#
的 lock 关键字会扩大为 try-finally 语句并采纳 Monitor 类,一个当作同步的
Monitor 对象在 syncblk 上创办。堆 GetHashCode
的调用会利用对象的哈希编码增添 syncblk 。
在 SyncBlock 中有其他的域,它们在 COM 交互操作和封送委托( marshaling
delegates )到非托管代码时采取,然而这和顶级的对象用处无关。
品类句柄紧跟在目的实例中的 syncblk
编号后。为了保持连续性,我会在验证实例变量后商量类型句柄。实例域(
Instance field
)的变量列表紧跟在品种句柄后。默认情形下,实例域会以内存最可行采用的点子排列,这样只需要最少的当作对齐的填充字节。
7
的代码显示了 SimpleClass 包含有部分两样尺寸的实例变量。

图 7 SimpleClass with Instance Variables

class SimpleClass
{
    private byte b1 = 1;                // 1 byte
    private byte b2 = 2;                // 1 byte
    private byte b3 = 3;                // 1 byte
    private byte b4 = 4;                // 1 byte
    private char c1 = 'A';              // 2 bytes
    private char c2 = 'B';              // 2 bytes
    private short s1 = 11;              // 2 bytes
    private short s2 = 12;              // 2 bytes
    private int i1 = 21;                // 4 bytes
    private long l1 = 31;               // 8 bytes
    private string str = "MyString"; // 4 bytes (only OBJECTREF)

    //Total instance variable size = 28 bytes 

    static void Main()
    {
        SimpleClass simpleObj = new SimpleClass();
        return;
    }
}

图 8 展现了在 Visual Studio 调试器的内存窗口中的一个 SimpleClass
对象实例。大家在图 7 的 return 语句处设置了断点,然后利用 ECX
寄存器保存的 simpleObj 地址在内存窗口显示对象实例。前 4 个字节是 syncblk
编号。因为大家从未用其余共同代码应用此实例(也尚无访问它的哈希编码),
syncblk 编号为 0 。保存在栈变量的靶子实例,指向起头地点的 4
个字节的偏移处。字节变量 b1,b2,b3 和 b4 被一个接一个的排列在一块儿。五个short 类型变量 s1 和 s2 也被排列在联合。字符串变量 str 是一个 4 字节的
OBJECTREF ,指向 GC
堆中分红的实际的字符串实例。字符串是一个专程的类别,因为具备包含同样文字标记的字符串,会在程序集加载到过程时指向一个大局字符串表的一致实例。那多少个过程称为字符串驻留(
string interning ),设计目标是优化内存的采纳。我们后面曾经提过,在 NET
Framework 1.1 中,程序集不可以拔取是否利用这么些过程,固然未来版本的 CLR
可能会提供这样的能力。

图 8 Debugger Memory Window for Object Instance
图片 9

由此默认情形下,成员变量在源代码中的词典顺序没有在内存中保持。在交互操作的情况下,词典顺序必须被保存到内存中,这时可以动用
StructLayoutAttribute 特性,它有一个 LayoutKind 的枚举类型作为参数。
LayoutKind.Sequential 可以为被封送( marshaled
)数据保持词典顺序,即便在 .NET Framework 1.1
中,它从不影响托管的布局(然则 .NET Framework 2.0
可能会这样做)。在互相操作的境况下,假设你实在需要非常的填充字节和出示的控制域的一一,
LayoutKind.Explicit 可以和域层次的 Field(Field)Offset 特性一起使用。

看完底层的内存内容后,大家接纳 SOS 看看对象实例。一个可行的指令是
DumpHeap
,它可以列出所有的堆内容和一个专门类型的所有实例。无需依靠寄存器,
DumpHeap 可以显示大家创设的绝无仅有一个实例的地址。

!DumpHeap -type SimpleClass
Loaded Son of Strike data table version 5 from
"C:WINDOWSMicrosoft.NETFrameworkv1.1.4322mscorwks.dll"
 Address       MT     Size
00a8197c 00955124       36
Last good object: 00a819a0
total 1 objects
Statistics:
      MT    Count TotalSize Class Name
  955124        1        36 SimpleClass

目标的总大小是 36 字节,不管字符串多大, SimpleClass 的实例只包含一个
DWORD 的靶子引用。 SimpleClass 的实例变量只占用 28 字节,其余 8
个字节包括项目句柄( 4 字节)和 syncblk 编号( 4 字节)。找到 simpleObj
实例的地方后,大家可以利用 DumpObj 命令输出它的内容,如下所示:

!DumpObj 0x00a8197c
Name: SimpleClass
MethodTable 0x00955124
EEClass 0x02ca33b0
Size 36(0x24) bytes
FieldDesc*: 00955064
      MT    Field   Offset                 Type       Attr    Value Name
00955124  400000a        4         System.Int64   instance      31 l1
00955124  400000b        c                CLASS   instance 00a819a0 str
    << some fields omitted from the display for brevity >>
00955124  4000003       1e          System.Byte   instance        3 b3
00955124  4000004       1f          System.Byte   instance        4 b4

正如以前说过, C# 编译器对于类的默认布局使用 LayoutType.Auto
(对于社团选择 LayoutType.Sequential
);由此类加载器重新排列实例域以最小化填充字节。我们得以选拔 ObjSize
来输出包含被 str 实例占用的空间,如下所示:

!ObjSize 0x00a8197c
sizeof(00a8197c) =       72 (    0x48) bytes (SimpleClass)

只要你从目的图的大局大小( 72 字节)减去 SimpleClass 的尺寸( 36
字节),就可以拿到 str 的轻重,即 36 字节。让我们输出 str
实例来申明这个结果:

!DumpObj 0x00a819a0
Name: System.String
MethodTable 0x009742d8
EEClass 0x02c4c6c4
Size 36(0x24) bytes

假如您将字符串实例的分寸(36字节)加上SimpleClass实例的尺寸(36字节),就足以得到ObjSize命令报告的总大小72字节。

请留心ObjSize不带有syncblk结构占用的内存。而且,在.NET Framework
1.1中,CLR不精通非托管资源占用的内存,如GDI对象,COM对象,文件句柄等等;由此它们不会被这些命令报告。

针对方法表的品类句柄在syncblk编号后分配。在目的实例创立前,CLR查看加载类型,假诺没有找到,则展开加载,拿到方法表地址,创制对象实例,然后把项目句柄值追加到对象实例中。JIT编译器暴发的代码在开展情势分派时行使项目句柄来定位方法表。CLR在急需史能够经过艺术表反向访问加载类型时使用项目句柄。

Son of Strike
SOS调试器扩张程序用于本文化的突显CLR数据结构的始末,它是 .NET
Framework 安装程序的一片段,位于
%windir%\Microsoft.NET\Framework\v1.1.4322。SOS加载到过程从前,在
Visual Studio 中启用托管代码调试。 添加 SOS.dll
所在的公文夹到PATH环境变量中。 加载 SOS.dll, 然后安装一个断点, 打开
Debug|Windows|Immediate。然后在 Immediate 窗口中执行 .load
sos.dll。使用 !help
获取调试相关的一部分命令,关于SOS更多信息,参考这里

23、物联网工具Physical Web  ★Star 5899

共享域(Shared Domain)

具有不属于其它特定域的代码被加载到系统库SharedDomain.Mscorlib,对于拥有应用程序域的用户代码都是必需的。它会被机关加载到共享域中。系统命名空间的主旨项目,如Object,
ValueType, Array, Enum, String, and
Delegate等等,在CLR启动程序过程中被优先加载到本域中。用户代码也足以被加载到这一个域中,方法是在调用CorBindToRuntimeEx时行使由CLR宿主程序指定的LoaderOptimization特性。控制台程序也足以加载代码到共享域中,方法是运用System.LoaderOptimizationAttribute特性表明Main方法。共享域还管理一个应用基地址作为目录的先后集映射图,此映射图作为管理共享程序集看重关系的查找表,这多少个程序集被加载到默认域(DefaultDomain)和任何在托管代码中创建的运用程序域。非共享的用户代码被加载到默认域。

33、GXUI  ★Star 3803

 

11、自动化网络审批工具 Lighthouse  ★Star 9400

 

9、高质料滑坡图片算法工具Guetzli  ★Star 9959

 

28、Python 代码格式化的工具  ★Star 5197

 

MDL (Material Design Lite) 是 谷歌 推出的网站前端开发工具组。Material
Design Lite (MDL)可以让你添加一个 Material Design
的外观和感觉到您的静态内容网站,不依靠于此外的 JavaScript 框架和库。MDL
可以优化跨设备的运用体验,可以在旧版的浏览器举办平整的切换,提供相当迅速的造访体验。(详情:https://github.com/google/material-design-lite

 

 

Shaka Player 它实现了 DASH 客户端的效益。它的播音效果基于 HTML5
video、MediaSource Extensions,和 Encrypted Media Extensions 。一般的
DASH
客户端效用很难落实。(详情:https://github.com/google/shaka-player

 

Hover 是一个用来 Android 的漂流操作栏。该菜单栏可以看作一个 service
启动,从而跨进程使用,悬浮在桌面或者其余应用程序的先头,当然,那里需要报名权限。
Hover 仍居于开发阶段,还有为数不少代码清理工作亟待做,也就是说,Hover
现在仅仅处于可用状态。(详情:https://github.com/google/hover

18、媒体播放器 ExoPlayer  ★Star 7152

 

 

 

 

Earth Enterprise 是 Google Earth Enterprise
的开源版本,是一个提供构建和托管自定义 3D 地球模型和 2D
地图的地理空间利用,目的在于让社区连续改进和促进该品种。(详情:https://github.com/google/earthenterprise

47、模块化深度学习系统 Tensor2Tensor   ★Star 2000

Advisor 是Google商家用来分析运行中的 Docker
容器的资源占用以及性能特点的工具。cAdvisor
是一个运转中的守护进程用来搜集、聚合、处理和导出运行容器相关的信息,每个容器保持独立的参数、历史资源利用情状和完全的资源利用数据。当前补助lmctfy 容器和 Docker
容器。(详情:https://github.com/google/cadvisor

10、k/v数据库 Leveldb  ★Star 9799

2、前端开发工具组 MDL  ★Star 27873

Battery Historian 是一个由此分析安卓 “bugreport”
进程文件来总计电量消费状态。它同意应用程序开发人士在时刻线上可视化系统和动用程序级事件,具有运动和缩放效率,在设备上完全充电后得以轻松查看各样汇总总结音讯,并能采用应用程序,检查影响应用程序特定电池的目的。
它还允许四个错误报告的A /
B相比,突出呈现首要电池相关目的的出入。(详情:https://github.com/google/battery-historian

 

OSS-Fuzz
可以针对开源软件举办不断的混淆测试,它的目标是利用改进的模糊测试技术与可开展的分布式执行相结合,提升一般软件基础架构的安全性与稳定。OSS-Fuzz
结合了多种模糊测试技术/漏洞捕捉技术(即原来的libfuzzer)与清洗技术(即原来的
AddressSanitizer),并且通过 ClusterFuzz
为广大可分布式执行提供了测试环境。(详情:https://github.com/google/oss-fuzz

 

 

51、Common Lisp Koans   ★Star 1695

Angular 是一款特别风靡且好用的 Web 前端框架,最近由 Google维护。官方已将 Angular 2 和事先的版本 Angular.js 分开维护(两者的 GitHub
地址和品种主页皆不等同)。渐进式 Web 应用,借助现代化 Web
平台的力量,交付 app
式体验。高性能、离线化、零安装。(详情:https://github.com/angular/angular

图片 10

13、最小系统加载工具 systemjs  ★Star 8356

 

Istio 是一个由Google、IBM 与 Lyft
共同开发的开源项目,意在提供一种统一化的微服务连接、安全保障、管理与监控措施。Istio
项目可以为微服务架构提供流量管理机制,同时亦为其他增值效益(包括安全性、监控、路由、连接管理与政策等)创制了基础。这款软件应用久经考验的
Lyft Envoy
代理举办构建,可在无需对应用程序代码作出任何发动的前提下促成可视性与控制能力。(详情:https://github.com/istio/istio

59、端到端加密系统 E2EMail   ★Star 704

Wycheproof
是Google开源的加密库测试项目,它含有一层层安全测试,用来检测加密库(cryptographic
libraries)软件是否存在已知的攻击漏洞。(详情:https://github.com/google/wycheproof

 

53、 JavaScript 库 Shaka Player   ★Star 1354

图片 11

29、基于 TensorFlow 的神经网络库 Sonnet  ★Star 5000

 

GRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2
设计。如今提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go.
其中 C 版本匡助 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C#
辅助.GRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP
连接上的多复用请求等特。这多少个特征使得其在移动装备上呈现更好,更省电和节省空间占据。(详情:https://github.com/grpc/grpc

 

Protocol Buffers (ProtocolBuffer/ protobuf
)是Google公司支付的一种多少描述语言,类似于XML可以将结构化数据系列化,可用来数据存储、通信协议等地点。现阶段支撑C++、JAVA、Python等二种编程语言。同XML相比,Protocol
buffers在体系化结构化数据方面有众多独到之处(详情:https://github.com/google/protobuf

 

GRR 是 Google 开发的长途现场事件取证系统。GRR
由一个代理(客户端)和劳动器端组成,客户端可以安排在一个任务系统中,服务器可以管理客户端,跟客户端举行互动。(详情:https://github.com/google/grr

E2EMail
是一个实验性质的端到端加密系统。E2EMail由Google开发,内置JavaScript内部支出的JavaScript加密库。它提供了一种通过Chrome扩充程序将OpenPGP集成到Gmail中的方法。音讯的公开单独保留在客户端上。(详情:https://github.com/e2email-org/e2email

 

Grumpy 是一个 Python  to Go 源代码翻译编译器和运作时,目的在于替代 CPython
2.7。 关键的界别是它将 Python 源代码编译为 Go
源代码,然后将其编译为本机代码,而不是字节码。这象征 Grumpy 没有
VM。编译的 Go 源代码是对 Grumpy 运行时的一多样调用,Go 库服务与 Python C
API 类似的目的(即便不直接帮助 C
API)。(详情:https://github.com/google/grumpy

 

Common Lisp Koans(lisp-koans)是一个语言学习磨炼程序,类似 ruby
koans,python koans 等等。Common Lisp Koans 首借使帮忙学习有些 lisp
规范特性和改善,可以学学到大气的 Common Lisp
语言特色。(详情:https://github.com/google/lisp-koans

41、Web应用 Tracing Framework   ★Star 2371

Spark(Spark) 是Google商家出产的一款基于 Chrome 浏览器的开发环境。提供一组可拔取的
UI 组件。采纳 Dart
开发。(安装情势:https://github.com/dart-lang/spark/tree/master/ide

go-github  是 Google 对 Github 的盛开 API 举办 Go
语言封装的一个体系。(详情:https://github.com/google/go-github

 

6、Java 常用库 Guava  ★Star 17267

Traceur 是一个起源 谷歌 的 Javascript
编译器,通过它可以体会一些很新并且有趣的 Javascript
语言特征,那些大多数是还尚无被当下浏览器实现的 ECMAScript
标准或草案,比如:数组相比较、类、模块、迭代器、方法参数默认值、Promise等。(详情:https://github.com/google/traceur-compiler

7、Spark  ★Star 13378

 

Butteraugli
是用来鉴定四个图像之间的相似度。通过辨认图像之间有些最受关注的差别点并交付相似度分值。这么些类型的一个着重思想是对出入受体的不同颜色的职务和密度的总括,特别是绿色的低密度锥窝。另一个想法来自于更可靠的神经节细胞建模,特别是避免频率空间。近年来该类型只提供了
C++ 接口。(详情:https://github.com/google/butteraugli

50、加密库安全测试套件 Wycheproof   ★Star 1722

图片 12

 

 

or-tools 是 Google 的优化搜索工具。Google优化工具包括:约束编程解决方案;为线性规划和交集整数规划解决方案提供简单统一的接口,包括
CBC, CLP, GLOP, GLPK, Gurobi, SCIP, 和 Sulum;背包算法;图算法
(最短路径,线性和分配,最小费用流,最大流)(详情:https://github.com/google/or-tools

 

Seesaw 是 谷歌 开源的一个依据 Linux 的载荷均衡系统。Seesaw
包含基本的载重均衡特性,同时帮忙部分高等的效益,诸如:anycast, Direct
Server Return (DSR), 协理四个 VLANs
和集中式配置。同时其计划的要旨是容易维护。(详情:https://github.com/google/seesaw

 

 

37、抓取bug工具 error-prone   ★Star 2708

49、优化搜索工具or-tools   ★Star 1771

55、谷歌 地球集团版 Earth Enterprise   ★Star 1161

欣赏就收藏吧~

Physical Web 是由 Chrome 团队为主的一个体系, 目的在于用 URL 连接世界,
方便用户接受多少。在Web世界中,各样URL可以说是链接的根底,也是去中央化的,所以“The
Physical
Web”要做的就是让每个智能装备用URL来标识自己,然后用户按照自己的急需通过URL和设施开展互动。这样一来,你采取智能设备的经验就和在网站上使
用各个超链接差不多了。(详情:https://github.com/google/physical-web

Kubernetes 是源于 Google 云平台的开源容器集群管理序列。基于 Docker
构建一个器皿的调度服务。该系列能够活动在一个容器集群中接纳一个办事容器供役使。其基本概念是
Container Pod。(详情:https://github.com/kubernetes/kubernetes

46、Android 的漂移操作栏 Hover   ★Star 2053

 

(详情:https://github.com/google/python-fire

 

 

43、JavaScript 库 Closure Library   ★Star 2257

 

 

Tensor2Tensor 是一个模块化和可扩充的库和二进制文件,
 可以辅助人们为各类机器学习程序创造先导进的模子,可利用于七个世界,如翻译、语法分析、图像音讯描述等,大大提升了研商和开支的快慢。(详情:https://github.com/tensorflow/tensor2tensor

服从开源Apache授权的EarlGrey,由Objective-C编写而成。Google也的确用的它来测试自己的iOS
app。EarlGrey可补助和模拟回溯至iOS
8的装置,有关该工具的事无巨细文档请戳这里。除了EarlGrey,此外iOS
UI测试自动化框架还包括Calabash和Sauce
Labs的Appium。(详情:https://github.com/google/EarlGrey

 

图片 13

Guetzli,是一个针对数码图像和网页图像的 JPEG 编码器,能够透过发出更小的
JPEG 文件来达成更快的在线体验,并且同时保持与当下浏览器,图像处理利用和
JPEG 标准的包容性。谷歌 称 Guetzli 创造高质地的 JPEG
图像文件的分寸比当下的回落方法要再小 35%。上图为 16×16
像素样本,是挂在蓝天下的一根电话线,传统 JPEG
算法平时会遇上的失真情状。左边是未压缩的原图,中间为较小尺寸的
libjpeg,左侧是失真更少的 Guetzli
。(详情:https://github.com/google/guetzli

ExoPlayer 是 Android 上一个应用级的媒体播放器。它为 Android MediaPlayer
的 API 在播报本地或在线的录像与节奏上提供了一个候选。ExoPlayer 协理部分
Android MediaPlayer API 不能提供的风味,包括 DASH 和 SmoothStreaming
自适应重放,持久的高速缓存和自定义渲染器。不像 MediaPlayer
API,EXOPlayer 很容易定制和扩张,而且它可以通过 Play Store
更新升高。(详情:https://github.com/google/ExoPlayer

Edward 是一个用来概率建模、推理和评估的 Python
库。它是一个用于迅速实验和琢磨概率模型的测试平台,其富含的模型范围从在小数目集上的经典层次模型到在大数目集上的复杂性深度概率模型。爱德华(Edward)融合了以下六个领域:贝叶斯总计学和机械学习、深度学习、概率编程。(详情:https://github.com/blei-lab/edward

Sonnet
库使用面向对象的办法,允许创设定义一些前向传导总结的模块。模块用部分输入
Tensor 调用,添加操作到图里并赶回输出
Tensor。其中一种设计采取是经过在紧接着调用相同的模块时自动重用变量来确保变量分享被透明化处理。
该库兼容 Linux/Mac OS X 和 Python 2.7。TensorFlow 的本子必须至少为
1.0.1。Sonnet 援助 TensorFlow 的 virtualenv 安装格局,以及 nativ pip
安装。(详情:https://github.com/deepmind/sonnet

21、自动生成命令行界面的内容库 Python Fire  ★Star 6500

48、Google 模糊测试服务 OSS-Fuzz   ★Star 1781

39、安卓电量分析工具 Battery Historian   ★Star 2579

 

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据里面开展映射的 Java
类库。可以将一个 JSON 字符串转成一个 Java
对象,或者反过来。(详情:https://github.com/google/gson

14、系列化库 FlatBuffers  ★Star 7991

5、数据描述语言 protobuf  ★Star 18447

 

 

25、C++单元测试工具  ★Star 5755

4、容器集群管理系列 Kubernetes  ★Star 24599

 

15、Xi 文本编辑器 Xi Editor  ★Star 8000

 

 

 

Google 开源了 Material Design 系统图标包里面的 750
个字形。该序列图标包含常用的图标,如用于媒体播发、通讯、内容编排、连接等等。在
Web 应用,安卓和 iOS
设计均适用。(详情:http://google.github.io/material-design-icons/

Xi Editor 是 Google 开源的一款用 Rust 语言编写的文书编辑器,最初是为 Mac
OS X 构建的,使用 Cocoa
作为用户界面,已有计划适配其余平台。所有编辑操作都足以在 16ms
之内提交并处理。文本绘制使用最好的技能(如 Mac 上的 Core Text,Windows
上的 DirectWrite 等),并完全支持Unicode。(详情:https://github.com/google/xi-editor

8、RPC 框架 GRPC  ★Star 10363

44、大型微服务系统管理工具 Istio   ★Star 2291

图片 14

0、机器学习系列 TensorFlow  ★Star 62533

 

Bazel 是 谷歌 的一款可再生的代码构建工具。它根本是用来构建 Google的软件,处理出现在Google的支付环境的构建问题,比如说:大规模数据构建问题,共享代码库问题,从源代码构建的软件的连锁题材。援助多种语言并且跨平台,还扶助自动化测试和配置、具有重现性(Reproducibility)和规模化等特点。(详情:https://github.com/bazelbuild/bazel

30、无损压缩算法Brotli  ★Star 4822

 

GXUI 是 Google 出品的一个跨平台 GO 语言的 UI
框架。(详情:https://github.com/google/gxui

Draco 是一种库,用于压缩和解压缩 3D 几何网格(geometric
mesh)和点云(point cloud)。换句话说,它明确缩短了 3D
图形文件的高低,同时对 3D
图形的观望者来说又历来不严重影响视觉效果。它还目的在于革新 3D
图形的缩小和传导。Draco 是作为 C++ 源代码宣布的,可以用来压缩 3D
图形,此外还发表了拍卖编码数据的 C++ 和 Javascript
解码器。(详情:https://github.com/google/draco

 

FlatBuffers 是一个 Java
的体系化库,用于游戏和任何内存受限的采用。FlatBuffers
可以让你直接访问体系化后的数据,无需解压并开展辨析的进程。同时提供很强的迈入和向后兼容性。FlatBuffers
匡助 C++ 和 Java
语言,无需依靠第三方库补助。(详情:https://github.com/google/flatbuffers

Cartographer,是Google开源的一个ROS系统扶助的2D和3D SLAM(simultaneous
localization and mapping)库。SLAM
算法结合来自多少个传感器(比如,LIDAR、IMU 和
录像头)的数额,同步统计传感器的职务并绘制传感器周围的环境。在产业界和科学界常见的传感器配置上,Cartographer
能实时建立全局一致的地图。(详情:https://github.com/googlecartographer/cartographer

31、负载均衡系统 Seesaw  ★Star 4286

Gumbo 是 Google的一款用C语言实现的HTML5解析库,无需任何外部依赖。(详情:https://github.com/google/gumbo-parser

Lighthouse 是一个开源的自动化工具,用于改革网络采纳的质料。
可以将其作为一个 Chrome 扩大程序运行,或从命令行运行。 当为 Lighthouse
提供一个要查处的网址,它将对准此页面运行一系列的测试,然后生成一个有关页面性能的告知。能够参照失利的测试,看看可以拔取什么样方法来立异应用。(详情:https://github.com/GoogleChrome/lighthouse

“钢琴二重奏”的 A.I. Duet。该类型会在你弹出了多少个音符之后,通过 AI
自动测算来帮你“补完”旋律的重奏部分。A.I. Duet
运用了人工智能技术,精晓音符的“编码规则”。(详情:https://github.com/googlecreativelab/aiexperiments-ai-duet

 

TensorFlow
是Google的第二代机器学习系统,依据Google所说,在一些规则测试中,TensorFlow的变现比第一代的DistBelief快了2倍。TensorFlow
内建纵深学习的壮大援助,任何可以用计量流图形来发表的推断,都足以运用TensorFlow。任何依照梯度的机械学习算法都可以收益于TensorFlow的全自动分
化(auto-differentiation)。通过灵活的Python接口,要在TensorFlow中表述想法也会很容易。(详情:https://github.com/tensorflow/tensorflow

 

图片 15

 

Blockly 是一个基于 Web 的可视化编程工具,只需要拖动多少个图形就可以编程,
完全不需要打字. 遵照项目FAQ介绍,
这多少个新语言的基本点目标是为web应用提供宏(或脚本编 程)的协助.
可以把转变的台本输出成javascript, python
等.已经有多少个应用Blockly的demo.(详情:https://github.com/google/blockly

YAPF 是 Google 开发的一个用来格式化 Python
代码的工具。(详情:https://github.com/google/yapf

lovefield 是白手起家在 IndexedDB 上的关联查询引擎。它提供了近似 SQL
的语法,并且可以跨浏览器工作(近日支撑 Chrome 37 及以上版本,Firefox 31
及以上版本,IE 10
及以上版本)。(详情:https://github.com/google/lovefield

该类型是 Google 的一个开源项目,包含众多 Google 主旨的 Java
常用库。(详情:https://github.com/google/guava

error-prone 用来抓取 Java
编译时的错误。通常采纳编译器只可以做静态类型的反省。但采取此工具,可以举办编译器的花色分析,可以检测并抓取到编译过程中的
Bug,可以大大的节约开发者的时刻。(详情:https://github.com/google/error-prone

22、软硬件框架AnyPixel.js  ★Star 5906

AnyPixel.js 是 Google开源的一个软件和硬件框架,可以用来构建各样由“像素”构成的体现,每个像素可以是其余一种可互相的实体对象,如
LED
灯、气球等。(详情:https://github.com/googlecreativelab/anypixel

 

 

1、material-design-icons  ★Star 30315

19、代码构建工具Bazel  ★Star 6641

systemjs
是一个不大系统加载工具,用来创设插件来拍卖可代表的面貌加载过程,包括加载
CSS 场景和图纸,首要运行在浏览器和 NodeJS 中。它是 ES6
浏览器加载程序的的壮大,将应用在本土浏览器中。平常创造的插件名称是模块本身,如若没有专门指定用途,则默认插件名是模块的扩充名称。(详情:https://github.com/systemjs/systemjs

38、ROS 系统匡助的 SLAM 库 Cartographer   ★Star 2700

58、钢琴二重奏 AI aiexperiments-ai-duet   ★Star 883

文章整理于互联网。
本文收集了 60款 Google 开源的项目,排名顺序按照 Github ★Star 数量排列。

 

 

 

 

42、深度概率编程语言 爱德华(Edward)   ★Star 2395

 

图片 16

 

 

27、 Java 生成器源代码集合 Auto  ★Star 5295

Auto 是 Java 生成器源代码集合,Java
有好多机械、重复、未经测试的代码,而且有时会冒出局部玄妙的 Bug 。Auto
项目是机关执行这么些项目标天职的代码生成器的会聚,他们可以无 Bug
创设你要编制的代码。(详情:https://github.com/google/auto

TensorFlow Fold 是用于创造使用结构化数据的 TensorFlow
模型库,其中统计图的构造取决于输入数据的社团。 TensorFlow Fold
使得拍卖不同数量尺寸和布局的纵深学习模型更便于实现。(详情:https://github.com/tensorflow/fold

 

 

图片 17

 

35、Blockly  ★Star 3520

Google的开源C++单元测试框架Google Test,简称gtest
是一个老大的不错单元测试框架。协助跨平台以及包括 Windows CE 和 Symbian
在内的有些手机操作系统。(详情:https://github.com/google/googletest

图片 18

3、Web 前端框架 Angular  ★Star 25524

图片 19

 

52、 3D 图形开源压缩库 Draco   ★Star 1600

Python Fire 是 Google 开源的一个可从其他 Python
代码自动生成命令行接口(CLI)的库。Python Fire 是一种在 Python 中开创
CLI 的简要方法;是付出和调节 Python 代码的灵光工具;可以使 Bash 和
Python
之间的更换更为容易;并且经过行使你需要导入和创立的模块和变量来安装
REPL,使得应用 Python REPL 更便于

seq2seq 是 Google 开源的一款用于 TensorFlow
的通用编码器&解码器框架(encoder-decoder
framework),可用于机器翻译、文本摘要、会话建模、图像描述等。(详情:https://github.com/google/seq2seq

Tracing Framework 是一套库、工具,用于跟踪和查证复杂的 Web
应用。它就可以帮你发现代码的属性问题,并且帮您打造相当顺理成章的 60 FPS Web
应用。它最近只能用来特定的运用场所,并不是为运用于具有场景而设计,假设您在拔取过程中碰到了问题,请呈递你的
Bug。(详情:https://github.com/google/tracing-framework

24、Docker 容器性能分析工具cAdvisorc  ★Star 5853

36、go-github  ★Star 2707

45、远程现场取证系统 GRR   ★Star 2100

Closure Library 是一个有力的 JavaScript 库,用于复杂的大面积的 Web
应用。它被不少 Google Web 应用使用,比如 Gmail 和 GoogleDocs。(详情:https://github.com/google/closure-library

 

32、Gumbo  ★Star 4060

17、Javascript 编译器 Traceur  ★Star 7300

 

34、iOS UI 测试自动化框架 EarlGrey  ★Star 3721

 

Google Brain团队的一组钻探人口宣布了一个品种Project
Magenta,其重大对象是拔取机械学习创作艺术和作曲曲子。Project
Magenta使用了
TensorFlow系统,商量人士在GitHub上开源了她们的模子和工具。(详情:https://github.com/tensorflow/magenta

 

 

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注