Akshay Sharma
Updated date Jan 03, 2024
In this blog we are going to learn what is online compiler and what is the meaning of DAG in compiler design.
• 1.4k
• 0
• 0

## Introduction

Have you heard of the term Dag in compiler design? With the advancement in the field of technology, the concept of Dag and Compiler Design. And It has gained a lot of popularity. Compiler design is a process of choosing what kind of code can be generated from a given source code. The choice of intermediate representation is one important aspect that determines how much optimization will be performed on the program.

An online compiler designer must decide which type of data structure should be used to represent the state of the program. The concerned professional must also be responsible to change this data structure to update the process. There are many strategies available for representing intermediate states, one of which is DAG (Directed Acyclic Graph).

A directed graph without any cycles linking the other edges is known as a directed acyclic graph (DAG). It is a shape containing nodes and edges but no loops or backtracks, to put it another way.

DAGs are frequently used to represent intermediate code. They are also used in other contexts, such as data processing, to optimize operations on lists or tuples.

A DAG in a compiler design can be thought of as a tree where each node is connected to at most two other nodes. The relationship between these trees is like that between an acorn tree and its parent plant – one cannot be away from the other because each has its own unique structure—the same goes for any two different trees!

## DAG supports topological ordering

A directed graph is a DAG in a compiler design. DAG lacks cycles and allows topological ordering, which arranges vertices in a linear position. For any directed edge UV connecting vertex u to vertex v, u is placed ahead of v.

You may ask why you should care about this. Well, if we are doing some computation on data structure, then we need to consider how its elements get ordered when they are traversed through.

For Instance - there are multiple ways through your data structure (e.g., using different paths), then there will be some way in which all paths lead back to themselves—and it does not matter whether you traverse them all with one path or many different ones.

Since there is no difference between them (other than their order), then by definition, they all give rise to the same result!

### Its topological orderings are similar to a linear time sequence of vertices.

You may have already seen the following example of a DAG:

`DAG = { A | B }`

This is just a generalization of an adjacency list. In this case, we can think of A as being our vertices and B as being our edges. We also know that there is no cycle between or among these vertices.

This means that if you traverse from one vertex to another, you will always go through them in exactly one order (the "topological ordering"). The same goes for traversing from one edge to another. It is guaranteed not to visit any other edges along the way!

### DAG has at least one node with in-degree 0, called the source node. There can be, at most, one node with out-degree 0, called the sink node.

A directed acyclic graph (DAG) has at least one outgoing edge and a maximum of one incoming edge for each vertex. The number of edges leaving a vertex determines its out-degree. And the number of edges coming into it determines its in-degree.

A source node (also called a root) has no outgoing edges and an ending sink node (also called a leaf).

### All paths from the source lead to sinking. There will be at least one path between any two nodes.

As we have discussed above, a directed acyclic graph (DAG) is a mathematical structure consisting of a set of vertices connected by edges. The vertex degrees are assigned to the nodes in such a way that there is no cycle.

The DAG in a compiler design can be represented with an adjacency matrix where each row represents a vertex, and each column represents an edge connecting two vertices together. A DAG has at least one node with a degree of 0.

Therefore, it does not contain any cycles. There are also some rules for creating DAGs, out of which the main one is the following:

• All paths from source lead to sinking: This means that if we have three sources, then there must be at least one path from one source to another one (for example, A->B->C). This rule ensures our compiler generates correct code without backtracking or looping unnecessarily!

The concept of the DAG is present in many online compiler designs to represent intermediate code. This is because it allows us to easily parse and analyze our source files, as well as make runtime decisions based on those analyses.

DAGs are also used for representing abstract syntax trees (ASTs), and control flow graphs (CFGs).

The most commonly used intermediate representation is the abstract syntax tree. But is not sensical for many optimizations that can be performed on the program, so DAG representation comes into play. A directed acyclic graph (DAG) is a type of abstract data type that supports topological ordering and has at least one node with in-degree 0, called a source node. The following figure illustrates a simple example of a DAG:

A DAG can also be viewed as a directed walk over an ordered set; that is, there is an order relation between each pair of nodes in the graph - this implies there are no cycles in the graph!

For those who are not aware of what online compilers are, they are used to convert high-level code. This helps to machine-level language for the system and vice versa. It shows all the errors in your code line by line which makes it convenient for the programmer to resolve any errors in his code.

Moreover, the compiler will convert the code written by the programmer into a platform-independent file that can be shared and accessed by other users.

You can do all this on your browser only. You will not have to download or install any kind of software on your system. However, you need to always choose an online compiler that fits the best with your needs.

If you are still thinking if you need an online compiler or not? Let’s unravel the advantages and disadvantages of online compilers to make a better decision.

Easy usability, accessibility, lower costs, and automatic software updates are some of the crucial reasons why people choose online compilers to code. However, the list does not end here!

One of the major reasons why one may not choose an online compiler is the lack of security. Check out the list of all the potential risks of using an online compiler.