Soo-Mook Moon's research while affiliated with Seoul National University and other places
What is this page?
This page lists the scientific contributions of an author, who either does not have a ResearchGate profile, or has not yet added these contributions to their profile.
It was automatically created by ResearchGate to create a record of this author's body of work. We create such pages to advance our goal of creating and maintaining the most comprehensive scientific repository possible. In doing so, we process publicly available (personal) data relating to the author as a member of the scientific community.
If you're a ResearchGate member, you can follow this page to keep up with this author's work.
If you are this author, and you don't want us to display this page anymore, please let us know.
It was automatically created by ResearchGate to create a record of this author's body of work. We create such pages to advance our goal of creating and maintaining the most comprehensive scientific repository possible. In doing so, we process publicly available (personal) data relating to the author as a member of the scientific community.
If you're a ResearchGate member, you can follow this page to keep up with this author's work.
If you are this author, and you don't want us to display this page anymore, please let us know.
Publications (113)
Web App migration means capturing a snapshot of the execution state of an web app on a device, and restoring it on another device to continue its execution, for cross-device liquid computing. Although web apps are relatively easy to migrate due to its high portability, there is a JavaScript language feature called closure, which complicates migrati...
Recently, researches have proposed application (app) migration approaches for JavaScript programs to enable a non-breaking user experience across different devices. To migrate a stateful JavaScript app’s runtime, past studies have proposed snapshot-based techniques in which the app’s runtime state is profiled and serialized into a text form that ca...
Test-pattern programs are for testing DRAM memory chips. They run on a special embedded system called automated test equipment (ATE). Each ATE manufacturer provides its own programming language, which is mostly low level, thus accessing the registers in the ATE directly. The register structure of each ATE is quite different and highly irregular. Si...
Cryptocurrencies such as Bitcoin and Ethereum have made payment transactions possible without a trusted third party, but they have a scalability issue due to their consensus mechanisms. Payment networks have emerged to overcome this limitation by executing transactions outside of the blockchain, which is why these are referred to as off-chain trans...
Mobile web platforms are facing new demands for emerging applications, such as machine learning or augmented reality, which require significant computing powers beyond that of current mobile hardware. Computation offloading can accelerate these apps by offloading the computation-intensive parts of an app from a client to a powerful server. Unfortun...
Web applications (apps) can play an important role for the era of ubiquitous computing since they can run on any smart or IoT devices equipped with a browser. This advantage of portability and simplicity can be extended further to allow an interesting user experience called app migration. That is, we can save the execution state of a running web ap...
Long start-up time of web apps or web pages at the client device may affect the user experience negatively. One bottleneck in reducing the start-up time is resource loading overhead. To reduce the overhead, resource preloading has been proposed, which load resources ahead of time, instead of loading them on time when they are used. For commercial c...
Following the recent success of deep neural networks (DNN) on video computer vision tasks, performing DNN inferences on videos that originate from mobile devices has gained practical significance. As such, previous approaches developed methods to offload DNN inference computations for images to cloud servers to manage the resource constraints of mo...
Future mobile applications, such as mobile cloud gaming or augmented reality, require not only high computation power but strict latency constraints. To provide computing resources with ultra-low latency, a new form of cloud infrastructure called edge cloud has been proposed, which distributes computing servers at the edges of the network. A primar...
As ethereum blockchain has become popular, the number of users and transactions has skyrocketed, causing an explosive increase of its data size. As a result, ordinary clients using PCs or smartphones cannot easily bootstrap as a full node, but rely on other full nodes such as the miners to run or verify transactions. This may affect the security of...
An Intermediate Representation (IR) used by compilers is normally generated statically, as a result of parsing or analyzing the source program. This paper proposes a completely different type of IR, generated as a result of running the source program, the output-based IR. There is a practical translation problem where such an IR is useful, in the d...
Offloading computations to servers is a promising method for resource constrained devices to run deep neural network (DNN). It often requires pre-installing DNN models at the server, which is not a valid assumption in an edge server environment where a client can offload to any nearby server, especially when it is on the move. So, the client needs...
JavaScript execution is heavily used during the loading of web apps, taking a substantial portion of the app loading time. To accelerate JavaScript execution, snapshot-based app loading has been proposed [5, 17]. We take a snapshot of the JavaScript objects in the heap at some point during app loading (which we call snapshot point) and save them in...
Reducing the loading time of a web app is important for a better user experience. The loading time includes a large amount of JavaScript execution, often composed of the execution of the global code in the script tags followed by the execution of event handlers. One approach to accelerate the app loading is saving the already-loaded execution state...
As web pages and web apps increasingly include heavy JavaScript code, JavaScript performance has been a critical issue. Modern JavaScript engines achieve a remarkable performance by employing tiered-execution architecture based on interpreter, baseline just-in-time compiler (JITC), and optimizing JITC. Unfortunately, they suffer from a substantial...
Current wisdom to run computation-intensive deep neural network (DNN) on resource-constrained mobile devices is allowing the mobile clients to make DNN queries to central cloud servers, where the corresponding DNN models are pre-installed. Unfortunately, this centralized, cloud-based DNN offloading is not appropriate for emerging decentralized clou...
Deep neural network (DNN) applications require heavy computations, so an embedded device with limited hardware such as an IoT device cannot run the apps by itself. One solution is to offload DNN computations from the client device to nearby edge servers [1] to request an execution of the DNN computations with their powerful hardware. However, there...
JavaScript¹ is heavily used in the web, yet it is much slower than other languages. To improve the JavaScript performance, ahead-of-time compilation (AOTC) has been used, either to reuse the bytecode or the machine code generated by the baseline just-in-time compilation (JITC). JavaScript engines today employ high-performance optimizing JITC. So, w...
Recently, cloud-based machine learning (ML) services are getting popular. A client sends input data to a cloud, which performs ML algorithms based on neural networks (NN) using its powerful server, and returns the result back to the client. In this scenario, the server can easily collect the users' sensitive data, raising the privacy issues and mak...
There are numerous working projects on IoT platforms, and many projects employ JavaScript as their client-side language. One of the benefits using JavaScript in IoT platforms is its great portability which lets an application to run on any IoT devices that employ a JavaScript runtime. In this situation, user experiences can be enhanced if the state...
We propose a new approach to running machine learning (ML) web app on resource-constrained embedded devices by offloading ML computations to servers. We can dynamically offload computations depending on the problem size and network status. The execution state is saved in the form of another web app called snapshot which simplifies the state migrati...
A key programming concept in the world of internet-of-things (IoT) is event-driven computation where events occurred in the ‘things’ are handled by their corresponding event handlers. JavaScript is particularly useful for this computational model due to its properties having event handlers simply programmable. Turning this model into a reality requ...
Web applications (apps) are programs created by web technologies such as HTML, CSS, and JavaScript. Web apps can be executed on any platform that supports a web browser. Such portability allows an interesting user experience called app migration, which can save an app's execution state to a file called snapshot, transmit it to another device, and c...
In embedded systems, small code size is important due to memory constraints. One technique to achieve a small code size is reducing the instruction encoding from 32-bit to 16-bit, such as the ARM THUMB or MIPS-16 architectures. This half-size encoding leads to shorter register operands, making fewer registers available for register allocation and c...
Due to its high portability and simplicity, web application (app) based on HTML/JavaScript/CSS has been widely used for various smart-device platforms. To take advantage of its wide platform pool, a new idea called app migration has been proposed for the web platform. Web app migration is a framework to serialize a web app running on a device and r...
Java virtual machine (JVM) has recently evolved into a general-purpose language runtime environment to execute popular programming languages such as JavaScript, Ruby, Python, and Scala. These languages have complex non-Java features, including dynamic typing and first-class function, so additional language runtimes (engines) are provided on top of...
JavaScript is a dynamic language mainly used as a client-side web script. Nowadays, web is evolving into an application platform with its web apps, and JavaScript increasingly undertakes complex computations and interactive user interfaces, requiring a high-performance JavaScript engine. There have been many optimizations for efficient JavaScript e...
Program analysis to check performance bottleneck or execution coverage is often implemented by instrumentation. Static binary instrumentation (SBI) adds the probing code before runtime, and dynamic binary instrumentation (DBI) changes the code at runtime with an OS support. Unfortunately, both are not appropriate for instrumenting embedded firmware...
Web applications (apps) are programmed using HTML5, CSS, and JavaScript, and are distributed in the source code format. Web apps can be executed on any devices where a web browser is installed, allowing one-source, multiplatform environment. We can exploit this advantage of platform independence for a new user experience called app migration, which...
Java just-in-time compilers often compile only hot methods because the compilation overhead is a part of the running time. This requires precise and efficient hot spot detection, which includes distinguishing hot methods from cold ones, detecting them as early as possible, and paying a small detection overhead. Hot spot detection is especially impo...
A method and an apparatus for dynamically generating a machine code is provided, including: sequentially storing generated instructions in a first buffer; sequentially storing data in a second buffer, when the generated instructions reference data; and flushing the first buffer and the second buffer to executable code when a distance between an ins...
The Java-based software platform for interactive digital TV (DTV) is composed of the system/middleware class statically installed on the DTV set-top box and the xlet applications dynamically downloaded from the TV stations. The xlet application includes Java classes and image/text files. The xlets are executed only when the TV viewer initiates an i...
More than half of the smart phones world-wide are currently employing the Android platform, which employs Java for programming its applications. The Android Java is to be executed by the Dalvik virtual machine (VM), which is quite different from the traditional Java VM such as Oracle's HotSpot VM. That is, Dalvik employs register-based bytecode whi...
Smart phone's full web browsing requires a high-performance JavaScript engine because JavaScript execution takes a non-trivial portion of the loading time for many web sites. The current wisdom of speeding up JavaScript engine is simply turning on its just-in-time compilation (JITC), which compiles JavaScript code to machine code on the fly and exe...
Partial inlining is an efficient way of inlining, which inlines only part of the callee function, thus reducing the code expansion. The key problem is how to split the callee function effectively so that both the call overhead and the code expansion can be reduced. Previous techniques either lead to function splits too large to be inlined, or fail...
Virtual machines provide platform independence by using intermediate code. Program source code is compiled into intermediate code, which can be executed on many different platforms. Even though there are many virtual machines, there are not many virtual machines that can support C/C++, especially with high performance. Recently, Low Level Virtual M...
The Java software platform for the interactive digital TV (DTV) is composed of the system/middleware classes statically installed on the DTV set-top box and the xlet classes dynamically downloaded from the TV stations, where xlets are executed only when the TV viewer initiates the interaction. In order to achieve high performance on this dual-compo...
Full web browsing with smart phones requires a high-performance JavaScript engine since JavaScript execution with a mobile CPU is slow. So, mobile JavaScript engines employ a just-in-time compiler (JITC), which translates JavaScript code to machine code at runtime. One issue is that since mobile phones suffer from tight memory constraints, the JITC...
Many embedded Java platforms execute two types of Java
classes: those installed statically on the client device and those
downloaded dynamically from service providers at run time. For
achieving higher performance, the static Java classes can be
compiled into machine code by ahead-of-time compiler (AOTC) in the
server, and the translated machine co...
Embedded systems often require small code size due to their tight memory constraints. Although the reduced encoding architectures such as the ARM THUMB or the MIPS-16 can successfully reduce the code size due to its half-sized instructions, they suffer from higher spills due to their shortened register fields which constrain available registers, th...
Most embedded Java software platforms include a Java middleware installed on the client device. It can be optimized using the ahead-of-time compiler (AOTC), which translates the Java bytecode into the machine code before runtime. There are many approaches to AOTC, but a bytecode-to-C AOTC which translates the bytecode into C code and then compile i...
Most Java just-in-time compilers (JITC) try to compile only hot methods since the compilation overhead is part of the running time. This requires precise and efficient hot spot detection , which includes distinguishing hot methods from cold methods, detecting them as early as possible, and paying a small runtime overhead for detection. A hot method...
A rotating register file is an architectural support for software pipelining, where many registers can be renamed at once when a rotating branch is executed. It has primarily been used for overcoming the cross-iteration register overwrites in modulo-scheduled, straight-line or if-converted loops. Recently, a new technique has been proposed to use r...
A rotating register file is a compiler-managed hardware renaming mechanism for overcoming the cross-iteration register overwrite problem in software pipelining [3J. It has primarily been used for software pipelining of straight-line and if-converted loops in the context of modulo scheduling. This paper proposes using rotating registers for software...
One of the most serious constraints of an embedded system is its limited memory, which requires small code size for embedded software. One popular method to reduce the code size is reducing the instruction encoding, such as the ARM THUMB or the MIPS-16 architectures. They employ shorter instructions by reducing the field width, including those of r...
The performance of embedded Java virtual machine can be improved by ahead-of-time compiler (AOTC), which translates bytecode into machine code in the server and installs the machine code on the client device. Although AOTC is more advantageous than just-in-time compiler (JITC) due to its absence of the translation overhead, AOTC cannot be applicabl...
Java just-in-time (JIT) compilers improve the performance of a Java virtual machine (JVM) by translating Java bytecode into native machine code on demand. One important problem in Java JIT compilation is how to map stack entries and local variables to registers efficiently and quickly, since register-based computations are much faster than memory-b...
A Java bytecode-to-C ahead-of-time compiler (AOTC) can improve the performance of a Java virtual machine (JVM) by translating bytecode into C code, which is then compiled into machine code via an existing C compiler. Although AOTC is effective in embedded Java systems, a bytecode-to-C AOTC could not easily employ precise garbage collection (GC) due...
One of the most promising approaches to Java acceleration in embedded systems is a bytecode-to-C ahead-of-time compiler (AOTC). It improves the performance of a Java virtual machine (JVM) by translating bytecode into C code, which is then compiled into machine code via an existing C compiler. One important design issue in AOTC is efficient exceptio...
Memory allocation is an important part of modern programming languages, including garbage- collected languages such as Java. We propose a fast memory allocation scheme for Java using lazy worst fit (LWF), where pointer increment is used as the primary allocation method and worst fit is used as a backup. We evaluated LWF on a working Java virtual ma...
Java supports the monitor construct for language-level synchronization in the context of multi-threading. This paper introduces the lightweight monitor, an efficient user-level monitor implementation. The lightweight monitor is useful for single-threaded Java programs as well as for multi-threaded Java programs with little lock contention. A 32-bit...
Traditional mark and sweep garbage collectors use time proportional to the heap size when sweeping memory, since all objects in the heap, dead or alive, must be traversed. Here we introduce a sweeping algorithm which traverses only the live objects. Since this sweeping algorithm is slower when the heap occupancy is high, we also discuss how to avoi...
Java uses exceptions to provide elegant error handling capabilities during program execution. However, the presence of exception handlers complicates the job of the just-in-time (JIT) compiler, while exceptions are rarely used in most programs. This paper describes two techniques for reducing such complications. First, we delay the transl...
Software pipelining is widely used as a compiler optimization technique to achieve high performance in machines that exploit instruction-level parallelism. However, surprisingly, there have been few theoretical or empirical results on time optimal software pipelining of loops with control flows. In this paper, we present three new theoretical and p...
Software pipelining increases the loop execution throughput by overlapping the execution of successive iterations in a pipelined fashion. For loops with control flows, however, software pipelining is not straightforward because we need to consider the overlap of more than one execution path. Modulo scheduling simply transforms them into straightlin...
Enhanced pipeline scheduling (EPS) is a software pipelining technique which can achieve a variable initiation interval (II) for loops with control flow via its code motion pipelining. EPS, however, leaves behind many renaming copy instructions that cannot be coalesced due to interferences. These copies take resources and, more seriously, they may c...
Software pipelining is widely used as a compiler optimization technique to achieve high performance in machines that exploit instruction -level parallelism. However, surprisingly, there have been few theoretical or empirical results on optimal software pipelining of loops with control flows. In this paper, we present three new contributions for thi...
A banked register file is a register file partitioned into banks. A register in a banked register file is addressed with the register number in conjunction with the active bank number. A banked register file may be employed to reduce the number of bits for register operands in the instruction encoding at the cost of bank changes and inter-bank data...
Recently developed VLIW processors have opened a new era of VLIW
multimedia computing. Many of these processors are equipped with VLIW
scheduling compilers that automate their code generation. Multimedia
VLIW compilers should exploit the characteristics specific to multimedia
and digital signal processing (DSP) application programs, the most
import...
We address the problem of time optimal software pipelining of loops with control flows, one of the most difficult open problems in the area of parallelizing compilers. We present a necessary condition for loops with control flows to haveequivalent time optimal programs, generalizing the result bySchwiegelshohn et al.,which has been the most signifi...
Dynamic memory allocation is an important part of modern programming languages. It is important that it be done fast without wasting too much memory. Memory allocation using lazy fits is introduced, where pointer increments, which is very fast, is used as the primary allocation method and where conventional fits such as best fit or first fit are us...
In Java, an exception thrown in a try block can be handled in one of catch blocks given by the programmer. On exception, local variables must be preserved to be usable in the catch block, while operand stack is flushed. This error handling mechanism raises an interesting challenge, called local variable consistency problem, in implementing register...
The Java language provides exceptions in order to handle errors gracefully. However, the presence of exception handlers complicate the job of a JIT (Just-in-Time) compiler, including optimizations and register allocation, even though exceptions are rarely used in most programs. This paper describes some mechanisms for removing overheads imposed by...
Java is a modern object-oriented programming language which assumes the use of garbage collection to automatically deallocate objects that can no longer be used. Also, typical Java applications allocate objects at a rather high rate. Thus the performance of the memory management system is an important factor which determines the performance of an e...
Dynamic memory allocation is an important part of modern programming languages. It is important that it be done fast without wasting too much memory. Memory allocation using lazy fits is introduced, where pointer increments, which is very fast, is used as the primary allocation method and where conventional fits such as best fit or first fit are us...
Aggressive instruction scheduling leaves behind many renaming copy instructions that cannot be coalesced due to interferences. These copies take resources, and more seriously, they may cause a stall if they are generated for renaming of multi-latency instructions. This paper proposes a code transformation technique based on loop unrolling which mak...
Java, an object-oriented language, uses virtual methods to support the extension and reuse of classes. Unfortunately, virtual method calls affect performance and thus require an efficient implementation, especially when just-in-time (JIT) compilation is done. Inline caches and type feedback are solutions used by compilers for dynamically-typed obje...
Mark and sweep garbage collectors are known for using time proportional to the heap size when sweeping memory, since all objects in the heap, regardless of whether they are live or not, must be visited in order to reclaim the memory occupied by dead objects. This paper introduces a sweeping method which traverses only the live objects, so that swee...
Enhanced pipeline scheduling (EPS) is a software pipelining technique which can achieve a variable initiation interval (II) for loops with control flows via its code motion pipelining. EPS, however, leaves behind many renaming
copy instructions that cannot be coalesced due to interferences. These copies take resources, and more seriously, they may...
Exceptions are provided by the Java programming language in order to handle errors more gracefully. However, exceptions are rare in most programs, so that most catch blocks are left unused. This paper describes an on-demand catch block translation scheme which translates catch blocks only when they are actually used. By ignoring exception handling...
This paper introduces the lightweight monitor in Java VM that is fast on single-threaded programs as well as on multi-threaded programs with little lock contention. A 32-bit lock is embedded into each object for efficient access while the lock queue and the wait set is managed through a hash table. The lock manipulation code is highly optimized and...
For network computing on desktop machines, fast execution of Java bytecode programs is essential because these machines are expected to run substantial application programs written in Java. Higher Java performance can be achieved by Just-in-Time (JIT) compilers which translate the stack-based bytecode into registerbased machine code on demand. One...
This paper proposes an enhanced method of multiple branch prediction using a per-primary branch history table. This scheme improves the previous ones based on a single global branch history register, by reducing interferences among histories of different branches caused by sharing a single register. This scheme also allows the prediction of a branc...
For network computing on desktop machines, fast execution of Java
bytecode programs is essential because these machines are expected to
run substantial application programs written in Java. Higher Java
performance can be achieved by just-in-time (JIT) compilers which
translate the stack-based bytecode into register-based machine code on
demand. One...
Java supports the monitor, a language-level synchronization construct for multi-threading. Unfortunately, even single-threaded Java programs must perform many monitor operations since most Java class libraries are provided with monitors turned on for thread-safety. Consequently, an efficient implementation of the monitor in the Java virtual machine...
Graph-coloring register allocators eliminate copies by coalescing
the source and target node of a copy if they do not interfere in the
interference graph. Coalescing is, however, known to be harmful to the
colorability of the graph because it tends to yield a graph with nodes
of higher degrees. Unlike aggressive coalescing which coalesces any pair...
We present an efficient compiled simulation system for the verification of a VLIW instruction set architecture and its assembly code. Our existing compiled simulation system is made to be faster by adopting incremental recompilation and C-assembly cosimulation techniques to improve the conventional compiled simulation. As a part of SPARC-based VLIW...
Modern single-CPU microprocessors exploit instruction-level parallelism (ILP) by deriving their performance advantage mainly from parallel execution of ALU and memory instructions within a single clock cycle. This performance advantage obtained by exploiting data ILP is severely offset by sequential execution of conditional branches, especially in...
The performance of Very Long Instruction Word (VLIW) microprocessors depends on the close cooperation between the compiler and the architecture. This paper evaluates a set of important compilation techniques and related architectural features for VLIW machines. The evaluation is performed on a SPARC-based VLIW testbed where gcc-generated optimized...
this article, we introduce a new code-scheduling technique for irregular ILP called "selective scheduling" which can be used as a component for superscalar and VLIW compilers. Selective scheduling can compute a wide set of independent operations across all execution paths based on renaming and forward-substitution and can compute available operatio...
This paper presents an algorithm for the Gaussian elimination problem that reduces the length of the critical path compared to the algorithm of Lord et al. This is done by redefining the notion of a task. For all practical purposes, the issues of communication overhead and pivoting cannot be overlooked. We consider these issues for the new algorith...
Citations
... Therefore, in order to evaluate Rule 2 efficiently, we restrict it to a concrete case where two dependencies must be triggered by the same value, such as T 1 and T 3 in Example 1 (dependency is triggered by the same value A). Such a situation is common in the blockchain because, in general, smart contract access to accounts is always skewed [41,42], namely, some accounts are frequently accessed, also known as active accounts. ...
... In the literature, some recent works exploit MEC for computational offloading of DNN tasks under a single WD setup [11]- [21] or a multi-WD setup [21], [22]. The DNN task offloading and resource allocation schemes are designed to optimize the WD's energy consumption [12]- [14], the DNN inferencing accuracy [15], [16], and the DNN inferencing time [17]- [20]. The profiling knowledge of layer-wise DNN inferencing delay/energy consumption, which heavily depends on the MEC system parameters, is determined in either an offline manner [12]- [18] or by an online learning approach [19], [20]. ...
... Hybrid Collaboration combines at least two of three ECCI application patterns above or integrates additional CI/EI capabilities into ECCI applications. For example, ShadowTutor [8] enables robust HD video semantic segmentation with significant throughput improvement and network data transmission reduction. Here, cloud servers conduct both the inference of the heavy and general 'teacher' model and the training of the lightweight 'student' model. ...
... This has led to a new trend of AR using on-screen smartphone instructions [54,55]. AR remote assistance, such as "see what I see" apps, can provide better knowledge transfer via a peer-to-peer connection that incorporates video, audio, or hand annotations [56][57][58]. Other studies of AR assistance have provided remote technical support, including those for maintenance [52], manufacturing [54,59], automotive [60], and utilities [61], with visual instructions or virtual user manuals [53,55] by means of annotations and content uploaded to phones, tablets, and AR glasses. ...
... The Web Worker API 4 has been introduced to enable parallel JavaScript programming on the web. Many prior studies have shown that offloading computation-intensive tasks in web applications from mobile devices to edge or cloud servers can greatly enhance device performance without requiring the devices to have advanced compute capabilities or high connection bandwidth [3,6,8]. This was done by offloading the computation-intensive tasks to worker threads (or web workers for short), which are spawned to run concurrently with the main thread in JavaScript, and dispatching the web workers to remote servers. ...
... IONN [3] uses the shortest path method and the penalty factor method to determine DNN partitions, and builds the DNN model incrementally when each DNN partition arrives, allowing the client to start partial uploading even before uploading the entire DNN model, thereby improving query performance. Enhanced Partitioning [32] is based on a penalty factor method of uploading overhead and uses the shortest path method on the DNN execution graph between the client and the cloud/edge server to partition the DNN layer, which generates a more granular uploading plan. JointDNN [33] transforms the optimal computing scheduling problem of DNN into the shortest path problem and Integer Linear Programming (ILP) in the mobile cloud computing environment, and divides the DNN architecture by optimization formulations at layer granularity, thereby achieving collaborative computing between mobile devices and the cloud. ...
... JavaScript classification is a challenging problem due to the dynamic non-deterministic behavior of the code [67], especially when attempted on-the-fly using low-end mobile phones, since this leaves no room for executing the JS codewhich tends to consume numerous resources and time. Existing research on JS filtering primarily focuses on the identification of advertising and/or tracking JS [42,47,49], in addition to malicious JS code snippets [32,33,44,66,68,69]. ...