Roslyn 笔记

本贴最后更新于 2467 天前,其中的信息可能已经时移世易

最近发现一些脚本语言很有意思,很想写一门新的脚本语言,所以找到了 C#的语法分析相关的内容
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.CSharp;

namespace Microsoft.CodeAnalysis.CSharp
{
public enum SyntaxKind : ushort
{
None = 0,
List = 1,
TildeToken = 8193,
ExclamationToken = 8194,
DollarToken = 8195,
PercentToken = 8196,
CaretToken = 8197,
AmpersandToken = 8198,
AsteriskToken = 8199,
OpenParenToken = 8200,
CloseParenToken = 8201,
MinusToken = 8202,
PlusToken = 8203,
EqualsToken = 8204,
OpenBraceToken = 8205,
CloseBraceToken = 8206,
OpenBracketToken = 8207,
CloseBracketToken = 8208,
BarToken = 8209,
BackslashToken = 8210,
ColonToken = 8211,
SemicolonToken = 8212,
DoubleQuoteToken = 8213,
SingleQuoteToken = 8214,
LessThanToken = 8215,
CommaToken = 8216,
GreaterThanToken = 8217,
DotToken = 8218,
QuestionToken = 8219,
HashToken = 8220,
SlashToken = 8221,
SlashGreaterThanToken = 8232,
LessThanSlashToken = 8233,
XmlCommentStartToken = 8234,
XmlCommentEndToken = 8235,
XmlCDataStartToken = 8236,
XmlCDataEndToken = 8237,
XmlProcessingInstructionStartToken = 8238,
XmlProcessingInstructionEndToken = 8239,
BarBarToken = 8260,
AmpersandAmpersandToken = 8261,
MinusMinusToken = 8262,
PlusPlusToken = 8263,
ColonColonToken = 8264,
QuestionQuestionToken = 8265,
MinusGreaterThanToken = 8266,
ExclamationEqualsToken = 8267,
EqualsEqualsToken = 8268,
EqualsGreaterThanToken = 8269,
LessThanEqualsToken = 8270,
LessThanLessThanToken = 8271,
LessThanLessThanEqualsToken = 8272,
GreaterThanEqualsToken = 8273,
GreaterThanGreaterThanToken = 8274,
GreaterThanGreaterThanEqualsToken = 8275,
SlashEqualsToken = 8276,
AsteriskEqualsToken = 8277,
BarEqualsToken = 8278,
AmpersandEqualsToken = 8279,
PlusEqualsToken = 8280,
MinusEqualsToken = 8281,
CaretEqualsToken = 8282,
PercentEqualsToken = 8283,
BoolKeyword = 8304,
ByteKeyword = 8305,
SByteKeyword = 8306,
ShortKeyword = 8307,
UShortKeyword = 8308,
IntKeyword = 8309,
UIntKeyword = 8310,
LongKeyword = 8311,
ULongKeyword = 8312,
DoubleKeyword = 8313,
FloatKeyword = 8314,
DecimalKeyword = 8315,
StringKeyword = 8316,
CharKeyword = 8317,
VoidKeyword = 8318,
ObjectKeyword = 8319,
TypeOfKeyword = 8320,
SizeOfKeyword = 8321,
NullKeyword = 8322,
TrueKeyword = 8323,
FalseKeyword = 8324,
IfKeyword = 8325,
ElseKeyword = 8326,
WhileKeyword = 8327,
ForKeyword = 8328,
ForEachKeyword = 8329,
DoKeyword = 8330,
SwitchKeyword = 8331,
CaseKeyword = 8332,
DefaultKeyword = 8333,
TryKeyword = 8334,
CatchKeyword = 8335,
FinallyKeyword = 8336,
LockKeyword = 8337,
GotoKeyword = 8338,
BreakKeyword = 8339,
ContinueKeyword = 8340,
ReturnKeyword = 8341,
ThrowKeyword = 8342,
PublicKeyword = 8343,
PrivateKeyword = 8344,
InternalKeyword = 8345,
ProtectedKeyword = 8346,
StaticKeyword = 8347,
ReadOnlyKeyword = 8348,
SealedKeyword = 8349,
ConstKeyword = 8350,
FixedKeyword = 8351,
StackAllocKeyword = 8352,
VolatileKeyword = 8353,
NewKeyword = 8354,
OverrideKeyword = 8355,
AbstractKeyword = 8356,
VirtualKeyword = 8357,
EventKeyword = 8358,
ExternKeyword = 8359,
RefKeyword = 8360,
OutKeyword = 8361,
InKeyword = 8362,
IsKeyword = 8363,
AsKeyword = 8364,
ParamsKeyword = 8365,
ArgListKeyword = 8366,
MakeRefKeyword = 8367,
RefTypeKeyword = 8368,
RefValueKeyword = 8369,
ThisKeyword = 8370,
BaseKeyword = 8371,
NamespaceKeyword = 8372,
UsingKeyword = 8373,
ClassKeyword = 8374,
StructKeyword = 8375,
InterfaceKeyword = 8376,
EnumKeyword = 8377,
DelegateKeyword = 8378,
CheckedKeyword = 8379,
UncheckedKeyword = 8380,
UnsafeKeyword = 8381,
OperatorKeyword = 8382,
ExplicitKeyword = 8383,
ImplicitKeyword = 8384,
YieldKeyword = 8405,
PartialKeyword = 8406,
AliasKeyword = 8407,
GlobalKeyword = 8408,
AssemblyKeyword = 8409,
ModuleKeyword = 8410,
TypeKeyword = 8411,
FieldKeyword = 8412,
MethodKeyword = 8413,
ParamKeyword = 8414,
PropertyKeyword = 8415,
TypeVarKeyword = 8416,
GetKeyword = 8417,
SetKeyword = 8418,
AddKeyword = 8419,
RemoveKeyword = 8420,
WhereKeyword = 8421,
FromKeyword = 8422,
GroupKeyword = 8423,
JoinKeyword = 8424,
IntoKeyword = 8425,
LetKeyword = 8426,
ByKeyword = 8427,
SelectKeyword = 8428,
OrderByKeyword = 8429,
OnKeyword = 8430,
EqualsKeyword = 8431,
AscendingKeyword = 8432,
DescendingKeyword = 8433,
NameOfKeyword = 8434,
AsyncKeyword = 8435,
AwaitKeyword = 8436,
ElifKeyword = 8467,
EndIfKeyword = 8468,
RegionKeyword = 8469,
EndRegionKeyword = 8470,
DefineKeyword = 8471,
UndefKeyword = 8472,
WarningKeyword = 8473,
ErrorKeyword = 8474,
LineKeyword = 8475,
PragmaKeyword = 8476,
HiddenKeyword = 8477,
ChecksumKeyword = 8478,
DisableKeyword = 8479,
RestoreKeyword = 8480,
ReferenceKeyword = 8481,
OmittedTypeArgumentToken = 8492,
OmittedArraySizeExpressionToken = 8493,
EndOfDirectiveToken = 8494,
EndOfDocumentationCommentToken = 8495,
EndOfFileToken = 8496,
BadToken = 8507,
IdentifierToken = 8508,
NumericLiteralToken = 8509,
CharacterLiteralToken = 8510,
StringLiteralToken = 8511,
XmlEntityLiteralToken = 8512,
XmlTextLiteralToken = 8513,
XmlTextLiteralNewLineToken = 8514,
InterpolatedStringToken = 8515,
InterpolatedStringStartToken = 8516,
InterpolatedStringMidToken = 8517,
InterpolatedStringEndToken = 8518,
EndOfLineTrivia = 8539,
WhitespaceTrivia = 8540,
SingleLineCommentTrivia = 8541,
MultiLineCommentTrivia = 8542,
DocumentationCommentExteriorTrivia = 8543,
SingleLineDocumentationCommentTrivia = 8544,
MultiLineDocumentationCommentTrivia = 8545,
DisabledTextTrivia = 8546,
PreprocessingMessageTrivia = 8547,
IfDirectiveTrivia = 8548,
ElifDirectiveTrivia = 8549,
ElseDirectiveTrivia = 8550,
EndIfDirectiveTrivia = 8551,
RegionDirectiveTrivia = 8552,
EndRegionDirectiveTrivia = 8553,
DefineDirectiveTrivia = 8554,
UndefDirectiveTrivia = 8555,
ErrorDirectiveTrivia = 8556,
WarningDirectiveTrivia = 8557,
LineDirectiveTrivia = 8558,
PragmaWarningDirectiveTrivia = 8559,
PragmaChecksumDirectiveTrivia = 8560,
ReferenceDirectiveTrivia = 8561,
BadDirectiveTrivia = 8562,
SkippedTokensTrivia = 8563,
XmlElement = 8574,
XmlElementStartTag = 8575,
XmlElementEndTag = 8576,
XmlEmptyElement = 8577,
XmlTextAttribute = 8578,
XmlCrefAttribute = 8579,
XmlNameAttribute = 8580,
XmlName = 8581,
XmlPrefix = 8582,
XmlText = 8583,
XmlCDataSection = 8584,
XmlComment = 8585,
XmlProcessingInstruction = 8586,
TypeCref = 8597,
QualifiedCref = 8598,
NameMemberCref = 8599,
IndexerMemberCref = 8600,
OperatorMemberCref = 8601,
ConversionOperatorMemberCref = 8602,
CrefParameterList = 8603,
CrefBracketedParameterList = 8604,
CrefParameter = 8605,
IdentifierName = 8616,
QualifiedName = 8617,
GenericName = 8618,
TypeArgumentList = 8619,
AliasQualifiedName = 8620,
PredefinedType = 8621,
ArrayType = 8622,
ArrayRankSpecifier = 8623,
PointerType = 8624,
NullableType = 8625,
OmittedTypeArgument = 8626,
ParenthesizedExpression = 8632,
ConditionalExpression = 8633,
InvocationExpression = 8634,
ElementAccessExpression = 8635,
ArgumentList = 8636,
BracketedArgumentList = 8637,
Argument = 8638,
NameColon = 8639,
CastExpression = 8640,
AnonymousMethodExpression = 8641,
SimpleLambdaExpression = 8642,
ParenthesizedLambdaExpression = 8643,
ObjectInitializerExpression = 8644,
CollectionInitializerExpression = 8645,
ArrayInitializerExpression = 8646,
AnonymousObjectMemberDeclarator = 8647,
ComplexElementInitializerExpression = 8648,
ObjectCreationExpression = 8649,
AnonymousObjectCreationExpression = 8650,
ArrayCreationExpression = 8651,
ImplicitArrayCreationExpression = 8652,
StackAllocArrayCreationExpression = 8653,
OmittedArraySizeExpression = 8654,
InterpolatedString = 8655,
ImplicitElementAccess = 8656,
AddExpression = 8668,
SubtractExpression = 8669,
MultiplyExpression = 8670,
DivideExpression = 8671,
ModuloExpression = 8672,
LeftShiftExpression = 8673,
RightShiftExpression = 8674,
LogicalOrExpression = 8675,
LogicalAndExpression = 8676,
BitwiseOrExpression = 8677,
BitwiseAndExpression = 8678,
ExclusiveOrExpression = 8679,
EqualsExpression = 8680,
NotEqualsExpression = 8681,
LessThanExpression = 8682,
LessThanOrEqualExpression = 8683,
GreaterThanExpression = 8684,
GreaterThanOrEqualExpression = 8685,
IsExpression = 8686,
AsExpression = 8687,
CoalesceExpression = 8688,
SimpleMemberAccessExpression = 8689,
PointerMemberAccessExpression = 8690,
ConditionalAccessExpression = 8691,
MemberBindingExpression = 8707,
ElementBindingExpression = 8708,
SimpleAssignmentExpression = 8714,
AddAssignmentExpression = 8715,
SubtractAssignmentExpression = 8716,
MultiplyAssignmentExpression = 8717,
DivideAssignmentExpression = 8718,
ModuloAssignmentExpression = 8719,
AndAssignmentExpression = 8720,
ExclusiveOrAssignmentExpression = 8721,
OrAssignmentExpression = 8722,
LeftShiftAssignmentExpression = 8723,
RightShiftAssignmentExpression = 8724,
UnaryPlusExpression = 8730,
UnaryMinusExpression = 8731,
BitwiseNotExpression = 8732,
LogicalNotExpression = 8733,
PreIncrementExpression = 8734,
PreDecrementExpression = 8735,
PointerIndirectionExpression = 8736,
AddressOfExpression = 8737,
PostIncrementExpression = 8738,
PostDecrementExpression = 8739,
AwaitExpression = 8740,
ThisExpression = 8746,
BaseExpression = 8747,
ArgListExpression = 8748,
NumericLiteralExpression = 8749,
StringLiteralExpression = 8750,
CharacterLiteralExpression = 8751,
TrueLiteralExpression = 8752,
FalseLiteralExpression = 8753,
NullLiteralExpression = 8754,
TypeOfExpression = 8760,
SizeOfExpression = 8761,
CheckedExpression = 8762,
UncheckedExpression = 8763,
DefaultExpression = 8764,
MakeRefExpression = 8765,
RefValueExpression = 8766,
RefTypeExpression = 8767,
NameOfExpression = 8768,
QueryExpression = 8774,
QueryBody = 8775,
FromClause = 8776,
LetClause = 8777,
JoinClause = 8778,
JoinIntoClause = 8779,
WhereClause = 8780,
OrderByClause = 8781,
AscendingOrdering = 8782,
DescendingOrdering = 8783,
SelectClause = 8784,
GroupClause = 8785,
QueryContinuation = 8786,
Block = 8792,
LocalDeclarationStatement = 8793,
VariableDeclaration = 8794,
VariableDeclarator = 8795,
EqualsValueClause = 8796,
ExpressionStatement = 8797,
EmptyStatement = 8798,
LabeledStatement = 8799,
GotoStatement = 8800,
GotoCaseStatement = 8801,
GotoDefaultStatement = 8802,
BreakStatement = 8803,
ContinueStatement = 8804,
ReturnStatement = 8805,
YieldReturnStatement = 8806,
YieldBreakStatement = 8807,
ThrowStatement = 8808,
WhileStatement = 8809,
DoStatement = 8810,
ForStatement = 8811,
ForEachStatement = 8812,
UsingStatement = 8813,
FixedStatement = 8814,
CheckedStatement = 8815,
UncheckedStatement = 8816,
UnsafeStatement = 8817,
LockStatement = 8818,
IfStatement = 8819,
ElseClause = 8820,
SwitchStatement = 8821,
SwitchSection = 8822,
CaseSwitchLabel = 8823,
DefaultSwitchLabel = 8824,
TryStatement = 8825,
CatchClause = 8826,
CatchDeclaration = 8827,
CatchFilterClause = 8828,
FinallyClause = 8829,
CompilationUnit = 8840,
GlobalStatement = 8841,
NamespaceDeclaration = 8842,
UsingDirective = 8843,
ExternAliasDirective = 8844,
AttributeList = 8847,
AttributeTargetSpecifier = 8848,
Attribute = 8849,
AttributeArgumentList = 8850,
AttributeArgument = 8851,
NameEquals = 8852,
ClassDeclaration = 8855,
StructDeclaration = 8856,
InterfaceDeclaration = 8857,
EnumDeclaration = 8858,
DelegateDeclaration = 8859,
BaseList = 8865,
TypeParameterConstraintClause = 8866,
ConstructorConstraint = 8867,
ClassConstraint = 8868,
StructConstraint = 8869,
TypeConstraint = 8870,
ExplicitInterfaceSpecifier = 8871,
EnumMemberDeclaration = 8872,
FieldDeclaration = 8873,
EventFieldDeclaration = 8874,
MethodDeclaration = 8875,
OperatorDeclaration = 8876,
ConversionOperatorDeclaration = 8877,
ConstructorDeclaration = 8878,
BaseConstructorInitializer = 8889,
ThisConstructorInitializer = 8890,
DestructorDeclaration = 8891,
PropertyDeclaration = 8892,
EventDeclaration = 8893,
IndexerDeclaration = 8894,
AccessorList = 8895,
GetAccessorDeclaration = 8896,
SetAccessorDeclaration = 8897,
AddAccessorDeclaration = 8898,
RemoveAccessorDeclaration = 8899,
UnknownAccessorDeclaration = 8900,
ParameterList = 8906,
BracketedParameterList = 8907,
Parameter = 8908,
TypeParameterList = 8909,
TypeParameter = 8910,
IncompleteMember = 8916,
ArrowExpressionClause = 8917,
InterpolatedStringInsert = 8918
}
}
每一种 SyntaxNode node 都有一个 CSharpKind()表明自身的节点语法类型,而每一种节点语法类型,往往有一个相关的类来处理分析该语法类型的语法实例的参数和一些相关变量
类似如:Class 类型定义
SyntaxKind.ClassDeclaration 类型的语法节点,在 namespace Microsoft.CodeAnalysis.CSharp.Syntax 里有 ClassDeclarationSyntax 类型处理解析此语法节点

如何得到一个文件的语法树呢
SyntaxTree tree = CSharpSyntaxTree.ParseText("代码内容");//代码内容就是代码文件里的内容,或者直接的文本值
tree.GetRoot()就是语法树根节点
tree.GetRoot().ChildNodes()就是子节点,每一个子节点都是一颗语法子树
这样遍历语法树,就可以得到每一个语法节点的任意数据。
当控制了一个文件形成的语法树的全部语法节点时,那么就可以用这些信息做一些事情

做什么事情
1:在 C#工程里集成 Roslyn 编译器使得 C#自解释自己[这是一个想法,就是在 C#工程里集成 C#编译器 Roslyn 然后加载文本文件作为脚本,与原生工程里的 C#代码集成使用,也就是互相类型透明] 这个想法比较前端,未来肯定有这种技术,就是语言自身既是编译语言,也是解释语言,既可以编译成字节码使用,还可以调用外部自身语言语法规范的脚本,在 C#中 Microsoft.CodeAnalysis.Scripting 有对这方面的一些实现,不过后来好像移除了,这个部分也可以看出微软对这方面曾经有发力
2:写一些代码转换工具,大部分针对 Java 和 C#简单语法互相转换的.或者是拥有大量类成员的类的互相转换
3:可以仿造 C#的语法树类型以及各种类型的参数,来实现自己的语法树系统,这部分就与设计新的脚本语言类似,不过细节肯定是非常复杂的

题外话
人类语言就中国来说,普通话就是北京话,而程序语言似乎并没有一种语言可以把所有语言联通起来,在能使用一个程序语言的环境里,大部分情况下,调用其他程序语言,往往比较复杂,类似调用 dll,或者使用脚本语言,等
为什么不能做到一个工程里,几个 C 文件几个 C++ 文件几个 C#文件然后各按各自的编译然后生成呢。

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    106 引用 • 152 回帖 • 1 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 91 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    15 引用 • 7 回帖 • 1 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 38 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 390 回帖
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 522 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 110 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 215 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 290 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 639 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 610 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 1 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 906 回帖 • 195 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 249 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 388 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 45 关注
  • 博客

    记录并分享人生的经历。

    270 引用 • 2386 回帖 • 1 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 634 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    90 引用 • 383 回帖 • 1 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 87 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    174 引用 • 990 回帖 • 2 关注