{"id":24775025,"url":"https://github.com/baranasoftware/bignum","last_synced_at":"2026-04-24T22:37:18.970Z","repository":{"id":212865366,"uuid":"732402107","full_name":"baranasoftware/bignum","owner":"baranasoftware","description":"A compiler for big number calculator using LLVM.","archived":false,"fork":false,"pushed_at":"2023-12-19T23:45:18.000Z","size":14,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-23T23:30:42.166Z","etag":null,"topics":["code-generation","compiler","compiler-design","llvm"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/baranasoftware.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-16T14:59:49.000Z","updated_at":"2024-09-29T00:37:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"d8c6bfa0-a9ba-468f-b364-642a9dfd0ead","html_url":"https://github.com/baranasoftware/bignum","commit_stats":null,"previous_names":["baranasoftware/bignum"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/baranasoftware/bignum","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baranasoftware%2Fbignum","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baranasoftware%2Fbignum/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baranasoftware%2Fbignum/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baranasoftware%2Fbignum/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/baranasoftware","download_url":"https://codeload.github.com/baranasoftware/bignum/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/baranasoftware%2Fbignum/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259768509,"owners_count":22908228,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["code-generation","compiler","compiler-design","llvm"],"created_at":"2025-01-29T06:37:31.353Z","updated_at":"2026-04-24T22:37:13.950Z","avatar_url":"https://github.com/baranasoftware.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Writing a Compiler Using LLVM: Building a BigNum Calculator\n\nThis tutorial walks through how to implement a compiler using LLVM for a scientific calculator. An introduction to LLVM and it's tool chain is \navailable [here](https://github.com/rajikak/rajikak/blob/master/llvm-tool-chain.md).\n\n## Build and Run \n[Compile and run](https://github.com/rajikak/rajikak/blob/master/llvm-install.md) LLVM from the source and add the `bin` folder into `$PATH`. \n\n### Using System Default\nReference: https://andreasfertig.blog/2021/02/clang-and-gcc-on-macos-catalina-finding-the-include-paths/\n```\n$ export SDKROOT=\"`xcrun --show-sdk-path`\"\n$ clang++ -std=c++20  src/*.cpp `llvm-config --cxxflags --ldflags --system-libs --libs core` -g -o bignum1 \n$ ./bignum1 \"2 + 7\" | llc -filetype=obj -o=bignum1.o \n$ clang -o bignum bignum1.o src/rtcalc.c\n$ ./bignum\nresult: 9\n```\n\n### Passing Header and Library Paths Externally\nThis produced missing headers although header and library locations are passed externally. Just record here for reference.\n\n```\n$ clang++ \\\n\t\t-I/Users/kumarasiri/work/intbricks/llvm-project-llvmorg-14.0.0/install/include/c++/v1 \\\n\t\t-I/Library/Developer/CommandLineTools/SDKs/MacOSX13.1.sdk/usr/include/ \\\n\t\t-I/Users/kumarasiri/work/intbricks/llvm-project-llvmorg-14.0.0/install/include \\\n\t\t-L/Library/Developer/CommandLineTools/SDKs/MacOSX13.1.sdk/usr/lib \\\n\t\t-L/Users/kumarasiri/work/intbricks/llvm-project-llvmorg-14.0.0/install/lib \\\n\t\t -std=c++20  src/*.cpp `llvm-config --cxxflags --ldflags --system-libs --libs core` -g -o bignum1\n$ ./bignum1 \"2 + 7\" | llc -filetype=obj -o=bignum1.o\n$ clang -o bignum bignum1.o src/rtcalc.c\n$ ./bignum \nresult: 9\n```\n\n```\n./bignum1 \"2 + 3\" | llc -filetype=obj -o=bignum1.o\n$LLVM_DIR/bin/clang -cc1 src/rtcalc.c -o bignum1.o bignum\n./bignum\n```\n\n## Unary Operators\n\n| Name                    | Operator | Description |\n|-------------------------|----------|------------|\n| Index generator         | `iota B` | Vector of the first B integers |\n| Random number generator | `?B`     | Random number between 0 and B  |\n\n\n## Binary operators\n\n`A`, `B` can be scalars or vectors, or multi-dimensional vectors (matrices).    \n\n| Name    | Operator | Description       |\n|---------|----------|-------------------|\n| Add     | `A + B`    | Sum `A` and `B`       |\n| Subtract | `A - B`    | `A` subtract `B`      |\n| Multiply | `A * B`    | `A` multiplied by `B` |\n| Shift   | `n \u003c\u003c A`   |  Shift `A` by `n` times|\n   \n## Examples\n\n| Expression                         | Result                                                            |\n|------------------------------------|-------------------------------------------------------------------|\n| `23`                               | `23`                                                              |\n| `23 + 45`                          | `68`                                                              |\n| `1e10`                             | `10000000000`                                                     |\n| `1e100`                            | `1e100`                                                           |\n| `2 ** 64`                          | `1.8446744e+19`                                                   |\n| `2 ** 640`                         | `4.562441e+192`                                                   |\n| `2.1 + 3.2`                        | `5.3`                                                             |\n| `2.121212122121 + 3.1212121212`    | `5.24242424332`|\n| `1 2 3 4 5 6`                      | `[1 2 3 4 5 6]` (Vector)                                          |\n| `1 2 3 + 4 5 6`                    | `[5 7 9]`                                                         |\n| `itoa 10`                          | `[1 2 3 4 5 6 7 8 9 10]`                                          |\n| `2 ** itoa 10`                     | `[2 4 8 16 32 64]`                                                |\n| `(2 ** itoa 100) == (1\u003c\u003citoa 100)` ||\n| `5 rho 1`                          | `[1 1 1 1 1]`                                                     |\n| `5 5 rho 1`                        | `5x5 matrix of values 1`                                          |\n| `5 5 itoa 1`                       | `5x5 matrix of 1..25`                                             |\n| `?100`                             | Random number between 0 and 100                                   |\n| `?10 rho 100`                      | Vector of size `(1x100)` of random numbers below between 0 and 10 |\n| `1 \u003c\u003c 1 2 3 4 5`                   | `[2 4 8 16 32]`                                                   |\n| `2 * log(10)`                      | `4.605170185988092`|\n| `+/itoa 15`\t\t                 | `120` (add first 15 numbers together)|\n| `1 * 2 * 3`\t\t\t\t\t\t | `6` (3!)|\n| `*/itoa 3`\t\t\t\t\t\t | `6`|\n| `2*itoa 2 + 3`\t\t\t\t\t | `2 4 6 8 10`|\n \n## Grammar\n```\nStatement      -\u003e Expression\n               \nExpression     -\u003e Operand\n                | Operand BinaryOp Expression\n               \nOperand        -\u003e ( Expression )\n               | Operand\n               | Number\n               | Rational\n               | Vector\n               | Operand [ Expression ]\n               | UnaryOperator Expression\n\nBinaryOperator | +\n               | -  \n               | /  \n               | *\n               | **\n               | e\n               | rho\n               | itoa\n               | shift\n\nUnaryOperator  | itoa\n               | ?\n               | \u003c\u003c \n```\n\n## Parsing Rules\n* Unary operators apply to the rest of the line\n* Binary operators apply to the operand on left, rest of the line on right\n* Associative to the right\n\n## References\n* [An Introduction to APL](https://www.youtube.com/watch?v=UltnvW83_CQ)\n* [APL demonstration 1975](https://www.youtube.com/watch?v=_DTpQ4Kk2wA)\n* [ivy](https://pkg.go.dev/robpike.io/ivy#section-readme)\n* [Implementing a bignum calculator with Rob Pike](https://www.youtube.com/watch?v=PXoG0WX0r_E\u0026t=1121s)\n* [Lexical Scanning in Go - Rob Pike](https://www.youtube.com/watch?v=HxaD_trXwRE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaranasoftware%2Fbignum","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbaranasoftware%2Fbignum","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbaranasoftware%2Fbignum/lists"}