Guy Golan-Gueta

dblp:29/1487 · also Guy Gueta · DBLP profile ↗
← Back
23ranked-venue papers
6as first author
3since 2021 · last 2023
0000-0002-9149-8080ORCID · reported

Domains — the database's venue-derived domains; a paper can count in several

Systems, architecture and hardware · 11 · 4 first-authorSoftware engineering, systems software and programming languages · 8 · 2 first-author · 1 since 2021Security and privacy · 2 · 1 first-author

Expertise — from the expertise taxonomy: the topics of the expert's papers under the CCF categories. A weight counts papers with recency: 1 for a paper about the topic, 0.3 when the topic is its context, halved every five years.

Software engineering, system software, and programming languages
10 papers
Concurrent programming · 76% Program verification · 16% Program analysis · 4%
Computer architecture, parallel and distributed computing, and storage systems
7 papers
Distributed systems · 29% Storage systems · 28% Parallel and multicore computing · 22%
Network and information security
2 papers
Cryptographic protocols and secure computation · 36% Cryptographic primitives and cryptanalysis · 36% Blockchain and cryptocurrency security · 28%
Theoretical computer science
1 paper
Automated reasoning and model checking · 100%
Databases, data mining, and information retrieval
2 papers
Indexing and storage engines · 81% Data stream processing · 19%

Topics — the 30 heaviest of 36, each with the papers that count most for it

TopicWeightPapersLastEvidence papers
Concurrent programming
concurrent data structures
1.142020
Nesting and composition in transactional data structure libraries · PPoPP 2020
LOFT: lock-free transactional data structures · PPoPP 2019
Concurrent libraries with foresight · PLDI 2013
Concurrent programming
transactional memory
0.932020
Nesting and composition in transactional data structure libraries · PPoPP 2020
Transactional data structure libraries · PLDI 2016
Composing concurrency control · PLDI 2015
Storage systems
key-value storage
0.832017
KiWi: A Key-Value Map for Scalable Real-Time Analytics · PPoPP 2017
Brief Announcement: A Key-Value Map for Massive Real-Time Analytics · PODC 2016
Scaling concurrent log-structured data stores · EuroSys 2015
Embedded and real-time systems › real-time system verification
safety verification
0.712023
Counterexample Driven Quantifier Instantiations with Applications to Distributed Protocols · Proc. ACM Program. Lang. 2023
Automated reasoning and model checking › satisfiability modulo theories
quantifier instantiation
0.712023
Counterexample Driven Quantifier Instantiations with Applications to Distributed Protocols · Proc. ACM Program. Lang. 2023
Concurrent programming
concurrency control
0.632015
Automatic scalable atomicity via semantic locking · PPoPP 2015
Composing concurrency control · PLDI 2015
Automatic semantic locking · PPoPP 2014
Distributed systems › fault tolerance
byzantine fault tolerance
0.522020
HotStuff: BFT Consensus with Linearity and Responsiveness · PODC 2019
Towards Scalable Threshold Cryptosystems · SP 2020
Cryptographic protocols and secure computation
threshold cryptography
0.412020
Towards Scalable Threshold Cryptosystems · SP 2020
Cryptographic primitives and cryptanalysis › public-key cryptography › digital signatures
threshold signature
0.412020
Towards Scalable Threshold Cryptosystems · SP 2020
Concurrent programming › synchronization
synchronization synthesis
0.422015
Automatic scalable atomicity via semantic locking · PPoPP 2015
Automatic semantic locking · PPoPP 2014
Distributed systems
consensus
0.412019
HotStuff: BFT Consensus with Linearity and Responsiveness · PODC 2019
Parallel and multicore computing › transactional memory
contention management
0.412019
LOFT: lock-free transactional data structures · PPoPP 2019
Parallel and multicore computing
transactional memory
0.412019
LOFT: lock-free transactional data structures · PPoPP 2019
Concurrent programming
synchronization
0.322015
Automatic scalable atomicity via semantic locking · PPoPP 2015
Automatic fine-grain locking using shape properties · OOPSLA 2011
Blockchain and cryptocurrency security
smart contract
0.312018
Online detection of effectively callback free objects with applications to smart contracts · Proc. ACM Program. Lang. 2018
Program verification
modular reasoning
0.312018
Online detection of effectively callback free objects with applications to smart contracts · Proc. ACM Program. Lang. 2018
Concurrent programming › concurrent data structures
transactional data structures
0.212016
Transactional data structure libraries · PLDI 2016
Concurrent programming › concurrency control
serializability
0.212015
Composing concurrency control · PLDI 2015
Storage systems › key-value storage
LSM-tree
0.212015
Scaling concurrent log-structured data stores · EuroSys 2015
Programming languages and type systems
abstract data types
0.212014
Automatic semantic locking · PPoPP 2014
Concurrent programming › concurrency verification
atomicity verification
0.212014
Verifying atomicity via data independence · ISSTA 2014
Program verification
concurrent program verification
0.212014
Verifying atomicity via data independence · ISSTA 2014
Program verification › concurrent program verification
linearizability verification
0.212014
Verifying atomicity via data independence · ISSTA 2014
Concurrent programming › synchronization
fine-grained locking
0.112011
Automatic fine-grain locking using shape properties · OOPSLA 2011
Program analysis › static analysis › pointer analysis
shape analysis
0.112011
Automatic fine-grain locking using shape properties · OOPSLA 2011
Program analysis
static analysis
0.112011
Automatic fine-grain locking using shape properties · OOPSLA 2011
Distributed systems
replication
0.112019
HotStuff: BFT Consensus with Linearity and Responsiveness · PODC 2019
Program verification
dynamic verification
0.112018
Online detection of effectively callback free objects with applications to smart contracts · Proc. ACM Program. Lang. 2018
Program verification › dynamic verification
runtime verification
0.112018
Online detection of effectively callback free objects with applications to smart contracts · Proc. ACM Program. Lang. 2018
Data stream processing
streaming analytics
0.112017
KiWi: A Key-Value Map for Scalable Real-Time Analytics · PPoPP 2017

Methods — techniques the papers use, named apart from their topics

relational abstraction · 1.3counterexample refinement · 1.3SMT solving · 1.3verifiable secret sharing · 0.9polynomial evaluation · 0.9lagrange interpolation · 0.9lock-free synchronization · 0.8helping mechanism · 0.8static analysis · 0.7dynamic analysis · 0.7software transactional memory · 0.7synthesis algorithm · 0.4commutativity specification · 0.4pipelining · 0.4BFT replication · 0.4concurrent data structure design · 0.3two-phase locking · 0.2two-phase commit · 0.2
YearPublicationVenuePosition
2023 Counterexample Driven Quantifier Instantiations with Applications to Distributed Protocols
abstract
Formally verifying infinite-state systems can be a daunting task, especially when it comes to reasoning about quantifiers. In particular, quantifier alternations in conjunction with function symbols can create function cycles that result in infinitely many ground terms, making it difficult for solvers to instantiate quantifiers and causing them to diverge. This can leave users with no useful information on how to proceed. To address this issue, we propose an interactive verification methodology that uses a relational abstraction technique to mitigate solver divergence in the presence of quantifiers. This technique abstracts functions in the verification conditions (VCs) as one-to-one relations, which avoids the creation of function cycles and the resulting proliferation of ground terms. Relational abstraction is sound and guarantees correctness if the solver cannot find counter-models. However, it may also lead to false counterexamples, which can be addressed by refining the abstraction and requiring the existence of corresponding elements. In the domain of distributed protocols, we can refine the abstraction by diagnosing counterexamples and manually instantiating elements in the range of the original function. If the verification conditions are correct, there always exist finitely many refinement steps that eliminate all spurious counter-models, making the approach complete. We applied this approach in Ivy to verify the safety properties of consensus protocols and found that: (1) most verification goals can be automatically verified using relational abstraction, while SMT solvers often diverge when given the original VC, (2) only a few manual instantiations were needed, and the counterexamples provided valuable guidance for the user compared to timeouts produced by the traditional approach, and (3) the technique can be used to derive efficient low-level implementations of tricky algorithms.
Orr Tamir, Marcelo Taube, Kenneth L. McMillan, Sharon Shoham, Jon Howell, Guy Golan-Gueta, Shmuel Sagiv
Proc. ACM Program. Lang.6
2021 Using Nesting to Push the Limits of Transactional Data Structure Libraries
Gal Assa, Hagar Meir, Guy Golan-Gueta, Idit Keidar, Alexander Spiegelman
OPODIS3
2021 Brief Announcement: Using Nesting to Push the Limits of Transactional Data Structure Libraries
abstract
Transactional data structure libraries (TDSL) combine the ease-of-programming of transactions with the high performance and scalability of custom-tailored concurrent data structures. They can be very efficient thanks to their ability to exploit data structure semantics in order to reduce overhead, aborts, and wasted work compared to general-purpose software transactional memory. However, TDSLs were not previously used for complex use-cases involving long transactions and a variety of data structures. In this paper, we boost the performance and usability of a TDSL, towards allowing it to support complex applications. A key idea is nesting. Nested transactions create checkpoints within a longer transaction, so as to limit the scope of abort, without changing the semantics of the original transaction. We build a Java TDSL with built-in support for nested transactions over a number of data structures. We conduct a case study of a complex network intrusion detection system that invests a significant amount of work to process each packet. Our study shows that our library outperforms publicly available STMs twofold without nesting, and by up to 16x when nesting is used.
Gal Assa, Hagar Meir, Guy Golan-Gueta, Idit Keidar, Alexander Spiegelman
DISC3
2020 Nesting and composition in transactional data structure libraries
abstract
Transactional data structure libraries (TDSL) combine the ease-of-programming of transactions with the high performance and scalability of custom-tailored concurrent data structures. They can be very efficient thanks to their ability to exploit data structure semantics in order to reduce overhead, aborts, and wasted work compared to general-purpose software transactional memory. However, TDSLs were not previously used for complex use-cases involving long transactions and a variety of data structures.
Gal Assa, Hagar Meir, Guy Golan-Gueta, Idit Keidar, Alexander Spiegelman
PPoPP3
2020 Towards Scalable Threshold Cryptosystems
abstract
The resurging interest in Byzantine fault tolerant systems will demand more scalable threshold cryptosystems. Unfortunately, current systems scale poorly, requiring time quadratic in the number of participants. In this paper, we present techniques that help scale threshold signature schemes (TSS), verifiable secret sharing (VSS) and distributed key generation (DKG) protocols to hundreds of thousands of participants and beyond. First, we use efficient algorithms for evaluating polynomials at multiple points to speed up computing Lagrange coefficients when aggregating threshold signatures. As a result, we can aggregate a 130,000 out of 260,000 BLS threshold signature in just 6 seconds (down from 30 minutes). Second, we show how "authenticating" such multipoint evaluations can speed up proving polynomial evaluations, a key step in communication-efficient VSS and DKG protocols. As a result, we reduce the asymptotic (and concrete) computational complexity of VSS and DKG protocols from quadratic time to quasilinear time, at a small increase in communication complexity. For example, using our DKG protocol, we can securely generate a key for the BLS scheme above in 2.3 hours (down from 8 days). Our techniques improve performance for thresholds as small as 255 and generalize to any Lagrange-based threshold scheme, not just threshold signatures. Our work has certain limitations: we require a trusted setup, we focus on synchronous VSS and DKG protocols and we do not address the worst-case complaint overhead in DKGs. Nonetheless, we hope it will spark new interest in designing large-scale distributed systems.
Alin Tomescu, Ittai Abraham, Benny Pinkas, Guy Golan-Gueta, Srini Devadas
SP6
2019 SBFT: A Scalable and Decentralized Trust Infrastructure
abstract
SBFT is a state of the art Byzantine fault tolerant state machine replication system that addresses the challenges of scalability, decentralization and global geo-replication. SBFT is optimized for decentralization and is experimentally evaluated on a deployment of more than 200 active replicas withstanding a malicious adversary controlling f=64 replicas. Our experiments show how the different algorithmic ingredients of SBFT contribute to its performance and scalability. The results show that SBFT simultaneously provides almost 2x better throughput and about 1.5x better latency relative to a highly optimized system that implements the PBFT protocol. To achieve this performance improvement, SBFT uses a combination of four ingredients: using collectors and threshold signatures to reduce communication to linear, using an optimistic fast path, reducing client communication and utilizing redundant servers for the fast path. SBFT is the first system to implement a correct dual-mode view change protocol that allows to efficiently run either an optimistic fast path or a fallback slow path without incurring a view change to switch between modes.
Guy Golan-Gueta, Ittai Abraham, Shelly Grossman, Dahlia Malkhi, Benny Pinkas, Michael K. Reiter, Dragos-Adrian Seredinschi, Orr Tamir, Alin Tomescu
DSN1
2019 HotStuff: BFT Consensus with Linearity and Responsiveness
abstract
We present HotStuff, a leader-based Byzantine fault-tolerant replication protocol for the partially synchronous model. Once network communication becomes synchronous, HotStuff enables a correct leader to drive the protocol to consensus at the pace of actual (vs. maximum) network delay--a property called responsiveness---and with communication complexity that is linear in the number of replicas. To our knowledge, HotStuff is the first partially synchronous BFT replication protocol exhibiting these combined properties. Its simplicity enables it to be further pipelined and simplified into a practical, concise protocol for building large-scale replication services.
Maofan Yin, Dahlia Malkhi, Michael K. Reiter, Guy Golan-Gueta, Ittai Abraham
PODC4
2019 LOFT: lock-free transactional data structures
abstract
Concurrent data structures are widely used in modern multicore architectures, providing atomicity (linearizability) for each concurrent operation. However, it is often desirable to execute several operations on multiple data structures atomically. We present a design of a transactional framework supporting linearizable transactions of multiple operations on multiple data structures in a lock-free manner. Our design uses a helping mechanism to obtain lock-freedom, and an advanced lock-free contention management mechanism to mitigate the effects of aborting transactions. When cyclic helping conflicts are detected, the contention manager reorders the conflicting transactions execution allowing all transactions to complete with minimal delay. To exemplify this framework we implement a transactional set using a skip-list, a transactional queue, and a transactional register. We present an evaluation of the system showing that we outperform general software transactional memory, and are competitive with lock-based transactional data structures.
Avner Elizarov, Guy Golan-Gueta, Erez Petrank
PPoPP2
2018 A Scalable Linearizable Multi-Index Table
abstract
Concurrent data structures typically index data using a single primary key and provide fast atomic access to data associated with a given key value. However, it is often required to atomically access information via multiple primary and secondary keys, and even through additional properties that do not naturally represent keys for the given data. We present lock-free and lock-based algorithms of a table with multiple indexing, supporting linearizable inserts, deletes, and retrieve operations. We have implemented Java versions of our algorithms and evaluated their performance on a multi-core machine. The results show that the proposed table implementations are scalable and more efficient than any existing available alternative for in-memory realizations of a multi-index table.
Gali Sheffi, Guy Golan-Gueta, Erez Petrank
ICDCS2
2018 Online detection of effectively callback free objects with applications to smart contracts
abstract
Callbacks are essential in many programming environments, but drastically complicate program understanding and reasoning because they allow to mutate object's local states by external objects in unexpected fashions, thus breaking modularity. The famous DAO bug in the cryptocurrency framework Ethereum, employed callbacks to steal $150M. We define the notion of Effectively Callback Free (ECF) objects in order to allow callbacks without preventing modular reasoning. An object is ECF in a given execution trace if there exists an equivalent execution trace without callbacks to this object. An object is ECF if it is ECF in every possible execution trace. We study the decidability of dynamically checking ECF in a given execution trace and statically checking if an object is ECF. We also show that dynamically checking ECF in Ethereum is feasible and can be done online. By running the history of all execution traces in Ethereum, we were able to verify that virtually all existing contract executions, excluding these of the DAO or of contracts with similar known vulnerabilities, are ECF. Finally, we show that ECF, whether it is verified dynamically or statically, enables modular reasoning about objects with encapsulated state.
Shelly Grossman, Ittai Abraham, Guy Golan-Gueta, Yan Michalevsky, Noam Rinetzky, Shmuel Sagiv, Yoni Zohar
Proc. ACM Program. Lang.3
2017 KiWi: A Key-Value Map for Scalable Real-Time Analytics
abstract
Modern big data processing platforms employ huge in-memory key-value (KV) maps. Their applications simultaneously drive high-rate data ingestion and large-scale analytics. These two scenarios expect KV-map implementations that scale well with both real-time updates and large atomic scans triggered by range queries.
Dmitry Basin, Edward Bortnikov, Anastasia Braginsky, Guy Golan-Gueta, Eshcar Hillel, Idit Keidar, Moshe Sulamy
PPoPP4
2016 Transactional data structure libraries
abstract
We introduce transactions into libraries of concurrent data structures; such transactions can be used to ensure atomicity of sequences of data structure operations. By focusing on transactional access to a well-defined set of data structure operations, we strike a balance between the ease-of-programming of transactions and the efficiency of custom-tailored data structures. We exemplify this concept by designing and implementing a library supporting transactions on any number of maps, sets (implemented as skiplists), and queues. Our library offers efficient and scalable transactions, which are an order of magnitude faster than state-of-the-art transactional memory toolkits. Moreover, our approach treats stand-alone data structure operations (like put and enqueue) as first class citizens, and allows them to execute with virtually no overhead, at the speed of the original data structure library.
Alexander Spiegelman, Guy Golan-Gueta, Idit Keidar
PLDI2
2016 Brief Announcement: A Key-Value Map for Massive Real-Time Analytics
abstract
Modern big data processing platforms employ huge in-memory key-value (KV-) maps. Their applications simultaneously drive high-rate data ingestion and large-scale analytics. These two scenarios expect KV-map implementations that scale well with both real-time updates and massive atomic scans triggered by range queries. However, today's state-of-the art concurrent KV-maps fall short of satisfying these requirements -- they either provide only limited or non-atomic scans, or severely hamper updates when scans are ongoing. We present KiWi, the first atomic KV-map to efficiently support simultaneous massive data retrieval and real-time access. The key to achieving this is treating scans as first class citizens, whereas most existing concurrent KV-maps do not provide atomic scans, and some others add them to existing maps without rethinking the design anew.
Dmitry Basin, Edward Bortnikov, Anastasia Braginsky, Guy Golan-Gueta, Eshcar Hillel, Idit Keidar, Moshe Sulamy
PODC4
2016 Brief Announcement: Transactional Data Structure Libraries
abstract
We introduce transactions into libraries of concurrent data structures; such transactions can be used to ensure atomicity of sequences of data structure operations. By restricting transactional access to a well-defined set of data structure operations, we strike a balance between the ease-of-programming of transactions and the efficiency of custom-tailored data structures. We exemplify this concept by designing and implementing a library supporting transactions on any number of maps, sets (implemented as skiplists), and queues. Our library offers efficient and scalable transactions, which are an order of magnitude faster than state-of-the-art transactional memory toolkits. Moreover, our approach treats stand-alone data structure operations (like put and enqueue) as first class citizens, and allows them to execute with virtually no overhead, at the speed of the original data structure library.
Alexander Spiegelman, Guy Golan-Gueta, Idit Keidar
SPAA2
2015 Scaling concurrent log-structured data stores
abstract
Log-structured data stores (LSM-DSs) are widely accepted as the state-of-the-art implementation of key-value stores. They replace random disk writes with sequential I/O, by accumulating large batches of updates in an in-memory data structure and merging it with the on-disk store in the background. While LSM-DS implementations proved to be highly successful at masking the I/O bottleneck, scaling them up on multicore CPUs remains a challenge. This is nontrivial due to their often rich APIs, as well as the need to coordinate the RAM access with the background I/O.
Guy Golan-Gueta, Edward Bortnikov, Eshcar Hillel, Idit Keidar
EuroSys1
2015 Composing concurrency control
abstract
Concurrency control poses significant challenges when composing computations over multiple data-structures (objects) with different concurrency-control implementations. We formalize the usually desired requirements (serializability, abort-safety, deadlock-safety, and opacity) as well as stronger versions of these properties that enable composition. We show how to compose protocols satisfying these properties so that the resulting combined protocol also satisfies these properties. Our approach generalizes well-known protocols (such as two-phase-locking and two-phase-commit) and leads to new protocols. We apply this theory to show how we can safely compose optimistic and pessimistic concurrency control. For example, we show how we can execute a transaction that accesses two objects, one controlled by an STM and another by locking.
Ofri Ziv, Alex Aiken, Guy Golan-Gueta, G. Ramalingam, Shmuel Sagiv
PLDI3
2015 Automatic scalable atomicity via semantic locking
abstract
In this paper, we consider concurrent programs in which the shared state consists of instances of linearizable ADTs (abstract data types). We present an automated approach to concurrency control that addresses a common need: the need to atomically execute a code fragment, which may contain multiple ADT operations on multiple ADT instances. We present a synthesis algorithm that automatically enforces atomicity of given code fragments (in a client program) by inserting pessimistic synchronization that guarantees atomicity and deadlock-freedom (without using any rollback mechanism). Our algorithm takes a commutativity specification as an extra input. This specification indicates for every pair of ADT operations the conditions under which the operations commute. Our algorithm enables greater parallelism by permitting commuting operations to execute concurrently. We have implemented the synthesis algorithm in a Java compiler, and applied it to several Java programs. Our results show that our approach produces efficient and scalable synchronization.
Guy Golan-Gueta, G. Ramalingam, Shmuel Sagiv, Eran Yahav
PPoPP1
2015 Towards Automatic Lock Removal for Scalable Synchronization
Maya Arbel-Raviv, Guy Golan-Gueta, Eshcar Hillel, Idit Keidar
DISC2
2014 Checking Linearizability of Encapsulated Extended Operations
Oren Zomer, Guy Golan-Gueta, G. Ramalingam, Shmuel Sagiv
ESOP2
2014 Verifying atomicity via data independence
abstract
We present a technique for automatically verifying atomicity of composed concurrent operations. The main observation behind our approach is that many composed concurrent operations which occur in practice are data-independent. That is, the control-flow of the composed operation does not depend on specific input values. While verifying data-independence is undecidable in the general case, we provide succint sufficient conditions that can be used to establish a composed operation as data-independent. We show that for the common case of concurrent maps, data-independence reduces the hard problem of verifying linearizability to a verification problem that can be solved efficiently with a bounded number of keys and values. We implemented our approach in a tool called VINE and evaluated it on all composed operations from 57 real-world applications (112 composed operations). We show that many composed operations (49 out of 112) are data-independent, and automatically verify 30 of them as linearizable and the rest 19 as having violations of linearizability that could be repaired and then subsequently automatically verified. Moreover, we show that the remaining 63 operations are not linearizable, thus indicating that data independence does not limit the expressiveness of writing realistic linearizable composed operations.
Ohad Shacham, Eran Yahav, Guy Golan-Gueta, Alex Aiken, Nathan Bronson, Shmuel Sagiv, Martin T. Vechev
ISSTA3
2014 Automatic semantic locking
abstract
In this paper, we consider concurrent programs in which the shared state consists of instances of linearizable ADTs (abstract data types). We develop a novel automated approach to concurrency control that addresses a common need: the need to atomically execute a code fragment, which may contain multiple ADT operations on multiple ADT instances. In our approach, each ADT implements ADT-specific semantic locking operations that serve to exploit the semantics of ADT operations. We develop a synthesis algorithm that automatically inserts calls to these locking operations in a set of given code fragments (in a client program) to ensure that these code fragments execute atomically without deadlocks, and without rollbacks.
Guy Golan-Gueta, G. Ramalingam, Shmuel Sagiv, Eran Yahav
PPoPP1
2013 Concurrent libraries with foresight
abstract
Linearizable libraries provide operations that appear to execute atomically. Clients, however, may need to execute a sequence of operations (a composite operation) atomically. We consider the problem of extending a linearizable library to support arbitrary atomic composite operations by clients. We introduce a novel approach in which the concurrent library ensures atomicity of composite operations by exploiting information (foresight) provided by its clients. We use a correctness condition, based on a notion of dynamic right-movers, that guarantees that composite operations execute atomically without deadlocks, and without using rollbacks.
Guy Golan-Gueta, G. Ramalingam, Shmuel Sagiv, Eran Yahav
PLDI1
2011 Automatic fine-grain locking using shape properties
abstract
We present a technique for automatically adding fine-grain locking to an abstract data type that is implemented using a dynamic forest -i.e., the data structures may be mutated, even to the point of violating forestness temporarily during the execution of a method of the ADT. Our automatic technique is based on Domination Locking, a novel locking protocol. Domination locking is designed specifically for software concurrency control, and in particular is designed for object-oriented software with destructive pointer updates. Domination locking is a strict generalization of existing locking protocols for dynamically changing graphs. We show our technique can successfully add fine-grain locking to libraries where manually performing locking is extremely challenging. We show that automatic fine-grain locking is more efficient than coarse-grain locking, and obtains similar performance to hand-crafted fine-grain locking.
Guy Golan-Gueta, Nathan Bronson, Alex Aiken, G. Ramalingam, Shmuel Sagiv, Eran Yahav
OOPSLA1