Git Product home page Git Product logo

pdb-decompiler's Introduction

PDB Decompiler

About

A tool to decompile MSVC PDB files to C++ source code.

This tool is a work in progress and will most likely crash, have duplicate output, have invalid output, or miss output entirely. Feel free to file an issue or submit a pull request.

Usage

cargo run --release -- --out=/path/to/out/ --pdb=/path/to/file.pdb --base-address=0x180000000 > file.pdb.log
Short Long Description
-o --out The output directory to dump all C++ code to.
-p --pdb The file path to the MSVC PDB file to decompile.
-b --base-address The base address to add when resolving an RVA (optional).

Contributing

Any assistance or valid criticism would be appreciated. Please feel free to have a look at some of the open issues, especially those tagged with help wanted.

pdb-decompiler's People

Contributors

camden-smallwood avatar micwoj92 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pdb-decompiler's Issues

Determining source file and line information for global symbols (UDT, modules)

Currently there appears to be no way to determine what source file and line a global symbol belongs to, which particularly afflicts decompilation of some user datatypes. Not all PDB files have identifier data in the IPI stream, or any private user datatypes, but may have global symbols which have all of the type information that would typically be present in the IPI stream.

While it is possible to keep track of the previous module of some global symbols by way of iterating over the module contributions, this still does not help with telling us which file and line in the module's include hierarchy they originate from. How are we supposed to retrieve this data?

Map out include hierarchy

Noting that a header file is of extension .h/.hpp/.inc/.inl/etc, and a source file is of extension .c/.cpp/.cc/etc:

  1. Currently all header files are lacking #include statements.
  2. Source files also have a flattened list of #include statements, which is unnecessary.

It might be useful to store a mapping of each type's index to its declaring header file. This would allow for a list of all required #include statements to be generated for each header file. Once header files have their generated list of #include statements, then the flattened list of #include statements in each source file can be truncated (potentially) to only the required #include statements, allowing for carry-over #include statements from header files.

Construct inline unions and structures based on field offsets

Field lists do not store inline unions and structures as unions and structures, instead are only denoted by having a field offset that collides with another field offset. Ideally, when populating a field list, it would be ideal to construct inline unions and structures based on the colliding field offsets.

Unhandled characters in build info arg

thread 'main' panicked at 'Unhandled characters in build info arg: 'Brepro'', src\cpp\module.rs:530:32
stack backtrace:
   0: std::panicking::begin_panic_handler
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74/library\std\src\panicking.rs:575
   1: core::panicking::panic_fmt
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74/library\core\src\panicking.rs:64
   2: pdb_decompiler::cpp::module::Module::add_build_info
             at .\src\cpp\module.rs:530
   3: pdb_decompiler::process_id_information
             at .\src\main.rs:188
   4: pdb_decompiler::decompile_pdb
             at .\src\main.rs:108
   5: pdb_decompiler::main
             at .\src\main.rs:76
   6: core::ops::function::FnOnce::call_once<enum2$<core::result::Result<tuple$<>,alloc::boxed::Box<dyn$<core::error::Error>,alloc::alloc::Global> > > (*)(),tuple$<> >
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74\library\core\src\ops\function.rs:250```

Build namespace blocks where necessary (AST)

C++ symbols store their namespace. Currently, the namespace is left inline in the symbol when decompiled. It would be ideal to determine where namespace are used and construct namespace blocks in the output source files.

Unhandled characters in build info args

Hello, im getting a weird error, something about MultipleProcessSupport flag?
here is the log

0x180000000`
thread 'main' panicked at src/cpp/module.rs:873:36:
Unhandled characters in build info arg: 'MP1...'
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Im running the script on ubuntu 22.04 and rustc 1.74.0

Unhandled characters in build info arg: 'source-charset:utf-8'

i seem to be getting this error and i don't know how to solve it here is the log:

Running `target/release/pdb-decompiler --out=outp --pdb=fnaf9-Win64-Shipping.pdb`
thread 'main' panicked at 'Unhandled characters in build info arg: 'source-charset:utf-8'; Data: "-Zc:inline -nologo -Oi -c -Gw -Gy -Zm1000 -wd4819 -D_CRT_STDIO_LEGACY_WIDE_SPECIFIERS=1 -D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1 -D_DISABLE_EXTENDED_ALIGNED_STORAGE -source-charset:utf-8 -execution-charset:utf-8 -Ob2 -Ox -Ot -GF -errorreport:prompt -D_HAS_EXCEPTIONS=0 -Z7 -MD -bigobj -fp:fast -Zo -Zp8 -we4456 -we4458 -we4459 -wd4463 -we4668 -wd4244 -wd4838 -ID:\BuildAgent\work\FNAF9\Engine\Source -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Launch\Private -ID:\BuildAgent\work\FNAF9\Engine\Source\Developer\DerivedDataCache\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\TraceLog\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Core\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\CoreUObject -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\CoreUObject\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\Engine -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Engine\Classes -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Engine\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\NetCore -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Net -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Net\Core\Classes -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Net\Core\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\ApplicationCore\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\RHI\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Json\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\SlateCore -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\SlateCore\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\InputCore -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\InputCore\Classes -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\InputCore\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\Slate -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Slate\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\ImageWrapper -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\ImageWrapper\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Messaging\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\MessagingCommon\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\RenderCore\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Analytics -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Analytics\AnalyticsET\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Analytics\Analytics\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Sockets\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Net\Common\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\AssetRegistry -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\AssetRegistry\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\EngineMessages -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\EngineMessages\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\EngineSettings -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\EngineSettings\Classes -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\EngineSettings\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\SynthBenchmark\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\Renderer -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Renderer\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\GameplayTags -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\GameplayTags\Classes -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\GameplayTags\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\DeveloperSettings -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\DeveloperSettings\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\PacketHandler -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\PacketHandlers -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\PacketHandlers\PacketHandler\Classes -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\PacketHandlers\PacketHandler\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\PacketHandlers\ReliabilityHandlerComponent\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\AudioPlatformConfiguration -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\AudioPlatformConfiguration\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\MeshDescription -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\MeshDescription\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\StaticMeshDescription -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\StaticMeshDescription\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\PakFile\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\RSA\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\NetworkReplayStreaming -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\NetworkReplayStreaming\NetworkReplayStreaming\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\PhysicsCore -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\PhysicsCore\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\Chaos -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Experimental -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Experimental\Chaos\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Experimental\ChaosCore\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\Intel -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Experimental\Voronoi\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\SignalProcessing\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\AudioExtensions -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\AudioExtensions\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\AudioMixerCore\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\PropertyAccess -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\PropertyAccess\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\ClothingSystemRuntimeInterface -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\ClothingSystemRuntimeInterface\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\AudioMixer -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\AudioMixer\Classes -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\AudioMixer\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Developer -ID:\BuildAgent\work\FNAF9\Engine\Source\Developer\TargetPlatform\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\AnimationCore -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\AnimationCore\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\MoviePlayer -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\MoviePlayer\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Networking\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Projects\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\SandboxFile\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\Serialization -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Serialization\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Cbor\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\Overlay -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Overlay\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\PreLoadScreen\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\InstallBundleManager\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\HeadMountedDisplay -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\HeadMountedDisplay\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\AugmentedReality -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\AugmentedReality\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\MRMesh -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\MRMesh\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\MediaUtils -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\MediaUtils\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Media\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\ClothingSystemRuntimeNv -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\ClothingSystemRuntimeNv\Public -ID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Inc\ClothingSystemRuntimeCommon -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\ClothingSystemRuntimeCommon\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Developer\AutomationController\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Developer\TaskGraph\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\SlateNullRenderer\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\SlateRHIRenderer\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\Launch\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\Runtime\SessionServices\Public -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\PxShared\include -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\PxShared\include\cudamanager -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\PxShared\include\filebuf -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\PxShared\include\foundation -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\PxShared\include\pvd -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\PxShared\include\task -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\PhysX_3.4\Include -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\PhysX_3.4\Include\cooking -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\PhysX_3.4\Include\common -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\PhysX_3.4\Include\extensions -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\PhysX_3.4\Include\geometry -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\APEX_1.4\include -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\APEX_1.4\include\clothing -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\APEX_1.4\include\nvparameterized -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\APEX_1.4\include\legacy -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\APEX_1.4\include\PhysX3 -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\APEX_1.4\common\include -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\APEX_1.4\common\include\autogen -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\APEX_1.4\framework\include -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\APEX_1.4\framework\include\autogen -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\APEX_1.4\shared\general\RenderDebug\public -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\APEX_1.4\shared\general\PairFilter\include -ID:\BuildAgent\work\FNAF9\Engine\Source\ThirdParty\PhysX3\APEX_1.4\shared\internal\include -I"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\INCLUDE" -I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.2\include\um" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\shared" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\um" -I"C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\winrt" -FID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Shipping\Engine\SharedPCH.Engine.ShadowErrors.h -YuD:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Shipping\Engine\SharedPCH.Engine.ShadowErrors.h -FpD:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Shipping\Engine\SharedPCH.Engine.ShadowErrors.h.pch -FID:\BuildAgent\work\FNAF9\fnaf9\Intermediate\Build\Win64\fnaf9\Shipping\Launch\Definitions.Launch.h -TP -GR- -W4 -showIncludes -X"', src/cpp/module.rs:1211:32
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Issue running on windows

Hi, I've tried to run this tool but gives me
Error: StreamNameNotFound
I'm on Windows 11

Thanks

Panicked: Unhandled characters in build info arg:

Hello,

When I try to run, I get the following error

    Finished release [optimized] target(s) in 11.83s
     Running `target\release\pdb-decompiler.exe --out=./out/ --pdb=test.pdb`
thread 'main' panicked at 'Unhandled characters in build info arg: 'analyze-'', src\cpp\module.rs:507:32
stack backtrace:

A better C++ AST

The current C++ AST (if you can even call it that) is extremely non-optimal. It would be ideal to leave the PDB data in place for as long as possible before converting to the C++ AST in order to alleviate in duplicate code elimination, among other things.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.