Ali Alaei

Digital Electronics Engineer

My research interests are primarily in the field of  FPGA …..

Courses / Slides

Contact Information

Phone: (98) 9197130112

Email: ali.alaei.ac@gmail.com

5 Programming Languages Every Programmer Should Learn

  • Java :

Java is one of the most popular languages of the last two decades and rules the world of server-side application development. It also holds sizable market share in mobile games and application development using Android and in the enterprise web development world.

Java was started with the simple concept of WORA (write once run anywhere) but over the time, Java has actually come to run everywhere.

You should learn Java to build robust, scalable server-side applications. You can build projects of varying complexity in Java, and it has great tools, technology, and community around it.

Why should you learn Java? You will learn how to focus on application design and code structuring without worrying about system-specific details and memory management. JVM will take care of it.

  • Python :

Python is one of the most taught languages in school and colleges across the world. In the USA, Python has replaced Java in many academic courses as the preferred language to start with. What will you gain by learning Python? A lot.

Python is one of those languages which can be used as a scripting language as well as proper object-oriented language for a large project.

Many popular websites including Reddit are built on Python frameworks like Django. In recent times, many large organizations have been switching to Python-based frameworks as well.

It’s also increasingly used for new generation technology like machine learning, artificial intelligence, and data science. No wonder, because it has got some awesome machine learning libraries like TensorFlow, Scikit-Learn, and others.

I personally use Python for writing scripts though, and it is very useful for doing something quickly, e.g. you can write a UDP message listener in 5 minutes in Python as opposed to 20 minutes in Java. Forget about compiling, packaging, and then using, just write Python scripts for ad-hoc tasks.

  • JavaScript :

You can replace Java with C++  and replace Python with Ruby, but, honestly, there is no replacement for JavaScript in today’s world. In the last five years, JavaScript has totally dominated the world.

It is no more the client-side scripting language, with the framework and libraries like Node.js, Angular, and React you can use JavaScript on the server-side as well for user interface development.

Some part of JavaScript’s overwhelming success is because of jQuery, which truly changed the way you use JavaScript on the client-side.

  • C and/or C++ :

You cannot be a programmer without knowing C or C++.  This is a very strong statement but I am saying this from my experience.

Software engineers or developers who know C are simply better than programmers who don’t know C and it cannot be just plain coincidence.

It’s one of those languages which you must know. I learned C during my academic training and learned many key programming concepts along the way, e.g. structure, arrays, pointers, memory management, etc.

  • Scala :

Scala is a language which was created based on the best practices of the last 20 years. It is a functional programming language so it offers a different paradigm than other object-oriented programming languages, which will improve your thinking and code sense.

Reference & Learn More

What is FPGA?

Software is the basis of all applications. Whether for entertainment, gaming, communications, or medicine, many of the products people use today began as a software model or prototype. Based on the performance and programmability constraints of the system, the software engineer is tasked with determining the best implementation platform to get a project to market. To accomplish this task, the software engineer is aided by both programming techniques and a variety of hardware processing platforms. On the programming side, previous decades yielded advances in object-oriented programming for code reuse and parallel computing paradigms for boosting algorithm performance. The advancements in programming languages, frameworks, and tools allowed the software engineer to quickly prototype and test different approaches to solve a particular problem. This need to quickly prototype a solution leads to two interesting questions. The first question of how to analyze and quantify one algorithm against another is extensively discussed in other works. The second question of where to execute the algorithm is addressed in this guide in relation to field programmable gate arrays (FPGAs). Regarding where to run an algorithm, there is an increasing focus on parallelization and concurrency. Although the interest in the parallel and concurrent execution of software programs is not new, the renewed and increased interest is aided by certain trends in processor and application-specific integrated circuit (ASIC) design. In the past, the software engineer faced two choices for getting more performance out of a software algorithm: a custom-integrated circuit or an FPGA. The first and most expensive option is to turn the algorithm over to a hardware engineer for a custom circuit implementation. The cost of this option is based on:

  • Cost to fabricate the circuit
  • Time to translate the algorithm into hardware

Despite advancements in fabrication process node technology that have yielded significant improvements in power consumption, computational throughput, and logic density, the cost to fabricate a custom-integrated circuit or ASIC for an application is still high. At each processing node, the cost of fabrication continues to increase to the point where this approach is only economically viable for applications that ship in the range of millions of units. The second option is to use an FPGA, which addresses the cost issues inherent in ASIC fabrication. FPGAs allow the designer to create a custom circuit implementation of an algorithm using an off-the-shelf component composed of basic programmable logic elements. This platform offers the power consumption savings and performance benefits of smaller fabrication nodes without incurring the cost and complexity of an ASIC development effort. Similar to an ASIC, an algorithm implemented in an FPGA benefits from the inherent parallel nature of a custom circuit. Reference & Learn More

FPGA Programming Model

The programming model of a hardware platform is one of the driving factors behind itsadoption. Software algorithms are typically captured in C/C++ or some other high-levellanguage, which abstracts the details of the computing platform. These languages allow forquick iteration, incremental improvements, and code portability, which are critical to thesoftware engineer. For the past few decades, the fast execution of algorithms captured inthese languages have fueled the development of processors and software compilers.Initially, improving the runtime of software was based on two central concepts: increasingprocessor clock frequency and using specialized processors. For many years, it was commonpractice to wait a year for the next generation processor as a way to speed up execution. Atevery new higher clock frequency, the software program ran faster. Although this wasacceptable in some cases, for a large set of applications, incremental speedup throughprocessor clock frequency is not enough to deliver a viable product to market.For this type of application, the specialized processor was created. Although there are many kinds of specialized processors, such as the digital signal processor (DSP) and graphics processing unit (GPU), all of these processors are capable of executing an algorithm written in a high-level language, such as C, and have function-specific accelerators to improve the execution of their target software applications. With the recent paradigm shift in the design of standard and specialized processors, both types of processors stopped relying on clock frequency increases for program speedup and added more processing cores per chip. Multicore processors put program parallelization at the forefront of techniques used to boost software performance. The software engineer must now structure algorithms in a way that leads to efficient parallelization for performance. The techniques required in algorithm design use the same base elements of FPGA design. The main difference between an FPGA and a processor is the programming model.Historically, the programming model of an FPGA was centered on register-transfer level (RTL) descriptions instead of C/C++. Although this model of design capture is completely compatible with ASIC design, it is analogous to assembly language programming in software engineering. Reference & Learn More