SlideShare ist ein Scribd-Unternehmen logo
1 von 40
Downloaden Sie, um offline zu lesen
Statically Compiling
Ruby with LLVM
Laurent Sansonetti
HipByte
About me
•

Laurent Sansonetti
•

Programming Language Nerd

•

Founder of HipByte

•

From Belgium (yay!)
MacRuby
MacRuby
•

2007: Project created (as a hobby)
•

Replacement for RubyCocoa

•

Fork of CRuby 1.9

•

2008: Had a beer with Chris Lattner

•

2009: Replaced bytecode VM by LLVM JIT

•

2011: Left Apple
RubyMotion
RubyMotion
•

Command-line toolchain for iOS / OS X dev

•

Implementation of Ruby dialect

•

Unified Ruby runtime with Objective-C

•

Static compiler for Ruby into Intel/ARM

•

Platform for wrappers/libraries ecosystem

•

Commercial product & sustainable business
RubyMotion
•

Command-line toolchain for iOS / OS X dev

•

Implementation of Ruby dialect

•

Unified Ruby runtime with Objective-C

•

Static compiler for Ruby into Intel/ARM

•

Platform for wrappers/libraries ecosystem

•

Commercial product & sustainable business
Ruby
Ruby
•

Created in 1995 by Yukihiro Matsumoto (Matz)
•

“human-oriented language”

•

Dynamically typed

•

Object oriented

•

Blocks

•

Exceptions

•

Garbage collection

•

…
hello.rb
class Hello
def initialize(something)
@something = something
end
def say
puts “Hello “ + @something
end
end
!

Hello.new(‘world’).say
CRuby
Compilation

Ruby Code

AST
Bytecode

Runtime
Let’s use LLVM!
RubyMotion
Compilation

Ruby Code

AST
LLVM IR
Assembly
Runtime
RubyMotion compiler
•

About 12k C++ LOC

•

Targets LLVM 2.4

•

Supports the entire Ruby language “specifications”
File functions
class Hello
def initialize(something)
…
end
def say
…
end
end
!

class Ohai < Hello
def say
…
end
end
!

Hello.new(‘world’).say

File Scope
1

5
3

Hello
Ctor
2

Hello
Scope

Ohai
Ctor
4

Ohai
Scope

File
Code
Method functions
class Hello
…
def say
puts “Hello “ + @something
end
end

Method
IMP

Ruby Runtime

ObjC
Stub

ObjC Runtime
Methods
def hello(x, y, z)
…
end
Methods
define internal i32 @"rb_scope__hello:__"(i32 %self,
i8* %sel, i32 %a, i32 %b, i32 %c) {
MainBlock:
…
}
Conditionals
def hello(something)
if something
true
else
false
end
end
Conditionals
define internal i32 @"rb_scope__hello:__"(i32 %self, i8* %sel, i32 %something) {
MainBlock:
call void @llvm.dbg.declare(metadata !{i32 %self}, metadata !23), !dbg !54
call void @llvm.dbg.value(metadata !{i32 %something}, i64 0, metadata !24), !dbg !54
%0 = alloca i8
store volatile i8 0, i8* %0
switch i32 %something, label %merge [
i32 0, label %else
i32 4, label %else
]

!

else:
br label %merge

!

; preds = %MainBlock, %MainBlock

merge:
; preds = %MainBlock, %else
%iftmp = phi i32 [ 0, %else ], [ 2, %MainBlock ]
ret i32 %iftmp
}
Local variables
•

Allocated on the stack
•

Benefits from the mem2reg pass
Block variables
•

Allocated initially on the stack

•

Re-allocated in heap memory in case the block
leaves the scope of the method
kernel.bc
•

Runtime primitives
•

vm_fast_{plus,minus,…} (arithmetic ops)

•

vm_ivar_{get,set} (instance variables)

•

vm_dispatch (method dispatch)

•

…

•

Pre-compiled into LLVM bitcode

•

Loaded by the compiler
•

Provides the initial module
Instance variables
def initialize(foo)
@foo = foo
end
Instance variables
define internal i32 @"rb_scope__initialize:__"(i32 %self, i8* %sel, i32 %foo) {
MainBlock:
%0 = alloca i32*
%1 = alloca i32
store i32* %1, i32** %0
store i32 %foo, i32* %1
%2 = alloca i8
store volatile i8 0, i8* %2
br label %entry_point
!
entry_point:
%3 = load i32** %0
%4 = load i32* %3
%5 = load i32* @3
%6 = load i8** @4
call void @vm_ivar_set(i32 %self, i32 %5, i32 %4, i8* %6)
ret i32 %4
}
Instance variables
PRIMITIVE void
vm_ivar_set(VALUE obj, ID name, VALUE val, void *cache_p)
{
…
klass = *(VALUE *)obj;
if (klass == cache->klass) {
if ((unsigned int)cache->slot < ROBJECT(obj)->num_slots) {
rb_object_ivar_slot_t *slot;
slot = &ROBJECT(obj)->slots[cache->slot];
if (slot->name == name) {
…
GC_WB_OBJ(&slot->value, val);
return;
…
// slow path
PRIMITIVE VALUE
vm_gc_wb(VALUE *slot, VALUE val)
{
…
*slot = val;
return val;
}
After passes
Instance variables
define internal i32 @"rb_scope__initialize:__"(i32 %self, i8* %sel, i32 %foo) {
MainBlock:
br label %entry_point
!
entry_point:
…
%39 = getelementptr inbounds %struct.rb_object_ivar_slot_t* %28, i32 %26,
i32 1
store i32 %4, i32* %39
…
ret i32 %4
}
Arithmetic
def answer
21 + 21
end
Arithmetic
define internal i32 @rb_scope__answer__(i32 %self, i8* %sel) {
MainBlock:
br label %entry_point
!

entry_point:
%0 = load i8** @8
%1 = load i8* @9
%2 = call i32 @vm_fast_plus(i32 85, i32 85, i8 %1)
ret i32 %2
}
Arithmetic
PRIMITIVE VALUE
vm_fast_plus(VALUE left, VALUE right, unsigned char overridden)
{
if (overridden == 0 && NUMERIC_P(left) && NUMERIC_P(right)) {
if (FIXNUM_P(left) && FIXNUM_P(right)) {
const long res = FIX2LONG(left) + FIX2LONG(right);
if (FIXABLE(res)) {
return LONG2FIX(res);
}
}
}
… // slow path
}
After passes
Arithmetic
define internal i32 @rb_scope__answer__(i32 %self, i8* %sel) {
MainBlock:
br label %entry_point
!

entry_point:
…
ret i32 169
}
Exceptions
•

Implemented as C++ exceptions

•

Zero-cost for “normal flow”

•

Handlers are compiled using IR intrinsics
•

•

“catch all” landing pad clause

Exception#raise triggers __cxa_raise()
DWARF
•

All instructions have proper debug location
metadata

•

Method/block arguments and local variables are
tagged as DW_TAG_{arg,auto}_variable

•

Build system generates a .dSYM bundle
•

Can be loaded by gdb/lldb, atos(1), profilers, etc.
REPL
•

Allows to interpret expressions at runtime
•

Only for development (simulator)

•

App process loads the compiler

•

Uses JIT execution engine
Demo
LLVM lessons
Pluses
• Great to write static
compilers
• Easy to target new
platforms
• Lots of great
optimization passes

Minuses
• C++ API breakage
• Huge code size
• IR is not 100% portable
• Proprietary backends
• Not as great to use as a JIT
LLVM is awesome!
Thank you
lrz@hipbyte.com
Twitter: @lrz

Weitere ähnliche Inhalte

Was ist angesagt?

Introduction to .net
Introduction to .netIntroduction to .net
Introduction to .netNaveen Sihag
 
A deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio moduleA deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio moduleSaúl Ibarra Corretgé
 
One Shellcode to Rule Them All: Cross-Platform Exploitation
One Shellcode to Rule Them All: Cross-Platform ExploitationOne Shellcode to Rule Them All: Cross-Platform Exploitation
One Shellcode to Rule Them All: Cross-Platform ExploitationQuinn Wilton
 
Automatic Reference Counting @ Pragma Night
Automatic Reference Counting @ Pragma NightAutomatic Reference Counting @ Pragma Night
Automatic Reference Counting @ Pragma NightGiuseppe Arici
 
Modern Objective-C @ Pragma Night
Modern Objective-C @ Pragma NightModern Objective-C @ Pragma Night
Modern Objective-C @ Pragma NightGiuseppe Arici
 
Seminar: CoinMP - Open Source Solver - Nov 2011
Seminar: CoinMP - Open Source Solver - Nov 2011Seminar: CoinMP - Open Source Solver - Nov 2011
Seminar: CoinMP - Open Source Solver - Nov 2011Bjarni Kristjánsson
 
Talk: The Present and Future of Pharo
Talk: The Present and Future of PharoTalk: The Present and Future of Pharo
Talk: The Present and Future of PharoMarcus Denker
 
Denker - Pharo: Present and Future - 2009-07-14
Denker - Pharo: Present and Future - 2009-07-14Denker - Pharo: Present and Future - 2009-07-14
Denker - Pharo: Present and Future - 2009-07-14CHOOSE
 
Operating Systems - A Primer
Operating Systems - A PrimerOperating Systems - A Primer
Operating Systems - A PrimerSaumil Shah
 
JavaScript in 2016
JavaScript in 2016JavaScript in 2016
JavaScript in 2016Codemotion
 
Android RenderScript on LLVM
Android RenderScript on LLVMAndroid RenderScript on LLVM
Android RenderScript on LLVMJohn Lee
 
Handling inline assembly in Clang and LLVM
Handling inline assembly in Clang and LLVMHandling inline assembly in Clang and LLVM
Handling inline assembly in Clang and LLVMMin-Yih Hsu
 
About Those Python Async Concurrent Frameworks - Fantix @ OSTC 2014
About Those Python Async Concurrent Frameworks - Fantix @ OSTC 2014About Those Python Async Concurrent Frameworks - Fantix @ OSTC 2014
About Those Python Async Concurrent Frameworks - Fantix @ OSTC 2014Fantix King 王川
 
Dataflow: Declarative concurrency in Ruby
Dataflow: Declarative concurrency in RubyDataflow: Declarative concurrency in Ruby
Dataflow: Declarative concurrency in RubyLarry Diehl
 
Javascript ES6
Javascript ES6Javascript ES6
Javascript ES6Huy Doan
 

Was ist angesagt? (18)

Introduction to .net
Introduction to .netIntroduction to .net
Introduction to .net
 
A deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio moduleA deep dive into PEP-3156 and the new asyncio module
A deep dive into PEP-3156 and the new asyncio module
 
One Shellcode to Rule Them All: Cross-Platform Exploitation
One Shellcode to Rule Them All: Cross-Platform ExploitationOne Shellcode to Rule Them All: Cross-Platform Exploitation
One Shellcode to Rule Them All: Cross-Platform Exploitation
 
Automatic Reference Counting @ Pragma Night
Automatic Reference Counting @ Pragma NightAutomatic Reference Counting @ Pragma Night
Automatic Reference Counting @ Pragma Night
 
Modern Objective-C @ Pragma Night
Modern Objective-C @ Pragma NightModern Objective-C @ Pragma Night
Modern Objective-C @ Pragma Night
 
Seminar: CoinMP - Open Source Solver - Nov 2011
Seminar: CoinMP - Open Source Solver - Nov 2011Seminar: CoinMP - Open Source Solver - Nov 2011
Seminar: CoinMP - Open Source Solver - Nov 2011
 
Talk: The Present and Future of Pharo
Talk: The Present and Future of PharoTalk: The Present and Future of Pharo
Talk: The Present and Future of Pharo
 
Denker - Pharo: Present and Future - 2009-07-14
Denker - Pharo: Present and Future - 2009-07-14Denker - Pharo: Present and Future - 2009-07-14
Denker - Pharo: Present and Future - 2009-07-14
 
Operating Systems - A Primer
Operating Systems - A PrimerOperating Systems - A Primer
Operating Systems - A Primer
 
JavaScript in 2016
JavaScript in 2016JavaScript in 2016
JavaScript in 2016
 
Android RenderScript on LLVM
Android RenderScript on LLVMAndroid RenderScript on LLVM
Android RenderScript on LLVM
 
asyncio internals
asyncio internalsasyncio internals
asyncio internals
 
Handling inline assembly in Clang and LLVM
Handling inline assembly in Clang and LLVMHandling inline assembly in Clang and LLVM
Handling inline assembly in Clang and LLVM
 
Kotlin
KotlinKotlin
Kotlin
 
About Those Python Async Concurrent Frameworks - Fantix @ OSTC 2014
About Those Python Async Concurrent Frameworks - Fantix @ OSTC 2014About Those Python Async Concurrent Frameworks - Fantix @ OSTC 2014
About Those Python Async Concurrent Frameworks - Fantix @ OSTC 2014
 
Dataflow: Declarative concurrency in Ruby
Dataflow: Declarative concurrency in RubyDataflow: Declarative concurrency in Ruby
Dataflow: Declarative concurrency in Ruby
 
Javascript ES6
Javascript ES6Javascript ES6
Javascript ES6
 
Swift core
Swift coreSwift core
Swift core
 

Andere mochten auch

Accelerating Ruby with LLVM
Accelerating Ruby with LLVMAccelerating Ruby with LLVM
Accelerating Ruby with LLVMevanphx
 
Predlog ministara (biografije), Vlada Srbije
Predlog ministara (biografije), Vlada SrbijePredlog ministara (biografije), Vlada Srbije
Predlog ministara (biografije), Vlada Srbijegordana comic
 
Els Oosthoek, artikel TVOO 2017 Nick van Dam
Els Oosthoek, artikel TVOO 2017 Nick van Dam Els Oosthoek, artikel TVOO 2017 Nick van Dam
Els Oosthoek, artikel TVOO 2017 Nick van Dam Els Oosthoek
 
【土曜会】ハードコアな鑑賞入門:カワムラシュウイチ
【土曜会】ハードコアな鑑賞入門:カワムラシュウイチ【土曜会】ハードコアな鑑賞入門:カワムラシュウイチ
【土曜会】ハードコアな鑑賞入門:カワムラシュウイチじょいとも
 
Brillo/Weave Part 1: High Level Introduction
Brillo/Weave Part 1: High Level IntroductionBrillo/Weave Part 1: High Level Introduction
Brillo/Weave Part 1: High Level IntroductionJalal Rohani
 
10 Social Sharing Statistics
10 Social Sharing Statistics10 Social Sharing Statistics
10 Social Sharing StatisticsCharlotte Day
 
Melhores Negócios com o Office365
Melhores Negócios com o Office365Melhores Negócios com o Office365
Melhores Negócios com o Office365Fabio Bonifacio
 
Presentación escuela SEC/FEC de paciente experto. Organizada por Mimocardio
Presentación escuela SEC/FEC de paciente experto. Organizada por MimocardioPresentación escuela SEC/FEC de paciente experto. Organizada por Mimocardio
Presentación escuela SEC/FEC de paciente experto. Organizada por MimocardioSociedad Española de Cardiología
 
Blind wijnproeven nigtevecht 3 maart 2017
Blind wijnproeven nigtevecht 3 maart 2017Blind wijnproeven nigtevecht 3 maart 2017
Blind wijnproeven nigtevecht 3 maart 2017Eric Van 't Hoff
 
Redefining manhood
Redefining manhoodRedefining manhood
Redefining manhoodShiftbalance
 
Re-thinking the Organization for Agility
Re-thinking the Organization for Agility Re-thinking the Organization for Agility
Re-thinking the Organization for Agility Jürgen De Smet
 

Andere mochten auch (16)

Accelerating Ruby with LLVM
Accelerating Ruby with LLVMAccelerating Ruby with LLVM
Accelerating Ruby with LLVM
 
Predlog ministara (biografije), Vlada Srbije
Predlog ministara (biografije), Vlada SrbijePredlog ministara (biografije), Vlada Srbije
Predlog ministara (biografije), Vlada Srbije
 
Els Oosthoek, artikel TVOO 2017 Nick van Dam
Els Oosthoek, artikel TVOO 2017 Nick van Dam Els Oosthoek, artikel TVOO 2017 Nick van Dam
Els Oosthoek, artikel TVOO 2017 Nick van Dam
 
Design and Development Solution
Design and Development SolutionDesign and Development Solution
Design and Development Solution
 
Teach children-basics
Teach children-basicsTeach children-basics
Teach children-basics
 
Simmethod From Software As A Service To Outcomes As A Service, Twitter and Ya...
Simmethod From Software As A Service To Outcomes As A Service, Twitter and Ya...Simmethod From Software As A Service To Outcomes As A Service, Twitter and Ya...
Simmethod From Software As A Service To Outcomes As A Service, Twitter and Ya...
 
【土曜会】ハードコアな鑑賞入門:カワムラシュウイチ
【土曜会】ハードコアな鑑賞入門:カワムラシュウイチ【土曜会】ハードコアな鑑賞入門:カワムラシュウイチ
【土曜会】ハードコアな鑑賞入門:カワムラシュウイチ
 
Blog links-url-content efg
Blog links-url-content efgBlog links-url-content efg
Blog links-url-content efg
 
Le performance
Le performanceLe performance
Le performance
 
Brillo/Weave Part 1: High Level Introduction
Brillo/Weave Part 1: High Level IntroductionBrillo/Weave Part 1: High Level Introduction
Brillo/Weave Part 1: High Level Introduction
 
10 Social Sharing Statistics
10 Social Sharing Statistics10 Social Sharing Statistics
10 Social Sharing Statistics
 
Melhores Negócios com o Office365
Melhores Negócios com o Office365Melhores Negócios com o Office365
Melhores Negócios com o Office365
 
Presentación escuela SEC/FEC de paciente experto. Organizada por Mimocardio
Presentación escuela SEC/FEC de paciente experto. Organizada por MimocardioPresentación escuela SEC/FEC de paciente experto. Organizada por Mimocardio
Presentación escuela SEC/FEC de paciente experto. Organizada por Mimocardio
 
Blind wijnproeven nigtevecht 3 maart 2017
Blind wijnproeven nigtevecht 3 maart 2017Blind wijnproeven nigtevecht 3 maart 2017
Blind wijnproeven nigtevecht 3 maart 2017
 
Redefining manhood
Redefining manhoodRedefining manhood
Redefining manhood
 
Re-thinking the Organization for Agility
Re-thinking the Organization for Agility Re-thinking the Organization for Agility
Re-thinking the Organization for Agility
 

Ähnlich wie Statically Compiling Ruby with LLVM

Bypassing ASLR Exploiting CVE 2015-7545
Bypassing ASLR Exploiting CVE 2015-7545Bypassing ASLR Exploiting CVE 2015-7545
Bypassing ASLR Exploiting CVE 2015-7545Kernel TLV
 
What has to be paid attention when reviewing code of the library you develop
What has to be paid attention when reviewing code of the library you developWhat has to be paid attention when reviewing code of the library you develop
What has to be paid attention when reviewing code of the library you developAndrey Karpov
 
Memory Management with Java and C++
Memory Management with Java and C++Memory Management with Java and C++
Memory Management with Java and C++Mohammad Shaker
 
Synchronously call your async functions
Synchronously call your async functionsSynchronously call your async functions
Synchronously call your async functionsIgalia
 
Javascript engine performance
Javascript engine performanceJavascript engine performance
Javascript engine performanceDuoyi Wu
 
Bypassing DEP using ROP
Bypassing DEP using ROPBypassing DEP using ROP
Bypassing DEP using ROPJapneet Singh
 
Jit builder status and directions 2018 03-28
Jit builder status and directions 2018 03-28Jit builder status and directions 2018 03-28
Jit builder status and directions 2018 03-28Mark Stoodley
 
0100_Embeded_C_CompilationProcess.pdf
0100_Embeded_C_CompilationProcess.pdf0100_Embeded_C_CompilationProcess.pdf
0100_Embeded_C_CompilationProcess.pdfKhaledIbrahim10923
 
Part II: LLVM Intermediate Representation
Part II: LLVM Intermediate RepresentationPart II: LLVM Intermediate Representation
Part II: LLVM Intermediate RepresentationWei-Ren Chen
 
Pragmatic Optimization in Modern Programming - Demystifying the Compiler
Pragmatic Optimization in Modern Programming - Demystifying the CompilerPragmatic Optimization in Modern Programming - Demystifying the Compiler
Pragmatic Optimization in Modern Programming - Demystifying the CompilerMarina Kolpakova
 
Using Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systemsUsing Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systemsSerge Stinckwich
 
C Under Linux
C Under LinuxC Under Linux
C Under Linuxmohan43u
 
Fast as C: How to Write Really Terrible Java
Fast as C: How to Write Really Terrible JavaFast as C: How to Write Really Terrible Java
Fast as C: How to Write Really Terrible JavaCharles Nutter
 
Create C++ Applications with the Persistent Memory Development Kit
Create C++ Applications with the Persistent Memory Development KitCreate C++ Applications with the Persistent Memory Development Kit
Create C++ Applications with the Persistent Memory Development KitIntel® Software
 
掀起 Swift 的面紗
掀起 Swift 的面紗掀起 Swift 的面紗
掀起 Swift 的面紗Pofat Tseng
 
Demystify eBPF JIT Compiler
Demystify eBPF JIT CompilerDemystify eBPF JIT Compiler
Demystify eBPF JIT CompilerNetronome
 

Ähnlich wie Statically Compiling Ruby with LLVM (20)

Gcrc talk
Gcrc talkGcrc talk
Gcrc talk
 
Bypassing ASLR Exploiting CVE 2015-7545
Bypassing ASLR Exploiting CVE 2015-7545Bypassing ASLR Exploiting CVE 2015-7545
Bypassing ASLR Exploiting CVE 2015-7545
 
Introduction to c part -3
Introduction to c   part -3Introduction to c   part -3
Introduction to c part -3
 
What has to be paid attention when reviewing code of the library you develop
What has to be paid attention when reviewing code of the library you developWhat has to be paid attention when reviewing code of the library you develop
What has to be paid attention when reviewing code of the library you develop
 
Memory Management with Java and C++
Memory Management with Java and C++Memory Management with Java and C++
Memory Management with Java and C++
 
Synchronously call your async functions
Synchronously call your async functionsSynchronously call your async functions
Synchronously call your async functions
 
Javascript engine performance
Javascript engine performanceJavascript engine performance
Javascript engine performance
 
Bypassing DEP using ROP
Bypassing DEP using ROPBypassing DEP using ROP
Bypassing DEP using ROP
 
Jit builder status and directions 2018 03-28
Jit builder status and directions 2018 03-28Jit builder status and directions 2018 03-28
Jit builder status and directions 2018 03-28
 
0100_Embeded_C_CompilationProcess.pdf
0100_Embeded_C_CompilationProcess.pdf0100_Embeded_C_CompilationProcess.pdf
0100_Embeded_C_CompilationProcess.pdf
 
Part II: LLVM Intermediate Representation
Part II: LLVM Intermediate RepresentationPart II: LLVM Intermediate Representation
Part II: LLVM Intermediate Representation
 
Appsec obfuscator reloaded
Appsec obfuscator reloadedAppsec obfuscator reloaded
Appsec obfuscator reloaded
 
Mario
MarioMario
Mario
 
Pragmatic Optimization in Modern Programming - Demystifying the Compiler
Pragmatic Optimization in Modern Programming - Demystifying the CompilerPragmatic Optimization in Modern Programming - Demystifying the Compiler
Pragmatic Optimization in Modern Programming - Demystifying the Compiler
 
Using Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systemsUsing Smalltalk for controlling robotics systems
Using Smalltalk for controlling robotics systems
 
C Under Linux
C Under LinuxC Under Linux
C Under Linux
 
Fast as C: How to Write Really Terrible Java
Fast as C: How to Write Really Terrible JavaFast as C: How to Write Really Terrible Java
Fast as C: How to Write Really Terrible Java
 
Create C++ Applications with the Persistent Memory Development Kit
Create C++ Applications with the Persistent Memory Development KitCreate C++ Applications with the Persistent Memory Development Kit
Create C++ Applications with the Persistent Memory Development Kit
 
掀起 Swift 的面紗
掀起 Swift 的面紗掀起 Swift 的面紗
掀起 Swift 的面紗
 
Demystify eBPF JIT Compiler
Demystify eBPF JIT CompilerDemystify eBPF JIT Compiler
Demystify eBPF JIT Compiler
 

Kürzlich hochgeladen

Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 

Kürzlich hochgeladen (20)

Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 

Statically Compiling Ruby with LLVM