cucapra / undergrad-research

file issues here if you're interested in doing research with us!
https://capra.cs.cornell.edu/ugresearch.html
0 stars 0 forks source link

Alexander Kozik #126

Closed LambdaAK closed 2 months ago

LambdaAK commented 5 months ago

Personal Details

Name: Alexander Kozik

Undergrad or MEng? Undergrad

Year in Cornell: Sophomore

Relevant classes:

Expertise (languages/frameworks/etc.):

Research

When do you want to do research?

I want to do research over the summer as a full-time job.

What is exciting to you about research?

Reflecting on my early days as a freshman, I thought I would just be learning how to code. But, the more I progress, the more I realize there is so much more to CS than writing code. I've found a genuine love for PL, both in the theoretical and applied aspects.

Since learning how to program, I have always been fascinated with how programming languages work - how code gets read by a compiler and "executed." Before taking classes at Cornell, I only had a vague understanding of what "executed" meant, but over time, I learned there is much more to "execution" than what meets the eye of the software engineer.

My initial exploration of PL was an attempt to make an interpreter using Python, and given that I was only in 10th grade and had limited exposure to computer science, my interpreter was incredibly basic and had numerous flaws. I also tried making a compiler that would transpile source code into C. At the time, I didn't know about parsing and lexing, so this compiler was also extremely simple and flawed. But, I thought these were fascinating projects, and I wanted to dive deeper into the world of PL.

The summer after my freshman spring at Cornell, I began using OCaml to create LambdaScript, an interpreter for a statically typed functional language. Here are some of the features I've implemented in LambdaScript

Working on LambdaScript has been an incredibly gratifying project, and it has allowed me to gain valuable insights about the inner workings of a programming language, both at the theoretical and applied levels.

After gaining experience with assembly programming and hardware in CS 3410, I hope to learn more about the lower-level aspects of programming languages. Particularly, I want to discover more about compiler optimization and how ASTs are translated into intermediate representations and assembly code.

As a CS + math major, I love the mathematical aspects of computer science. I am excited to learn more about how programming languages function at the semantic level and the mathematical foundations of PL. After exploring Haskell, I have also become interested in category theory and how mathematical objects, such as functors and monads, can be used to model computation. Through research, I hope to learn more about these abstract ideas and their applications.

Given that technology is used in every aspect of our lives, computer science is a critical field of research in today's world. Moreover, much of what we do as computer scientists and software engineers is done through programming languages. For this reason, PL is a vital field of research because innovations in this discipline will enable progress in other subfields of computer science and other areas of engineering and technology. Through research, I will uncover deep insights about PL and gain hands-on experience by contributing to one of the most valuable areas of computer science.

What kind of research do you want to do?

When performing research, I want to mix the applied and theoretical aspects of PL. I would like to learn more about the mathematical foundations of programming languages, such as semantics, type theory, and category theory. Additionally, I am interested in utilizing this knowledge in conjunction with systems programming/organization to explore the intersection of PL and hardware/low-level programming.

Background

Was there a paper that particularly excited you?

In the past, many of the programming languages I have worked with (Python, JavaScript, OCaml, etc.) are ways to express computation in an abstract way. While reading "A Compiler Infrastructure for Accelerator Generators," I learned about Calyx, which is my first exposure to a language for compiling high-level programs into hardware designs.

I find the syntax and semantics of Calyx powerful and intuitive. I like how components are used to encapsulate hardware structures and execution schedules because it's like an object-oriented approach to designing hardware. When a circuit is described as a component, it is treated almost like a function, where it has inputs, outputs, and access to stateful components like registers. I also find the cell and wires protocol for denoting connections between components very intuitive, and it's fascinating that Calyx allows for fine control over parallelism using control statements.

One of the most remarkable aspects of Calyx is that it allows a user to write a program, which is then compiled into a hardware representation. In particular, I find it very interesting that several steps (GoInsertion, CompileControl, RemoveGroups) are utilized to convert a program into a flat list of guarded assignments with no control statements or groups.

In my opinion, the coolest part of Calyx is that programs are semantically analyzed using a conflict graph such that two groups run in parallel if and only if they share an edge in the graph. Then, whenever possible, the program is modified to promote group-level resource sharing. For example, if two groups disjointly use a 32-bit adder circuit, they can utilize the same 32-bit adder, decreasing latency and the critical path of the circuit. Furthermore, a live-range analysis technique determines when groups can reuse registers, allowing register sharing and hardware reuse.

As someone who loves PL and hardware, I was very excited to learn about Calyx, which has inspired me to know more about the hardware aspects of PL.

Which of the current research projects would you be interested in working on and why?

The paper about Calyx caught my attention, and I am eager to contribute to this project. What intrigues me about this project is how it combines areas from many aspects of computer science (hardware, computer architecture, algorithms, graphs) to yield a substantial feat of engineering that allows for more optimal compilers. Moreover, I believe that by working on this project, I would gain deep insights into how intermediate languages work, how opportunities for hardware optimization are identified, and how FSMs can be used to model control flow in a circuit. Overall, working on this project would expose me to the interactions between theoretical and applied PL, which is incredibly exciting to me.

Anything else you want to tell us about yourself?

In the future, I plan on obtaining an M.Eng in computer science or pursuing an MS/Ph.D. in computer science, likely PL or ML. If you would like, you can view some of my projects on my portfolio website: https://alexkozik.com/

Attach a CV/Resumé:

Alexander_Kozik_Resume.pdf

Thank you so much for considering my application, and I look forward to hearing back!

-Alex

stale[bot] commented 2 months ago

It's been roughly 90 days since opening this issue. We apologize if we haven’t gotten back to you—research openings are somewhat sporadic, so sometimes we don’t have specific opportunities to offer. But more will certainly come in the future! If you're still interested in doing reasearch with us, please respond with "Still interested for <semester/summer>". Additionally, please update the issue by editing it and supplying us with more information, an updated resumé, etc. If you're no longer interested, do not respond to this thread and we will automatically close this issue.